isodoc 1.6.4 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +1 -1
  3. data/.rubocop.yml +1 -1
  4. data/isodoc.gemspec +2 -1
  5. data/lib/isodoc-yaml/i18n-ar.yaml +19 -25
  6. data/lib/isodoc-yaml/i18n-de.yaml +1 -0
  7. data/lib/isodoc-yaml/i18n-en.yaml +2 -0
  8. data/lib/isodoc-yaml/i18n-es.yaml +1 -0
  9. data/lib/isodoc-yaml/i18n-fr.yaml +2 -0
  10. data/lib/isodoc-yaml/i18n-ru.yaml +1 -0
  11. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +2 -0
  12. data/lib/isodoc/convert.rb +4 -2
  13. data/lib/isodoc/function/blocks.rb +6 -5
  14. data/lib/isodoc/function/references.rb +33 -52
  15. data/lib/isodoc/function/section.rb +0 -1
  16. data/lib/isodoc/function/table.rb +21 -22
  17. data/lib/isodoc/function/terms.rb +6 -7
  18. data/lib/isodoc/gem_tasks.rb +8 -9
  19. data/lib/isodoc/html_convert.rb +5 -1
  20. data/lib/isodoc/html_function/comments.rb +12 -12
  21. data/lib/isodoc/html_function/html.rb +2 -2
  22. data/lib/isodoc/html_function/postprocess.rb +195 -185
  23. data/lib/isodoc/html_function/sectionsplit.rb +244 -0
  24. data/lib/isodoc/metadata.rb +22 -20
  25. data/lib/isodoc/metadata_contributor.rb +31 -28
  26. data/lib/isodoc/presentation_function/bibdata.rb +7 -0
  27. data/lib/isodoc/presentation_function/block.rb +7 -4
  28. data/lib/isodoc/presentation_function/inline.rb +7 -12
  29. data/lib/isodoc/presentation_function/section.rb +38 -1
  30. data/lib/isodoc/presentation_xml_convert.rb +2 -0
  31. data/lib/isodoc/version.rb +1 -1
  32. data/lib/isodoc/xref.rb +10 -7
  33. data/lib/isodoc/xref/xref_anchor.rb +45 -44
  34. data/lib/isodoc/xref/xref_counter.rb +113 -103
  35. data/lib/isodoc/xref/xref_gen.rb +39 -11
  36. data/spec/isodoc/blocks_spec.rb +184 -447
  37. data/spec/isodoc/cleanup_spec.rb +40 -42
  38. data/spec/isodoc/i18n_spec.rb +694 -821
  39. data/spec/isodoc/inline_spec.rb +197 -208
  40. data/spec/isodoc/metadata_spec.rb +384 -379
  41. data/spec/isodoc/postproc_spec.rb +121 -30
  42. data/spec/isodoc/presentation_xml_spec.rb +4 -4
  43. data/spec/isodoc/ref_spec.rb +5 -5
  44. data/spec/isodoc/section_spec.rb +216 -199
  45. data/spec/isodoc/sectionsplit_spec.rb +190 -0
  46. data/spec/isodoc/table_spec.rb +41 -42
  47. data/spec/isodoc/terms_spec.rb +1 -1
  48. data/spec/isodoc/xref_spec.rb +684 -1020
  49. metadata +19 -3
@@ -1,17 +1,16 @@
1
1
  module IsoDoc::Function
2
2
  module Table
3
-
4
3
  def table_title_parse(node, out)
5
4
  name = node.at(ns("./name")) or return
6
5
  out.p **{ class: "TableTitle", style: "text-align:center;" } do |p|
7
- name and name.children.each { |n| parse(n, p) }
6
+ name&.children&.each { |n| parse(n, p) }
8
7
  end
9
8
  end
10
9
 
11
- def thead_parse(node, t)
10
+ def thead_parse(node, table)
12
11
  thead = node.at(ns("./thead"))
13
12
  if thead
14
- t.thead do |h|
13
+ table.thead do |h|
15
14
  thead.element_children.each_with_index do |n, i|
16
15
  tr_parse(n, h, i, thead.element_children.size, true)
17
16
  end
@@ -19,19 +18,19 @@ module IsoDoc::Function
19
18
  end
20
19
  end
21
20
 
22
- def tbody_parse(node, t)
21
+ def tbody_parse(node, table)
23
22
  tbody = node.at(ns("./tbody")) || return
24
- t.tbody do |h|
23
+ table.tbody do |h|
25
24
  tbody.element_children.each_with_index do |n, i|
26
25
  tr_parse(n, h, i, tbody.element_children.size, false)
