isodoc 2.12.0 → 2.12.2

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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/isodoc.gemspec +2 -2
  3. data/lib/isodoc/convert.rb +0 -21
  4. data/lib/isodoc/function/blocks.rb +19 -48
  5. data/lib/isodoc/function/blocks_example_note.rb +75 -29
  6. data/lib/isodoc/function/cleanup.rb +3 -40
  7. data/lib/isodoc/function/inline.rb +39 -9
  8. data/lib/isodoc/function/lists.rb +5 -5
  9. data/lib/isodoc/function/references.rb +9 -133
  10. data/lib/isodoc/function/reqt.rb +2 -2
  11. data/lib/isodoc/function/section.rb +25 -28
  12. data/lib/isodoc/function/section_titles.rb +16 -13
  13. data/lib/isodoc/function/table.rb +3 -3
  14. data/lib/isodoc/function/terms.rb +21 -20
  15. data/lib/isodoc/function/to_word_html.rb +8 -5
  16. data/lib/isodoc/function/utils.rb +1 -1
  17. data/lib/isodoc/html_function/footnotes.rb +2 -1
  18. data/lib/isodoc/html_function/html.rb +1 -5
  19. data/lib/isodoc/init.rb +31 -0
  20. data/lib/isodoc/metadata.rb +9 -0
  21. data/lib/isodoc/metadata_contributor.rb +1 -1
  22. data/lib/isodoc/metadata_date.rb +1 -1
  23. data/lib/isodoc/presentation_function/autonum.rb +139 -0
  24. data/lib/isodoc/presentation_function/block.rb +95 -36
  25. data/lib/isodoc/presentation_function/docid.rb +78 -0
  26. data/lib/isodoc/presentation_function/erefs.rb +6 -4
  27. data/lib/isodoc/presentation_function/image.rb +52 -13
  28. data/lib/isodoc/presentation_function/inline.rb +6 -6
  29. data/lib/isodoc/presentation_function/math.rb +0 -14
  30. data/lib/isodoc/presentation_function/metadata.rb +0 -62
  31. data/lib/isodoc/presentation_function/refs.rb +44 -14
  32. data/lib/isodoc/presentation_function/reqt.rb +1 -1
  33. data/lib/isodoc/presentation_function/section.rb +46 -121
  34. data/lib/isodoc/presentation_function/sourcecode.rb +7 -4
  35. data/lib/isodoc/presentation_function/terms.rb +27 -2
  36. data/lib/isodoc/presentation_function/title.rb +107 -0
  37. data/lib/isodoc/presentation_function/xrefs.rb +17 -10
  38. data/lib/isodoc/presentation_xml_convert.rb +6 -2
  39. data/lib/isodoc/version.rb +1 -1
  40. data/lib/isodoc/word_function/body.rb +8 -36
  41. data/lib/isodoc/word_function/footnotes.rb +1 -1
  42. data/lib/isodoc/word_function/lists.rb +12 -10
  43. data/lib/isodoc/word_function/postprocess_cover.rb +0 -2
  44. data/lib/isodoc/word_function/postprocess_table.rb +1 -1
  45. data/lib/isodoc/word_function/table.rb +2 -2
  46. data/lib/isodoc/xref/clause_order.rb +2 -2
  47. data/lib/isodoc/xref/xref_anchor.rb +31 -16
  48. data/lib/isodoc/xref/xref_counter_types.rb +3 -2
  49. data/lib/isodoc/xref/xref_gen.rb +57 -33
  50. data/lib/isodoc/xref/xref_gen_seq.rb +145 -56
  51. data/lib/isodoc/xref/xref_sect_gen.rb +64 -47
  52. data/lib/isodoc/xref/xref_util.rb +49 -1
  53. data/lib/isodoc/xref.rb +3 -0
  54. data/lib/isodoc-yaml/i18n-ar.yaml +9 -9
  55. data/lib/isodoc-yaml/i18n-de.yaml +9 -9
  56. data/lib/isodoc-yaml/i18n-en.yaml +9 -9
  57. data/lib/isodoc-yaml/i18n-es.yaml +9 -9
  58. data/lib/isodoc-yaml/i18n-fr.yaml +9 -9
  59. data/lib/isodoc-yaml/i18n-ja.yaml +10 -10
  60. data/lib/isodoc-yaml/i18n-ru.yaml +9 -9
  61. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +9 -9
  62. data/lib/nokogiri/xml/node.rb +1 -0
  63. metadata +9 -6
