isodoc 1.7.6 → 1.8.1

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/isodoc.gemspec +1 -1
  3. data/lib/isodoc/class_utils.rb +23 -0
  4. data/lib/isodoc/convert.rb +9 -0
  5. data/lib/isodoc/function/cleanup.rb +4 -0
  6. data/lib/isodoc/function/inline.rb +2 -4
  7. data/lib/isodoc/function/utils.rb +1 -1
  8. data/lib/isodoc/html_function/html.rb +1 -0
  9. data/lib/isodoc/html_function/postprocess.rb +4 -6
  10. data/lib/isodoc/metadata_date.rb +13 -11
  11. data/lib/isodoc/presentation_function/bibdata.rb +2 -2
  12. data/lib/isodoc/presentation_function/block.rb +0 -36
  13. data/lib/isodoc/presentation_function/inline.rb +14 -11
  14. data/lib/isodoc/presentation_function/terms.rb +179 -0
  15. data/lib/isodoc/presentation_xml_convert.rb +11 -4
  16. data/lib/isodoc/version.rb +1 -1
  17. data/lib/isodoc/word_function/body.rb +24 -14
  18. data/lib/isodoc/word_function/comments.rb +0 -4
  19. data/lib/isodoc/word_function/postprocess.rb +184 -176
  20. data/lib/isodoc/xref/xref_gen.rb +18 -22
  21. data/lib/isodoc/xref/xref_gen_seq.rb +10 -16
  22. data/lib/isodoc/xref/xref_sect_gen.rb +134 -129
  23. data/lib/isodoc/xslfo_convert.rb +11 -7
  24. data/lib/isodoc-yaml/i18n-ar.yaml +22 -0
  25. data/lib/isodoc-yaml/i18n-de.yaml +20 -0
  26. data/lib/isodoc-yaml/i18n-en.yaml +20 -0
  27. data/lib/isodoc-yaml/i18n-es.yaml +20 -0
  28. data/lib/isodoc-yaml/i18n-fr.yaml +20 -0
  29. data/lib/isodoc-yaml/i18n-ru.yaml +21 -1
  30. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +21 -0
  31. data/lib/metanorma/output/xslfo.rb +4 -11
  32. data/spec/assets/i18n.yaml +3 -1
  33. data/spec/isodoc/blocks_spec.rb +14 -8
  34. data/spec/isodoc/i18n_spec.rb +8 -8
  35. data/spec/isodoc/inline_spec.rb +200 -6
  36. data/spec/isodoc/lists_spec.rb +344 -222
  37. data/spec/isodoc/section_spec.rb +11 -10
  38. data/spec/isodoc/table_spec.rb +71 -73
  39. data/spec/isodoc/terms_spec.rb +354 -34
  40. data/spec/isodoc/xref_numbering_spec.rb +347 -0
  41. data/spec/isodoc/xref_spec.rb +271 -350
  42. data/spec/isodoc/xslfo_convert_spec.rb +34 -9
  43. metadata +7 -6
  44. data/lib/isodoc/presentation_function/concept.rb +0 -68
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bf6b7672b0923b4266fb04a8badd638b3838ede377e1b712f8d30e4c1aa6061f
4
- data.tar.gz: 90c92ce493296887b9215384762a5a19bee7d5c2d275bab6f696b06593b60fa3
3
+ metadata.gz: ec504b3b905ec960bef74398b3789ab5b7eb248dc05a7c3f64590db77d31cac6
4
+ data.tar.gz: c2de4c1589a7ff282715f4930a1851393358a64fd407c5a1e3bda02beddc0782
5
5
  SHA512:
6
- metadata.gz: 1f102fb8d85bce4966bd70cac156c3f27c9308e00619993f79b0d9a32f168c03a25cc2c9860782e370654c70a9288760ddaaff60e75dad280ad992bf0bfbea24
7
- data.tar.gz: 4d8f3b39550d2ff82a63a58ff9a549a7dc349fe2c294c2736ae5c88251db187ce8a8223ea47a939f1c4aa9e39a9109bc6aacca0b66629a69d3eeabf0613e13c9
6
+ metadata.gz: 34a1c43f6f34f90aa326ed7ff50ede791eadaf22c05ebf0f4183fb2cb3c708bd4f0512572b638a94e236b807f5a873986c24579fe126eb88ad15ef1e178c64d2
7
+ data.tar.gz: 23fbe4f295729ad565ab787903e9c4b49388671766b91477dc3d26302b8499da892f77d6e034ce4f6cc4ba1b0956c8dbb051e94a3a336acdb661d1e6d30e584b
data/isodoc.gemspec CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
30
30
 
