resources/asciidoctor/lib/elastic_compat_tree_processor/extension.rb (37 lines of code) (raw):

# frozen_string_literal: true require_relative '../scaffold.rb' # TreeProcessor extension to automatically escape special characters in code # listings and always shift "callouts" after "specialcharacters". # # Turns # ["source","java",subs="attributes,callouts,macros"] # -------------------------------------------------- # long count = response.count(); <1> # List<CategoryDefinition> categories = response.categories(); <2> # -------------------------------------------------- # <1> The count of categories that were matched # <2> The categories retrieved # # Into # ["source","java",subs="attributes,macros,specialcharacters,callouts"] # -------------------------------------------------- # long count = response.count(); <1> # List<CategoryDefinition> categories = response.categories(); <2> # -------------------------------------------------- # <1> The count of categories that were matched # <2> The categories retrieved # # Turns # [source,js] # -------------------------------------------------- # GET / <1> # -------------------------------------------------- # pass:[// CONSOLE] # <1> The count of categories that were matched # <2> The categories retrieved # # Into # [source,console] # -------------------------------------------------- # GET / <1> # -------------------------------------------------- # <1> The count of categories that were matched # <2> The categories retrieved # class ElasticCompatTreeProcessor < TreeProcessorScaffold include Asciidoctor::Logging LANG_OVERRIDE_RX = %r{^//\s*([^:\]]+)(?::\s*([^\]]+))?$} def process_block(block) return unless block.context == :listing && block.style == 'source' process_subs block process_lang_override block end def process_subs(block) return if block.subs.include? :specialcharacters # callouts have to come *after* special characters had_callouts = block.subs.delete(:callouts) block.subs << :specialcharacters block.subs << :callouts if had_callouts end LANG_MAPPING = { 'AUTOSENSE' => 'sense', 'CONSOLE' => 'console', 'KIBANA' => 'kibana', 'SENSE' => 'sense', }.freeze def process_lang_override(block) return unless (next_block = candidate_block block) return unless (match = LANG_OVERRIDE_RX.match(next_block.source)) return unless (lang = LANG_MAPPING[match[1]]) # Not a language we handle block.set_attr 'language', lang block.set_attr 'snippet', match[2] block.parent.blocks.delete next_block block.parent.reindex_sections end # Check if the next block is a marker for the language # We don't want block.next_adjacent_block because that'll go "too far" # and it has trouble with definition lists. def candidate_block(block) return unless (my_index = block.parent.blocks.find_index block) next_block = block.parent.blocks[my_index + 1] return unless next_block && next_block.context == :pass next_block end end