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