27
26
  end
28
27
  end
29
28
  end
30
29
 
31
- def tfoot_parse(node, t)
30
+ def tfoot_parse(node, table)
32
31
  tfoot = node.at(ns("./tfoot"))
33
32
  if tfoot
34
- t.tfoot do |h|
33
+ table.tfoot do |h|
35
34
  tfoot.element_children.each_with_index do |n, i|
36
35
  tr_parse(n, h, i, tfoot.element_children.size, false)
37
36
  end
@@ -45,23 +44,23 @@ module IsoDoc::Function
45
44
  id: node["id"],
46
45
  class: "MsoISOTable",
47
46
  style: "border-width:1px;border-spacing:0;#{width}#{keep_style(node)}",
48
- title: node["alt"]
47
+ title: node["alt"],
49
48
  )
50
49
  end
51
50
 
52
- def tcaption(node, t)
51
+ def tcaption(node, table)
53
52
  return unless node["summary"]
54
53
 
55
- t.caption do |c|
54
+ table.caption do |c|
56
55
  c.span **{ style: "display:none" } do |s|
57
56
  s << node["summary"]
58
57
  end
59
58
  end
60
59
  end
61
60
 
62
- def colgroup(node, t)
61
+ def colgroup(node, table)
63
62
  colgroup = node.at(ns("./colgroup")) or return
64
- t.colgroup do |cg|
63
+ table.colgroup do |cg|
65
64
  colgroup.xpath(ns("./col")).each do |c|
66
65
  cg.col **{ style: "width: #{c['width']};" }
67
66
  end
@@ -90,19 +89,19 @@ module IsoDoc::Function
90
89
  # border-left:#{col.zero? ? "#{SW} 1.5pt;" : "none;"}
91
90
  # border-right:#{SW} #{col == totalcols && !header ? "1.5" : "1.0"}pt;
92
91
 
93
- def make_tr_attr(td, row, totalrows, header)
94
- style = td.name == "th" ? "font-weight:bold;" : ""
95
- td["align"] and style += "text-align:#{td['align']};"
96
- td["valign"] and style += "vertical-align:#{td['valign']};"
97
- rowmax = td["rowspan"] ? row + td["rowspan"].to_i - 1 : row
92
+ def make_tr_attr(cell, row, totalrows, header)
93
+ style = cell.name == "th" ? "font-weight:bold;" : ""
94
+ cell["align"] and style += "text-align:#{cell['align']};"
95
+ cell["valign"] and style += "vertical-align:#{cell['valign']};"
96
+ rowmax = cell["rowspan"] ? row + cell["rowspan"].to_i - 1 : row
98
97
  style += <<~STYLE
99
98
  border-top:#{row.zero? ? "#{SW} 1.5pt;" : 'none;'}
100
99
  border-bottom:#{SW} #{rowmax == totalrows ? '1.5' : '1.0'}pt;
101
100
  STYLE
