isodoc 2.12.6 → 2.12.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 48457f7d76baef2d4d349f569e3ee43049253bc9955d50f5c6584d9e8fa2367b
4
- data.tar.gz: d87899d14231920e9f2709f2ed5101049e3f0132e2f43f76a67e704c82b91309
3
+ metadata.gz: d46387b5edc802722718eee916f95086aaf651066ca34ff37b440ddcd98ea600
4
+ data.tar.gz: ec777b74ccacf348dc787500b6e40c1a310c60ba248562fb4534837531e9e690
5
5
  SHA512:
6
- metadata.gz: c9f54cf72607cca29215845a2f36ca6de3a74d91a97f002157cf8c09a5baeaf37b2b71dddf2eb91eef3b1ea1c4677ebfc3f3cbfc4fee7bc97cc5d1537b43f925
7
- data.tar.gz: f0923719cd684e18c2879de8d1477c17b05fb5b3c5e2597a8189371db49aa59c531a863f96808dcc546b5bd709f3799b3dedac6dc3cf9b96ce5aeef25dda4c19
6
+ metadata.gz: 34a90598b6fb6c91a2650761a105bce1d2509895106566ae0296235031f768b0330fb419a247b29670d1f6e56df1911b2cbf099c040101a3bc0ce8352ece2391
7
+ data.tar.gz: c9491f85801636ee19d61e1185211e407e0dbbf58ffa5a8cfa41d5e7f0b3a8e2a84d262ced72fcf70c9bfa71bea29308d6e2757dc39a0a17eab9b841e78a1619
data/isodoc.gemspec CHANGED
@@ -34,10 +34,10 @@ Gem::Specification.new do |spec|
34
34
  # spec.add_dependency "isodoc-i18n", "~> 1.1.0" # already in relaton-render and mn-requirements
35
35
  # spec.add_dependency "relaton-cli"
36
36
  # spec.add_dependency "metanorma-utils", "~> 1.5.0" # already in isodoc-i18n
37
- spec.add_dependency "mn2pdf", ">= 2.08"
37
+ spec.add_dependency "mn2pdf", ">= 2.13"
38
38
  spec.add_dependency "mn-requirements", "~> 0.4.0"
39
39
 
40
- spec.add_dependency "relaton-render", "~> 0.8.0"
40
+ spec.add_dependency "relaton-render", "~> 0.9.0"
41
41
  spec.add_dependency "roman-numerals"
42
42
  spec.add_dependency "rouge", "~> 4.0"
43
43
  spec.add_dependency "thread_safe"
@@ -21,7 +21,7 @@ module IsoDoc
21
21
  SPAN_UNWRAP_CLASSES =
22
22
  %w[fmt-caption-label fmt-label-delim fmt-caption-delim fmt-autonum-delim
23
23
  fmt-element-name fmt-conn fmt-comma fmt-enum-comma fmt-obligation
24
- fmt-xref-container].freeze
24
+ fmt-xref-container fmt-designation-field].freeze
25
25
 
26
26
  def span_parse(node, out)
27
27
  klass = node["style"] || node["class"]
@@ -203,6 +203,7 @@ module IsoDoc
203
203
  def xref_label_parse(node, out); end
204
204
 
205
205
  def name_parse(node, out); end
206
+ def semx_definition_parse(node, out); end
206
207
 
207
208
  def floating_title_parse(node, out); end
208
209
 
@@ -10,21 +10,44 @@ module IsoDoc
10
10
  para.children.each { |n| parse(n, out) }
11
11
  end
12
12
 
13
+ def semx_deprecated_term_parse(node, out); end
14
+
13
15
  def deprecated_term_parse(node, out)
14
- out.p class: "DeprecatedTerms", style: "text-align:left;" do |p|
15
- node.children.each { |c| parse(c, p) }
16
+ node.children.each do |c|
17
+ if c.name == "p"
18
+ out.p class: "DeprecatedTerms", style: "text-align:left;" do |p|
19
+ c.children.each { |c1| parse(c1, p) }
20
+ end
21
+ else parse(c, out)
22
+ end
16
23
  end
17
24
  end
18
25
 
26
+ def semx_admitted_term_parse(node, out); end
27
+
19
28
  def admitted_term_parse(node, out)
20
- out.p class: "AltTerms", style: "text-align:left;" do |p|
21
- node.children.each { |c| parse(c, p) }
29
+ node.children.each do |c|
30
+ if c.name == "p"
31
+ out.p class: "AltTerms", style: "text-align:left;" do |p|
32
+ c.children.each { |c1| parse(c1, p) }
33
+ end
34
+ else parse(c, out)
35
+ end
22
36
  end
23
37
  end
24
38
 
39
+ def semx_term_parse(node, out); end
40
+
41
+ def semx_related_parse(node, out); end
42
+
25
43
  def term_parse(node, out)
26
- out.p class: "Terms", style: "text-align:left;" do |p|
27
- node.children.each { |c| parse(c, p) }
44
+ node.children.each do |c|
45
+ if c.name == "p"
46
+ out.p class: "Terms", style: "text-align:left;" do |p|
47
+ c.children.each { |c1| parse(c1, p) }
48
+ end
49
+ else parse(c, out)
50
+ end
28
51
  end
29
52
  end
30
53
 
@@ -51,16 +74,15 @@ module IsoDoc
51
74
  para&.name != "p" and parse(para, div)
52
75
  end
53
76
 
77
+ def semx_termref_parse(node, out); end
78
+
54
79
  def termref_parse(node, out)
55
80
  out.p do |p|
56
81
  node.children.each { |n| parse(n, p) }
57
82
  end
58
83
  end
59
84
 
60
- def termdomain_parse(node, out)
61
- node["hidden"] == "true" and return
62
- node.children.each { |n| parse(n, out) }
63
- end
85
+ def termdomain_parse(node, out); end
64
86
 
65
87
  def termdef_parse(node, out)
66
88
  name = node.at(ns("./fmt-name"))&.remove
@@ -215,12 +215,18 @@ module IsoDoc
215
215
  when "pre" then pre_parse(node, out)
216
216
  when "annotation" then annotation_parse(node, out)
217
217
  when "term" then termdef_parse(node, out)
