isodoc 2.4.1 → 2.4.3

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/isodoc/base_style/all.css +29 -0
  3. data/lib/isodoc/base_style/metanorma_word.css +9 -0
  4. data/lib/isodoc/base_style/metanorma_word.scss +11 -0
  5. data/lib/isodoc/base_style/reset.css +29 -0
  6. data/lib/isodoc/base_style/reset.scss +34 -0
  7. data/lib/isodoc/base_style/rouge.css +39 -0
  8. data/lib/isodoc/base_style/typography.scss +1 -1
  9. data/lib/isodoc/convert.rb +10 -3
  10. data/lib/isodoc/function/blocks.rb +29 -16
  11. data/lib/isodoc/function/inline.rb +13 -13
  12. data/lib/isodoc/function/inline_simple.rb +1 -1
  13. data/lib/isodoc/function/references.rb +17 -38
  14. data/lib/isodoc/function/table.rb +1 -1
  15. data/lib/isodoc/function/to_word_html.rb +0 -4
  16. data/lib/isodoc/function/utils.rb +6 -2
  17. data/lib/isodoc/html_function/html.rb +13 -13
  18. data/lib/isodoc/html_function/postprocess.rb +14 -1
  19. data/lib/isodoc/metadata.rb +1 -1
  20. data/lib/isodoc/presentation_function/bibdata.rb +3 -3
  21. data/lib/isodoc/presentation_function/block.rb +1 -98
  22. data/lib/isodoc/presentation_function/math.rb +15 -4
  23. data/lib/isodoc/presentation_function/sourcecode.rb +122 -0
  24. data/lib/isodoc/presentation_function/terms.rb +14 -27
  25. data/lib/isodoc/presentation_xml_convert.rb +38 -0
  26. data/lib/isodoc/version.rb +1 -1
  27. data/lib/isodoc/word_function/body.rb +19 -19
  28. data/lib/isodoc/word_function/comments.rb +23 -18
  29. data/lib/isodoc/word_function/footnotes.rb +8 -8
  30. data/lib/isodoc/word_function/postprocess.rb +25 -118
  31. data/lib/isodoc/word_function/postprocess_cover.rb +29 -157
  32. data/lib/isodoc/word_function/postprocess_table.rb +85 -0
  33. data/lib/isodoc/word_function/postprocess_toc.rb +165 -0
  34. data/lib/isodoc/word_function/table.rb +34 -15
  35. data/lib/isodoc/xref/xref_gen.rb +2 -4
  36. metadata +6 -2
