require "isodoc/html_function/mathvariant_to_plain" require_relative "postprocess_footnotes" require "metanorma-utils" module IsoDoc module HtmlFunction module Html def script_cdata(result) result.gsub(%r{]*)>\s*") .gsub(%r{\]\]>\s*}, "") .gsub(%r{]*)>}m, "") .gsub(%r{\s*\]\]>}, "") end def htmlstylesheet(file) return if file.nil? file.open if file.is_a?(Tempfile) stylesheet = file.read xml = Nokogiri::XML("" @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) 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 coverpage_note_cleanup(docxml) end def coverpage_note_cleanup(docxml) if dest = docxml.at("//div[@id = 'coverpage-note-destination']") auth = docxml.xpath("//*[@coverpage]") if auth.empty? then dest.remove else auth.each do |x| dest << x.remove end end end docxml.xpath("//*[@coverpage]").each { |x| x.delete("coverpage") } 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) content = header.at("./following-sibling::p" \ "[@class = 'variant-title-toc']") || header %(
  • \ #{header_strip(content)}
  • ) end # array of arrays, one per level, containing XPath fragments for the elems # matching that ToC level def toclevel_classes (1..@htmlToClevels).reduce([]) { |m, i| m << ["h#{i}"] } end def toclevel ret = toclevel_classes.flatten.map do |l| "#{l}:not(:empty):not(.TermNum):not(.noTOC)" end <<~HEAD.freeze function toclevel() { return "#{ret.join(',')}";} HEAD end # needs to be same output as toclevel def html_toc(docxml) idx = html_toc_init(docxml) or return docxml path = toclevel_classes.map do |x| x.map { |l| "//main//#{l}#{toc_exclude_class}" } end toc = html_toc_entries(docxml, path) .map { |k| k[:entry] }.join("\n") idx << "" docxml end def html_toc_init(docxml) dest = docxml.at("//div[@id = 'toc']") or return if source = docxml.at("//div[@class = 'TOC']") dest << to_xml(source.remove.children) end dest end def html_toc_entries(docxml, path) path.each_with_index.with_object([]) do |(p, i), m| docxml.xpath(p.join(" | ")).each do |h| h["id"] ||= "_#{UUIDTools::UUID.random_create}" m << { entry: html_toc_entry("h#{i + 1}", h), line: h.line } end end.sort_by { |k| k[:line] } end def toc_exclude_class "[not(@class = 'TermNum')][not(@class = 'noTOC')]" \ "[string-length(normalize-space(.))>0]" end def inject_script(doc) return doc unless @scripts scripts = File.read(@scripts, encoding: "UTF-8") scripts_override = "" @scripts_override and scripts_override = File.read(@scripts_override, encoding: "UTF-8") a = doc.split(%r{}) "#{a[0]}#{scripts}#{scripts_override}#{a[1]}" end MATHJAX_ADDR = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js".freeze MATHJAX = <<~"MATHJAX".freeze MATHJAX def mathjax(open, close) MATHJAX.gsub("OPEN", open).gsub("CLOSE", close) end end end end