module IsoDoc::HtmlFunction::Html

Constants

MATHJAX
MATHJAX_ADDR

Public Instance Methods

authority_cleanup(docxml) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 100
def authority_cleanup(docxml)
  %w(copyright license legal feedback).each do |t|
    authority_cleanup1(docxml, t)
  end
end
authority_cleanup1(docxml, klass) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 91
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
convert1(docxml, filename, dir) click to toggle source
# File lib/isodoc/html_function/html.rb, line 6
def convert1(docxml, filename, dir)
  noko do |xml|
    xml.html **{ lang: @lang.to_s } do |html|
      info docxml, nil
      populate_css
      html.head { |head| define_head head, filename, dir }
      make_body(html, docxml)
    end
  end.join("\n")
end
datauri(img) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 169
def datauri(img)
  type = img["src"].split(".")[-1]
  supertype = type == "xml" ? "application" : "image"
  bin = IO.binread(image_localfile(img))
  data = Base64.strict_encode64(bin)
  img["src"] = "data:#{supertype}/#{type};base64,#{data}"
end
footnote_backlinks1(x, fn) click to toggle source
# File lib/isodoc/html_function/postprocess_footnotes.rb, line 26
def footnote_backlinks1(x, fn)
  xdup = x.dup
  xdup.remove["id"]
  if fn.elements.empty?
    fn.children.first.previous = xdup
  else
    fn.elements.first.children.first.previous = xdup
  end
end
footnote_format(docxml) click to toggle source
# File lib/isodoc/html_function/postprocess_footnotes.rb, line 48
def footnote_format(docxml)
  docxml.xpath("//a[@class = 'FootnoteRef']/sup").each do |x|
    footnote_reference_format(x)
  end
  docxml.xpath("//a[@class = 'TableFootnoteRef'] | "\
               "//span[@class = 'TableFootnoteRef']").each do |x|
    table_footnote_reference_format(x)
  end
  docxml
end
googlefonts() click to toggle source
# File lib/isodoc/html_function/html.rb, line 50
    def googlefonts
      <<~HEAD.freeze
        <link href="https://fonts.googleapis.com/css?family=Overpass:300,300i,600,900" rel="stylesheet">
        <link href="https://fonts.googleapis.com/css?family=Lato:400,400i,700,900" rel="stylesheet">
      HEAD
    end
html5(doc) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 27
def html5(doc)
  doc.sub(%r{<!DOCTYPE html [^>]+>}, "<!DOCTYPE html>")
    .sub(%r{<\?xml[^>]+>}, "")
end
html_button() click to toggle source
# File lib/isodoc/html_function/html.rb, line 76
def html_button
  return "" if @bare

  '<button onclick="topFunction()" id="myBtn" '\
    'title="Go to top">Top</button>'.freeze
