From f0b6dcf4bd31109c3632f9ed611395f1b08ae222 Mon Sep 17 00:00:00 2001 From: "Ethan D. Twardy" Date: Fri, 28 Nov 2025 18:26:16 -0600 Subject: [PATCH] kramdown: Optionally fall back to rouge Due to the distributed development of tree-sitter parsers, it's not always feasible to have a particular tree-sitter parser installed. In some cases, we may choose to fall back to rouge if a tree-sitter parser is not installed. This option defaults to false, but can be set via syntax_highlighter_opts. --- .../syntax_highlighter/tree_sitter.rb | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) 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