isodoc 2.5.10 → 2.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a73625d6e0b342e44b34e2c93ef6df6126e1694dbcd9475cc52168da86a8cb8b
4
- data.tar.gz: 58bed9e6bd9f0a5812a6e7ee46e90ea2c4e2dc4bf1592a66db4302dd4d579f5c
3
+ metadata.gz: 14b2734abde4e3ab09b2a0637134ff9346bf2e378cebd580d154ae3799461c92
4
+ data.tar.gz: 3a1594d3c372cced922b30641dcdda21b1b2c95f8a921bd2d309eb7218952d35
5
5
  SHA512:
6
- metadata.gz: 28274dab0c28284a969ae3caf93e2065447c8b70b9166385e972b610014eb6bdeea8de3ec25273dfa1aea7fb78eaea463e894a0feeef18b82f0be3f2f479ff7c
7
- data.tar.gz: 87c56a3f6c1aefd791ae520d2e3c1e0c7d7060b5d81aca3e64096294cd3c5de28cd71d70ad04db8823457bc90773a8f6b1d427a43e1cdd3ed067b5ab72099c29
6
+ metadata.gz: 5638291318ca9a1eaa7c626b031afa8116dfb933cb6c8e408904126c367852b3e298735629c356e1d6192b49eec3c5fd8e94f39f5219d486b5aab9832158f43f
7
+ data.tar.gz: 52320e6fd84d57978a2c803417cfccfedf13e63b3b83c5bcbc73d69f2234a231ff35709b6bcd57dcbd9a622efda6c74c8fae50d132704fe8a655f71e996d2c71
data/isodoc.gemspec CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
28
28
  end
29
29
  spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
30
30
 
31
- spec.add_dependency "html2doc", "~> 1.5.3"
31
+ spec.add_dependency "html2doc", "~> 1.6.0"
32
32
  spec.add_dependency "htmlentities", "~> 4.3.4"
33
33
  # spec.add_dependency "isodoc-i18n", "~> 1.1.0" # already in relaton-render and mn-requirements
34
34
  spec.add_dependency "emf2svg"
@@ -113,6 +113,8 @@ module IsoDoc
113
113
  docxml = Nokogiri::XSLT(x).transform(docxml)
114
114
  end
115
115
  docxml
116
+ rescue
117
+ require "debug"; binding.b
116
118
  end
117
119
 
118
120
  def extract_preprocess_xslt(docxml)
@@ -156,11 +158,11 @@ module IsoDoc
156
158
 
157
159
  def middle_clause(_docxml = nil)
158
160
  "//clause[parent::sections][not(@type = 'scope')]" \
159
- "[not(descendant::terms)]"
161
+ "[not(descendant::terms)][not(descendant::references)]"
160
162
  end
161
163
 
162
164
  def target_pdf(node)
163
- if /#/.match?(node["target"]) then node["target"].sub(/#/, ".pdf#")
165
+ if node["target"].include?("#") then node["target"].sub("#", ".pdf#")
164
166
  else "##{node['target']}"
165
167
  end
166
168
  end
@@ -5,10 +5,6 @@ module IsoDoc
5
5
  module Blocks
6
6
  @annotation = false
7
7
 
8
- def middle_title(_isoxml, out)
9
- out.p(class: "zzSTDTitle1") { |p| p << @meta.get[:doctitle] }
10
- end
11
-
12
8
  def figure_name_parse(_node, div, name)
13
9
  name.nil? and return
14
10
  div.p class: "FigureTitle", style: "text-align:center;" do |p|
@@ -140,6 +136,7 @@ module IsoDoc
140
136
  if node["type"] == "floating-title"
141
137
  classtype = "h#{node['depth']}"
142
138
  end
139
+ classtype ||= node["class"]
143
140
  classtype
144
141
  end
145
142
 
@@ -71,7 +71,7 @@ module IsoDoc
71
71
  end
72
72
 
73
73
  def note_parse1(node, div)
74
- name = node&.at(ns("./name"))&.remove
74
+ name = node.at(ns("./name"))&.remove
75
75
  name and div.p do |p|
76
76
  p.span class: "note_label" do |s|
77
77
  name.children.each { |n| parse(n, s) }
@@ -110,12 +110,6 @@ module IsoDoc
110
110
  @note = false
111
111
  end
112
112
 
113
- def middle_admonitions(isoxml, out)
114
- isoxml.xpath(ns("//sections/note | //sections/admonition")).each do |x|
115
- parse(x, out)
116
- end
117
- end
118
-
119
113
  def admonition_name_parse(_node, div, name)
120
114
  div.p class: "AdmonitionTitle", style: "text-align:center;" do |p|
121
115
  name.children.each { |n| parse(n, p) }
@@ -38,7 +38,7 @@ module IsoDoc
38
38
 
39
39
  def xref_parse(node, out)
40
40
  target = if /#/.match?(node["target"])