31
31
  spec.add_dependency "asciimath"
32
- spec.add_dependency "html2doc", "~> 1.1.1"
32
+ spec.add_dependency "html2doc", "~> 1.2.0"
33
33
  spec.add_dependency "htmlentities", "~> 4.3.4"
34
34
  spec.add_dependency "liquid", "~> 4"
35
35
  # spec.add_dependency "metanorma", ">= 1.2.0"
@@ -27,5 +27,28 @@ module IsoDoc
27
27
  end.join
28
28
  Liquid::Template.parse(doc)
29
29
  end
30
+
31
+ def case_strict(text, casing, script)
32
+ return text unless %w(Latn Cyrl Grek Armn).include?(script)
33
+
34
+ letters = text.chars
35
+ case casing
36
+ when "capital" then letters.first.upcase!
37
+ when "lowercase" then letters.first.downcase!
38
+ end
39
+ letters.join
40
+ end
41
+
42
+ def case_with_markup(linkend, casing, script)
43
+ seen = false
44
+ xml = Nokogiri::XML("<root>#{linkend}</root>")
45
+ xml.traverse do |b|
46
+ next unless b.text? && !seen
47
+
48
+ b.replace(Common::case_strict(b.text, casing, script))
49
+ seen = true
50
+ end
51
+ xml.root.children.to_xml
52
+ end
30
53
  end
31
54
  end
@@ -102,6 +102,7 @@ module IsoDoc
102
102
  @bookmarks_allocated = { "X" => true }
103
103
  @fn_bookmarks = {}
104
104
  @baseassetpath = options[:baseassetpath]
105
+ @aligncrosselements = options[:aligncrosselements]
105
106
  end
106
107
 
107
108
  def tmpimagedir_suffix
@@ -118,6 +119,7 @@ module IsoDoc
118
119
 
119
120
  def convert1(docxml, filename, dir)
120
121
  @xrefs.parse docxml
122
+ bibitem_lookup(docxml)
121
123
  noko do |xml|
122
124
  xml.html **{ lang: @lang.to_s } do |html|
123
125
  html.parent.add_namespace("epub", "http://www.idpf.org/2007/ops")
@@ -129,6 +131,13 @@ module IsoDoc
129
131
  end.join("\n")
130
132
  end
131
133
 
134
+ def bibitem_lookup(docxml)
135
+ @bibitems = docxml.xpath(ns("//references/bibitem"))
136
+ .each_with_object({}) do |b, m|
137
+ m[b["id"]] = b
138
+ end
139
+ end
140
+
132
141
  def metadata_init(lang, script, i18n)
133
142
  @meta = Metadata.new(lang, script, i18n)
134
143
  end
@@ -165,6 +165,10 @@ module IsoDoc
165
165
  t << a.remove
166
166
  end
167
167
  end
168
+ table_footnote_cleanup_propagate(docxml)
169
+ end
170
+
171
+ def table_footnote_cleanup_propagate(docxml)
168
172
  docxml.xpath("//p[not(self::*[@class])]"\
169
173
  "[ancestor::*[@class = 'TableFootnote']]").each do |p|
170
174
  p["class"] = "TableFootnote"
@@ -41,10 +41,8 @@ module IsoDoc
41
41
  end
42
42
 
43
43
  def eref_target(node)
44
- href = "##{node['bibitemid']}"
45
- url = node.at(ns("//bibitem[@id = '#{node['bibitemid']}']/"\
46
- "uri[@type = 'citation']"))
47
- return href unless url
44
+ return "##{node['bibitemid']}" unless url = @bibitems[node["bibitemid"]]
45
+ &.at(ns("./uri[@type = 'citation']"))
48
46
 
49
47
  href = suffix_url(url.text)
50
48
  anchor = node&.at(ns(".//locality[@type = 'anchor']"))&.text&.strip
@@ -211,7 +211,7 @@ module IsoDoc
211
211
  c = HTMLEntities.new
212
212
  text.split(/([<>])/).each_slice(4).map do |a|
213
213
  a[0] = c.encode(c.decode(a[0]), :hexadecimal)