218
- when "preferred" then term_parse(node, out)
219
- when "admitted" then admitted_term_parse(node, out)
220
- when "deprecates" then deprecated_term_parse(node, out)
218
+ when "preferred" then semx_term_parse(node, out)
219
+ when "fmt-preferred" then term_parse(node, out)
220
+ when "admitted" then semx_admitted_term_parse(node, out)
221
+ when "fmt-admitted" then admitted_term_parse(node, out)
222
+ when "deprecates" then semx_deprecated_term_parse(node, out)
223
+ when "fmt-deprecates" then deprecated_term_parse(node, out)
221
224
  when "domain" then termdomain_parse(node, out)
222
- when "definition" then definition_parse(node, out)
223
- when "termsource" then termref_parse(node, out)
225
+ when "definition" then semx_definition_parse(node, out)
226
+ when "fmt-definition" then definition_parse(node, out)
227
+ when "termsource" then semx_termref_parse(node, out)
228
+ when "fmt-termsource" then termref_parse(node, out)
229
+ when "related" then semx_related_parse(node, out)
224
230
  when "modification" then modification_parse(node, out)
225
231
  when "termnote" then termnote_parse(node, out)
226
232
  when "terms" then terms_parse(node, out)
@@ -44,14 +44,23 @@ module IsoDoc
44
44
  old.delete("id")
45
45
  end
46
46
 
47
+ def semx_fmt_dup(elem)
48
+ elem["id"] ||= "_#{UUIDTools::UUID.random_create}"
49
+ new = Nokogiri::XML(<<~XML).root
50
+ <semx xmlns='#{elem.namespace.href}' element='#{elem.name}' source='#{elem['original-id'] || elem['id']}'>#{to_xml(elem.children)}</semx>
51
+ XML
52
+ strip_duplicate_ids(nil, elem, new)
53
+ new
54
+ end
55
+
47
56
  def gather_all_ids(elem)
48
57
  elem.xpath(".//*[@id]").each_with_object([]) do |i, m|
49
58
  m << i["id"]
50
59
  end
51
60
  end
52
61
 
53
- # remove ids duplicated between title and fmt-title
54
- # index terms are assumed transferred to fmt-title from title
62
+ # remove ids duplicated between sem_title and pres_title
63
+ # index terms are assumed transferred to pres_title from sem_title
55
64
  def strip_duplicate_ids(_node, sem_title, pres_title)
56
65
  sem_title && pres_title or return
57
66
  ids = gather_all_ids(pres_title)
@@ -75,6 +84,11 @@ module IsoDoc
75
84
  "<semx element='autonum' source='#{id}'>#{num}</semx>"
76
85
  end
77
86
 
87
+ def semx_orig(node, orig = nil)
88
+ orig ||= node.parent.parent
89
+ orig.at(".//*[@id = '#{node['source']}']")
90
+ end
91
+
78
92
  def labelled_autonum(label, id, num)
79
93
  elem = "<span class='fmt-element-name'>#{label}</span>"
80
94
  num.blank? and return elem
@@ -7,6 +7,7 @@ module IsoDoc
7
7
  end
8
8
 
9
9
  def concept1(node)
10
+ node.ancestors("definition, termsource, related").empty? or return
10
11
  xref = node&.at(ns("./xref/@target"))&.text or
11
12
  return concept_render(node, ital: "true", ref: "true", bold: "false",
12
13
  linkref: "true", linkmention: "false")
@@ -71,20 +72,160 @@ module IsoDoc
71
72
  end
72
73
 
73
74
  def related(docxml)
74
- docxml.xpath(ns("//related")).each { |f| related1(f) }
75
+ docxml.xpath(ns("//fmt-related/semx")).each { |f| related1(f) }
75
76
  end
76
77
 
77
78
  def related1(node)
78
- p = node.at(ns("./preferred"))
79
- ref = node.at(ns("./xref | ./eref | ./termref"))
80
- label = @i18n.relatedterms[node["type"]].upcase
79
+ p, ref, orig = related1_prep(node)
80
+ label = @i18n.relatedterms[orig["type"]].upcase
81
81
  if p && ref