41
- node["target"].sub(/#/, ".html#")
41
+ node["target"].sub("#", ".html#")
42
42
  else
43
43
  "##{node['target']}"
44
44
  end
@@ -150,7 +150,7 @@ module IsoDoc
150
150
  end
151
151
 
152
152
  def error_parse(node, out)
153
- text = node.to_xml.gsub(/</, "&lt;").gsub(/>/, "&gt;")
153
+ text = node.to_xml.gsub("<", "&lt;").gsub(">", "&gt;")
154
154
  out.para do |p|
155
155
  p.b(role: "strong") { |e| e << text }
156
156
  end
@@ -145,21 +145,20 @@ module IsoDoc
145
145
 
146
146
  def norm_ref_xpath
147
147
  "//bibliography/references[@normative = 'true'] | " \
148
- "//bibliography/clause[.//references[@normative = 'true']]"
148
+ "//bibliography/clause[.//references[@normative = 'true']] | " \
149
+ "//sections/references[@normative = 'true'] | " \
150
+ "//sections/clause[.//references[@normative = 'true']]"
149
151
  end
150
152
 
151
- def norm_ref(isoxml, out, num)
152
- (f = isoxml.at(ns(norm_ref_xpath)) and f["hidden"] != "true") or
153
- return num
153
+ def norm_ref(node, out)
154
+ node["hidden"] != "true" or return
154
155
  out.div do |div|
155
- num += 1
156
- clause_name(f, f.at(ns("./title")), div, nil)
157
- if f.name == "clause"
158
- f.elements.each { |e| parse(e, div) unless e.name == "title" }
159
- else biblio_list(f, div, false)
156
+ clause_name(node, node.at(ns("./title")), div, nil)
157
+ if node.name == "clause"
158
+ node.elements.each { |e| parse(e, div) unless e.name == "title" }
159
+ else biblio_list(node, div, false)
160
160
  end
161
161
  end
162
- num
163
162
  end
164
163
 
165
164
  def bibliography_xpath
@@ -168,15 +167,14 @@ module IsoDoc
168
167
  "//bibliography/references[@normative = 'false']"
169
168
  end
170
169
 
171
- def bibliography(isoxml, out)
172
- (f = isoxml.at(ns(bibliography_xpath)) and f["hidden"] != "true") or
173
- return
170
+ def bibliography(node, out)
171
+ node["hidden"] != "true" or return
174
172
  page_break(out)
175
173
  out.div do |div|
176
174
  div.h1 class: "Section3" do |h1|
177
- f.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
175
+ node.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
178
176
  end
179
- biblio_list(f, div, true)
177
+ biblio_list(node, div, true)
180
178
  end
181
179
  end
182
180
 
@@ -17,13 +17,11 @@ module IsoDoc
17
17
  end
18
18
  end
19
19
 
20
- def clause(isoxml, out)
21
- isoxml.xpath(ns(middle_clause(isoxml))).each do |c|
22
- out.div **attr_code(clause_attrs(c)) do |s|
23
- clause_name(c, c.at(ns("./title")), s, nil)
24
- c.elements.reject { |c1| c1.name == "title" }.each do |c1|
25
- parse(c1, s)
26
- end
20
+ def clause(node, out)
21
+ out.div **attr_code(clause_attrs(node)) do |s|
22
+ clause_name(node, node.at(ns("./title")), s, nil)
23
+ node.elements.reject { |c1| c1.name == "title" }.each do |c1|
24
+ parse(c1, s)
27
25
  end
28
26
  end
29
27
  end
@@ -32,44 +30,40 @@ module IsoDoc
32
30
  { id: node["id"], class: "Section3" }
33
31
  end
34
32
 
35
- def annex(isoxml, out)
36
- isoxml.xpath(ns("//annex")).each do |c|
37
- page_break(out)
38
- out.div **attr_code(annex_attrs(c)) do |s|
39
- c.elements.each do |c1|
40
- if c1.name == "title" then annex_name(c, c1, s)
41
- else parse(c1, s)
42
- end
33
+ def annex(node, out)
34
+ page_break(out)
35
+ out.div **attr_code(annex_attrs(node)) do |s|
36
+ node.elements.each do |c1|
37
+ if c1.name == "title" then annex_name(node, c1, s)
38
+ else parse(c1, s)
43
39
  end
44
40
  end
45
41
  end
46
42
  end
47
43
 
48
- def scope(isoxml, out, num)
49
- f = isoxml.at(ns("//clause[@type = 'scope']")) or return num
50
- out.div **attr_code(id: f["id"]) do |div|
51
- num = num + 1
52
- clause_name(f, f&.at(ns("./title")), div, nil)
53
- f.elements.each do |e|
44
+ def indexsect(node, out)
45
+ clause_parse(node, out)
46
+ end
47
+
48
+ def scope(node, out)
49
+ out.div **attr_code(id: node["id"]) do |div|
50
+ clause_name(node, node.at(ns("./title")), div, nil)
51
+ node.elements.each do |e|
54
52
  parse(e, div) unless e.name == "title"
55
53
  end
56
54
  end
57
- num
58
55
  end
59
56
 
60
57
  TERM_CLAUSE = "//sections/terms | " \
61
58
  "//sections/clause[descendant::terms]".freeze
62
59
 
63
- def terms_defs(isoxml, out, num)
64
- f = isoxml.at(ns(TERM_CLAUSE)) or return num
65
- out.div **attr_code(id: f["id"]) do |div|
66
- num = num + 1
67
- clause_name(f, f.at(ns("./title")), div, nil)
68
- f.elements.each do |e|
60
+ def terms_defs(node, out)
61
+ out.div **attr_code(id: node["id"]) do |div|
62
+ clause_name(node, node.at(ns("./title")), div, nil)
63
+ node.elements.each do |e|
69
64
  parse(e, div) unless %w{title source}.include? e.name
70
65
  end
71
66
  end
72
- num
73
67
  end
74
68
 
75
69
  # subclause
@@ -77,16 +71,13 @@ module IsoDoc
77
71
  clause_parse(isoxml, out)
78
72
  end
79
73
 
80
- def symbols_abbrevs(isoxml, out, num)
81
- f = isoxml.at(ns("//sections/definitions")) or return num
82
- out.div **attr_code(id: f["id"], class: "Symbols") do |div|
83
- num = num + 1
84
- clause_name(f, f.at(ns("./title")), div, nil)
85
- f.elements.each do |e|
74
+ def symbols_abbrevs(node, out)
75
+ out.div **attr_code(id: node["id"], class: "Symbols") do |div|
76
+ clause_name(node, node.at(ns("./title")), div, nil)
77
+ node.elements.each do |e|
86
78
  parse(e, div) unless e.name == "title"
87
79
  end
88
80
  end
89
- num
90
81
  end
91
82
 
92
83
  # subclause
@@ -171,15 +162,14 @@ module IsoDoc
171
162
  end
172
163
  end
173
164
 
174
- def colophon(isoxml, out)
175
- isoxml.at(ns("//colophon")) or return
176
- page_break(out)
177
- isoxml.xpath(ns("//colophon/clause")).each do |f|
178
- out.div class: "Section3", id: f["id"] do |div|
179
- clause_name(f, f&.at(ns("./title")), div, { class: "IntroTitle" })
180
- f.elements.each do |e|
181
- parse(e, div) unless e.name == "title"
182
- end
165
+ def colophon(node, out)
166
+ @seen_colophon or page_break(out)
167
+ @seen_colophon = true
168
+ out.div class: "Section3", id: node["id"] do |div|
169
+ clause_name(node, node.at(ns("./title")), div,
170
+ { class: "IntroTitle" })
171
+ node.elements.each do |e|
172
+ parse(e, div) unless e.name == "title"
183
173
  end
184
174
  end
185
175
  end
@@ -194,24 +184,6 @@ module IsoDoc
194
184
  t.size == 1 && %w(terms definitions references).include?(t[0].name)
195
185
  end
196
186
 
197
- def front(isoxml, out)
198
- p = isoxml.at(ns("//preface")) or return
199
- p.elements.each do |e|
200
- if is_clause?(e.name)
201
- case e.name
202
- when "abstract" then abstract e, out
203
- when "foreword" then foreword e, out
204
- when "introduction" then introduction e, out
205
- when "executivesummary" then executivesummary e, out
206
- when "clause" then preface e, out
207
- when "acknowledgements" then acknowledgements e, out
208
- end
209
- else
210
- preface_block(e, out)
211
- end
212
- end
213
- end
214
-
215
187
  def executivesummary(clause, out)
216
188
  introduction clause, out
217
189
  end
@@ -56,7 +56,6 @@ module IsoDoc
56
56
 
57
57
  # top level clause names
58
58
  def clause_name(node, title, div, header_class)
59
- preceding_floating_titles(node, div)
60
59
  header_class = {} if header_class.nil?
61
60
  div.h1 **attr_code(header_class) do |h1|
62
61
  if title.is_a?(String) then h1 << title
@@ -69,7 +68,6 @@ module IsoDoc
69
68
  end
70
69
 
71
70
  def annex_name(_annex, name, div)
72
- preceding_floating_titles(name, div)
73
71
  return if name.nil?
74
72
 
75
73
  div.h1 class: "Annex" do |t|
@@ -84,18 +82,6 @@ module IsoDoc
84
82
  node.children.each { |c| parse(c, p) }
85
83
  end
86
84
  end
87
-
88
- def preceding_floating_titles(node, div)
89
- return if node.nil?
90
-
91
- out = node.xpath("./preceding-sibling::*")
92
- .reverse.each_with_object([]) do |p, m|
93
- break m unless p.name == "p"
94
-
95
- m << p
96
- end or return
97
- out.each { |c| parse(c, div) }
98
- end
99
85
  end
100
86
  end
101
87
  end
@@ -82,20 +82,57 @@ module IsoDoc
82
82
  section_break(body)
83
83
  end
84
84
 
85
+ TOP_ELEMENTS =
86
+ "//preface/*[@displayorder] | //sections/*[@displayorder] | " \
87
+ "//annex[@displayorder] | //bibliography/*[@displayorder] | " \
88
+ "//colophon/*[@displayorder] | //indexsect[@displayorder]"
89
+ .freeze
90
+
85
91
  def make_body3(body, docxml)
86
92
  body.div class: "main-section" do |div3|
87
93
  boilerplate docxml, div3
88
- preface_block docxml, div3
89
- abstract docxml, div3
90
- foreword docxml, div3
91
- introduction docxml, div3
92
- acknowledgements docxml, div3
93
- middle docxml, div3
94
+ content(div3, docxml, ns(self.class::TOP_ELEMENTS))
94
95
  footnotes div3
95
96
  comments div3
96
97
  end
97
98
  end
98
99
 
100
+ # xpath presumed to list elements with displayorder attribute
101
+ def content(body, docxml, xpath)
102
+ docxml.xpath(xpath).sort_by { |c| c["displayorder"].to_i }
103
+ .each do |c|
104
+ top_element_render(c, body)
105
+ end
106
+ end
107
+
108
+ def top_element_render(e, out)
109
+ case e.name
110
+ when "abstract" then abstract e, out
111
+ when "foreword" then foreword e, out
112
+ when "introduction" then introduction e, out
113
+ when "executivesummary" then executivesummary e, out
114
+ when "acknowledgements" then acknowledgements e, out
115
+ when "annex" then annex e, out
116
+ when "definitions" then symbols_abbrevs e, out
117
+ when "indexsect" then indexsect e, out
118
+ when "references"
119
+ if e["normative"] == "true" then norm_ref e, out
120
+ else bibliography e, out
121
+ end
122
+ when "clause"
123
+ if e.parent.name == "preface" then preface e, out
124
+ elsif e.parent.name == "colophon" then colophon e, out
125
+ elsif e["type"] == "scope" then scope e, out
126
+ elsif e.at(ns(".//terms")) then terms_defs e, out
127
+ elsif e.at(ns(".//references[@normative = 'true']"))
128
+ norm_ref e, out
129
+ elsif e.at(ns(".//references")) then bibliography e, out
130
+ else clause e, out
131
+ end
132
+ else parse(e, out)
133
+ end
134
+ end
135
+
99
136
  def info(isoxml, out)
100
137
  @meta.code_css isoxml, out
101
138
  @meta.title isoxml, out
@@ -116,22 +153,8 @@ module IsoDoc
116
153
  @meta.get
117
154
  end
118
155
 
119
- def middle(isoxml, out)
120
- middle_title(isoxml, out)
121
- middle_admonitions(isoxml, out)
122
- scope isoxml, out, 0
123
- norm_ref isoxml, out, 0
124
- terms_defs isoxml, out, 0
125
- symbols_abbrevs isoxml, out, 0
126
- clause isoxml, out
127
- annex isoxml, out
128
- bibliography isoxml, out
129
- colophon isoxml, out
130
- end
131
-
132
156
  def boilerplate(node, out)
133
- return if @bare
134
-
157
+ @bare and return
135
158
  boilerplate = node.at(ns("//boilerplate")) or return
136
159
  out.div class: "authority" do |s|
137
160
  boilerplate.children.each do |n|
@@ -176,6 +176,7 @@ module IsoDoc
176
176
  imgtype = "emf" if emf?("#{imgclass}/#{imgtype}")
177
177
  imgtype = imgtype.sub(/\+[a-z0-9]+$/, "") # svg+xml
178
178
  imgtype = "png" unless /^[a-z0-9]+$/.match? imgtype
179
+ imgtype == "postscript" and imgtype = "eps"
179
180
  Tempfile.open(["image", ".#{imgtype}"]) do |f|
180
181
  f.binmode
181
182
  f.write(Base64.strict_decode64(imgdata))
@@ -36,7 +36,7 @@ module IsoDoc
36
36
 
37
37
  def make_generic_footnote_text(node, fnid)
38
38
  noko do |xml|
39
- xml.aside **{ id: "fn:#{fnid}", class: "footnote" } do |div|
39
+ xml.aside id: "fn:#{fnid}", class: "footnote" do |div|
40
40
  node.children.each { |n| parse(n, div) }
41
41
  end
42
42
  end.join("\n")
@@ -59,7 +59,7 @@ module IsoDoc
59
59
  return if @seen_footnote.include?(tid + fn)
60
60
 
61
61
  @in_footnote = true
62
- out.aside **{ class: "footnote" } do |a|
62
+ out.aside class: "footnote" do |a|
63
63
  a << make_table_footnote_text(node, tid + fn, fn)
64
64
  end
65
65
  @in_footnote = false
@@ -33,16 +33,6 @@ module IsoDoc
33
33
  section_break(body)
34
34
  end
35
35
 
36
- def make_body3(body, docxml)
37
- body.div class: "main-section" do |div3|
38
- boilerplate docxml, div3
39
- front docxml, div3
40
- middle docxml, div3
41
- footnotes div3
42
- comments div3
43
- end
44
- end
45
-
46
36
  def googlefonts
47
37
  <<~HEAD.freeze
48
38
  <link href="https://fonts.googleapis.com/css?family=Overpass:300,300i,600,900" rel="stylesheet"/>
data/lib/isodoc/init.rb CHANGED
@@ -21,9 +21,9 @@ module IsoDoc
21
21
  def toc_init(docxml)
22
22
  x = "//metanorma-extension/presentation-metadata" \
23
23
  "[name[text() = 'TOC Heading Levels']]/value"
24
- n = docxml.at(ns(x.sub(/TOC/, "DOC TOC"))) and
24
+ n = docxml.at(ns(x.sub("TOC", "DOC TOC"))) and
25
25
  @wordToClevels = n.text.to_i
26
- n = docxml.at(ns(x.sub(/TOC/, "HTML TOC"))) and
26
+ n = docxml.at(ns(x.sub("TOC", "HTML TOC"))) and
27
27
  @htmlToClevels = n.text.to_i
28
28
  end
29
29
 
@@ -93,7 +93,7 @@ module IsoDoc
93
93
  @fn_bookmarks = {}
94
94
  end
95
95
 
96
- def init_fonts(options)
96
+ def init_fonts(options)
97
97
  @normalfontsize = options[:normalfontsize]
98
98
  @smallerfontsize = options[:smallerfontsize]
99
99
  @monospacefontsize = options[:monospacefontsize]
@@ -4,7 +4,7 @@ module IsoDoc
4
4
  class PresentationXMLConvert < ::IsoDoc::Convert
5
5
  def expand_citeas(text)
6
6
  text.nil? and return text
7
- HTMLEntities.new.decode(text.gsub(/&amp;#x/, "&#"))
7
+ HTMLEntities.new.decode(text.gsub("&amp;#x", "&#"))
8
8
  end
9
9
 
10
10
  def erefstack1(elem)
@@ -84,7 +84,7 @@ module IsoDoc
84
84
  locs1 = []
85
85
  until locs.empty?
86
86
  if locs[1] == "to"
87
- locs1 << @i18n.chain_to.sub(/%1/, locs[0]).sub(/%2/, locs[2])
87
+ locs1 << @i18n.chain_to.sub("%1", locs[0]).sub("%2", locs[2])
88
88
  locs.shift(3)
89
89
  else locs1 << locs.shift
90
90
  end
@@ -108,25 +108,37 @@ module IsoDoc
108
108
 
109
109
  def svg_to_emf(node)
110
110
  uri = svg_to_emf_uri(node)
111
- if node.elements&.first&.name == "svg" &&
112
- (!node["height"] || node["height"] == "auto")
113
- node["height"] = node.elements.first["height"]
114
- node["width"] = node.elements.first["width"]
115
- end
111
+ svg_impose_height_attr(node)
116
112
  ret = imgfile_suffix(uri, "emf")
117
- File.exist?(ret) and return ret
113
+ if File.exist?(ret) && File.exist?(node["src"])
114
+ warn "Exists: #{ret}, Exists: #{node['src']}"
115
+ return ret
116
+ end
117
+ warn "Converting..."
118
118
  inkscape_convert(uri, ret, '--export-type="emf"')
119
119
  end
120
120
 
121
+ def svg_impose_height_attr(node)
122
+ e = node.elements&.first or return
123
+ (e.name == "svg" &&
124
+ (!node["height"] || node["height"] == "auto")) or return
125
+ node["height"] = e["height"]
126
+ node["width"] = e["width"]
127
+ end
128
+
121
129
  def inkscape_convert(uri, file, option)
122
130
  exe = inkscape_installed? or raise "Inkscape missing in PATH, unable" \
123
131
  "to convert image #{uri}. Aborting."
124
132
  uri = Metanorma::Utils::external_path uri
125
133
  exe = Metanorma::Utils::external_path exe
126
- system(%(#{exe} #{option} #{uri})) and
127
- return Metanorma::Utils::datauri(file)
128
-
129
- raise %(Fail on #{exe} #{option} #{uri})
134
+ warn %(#{exe} #{option} #{uri})
135
+ err = system %(#{exe} #{option} #{uri})
136
+ File.exist?(file) and return Metanorma::Utils::datauri(file)
137
+ file2 = uri + File.extname(file)
138
+ warn "Checking #{file2}"
139
+ warn `ls #{File.dirname(file2)}`
140
+ File.exist?(file2) and return Metanorma::Utils::datauri(file2)
141
+ raise %(Fail on #{exe} #{option} #{uri} outputting #{file}: status #{err})
130
142
  end
131
143
 
132
144
  def svg_to_emf_uri(node)
@@ -7,9 +7,21 @@ module IsoDoc
7
7
  bibitem(x, renderings)
8
8
  end
9
9
  hidden_items(docxml)
10
+ move_norm_ref_to_sections(docxml)
10
11
  @xrefs.parse_inclusions(refs: true).parse(docxml)
11
12
  end
12
13
 
14
+ def move_norm_ref_to_sections(docxml)
15
+ docxml.at(ns(@xrefs.klass.norm_ref_xpath)) or return
16
+ s = docxml.at(ns("//sections")) ||
17
+ docxml.at(ns("//preface"))&.after("<sections/>")&.next_element ||
18
+ docxml.at(ns("//annex | //bibliography"))&.before("<sections/>")
19
+ &.previous_element or return
20
+ docxml.xpath(ns(@xrefs.klass.norm_ref_xpath)).each do |r|
21
+ s << r.remove
22
+ end
23
+ end
24
+
13
25
  def hidden_items(docxml)
14
26
  docxml.xpath(ns("//references[bibitem/@hidden = 'true']")).each do |x|
15
27
  x.at(ns("./bibitem[not(@hidden = 'true')]")) and next
@@ -131,7 +143,8 @@ module IsoDoc
131
143
  idents = @xrefs.klass.render_identifier(ids)
132
144
  ret = if biblio then biblio_ref_entry_code(ordinal, idents, ids,
133
145
  standard, datefn, bib)
134
- else norm_ref_entry_code(ordinal, idents, ids, standard, datefn, bib)
146
+ else norm_ref_entry_code(ordinal, idents, ids, standard, datefn,
147
+ bib)
135
148
  end
136
149
  bib << "<biblio-tag>#{ret}</biblio-tag>"
137
150
  end
@@ -148,8 +161,8 @@ module IsoDoc
148
161
 
149
162
  # if ids is just a number, only use that ([1] Non-Standard)
150
163
  # else, use both ordinal, as prefix, and ids
151
- def biblio_ref_entry_code(ordinal, ids, _id, standard, datefn, _bib)
152
- #standard and id = nil
164
+ def biblio_ref_entry_code(ordinal, ids, _id, _standard, datefn, _bib)
165
+ # standard and id = nil
153
166
  ret = (ids[:ordinal] || ids[:metanorma] || "[#{ordinal}]")
154
167
  if ids[:sdo]
155
168
  ret = prefix_bracketed_ref(ret)
@@ -2,6 +2,14 @@ require_relative "refs"
2
2
 
3
3
  module IsoDoc
4
4
  class PresentationXMLConvert < ::IsoDoc::Convert
5
+ def middle_title(docxml)
6
+ s = docxml.at(ns("//sections")) or return
7
+ t = @meta.get[:doctitle]
8
+ t.nil? || t.empty? and return
9
+ s.children.first.previous =
10
+ "<p class='zzSTDTitle1'>#{t}</p>"
11
+ end
12
+
5
13
  def clause(docxml)
6
14
  docxml.xpath(ns("//clause | " \
7
15
  "//terms | //definitions | //references"))
@@ -26,10 +34,10 @@ module IsoDoc
26
34
  end
27
35
 
28
36
  def floattitle(docxml)
29
- docxml.xpath(ns("//clause | //annex | //appendix | //introduction | " \
30
- "//foreword | //preface/abstract | //acknowledgements | " \
31
- "//terms | //definitions | //references | //colophon"))
32
- .each do |f|
37
+ p = "//clause | //annex | //appendix | //introduction | //foreword | " \
38
+ "//preface/abstract | //acknowledgements | //terms | " \
39
+ "//definitions | //references | //colophon | //indexsect"
40
+ docxml.xpath(ns(p)).each do |f|
33
41
  floattitle1(f)
34
42
  end
35
43
  # top-level
@@ -94,9 +102,9 @@ module IsoDoc
94
102
  end
95
103
 
96
104
  def display_order_at(docxml, xpath, idx)
97
- return idx unless c = docxml.at(ns(xpath))
98
-
105
+ c = docxml.at(ns(xpath)) or return idx
99
106
  idx += 1
107
+ idx = preceding_floating_titles(c, idx)
100
108
  c["displayorder"] = idx
101
109
  idx
102
110
  end
@@ -104,11 +112,25 @@ module IsoDoc
104
112
  def display_order_xpath(docxml, xpath, idx)
105
113
  docxml.xpath(ns(xpath)).each do |c|
106
114
  idx += 1
115
+ idx = preceding_floating_titles(c, idx)
107
116
  c["displayorder"] = idx
108
117
  end
109
118
  idx
110
119
  end
111
120
 
121
+ def preceding_floating_titles(node, idx)
122
+ out = node.xpath("./preceding-sibling::*")
123
+ .reverse.each_with_object([]) do |p, m|
124
+ %w(note admonition p).include?(p.name) or break m
125
+ m << p
126
+ end
127
+ out.reject { |c| c["displayorder"] }.reverse.each do |c|
128
+ c["displayorder"] = idx
129
+ idx += 1
130
+ end
131
+ idx
132
+ end
133
+
112
134
  def display_order(docxml)
113
135
  i = 0
114
136
  i = display_order_xpath(docxml, "//preface/*", i)
@@ -52,6 +52,7 @@ module IsoDoc
52
52
  name << ", #{designation_grammar(g).join(', ')}"
53
53
  designation_localization(desgn, name)
54
54
  designation_pronunciation(desgn, name)
55
+ designation_bookmarks(desgn, name)
55
56
  desgn.children = name.children
56
57
  end
57
58
 
@@ -94,6 +95,12 @@ module IsoDoc
94
95
  name << ", /#{to_xml(f.children)}/"
95
96
  end
96
97
 
98
+ def designation_bookmarks(desgn, name)
99
+ desgn.xpath(ns(".//bookmark")).each do |b|
100
+ name << b.remove
101
+ end
102
+ end
103
+
97
104
  def termexample(docxml)
98
105
  docxml.xpath(ns("//termexample")).each { |f| example1(f) }
99
106
  end
@@ -1,8 +1,8 @@
1
1
  module IsoDoc
2
2
  class PresentationXMLConvert < ::IsoDoc::Convert
3
3
  def prefix_container(container, linkend, node, _target)
4
- l10n(@i18n.nested_xref.sub(/%1/, anchor_xref(node, container))
5
- .sub(/%2/, linkend))
4
+ l10n(@i18n.nested_xref.sub("%1", anchor_xref(node, container))
5
+ .sub("%2", linkend))
6
6
  end
7
7
 
8
8
  def anchor_value(id)
@@ -133,8 +133,8 @@ module IsoDoc
133
133
  end
134
134
 
135
135
  def i18n_chain_boolean(value, entry)
136
- @i18n.send("chain_#{entry[:conn]}").sub(/%1/, value)
137
- .sub(/%2/, loc2xref(entry))
136
+ @i18n.send("chain_#{entry[:conn]}").sub("%1", value)
137
+ .sub("%2", loc2xref(entry))
138
138
  end
139
139
 
140
140
  def can_conflate_xref_rendering?(locs)
@@ -47,9 +47,11 @@ module IsoDoc
47
47
  # to deal with single-term and single-ref annexes
48
48
  def section(docxml)
49
49
  references docxml
50
+ # feeds middle_title
50
51
  # triggers xrefs reparse, so put references before all other sections,
51
52
  # which alter titles and thus can alter xrefs
52
- rearrange_clauses docxml # feeds toc, display_order, clausetitle, clause
53
+ rearrange_clauses docxml # feeds toc, display_order, clausetitle, clause, middle_title
54
+ middle_title docxml
53
55
  annex docxml
54
56
  clause docxml # feeds clausetitle
55
57
  term docxml
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "2.5.10".freeze
2
+ VERSION = "2.6.0".freeze
3
3
  end
@@ -1,6 +1,6 @@
1
- require_relative "./table"
2
- require_relative "./inline"
3
- require_relative "./lists"
1
+ require_relative "table"
2
+ require_relative "inline"
3
+ require_relative "lists"
4
4
 
5
5
  module IsoDoc
6
6
  module WordFunction
@@ -29,25 +29,34 @@ module IsoDoc
29
29
  def make_body2(body, docxml)
30
30
  body.div class: "WordSection2" do |div2|
31
31
  boilerplate docxml, div2
32
- front docxml, div2
32
+ content(div2, docxml, ns("//preface/*[@displayorder]"))
33
33
  div2.p { |p| p << "&#xa0;" } # placeholder
34
34
  end
35
35
  section_break(body)
36
36
  end
37
37
 
38
+ MAIN_ELEMENTS =
39
+ "//sections/*[@displayorder] | //annex[@displayorder] | " \
40
+ "//bibliography/*[@displayorder] | //colophon/*[@displayorder] | " \
41
+ "//indexsect[@displayorder]".freeze
42
+
38
43
  def make_body3(body, docxml)
39
44
  body.div class: "WordSection3" do |div3|
40
- middle docxml, div3
45
+ content(div3, docxml, ns(self.class::MAIN_ELEMENTS))
41
46
  footnotes div3
42
47
  comments div3
43
48
  end
44
49
  end
45
50
 
46
- def para_class(_node)
51
+ def para_class(node)
47
52
  return "Sourcecode" if @annotation
48
53
  return "MsoCommentText" if @in_comment
49
54
  return "Note" if @note
55
+ if node["type"] == "floating-title"
56
+ return "h#{node['depth']}"
57
+ end
50
58
 
59
+ n = node["class"] and return n
51
60
  nil
52
61
  end
53
62
 
@@ -8,7 +8,7 @@ module IsoDoc
8
8
  end
9
9
 
10
10
  def section_break(body, continuous: false)
11
- body.p do |p|
11
+ body.p class: "section-break" do |p|
12
12
  if continuous
13
13
  p.br clear: "all", style: "page-break-before:auto;" \
14
14
  "mso-break-type:section-break"
@@ -19,7 +19,7 @@ module IsoDoc
19
19
  end
20
20
 
21
21
  def page_break(out)
22
- out.p do |p|
22
+ out.p class: "page-break" do |p|
23
23
  p.br clear: "all",
24
24
  style: "mso-special-character:line-break;" \
25
25
  "page-break-before:always"
@@ -58,7 +58,7 @@ module IsoDoc
58
58
 
59
59
  def xref_parse(node, out)
60
60
  target = if /#/.match?(node["target"])
61
- node["target"].sub(/#/, ".doc#")
61
+ node["target"].sub("#", ".doc#")
62
62
  else
63
63
  "##{node['target']}"
64
64
  end
@@ -1,7 +1,7 @@
1
1
  require "fileutils"
2
- require_relative "./postprocess_cover"
3
- require_relative "./postprocess_toc"
4
- require_relative "./postprocess_table"
2
+ require_relative "postprocess_cover"
3
+ require_relative "postprocess_toc"
4
+ require_relative "postprocess_table"
5
5
 
6
6
  module IsoDoc
7
7
  module WordFunction
@@ -16,7 +16,7 @@ module IsoDoc
16
16
 
17
17
  def toWord(result, filename, dir, header)
18
18
  result = from_xhtml(word_cleanup(to_xhtml(result)))
19
- .gsub(/-DOUBLE_HYPHEN_ESCAPE-/, "--")
19
+ .gsub("-DOUBLE_HYPHEN_ESCAPE-", "--")
20
20
  @wordstylesheet = wordstylesheet_update
21
21
  Html2Doc.new(
22
22
  filename: filename, imagedir: @localdir,
@@ -56,6 +56,7 @@ module IsoDoc
56
56
  word_example_cleanup(docxml)
57
57
  word_pseudocode_cleanup(docxml)
58
58
  word_image_caption(docxml)
59
+ word_floating_titles(docxml)
59
60
  word_section_breaks(docxml)
60
61
  word_tab_clean(docxml)
61
62
  authority_cleanup(docxml)
@@ -173,6 +174,21 @@ module IsoDoc
173
174
  end
174
175
  docxml
175
176
  end
177
+
178
+ # move p.h1 (floating title) after any page, section breaks
179
+ def word_floating_titles(docxml)
180
+ docxml.xpath("//p[@class = 'section-break' or @class = 'page-break']")
181
+ .each do |b|
182
+ out = b.xpath("./preceding-sibling::*").reverse
183
+ .each_with_object([]) do |p, m|
184
+ (p.name == "p" && p["class"] == "h1") or break m
185
+ m << p
186
+ end
187
+ b.delete("class")
188
+ out.empty? and next
189
+ out[-1].previous = b.remove
190
+ end
191
+ end
176
192
  end
177
193
  end
178
194
  end
@@ -44,7 +44,7 @@ module IsoDoc
44
44
  end
45
45
 
46
46
  def termnote_label(note)
47
- @labels["termnote"].gsub(/%/, note.to_s)
47
+ @labels["termnote"].gsub("%", note.to_s)
48
48
  end
49
49
 
50
50
  def increment_label(elems, node, counter, increment: true)
@@ -194,11 +194,11 @@ refer_list)
194
194
 
195
195
  def list_item_anchor_label(label, list_anchor, prev_label, refer_list)
196
196
  prev_label.empty? or
197
- label = @i18n.list_nested_xref.sub(/%1/, "#{prev_label})")
198
- .sub(/%2/, label)
197
+ label = @i18n.list_nested_xref.sub("%1", "#{prev_label})")
198
+ .sub("%2", label)
199
199
  refer_list and
200
- label = @i18n.list_nested_xref.sub(/%1/, list_anchor[:xref])
201
- .sub(/%2/, label)
200
+ label = @i18n.list_nested_xref.sub("%1", list_anchor[:xref])
201
+ .sub("%2", label)
202
202
  label
203
203
  end
204
204
 
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.5.10
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-24 00:00:00.000000000 Z
11
+ date: 2023-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: html2doc
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.5.3
19
+ version: 1.6.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.5.3
26
+ version: 1.6.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: htmlentities
29
29
  requirement: !ruby/object:Gem::Requirement