@@ -1,16 +1,7 @@
1
1
  module IsoDoc
2
2
  module Function
3
3
  module References
4
- # This is highly specific to ISO, but it's not a bad precedent for
5
- # references anyway; keeping here instead of in IsoDoc::Iso for now
6
- def docid_l10n(text)
7
- text.nil? and return text
8
- @i18n.all_parts and text.gsub!(/All Parts/i, @i18n.all_parts.downcase)
9
- text.size < 20 and text.gsub!(/ /, "&#xa0;")
10
- text
11
- end
12
-
13
- def nonstd_bibitem(list, bib, _ordinal, biblio)
4
+ def bibitem_entry(list, bib, _ordinal, biblio)
14
5
  list.p **attr_code(iso_bibitem_entry_attrs(bib, biblio)) do |ref|
15
6
  tag = bib.at(ns("./biblio-tag"))
16
7
  tag&.children&.each { |n| parse(n, ref) }
@@ -18,139 +9,24 @@ module IsoDoc
18
9
  end
19
10
  end
20
11
 
21
- def std_bibitem_entry(list, bib, _ordinal, biblio)
22
- list.p **attr_code(iso_bibitem_entry_attrs(bib, biblio)) do |ref|
23
- tag = bib.at(ns("./biblio-tag"))
24
- tag&.children&.each { |n| parse(n, ref) }
25
- reference_format(bib, ref)
26
- end
27
- end
28
-
29
- SKIP_DOCID = <<~XPATH.strip.freeze
30
- @type = 'DOI' or @type = 'doi' or @type = 'ISSN' or @type = 'issn' or @type = 'ISBN' or @type = 'isbn' or starts-with(@type, 'ISSN.') or starts-with(@type, 'ISBN.') or starts-with(@type, 'issn.') or starts-with(@type, 'isbn.')
31
- XPATH
32
-
33
- def pref_ref_code(bib)
34
- bib["suppress_identifier"] == "true" and return nil
35
- ret = bib.xpath(ns("./docidentifier[@scope = 'biblio-tag']"))
36
- ret.empty? or return ret.map(&:text)
37
- ret = pref_ref_code_parse(bib) or return nil
38
- ins = bib.at(ns("./docidentifier[last()]"))
39
- ret.reverse.each do |r|
40
- ins.next = "<docidentifier scope='biblio-tag'>#{docid_l10n(r)}</docidentifier>"
41
- end
42
- ret
43
- end
44
-
45
- def pref_ref_code_parse(bib)
46
- data, = @bibrender.parse(bib)
47
- ret = data[:authoritative_identifier] or return nil
48
- ret.empty? and return nil
49
- ret
50
- end
51
-
52
- # returns [metanorma, non-metanorma, DOI/ISSN/ISBN] identifiers
53
- def bibitem_ref_code(bib)
54
- id, id1, id2, id3 = bibitem_ref_code_prep(bib)
55
- id || id1 || id2 || id3 and return [id, id1, id2, id3]
56
- bib["suppress_identifier"] == "true" and return [nil, nil, nil, nil]
57
- [nil, no_identifier(bib), nil, nil]
58
- end
59
-
60
- def bibitem_ref_code_prep(bib)
61
- id = bib.at(ns("./docidentifier[@type = 'metanorma']"))
62
- id1 = pref_ref_code(bib)
63
- id2 = bib.at(ns("./docidentifier[#{SKIP_DOCID}]"))
64
- id3 = bib.at(ns("./docidentifier[@type = 'metanorma-ordinal']"))
65
- [id, id1, id2, id3]
66
- end
67
-
68
- def no_identifier(bib)
69
- @i18n.no_identifier or return nil
70
- id = Nokogiri::XML::Node.new("docidentifier", bib.document)
71
- id << @i18n.no_identifier
72
- id
73
- end
74
-
75
- def bracket_if_num(num)
76
- num.nil? and return nil
77
- num = num.text.sub(/^\[/, "").sub(/\]$/, "")
78
- /^\d+$/.match?(num) and return "[#{num}]"
79
- num
80
- end
81
-
82
- def unbracket1(ident)
83
- ident.nil? and return nil
84
- ident.is_a?(String) or ident = ident.text
85
- ident.sub(/^\[/, "").sub(/\]$/, "")
86
- end
87
-
88
- def unbracket(ident)
89
- if ident.respond_to?(:size)
90
- ident.map { |x| unbracket1(x) }.join("&#xA0;/ ")
91
- else
92
- unbracket1(ident)
93
- end
94
- end
95
-
96
- def render_identifier(ident)
97
- { metanorma: bracket_if_num(ident[0]),
98
- sdo: unbracket(ident[1]),
99
- doi: unbracket(ident[2]),
100
- ordinal: bracket_if_num(ident[3]) }
101
- end
102
-
103
- def docid_prefix(prefix, docid)
104
- docid = "#{prefix} #{docid}" if prefix && !omit_docid_prefix(prefix) &&
105
- !/^#{prefix}\b/.match(docid)
106
- docid_l10n(docid)
107
- end
108
-
109
- def omit_docid_prefix(prefix)
110
- return true if prefix.nil? || prefix.empty?
111
-
112
- %w(ISO IEC IEV ITU W3C BIPM csd metanorma repository metanorma-ordinal)
113
- .include? prefix
114
- end
115
-
116
12
  def iso_bibitem_entry_attrs(bib, biblio)