82
- node.replace(l10n("<p><strong>#{label}:</strong> " \
82
+ node.children =(l10n("<p><strong>#{label}:</strong> " \
83
83
  "<em>#{to_xml(p)}</em> (#{Common::to_xml(ref)})</p>"))
84
84
  else
85
- node.replace(l10n("<p><strong>#{label}:</strong> " \
85
+ node.children = (l10n("<p><strong>#{label}:</strong> " \
86
86
  "<strong>**RELATED TERM NOT FOUND**</strong></p>"))
87
87
  end
88
88
  end
89
+
90
+ def related1_prep(node)
91
+ p = node.at(ns("./fmt-preferred"))&.children
92
+ ref = node.at(ns("./xref | ./eref | ./termref"))
93
+ orig = semx_orig(node)
94
+ [p, ref, orig]
95
+ end
96
+
97
+ def related_designation1(desgn)
98
+ out = desgn.parent.at(ns("./fmt-#{desgn.name}"))
99
+ d1 = semx_fmt_dup(desgn)
100
+ %w(preferred admitted deprecates).each do |w|
101
+ d = d1.at(ns("./#{w}[last()]")) and d.after("<fmt-#{w}/>")
102
+ end
103
+ out << d1
104
+ end
105
+
106
+ def designation(docxml)
107
+ docxml.xpath(ns("//related")).each { |p| related_designation1(p) }
108
+ docxml.xpath(ns("//preferred | //admitted | //deprecates"))
109
+ .each { |p| designation1(p) }
110
+ docxml.xpath(ns("//fmt-preferred | //fmt-admitted | //fmt-deprecates"))
111
+ .each { |t| merge_second_preferred(t) }
112
+ docxml.xpath(ns("//fmt-deprecates")).each { |d| deprecates(d) }
113
+ docxml.xpath(ns("//fmt-admitted")).each { |d| admits(d) }
114
+ end
115
+
116
+ def deprecates(elem)
117
+ elem.xpath(ns(".//semx[@element = 'deprecates']")).each do |t|
118
+ t.previous = @i18n.l10n("#{@i18n.deprecated}: ")
119
+ end
120
+ end
121
+
122
+ def admits(elem); end
123
+
124
+ def merge_second_preferred(term)
125
+ pref = nil
126
+ out = term.xpath(ns("./semx")).each_with_index
127
+ .with_object([]) do |(p, i), m|
128
+ if (i.zero? && (pref = p)) || merge_preferred_eligible?(pref, p)
129
+ m << p
130
+ else
131
+ p.wrap("<p></p>")
132
+ end
133
+ end
134
+ pref&.replace(merge_second_preferred1(out, term))
135
+ end
136
+
137
+ def merge_second_preferred1(desgns, term)
138
+ desgns[1..].each(&:remove)
139
+ ret = l10n(desgns.map { |x| to_xml(x) }.join("; "))
140
+ term.ancestors("fmt-related").empty? and ret = "<p>#{ret}</p>"
141
+ ret
142
+ end
143
+
144
+ def merge_preferred_eligible?(first, second)
145
+ orig_first, orig_second, firstex, secondex =
146
+ merge_preferred_eligible_prep(first, second)
147
+ orig_first["geographic-area"] == orig_second["geographic-area"] &&
148
+ firstex["language"] == secondex["language"] &&
149
+ !orig_first.at(ns("./pronunciation | ./grammar | ./graphical-symbol")) &&
150
+ !orig_second.at(ns("./pronunciation | ./grammar | ./graphical-symbol")) &&
151
+ orig_first.name == "preferred" && orig_second.name == "preferred"
152
+ end
153
+
154
+ def merge_preferred_eligible_prep(first, second)
155
+ orig_first = semx_orig(first)
156
+ orig_second = semx_orig(second)
157
+ firstex = orig_first.at(ns("./expression")) || {}
158
+ secondex = orig_second.at(ns("./expression")) || {}
159
+ [orig_first, orig_second, firstex, secondex]
160
+ end
161
+
162
+ def designation1(desgn)
163
+ desgn.parent.name == "related" and return
164
+ out = desgn.parent.at(ns("./fmt-#{desgn.name}"))
165
+ d1 = semx_fmt_dup(desgn)
166
+ s = d1.at(ns("./termsource"))
167
+ name = d1.at(ns("./expression/name | ./letter-symbol/name | " \
168
+ "./graphical-symbol")) or return
169
+ designation_annotate(d1, name, desgn)
170
+ out << d1
171
+ s and out << s.wrap("<fmt-termsource></fmt-termsource>").parent
172
+ end
173
+
174
+ def designation_annotate(desgn, name, orig)
175
+ designation_boldface(desgn)
176
+ designation_field(desgn, name, orig)
177
+ #g = desgn.at(ns("./expression/grammar")) and
178
+ #name << ", #{designation_grammar(g).join(', ')}"
179
+ designation_grammar(desgn, name)
180
+ designation_localization(desgn, name, orig)
181
+ designation_pronunciation(desgn, name)
182
+ designation_bookmarks(desgn, name)
183
+ desgn.children = name.children
184
+ end
185
+
186
+ def designation_boldface(desgn)
187
+ desgn["element"] == "preferred" or return
188
+ name = desgn.at(ns("./expression/name | ./letter-symbol/name")) or return
189
+ name.children = "<strong>#{name.children}</strong>"
190
+ end
191
+
192
+ def designation_field(desgn, name, orig)
193
+ f = orig.xpath(ns("./field-of-application | ./usage-info"))
194
+ &.map { |u| to_xml(semx_fmt_dup(u)) }&.join(", ")
195
+ f&.empty? and return nil
196
+ name << "<span class='fmt-designation-field'>, &#x3c;#{f}&#x3e;</span>"
197
+ end
198
+
199
+ def designation_grammar(desgn, name)
200
+ g = desgn.at(ns("./expression/grammar")) or return
201
+ ret = []
202
+ g.xpath(ns("./gender | ./number")).each do |x|
203
+ ret << @i18n.grammar_abbrevs[x.text]
204
+ end
205
+ %w(isPreposition isParticiple isAdjective isVerb isAdverb isNoun)
206
+ .each do |x|
207
+ g.at(ns("./#{x}[text() = 'true']")) and ret << @i18n.grammar_abbrevs[x]
208
+ end
209
+ name << ", #{ret.join(', ')}"
210
+ end
211
+
212
+ def designation_localization(desgn, name, orig_desgn)
213
+ loc = [desgn.at(ns("./expression/@language"))&.text,
214
+ desgn.at(ns("./expression/@script"))&.text,
215
+ orig_desgn.at("./@geographic-area")&.text].compact
216
+ loc.empty? and return
217
+ name << ", #{loc.join(' ')}"
218
+ end
219
+
220
+ def designation_pronunciation(desgn, name)
221
+ f = desgn.at(ns("./expression/pronunciation")) or return
222
+ name << ", /#{to_xml(f.children)}/"
223
+ end
224
+
225
+ def designation_bookmarks(desgn, name)
226
+ desgn.xpath(ns(".//bookmark")).each do |b|
227
+ name << b.remove
228
+ end
229
+ end
89
230
  end
90
231
  end
@@ -9,7 +9,7 @@ module IsoDoc
9
9
  def pref_ref_code(bib)
10
10
  bib["suppress_identifier"] == "true" and return nil
11
11
  ret = bib.xpath(ns("./docidentifier[@scope = 'biblio-tag']"))
12
- ret.empty? or return ret.map(&:text)
12
+ ret.empty? or return ret.map { |x| to_xml(x.children) }
13
13
  ret = pref_ref_code_parse(bib) or return nil
14
14
  ins = bib.at(ns("./docidentifier[last()]"))
15
15
  ret.reverse_each do |r|
@@ -50,14 +50,14 @@ module IsoDoc
50
50
 
51
51
  def bracket_if_num(num)
52
52
  num.nil? and return nil
53
- num = num.text.sub(/^\[/, "").sub(/\]$/, "")
53
+ num = to_xml(num.children).sub(/^\[/, "").sub(/\]$/, "")
54
54
  /^\d+$/.match?(num) and return "[#{num}]"
55
55
  num
56
56
  end
57
57
 
58
58
  def unbracket1(ident)
59
59
  ident.nil? and return nil
60
- ident.is_a?(String) or ident = ident.text
60
+ ident.is_a?(String) or ident = to_xml(ident.children)
61
61
  ident.sub(/^\[/, "").sub(/\]$/, "")
62
62
  end
63
63
 
@@ -3,11 +3,23 @@ require "metanorma-utils"
3
3
  module IsoDoc
4
4
  class PresentationXMLConvert < ::IsoDoc::Convert
5
5
  def citeas(xmldoc)
6
- xmldoc.xpath(ns("//eref | //origin | //quote//source")).each do |e|
6
+ xmldoc.xpath(ns("//eref | //origin | //quote//source | //link"))
7
+ .each do |e|
7
8
  e["bibitemid"] && e["citeas"] or next
8
- a = @xrefs.anchor(e["bibitemid"], :xref, false) and
9
- e["citeas"] = a.gsub(%r{</?[^>]+>}, "")
9
+ a = @xrefs.anchor(e["bibitemid"], :xref, false) or next
10
+ e["citeas"] = citeas_cleanup(a)
11
+ # link generated in collection postprocessing from eref
12
+ e.name == "link" && e.text.empty? and e.children = e["citeas"]
13
+ end
14
+ end
15
+
16
+ def citeas_cleanup(ref)
17
+ if /</.match?(ref)
18
+ xml = Nokogiri::XML("<root>#{ref}</root>")
19
+ xml.xpath("//semx").each { |x| x.replace(x.children) }
20
+ ref = to_xml(xml.at("//root").children)
10
21
  end
22
+ ref
11
23
  end
12
24
 
13
25
  def expand_citeas(text)
@@ -0,0 +1,180 @@
1
+ module IsoDoc
2
+ class PresentationXMLConvert < ::IsoDoc::Convert
3
+ def enable_indexsect
4
+ false
5
+ end
6
+
7
+ def add_id
8
+ %(id="_#{UUIDTools::UUID.random_create}")
9
+ end
10
+
11
+ def strip_index(docxml)
12
+ docxml.xpath(ns("//index | //index-xref | //indexsect")).each(&:remove)
13
+ end
14
+
15
+ def index(xml)
16
+ if enable_indexsect && xml.at(ns("//index"))
17
+ i = xml.at(ns("//indexsect")) ||
18
+ xml.root.add_child("<indexsect #{add_id}><title>#{@i18n.index}" \
19
+ "</title></indexsect>").first
20
+ index = sort_indexterms(xml.xpath(ns("//index")),
21
+ xml.xpath(ns("//index-xref[@also = 'false']")),
22
+ xml.xpath(ns("//index-xref[@also = 'true']")))
23
+ index1(xml, i, index)
24
+ else strip_index(xml)
25
+ end
26
+ end
27
+
28
+ def index1(docxml, indexsect, index)
29
+ c = indexsect.add_child("<ul></ul>").first
30
+ index.keys.sort.each do |k|
31
+ words = index[k].keys.each_with_object({}) do |w, v|
32
+ v[sortable(w).downcase] = w
33
+ end
34
+ words.keys.localize(@lang.to_sym).sort.to_a.each do |w|
35
+ c.add_child index_entries(words, index[k], w)
36
+ end
37
+ end
38
+ index1_cleanup(docxml)
39
+ end
40
+
41
+ def index1_cleanup(docxml)
42
+ docxml.xpath(ns("//indexsect//xref")).each do |x|
43
+ x.children.remove
44
+ end
45
+ @xrefs.bookmark_anchor_names(docxml)
46
+ end
47
+
48
+ def sortable(str)
49
+ str or return " "
50
+ HTMLEntities.new.decode(Nokogiri::XML.fragment(str).text)
51
+ end
52
+
53
+ def index_entries_opt
54
+ { xref_lbl: ", ", see_lbl: ", #{see_lbl}", also_lbl: ", #{also_lbl}" }
55
+ end
56
+
57
+ def index_entries(words, index, primary)
58
+ ret = index_entries_head(words[primary],
59
+ index.dig(words[primary], nil, nil),
60
+ index_entries_opt)
61
+ words2 = index[words[primary]]&.keys&.compact
62
+ &.each_with_object({}) { |w, v| v[w.downcase] = w }
63
+ unless words2.empty?
64
+ ret += "<ul>"
65
+ words2.keys.localize(@lang.to_sym).sort.to_a.each do |w|
66
+ ret += index_entries2(words2, index[words[primary]], w)
67
+ end
68
+ ret += "</ul>"
69
+ end
70
+ "#{ret}</li>"
71
+ end
72
+
73
+ def index_entries2(words, index, secondary)
74
+ ret = index_entries_head(words[secondary],
75
+ index.dig(words[secondary], nil),
76
+ index_entries_opt)
77
+ words3 = index[words[secondary]]&.keys&.compact
78
+ &.each_with_object({}) { |w, v| v[w.downcase] = w }
79
+ unless words3.empty?
80
+ ret += "<ul>"
81
+ words3.keys.localize(@lang.to_sym).sort.to_a.each do |w|
82
+ ret += (index_entries_head(words3[w],
83
+ index[words[secondary]][words3[w]],
84
+ index_entries_opt) + "</li>")
85
+ end
86
+ ret += "</ul>"
87
+ end
88
+ "#{ret}</li>"
89
+ end
90
+
91
+ def index_entries_head(head, entries, opt)
92
+ ret = "<li>#{head}"
93
+ xref = entries&.dig(:xref)&.join(", ")
94
+ see = index_entries_see(entries, :see)
95
+ also = index_entries_see(entries, :also)
96
+ ret += "#{opt[:xref_lbl]} #{xref}" if xref
97
+ ret += "#{opt[:see_lbl]} #{see}" if see
98
+ ret += "#{opt[:also_lbl]} #{also}" if also
99
+ ret
100
+ end
101
+
102
+ def index_entries_see(entries, label)
103
+ see_sort = entries&.dig(label) or return nil
104
+ x = see_sort.each_with_object({}) do |w, v|
105
+ v[sortable(w).downcase] = w
106
+ end
107
+ x.keys.localize(@lang.to_sym).sort.to_a.map do |k|
108
+ # see_sort[k]
109
+ x[k]
110
+ end.join(", ")
111
+ end
112
+
113
+ def see_lbl
114
+ @lang == "en" ? @i18n.see : "<em>#{@i18n.see}</em>"
115
+ end
116
+
117
+ def also_lbl
118
+ @lang == "en" ? @i18n.see_also : "<em>#{@i18n.see_also}</em>"
119
+ end
120
+
121
+ def sort_indexterms(terms, see, also)
122
+ index = extract_indexterms(terms)
123
+ index = extract_indexsee(index, see, :see)
124
+ index = extract_indexsee(index, also, :also)
125
+ index.keys.sort.each_with_object({}) do |k, v|
126
+ v[sortable(k)[0].upcase.transliterate] ||= {}
127
+ v[sortable(k)[0].upcase.transliterate][k] = index[k]
128
+ end
129
+ end
130
+
131
+ def extract_indexsee(val, terms, label)
132
+ terms.each_with_object(val) do |t, v|
133
+ term, term2, term3 = extract_indexterms_init(t)
134
+ term_hash_init(v, term, term2, term3, label)
135
+ v[term][term2][term3][label] << to_xml(t.at(ns("./target"))&.children)
136
+ t.remove
137
+ end
138
+ end
139
+
140
+ def xml_encode_attr(str)
141
+ HTMLEntities.new.encode(str, :basic, :hexadecimal)
142
+ .gsub(/&#x([^;]+);/) do |_x|
143
+ "&#x#{$1.upcase};"
144
+ end
145
+ end
146
+
147
+ # attributes are decoded into UTF-8,
148
+ # elements in extract_indexsee are still in entities
149
+ def extract_indexterms(terms)
150
+ terms.each_with_object({}) do |t, v|
151
+ term, term2, term3 = extract_indexterms_init(t)
152
+ to = t["to"] ? "to='#{t['to']}' " : ""
153
+ index2bookmark(t)
154
+ term_hash_init(v, term, term2, term3, :xref)
155
+ v[term][term2][term3][:xref] << "<xref target='#{t['id']}' " \
156
+ "#{to}pagenumber='true'/>"
157
+ end
158
+ end
159
+
160
+ def extract_indexterms_init(term)
161
+ %w(primary secondary tertiary).each_with_object([]) do |x, m|
162
+ m << to_xml(term.at(ns("./#{x}"))&.children)
163
+ end
164
+ end
165
+
166
+ def term_hash_init(hash, term, term2, term3, label)
167
+ hash[term] ||= {}
168
+ hash[term][term2] ||= {}
169
+ hash[term][term2][term3] ||= {}
170
+ hash[term][term2][term3][label] ||= []
171
+ end
172
+
173
+ def index2bookmark(node)
174
+ node.name = "bookmark"
175
+ node.children.each(&:remove)
176
+ node["id"] = "_#{UUIDTools::UUID.random_create}"
177
+ node.delete("to")
178
+ end
179
+ end
180
+ end
@@ -61,6 +61,8 @@ module IsoDoc
61
61
  end
62
62
 
63
63
  def xref1(node)
64
+ # Semantic XML
65
+ node.ancestors("related, definition, termsource").empty? or return
64
66
  get_linkend(node)
65
67
  end
66
68
 
@@ -100,24 +100,27 @@ module IsoDoc
100
100
  implicit_reference(bibitem) ||
101
101
  bibitem.at(ns(".//docidentifier[@type = 'metanorma']")) ||
102
102
  bibitem.at(ns(".//docidentifier[@type = 'metanorma-ordinal']")) ||
103
+ bibitem["suppress_identifier"] == "true" ||
103
104
  bibitem["hidden"] == "true" || bibitem.parent["hidden"] == "true"
104
105
  end
105
106
 
106
107
  def bibliography_bibitem_number(docxml)
107
108
  i = 0
108
- docxml.xpath(ns("//references[@normative = 'false']/bibitem")).each do |b|
109
- i = bibliography_bibitem_number1(b, i)
109
+ docxml.xpath(ns("//references")).each do |r|
110
+ r.xpath(ns("./bibitem")).each do |b|
111
+ i = bibliography_bibitem_number1(b, i, r["normative"] == "true")
112
+ end
110
113
  end
111
114
  reference_names docxml
112
115
  bibliography_bibitem_tag(docxml)
113
116
  end
114
117
 
115
- def bibliography_bibitem_number1(bibitem, idx)
118
+ def bibliography_bibitem_number1(bibitem, idx, normative)
116
119
  ins = bibliography_bibitem_number_insert_pt(bibitem)
117
120
  mn = bibitem.at(ns(".//docidentifier[@type = 'metanorma']")) and
118
- /^\[?\d+\]?$/.match?(mn.text) and
119
- mn.remove # ignore numbers already inserted
120
- unless bibliography_bibitem_number_skip(bibitem)
121
+ /^\[?\d+\]?$/.match?(mn.text) and mn.remove # ignore numbers already inserted
122
+ if !bibliography_bibitem_number_skip(bibitem) && (!normative || mn)
123
+ # respect numeric ids in normative only if already inserted
121
124
  idx += 1
122
125
  ins.next =
123
126
  "<docidentifier type='metanorma-ordinal'>[#{idx}]</docidentifier>"
@@ -126,10 +129,10 @@ module IsoDoc
126
129
  end
127
130
 
128
131
  def bibliography_bibitem_number_insert_pt(bibitem)
132
+ bibitem.children.empty? and bibitem.add_child(" ")
129
133
  unless d = bibitem.at(ns(".//docidentifier"))
130
134
  d = bibitem.children.first
131
- d.previous = " "
132
- return d.previous
135
+ d.previous = " " and return d.previous
133
136
  end
134
137
  unless ins = d.previous_element
135
138
  d.previous = " "
@@ -150,6 +153,7 @@ module IsoDoc
150
153
  def bibliography_bibitem_tag1(ref, idx, norm)
151
154
  ref.xpath(ns("./bibitem")).each do |b|
152
155
  implicit_reference(b) and next
156
+ b["suppress_identifier"] == "true" and next
153
157
  idx += 1 unless b["hidden"]
154
158
  insert_biblio_tag(b, idx, !norm, standard?(b))
155
159
  end
@@ -29,7 +29,7 @@ module IsoDoc
29
29
  def clause1(elem)
30
30
  level = @xrefs.anchor(elem["id"], :level, false) ||
31
31
  (elem.ancestors("clause, annex").size + 1)
32
- lbl = @xrefs.anchor(elem["id"], :label, elem.parent.name != "sections")
32
+ lbl = @xrefs.anchor(elem["id"], :label, !unnumbered_clause?(elem))
33
33
  if unnumbered_clause?(elem) || !lbl
34
34
  prefix_name(elem, {}, nil, "title")
35
35
  else
@@ -49,7 +49,7 @@ module IsoDoc
49
49
  end
50
50
 
51
51
  def annex1(elem)
52
- lbl = @xrefs.anchor(elem["id"], :label)
52
+ lbl = @xrefs.anchor(elem["id"], :label, false)
53
53
  # TODO: do not alter title, alter semx/@element = title
54
54
  t = elem.at(ns("./title")) and
55
55
  t.children = "<strong>#{to_xml(t.children)}</strong>"
@@ -81,10 +81,6 @@ module IsoDoc
81
81
  end
82
82
  end
83
83
 
84
- def index(docxml)
85
- docxml.xpath(ns("//index | //index-xref | //indexsect")).each(&:remove)
86
- end
87
-
88
84
  def skip_display_order?(node)
89
85
  node.name == "floating-title"
90
86
  end
@@ -1,103 +1,25 @@
1
1
  module IsoDoc
2
2
  class PresentationXMLConvert < ::IsoDoc::Convert
3
- def designation(docxml)
4
- docxml.xpath(ns("//term")).each { |t| merge_second_preferred(t) }
5
- docxml.xpath(ns("//preferred | //admitted | //deprecates"))
6
- .each { |p| designation1(p) }
7
- docxml.xpath(ns("//deprecates")).each { |d| deprecates(d) }
8
- docxml.xpath(ns("//admitted")).each { |d| admits(d) }
9
- end
10
-
11
- def deprecates(elem)
12
- elem.add_first_child @i18n.l10n("#{@i18n.deprecated}: ")
13
- end
14
-
15
- def admits(elem); end
16
-
17
- def merge_second_preferred(term)
18
- pref = nil
19
- term.xpath(ns("./preferred[expression/name]")).each_with_index do |p, i|
20
- (i.zero? and pref = p) or merge_second_preferred1(pref, p)
21
- end
22
- end
23
-
24
- def merge_second_preferred1(pref, second)
25
- merge_preferred_eligible?(pref, second) or return
26
- n1 = pref.at(ns("./expression/name"))
27
- n2 = second.remove.at(ns("./expression/name"))
28
- n1.children = l10n("#{to_xml(n1.children)}; #{Common::to_xml(n2.children)}")
29
- end
30
-
31
- def merge_preferred_eligible?(first, second)
32
- firstex = first.at(ns("./expression")) || {}
33
- secondex = second.at(ns("./expression")) || {}
34
- first["geographic-area"] == second["geographic-area"] &&
35
- firstex["language"] == secondex["language"] &&
36
- !first.at(ns("./pronunciation | ./grammar")) &&
37
- !second.at(ns("./pronunciation | ./grammar"))
38
- end
39
-
40
- def designation1(desgn)
41
- s = desgn.at(ns("./termsource"))
42
- name = desgn.at(ns("./expression/name | ./letter-symbol/name | " \
43
- "./graphical-symbol")) or return
44
- designation_annotate(desgn, name)
45
- s and desgn.next = s
46
- end
47
-
48
- def designation_annotate(desgn, name)
49
- designation_boldface(desgn)
50
- designation_field(desgn, name)
51
- g = desgn.at(ns("./expression/grammar")) and
52
- name << ", #{designation_grammar(g).join(', ')}"
53
- designation_localization(desgn, name)
54
- designation_pronunciation(desgn, name)
55
- designation_bookmarks(desgn, name)
56
- desgn.children = name.children
57
- end
58
-
59
- def designation_boldface(desgn)
60
- desgn.name == "preferred" or return
61
- name = desgn.at(ns("./expression/name | ./letter-symbol/name")) or return
62
- name.children = "<strong>#{name.children}</strong>"
63
- end
64
-
65
- def designation_field(desgn, name)
66
- f = desgn.xpath(ns("./field-of-application | ./usage-info"))
67
- &.map { |u| to_xml(u.children) }&.join(", ")
68
- f&.empty? and return nil
69
- name << ", &#x3c;#{f}&#x3e;"
70
- end
71
-
72
- def designation_grammar(grammar)
73
- ret = []
74
- grammar.xpath(ns("./gender | ./number")).each do |x|
75
- ret << @i18n.grammar_abbrevs[x.text]
3
+ def termcontainers(docxml)
4
+ docxml.xpath(ns("//term")).each do |t|
5
+ %w(preferred admitted deprecates related definition termsource)
6
+ .each do |w|
7
+ d = t.at(ns("./#{w}[last()]")) and d.after("<fmt-#{w}/>")
8
+ end
76
9
  end
77
- %w(isPreposition isParticiple isAdjective isVerb isAdverb isNoun)
78
- .each do |x|
79
- grammar.at(ns("./#{x}[text() = 'true']")) and
80
- ret << @i18n.grammar_abbrevs[x]
10
+ docxml.xpath(ns("//termsource")).each do |s|
11
+ s["id"] ||= "_#{UUIDTools::UUID.random_create}"
81
12
  end
82
- ret
83
13
  end
84
14
 
85
- def designation_localization(desgn, name)
86
- loc = [desgn&.at(ns("./expression/@language"))&.text,
87
- desgn&.at(ns("./expression/@script"))&.text,
88
- desgn&.at(ns("./@geographic-area"))&.text].compact
89
- loc.empty? and return
90
- name << ", #{loc.join(' ')}"
91
- end
92
-
93
- def designation_pronunciation(desgn, name)
94
- f = desgn.at(ns("./expression/pronunciation")) or return
95
- name << ", /#{to_xml(f.children)}/"
96
- end
97
-
98
- def designation_bookmarks(desgn, name)
99
- desgn.xpath(ns(".//bookmark")).each do |b|
100
- name << b.remove
15
+ def termcleanup(docxml)
16
+ docxml.xpath(ns("//term")).each do |t|
17
+ %w(preferred admitted deprecates related definition termsource)
18
+ .each do |w|
19
+ t.xpath(ns("./#{w}//fmt-name | ./#{w}//fmt-xref-label")).each(&:remove)
20
+ f = t.at(ns(".//fmt-#{w}"))
21
+ f&.children&.empty? and f.remove
22
+ end
101
23
  end
102
24
  end
103
25
 
@@ -123,29 +45,32 @@ module IsoDoc
123
45
  end
124
46
 
125
47
  def termdefinition(docxml)
126
- docxml.xpath(ns("//term[definition]")).each do |f|
127
- termdefinition1(f)
128
- end
48
+ docxml.xpath(ns("//term[definition]")).each { |f| termdefinition1(f) }
129
49
  end
130
50
 
131
51
  def termdefinition1(elem)
132
- unwrap_definition(elem)
133
- multidef(elem) if elem.xpath(ns("./definition")).size > 1
134
- termdomain(elem)
52
+ d = elem.xpath(ns("./definition"))
53
+ d1 = elem.at(ns("./fmt-definition"))
54
+ if d.size > 1 then multidef(elem, d, d1)
55
+ else singledef(elem, d, d1)
56
+ end
57
+ unwrap_definition(elem, d1)
58
+ termdomain(elem, d1)
135
59
  end
136
60
 
137
- def multidef(elem)
138
- d = elem.at(ns("./definition"))
139
- d = d.replace("<ol><li>#{to_xml(d.children)}</li></ol>").first
140
- elem.xpath(ns("./definition")).each do |f|
141
- f = f.replace("<li>#{to_xml(f.children)}</li>").first
142
- d << f
61
+ def multidef(_elem, defn, fmt_defn)
62
+ ret = defn.each_with_object([]) do |f, m|
63
+ m << "<li>#{to_xml(semx_fmt_dup(f))}</li>"
143
64
  end
144
- d.wrap("<definition></definition>")
65
+ fmt_defn << "<ol>#{ret.join("\n")}</ol>"
145
66
  end
146
67
 
147
- def unwrap_definition(elem)
148
- elem.xpath(ns("./definition")).each do |d|
68
+ def singledef(_elem, defn, fmt_defn)
69
+ fmt_defn << semx_fmt_dup(defn.first)
70
+ end
71
+
72
+ def unwrap_definition(_elem, fmt_defn)
73
+ fmt_defn.xpath(ns(".//semx[@element = 'definition']")).each do |d|
149
74
  %w(verbal-definition non-verbal-representation).each do |e|
150
75
  v = d&.at(ns("./#{e}"))
151
76
  v&.replace(v.children)
@@ -153,26 +78,62 @@ module IsoDoc
153
78
  end
154
79
  end
155
80
 
156
- def termdomain(elem)
81
+ def termdomain(elem, fmt_defn)
157
82
  d = elem.at(ns(".//domain")) or return
158
- p = elem.at(ns(".//definition//p")) or return
159
- p.add_first_child "&lt;#{d.to_xml}&gt; "
160
- d["hidden"] = true
83
+ p = fmt_defn.at(ns(".//p")) or return
84
+ d1 = semx_fmt_dup(d)
85
+ p.add_first_child "&lt;#{to_xml(d1)}&gt; "
161
86
  end
162
87
 
163
88
  def termsource(docxml)
164
- docxml.xpath(ns("//termsource")).each { |f| termsource_modification(f) }
165
- docxml.xpath(ns("//termsource")).each { |f| termsource1(f) }
89
+ copy_baselevel_termsource(docxml)
90
+ # TODO should I wrap fmt-definition//termsource in fmt-termsource, in order to preserve termsource attributes?
91
+ docxml.xpath(ns("//fmt-termsource/termsource | //fmt-definition//termsource | //fmt-preferred//termsource | //fmt-admitted//termsource | //fmt-deprecates//termsource"))
92
+ .each do |f|
93
+ termsource_modification(f)
94
+ end
95
+ docxml.xpath(ns("//fmt-preferred//fmt-termsource | //fmt-admitted//fmt-termsource | //fmt-deprecates//fmt-termsource"))
96
+ .each do |f|
97
+ termsource_designation(f)
98
+ end
99
+ docxml.xpath(ns("//fmt-termsource/termsource | //fmt-definition//termsource | //fmt-preferred//termsource | //fmt-admitted//termsource | //fmt-deprecates//termsource"))
100
+ .each do |f|
101
+ f.parent and termsource1(f)
102
+ end
103
+ end
104
+
105
+ def termsource_designation(fmtsource)
106
+ p = fmtsource.previous_element
107
+ p&.name == "p" or return
108
+ p << " "
109
+ p << fmtsource.children
110
+ end
111
+
112
+ def copy_baselevel_termsource(docxml)
113
+ docxml.xpath(ns("//term[termsource]")).each do |x|
114
+ s = x.xpath(ns("./termsource"))
115
+ s1 = x.at(ns("./fmt-termsource"))
116
+ s.each { |ss| s1 << ss.clone }
117
+ strip_duplicate_ids(nil, s, s1)
118
+ %w(status type).each { |a| s[0][a] and s1[a] = s[0][a] }
119
+ end
166
120
  end
167
121
 
168
122
  def termsource1(elem)
123
+ ret = [semx_fmt_dup(elem)]
169
124
  while elem&.next_element&.name == "termsource"
170
- elem << "; #{to_xml(elem.next_element.remove.children)}"
125
+ ret << semx_fmt_dup(elem.next_element.remove)
171
126
  end
172
- elem.children = l10n("[#{@i18n.source}: #{to_xml(elem.children).strip}]")
127
+ s = ret.map { |x| to_xml(x) }.map(&:strip).join("; ")
128
+ termsource_label(elem, s)
129
+ end
130
+
131
+ def termsource_label(elem, sources)
132
+ elem.replace(l10n("[#{@i18n.source}: #{sources}]"))
173
133
  end
174
134
 
175
135
  def termsource_modification(elem)
136
+ elem.xpath(".//text()[normalize-space() = '']").each(&:remove)
176
137
  origin = elem.at(ns("./origin"))
177
138
  s = termsource_status(elem["status"]) and origin.next = l10n(", #{s}")
178
139
  termsource_add_modification_text(elem.at(ns("./modification")))
@@ -180,10 +141,13 @@ module IsoDoc
180
141
 
181
142
  def termsource_add_modification_text(mod)
182
143
  mod or return
183
- mod.text.strip.empty? or mod.previous = " &#x2014; "
184
- mod.elements.size == 1 and
185
- mod.elements[0].replace(mod.elements[0].children)
186
- mod.replace(mod.children)
144
+ if mod.text.strip.empty?
145
+ mod.remove
146
+ return
147
+ end
148
+ mod.previous = " &#x2014; "
149
+ mod.elements.size == 1 and mod.children = to_xml(mod.elements[0].children)
150
+ mod.replace(semx_fmt_dup(mod))
187
151
  end
188
152
 
189
153
  def termsource_status(status)
@@ -21,7 +21,7 @@ module IsoDoc
21
21
  node["style"] == "id" and
22
22
  return anchor_id_postproc(node)
23
23
  node["citeas"].nil? && node["bibitemid"] and
24
- return @xrefs.anchor(node["bibitemid"], :xref) || "???"
24
+ return citeas_cleanup(@xrefs.anchor(node["bibitemid"], :xref)) || "???"
25
25
  node.at(ns("./location")) and
26
26
  return combine_xref_locations(node) || "???"
27
27
  node["target"] && node["droploc"] and
@@ -7,6 +7,7 @@ require_relative "presentation_function/erefs"
7
7
  require_relative "presentation_function/inline"
8
8
  require_relative "presentation_function/math"
9
9
  require_relative "presentation_function/section"
10
+ require_relative "presentation_function/index"
10
11
  require_relative "presentation_function/bibdata"
11
12
  require_relative "presentation_function/metadata"
12
13
 
@@ -107,6 +108,7 @@ module IsoDoc
107
108
  end
108
109
 
109
110
  def terms(docxml)
111
+ termcontainers docxml
110
112
  termexample docxml
111
113
  termnote docxml
112
114
  termdefinition docxml
@@ -114,6 +116,7 @@ module IsoDoc
114
116
  termsource docxml
115
117
  concept docxml
116
118
  related docxml
119
+ termcleanup docxml
117
120
  end
118
121
 
119
122
  def semantic_xml_insert(xml)
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "2.12.6".freeze
2
+ VERSION = "2.12.8".freeze
3
3
  end
@@ -15,6 +15,9 @@ termsdefsymbols: المصطلحات والتعريفات والرموز
15
15
  termsdefabbrev: المصطلحات والتعريفات والاختصارات
16
16
  normref: المراجع المعيارية
17
17
  bibliography: بيبليوغرافيا
18
+ index: الفهرس
19
+ see: انظر
20
+ see_also: انظر أيضًا
18
21
  clause: فقرة
19
22
  annex: ملحق
20
23
  appendix: تذييل
@@ -15,6 +15,9 @@ termsdefsymbols: Begriffe, Definitionen und Symbole
15
15
  termsdefabbrev: Begriffe, Definitionen und abgekürzte Begriffe
16
16
  normref: Normative Verweise
17
17
  bibliography: Bibliographie
18
+ index: Index
19
+ see: schau
20
+ see_also: siehe auch
18
21
  clause: Klausel
19
22
  annex: Anhang
20
23
  appendix: Appendix
@@ -14,6 +14,9 @@ termsdefsymbols: Terms, definitions and symbols
14
14
  termsdefabbrev: Terms, definitions and abbreviated terms
15
15
  normref: Normative references
16
16
  bibliography: Bibliography
17
+ index: Index
18
+ see: see
19
+ see_also: see also
17
20
  preface: Preface
18
21
  section: Section
19
22
  clause: Clause
@@ -14,6 +14,9 @@ termsdefsymbols: Términos, definiciones y símbolos
14
14
  termsdefabbrev: Términos, definiciones y términos abreviados
15
15
  normref: Referencias normativas
16
16
  bibliography: Bibliografía
17
+ index: Índice
18
+ see: ver
19
+ see_also: ver también
17
20
  section: Sección
18
21
  clause: Cláusula
19
22
  annex: Anexo
@@ -14,6 +14,9 @@ termsdefsymbols: Termes, définitions et symboles
14
14
  termsdefabbrev: Termes, définitions et termes abrégés
15
15
  normref: Références normatives
16
16
  bibliography: Bibliographie
17
+ index: Index
18
+ see: voir
19
+ see_also: voir aussi
17
20
  preface: Préface
18
21
  section: Section
19
22
  clause: Article
@@ -14,6 +14,9 @@ termsdefsymbols: 用語及び定義並びに記号
14
14
  termsdefabbrev: 用語及び定義並びに略語
15
15
  normref: 引用規格
16
16
  bibliography: 参考文献
17
+ index: 索引
18
+ see: 参照
19
+ see_also: 追加参照
17
20
  preface: 序文
18
21
  section: セクション
19
22
  clause: 箇条
@@ -14,6 +14,9 @@ termsdefsymbols: Термины, определения и символы
14
14
  termsdefabbrev: Термины, определения и сокращенные термины
15
15
  normref: Нормативные ссылки
16
16
  bibliography: Библиография
17
+ index: Алфавитный указатель
18
+ see: см.
19
+ see_also: см. также
17
20
  section: Раздел
18
21
  clause: Пункт
19
22
  annex: Дополнение
@@ -14,6 +14,9 @@ termsdefsymbols: 术语、定义、符号和代号
14
14
  termsdefabbrev: 术语、定义、符号和缩略语
15
15
  normref: 规范性引用文件
16
16
  bibliography: 参考文献
17
+ index: 索引
18
+ see: 见
19
+ see_also: 另见
17
20
  preface: 序言
18
21
  section: 条
19
22
  clause: 条
@@ -1,4 +1,4 @@
1
1
  template:
2
2
  # skip authoritative identifier, it is inserted in front of formattedref within metanorma
3
- standard: "{% if creatornames %}{{ creatornames }} ({{ role}}){%else%}{{publisher}}{%endif%} . <em>{{ title }}</em> . {{ labels['in'] | capitalize }}:_{{ series_title }}. {{ medium | capitalize }}. {{ edition | capitalize_first }}. {{date}}. {{place}}: {%if creatornames %}{{publisher}}{% endif %} . {{size}}. {{ extent }}. {{ uri }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
3
+ standard: "{% if creatornames %}{{ creatornames }} ({{ role}}){%else%}{{publisher}}{%endif%} . <em>{{ title }}</em> . {{ medium | capitalize }}. {{ edition | capitalize_first }}. {{date}}. {{place}}: {%if creatornames %}{{publisher}}{% endif %} . {{size}}. {{ extent }}. {{ uri }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
4
4
 
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.12.6
4
+ version: 2.12.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-11 00:00:00.000000000 Z
11
+ date: 2025-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '2.08'
61
+ version: '2.13'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '2.08'
68
+ version: '2.13'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: mn-requirements
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.8.0
89
+ version: 0.9.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.8.0
96
+ version: 0.9.0
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: roman-numerals
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -439,6 +439,7 @@ files:
439
439
  - lib/isodoc/presentation_function/docid.rb
440
440
  - lib/isodoc/presentation_function/erefs.rb
441
441
  - lib/isodoc/presentation_function/image.rb
442
+ - lib/isodoc/presentation_function/index.rb
442
443
  - lib/isodoc/presentation_function/inline.rb
443
444
  - lib/isodoc/presentation_function/math.rb
444
445
  - lib/isodoc/presentation_function/metadata.rb
@@ -485,7 +486,7 @@ homepage: https://github.com/metanorma/isodoc
485
486
  licenses:
486
487
  - BSD-2-Clause
487
488
  metadata: {}
488
- post_install_message:
489
+ post_install_message:
489
490
  rdoc_options: []
490
491
  require_paths:
491
492
  - lib
@@ -501,7 +502,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
501
502
  version: '0'
502
503
  requirements: []
503
504
  rubygems_version: 3.3.27
504
- signing_key:
505
+ signing_key:
505
506
  specification_version: 4
506
507
  summary: Convert documents in IsoDoc into Word and HTML in AsciiDoc.
507
508
  test_files: []