@@ -0,0 +1,165 @@
1
+ module IsoDoc
2
+ module WordFunction
3
+ module Postprocess
4
+ def insert_toc(intro, docxml, level)
5
+ toc = ""
6
+ toc += make_WordToC(docxml, level)
7
+ toc += make_table_word_toc(docxml)
8
+ toc += make_figure_word_toc(docxml)
9
+ toc += make_recommendation_word_toc(docxml)
10
+ intro.sub(/WORDTOC/, toc)
11
+ end
12
+
13
+ def word_toc_entry(toclevel, heading)
14
+ bookmark = bookmarkid # Random.rand(1000000000)
15
+ <<~TOC
16
+ <p class="MsoToc#{toclevel}"><span class="MsoHyperlink"><span lang="EN-GB" style='mso-no-proof:yes'>
17
+ <a href="#_Toc#{bookmark}">#{heading}<span lang="EN-GB" class="MsoTocTextSpan">
18
+ <span style='mso-tab-count:1 dotted'>. </span>
19
+ </span><span lang="EN-GB" class="MsoTocTextSpan">
20
+ <span style='mso-element:field-begin'></span></span>
21
+ <span lang="EN-GB" class="MsoTocTextSpan"> PAGEREF _Toc#{bookmark} \\h </span>
22
+ <span lang="EN-GB" class="MsoTocTextSpan"><span style='mso-element:field-separator'></span></span><span
23
+ lang="EN-GB" class="MsoTocTextSpan">1</span>
24
+ <span lang="EN-GB" class="MsoTocTextSpan"></span><span
25
+ lang="EN-GB" class="MsoTocTextSpan"><span style='mso-element:field-end'></span></span></a></span></span></p>
26
+
27
+ TOC
28
+ end
29
+
30
+ def word_toc_preface(level)
31
+ <<~TOC
32
+ <span lang="EN-GB"><span style='mso-element:field-begin'></span><span
33
+ style='mso-spacerun:yes'>&#xA0;</span>TOC \\o "1-#{level}" \\h \\z \\u <span
34
+ style='mso-element:field-separator'></span></span>
35
+ TOC
36
+ end
37
+
38
+ WORD_TOC_SUFFIX1 = <<~TOC.freeze
39
+ <p class="MsoToc1"><span lang="EN-GB"><span
40
+ style='mso-element:field-end'></span></span><span
41
+ lang="EN-GB"><o:p>&#xA0;</o:p></span></p>
42
+ TOC
43
+
44
+ def make_WordToC(docxml, level)
45
+ toc = ""
46
+ # docxml.xpath("//h1 | //h2[not(ancestor::*[@class = 'Section3'])]").
47
+ xpath = (1..level).each.map { |i| "//h#{i}" }.join (" | ")
48
+ docxml.xpath(xpath).each do |h|
49
+ toc += word_toc_entry(h.name[1].to_i, header_strip(h))
50
+ end
51
+ toc.sub(/(<p class="MsoToc1">)/,
52
+ %{\\1#{word_toc_preface(level)}}) + WORD_TOC_SUFFIX1
53
+ end
54
+
55
+ # inheriting gems need to add native Word name of style, if different
56
+ # including both CSS style name and human readable style name.
57
+ # Any human readable style name needs to come first for the Word template
58
+ # to work in regenerating the ToC
59
+ def table_toc_class
60
+ %w(TableTitle tabletitle)
61
+ end
62
+
63
+ def figure_toc_class
64
+ %w(FigureTitle figuretitle)
65
+ end
66
+
67
+ def reqt_toc_class
68
+ %w(RecommendationTitle RecommendationTestTitle
69
+ recommendationtitle recommendationtesttitle)
70
+ end
71
+
72
+ def toc_word_class_list(classes)
73
+ classes.map do |x|
74
+ / /.match?(x) ? %(&quot;#{x}&quot;) : x
75
+ end.join(",")
76
+ end
77
+
78
+ def word_toc_reqt_preface1
79
+ <<~TOC
80
+ <span lang="EN-GB"><span style='mso-element:field-begin'></span><span
81
+ style='mso-spacerun:yes'>&#xA0;</span>TOC \\h \\z \\t #{toc_word_class_list reqt_toc_class}
82
+ <span style='mso-element:field-separator'></span></span>
83
+ TOC
84
+ end
85
+
86
+ def word_toc_table_preface1
87
+ <<~TOC
88
+ <span lang="EN-GB"><span style='mso-element:field-begin'></span><span style='mso-spacerun:yes'>&#xA0;</span>TOC
89
+ \\h \\z \\t #{toc_word_class_list table_toc_class} <span style='mso-element:field-separator'></span></span>
90
+ TOC
91
+ end
92
+
93
+ def word_toc_figure_preface1
94
+ <<~TOC
95
+ <span lang="EN-GB"><span style='mso-element:field-begin'></span><span style='mso-spacerun:yes'>&#xA0;</span>TOC
96
+ \\h \\z \\t #{toc_word_class_list figure_toc_class} <span style='mso-element:field-separator'></span></span>
97
+ TOC
98
+ end
99
+
100
+ def table_toc_xpath
101
+ attr = table_toc_class.map { |x| "@class = '#{x}'" }
102
+ "//p[#{attr.join(' or ')}]"
103
+ end
104
+
105
+ def make_table_word_toc(docxml)
106
+ (docxml.at(table_toc_xpath) && @toctablestitle) or return ""
107
+ toc = %{<p class="TOCTitle">#{@toctablestitle}</p>}
108
+ docxml.xpath(table_toc_xpath).each do |h|
109
+ toc += word_toc_entry(1, header_strip(h))
110
+ end
111
+ toc.sub(/(<p class="MsoToc1">)/,
112
+ %{\\1#{word_toc_table_preface1}}) + WORD_TOC_SUFFIX1
113
+ end
114
+
115
+ def figure_toc_xpath
116
+ attr = figure_toc_class.map { |x| "@class = '#{x}'" }
117
+ "//p[#{attr.join(' or ')}]"
118
+ end
119
+
120
+ def make_figure_word_toc(docxml)
121
+ (docxml.at(figure_toc_xpath) && @tocfigurestitle) or return ""
122
+ toc = %{<p class="TOCTitle">#{@tocfigurestitle}</p>}
123
+ docxml.xpath(figure_toc_xpath).each do |h|
124
+ toc += word_toc_entry(1, header_strip(h))
125
+ end
126
+ toc.sub(/(<p class="MsoToc1">)/,
127
+ %{\\1#{word_toc_figure_preface1}}) + WORD_TOC_SUFFIX1
128
+ end
129
+
130
+ def reqt_toc_xpath
131
+ attr = reqt_toc_class.map { |x| "@class = '#{x}'" }
132
+ "//p[#{attr.join(' or ')}]"
133
+ end
134
+
135
+ def make_recommendation_word_toc(docxml)
136
+ (docxml.at(reqt_toc_xpath) && @tocrecommendationstitle) or return ""
137
+ toc = %{<p class="TOCTitle">#{@tocrecommendationstitle}</p>}
138
+ docxml.xpath(reqt_toc_xpath).sort_by do |h|
139
+ recommmendation_sort_key(h.text)
140
+ end.each do |h|
141
+ toc += word_toc_entry(1, header_strip(h))
142
+ end
143
+ toc.sub(/(<p class="MsoToc1">)/,
144
+ %{\\1#{word_toc_reqt_preface1}}) + WORD_TOC_SUFFIX1
145
+ end
146
+
147
+ def recommmendation_sort_key(header)
148
+ m = /^([^0-9]+) (\d+)/.match(header) || /^([^:]+)/.match(header)
149
+ m ||= [header, nil]
150
+ ret = "#{recommmendation_sort_key1(m[1])}::"
151
+ m[2] and ret += ("%04d" % m[2].to_i).to_s
152
+ ret
153
+ end
154
+
155
+ def recommmendation_sort_key1(type)
156
+ case type&.downcase
157
+ when "requirement" then "04"
158
+ when "recommendation" then "05"
159
+ when "permission" then "06"
160
+ else type
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
@@ -24,34 +24,53 @@ module IsoDoc
24
24
  def make_tr_attr(cell, row, totalrows, header, bordered)
25
25
  style = cell.name == "th" ? "font-weight:bold;" : ""
26
26
  rowmax = cell["rowspan"] ? row + cell["rowspan"].to_i - 1 : row
27
- style += make_tr_attr_style(row, rowmax, totalrows, header, bordered)
27
+ style += make_tr_attr_style(cell, row, rowmax, totalrows,
28
+ { header: header, bordered: bordered })
28
29
  { rowspan: cell["rowspan"], colspan: cell["colspan"],
29
- valign: cell["valign"], align: cell["align"], style: style }
30
+ valign: cell["valign"], align: cell["align"], style: style,
31
+ class: cell["class"] }
30
32
  end
31
33
 
32
- def make_tr_attr_style(row, rowmax, totalrows, header, bordered)
34
+ def make_tr_attr_style(cell, row, rowmax, totalrows, opt)
35
+ top = row.zero? ? "#{SW1} 1.5pt;" : "none;"
36
+ bottom = "#{SW1} #{rowmax >= totalrows ? '1.5' : '1.0'}pt;"
33
37
  ret = <<~STYLE.gsub(/\n/, "")
34
- border-top:#{row.zero? ? "#{SW1} 1.5pt;" : 'none;'}
35
- mso-border-top-alt:#{row.zero? ? "#{SW1} 1.5pt;" : 'none;'}
36
- border-bottom:#{SW1} #{rowmax >= totalrows ? '1.5' : '1.0'}pt;
37
- mso-border-bottom-alt:#{SW1} #{rowmax >= totalrows ? '1.5' : '1.0'}pt;
38
+ border-top:#{top}mso-border-top-alt:#{top}
39
+ border-bottom:#{bottom}mso-border-bottom-alt:#{bottom}
38
40
  STYLE
39
- bordered or ret = ""
40
- pb = header || (totalrows <= 10 && rowmax < totalrows) ? "avoid" : "auto"
41
+ opt[:bordered] or ret = ""
42
+ pb = keep_rows_together(cell, rowmax, totalrows, opt) ? "avoid" : "auto"
41
43
  "#{ret}page-break-after:#{pb};"
42
44
  end
43
45
 
46
+ def keep_rows_together(cell, rowmax, totalrows, opt)
47
+ opt[:header] and return true
48
+ table_line_count(cell.parent.parent) > 15 and return false
49
+ (totalrows <= 10 && rowmax < totalrows)
50
+ end
51
+
52
+ def table_line_count(tbody)
53
+ sum = 0
54
+ tbody.xpath(ns(".//tr")).each do |r|
55
+ i = 1
56
+ r.xpath(ns(".//td | .//th")).each do |c|
57
+ n = c.xpath(ns(".//li | .//p | .//br")).size
58
+ n > i and i = n
59
+ end
60
+ sum += i
61
+ end
62
+ sum
63
+ end
64
+
44
65
  def table_attrs(node)
45
66
  c = node["class"]
46
67
  bordered = "border-spacing:0;border-width:1px;"
47
68
  (%w(modspec).include?(c) || !c) or bordered = nil
48
69
  ret = {
49
- summary: node["summary"],
50
- width: node["width"],
70
+ summary: node["summary"], width: node["width"],
51
71
  style: "mso-table-anchor-horizontal:column;mso-table-overlap:never;" \
52
72
  "#{bordered}#{keep_style(node)}",
53
- class: (node.text.length > 4000 ? "MsoISOTableBig" : "MsoISOTable"),
54
- }
73
+ class: (node.text.length > 4000 ? "MsoISOTableBig" : "MsoISOTable") }
55
74
  bordered or ret.delete(:class)
56
75
  super.merge(attr_code(ret))
57
76
  end
@@ -60,7 +79,7 @@ module IsoDoc
60
79
  colgroup = node.at(ns("./colgroup")) or return
61
80
  table.colgroup do |cg|
62
81
  colgroup.xpath(ns("./col")).each do |c|
63
- cg.col **{ width: c["width"] }
82
+ cg.col width: c["width"]
64
83
  end
65
84
  end
66
85
  end
@@ -68,7 +87,7 @@ module IsoDoc
68
87
  def table_parse(node, out)
69
88
  @in_table = true
70
89
  table_title_parse(node, out)
71
- out.div **{ align: "center", class: "table_container" } do |div|
90
+ out.div align: "center", class: "table_container" do |div|
72
91
  div.table **table_attrs(node) do |t|
73
92
  colgroup(node, t)
74
93
  thead_parse(node, t)
@@ -133,10 +133,8 @@ module IsoDoc
133
133
  end
134
134
 
135
135
  def example_anchor_names1(notes, counter)
136
- notes.each do |n|
137
- next if @anchors[n["id"]] || blank?(n["id"])
138
-
139
- @anchors[n["id"]] =
136
+ notes.noblank.each do |n|
137
+ @anchors[n["id"]] ||=
140
138
  anchor_struct(increment_label(notes, n, counter), n,
141
139
  @labels["example_xref"], "example", n["unnumbered"])
142
140
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isodoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.1
4
+ version: 2.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-19 00:00:00.000000000 Z
11
+ date: 2023-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciimath
@@ -416,6 +416,7 @@ files:
416
416
  - lib/isodoc/base_style/nav.scss
417
417
  - lib/isodoc/base_style/reset.css
418
418
  - lib/isodoc/base_style/reset.scss
419
+ - lib/isodoc/base_style/rouge.css
419
420
  - lib/isodoc/base_style/scripts.html
420
421
  - lib/isodoc/base_style/typography.css
421
422
  - lib/isodoc/base_style/typography.scss
@@ -465,6 +466,7 @@ files:
465
466
  - lib/isodoc/presentation_function/math.rb
466
467
  - lib/isodoc/presentation_function/refs.rb
467
468
  - lib/isodoc/presentation_function/section.rb
469
+ - lib/isodoc/presentation_function/sourcecode.rb
468
470
  - lib/isodoc/presentation_function/terms.rb
469
471
  - lib/isodoc/presentation_function/xrefs.rb
470
472
  - lib/isodoc/presentation_xml_convert.rb
@@ -478,6 +480,8 @@ files:
478
480
  - lib/isodoc/word_function/inline.rb
479
481
  - lib/isodoc/word_function/postprocess.rb
480
482
  - lib/isodoc/word_function/postprocess_cover.rb
483
+ - lib/isodoc/word_function/postprocess_table.rb
484
+ - lib/isodoc/word_function/postprocess_toc.rb
481
485
  - lib/isodoc/word_function/table.rb
482
486
  - lib/isodoc/xref.rb
483
487
  - lib/isodoc/xref/xref_anchor.rb