117
13
  { id: bib["id"], class: biblio ? "Biblio" : "NormRef" }
118
14
  end
119
15
 
120
- # reference not to be rendered because it is deemed implicit
121
- # in the standards environment
122
- def implicit_reference(bib)
123
- bib["hidden"] == "true"
124
- end
125
-
126
16
  def reference_format(bib, out)
127
17
  ftitle = bib.at(ns("./formattedref"))
128
18
  ftitle&.children&.each { |n| parse(n, out) }
129
19
  end
130
20
 
131
- def standard?(bib)
132
- ret = false
133
- bib.xpath(ns("./docidentifier")).each do |id|
134
- next if id["type"].nil? ||
135
- id.at(".//self::*[#{SKIP_DOCID} or @type = 'metanorma']")
136
-
137
- ret = true
138
- end
139
- ret
140
- end
141
-
142
21
  def biblio_list(refs, div, biblio)
143
22
  i = 0
144
23
  refs.children.each do |b|
145
24
  if b.name == "bibitem"
146
- next if implicit_reference(b)
147
-
148
- i += 1 unless b["hidden"]
149
- if standard?(b) then std_bibitem_entry(div, b, i, biblio)
150
- else nonstd_bibitem(div, b, i, biblio)
151
- end
25
+ b["hidden"] == "true" and next
26
+ i += 1
27
+ bibitem_entry(div, b, i, biblio)
152
28
  else
153
- parse(b, div) unless %w(title).include? b.name
29
+ parse(b, div) unless %w(fmt-title).include? b.name
154
30
  end
155
31
  end
156
32
  end
@@ -165,9 +41,9 @@ module IsoDoc
165
41
  def norm_ref(node, out)
166
42
  node["hidden"] != "true" or return
167
43
  out.div do |div|
168
- clause_name(node, node.at(ns("./title")), div, nil)
44
+ clause_name(node, node.at(ns("./fmt-title")), div, nil)
169
45
  if node.name == "clause"
170
- node.elements.each { |e| parse(e, div) unless e.name == "title" }
46
+ node.elements.each { |e| parse(e, div) unless e.name == "fmt-title" }
171
47
  else biblio_list(node, div, false)
172
48
  end
173
49
  end
@@ -184,7 +60,7 @@ module IsoDoc
184
60
  page_break(out)
185
61
  out.div do |div|
186
62
  div.h1 class: "Section3" do |h1|
187
- node.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
63
+ node.at(ns("./fmt-title"))&.children&.each { |c2| parse(c2, h1) }
188
64
  end
189
65
  biblio_list(node, div, true)
190
66
  end
@@ -193,7 +69,7 @@ module IsoDoc
193
69
  def bibliography_parse(node, out)
194
70
  node["hidden"] != true or return
195
71
  out.div do |div|
