isodoc 1.0.24 → 1.0.29

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +14 -4
  3. data/.github/workflows/ubuntu.yml +19 -5
  4. data/.github/workflows/windows.yml +14 -4
  5. data/isodoc.gemspec +1 -1
  6. data/lib/isodoc-yaml/i18n-en.yaml +3 -1
  7. data/lib/isodoc-yaml/i18n-fr.yaml +3 -1
  8. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +3 -1
  9. data/lib/isodoc/convert.rb +1 -0
  10. data/lib/isodoc/function/blocks.rb +43 -49
  11. data/lib/isodoc/function/{blocks_example.rb → blocks_example_note.rb} +57 -2
  12. data/lib/isodoc/function/cleanup.rb +16 -2
  13. data/lib/isodoc/function/i18n.rb +1 -0
  14. data/lib/isodoc/function/inline.rb +79 -77
  15. data/lib/isodoc/function/inline_simple.rb +72 -0
  16. data/lib/isodoc/function/lists.rb +12 -6
  17. data/lib/isodoc/function/references.rb +51 -39
  18. data/lib/isodoc/function/reqt.rb +13 -4
  19. data/lib/isodoc/function/section.rb +19 -8
  20. data/lib/isodoc/function/table.rb +3 -4
  21. data/lib/isodoc/function/terms.rb +1 -1
  22. data/lib/isodoc/function/to_word_html.rb +23 -13
  23. data/lib/isodoc/function/utils.rb +13 -6
  24. data/lib/isodoc/function/xref_counter.rb +43 -9
  25. data/lib/isodoc/function/xref_gen.rb +2 -1
  26. data/lib/isodoc/function/xref_gen_seq.rb +11 -10
  27. data/lib/isodoc/function/xref_sect_gen.rb +24 -24
  28. data/lib/isodoc/headlesshtml_convert.rb +5 -0
  29. data/lib/isodoc/html_convert.rb +5 -0
  30. data/lib/isodoc/html_function/footnotes.rb +3 -3
  31. data/lib/isodoc/html_function/html.rb +16 -1
  32. data/lib/isodoc/html_function/postprocess.rb +6 -5
  33. data/lib/isodoc/metadata.rb +10 -3
  34. data/lib/isodoc/metadata_date.rb +19 -7
  35. data/lib/isodoc/pdf_convert.rb +5 -0
  36. data/lib/isodoc/version.rb +1 -1
  37. data/lib/isodoc/word_convert.rb +5 -0
  38. data/lib/isodoc/word_function/body.rb +13 -51
  39. data/lib/isodoc/word_function/footnotes.rb +3 -3
  40. data/lib/isodoc/word_function/inline.rb +75 -0
  41. data/lib/isodoc/word_function/postprocess.rb +13 -2
  42. data/lib/isodoc/word_function/table.rb +3 -3
  43. data/lib/isodoc/xslfo_convert.rb +5 -0
  44. data/spec/assets/i18n.yaml +4 -1
  45. data/spec/assets/odf.emf +0 -0
  46. data/spec/assets/odf.svg +4 -0
  47. data/spec/assets/odf1.svg +4 -0
  48. data/spec/isodoc/blocks_spec.rb +274 -51
  49. data/spec/isodoc/cleanup_spec.rb +317 -25
  50. data/spec/isodoc/footnotes_spec.rb +20 -5
  51. data/spec/isodoc/i18n_spec.rb +12 -12
  52. data/spec/isodoc/inline_spec.rb +299 -4
  53. data/spec/isodoc/lists_spec.rb +8 -8
  54. data/spec/isodoc/metadata_spec.rb +112 -3
  55. data/spec/isodoc/postproc_spec.rb +39 -21
  56. data/spec/isodoc/ref_spec.rb +121 -52
  57. data/spec/isodoc/section_spec.rb +236 -207
  58. data/spec/isodoc/table_spec.rb +28 -28
  59. data/spec/isodoc/terms_spec.rb +57 -13
  60. data/spec/isodoc/xref_spec.rb +218 -71
  61. metadata +10 -5
@@ -1,13 +1,25 @@
1
1
  module IsoDoc::Function
