module IsoDoc::HtmlFunction::Html
Constants
- MATHJAX
- MATHJAX_ADDR
Public Instance Methods
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_backlinks(docxml)
click to toggle source
# File lib/isodoc/html_function/postprocess_footnotes.rb, line 36 def footnote_backlinks(docxml) seen = {} docxml.xpath('//a[@class = "FootnoteRef"]').each_with_index do |x, i| seen[x["href"]] and next or seen[x["href"]] = true fn = docxml.at(%<//*[@id = '#{x['href'].sub(/^#/, '')}']>) || next footnote_backlinks1(x, fn) x["id"] ||= "fnref:#{i + 1}" fn.add_child "<a href='##{x['id']}'>↩</a>" end docxml 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_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 << " " } # 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 << " " } # 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