isodoc 1.6.4 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
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