2
2
  module Cleanup
3
3
  def textcleanup(docxml)
4
+ docxml = termref_cleanup(passthrough_cleanup(docxml))
5
+ end
6
+
7
+ def termref_cleanup(docxml)
4
8
  docxml.
9
+ gsub(%r{\s*\[/TERMREF\]\s*</p>\s*<p>\s*\[TERMREF\]}, "; ").
5
10
  gsub(/\[TERMREF\]\s*/, l10n("[#{@source_lbl}: ")).
6
11
  gsub(/\s*\[MODIFICATION\]\s*\[\/TERMREF\]/, l10n(", #{@modified_lbl} [/TERMREF]")).
7
- gsub(/\s*\[\/TERMREF\]\s*/, l10n("]")).
12
+ gsub(%r{\s*\[\/TERMREF\]\s*}, l10n("]")).
8
13
  gsub(/\s*\[MODIFICATION\]/, l10n(", #{@modified_lbl} &mdash; "))
9
14
  end
10
15
 
16
+ def passthrough_cleanup(docxml)
17
+ docxml.split(%r{(<passthrough>|</passthrough>)}).each_slice(4).map do |a|
18
+ a.size > 2 and a[2] = HTMLEntities.new.decode(a[2])
19
+ [a[0], a[2]]
20
+ end.join
21
+ end
22
+
11
23
  def cleanup(docxml)
12
24
  comment_cleanup(docxml)
13
25
  footnote_cleanup(docxml)
@@ -20,6 +32,7 @@ module IsoDoc::Function
20
32
  end
21
33
 
22
34
  def table_long_strings_cleanup(docxml)
35
+ return unless @break_up_urls_in_tables == true
23
36
  docxml.xpath("//td | //th").each do |d|
24
37
  d.traverse do |n|
25
38
  next unless n.text?
@@ -30,6 +43,7 @@ module IsoDoc::Function
30
43
  end
31
44
 
32
45
  def break_up_long_strings(t)
46
+ return t if t.match(/^\s*$/)
33
47
  t.split(/(?=\s)/).map do |w|
34
48
  (/^\s*$/.match(t) or w.size < 30) ? w :
35
49
  w.scan(/.{,30}/).map do |w1|
@@ -116,7 +130,7 @@ module IsoDoc::Function
116
130
  end
117
131
 
118
132
  def footnote_cleanup(docxml)
119
- docxml.xpath('//a[@epub:type = "footnote"]/sup').each_with_index do |x, i|
133
+ docxml.xpath('//a[@class = "FootnoteRef"]/sup').each_with_index do |x, i|
120
134
  x.content = (i + 1).to_s
121
135
  end
122
136
  docxml
@@ -87,6 +87,7 @@ module IsoDoc::Function
87
87
 
88
88
  # TODO: move to localization file
89
89
  def eref_localities1(target, type, from, to, delim, lang = "en")
90
+ return "" if type == "anchor"
90
91
  return l10n(eref_localities1_zh(target, type, from, to, delim)) if lang == "zh"
91
92
  ret = delim
92
93
  loc = @locality[type] || type.sub(/^locality:/, "").capitalize
@@ -1,28 +1,7 @@
1
+ require_relative "inline_simple"
2
+
1
3
  module IsoDoc::Function
2
4
  module Inline
3
- def section_break(body)
4
- body.br
5
- end
6
-
7
- def page_break(out)
8
- out.br
9
- end
10
-
11
- def pagebreak_parse(_node, out)
12
- out.br
13
- end
14
-
15
- def hr_parse(node, out)
16
- out.hr
17
- end
18
-
19
- def br_parse(node, out)
20
- out.br
21
- end
22
-
23
- def index_parse(node, out)
24
- end
25
-
26
5
  def link_parse(node, out)
27
6
  out.a **attr_code(href: node["target"], title: node["alt"]) do |l|
28
7
  if node.text.empty?
@@ -50,17 +29,39 @@ module IsoDoc::Function
50
29
  (container && get_note_container_id(node) != container &&
51
30
  @anchors[node["target"]]) &&
