resources/asciidoctor/lib/docbook_compat/extension.rb (79 lines of code) (raw):

# frozen_string_literal: true require 'asciidoctor/extensions' require_relative '../delegating_converter' require_relative '../strip_tags' require_relative 'clear_cached_titles' require_relative 'convert_admonition' require_relative 'convert_dlist' require_relative 'convert_document' require_relative 'convert_example' require_relative 'convert_floating_title' require_relative 'convert_inline_quoted' require_relative 'convert_links' require_relative 'convert_listing' require_relative 'convert_lists' require_relative 'convert_open' require_relative 'convert_outline' require_relative 'convert_paragraph' require_relative 'convert_quote' require_relative 'convert_sidebar' require_relative 'convert_table' require_relative 'titleabbrev_handler' ## # HTML5 converter that emulates Elastic's docbook generated html. module DocbookCompat def self.activate(registry) return unless registry.document.basebackend? 'html' registry.treeprocessor ClearCachedTitles registry.treeprocessor TitleabbrevHandler DelegatingConverter.setup(registry.document) { |d| Converter.new d } end ## # A Converter implementation that emulates Elastic's docbook generated html. class Converter < DelegatingConverter include ConvertAdmonition include ConvertDList include ConvertDocument include ConvertExample include ConvertFloatingTitle include ConvertInlineQuoted include ConvertLinks include ConvertListing include ConvertLists include ConvertOpen include ConvertOutline include ConvertParagraph include ConvertQuote include ConvertSidebar include ConvertTable include StripTags def convert_section(node) <<~HTML <div class="#{wrapper_class_for node}#{node.role ? " #{node.role}" : ''}"> <div class="titlepage"><div><div> <div class="position-relative"><h#{hlevel node} class="title"><a id="#{node.id}"></a>#{node.captioned_title}#{xpack_tag node}</h#{hlevel node}>#{node.attr 'edit_me_link', ''}</div> </div></div></div> #{node.content} </div> HTML end def convert_literal(node) <<~HTML <pre class="literallayout">#{node.content}</pre> HTML end def xpack_tag(node) return unless node.roles.include? 'xpack' return if (node.document.attr 'hide-xpack-tags') == 'true' '<a class="xpack_tag" href="/subscriptions"></a>' end def hlevel(section) # If the heading level is less than 2, use 2, # otherwise use the given heading level. # # This ensures: # - There are no `h0`s, which are not valid HTML elements. # - There are no `h1`s in the page's main content since # we only want one `h1` per page, and one is generated # automatically and added to the page header (outside # div#content). if section.level < 2 2 else section.level end end SECTION_WRAPPER_CLASSES = %w[part chapter].freeze def wrapper_class_for(section) wrapper_class = section.attr 'style' wrapper_class ||= SECTION_WRAPPER_CLASSES[section.level] wrapper_class ||= 'section' wrapper_class end end end