214
- a[1] = c.encode(c.decode(a[1]), :hexadecimal)
214
+ a[2] = c.encode(c.decode(a[2]), :hexadecimal) if a.size >= 3
215
215
  a
216
216
  end.join
217
217
  end
@@ -5,6 +5,7 @@ module IsoDoc
5
5
  module HtmlFunction
6
6
  module Html
7
7
  def convert1(docxml, filename, dir)
8
+ bibitem_lookup(docxml)
8
9
  noko do |xml|
9
10
  xml.html **{ lang: @lang.to_s } do |html|
10
11
  info docxml, nil
@@ -1,5 +1,6 @@
1
1
  require "isodoc/html_function/mathvariant_to_plain"
2
2
  require_relative "postprocess_footnotes"
3
+ require "metanorma-utils"
3
4
 
4
5
  module IsoDoc
5
6
  module HtmlFunction
@@ -74,7 +75,8 @@ module IsoDoc
74
75
  head = docxml.at("//*[local-name() = 'head']")
75
76
  head << htmlstylesheet(@htmlstylesheet)
76
77
  s = htmlstylesheet(@htmlstylesheet_override) and head << s
77
- @bare and head << "<style>body {margin-left: 2em; margin-right: 2em;}</style>"
78
+ @bare and
79
+ head << "<style>body {margin-left: 2em; margin-right: 2em;}</style>"
78
80
  docxml
79
81
  end
80
82
 
@@ -167,11 +169,7 @@ module IsoDoc
167
169
  end
168
170
 
169
171
  def datauri(img)
170
- type = img["src"].split(".")[-1]
171
- supertype = type == "xml" ? "application" : "image"
172
- bin = IO.binread(image_localfile(img))
173
- data = Base64.strict_encode64(bin)
174
- img["src"] = "data:#{supertype}/#{type};base64,#{data}"
172
+ img["src"] = Metanorma::Utils::datauri(img["src"], @localdir)
175
173
  end
176
174
 
177
175
  def image_suffix(img)
@@ -6,7 +6,7 @@ module IsoDoc
6
6
  vote-ended}.freeze
7
7
 
8
8
  def months
9
- {
9
+ {
10
10
  "01": @labels["month_january"],
11
11
  "02": @labels["month_february"],
12
12
  "03": @labels["month_march"],
@@ -19,30 +19,32 @@ module IsoDoc
19
19
  "10": @labels["month_october"],
20
20
  "11": @labels["month_november"],
21
21
  "12": @labels["month_december"],
22
- }
22
+ }
23
23
  end
24
24
 
25
25
  def monthyr(isodate)
26
26
  m = /(?<yr>\d\d\d\d)-(?<mo>\d\d)/.match isodate
27
27
  return isodate unless m && m[:yr] && m[:mo]
28
+
28
29
  l10n("#{months[m[:mo].to_sym]} #{m[:yr]}",
29
- @lang, @script)
30
+ @lang, @script)
30
31
  end
31
32
 
32
33
  def MMMddyyyy(isodate)
33
34
  return nil if isodate.nil?
35
+
34
36
  arr = isodate.split("-")
35
- date = if arr.size == 1 and (/^\d+$/.match isodate)
36
- Date.new(*arr.map(&:to_i)).strftime("%Y")
37
- elsif arr.size == 2
38
- Date.new(*arr.map(&:to_i)).strftime("%B %Y")
39
- else
40
- Date.parse(isodate).strftime("%B %d, %Y")
41
- end
37
+ if arr.size == 1 && (/^\d+$/.match isodate)
38
+ Date.new(*arr.map(&:to_i)).strftime("%Y")
39
+ elsif arr.size == 2
40
+ Date.new(*arr.map(&:to_i)).strftime("%B %Y")
41
+ else
42
+ Date.parse(isodate).strftime("%B %d, %Y")
43
+ end
42
44
  end
43
45
 
44
46
  def bibdate(isoxml, _out)
45
- isoxml.xpath(ns('//bibdata/date')).each do |d|
47
+ isoxml.xpath(ns("//bibdata/date")).each do |d|
46
48
  set("#{d['type'].gsub(/-/, '_')}date".to_sym, Common::date_range(d))
47
49
  end
48
50
  end
@@ -10,7 +10,7 @@ module IsoDoc
10
10
  "</localized-strings>"
11
11
  end
12
12
 