52
31
  linkend = prefix_container(container, linkend, node["target"])
32
+ linkend = capitalise_xref(node, linkend)
53
33
  end
54
34
  linkend || "???"
55
35
  end
56
36
 
37
+ def capitalise_xref(node, linkend)
38
+ return linkend unless %w(Latn Cyrl Grek).include? @script
39
+ return linkend&.capitalize if node["case"] == "capital"
40
+ return linkend&.downcase if node["case"] == "lowercase"
41
+ return linkend if linkend[0,1].match(/\p{Upper}/)
42
+ prec = nearest_block_parent(node).xpath("./descendant-or-self::text()") &
43
+ node.xpath("./preceding::text()")
44
+ (prec.empty? || /(?!<[^.].)\.\s+$/.match(prec.map { |p| p.text }.join)) ?
45
+ linkend&.capitalize : linkend
46
+ end
47
+
48
+ def nearest_block_parent(node)
49
+ until %w(p title td th name formula
50
+ li dt dd sourcecode pre).include?(node.name)
51
+ node = node.parent
52
+ end
53
+ node
54
+ end
55
+
57
56
  def get_linkend(node)
58
- contents = node.children.select { |c| !%w{locality localityStack}.include? c.name }.
59
- select { |c| !c.text? || /\S/.match(c) }
57
+ contents = node.children.select do |c|
58
+ !%w{locality localityStack}.include? c.name
59
+ end.select { |c| !c.text? || /\S/.match(c) }
60
60
  !contents.empty? and
61
61
  return Nokogiri::XML::NodeSet.new(node.document, contents).to_xml
62
62
  link = anchor_linkend(node, docid_l10n(node["target"] || node["citeas"]))
63
- link + eref_localities(node.xpath(ns("./locality | ./localityStack")), link)
63
+ link + eref_localities(node.xpath(ns("./locality | ./localityStack")),
64
+ link)
64
65
  # so not <origin bibitemid="ISO7301" citeas="ISO 7301">
65
66
  # <locality type="section"><reference>3.1</reference></locality></origin>
66
67
  end
@@ -83,27 +84,52 @@ module IsoDoc::Function
83
84
  end
84
85
  else
85
86
  ret += eref_localities0(r, i, target, delim)
86
- end
87
+ end
87
88
  end
88
89
  ret
89
90
  end
90
91
 
91
92
  def eref_localities0(r, i, target, delim)
92
- if r["type"] == "whole" then l10n("#{delim} #{@whole_of_text}")
93
+ if r["type"] == "whole" then l10n("#{delim} #{@wholeoftext_lbl}")
93
94
  else
94
95
  eref_localities1(target, r["type"], r.at(ns("./referenceFrom")),
95
96
  r.at(ns("./referenceTo")), delim, @lang)
96
97
  end
97
98
  end
98
99
 
