require "isodoc/html_function/mathvariant_to_plain" require_relative "postprocess_footnotes" module IsoDoc module HtmlFunction module Html def postprocess(result, filename, _dir) result = from_xhtml(cleanup(to_xhtml(textcleanup(result)))) toHTML(result, filename) @files_to_delete.each { |f| FileUtils.rm_rf f } end def script_cdata(result) result.gsub(%r{}, "") .gsub(%r{]*)>}m, "\s*\]\]>}, "") end def toHTML(result, filename) result = from_xhtml(html_cleanup(to_xhtml(result))) result = from_xhtml(move_images(to_xhtml(result))) result = html5(script_cdata(inject_script(result))) File.open(filename, "w:UTF-8") { |f| f.write(result) } end def html5(doc) doc.sub(%r{]+>}, "") .sub(%r{<\?xml[^>]+>}, "") end def html_cleanup(html) html = term_header(html_footnote_filter(html_preface(htmlstyle(html)))) html = footnote_format(footnote_backlinks(html_toc(html))) mathml(html_list_clean(remove_placeholder_paras(html))) end def remove_placeholder_paras(html) %w(title-section prefatory-section).each do |s| html&.at("//div[@class = '#{s}']/p[last()]")&.remove end html end def html_list_clean(html) html.xpath("//ol/div | //ul/div").each do |div| li = div&.xpath("./preceding-sibling::li")&.last || div.at("./following-sibling::li") div.parent = li end html end def mathml(docxml) IsoDoc::HtmlFunction::MathvariantToPlain.new(docxml).convert end def htmlstylesheet(file) return if file.nil? file.open if file.is_a?(Tempfile) stylesheet = file.read xml = Nokogiri::XML("") xml.children.first << Nokogiri::XML::Comment .new(xml, "\n#{stylesheet}\n") file.close file.unlink if file.is_a?(Tempfile) xml.root.to_s end def htmlstyle(docxml) return docxml unless @htmlstylesheet head = docxml.at("//*[local-name() = 'head']") head << htmlstylesheet(@htmlstylesheet) s = htmlstylesheet(@htmlstylesheet_override) and head << s @bare and head << "" docxml end def html_preface(docxml) html_cover(docxml) if @htmlcoverpage && !@bare html_intro(docxml) if @htmlintropage && !@bare docxml.at("//body") << mathjax(@openmathdelim, @closemathdelim) docxml.at("//body") << sourcecode_highlighter html_main(docxml) authority_cleanup(docxml) docxml end def authority_cleanup1(docxml, klass) dest = docxml.at("//div[@id = 'boilerplate-#{klass}-destination']") auth = docxml.at("//div[@id = 'boilerplate-#{klass}' or "\ "@class = 'boilerplate-#{klass}']") auth&.xpath(".//h1[not(text())] | .//h2[not(text())]")&.each(&:remove) auth&.xpath(".//h1 | .//h2")&.each { |h| h["class"] = "IntroTitle" } dest and auth and dest.replace(auth.remove) end def authority_cleanup(docxml) %w(copyright license legal feedback).each do |t| authority_cleanup1(docxml, t) end end def html_cover(docxml) doc = to_xhtml_fragment(File.read(@htmlcoverpage, encoding: "UTF-8")) d = docxml.at('//div[@class="title-section"]') d.children.first.add_previous_sibling( populate_template(doc.to_xml(encoding: "US-ASCII"), :html), ) end def html_intro(docxml) doc = to_xhtml_fragment(File.read(@htmlintropage, encoding: "UTF-8")) d = docxml.at('//div[@class="prefatory-section"]') d.children.first.add_previous_sibling( populate_template(doc.to_xml(encoding: "US-ASCII"), :html), ) end def html_toc_entry(level, header) %(