diff --git a/lib/kramdown/converter/syntax_highlighter/tree_sitter.rb b/lib/kramdown/converter/syntax_highlighter/tree_sitter.rb index 07c3ad7..423001d 100644 --- a/lib/kramdown/converter/syntax_highlighter/tree_sitter.rb +++ b/lib/kramdown/converter/syntax_highlighter/tree_sitter.rb @@ -2,6 +2,7 @@ require 'kramdown' require 'tree_sitter_adapter' +require 'rouge' require_relative '../../syntax_tree_sitter/languages' @@ -18,15 +19,26 @@ module TreeSitter def self.call(converter, raw_text, language_alias, type, _) return nil unless language_alias - language_scope = LANGUAGE_SCOPES.fetch(language_alias, language_alias) - rendered_text = TreeSitterAdapter.highlight( - raw_text, - get_parsers_dir(converter), - language_scope, - get_use_css_classes(converter) - ) + begin + language_scope = LANGUAGE_SCOPES.fetch(language_alias, language_alias) + rendered_text = TreeSitterAdapter.highlight( + raw_text, + get_parsers_dir(converter), + language_scope, + get_use_css_classes(converter) + ) + rescue => e + if get_fallback_to_rouge(converter) + STDERR.puts "Falling back to rouge for syntax highlighting: #{e}" + rendered_text = Rouge.highlight(raw_text, language_alias, 'html') + attributes="class=\"highlight\"" + else + raise + end + end + # Code blocks are additionally wrapped in HTML code tags - type == :block ? "
#{rendered_text}" : rendered_text
+ type == :block ? "#{rendered_text}" : rendered_text
end
def self.get_parsers_dir(converter)
@@ -39,6 +51,10 @@ def self.get_use_css_classes(converter)
get_option(converter, :css_classes) || false
end
+ def self.get_fallback_to_rouge(converter)
+ get_option(converter, :fallback_to_rouge) || false
+ end
+
def self.get_option(converter, name)
converter.options[:syntax_highlighter_opts][name]
end