resources/asciidoctor/lib/docbook_compat/convert_document.rb (89 lines of code) (raw):

# frozen_string_literal: true require_relative 'extra_docinfo' require_relative 'munge_body' module DocbookCompat ## # Methods to convert the document at the top level. All of these are a bit # scary but required at this point for docbook compatibility. module ConvertDocument include MungeBody def convert_document(doc) # We'll manually add the toc ourselves if it was requested. wants_toc = doc.attr?('toc') && doc.attr?('toc-placement', 'auto') doc.attributes.delete 'toc' if wants_toc doc.extend ExtraDocinfo html = yield munge_html doc, html, wants_toc html + "\n" end def munge_html(doc, html, wants_toc) title = doc.doctitle partition: true munge_html_tag html munge_head doc.attr('title-extra'), html munge_body doc, html munge_title doc, title, html add_toc doc, html if wants_toc end def munge_html_tag(html) html.gsub!(/<html lang="[^"]+">/, '<html>') || raise("Coudn't fix html in #{html}") end def munge_head(title_extra, html) if html !~ %r{^<title>([\S\s]+)<\/title>$}m raise("Couldn't munge <title> in #{html}") end html.gsub!(%r{^<title>([\S\s]+)<\/title>$}m) do add_content_meta Regexp.last_match[1], title_extra end munge_meta html end def add_content_meta(match, title_extra) # If multiple lines, get just the first line clean_title = match.gsub!(/\n[\S\s]+/, '') || match clean_title = strip_tags clean_title <<~HTML <title>#{clean_title}#{title_extra} | Elastic</title> <meta class=\"elastic\" name=\"content\" \ content=\"#{clean_title}#{title_extra}\"> HTML end META_VIEWPORT = <<~HTML <meta name="viewport" content="width=device-width, initial-scale=1.0"> HTML def munge_meta(html) html.gsub!( %(<meta http-equiv="X-UA-Compatible" content="IE=edge">\n), '' ) || raise("Couldn't remove edge compat in #{html}") html.gsub!(META_VIEWPORT, '') || raise("Couldn't remove viewport in #{html}") html.gsub!(/<meta name="generator" content="Asciidoctor [^"]+">\n/, '') || raise("Couldn't remove generator in #{html}") end def munge_title(doc, title, html) # Important: we're not replacing the whole header - it still will have a # closing </div>. # # We also add a placeholder for the breadcrumbs that will be replaced # in resources/asciidoctor/lib/chunker/extension.rb header_start = <<~HTML <div class="titlepage"> <div id="breadcrumbs-go-here"></div> #{docbook_style_title doc, title} HTML html.gsub!(%r{<div id="header">\n<h1>.+?</h1>\n}m, header_start) || raise("Couldn't wrap header in #{html}") end def docbook_style_title(doc, title) id = doc.id || 'id-1' result = <<~HTML <div> <div><h1 class="title"><a id="#{id}"></a>#{title.main}</h1></div> HTML result += <<~HTML if title.subtitle? <div><h2 class="subtitle">#{title.subtitle}</h2></div> HTML result + <<~HTML.strip </div> <!--EXTRA--> HTML end def add_toc(doc, html) html.gsub! '<div id="content">', <<~HTML <div id="content"> <!--START_TOC--> <div class="#{doc.attr 'toc-class', 'toc'}"> #{doc.converter.convert doc, 'outline'} </div> <!--END_TOC--> HTML end end end