end
html_cleanup(html) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 32
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
html_cover(docxml) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 106
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
html_footnote_filter(docxml) click to toggle source
# File lib/isodoc/html_function/postprocess_footnotes.rb, line 16
def html_footnote_filter(docxml)
  seen = {}
  i = 1
  docxml.xpath('//a[@class = "FootnoteRef"]').each do |x|
    fn = docxml.at(%<//*[@id = '#{x['href'].sub(/^#/, '')}']>) || next
    i, seen = update_footnote_filter(fn, x, i, seen)
  end
  docxml
end
html_head() click to toggle source
# File lib/isodoc/html_function/html.rb, line 57
    def html_head
      <<~HEAD.freeze
        <title>#{@meta&.get&.dig(:doctitle)}</title>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

        <!--TOC script import-->
        <script type="text/javascript"  src="https://cdn.rawgit.com/jgallen23/toc/0.3.2/dist/toc.min.js"></script>
        <script type="text/javascript">#{toclevel}</script>

        <!--Google fonts-->
        <link rel="preconnect" href="https://fonts.gstatic.com">#{' '}
        #{googlefonts}
        <!--Font awesome import for the link icon-->
        <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/solid.css" integrity="sha384-v2Tw72dyUXeU3y4aM2Y0tBJQkGfplr39mxZqlTBDUZAb9BGoC40+rdFCG0m10lXk" crossorigin="anonymous">
        <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/fontawesome.css" integrity="sha384-q3jl8XQu1OpdLgGFvNRnPdj5VIlCvgsDQTQB6owSOHWlAurxul7f+JpUOVdAiJ5P" crossorigin="anonymous">
        <style class="anchorjs"></style>
      HEAD
    end
html_intro(docxml) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 114
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
html_list_clean(html) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 45
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
html_main(docxml) click to toggle source
# File lib/isodoc/html_function/html.rb, line 83
def html_main(docxml)
  docxml.at("//head").add_child(html_head)
  d = docxml.at('//div[@class="main-section"]')
  d.name = "main"
  d.children.empty? or d.children.first.previous = html_button
end
html_preface(docxml) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 81
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
html_toc(docxml) click to toggle source

needs to be same output as toclevel

# File lib/isodoc/html_function/postprocess.rb, line 141
def html_toc(docxml)
  idx = docxml.at("//div[@id = 'toc']") or return docxml
  toc = "<ul>"
  path = toclevel_classes.map do |l|
    "//main//#{l}[not(@class = 'TermNum')][not(@class = 'noTOC')][text()]"
  end
  docxml.xpath(path.join(" | ")).each_with_index do |h, tocidx|
    h["id"] ||= "toc#{tocidx}"
    toc += html_toc_entry(h.name, h)
  end
  idx.children = "#{toc}</ul>"
  docxml
end
html_toc_entry(level, header) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 122
def html_toc_entry(level, header)
  %(<li class="#{level}"><a href="##{header['id']}">\
#{header_strip(header)}</a></li>)
end
htmlstyle(docxml) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 71
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 << "<style>body {margin-left: 2em; margin-right: 2em;}</style>"
  docxml
end
htmlstylesheet(file) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 58
def htmlstylesheet(file)
  return if file.nil?

  file.open if file.is_a?(Tempfile)
  stylesheet = file.read
  xml = Nokogiri::XML("<style/>")
  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
image_suffix(img) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 177
def image_suffix(img)
  type = img["mimetype"]&.sub(%r{^[^/*]+/}, "")
  matched = /\.(?<suffix>[^. \r\n\t]+)$/.match img["src"]
  type and !type.empty? and return type

  !matched.nil? and matched[:suffix] and return matched[:suffix]
  "png"
end
inject_script(doc) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 196
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{</body>})
  "#{a[0]}#{scripts}#{scripts_override}</body>#{a[1]}"
end
make_body1(body, _docxml) click to toggle source
# File lib/isodoc/html_function/html.rb, line 17
def make_body1(body, _docxml)
  return if @bare

  body.div **{ class: "title-section" } do |div1|
    div1.p { |p| p << "&nbsp;" } # placeholder
  end
  section_break(body)
end
make_body2(body, _docxml) click to toggle source
# File lib/isodoc/html_function/html.rb, line 26
def make_body2(body, _docxml)
  return if @bare

  body.div **{ class: "prefatory-section" } do |div2|
    div2.p { |p| p << "&nbsp;" } # placeholder
  end
  section_break(body)
end
make_body3(body, docxml) click to toggle source
# File lib/isodoc/html_function/html.rb, line 35
def make_body3(body, docxml)
  body.div **{ class: "main-section" } do |div3|
    boilerplate docxml, div3
    preface_block docxml, div3
    abstract docxml, div3
    foreword docxml, div3
    introduction docxml, div3
    preface docxml, div3
    acknowledgements docxml, div3
    middle docxml, div3
    footnotes div3
    comments div3
  end
end
mathjax(open, close) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 224
def mathjax(open, close)
  MATHJAX.gsub("OPEN", open).gsub("CLOSE", close)
end
mathml(docxml) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 54
def mathml(docxml)
  IsoDoc::HtmlFunction::MathvariantToPlain.new(docxml).convert
end
move_image1(img) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 186
def move_image1(img)
  suffix = image_suffix(img)
  uuid = UUIDTools::UUID.random_create.to_s
  fname = "#{uuid}.#{suffix}"
  new_full_filename = File.join(tmpimagedir, fname)
  local_filename = image_localfile(img)
  FileUtils.cp local_filename, new_full_filename
  img["src"] = File.join(rel_tmpimagedir, fname)
end
move_images(docxml) click to toggle source

presupposes that the image source is local

# File lib/isodoc/html_function/postprocess.rb, line 156
def move_images(docxml)
  FileUtils.rm_rf tmpimagedir
  FileUtils.mkdir tmpimagedir
  docxml.xpath("//*[local-name() = 'img']").each do |i|
    i["width"], i["height"] = Html2Doc.image_resize(i, image_localfile(i),
                                                    @maxheight, @maxwidth)
    next if /^data:/.match? i["src"]

    @datauriimage ? datauri(i) : move_image1(i)
  end
  docxml
end
postprocess(result, filename, _dir) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 7
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
remove_placeholder_paras(html) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 38
def remove_placeholder_paras(html)
  %w(title-section prefatory-section).each do |s|
    html&.at("//div[@class = '#{s}']/p[last()]")&.remove
  end
  html
end
script_cdata(result) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 13
def script_cdata(result)
  result.gsub(%r{<script([^>]*)>\s*<!\[CDATA\[}m, "<script\\1>")
    .gsub(%r{\]\]>\s*</script>}, "</script>")
    .gsub(%r{<!\[CDATA\[\s*<script([^>]*)>}m, "<script\\1>")
    .gsub(%r{</script>\s*\]\]>}, "</script>")
end
sourcecode_highlighter() click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 207
def sourcecode_highlighter
  '<script src="https://cdn.rawgit.com/google/code-prettify/master/'\
    'loader/run_prettify.js"></script>'
end
sourcecode_parse(node, out) click to toggle source
# File lib/isodoc/html_function/html.rb, line 110
def sourcecode_parse(node, out)
  name = node.at(ns("./name"))
  class1 = "prettyprint #{sourcecodelang(node&.at(ns('./@lang'))&.value)}"
  out.pre **sourcecode_attrs(node).merge(class: class1) do |div|
    @sourcecode = true
    node.children.each { |n| parse(n, div) unless n.name == "name" }
    @sourcecode = false
  end
  sourcecode_name_parse(node, out, name)
end
sourcecodelang(lang) click to toggle source
# File lib/isodoc/html_function/html.rb, line 90
def sourcecodelang(lang)
  return unless lang

  case lang.downcase
  when "javascript" then "lang-js"
  when "c" then "lang-c"
  when "c+" then "lang-cpp"
  when "console" then "lang-bsh"
  when "ruby" then "lang-rb"
  when "html" then "lang-html"
  when "java" then "lang-java"
  when "xml" then "lang-xml"
  when "perl" then "lang-perl"
  when "python" then "lang-py"
  when "xsl" then "lang-xsl"
  else
    ""
  end
end
table_long_strings_cleanup(docxml) click to toggle source
# File lib/isodoc/html_function/html.rb, line 127
def table_long_strings_cleanup(docxml); end
term_header(docxml) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 228
def term_header(docxml)
  %w(h1 h2 h3 h4 h5 h6 h7 h8).each do |h|
    docxml.xpath("//p[@class = 'TermNum'][../#{h}]").each do |p|
      p.name = "h#{h[1].to_i + 1}"
    end
  end
  docxml
end
toHTML(result, filename) click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 20
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
toclevel() click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 131
      def toclevel
        ret = toclevel_classes.map do |l|
          "#{l}:not(:empty):not(.TermNum):not(.noTOC)"
        end
        <<~HEAD.freeze
          function toclevel() { return "#{ret.join(',')}";}
        HEAD
      end
toclevel_classes() click to toggle source
# File lib/isodoc/html_function/postprocess.rb, line 127
def toclevel_classes
  (1..@htmlToClevels).reduce([]) { |m, i| m << "h#{i}" }
end
underline_parse(node, out) click to toggle source
# File lib/isodoc/html_function/html.rb, line 121
def underline_parse(node, out)
  out.span **{ style: "text-decoration: underline;" } do |e|
    node.children.each { |n| parse(n, e) }
  end
end
update_footnote_filter(fn, x, i, seen) click to toggle source
# File lib/isodoc/html_function/postprocess_footnotes.rb, line 3
def update_footnote_filter(fn, x, i, seen)
  if seen[fn.text]
    x.at("./sup").content = seen[fn.text][:num].to_s
    fn.remove unless x["href"] == seen[fn.text][:href]
    x["href"] = seen[fn.text][:href]
  else
    seen[fn.text] = { num: i, href: x["href"] }
    x.at("./sup").content = i.to_s
    i += 1
  end
  [i, seen]
end