196
- clause_parse_title(node, div, node.at(ns("./title")), out,
72
+ clause_parse_title(node, div, node.at(ns("./fmt-title")), out,
197
73
  { class: "Section3" })
198
74
  biblio_list(node, div, true)
199
75
  end
@@ -20,9 +20,9 @@ module IsoDoc
20
20
  end
21
21
 
22
22
  def recommendation_parse1(node, out)
23
- recommendation_name(node.at(ns("./name")), out)
23
+ recommendation_name(node.at(ns("./fmt-name")), out)
24
24
  node.children.each do |n|
25
- parse(n, out) unless n.name == "name"
25
+ parse(n, out) unless n.name == "fmt-name"
26
26
  end
27
27
  end
28
28
 
@@ -10,8 +10,8 @@ module IsoDoc
10
10
  # used for subclauses
11
11
  def clause_parse(node, out)
12
12
  out.div **attr_code(clause_attrs(node)) do |div|
13
- clause_parse_title(node, div, node.at(ns("./title")), out)
14
- node.children.reject { |c1| c1.name == "title" }.each do |c1|
13
+ clause_parse_title(node, div, node.at(ns("./fmt-title")), out)
14
+ node.children.reject { |c1| c1.name == "fmt-title" }.each do |c1|
15
15
  parse(c1, div)
16
16
  end
17
17
  end
@@ -19,8 +19,8 @@ module IsoDoc
19
19
 
20
20
  def clause(node, out)
21
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|
22
+ clause_name(node, node.at(ns("./fmt-title")), s, nil)
23
+ node.elements.reject { |c1| c1.name == "fmt-title" }.each do |c1|
24
24
  parse(c1, s)
25
25
  end
26
26
  end
@@ -34,7 +34,7 @@ module IsoDoc
34
34
  page_break(out)
35
35
  out.div **attr_code(annex_attrs(node)) do |s|
36
36
  node.elements.each do |c1|
37
- if c1.name == "title" then annex_name(node, c1, s)
37
+ if c1.name == "fmt-title" then annex_name(node, c1, s)
38
38
  else parse(c1, s)
39
39
  end
40
40
  end
@@ -47,9 +47,9 @@ module IsoDoc
47
47
 
48
48
  def scope(node, out)
49
49
  out.div **attr_code(id: node["id"]) do |div|
50
- clause_name(node, node.at(ns("./title")), div, nil)
50
+ clause_name(node, node.at(ns("./fmt-title")), div, nil)
51
51
  node.elements.each do |e|
52
- parse(e, div) unless e.name == "title"
52
+ parse(e, div) unless e.name == "fmt-title"
53
53
  end
54
54
  end
55
55
  end
@@ -59,9 +59,9 @@ module IsoDoc
59
59
 
60
60
  def terms_defs(node, out)
61
61
  out.div **attr_code(id: node["id"]) do |div|
62
- clause_name(node, node.at(ns("./title")), div, nil)
62
+ clause_name(node, node.at(ns("./fmt-title")), div, nil)
63
63
  node.elements.each do |e|
64
- parse(e, div) unless %w{title source}.include? e.name
64
+ parse(e, div) unless %w{fmt-title source}.include? e.name
65
65
  end
66
66
  end
67
67
  end
@@ -73,28 +73,25 @@ module IsoDoc
73
73
 
74
74
  def symbols_abbrevs(node, out)
75
75
  out.div **attr_code(id: node["id"], class: "Symbols") do |div|
76
- clause_name(node, node.at(ns("./title")), div, nil)
76
+ clause_name(node, node.at(ns("./fmt-title")), div, nil)
77
77
  node.elements.each do |e|
78
- parse(e, div) unless e.name == "title"
78
+ parse(e, div) unless e.name == "fmt-title"
79
79
  end
80
80
  end
81
81
  end
82
82
 
83
83
  # subclause
84
84
  def symbols_parse(isoxml, out)
85
- isoxml.at(ns("./title")) or
86
- #isoxml.children.first.previous = "<title>#{@i18n.symbols}</title>"
87
- isoxml.add_first_child "<title>#{@i18n.symbols}</title>"
88
85
  clause_parse(isoxml, out)
89
86
  end
90
87
 
91
88
  def introduction(clause, out)
92
89
  page_break(out)
93
90
  out.div class: "Section3", id: clause["id"] do |div|
94
- clause_name(clause, clause.at(ns("./title")), div,
91
+ clause_name(clause, clause.at(ns("./fmt-title")), div,
95
92
  { class: "IntroTitle" })
96
93
  clause.elements.each do |e|
97
- parse(e, div) unless e.name == "title"
94
+ parse(e, div) unless e.name == "fmt-title"
98
95
  end
99
96
  end
100
97
  end
@@ -102,9 +99,9 @@ module IsoDoc
102
99
  def foreword(clause, out)
103
100
  page_break(out)
104
101
  out.div **attr_code(id: clause["id"]) do |s|
105
- clause_name(clause, clause.at(ns("./title")) || @i18n.foreword, s,
102
+ clause_name(clause, clause.at(ns("./fmt-title")), s,
106
103
  { class: "ForewordTitle" })
107
- clause.elements.each { |e| parse(e, s) unless e.name == "title" }
104
+ clause.elements.each { |e| parse(e, s) unless e.name == "fmt-title" }
108
105
  end
109
106
  end
110
107
 
@@ -112,9 +109,9 @@ module IsoDoc
112
109
  title_attr = { class: "IntroTitle" }
113
110
  page_break(out)
114
111
  out.div class: "Section3", id: clause["id"] do |div|
115
- clause_name(clause, clause.at(ns("./title")), div, title_attr)
112
+ clause_name(clause, clause.at(ns("./fmt-title")), div, title_attr)
116
113
  clause.elements.each do |e|
117
- parse(e, div) unless e.name == "title"
114
+ parse(e, div) unless e.name == "fmt-title"
118
115
  end
119
116
  end
120
117
  end
@@ -122,9 +119,9 @@ module IsoDoc
122
119
  def abstract(clause, out)
123
120
  page_break(out)
124
121
  out.div **attr_code(id: clause["id"]) do |s|
125
- clause_name(clause, clause.at(ns("./title")), s,
122
+ clause_name(clause, clause.at(ns("./fmt-title")), s,
126
123
  { class: "AbstractTitle" })
127
- clause.elements.each { |e| parse(e, s) unless e.name == "title" }
124
+ clause.elements.each { |e| parse(e, s) unless e.name == "fmt-title" }
128
125
  end
129
126
  end
130
127
 
@@ -144,10 +141,10 @@ module IsoDoc
144
141
  def preface_normal(clause, out)
145
142
  page_break(out)
146
143
  out.div **attr_code(preface_attrs(clause)) do |div|
147
- clause_name(clause, clause.at(ns("./title")), div,
144
+ clause_name(clause, clause.at(ns("./fmt-title")), div,
148
145
  { class: "IntroTitle" })
149
146
  clause.elements.each do |e|
150
- parse(e, div) unless e.name == "title"
147
+ parse(e, div) unless e.name == "fmt-title"
151
148
  end
152
149
  end
153
150
  end
@@ -156,10 +153,10 @@ module IsoDoc
156
153
  @bare and return
157
154
  page_break(out)
158
155
  out.div **attr_code(preface_attrs(clause)) do |div|
159
- clause_name(clause, clause.at(ns("./title")), div,
156
+ clause_name(clause, clause.at(ns("./fmt-title")), div,
160
157
  { class: "IntroTitle" })
161
158
  clause.elements.each do |e|
162
- parse(e, div) unless e.name == "title"
159
+ parse(e, div) unless e.name == "fmt-title"
163
160
  end
164
161
  end
165
162
  end
@@ -168,10 +165,10 @@ module IsoDoc
168
165
  @seen_colophon or page_break(out)
169
166
  @seen_colophon = true
170
167
  out.div class: "Section3", id: node["id"] do |div|
171
- clause_name(node, node.at(ns("./title")), div,
168
+ clause_name(node, node.at(ns("./fmt-title")), div,
172
169
  { class: "IntroTitle" })
173
170
  node.elements.each do |e|
174
- parse(e, div) unless e.name == "title"
171
+ parse(e, div) unless e.name == "fmt-title"
175
172
  end
176
173
  end
177
174
  end
@@ -18,18 +18,24 @@ module IsoDoc
18
18
  end
19
19
  end
20
20
 
21
+ def sections_names
22
+ %w[clause annex terms references definitions
23
+ acknowledgements introduction abstract foreword appendix]
24
+ end
25
+
21
26
  def freestanding_title(node, out)
22
- parents = node.ancestors("clause, annex, terms, references, " \
23
- "definitions, acknowledgements, introduction, " \
24
- "foreword")
27
+ # node.parent.at(ns("./fmt-title[@source = '#{node['id']}']")) and
28
+ # return # this title is already being rendered as fmt-title
29
+ # For testing convenience, let's just go by parent
30
+ sections_names.include?(node.parent.name) and return
31
+ parents = node.ancestors(sections_names.join(", "))
25
32
  clause_parse_title(parents.empty? ? node : parents.first,
26
33
  out, node, out)
27
34
  end
28
35
 
29
36
  # used for subclauses
30
37
  def clause_parse_title(node, div, title, out, header_class = {})
31
- return if title.nil?
32
-
38
+ title.nil? and return
33
39
  if node["inline-header"] == "true"
34
40
  inline_header_title(out, node, title)
35
41
  else
@@ -46,9 +52,7 @@ module IsoDoc
46
52
  end
47
53
 
48
54
  def clause_title_depth(node, title)
49
- depth = node.ancestors("clause, annex, terms, references, " \
50
- "definitions, acknowledgements, introduction, " \
51
- "foreword").size + 1
55
+ depth = node.ancestors(sections_names.join(", ")).size + 1
52
56
  depth = title["depth"] if title && title["depth"]
53
57
  depth
54
58
  end
@@ -63,12 +67,12 @@ module IsoDoc
63
67
  end
64
68
 
65
69
  # top level clause names
66
- def clause_name(node, title, div, header_class)
70
+ def clause_name(_node, title, div, header_class)
67
71
  header_class = {} if header_class.nil?
68
72
  div.h1 **attr_code(header_class) do |h1|
69
73
  if title.is_a?(String) then h1 << title
70
- else
71
- title&.children&.each { |c2| parse(c2, h1) }
74
+ elsif title
75
+ children_parse(title, h1)
72
76
  clause_parse_subtitle(title, h1)
73
77
  end
74
78
  end
@@ -76,8 +80,7 @@ module IsoDoc
76
80
  end
77
81
 
78
82
  def annex_name(_annex, name, div)
79
- return if name.nil?
80
-
83
+ name.nil? and return
81
84
  div.h1 class: "Annex" do |t|
82
85
  name.children.each { |c2| parse(c2, t) }
83
86
  clause_parse_subtitle(name, t)
@@ -2,7 +2,7 @@ module IsoDoc
2
2
  module Function
3
3
  module Table
4
4
  def table_title_parse(node, out)
5
- name = node.at(ns("./name")) or return
5
+ name = node.at(ns("./fmt-name")) or return
6
6
  out.p class: "TableTitle", style: "text-align:center;" do |p|
7
7
  name&.children&.each { |n| parse(n, p) }
8
8
  end
@@ -112,12 +112,12 @@ module IsoDoc
112
112
  !header && cell.name == "th" and
113
113
  scope = (cell["rowspan"] ? "rowgroup" : "row")
114
114
  { rowspan: cell["rowspan"], colspan: cell["colspan"],
115
- style: style.gsub(/\n/, ""), scope: scope, class: cell["class"] }
115
+ style: style.delete("\n"), scope: scope, class: cell["class"] }
116
116
  end
117
117
 
118
118
  def make_tr_attr_style(row, rowmax, totalrows, _header, bordered)
119
119
  bordered or return ""
120
- <<~STYLE.gsub(/\n/, "")
120
+ <<~STYLE.delete("\n")
121
121
  border-top:#{row.zero? ? "#{SW} 1.5pt;" : 'none;'}
122
122
  border-bottom:#{SW} #{rowmax >= totalrows ? '1.5' : '1.0'}pt;
123
123
  STYLE
@@ -28,30 +28,27 @@ module IsoDoc
28
28
  end
29
29
  end
30
30
 
31
- def para_then_remainder(first, node, para, div)
32
- if first.name == "p"
33
- first.children.each { |n| parse(n, para) }
34
- node.elements.drop(1).each { |n| parse(n, div) }
35
- else
36
- node.elements.each { |n| parse(n, div) }
37
- end
38
- end
39
-
40
- def termnote_delim
41
- l10n(": ")
31
+ def termnote_p_class
32
+ nil
42
33
  end
43
34
 
44
35
  def termnote_parse(node, out)
45
- name = node&.at(ns("./name"))&.remove
36
+ para = block_body_first_elem(node)
46
37
  out.div **note_attrs(node) do |div|
47
- div.p do |p|
48
- if name
49
- name.children.each { |n| parse(n, p) }
50
- p << termnote_delim
38
+ termnote_parse1(node, para, div)
39
+ para&.xpath("./following-sibling::*")&.each { |n| parse(n, div) }
40
+ end
41
+ end
42
+
43
+ def termnote_parse1(node, para, div)
44
+ div.p **attr_code(class: termnote_p_class) do |p|
45
+ name = node.at(ns("./fmt-name")) and
46
+ p.span class: "termnote_label" do |s|
47
+ children_parse(name, s)
51
48
  end
52
- para_then_remainder(node.first_element_child, node, p, div)
53
- end
49
+ para&.name == "p" and children_parse(para, p)
54
50
  end
51
+ para&.name != "p" and parse(para, div)
55
52
  end
56
53
 
57
54
  def termref_parse(node, out)
@@ -60,12 +57,16 @@ module IsoDoc
60
57
  end
61
58
  end
62
59
 
60
+ def termdomain_parse(node, out)
61
+ node["hidden"] == "true" and return
62
+ node.children.each { |n| parse(n, out) }
63
+ end
64
+
63
65
  def termdef_parse(node, out)
64
- name = node&.at(ns("./name"))&.remove
66
+ name = node.at(ns("./fmt-name"))&.remove
65
67
  out.p class: "TermNum", id: node["id"] do |p|
66
68
  name&.children&.each { |n| parse(n, p) }
67
69
  end
68
- set_termdomain("")
69
70
  node.children.each { |n| parse(n, out) }
70
71
  end
71
72
 
@@ -4,10 +4,6 @@ require "pathname"
4
4
  module IsoDoc
5
5
  module Function
6
6
  module ToWordHtml
7
- def set_termdomain(termdomain)
8
- @termdomain = termdomain
9
- end
10
-
11
7
  def note?
12
8
  @note
13
9
  end
@@ -222,7 +218,7 @@ module IsoDoc
222
218
  when "preferred" then term_parse(node, out)
223
219
  when "admitted" then admitted_term_parse(node, out)
224
220
  when "deprecates" then deprecated_term_parse(node, out)
225
- when "domain" then set_termdomain(node.text)
221
+ when "domain" then termdomain_parse(node, out)
226
222
  when "definition" then definition_parse(node, out)
227
223
  when "termsource" then termref_parse(node, out)
228
224
  when "modification" then modification_parse(node, out)
@@ -261,9 +257,16 @@ module IsoDoc
261
257
  when "location" then location_parse(node, out)
262
258
  when "cross-align" then cross_align_parse(node, out)
263
259
  when "columnbreak" then columnbreak_parse(node, out)
260
+ when "attribution" then attribution_parse(node, out)
261
+ when "author" then author_parse(node, out)
264
262
  when "ruby" then ruby_parse(node, out)
265
263
  when "rt" then rt_parse(node, out)
266
264
  when "rb" then rb_parse(node, out)
265
+ when "semx" then semx_parse(node, out)
266
+ when "name" then name_parse(node, out)
267
+ when "fmt-xref-label" then xref_label_parse(node, out)
268
+ when "fmt-name" then fmt_name_parse(node, out)
269
+ when "floating-title" then floating_title_parse(node, out)
267
270
  else error_parse(node, out)
268
271
  end
269
272
  end
@@ -24,7 +24,7 @@ module IsoDoc
24
24
  end
25
25
 
26
26
  def insert_tab(out, count)
27
- tab = %w(Hans Hant).include?(@script) ? "&#x3000;" : "&#xa0; "
27
+ tab = %w(Hans Hant Jpan Kore).include?(@script) ? "&#x3000;" : "&#xa0; "
28
28
  [1..count].each { out << tab }
29
29
  end
30
30
 
@@ -24,6 +24,7 @@ module IsoDoc
24
24
  end
25
25
  end
26
26
 
27
+ # Move to Presentation XML, as <fmt-footnote>: it's a footnote body
27
28
  def make_table_footnote_text(node, fnid, fnref)
28
29
  attrs = { id: "fn:#{fnid}" }
29
30
  noko do |xml|
@@ -68,7 +69,7 @@ module IsoDoc
68
69
 
69
70
  def footnote_parse(node, out)
70
71
  return table_footnote_parse(node, out) if (@in_table || @in_figure) &&
71
- !node.ancestors.map(&:name).include?("name")
72
+ !node.ancestors.map(&:name).include?("fmt-name")
72
73
 
73
74
  fn = node["reference"] || UUIDTools::UUID.random_create.to_s
74
75
  attrs = { class: "FootnoteRef", href: "#fn:#{fn}" }
@@ -15,10 +15,6 @@ module IsoDoc
15
15
  end.join("\n")
16
16
  end
17
17
 
18
- def preprocess_xslt(docxml)
19
- super
20
- end
21
-
22
18
  def make_body1(body, _docxml)
23
19
  return if @bare
24
20
 
@@ -78,7 +74,7 @@ module IsoDoc
78
74
  end
79
75
 
80
76
  def sourcecode_parse(node, out)
81
- name = node.at(ns("./name"))
77
+ name = node.at(ns("./fmt-name"))
82
78
  tag = node.at(ns(".//sourcecode | .//table")) ? "div" : "pre"
83
79
  attr = sourcecode_attrs(node).merge(class: "sourcecode")
84
80
  out.send tag, **attr do |div|
data/lib/isodoc/init.rb CHANGED
@@ -140,5 +140,36 @@ module IsoDoc
140
140
  def agency?(text)
141
141
  self.class::AGENCIES.include?(text)
142
142
  end
143
+
144
+ def docid_l10n(text)
145
+ text.nil? and return text
146
+ @i18n.all_parts and text.gsub!(/All Parts/i, @i18n.all_parts.downcase)
147
+ x = Nokogiri::XML::DocumentFragment.parse(text)
148
+ (x.xpath(".//text()") - x.xpath(".//fn//text()")).each do |n|
149
+ n.replace(n.text.gsub(/ /, "&#xa0;"))
150
+ end
151
+ to_xml(x)
152
+ end
153
+
154
+ def docid_prefix(prefix, docid)
155
+ docid = "#{prefix} #{docid}" if prefix && !omit_docid_prefix(prefix) &&
156
+ !/^#{prefix}\b/.match(docid)
157
+ docid_l10n(docid)
158
+ end
159
+
160
+ def omit_docid_prefix(prefix)
161
+ prefix.nil? || prefix.empty? and return true
162
+ %w(ISO IEC IEV ITU W3C BIPM csd metanorma repository metanorma-ordinal)
163
+ .include? prefix
164
+ end
165
+
166
+ def connectives_spans(text)
167
+ text.gsub("<conn>", "<span class='fmt-conn'>")
168
+ .gsub("</conn>", "</span>")
169
+ .gsub("<enum-comma>", "<span class='fmt-enum-comma'>")
170
+ .gsub("</enum-comma>", "</span>")
171
+ .gsub("<comma>", "<span class='fmt-comma'>")
172
+ .gsub("</comma>", "</span>")
173
+ end
143
174
  end
144
175
  end
@@ -13,6 +13,15 @@ module IsoDoc
13
13
  @i18n.l10n(expr, lang, script, locale)
14
14
  end
15
15
 
16
+ def connectives_strip(text)
17
+ text.gsub("<conn>", "")
18
+ .gsub("</conn>", "")
19
+ .gsub("<enum-comma>", "")
20
+ .gsub("</enum-comma>", "")
21
+ .gsub("<comma>", "")
22
+ .gsub("</comma>", "")
23
+ end
24
+
16
25
  def initialize(lang, script, locale, i18n, fonts_options = {})
17
26
  @metadata = { lang:, script: }
18
27
  DATETYPES.each { |w| @metadata["#{w.tr('-', '_')}date".to_sym] = "XXX" }
@@ -79,7 +79,7 @@ module IsoDoc
79
79
  def agency(xml)
80
80
  agency, publisher = agency1(xml)
81
81
  set(:agency, agency.sub(%r{/$}, ""))
82
- set(:publisher, @i18n.boolean_conj(publisher, "and"))
82
+ set(:publisher, connectives_strip(@i18n.boolean_conj(publisher, "and")))
83
83
  agency_addr(xml)
84
84
  end
85
85