100
+ def suffix_url(url)
101
+ return url if %r{^http[s]?://}.match(url)
102
+ url.sub(/#{File.extname(url)}$/, ".html")
103
+ end
104
+
105
+ def eref_target(node)
106
+ href = "#" + node["bibitemid"]
107
+ url = node.at(ns("//bibitem[@id = '#{node['bibitemid']}']/"\
108
+ "uri[@type = 'citation']"))
109
+ return href unless url
110
+ href = suffix_url(url.text)
111
+ anchor = node&.at(ns(".//locality[@type = 'anchor']"))&.text
112
+ anchor and href += "##{anchor}"
113
+ href
114
+ end
115
+
99
116
  def eref_parse(node, out)
100
117
  linkend = get_linkend(node)
118
+ href = eref_target(node)
101
119
  if node["type"] == "footnote"
102
120
  out.sup do |s|
103
- s.a(**{ "href": "#" + node["bibitemid"] }) { |l| l << linkend }
121
+ s.a(**{ "href": href }) { |l| l << linkend }
104
122
  end
105
123
  else
106
- out.a(**{ "href": "#" + node["bibitemid"] }) { |l| l << linkend }
124
+ out.a(**{ "href": href }) { |l| l << linkend }
125
+ end
126
+ end
127
+
128
+ def origin_parse(node, out)
129
+ if t = node.at(ns("./termref"))
130
+ termrefelem_parse(t, out)
131
+ else
132
+ eref_parse(node, out)
107
133
  end
108
134
  end
109
135
 
@@ -112,8 +138,9 @@ module IsoDoc::Function
112
138
  end
113
139
 
114
140
  def concept_parse(node, out)
115
- content = node.first_element_child.children.select { |c| !%w{locality localityStack}.include? c.name }.
116
- select { |c| !c.text? || /\S/.match(c) }
141
+ content = node.first_element_child.children.select do |c|
142
+ !%w{locality localityStack}.include? c.name
143
+ end.select { |c| !c.text? || /\S/.match(c) }
117
144
  if content.empty?
118
145
  out << "[Term defined in "
119
146
  parse(node.first_element_child, out)
@@ -125,7 +152,8 @@ module IsoDoc::Function
125
152
 
126
153
  def stem_parse(node, out)
127
154
  ooml = if node["type"] == "AsciiMath"
128
- "#{@openmathdelim}#{HTMLEntities.new.encode(node.text)}#{@closemathdelim}"
155
+ "#{@openmathdelim}#{HTMLEntities.new.encode(node.text)}"\
156
+ "#{@closemathdelim}"
129
157
  elsif node["type"] == "MathML" then node.first_element_child.to_s
130
158
  else
131
159
  HTMLEntities.new.encode(node.text)
@@ -167,57 +195,31 @@ module IsoDoc::Function
167
195
  out << text
168
196
  end
169
197
 
170
- def bookmark_parse(node, out)
171
- out.a **attr_code(id: node["id"])
172
- end
173
-
174
- def keyword_parse(node, out)
175
- out.span **{ class: "keyword" } do |s|
176
- node.children.each { |n| parse(n, s) }
177
- end
178
- end
179
-
180
- def em_parse(node, out)
181
- out.i do |e|
182
- node.children.each { |n| parse(n, e) }
183
- end
184
- end
185
-
186
- def strong_parse(node, out)
187
- out.b do |e|
188
- node.children.each { |n| parse(n, e) }
189
- end
190
- end
191
-
192
- def sup_parse(node, out)
193
- out.sup do |e|
194
- node.children.each { |n| parse(n, e) }
195
- end
196
- end
197
-
198
- def sub_parse(node, out)
199
- out.sub do |e|
200
- node.children.each { |n| parse(n, e) }
201
- end
202
- end
203
-
204
- def tt_parse(node, out)
205
- out.tt do |e|
206
- node.children.each { |n| parse(n, e) }
198
+ def error_parse(node, out)
199
+ text = node.to_xml.gsub(/</, "&lt;").gsub(/>/, "&gt;")
200
+ out.para do |p|
201
+ p.b(**{ role: "strong" }) { |e| e << text }
207
202
  end
208
203
  end
209
204
 
210
- def strike_parse(node, out)
211
- out.s do |e|
212
- node.children.each { |n| parse(n, e) }
205
+ def variant_parse(node, out)
206
+ if node["lang"] == @lang && node["script"] == @script
207
+ node.children.each { |n| parse(n, out) }
208
+ else
209
+ return if found_matching_variant_sibling(node)
210
+ return unless !node.at("./preceding-sibling::xmlns:variant")
211
+ node.children.each { |n| parse(n, out) }
213
212
  end
214
213
  end
215
214
 
216
- def error_parse(node, out)
217
- text = node.to_xml.gsub(/</, "&lt;").gsub(/>/, "&gt;")
218
- out.para do |p|
219
- p.b(**{ role: "strong" }) { |e| e << text }
215
+ def found_matching_variant_sibling(node)
216
+ prev = node.xpath("./preceding-sibling::xmlns:variant")
217
+ foll = node.xpath("./following-sibling::xmlns:variant")
218
+ found = false
219
+ (prev + foll).each do |n|
220
+ found = true if n["lang"] == @lang && n["script"] == @script
220
221
  end
222
+ found
221
223
  end
222
224
  end
223
225
  end
@@ -0,0 +1,72 @@
1
+ module IsoDoc::Function
2
+ module Inline
3
+ def section_break(body)
4
+ body.br
5
+ end
6
+
7
+ def page_break(out)
8
+ out.br
9
+ end
10
+
11
+ def pagebreak_parse(_node, out)
12
+ out.br
13
+ end
14
+
15
+ def hr_parse(node, out)
16
+ out.hr
17
+ end
18
+
19
+ def br_parse(node, out)
20
+ out.br
21
+ end
22
+
23
+ def index_parse(node, out)
24
+ end
25
+
26
+ def bookmark_parse(node, out)
27
+ out.a **attr_code(id: node["id"])
28
+ end
29
+
30
+ def keyword_parse(node, out)
31
+ out.span **{ class: "keyword" } do |s|
32
+ node.children.each { |n| parse(n, s) }
33
+ end
34
+ end
35
+
36
+ def em_parse(node, out)
37
+ out.i do |e|
38
+ node.children.each { |n| parse(n, e) }
39
+ end
40
+ end
41
+
42
+ def strong_parse(node, out)
43
+ out.b do |e|
44
+ node.children.each { |n| parse(n, e) }
45
+ end
46
+ end
47
+
48
+ def sup_parse(node, out)
49
+ out.sup do |e|
50
+ node.children.each { |n| parse(n, e) }
51
+ end
52
+ end
53
+
54
+ def sub_parse(node, out)
55
+ out.sub do |e|
56
+ node.children.each { |n| parse(n, e) }
57
+ end
58
+ end
59
+
60
+ def tt_parse(node, out)
61
+ out.tt do |e|
62
+ node.children.each { |n| parse(n, e) }
63
+ end
64
+ end
65
+
66
+ def strike_parse(node, out)
67
+ out.s do |e|
68
+ node.children.each { |n| parse(n, e) }
69
+ end
70
+ end
71
+ end
72
+ end
@@ -1,8 +1,11 @@
1
1
  module IsoDoc::Function
2
2
  module Lists
3
+ def ul_attrs(node)
4
+ { id: node["id"], style: keep_style(node) }
5
+ end
3
6
 
4
7
  def ul_parse(node, out)
5
- out.ul **attr_code(id: node["id"]) do |ul|
8
+ out.ul **attr_code(ul_attrs(node)) do |ul|
6
9
  node.children.each { |n| parse(n, ul) }
7
10
  end
8
11
  end
@@ -34,9 +37,12 @@ module IsoDoc::Function
34
37
  ol_style(type)
35
38
  end
36
39
 
40
+ def ol_attrs(node)
41
+ { type: ol_depth(node), id: node["id"], style: keep_style(node) }
42
+ end
43
+
37
44
  def ol_parse(node, out)
38
- style = ol_depth(node)
39
- out.ol **attr_code(type: style, id: node["id"] ) do |ol|
45
+ out.ol **attr_code(ol_attrs(node)) do |ol|
40
46
  node.children.each { |n| parse(n, ol) }
41
47
  end
42
48
  end
@@ -67,12 +73,12 @@ module IsoDoc::Function
67
73
  %w{dt dd}.include? n.name
68
74
  end
69
75
 
70
- def dl_attr(node)
71
- attr_code(id: node["id"])
76
+ def dl_attrs(node)
77
+ attr_code(id: node["id"], style: keep_style(node))
72
78
  end
73
79
 
74
80
  def dl_parse(node, out)
75
- out.dl **dl_attr(node) do |v|
81
+ out.dl **dl_attrs(node) do |v|
76
82
  node.elements.select { |n| dt_dd? n }.each_slice(2) do |dt, dd|
77
83
  v.dt **attr_code(id: dt["id"]) do |term|
78
84
  dt_parse(dt, term)
@@ -5,30 +5,31 @@ module IsoDoc::Function
5
5
  # references anyway; keeping here instead of in IsoDoc::Iso for now
6
6
  def docid_l10n(x)
7
7
  return x if x.nil?
8
- x.gsub(/All Parts/i, @all_parts_lbl.downcase)
8
+ x.gsub(/All Parts/i, @all_parts_lbl.downcase) if @all_parts_lbl
9
+ x
9
10
  end
10
11
 
11
12
  # TODO generate formatted ref if not present
12
- def nonstd_bibitem(list, b, ordinal, bibliography)
13
- list.p **attr_code(iso_bibitem_entry_attrs(b, bibliography)) do |r|
14
- id = bibitem_ref_code(b)
15
- identifier = render_identifier(id)
16
- if bibliography then ref_entry_code(r, ordinal, identifier, id)
13
+ def nonstd_bibitem(list, b, ordinal, biblio)
14
+ list.p **attr_code(iso_bibitem_entry_attrs(b, biblio)) do |ref|
15
+ ids = bibitem_ref_code(b)
16
+ identifiers = render_identifier(ids)
17
+ if biblio then ref_entry_code(ref, ordinal, identifiers, ids)
17
18
  else
18
- identifier = "[#{identifier}]" if id["type"] == "metanorma"
19
- r << "#{identifier}, "
19
+ ref << "#{identifiers[0] || identifiers[1]}, "
20
+ ref << "#{identifiers[1]}, " if identifiers[0] && identifiers[1]
20
21
  end
21
- reference_format(b, r)
22
+ reference_format(b, ref)
22
23
  end
23
24
  end
24
25
 
25
26
  def std_bibitem_entry(list, b, ordinal, biblio)
26
27
  list.p **attr_code(iso_bibitem_entry_attrs(b, biblio)) do |ref|
27
- prefix_bracketed_ref(ref, ordinal) if biblio
28
- id = bibitem_ref_code(b)
29
- identifier = render_identifier(id)
30
- identifier = "[#{identifier}]" if id["type"] == "metanorma" && !biblio
31
- ref << identifier
28
+ ids = bibitem_ref_code(b)
29
+ identifiers = render_identifier(ids)
30
+ prefix_bracketed_ref(ref, "[#{ordinal}]") if biblio
31
+ ref << "#{identifiers[0] || identifiers[1]}"
32
+ ref << ", #{identifiers[1]}" if identifiers[0] && identifiers[1]
32
33
  date_note_process(b, ref)
33
34
  ref << ", "
34
35
  reference_format(b, ref)
@@ -38,29 +39,43 @@ module IsoDoc::Function
38
39
  # if t is just a number, only use that ([1] Non-Standard)
39
40
  # else, use both ordinal, as prefix, and t
40
41
  def ref_entry_code(r, ordinal, t, id)
41
- if id["type"] == "metanorma"
42
- prefix_bracketed_ref(r, t)
43
- else
44
- prefix_bracketed_ref(r, ordinal)
45
- if !t.empty? && !%w(DOI ISSN ISBN).include?(id["type"])
46
- r << "#{t}, "
47
- end
42
+ prefix_bracketed_ref(r, t[0] || "[#{ordinal}]")
43
+ if t[1]
44
+ r << "#{t[1]}, "
48
45
  end
49
46
  end
50
47
 
48
+ def pref_ref_code(b)
49
+ b.at(ns("./docidentifier[not(@type = 'DOI' or @type = 'metanorma' "\
50
+ "or @type = 'ISSN' or @type = 'ISBN' or @type = 'rfc-anchor')]"))
51
+ end
52
+
53
+ # returns [metanorma, non-metanorma, DOI/ISSN/ISBN] identifiers
51
54
  def bibitem_ref_code(b)
52
55
  id = b.at(ns("./docidentifier[@type = 'metanorma']"))
53
- id ||= b.at(ns("./docidentifier[not(@type = 'DOI' or @type = 'metanorma' "\
54
- "or @type = 'ISSN' or @type = 'ISBN')]"))
55
- id ||= b.at(ns("./docidentifier"))
56
- return id if id
56
+ id1 = pref_ref_code(b)
57
+ id2 = b.at(ns("./docidentifier[@type = 'DOI' or @type = 'ISSN' or @type = 'ISBN']"))
58
+ return [id, id1, id2] if id || id1 || id2
57
59
  id = Nokogiri::XML::Node.new("docidentifier", b.document)
58
60
  id << "(NO ID)"
59
- id
61
+ [nil, id, nil]
62
+ end
63
+
64
+ def bracket_if_num(x)
65
+ return nil if x.nil?
66
+ x = x.text.sub(/^\[/, "").sub(/\]$/, "")
67
+ return "[#{x}]" if /^\d+$/.match(x)
68
+ x
60
69
  end
61
70
 
62
71
  def render_identifier(id)
63
- docid_prefix(id["type"], id.text.sub(/^\[/, "").sub(/\]$/, ""))
72
+ [
73
+ bracket_if_num(id[0]),
74
+ id[1].nil? ? nil :
75
+ docid_prefix(id[1]["type"], id[1].text.sub(/^\[/, "").sub(/\]$/, "")),
76
+ id[2].nil? ? nil :
77
+ docid_prefix(id[2]["type"], id[2].text.sub(/^\[/, "").sub(/\]$/, "")),
78
+ ]
64
79
  end
65
80
 
66
81
  def docid_prefix(prefix, docid)
@@ -70,13 +85,12 @@ module IsoDoc::Function
70
85
 
71
86
  def omit_docid_prefix(prefix)
72
87
  return true if prefix.nil? || prefix.empty?
73
- return %w(ISO IEC ITU metanorma).include? prefix
88
+ return %w(ISO IEC ITU W3C metanorma).include? prefix
74
89
  end
75
90
 
76
91
  def date_note_process(b, ref)
77
- date_note = b.at(ns("./note[text()][contains(.,'ISO DATE:')]"))
92
+ date_note = b.at(ns("./note[@type = 'ISO DATE']"))
78
93
  return if date_note.nil?
79
- date_note.content = date_note.content.gsub(/ISO DATE: /, "")
80
94
  date_note.children.first.replace("<p>#{date_note.content}</p>")
81
95
  footnote_parse(date_note, ref)
82
96
  end
@@ -100,7 +114,7 @@ module IsoDoc::Function
100
114
  end
101
115
 
102
116
  def prefix_bracketed_ref(ref, text)
103
- ref << "[#{text}]"
117
+ ref << text.to_s
104
118
  insert_tab(ref, 1)
105
119
  end
106
120
 
@@ -146,8 +160,7 @@ module IsoDoc::Function
146
160
  end
147
161
 
148
162
  def norm_ref(isoxml, out, num)
149
- q = "//bibliography/references[title = 'Normative References' or "\
150
- "title = 'Normative references']"
163
+ q = "//bibliography/references[@normative = 'true']"
151
164
  f = isoxml.at(ns(q)) or return num
152
165
  out.div do |div|
153
166
  num = num + 1
@@ -157,8 +170,8 @@ module IsoDoc::Function
157
170
  num
158
171
  end
159
172
 
160
- BIBLIOGRAPHY_XPATH = "//bibliography/clause[title = 'Bibliography'] | "\
161
- "//bibliography/references[title = 'Bibliography']".freeze
173
+ BIBLIOGRAPHY_XPATH = "//bibliography/clause[.//references[@normative = 'false']] | "\
174
+ "//bibliography/references[@normative = 'false']".freeze
162
175
 
163
176
  def bibliography(isoxml, out)
164
177
  f = isoxml.at(ns(BIBLIOGRAPHY_XPATH)) || return
@@ -188,12 +201,11 @@ module IsoDoc::Function
188
201
 
189
202
  def reference_names(ref)
190
203
  isopub = ref.at(ns(ISO_PUBLISHER_XPATH))
191
- docid = bibitem_ref_code(ref)
192
- prefix = docid["type"]
204
+ ids = bibitem_ref_code(ref)
205
+ identifiers = render_identifier(ids)
193
206
  date = ref.at(ns("./date[@type = 'published']"))
194
207
  allparts = ref.at(ns("./extent[@type='part'][referenceFrom='all']"))
195
- reference = format_ref(docid_l10n(docid.text), prefix, isopub, date,
196
- allparts)
208
+ reference = docid_l10n(identifiers[0] || identifiers[1])
197
209
  @anchors[ref["id"]] = { xref: reference }
198
210
  end
199
211