13
- def docid_prefixes(docxml)
13
+ def docid_prefixes(docxml)
14
14
  docxml.xpath(ns("//references/bibitem/docidentifier")).each do |i|
15
15
  i.children = @xrefs.klass.docid_prefix(i["type"], i.text)
16
16
  end
@@ -97,7 +97,7 @@ module IsoDoc
97
97
 
98
98
  # https://stackoverflow.com/a/31822406
99
99
  def blank?(elem)
100
- elem.nil? || elem.respond_to?(:empty?) && elem.empty?
100
+ elem.nil? || (elem.respond_to?(:empty?) && elem.empty?)
101
101
  end
102
102
 
103
103
  def trim_hash(hash)
@@ -54,12 +54,6 @@ module IsoDoc
54
54
  end
55
55
  end
56
56
 
57
- def termexample(docxml)
58
- docxml.xpath(ns("//termexample")).each do |f|
59
- example1(f)
60
- end
61
- end
62
-
63
57
  def example1(elem)
64
58
  n = @xrefs.get[elem["id"]]
65
59
  lbl = if n.nil? || n[:label].nil? || n[:label].empty?
@@ -89,36 +83,6 @@ module IsoDoc
89
83
  prefix_name(elem, "", lbl, "name")
90
84
  end
91
85
 
92
- def termnote(docxml)
93
- docxml.xpath(ns("//termnote")).each do |f|
94
- termnote1(f)
95
- end
96
- end
97
-
98
- # introduce name element
99
- def termnote1(elem)
100
- lbl = l10n(@xrefs.anchor(elem["id"], :label) || "???")
101
- prefix_name(elem, "", lower2cap(lbl), "name")
102
- end
103
-
104
- def termdefinition(docxml)
105
- docxml.xpath(ns("//term[definition]")).each do |f|
106
- termdefinition1(f)
107
- end
108
- end
109
-
110
- def termdefinition1(elem)
111
- return unless elem.xpath(ns("./definition")).size > 1
112
-
113
- d = elem.at(ns("./definition"))
114
- d = d.replace("<ol><li>#{d.children.to_xml}</li></ol>").first
115
- elem.xpath(ns("./definition")).each do |f|
116
- f = f.replace("<li>#{f.children.to_xml}</li>").first
117
- d << f
118
- end
119
- d.wrap("<definition></definition>")
120
- end
121
-
122
86
  def recommendation(docxml)
123
87
  docxml.xpath(ns("//recommendation")).each do |f|
124
88
  recommendation1(f, lower2cap(@i18n.recommendation))
@@ -1,5 +1,4 @@
1
1
  require "metanorma-utils"
2
- require_relative "./concept"
3
2
 
4
3
  module IsoDoc
5
4
  class PresentationXMLConvert < ::IsoDoc::Convert
@@ -7,13 +6,16 @@ module IsoDoc
7
6
  l10n("#{@xrefs.anchor(container, :xref)}, #{linkend}")
8
7
  end
9
8
 
9
+ def anchor_value(id)
10
+ @xrefs.anchor(id, :value) || @xrefs.anchor(id, :label) ||
11
+ @xrefs.anchor(id, :xref)
12
+ end
13
+
10
14
  def anchor_linkend(node, linkend)
11
15
  if node["citeas"].nil? && node["bibitemid"]
12
16
  return @xrefs.anchor(node["bibitemid"], :xref) || "???"
13
17
  elsif node["target"] && node["droploc"]
14
- return @xrefs.anchor(node["target"], :value) ||
15
- @xrefs.anchor(node["target"], :label) ||
16
- @xrefs.anchor(node["target"], :xref) || "???"
18
+ return anchor_value(node["target"]) || "???"
17
19
  elsif node["target"] && !/.#./.match(node["target"])
18
20
  linkend = anchor_linkend1(node)
19
21
  end
@@ -27,14 +29,15 @@ module IsoDoc
27
29
  (container && get_note_container_id(node) != container &&
28
30
  @xrefs.get[node["target"]]) and
29
31
  linkend = prefix_container(container, linkend, node["target"])
30
- capitalise_xref(node, linkend)
32
+ capitalise_xref(node, linkend, anchor_value(node["target"]))
31
33
  end
32
34
 