102
- header and scope = (td["colspan"] ? "colgroup" : "col")
103
- !header and td.name == "th" and scope =
104
- (td["rowspan"] ? "rowgroup" : "row")
105
- { rowspan: td["rowspan"], colspan: td["colspan"],
101
+ header and scope = (cell["colspan"] ? "colgroup" : "col")
102
+ !header and cell.name == "th" and scope =
103
+ (cell["rowspan"] ? "rowgroup" : "row")
104
+ { rowspan: cell["rowspan"], colspan: cell["colspan"],
106
105
  style: style.gsub(/\n/, ""), scope: scope }
107
106
  end
108
107
 
@@ -11,27 +11,27 @@ module IsoDoc::Function
11
11
  end
12
12
 
13
13
  def deprecated_term_parse(node, out)
14
- out.p **{ class: "DeprecatedTerms", style:"text-align:left;" } do |p|
14
+ out.p **{ class: "DeprecatedTerms", style: "text-align:left;" } do |p|
15
15
  p << l10n("#{@i18n.deprecated}: ")
16
16
  node.children.each { |c| parse(c, p) }
17
17
  end
18
18
  end
19
19
 
20
20
  def admitted_term_parse(node, out)
21
- out.p **{ class: "AltTerms", style:"text-align:left;" } do |p|
21
+ out.p **{ class: "AltTerms", style: "text-align:left;" } do |p|
22
22
  node.children.each { |c| parse(c, p) }
23
23
  end
24
24
  end
25
25
 
26
26
  def term_parse(node, out)
27
- out.p **{ class: "Terms", style:"text-align:left;" } do |p|
27
+ out.p **{ class: "Terms", style: "text-align:left;" } do |p|
28
28
  node.children.each { |c| parse(c, p) }
29
29
  end
30
30
  end
31
31
 
32
- def para_then_remainder(first, node, p, div)
32
+ def para_then_remainder(first, node, para, div)
33
33
  if first.name == "p"
34
- first.children.each { |n| parse(n, p) }
34
+ first.children.each { |n| parse(n, para) }
35
35
  node.elements.drop(1).each { |n| parse(n, div) }
36
36
  else
37
37
  node.elements.each { |n| parse(n, div) }
@@ -72,7 +72,6 @@ module IsoDoc::Function
72
72
  node.children.each { |n| parse(n, out) }
73
73
  end
74
74
 
75
- def termdocsource_parse(_node, _out)
76
- end
75
+ def termdocsource_parse(_node, _out); end
77
76
  end
78
77
  end
@@ -12,12 +12,10 @@ module IsoDoc
12
12
 
13
13
  def install
14
14
  rule ".css" => [proc { |tn| tn.sub(/\.css$/, ".scss") }] do |current_task|
15
- begin
16
- puts(current_task)
17
- compile_scss_task(current_task)
18
- rescue StandardError => e
19
- notify_borken_compilation(e, current_task)
20
- end
15
+ puts(current_task)
16
+ compile_scss_task(current_task)
17
+ rescue StandardError => e
18
+ notify_borken_compilation(e, current_task)
21
19
  end
22
20
 
23
21
  scss_files = Rake::FileList["lib/**/*.scss"]
@@ -88,7 +86,7 @@ module IsoDoc
88
86
  text
89
87
  .gsub("/* LIQUID_COMMENT", "")
90
88
  .gsub("LIQUID_COMMENT */", "")
91
- .gsub('"{{', '{{').gsub('}}"', "}}")
89
+ .gsub('"{{', "{{").gsub('}}"', "}}")
92
90
  end
93
91
 
94
92
  def fonts_placeholder
@@ -107,7 +105,8 @@ module IsoDoc
107
105
  require "sassc"
108
106
 
109
107
  isodoc_path = if Gem.loaded_specs["isodoc"]
110
- File.join(Gem.loaded_specs["isodoc"].full_gem_path, "lib", "isodoc")
108
+ File.join(Gem.loaded_specs["isodoc"].full_gem_path,
109
+ "lib", "isodoc")
111
110
  else
112
111
  File.join("lib", "isodoc")
113
112
  end
@@ -119,7 +118,7 @@ module IsoDoc
119
118
  SassC::Engine.new(fonts_placeholder + sheet_content,
120
119
  syntax: :scss,
121
120
  importer: SasscImporter)
122
- .render
121
+ .render
123
122
  end
124
123
 
125
124
  def compile_scss_task(current_task)
@@ -1,8 +1,9 @@
1
1
  require_relative "html_function/comments"
2
2
  require_relative "html_function/footnotes"
3
3
  require_relative "html_function/html"
4
- require_relative "html_function/form"
5
4
  require_relative "html_function/postprocess"
5
+ require_relative "html_function/sectionsplit"
6
+ require_relative "html_function/form"
6
7
 
7
8
  module IsoDoc
8
9
  class HtmlConvert < ::IsoDoc::Convert
@@ -23,6 +24,9 @@ module IsoDoc
23
24
  end
24
25
 
25
26
  def convert(filename, file = nil, debug = false, output_filename = nil)
27
+ @sectionsplit and
28
+ return sectionsplit_convert(filename, file, debug, output_filename)
29
+
26
30
  ret = super
27
31
  Dir.exists?(tmpimagedir) and Dir["#{tmpimagedir}/*"].empty? and
28
32
  FileUtils.rm_r tmpimagedir
@@ -24,16 +24,16 @@ module IsoDoc::HtmlFunction
24
24
  =end
25
25
  end
26
26
 
27
- def comment_link_attrs(fn, node)
28
- { style: "MsoCommentReference", target: fn,
27
+ def comment_link_attrs(fnote, node)
28
+ { style: "MsoCommentReference", target: fnote,
29
29
  class: "commentLink", from: node["from"],
30
30
  to: node["to"] }
31
31
  end
32
32
 
33
33
  # add in from and to links to move the comment into place
34
- def make_comment_link(out, fn, node)
35
- out.span(**comment_link_attrs(fn, node)) do |s1|
36
- s1.a **{ style: "mso-comment-reference:SMC_#{fn};"\
34
+ def make_comment_link(out, fnote, node)
35
+ out.span(**comment_link_attrs(fnote, node)) do |s1|
36
+ s1.a **{ style: "mso-comment-reference:SMC_#{fnote};"\
37
37
  "mso-comment-date:#{node['date'].gsub(/[-:Z]/, '')}" }
38
38
  end
39
39
  end
@@ -44,9 +44,9 @@ module IsoDoc::HtmlFunction
44
44
  end
45
45
  end
46
46
 
47
- def make_comment_text(node, fn)
47
+ def make_comment_text(node, fnote)
48
48
  noko do |xml|
49
- xml.div **{ style: "mso-element:comment", id: fn } do |div|
49
+ xml.div **{ style: "mso-element:comment", id: fnote } do |div|
50
50
  div.span **{ style: %{mso-comment-author:"#{node['reviewer']}"} }
51
51
  make_comment_target(div)
52
52
  node.children.each { |n| parse(n, div) }
@@ -99,13 +99,13 @@ module IsoDoc::HtmlFunction
99
99
  from["style"] != "mso-special-character:comment"
100
100
  end
101
101
 
102
- def insert_comment_cont(from, to, target)
103
- # includes_to = from.at(".//*[@id='#{to}']")
104
- while !from.nil? && from["id"] != to
102
+ def insert_comment_cont(from, upto, target)
103
+ # includes_to = from.at(".//*[@id='#{upto}']")
104
+ while !from.nil? && from["id"] != upto
105
105
  following = from.xpath("./following::*")
106
- (from = following.shift) && incl_to = from.at(".//*[@id='#{to}']")
106
+ (from = following.shift) && incl_to = from.at(".//*[@id='#{upto}']")
107
107
  while !incl_to.nil? && !from.nil? && skip_comment_wrap(from)
108
- (from = following.shift) && incl_to = from.at(".//*[@id='#{to}']")
108
+ (from = following.shift) && incl_to = from.at(".//*[@id='#{upto}']")
109
109
  end
110
110
  wrap_comment_cont(from, target) if !from.nil?
111
111
  end
@@ -64,8 +64,8 @@ module IsoDoc::HtmlFunction
64
64
  <script type="text/javascript">#{toclevel}</script>
65
65
 
66
66
  <!--Google fonts-->
67
- <link rel="preconnect" href="https://fonts.gstatic.com">#{' '}
68
- #{googlefonts}
67
+ <link rel="preconnect" href="https://fonts.gstatic.com">#{' '}
68
+ #{googlefonts}
69
69
  <!--Font awesome import for the link icon-->
70
70
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/solid.css" integrity="sha384-v2Tw72dyUXeU3y4aM2Y0tBJQkGfplr39mxZqlTBDUZAb9BGoC40+rdFCG0m10lXk" crossorigin="anonymous">
71
71
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/fontawesome.css" integrity="sha384-q3jl8XQu1OpdLgGFvNRnPdj5VIlCvgsDQTQB6owSOHWlAurxul7f+JpUOVdAiJ5P" crossorigin="anonymous">
@@ -1,227 +1,237 @@
1
1
  require "isodoc/html_function/mathvariant_to_plain"
2
2
  require_relative "postprocess_footnotes"
3
3
 
4
- module IsoDoc::HtmlFunction
5
- module Html
6
- def postprocess(result, filename, _dir)
7
- result = from_xhtml(cleanup(to_xhtml(textcleanup(result))))
8
- toHTML(result, filename)
9
- @files_to_delete.each { |f| FileUtils.rm_rf f }
10
- end
4
+ module IsoDoc
5
+ module HtmlFunction
6
+ module Html
7
+ def postprocess(result, filename, _dir)
8
+ result = from_xhtml(cleanup(to_xhtml(textcleanup(result))))
9
+ toHTML(result, filename)
10
+ @files_to_delete.each { |f| FileUtils.rm_rf f }
11
+ end
11
12
 
12
- def script_cdata(result)
13
- result.gsub(%r{<script([^>]*)>\s*<!\[CDATA\[}m, "<script\\1>")
14
- .gsub(%r{\]\]>\s*</script>}, "</script>")
15
- .gsub(%r{<!\[CDATA\[\s*<script([^>]*)>}m, "<script\\1>")
16
- .gsub(%r{</script>\s*\]\]>}, "</script>")
17
- end
13
+ def script_cdata(result)
14
+ result.gsub(%r{<script([^>]*)>\s*<!\[CDATA\[}m, "<script\\1>")
15
+ .gsub(%r{\]\]>\s*</script>}, "</script>")
16
+ .gsub(%r{<!\[CDATA\[\s*<script([^>]*)>}m, "<script\\1>")
17
+ .gsub(%r{</script>\s*\]\]>}, "</script>")
18
+ end
18
19
 
19
- def toHTML(result, filename)
20
- result = from_xhtml(html_cleanup(to_xhtml(result)))
21
- # result = populate_template(result, :html)
22
- result = from_xhtml(move_images(to_xhtml(result)))
23
- result = html5(script_cdata(inject_script(result)))
24
- File.open(filename, "w:UTF-8") { |f| f.write(result) }
25
- end
20
+ def toHTML(result, filename)
21
+ result = from_xhtml(html_cleanup(to_xhtml(result)))
22
+ result = from_xhtml(move_images(to_xhtml(result)))
23
+ result = html5(script_cdata(inject_script(result)))
24
+ File.open(filename, "w:UTF-8") { |f| f.write(result) }
25
+ end
26
26
 
27
- def html5(doc)
28
- doc.sub(%r{<!DOCTYPE html [^>]+>}, "<!DOCTYPE html>")
29
- .sub(%r{<\?xml[^>]+>}, "")
30
- end
27
+ def html5(doc)
28
+ doc.sub(%r{<!DOCTYPE html [^>]+>}, "<!DOCTYPE html>")
29
+ .sub(%r{<\?xml[^>]+>}, "")
30
+ end
31
31
 
32
- def html_cleanup(html)
33
- mathml(
34
- footnote_format(
35
- footnote_backlinks(
36
- html_toc(
37
- term_header(html_footnote_filter(html_preface(htmlstyle(html)))),
38
- ),
39
- ),
40
- ),
41
- )
42
- end
32
+ def html_cleanup(html)
33
+ html = term_header(html_footnote_filter(html_preface(htmlstyle(html))))
34
+ html = footnote_format(footnote_backlinks(html_toc(html)))
35
+ mathml(html_list_clean(remove_placeholder_paras(html)))
36
+ end
43
37
 
44
- def mathml(docxml)
45
- IsoDoc::HtmlFunction::MathvariantToPlain.new(docxml).convert
46
- end
38
+ def remove_placeholder_paras(html)
39
+ %w(title-section prefatory-section).each do |s|
40
+ html&.at("//div[@class = '#{s}']/p[last()]")&.remove
41
+ end
42
+ html
43
+ end
47
44
 
48
- def htmlstylesheet(file)
49
- return if file.nil?
45
+ def html_list_clean(html)
46
+ html.xpath("//ol/div | //ul/div").each do |div|
47
+ li = div&.xpath("./preceding-sibling::li")&.last ||
48
+ div.at("./following-sibling::li")
49
+ div.parent = li
50
+ end
51
+ html
52
+ end
50
53
 
51
- file.open if file.is_a?(Tempfile)
52
- stylesheet = file.read
53
- xml = Nokogiri::XML("<style/>")
54
- xml.children.first << Nokogiri::XML::Comment.new(xml, "\n#{stylesheet}\n")
55
- file.close
56
- file.unlink if file.is_a?(Tempfile)
57
- xml.root.to_s
58
- end
54
+ def mathml(docxml)
55
+ IsoDoc::HtmlFunction::MathvariantToPlain.new(docxml).convert
56
+ end
59
57
 
60
- def htmlstyle(docxml)
61
- return docxml unless @htmlstylesheet
58
+ def htmlstylesheet(file)
59
+ return if file.nil?
60
+
61
+ file.open if file.is_a?(Tempfile)
62
+ stylesheet = file.read
63
+ xml = Nokogiri::XML("<style/>")
64
+ xml.children.first << Nokogiri::XML::Comment
65
+ .new(xml, "\n#{stylesheet}\n")
66
+ file.close
67
+ file.unlink if file.is_a?(Tempfile)
68
+ xml.root.to_s
69
+ end
62
70
 
63
- head = docxml.at("//*[local-name() = 'head']")
64
- head << htmlstylesheet(@htmlstylesheet)
65
- s = htmlstylesheet(@htmlstylesheet_override) and head << s
66
- docxml
67
- end
71
+ def htmlstyle(docxml)
72
+ return docxml unless @htmlstylesheet
68
73
 
69
- def html_preface(docxml)
70
- html_cover(docxml) if @htmlcoverpage && !@bare
71
- html_intro(docxml) if @htmlintropage && !@bare
72
- docxml.at("//body") << mathjax(@openmathdelim, @closemathdelim)
73
- docxml.at("//body") << sourcecode_highlighter
74
- html_main(docxml)
75
- authority_cleanup(docxml)
76
- docxml
77
- end
74
+ head = docxml.at("//*[local-name() = 'head']")
75
+ head << htmlstylesheet(@htmlstylesheet)
76
+ s = htmlstylesheet(@htmlstylesheet_override) and head << s
77
+ docxml
78
+ end
78
79
 
79
- def authority_cleanup1(docxml, klass)
80
- dest = docxml.at("//div[@id = 'boilerplate-#{klass}-destination']")
81
- auth = docxml.at("//div[@id = 'boilerplate-#{klass}' or "\
82
- "@class = 'boilerplate-#{klass}']")
83
- auth&.xpath(".//h1[not(text())] | .//h2[not(text())]")&.each(&:remove)
84
- auth&.xpath(".//h1 | .//h2")&.each { |h| h["class"] = "IntroTitle" }
85
- dest and auth and dest.replace(auth.remove)
86
- end
80
+ def html_preface(docxml)
81
+ html_cover(docxml) if @htmlcoverpage && !@bare
82
+ html_intro(docxml) if @htmlintropage && !@bare
83
+ docxml.at("//body") << mathjax(@openmathdelim, @closemathdelim)
84
+ docxml.at("//body") << sourcecode_highlighter
85
+ html_main(docxml)
86
+ authority_cleanup(docxml)
87
+ docxml
88
+ end
87
89
 
88
- def authority_cleanup(docxml)
89
- %w(copyright license legal feedback).each do |t|
90
- authority_cleanup1(docxml, t)
90
+ def authority_cleanup1(docxml, klass)
91
+ dest = docxml.at("//div[@id = 'boilerplate-#{klass}-destination']")
92
+ auth = docxml.at("//div[@id = 'boilerplate-#{klass}' or "\
93
+ "@class = 'boilerplate-#{klass}']")
94
+ auth&.xpath(".//h1[not(text())] | .//h2[not(text())]")&.each(&:remove)
95
+ auth&.xpath(".//h1 | .//h2")&.each { |h| h["class"] = "IntroTitle" }
96
+ dest and auth and dest.replace(auth.remove)
91
97
  end
92
- end
93
98
 
94
- def html_cover(docxml)
95
- doc = to_xhtml_fragment(File.read(@htmlcoverpage, encoding: "UTF-8"))
96
- d = docxml.at('//div[@class="title-section"]')
97
- # d.children.first.add_previous_sibling doc.to_xml(encoding: "US-ASCII")
98
- d.children.first.add_previous_sibling(
99
- populate_template(doc.to_xml(encoding: "US-ASCII"), :html),
100
- )
101
- end
99
+ def authority_cleanup(docxml)
100
+ %w(copyright license legal feedback).each do |t|
101
+ authority_cleanup1(docxml, t)
102
+ end
103
+ end
102
104
 
103
- def html_intro(docxml)
104
- doc = to_xhtml_fragment(File.read(@htmlintropage, encoding: "UTF-8"))
105
- d = docxml.at('//div[@class="prefatory-section"]')
106
- # d.children.first.add_previous_sibling doc.to_xml(encoding: "US-ASCII")
107
- d.children.first.add_previous_sibling(
108
- populate_template(doc.to_xml(encoding: "US-ASCII"), :html),
109
- )
110
- end
105
+ def html_cover(docxml)
106
+ doc = to_xhtml_fragment(File.read(@htmlcoverpage, encoding: "UTF-8"))
107
+ d = docxml.at('//div[@class="title-section"]')
108
+ d.children.first.add_previous_sibling(
109
+ populate_template(doc.to_xml(encoding: "US-ASCII"), :html),
110
+ )
111
+ end
111
112
 
112
- def html_toc_entry(level, header)
113
- %(<li class="#{level}"><a href="##{header['id']}">\
114
- #{header_strip(header)}</a></li>)
115
- end
113
+ def html_intro(docxml)
114
+ doc = to_xhtml_fragment(File.read(@htmlintropage, encoding: "UTF-8"))
115
+ d = docxml.at('//div[@class="prefatory-section"]')
116
+ d.children.first.add_previous_sibling(
117
+ populate_template(doc.to_xml(encoding: "US-ASCII"), :html),
118
+ )
119
+ end
116
120
 
117
- def toclevel_classes
118
- (1..@htmlToClevels).reduce([]) { |m, i| m << "h#{i}" }
119
- end
121
+ def html_toc_entry(level, header)
122
+ %(<li class="#{level}"><a href="##{header['id']}">\
123
+ #{header_strip(header)}</a></li>)
124
+ end
120
125
 
121
- def toclevel
122
- ret = toclevel_classes.map do |l|
123
- "#{l}:not(:empty):not(.TermNum):not(.noTOC)"
126
+ def toclevel_classes
127
+ (1..@htmlToClevels).reduce([]) { |m, i| m << "h#{i}" }
124
128
  end
125
- <<~HEAD.freeze
126
- function toclevel() { return "#{ret.join(',')}";}
127
- HEAD
128
- end
129
129
 
130
- # needs to be same output as toclevel
131
- def html_toc(docxml)
132
- (idx = docxml.at("//div[@id = 'toc']")) or (return docxml)
133
- toc = "<ul>"
134
- path = toclevel_classes.map do |l|
135
- "//main//#{l}[not(@class = 'TermNum')][not(@class = 'noTOC')][text()]"
130
+ def toclevel
131
+ ret = toclevel_classes.map do |l|
132
+ "#{l}:not(:empty):not(.TermNum):not(.noTOC)"
133
+ end
134
+ <<~HEAD.freeze
135
+ function toclevel() { return "#{ret.join(',')}";}
136
+ HEAD
136
137
  end
137
- docxml.xpath(path.join(" | ")).each_with_index do |h, tocidx|
138
- h["id"] ||= "toc#{tocidx}"
139
- toc += html_toc_entry(h.name, h)
138
+
139
+ # needs to be same output as toclevel
140
+ def html_toc(docxml)
141
+ idx = docxml.at("//div[@id = 'toc']") or return docxml
142
+ toc = "<ul>"
143
+ path = toclevel_classes.map do |l|
144
+ "//main//#{l}[not(@class = 'TermNum')][not(@class = 'noTOC')][text()]"
145
+ end
146
+ docxml.xpath(path.join(" | ")).each_with_index do |h, tocidx|
147
+ h["id"] ||= "toc#{tocidx}"
148
+ toc += html_toc_entry(h.name, h)
149
+ end
150
+ idx.children = "#{toc}</ul>"
151
+ docxml
140
152
  end
141
- idx.children = "#{toc}</ul>"
142
- docxml
143
- end
144
153
 
145
- # presupposes that the image source is local
146
- def move_images(docxml)
147
- FileUtils.rm_rf tmpimagedir
148
- FileUtils.mkdir tmpimagedir
149
- docxml.xpath("//*[local-name() = 'img']").each do |i|
150
- i["width"], i["height"] = Html2Doc.image_resize(i, image_localfile(i),
151
- @maxheight, @maxwidth)
152
- next if /^data:/.match? i["src"]
154
+ # presupposes that the image source is local
155
+ def move_images(docxml)
156
+ FileUtils.rm_rf tmpimagedir
157
+ FileUtils.mkdir tmpimagedir
158
+ docxml.xpath("//*[local-name() = 'img']").each do |i|
159
+ i["width"], i["height"] = Html2Doc.image_resize(i, image_localfile(i),
160
+ @maxheight, @maxwidth)
161
+ next if /^data:/.match? i["src"]
153
162
 
154
- @datauriimage ? datauri(i) : move_image1(i)
163
+ @datauriimage ? datauri(i) : move_image1(i)
164
+ end
165
+ docxml
155
166
  end
156
- docxml
157
- end
158
167
 
159
- def datauri(img)
160
- type = img["src"].split(".")[-1]
161
- supertype = type == "xml" ? "application" : "image"
162
- bin = IO.binread(image_localfile(img))
163
- data = Base64.strict_encode64(bin)
164
- img["src"] = "data:#{supertype}/#{type};base64,#{data}"
165
- end
168
+ def datauri(img)
169
+ type = img["src"].split(".")[-1]
170
+ supertype = type == "xml" ? "application" : "image"
171
+ bin = IO.binread(image_localfile(img))
172
+ data = Base64.strict_encode64(bin)
173
+ img["src"] = "data:#{supertype}/#{type};base64,#{data}"
174
+ end
166
175
 
167
- def image_suffix(img)
168
- type = img["mimetype"]&.sub(%r{^[^/*]+/}, "")
169
- matched = /\.(?<suffix>[^. \r\n\t]+)$/.match img["src"]
170
- type and !type.empty? and return type
176
+ def image_suffix(img)
177
+ type = img["mimetype"]&.sub(%r{^[^/*]+/}, "")
178
+ matched = /\.(?<suffix>[^. \r\n\t]+)$/.match img["src"]
179
+ type and !type.empty? and return type
171
180
 
172
- !matched.nil? and matched[:suffix] and return matched[:suffix]
173
- "png"
174
- end
181
+ !matched.nil? and matched[:suffix] and return matched[:suffix]
182
+ "png"
183
+ end
175
184
 
176
- def move_image1(img)
177
- suffix = image_suffix(img)
178
- uuid = UUIDTools::UUID.random_create.to_s
179
- fname = "#{uuid}.#{suffix}"
180
- new_full_filename = File.join(tmpimagedir, fname)
181
- local_filename = image_localfile(img)
182
- FileUtils.cp local_filename, new_full_filename
183
- img["src"] = File.join(rel_tmpimagedir, fname)
184
- end
185
+ def move_image1(img)
186
+ suffix = image_suffix(img)
187
+ uuid = UUIDTools::UUID.random_create.to_s
188
+ fname = "#{uuid}.#{suffix}"
189
+ new_full_filename = File.join(tmpimagedir, fname)
190
+ local_filename = image_localfile(img)
191
+ FileUtils.cp local_filename, new_full_filename
192
+ img["src"] = File.join(rel_tmpimagedir, fname)
193
+ end
185
194
 
186
- def inject_script(doc)
187
- return doc unless @scripts
195
+ def inject_script(doc)
196
+ return doc unless @scripts
188
197
 
189
- scripts = File.read(@scripts, encoding: "UTF-8")
190
- scripts_override = ""
191
- @scripts_override and
192
- scripts_override = File.read(@scripts_override, encoding: "UTF-8")
193
- a = doc.split(%r{</body>})
194
- "#{a[0]}#{scripts}#{scripts_override}</body>#{a[1]}"
195
- end
198
+ scripts = File.read(@scripts, encoding: "UTF-8")
199
+ scripts_override = ""
200
+ @scripts_override and
201
+ scripts_override = File.read(@scripts_override, encoding: "UTF-8")
202
+ a = doc.split(%r{</body>})
203
+ "#{a[0]}#{scripts}#{scripts_override}</body>#{a[1]}"
204
+ end
196
205
 
197
- def sourcecode_highlighter
198
- '<script src="https://cdn.rawgit.com/google/code-prettify/master/'\
199
- 'loader/run_prettify.js"></script>'
200
- end
206
+ def sourcecode_highlighter
207
+ '<script src="https://cdn.rawgit.com/google/code-prettify/master/'\
208
+ 'loader/run_prettify.js"></script>'
209
+ end
201
210
 
202
- MATHJAX_ADDR =
203
- "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js".freeze
204
- MATHJAX = <<~"MATHJAX".freeze
205
- <script type="text/x-mathjax-config">
206
- MathJax.Hub.Config({
207
- "HTML-CSS": { preferredFont: "STIX" },
208
- asciimath2jax: { delimiters: [['OPEN', 'CLOSE']] }
209
- });
210
- </script>
211
- <script src="#{MATHJAX_ADDR}?config=MML_HTMLorMML-full" async="async"></script>
212
- MATHJAX
213
-
214
- def mathjax(open, close)
215
- MATHJAX.gsub("OPEN", open).gsub("CLOSE", close)
216
- end
211
+ MATHJAX_ADDR =
212
+ "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js".freeze
213
+ MATHJAX = <<~"MATHJAX".freeze
214
+ <script type="text/x-mathjax-config">
215
+ MathJax.Hub.Config({
216
+ "HTML-CSS": { preferredFont: "STIX" },
217
+ asciimath2jax: { delimiters: [['OPEN', 'CLOSE']] }
218
+ });
219
+ </script>
220
+ <script src="#{MATHJAX_ADDR}?config=MML_HTMLorMML-full" async="async"></script>
221
+ MATHJAX
222
+
223
+ def mathjax(open, close)
224
+ MATHJAX.gsub("OPEN", open).gsub("CLOSE", close)
225
+ end
217
226
 
218
- def term_header(docxml)
219
- %w(h1 h2 h3 h4 h5 h6 h7 h8).each do |h|
220
- docxml.xpath("//p[@class = 'TermNum'][../#{h}]").each do |p|
221
- p.name = "h#{h[1].to_i + 1}"
227
+ def term_header(docxml)
228
+ %w(h1 h2 h3 h4 h5 h6 h7 h8).each do |h|
229
+ docxml.xpath("//p[@class = 'TermNum'][../#{h}]").each do |p|
230
+ p.name = "h#{h[1].to_i + 1}"
231
+ end
222
232
  end
233
+ docxml
223
234
  end
224
- docxml
225
235
  end
226
236
  end
227
237
  end