33
- def capitalise_xref(node, linkend)
34
- return linkend unless %w(Latn Cyrl Grek).include? @script
35
- return linkend&.capitalize if node["case"] == "capital"
36
- return linkend&.downcase if node["case"] == "lowercase"
37
- return linkend if linkend[0, 1].match?(/\p{Upper}/)
35
+ def capitalise_xref(node, linkend, label)
36
+ linktext = linkend.gsub(/<[^>]+>/, "")
37
+ (label && !label.empty? && /^#{Regexp.escape(label)}/.match?(linktext)) ||
38
+ linktext[0, 1].match?(/\p{Upper}/) and return linkend
39
+ node["case"] and
40
+ return Common::case_with_markup(linkend, node["case"], @script)
38
41
 
39
42
  capitalise_xref1(node, linkend)
40
43
  end
@@ -43,7 +46,7 @@ module IsoDoc
43
46
  prec = nearest_block_parent(node).xpath("./descendant-or-self::text()") &
44
47
  node.xpath("./preceding::text()")
45
48
  if prec.empty? || /(?!<[^.].)\.\s+$/.match(prec.map(&:text).join)
46
- linkend&.capitalize
49
+ Common::case_with_markup(linkend, "capital", @script)
47
50
  else linkend
48
51
  end
49
52
  end
@@ -0,0 +1,179 @@
1
+ module IsoDoc
2
+ class PresentationXMLConvert < ::IsoDoc::Convert
3
+ def concept(docxml)
4
+ docxml.xpath(ns("//concept")).each { |f| concept1(f) }
5
+ end
6
+
7
+ def concept1(node)
8
+ xref = node&.at(ns("./xref/@target"))&.text or
9
+ return concept_render(node, ital: node["ital"] || "true",
10
+ ref: node["ref"] || "true",
11
+ linkref: node["linkref"] || "true",
12
+ linkmention: node["linkmention"] || "false")
13
+ if node.at(ns("//definitions//dt[@id = '#{xref}']"))
14
+ concept_render(node, ital: node["ital"] || "false",
15
+ ref: node["ref"] || "false",
16
+ linkref: node["linkref"] || "true",
17
+ linkmention: node["linkmention"] || "false")
18
+ else concept_render(node, ital: node["ital"] || "true",
19
+ ref: node["ref"] || "true",
20
+ linkref: node["linkref"] || "true",
21
+ linkmention: node["linkmention"] || "false")
22
+ end
23
+ end
24
+
25
+ def concept_render(node, opts)
26
+ node&.at(ns("./refterm"))&.remove
27
+ r = node.at(ns("./renderterm"))
28
+ ref = node.at(ns("./xref | ./eref | ./termref"))
29
+ ref && opts[:ref] != "false" and r&.next = " "
30
+ opts[:ital] == "true" and r&.name = "em"
31
+ if opts[:linkmention] == "true" && !r.nil? && !ref.nil?
32
+ ref2 = ref.clone
33
+ r2 = r.clone
34
+ r.replace(ref2).children = r2
35
+ end
36
+ concept1_ref(node, ref, opts)
37
+ if opts[:ital] == "false"
38
+ r = node.at(ns(".//renderterm"))
39
+ r&.replace(r&.children)
40
+ end
41
+ node.replace(node.children)
42
+ end
43
+
44
+ def concept1_ref(_node, ref, opts)
45
+ ref.nil? and return
46
+ return ref.remove if opts[:ref] == "false"
47
+
48
+ r = concept1_ref_content(ref)
49
+ ref = r.at("./descendant-or-self::xmlns:xref | "\
50
+ "./descendant-or-self::xmlns:eref | "\
51
+ "./descendant-or-self::xmlns:termref")
52
+ %w(xref eref).include? ref&.name and get_linkend(ref)
53
+ if opts[:linkref] == "false" && %w(xref eref).include?(ref&.name)
54
+ ref.replace(ref.children)
55
+ end
56
+ end
57
+
58
+ def concept1_ref_content(ref)
59
+ if non_locality_elems(ref).select do |c|
60
+ !c.text? || /\S/.match(c)
61
+ end.empty?
62
+ ref.replace(@i18n.term_defined_in.sub(/%/,
63
+ ref.to_xml))
64
+ else ref.replace("[#{ref.to_xml}]")
65
+ end
66
+ end
67
+
68
+ def related(docxml)
69
+ docxml.xpath(ns("//related")).each { |f| related1(f) }
70
+ end
71
+
72
+ def related1(node)
73
+ p = node.at(ns("./preferred"))
74
+ ref = node.at(ns("./xref | ./eref | ./termref"))
75
+ label = @i18n.relatedterms[node["type"]].upcase
76
+ node.replace(l10n("<p><strong>#{label}:</strong> "\
77
+ "<em>#{p.to_xml}</em> (#{ref.to_xml})</p>"))
78
+ end
79
+
80
+ def designation(docxml)
81
+ docxml.xpath(ns("//preferred | //admitted | //deprecates")).each do |p|
82
+ designation1(p)
83
+ end
84
+ docxml.xpath(ns("//term")).each do |t|
85
+ merge_second_preferred(t)
86
+ end
87
+ end
88
+
89
+ def merge_second_preferred(term)
90
+ pref = nil
91
+ term.xpath(ns("./preferred")).each_with_index do |p, i|
92
+ if i.zero? then pref = p
93
+ else
94
+ pref << l10n("; #{p.children.to_xml}")
95
+ p.remove
96
+ end
97
+ end
98
+ end
99
+
100
+ def designation1(desgn)
101
+ s = desgn.at(ns("./termsource"))
102
+ name = desgn.at(ns("./expression/name | ./letter-symbol/name | "\
103
+ "./graphical-symbol")) or return
104
+
105
+ g = desgn.at(ns("./expression/grammar")) and
106
+ name << " #{designation_grammar(g).join(', ')}"
107
+ desgn.children = name.children
108
+ s and desgn.next = s
109
+ end
110
+
111
+ def designation_grammar(grammar)
112
+ ret = []
113
+ grammar.xpath(ns("./gender")).each do |x|
114
+ ret << @i18n.grammar_abbrevs[x.text]
115
+ end
116
+ %w(isPreposition isParticiple isAdjective isVerb isAdverb isNoun)
117
+ .each do |x|
118
+ grammar.at(ns("./#{x}[text() = 'true']")) and
119
+ ret << @i18n.grammar_abbrevs[x]
120
+ end
121
+ ret
122
+ end
123
+
124
+ def definition1(elem)
125
+ nodes = Nokogiri::XML::NodeSet.new(elem.document)
126
+ v = elem&.at(ns("./verbaldefinition"))&.children and nodes += v
127
+ n = elem&.at(ns("./nonverbalrepresentation"))&.children and nodes += n
128
+ elem.children = nodes
129
+ end
130
+
131
+ def termexample(docxml)
132
+ docxml.xpath(ns("//termexample")).each do |f|
133
+ example1(f)
134
+ end
135
+ end
136
+
137
+ def termnote(docxml)
138
+ docxml.xpath(ns("//termnote")).each do |f|
139
+ termnote1(f)
140
+ end
141
+ end
142
+
143
+ # introduce name element
144
+ def termnote1(elem)
145
+ lbl = l10n(@xrefs.anchor(elem["id"], :label) || "???")
146
+ prefix_name(elem, "", lower2cap(lbl), "name")
147
+ end
148
+
149
+ def termdefinition(docxml)
150
+ docxml.xpath(ns("//term[definition]")).each do |f|
151
+ termdefinition1(f)
152
+ end
153
+ end
154
+
155
+ def termdefinition1(elem)
156
+ unwrap_definition(elem)
157
+ multidef(elem) if elem.xpath(ns("./definition")).size > 1
158
+ end
159
+
160
+ def multidef(elem)
161
+ d = elem.at(ns("./definition"))
162
+ d = d.replace("<ol><li>#{d.children.to_xml}</li></ol>").first
163
+ elem.xpath(ns("./definition")).each do |f|
164
+ f = f.replace("<li>#{f.children.to_xml}</li>").first
165
+ d << f
166
+ end
167
+ d.wrap("<definition></definition>")
168
+ end
169
+
170
+ def unwrap_definition(elem)
171
+ elem.xpath(ns("./definition")).each do |d|
172
+ nodes = Nokogiri::XML::NodeSet.new(elem.document)
173
+ v = d&.at(ns("./verbaldefinition"))&.children and nodes += v
174
+ n = d&.at(ns("./nonverbalrepresentation"))&.children and nodes += n
175
+ d.children = nodes
176
+ end
177
+ end
178
+ end
179
+ end
@@ -1,4 +1,5 @@
1
1
  require_relative "presentation_function/block"
2
+ require_relative "presentation_function/terms"
2
3
  require_relative "presentation_function/inline"
3
4
  require_relative "presentation_function/math"
4
5
  require_relative "presentation_function/section"
@@ -25,6 +26,7 @@ module IsoDoc
25
26
  @xrefs.parse docxml
26
27
  section docxml
27
28
  block docxml
29
+ terms docxml
28
30
  inline docxml
29
31
  end
30
32
 
@@ -46,17 +48,13 @@ module IsoDoc
46
48
  sourcecode docxml
47
49
  formula docxml
48
50
  example docxml
49
- termexample docxml
50
51
  note docxml
51
- termnote docxml
52
- termdefinition docxml
53
52
  permission docxml
54
53
  requirement docxml
55
54
  recommendation docxml
56
55
  end
57
56
 
58
57
  def inline(docxml)
59
- concept docxml
60
58
  xref docxml
61
59
  eref docxml
62
60
  origin docxml
@@ -65,6 +63,15 @@ module IsoDoc
65
63
  variant docxml
66
64
  end
67
65
 
66
+ def terms(docxml)
67
+ termexample docxml
68
+ termnote docxml
69
+ termdefinition docxml
70
+ designation docxml
71
+ concept docxml
72
+ related docxml
73
+ end
74
+
68
75
  def postprocess(result, filename, _dir)
69
76
  toXML(result, filename)
70
77
  @files_to_delete.each { |f| FileUtils.rm_rf f }
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "1.7.6".freeze
2
+ VERSION = "1.8.1".freeze
3
3
  end
@@ -54,11 +54,11 @@ module IsoDoc
54
54
  end
55
55
 
56
56
  def para_class(_node)
57
- classtype = nil
58
- classtype = "Note" if @note
59
- classtype = "MsoCommentText" if in_comment
60
- classtype = "Sourcecode" if @annotation
61
- classtype
57
+ return "Sourcecode" if @annotation
58
+ return "MsoCommentText" if @in_comment
59
+ return "Note" if @note
60
+
61
+ nil
62
62
  end
63
63
 
64
64
  def para_parse(node, out)
@@ -86,21 +86,31 @@ module IsoDoc
86
86
  end
87
87
 
88
88
  def dl_parse(node, out)
89
+ return super unless node.ancestors("table, dl").empty?
90
+
91
+ dl_parse_table(node, out)
92
+ end
93
+
94
+ def dl_parse_table(node, out)
89
95
  out.table **{ class: "dl" } do |v|
90
96
  node.elements.select { |n| dt_dd? n }.each_slice(2) do |dt, dd|
91
- v.tr do |tr|
92
- tr.td **{ valign: "top", align: "left" } do |term|
93
- dt_parse(dt, term)
94
- end
95
- tr.td **{ valign: "top" } do |listitem|
96
- dd.children.each { |n| parse(n, listitem) }
97
- end
98
- end
97
+ dl_parse_table1(v, dt, dd)
99
98
  end
100
99
  dl_parse_notes(node, v)
101
100
  end
102
101
  end
103
102
 
103
+ def dl_parse_table1(table, dterm, ddefn)
104
+ table.tr do |tr|
105
+ tr.td **{ valign: "top", align: "left" } do |term|
106
+ dt_parse(dterm, term)
107
+ end
108
+ tr.td **{ valign: "top" } do |listitem|
109
+ ddefn.children.each { |n| parse(n, listitem) }
110
+ end
111
+ end
112
+ end
113
+
104
114
  def dl_parse_notes(node, out)
105
115
  return if node.elements.reject { |n| dt_dd? n }.empty?
106
116
 
@@ -120,8 +130,8 @@ module IsoDoc
120
130
  dl
121
131
  end
122
132
 
133
+ # get rid of footnote link, it is in diagram
123
134
  def figure_aside_process(fig, aside, key)
124
- # get rid of footnote link, it is in diagram
125
135
  fig&.at("./a[@class='TableFootnoteRef']")&.remove
126
136
  fnref = fig.at(".//span[@class='TableFootnoteRef']/..")
127
137
  tr = key.add_child("<tr></tr>").first
@@ -1,10 +1,6 @@
1
1
  module IsoDoc
2
2
  module WordFunction
3
3
  module Comments
4
- def in_comment
5
- @in_comment
6
- end
7
-
8
4
  def comments(div)
9
5
  return if @comments.empty?
10
6