metanorma-iso 2.0.7 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/lib/asciidoctor/iso/base.rb +0 -1
  3. data/lib/asciidoctor/iso/cleanup.rb +0 -1
  4. data/lib/asciidoctor/iso/converter.rb +0 -1
  5. data/lib/asciidoctor/iso/deprecated.rb +4 -2
  6. data/lib/asciidoctor/iso/front.rb +0 -1
  7. data/lib/asciidoctor/iso/front_id.rb +0 -1
  8. data/lib/asciidoctor/iso/section.rb +0 -1
  9. data/lib/asciidoctor/iso/validate.rb +0 -1
  10. data/lib/asciidoctor/iso/validate_image.rb +0 -1
  11. data/lib/asciidoctor/iso/validate_requirements.rb +0 -1
  12. data/lib/asciidoctor/iso/validate_section.rb +0 -1
  13. data/lib/asciidoctor/iso/validate_style.rb +0 -1
  14. data/lib/asciidoctor/iso/validate_title.rb +0 -1
  15. data/lib/html2doc/lists.rb +37 -0
  16. data/lib/isodoc/iso/html/html_iso_titlepage.html +7 -2
  17. data/lib/isodoc/iso/html/isodoc-dis.css +196 -156
  18. data/lib/isodoc/iso/html/isodoc-dis.scss +193 -156
  19. data/lib/isodoc/iso/html/word_iso_intro-dis.html +7 -0
  20. data/lib/isodoc/iso/html/word_iso_titlepage-dis.html +3 -2
  21. data/lib/isodoc/iso/html/word_iso_titlepage.html +8 -2
  22. data/lib/isodoc/iso/html/wordstyle-dis.css +204 -34
  23. data/lib/isodoc/iso/html/wordstyle-dis.scss +198 -34
  24. data/lib/isodoc/iso/i18n-en.yaml +2 -1
  25. data/lib/isodoc/iso/i18n-fr.yaml +1 -0
  26. data/lib/isodoc/iso/i18n-ru.yaml +1 -0
  27. data/lib/isodoc/iso/i18n-zh-Hans.yaml +1 -0
  28. data/lib/isodoc/iso/index.rb +1 -1
  29. data/lib/isodoc/iso/init.rb +17 -1
  30. data/lib/isodoc/iso/iso.amendment.xsl +726 -299
  31. data/lib/isodoc/iso/iso.international-standard.xsl +726 -299
  32. data/lib/isodoc/iso/metadata.rb +75 -63
  33. data/lib/isodoc/iso/presentation_inline.rb +90 -0
  34. data/lib/isodoc/iso/presentation_xml_convert.rb +39 -100
  35. data/lib/isodoc/iso/presentation_xref.rb +126 -0
  36. data/lib/isodoc/iso/word_cleanup.rb +16 -2
  37. data/lib/isodoc/iso/word_convert.rb +27 -10
  38. data/lib/isodoc/iso/word_dis_convert.rb +174 -0
  39. data/lib/isodoc/iso/xref.rb +50 -30
  40. data/lib/metanorma/iso/biblio.rng +62 -10
  41. data/lib/metanorma/iso/boilerplate-fr.xml +1 -1
  42. data/lib/metanorma/iso/boilerplate-ru.xml +1 -3
  43. data/lib/metanorma/iso/boilerplate.xml +1 -3
  44. data/lib/metanorma/iso/cleanup.rb +7 -6
  45. data/lib/metanorma/iso/front_id.rb +28 -11
  46. data/lib/metanorma/iso/isodoc.rng +56 -0
  47. data/lib/metanorma/iso/version.rb +1 -1
  48. data/lib/metanorma-iso.rb +1 -0
  49. data/lib/relaton/render/config.yml +4 -0
  50. data/lib/relaton/render/general.rb +13 -0
  51. data/metanorma-iso.gemspec +1 -1
  52. data/spec/isodoc/amd_spec.rb +15 -14
  53. data/spec/isodoc/blocks_spec.rb +286 -179
  54. data/spec/isodoc/i18n_spec.rb +296 -133
  55. data/spec/isodoc/inline_spec.rb +35 -42
  56. data/spec/isodoc/iso_spec.rb +43 -27
  57. data/spec/isodoc/postproc_spec.rb +25 -0
  58. data/spec/isodoc/ref_spec.rb +66 -69
  59. data/spec/isodoc/section_spec.rb +78 -76
  60. data/spec/isodoc/table_spec.rb +2 -2
  61. data/spec/isodoc/terms_spec.rb +2 -2
  62. data/spec/isodoc/word_dis_spec.rb +760 -0
  63. data/spec/isodoc/xref_spec.rb +51 -51
  64. data/spec/metanorma/amd_spec.rb +39 -16
  65. data/spec/metanorma/base_spec.rb +17 -9
  66. data/spec/metanorma/blocks_spec.rb +4 -4
  67. data/spec/metanorma/cleanup_spec.rb +11 -11
  68. data/spec/metanorma/section_spec.rb +3 -3
  69. data/spec/spec_helper.rb +5 -2
  70. data/spec/vcr_cassettes/withdrawn_iso.yml +26 -26
  71. metadata +11 -5
  72. data/spec/vcr_cassettes/docrels.yml +0 -385
@@ -21,8 +21,7 @@ module IsoDoc
21
21
  stage = "DTS" if stage == "DIS"
22
22
  stage = "FDTS" if stage == "FDIS"
23
23
  end
24
- %w(PWI NWIP WD CD).include?(stage) && iter and
25
- stage += iter
24
+ %w(PWI NWIP WD CD).include?(stage) && iter and stage += iter
26
25
  stage = "Pre#{stage}" if /^0\./.match?(draft)
27
26
  stage
28
27
  end
@@ -32,9 +31,7 @@ module IsoDoc
32
31
  set(:unpublished, false)
33
32
  revdate = isoxml.at(ns("//bibdata/version/revision-date"))
34
33
  set(:revdate, revdate&.text)
35
- if docstatus
36
- docstatus1(isoxml, docstatus)
37
- end
34
+ docstatus and docstatus1(isoxml, docstatus)
38
35
  end
39
36
 
40
37
  def docstatus1(isoxml, docstatus)
@@ -56,10 +53,14 @@ module IsoDoc
56
53
  end
57
54
 
58
55
  def docid(isoxml, _out)
59
- set(:docnumber, isoxml&.at(ns("//bibdata/docidentifier[@type = 'ISO']"))&.text)
60
- set(:tc_docnumber, isoxml.xpath(ns("//bibdata/docidentifier[@type = 'iso-tc']")).map(&:text))
61
- set(:docnumber_lang, isoxml&.at(ns("//bibdata/docidentifier[@type = 'iso-with-lang']"))&.text)
62
- set(:docnumber_reference, isoxml&.at(ns("//bibdata/docidentifier[@type = 'iso-reference']"))&.text)
56
+ set(:tc_docnumber, isoxml
57
+ .xpath(ns("//bibdata/docidentifier[@type = 'iso-tc']")).map(&:text))
58
+ { docnumber: "ISO", docnumber_lang: "iso-with-lang",
59
+ docnumber_reference: "iso-reference",
60
+ docnumber_undated: "iso-undated" }.each do |k, v|
61
+ set(k,
62
+ isoxml&.at(ns("//bibdata/docidentifier[@type = '#{v}']"))&.text)
63
+ end
63
64
  end
64
65
 
65
66
  # we don't leave this to i18n.rb, because we have both English and
@@ -87,55 +88,63 @@ module IsoDoc
87
88
  end
88
89
  end
89
90
 
90
- def part_title(part, partnum, subpartnum, lang)
91
+ def part_title(part, titlenums, lang)
91
92
  return "" unless part
92
93
 
93
94
  suffix = @c.encode(part.text, :hexadecimal)
94
- partnum = "#{partnum}–#{subpartnum}" if partnum && subpartnum
95
- suffix = "#{part_label(lang)} #{partnum}: " + suffix if partnum
95
+ p = titlenums[:part]
96
+ titlenums[:part] && titlenums[:subpart] and
97
+ p = "#{titlenums[:part]}–#{titlenums[:subpart]}"
98
+ titlenums[:part] and
99
+ suffix = "#{part_label(lang)} #{p}: " + suffix
96
100
  suffix
97
101
  end
98
102
 
99
- def part_prefix(partnum, subpartnum, lang)
100
- partnum = "#{partnum}–#{subpartnum}" if partnum && subpartnum
101
- "#{part_label(lang)} #{partnum}"
103
+ def part_prefix(titlenums, lang)
104
+ p = titlenums[:part]
105
+ titlenums[:part] && titlenums[:subpart] and
106
+ p = "#{titlenums[:part]}–#{titlenums[:subpart]}"
107
+ "#{part_label(lang)} #{p}"
102
108
  end
103
109
 
104
- def amd_prefix(num, lang)
105
- "#{amd_label(lang)} #{num}"
110
+ def amd_prefix(titlenums, lang)
111
+ "#{amd_label(lang)} #{titlenums[:amd]}"
106
112
  end
107
113
 
108
- def corr_prefix(num, lang)
109
- "#{corr_label(lang)} #{num}"
114
+ def corr_prefix(titlenums, lang)
115
+ "#{corr_label(lang)} #{titlenums[:corr]}"
110
116
  end
111
117
 
112
- def compose_title(main, intro, part, partnum, subpartnum, lang)
113
- main = main.nil? ? "" : @c.encode(main.text, :hexadecimal)
114
- intro &&
115
- main = "#{@c.encode(intro.text, :hexadecimal)} — #{main}"
116
- if part
117
- suffix = part_title(part, partnum, subpartnum, lang)
118
+ def compose_title(tparts, tnums, lang)
119
+ main = ""
120
+ tparts[:main].nil? or
121
+ main = @c.encode(tparts[:main].text, :hexadecimal)
122
+ tparts[:intro] &&
123
+ main = "#{@c.encode(tparts[:intro].text,
124
+ :hexadecimal)} — #{main}"
125
+ if tparts[:part]
126
+ suffix = part_title(tparts[:part], tnums, lang)
118
127
  main = "#{main} — #{suffix}"
119
128
  end
120
129
  main
121
130
  end
122
131
 
123
132
  def title_nums(isoxml)
124
- [isoxml.at(ns("//bibdata//project-number/@part")),
125
- isoxml.at(ns("//bibdata//project-number/@subpart")),
126
- isoxml.at(ns("//bibdata//project-number/@amendment")),
127
- isoxml.at(ns("//bibdata//project-number/@corrigendum"))]
133
+ { part: isoxml.at(ns("//bibdata//project-number/@part")),
134
+ subpart: isoxml.at(ns("//bibdata//project-number/@subpart")),
135
+ amd: isoxml.at(ns("//bibdata//project-number/@amendment")),
136
+ corr: isoxml.at(ns("//bibdata//project-number/@corrigendum")) }
128
137
  end
129
138
 
130
139
  def title_parts(isoxml, lang)
131
- [isoxml.at(ns("//bibdata//title[@type='title-intro' and "\
132
- "@language='#{lang}']")),
133
- isoxml.at(ns("//bibdata//title[@type='title-main' and "\
134
- "@language='#{lang}']")),
135
- isoxml.at(ns("//bibdata//title[@type='title-part' and "\
136
- "@language='#{lang}']")),
137
- isoxml.at(ns("//bibdata//title[@type='title-amd' and "\
138
- "@language='#{lang}']"))]
140
+ { intro: isoxml.at(ns("//bibdata//title[@type='title-intro' and "\
141
+ "@language='#{lang}']")),
142
+ main: isoxml.at(ns("//bibdata//title[@type='title-main' and "\
143
+ "@language='#{lang}']")),
144
+ part: isoxml.at(ns("//bibdata//title[@type='title-part' and "\
145
+ "@language='#{lang}']")),
146
+ amd: isoxml.at(ns("//bibdata//title[@type='title-amd' and "\
147
+ "@language='#{lang}']")) }
139
148
  end
140
149
 
141
150
  def title(isoxml, _out)
@@ -144,40 +153,43 @@ module IsoDoc
144
153
  when "ru" then "ru"
145
154
  else "en"
146
155
  end
147
- intro, main, part, amd = title_parts(isoxml, lang)
148
- partnumber, subpartnumber, amdnumber, corrnumber = title_nums(isoxml)
156
+ # intro, main, part, amd = title_parts(isoxml, lang)
157
+ tp = title_parts(isoxml, lang)
158
+ tn = title_nums(isoxml)
149
159
 
150
- set(:doctitlemain, @c.encode(main ? main.text : "", :hexadecimal))
151
- main = compose_title(main, intro, part, partnumber, subpartnumber, lang)
160
+ set(:doctitlemain,
161
+ @c.encode(tp[:main] ? tp[:main].text : "", :hexadecimal))
162
+ main = compose_title(tp, tn, lang)
152
163
  set(:doctitle, main)
153
- if intro
164
+ tp[:intro] and
154
165
  set(:doctitleintro,
155
- @c.encode(intro ? intro.text : "", :hexadecimal))
156
- end
157
- set(:doctitlepartlabel, part_prefix(partnumber, subpartnumber, lang))
158
- set(:doctitlepart, @c.encode(part.text, :hexadecimal)) if part
159
- set(:doctitleamdlabel, amd_prefix(amdnumber, lang)) if amdnumber
160
- set(:doctitleamd, @c.encode(amd.text, :hexadecimal)) if amd
161
- set(:doctitlecorrlabel, corr_prefix(corrnumber, lang)) if corrnumber
166
+ @c.encode(tp[:intro] ? tp[:intro].text : "", :hexadecimal))
167
+ set(:doctitlepartlabel, part_prefix(tn, lang))
168
+ set(:doctitlepart, @c.encode(tp[:part].text, :hexadecimal)) if tp[:part]
169
+ set(:doctitleamdlabel, amd_prefix(tn, lang)) if tn[:amd]
170
+ set(:doctitleamd, @c.encode(tp[:amd].text, :hexadecimal)) if tp[:amd]
171
+ set(:doctitlecorrlabel, corr_prefix(tn, lang)) if tn[:corr]
162
172
  end
163
173
 
164
174
  def subtitle(isoxml, _out)
165
175
  lang = @lang == "en" ? "fr" : "en"
166
- intro, main, part, amd = title_parts(isoxml, lang)
167
- partnumber, subpartnumber, amdnumber, corrnumber = title_nums(isoxml)
176
+ tp = title_parts(isoxml, lang)
177
+ tn = title_nums(isoxml)
168
178
 
169
- set(:docsubtitlemain, @c.encode(main ? main.text : "", :hexadecimal))
170
- main = compose_title(main, intro, part, partnumber, subpartnumber, lang)
179
+ set(:docsubtitlemain,
180
+ @c.encode(tp[:main] ? tp[:main].text : "", :hexadecimal))
181
+ main = compose_title(tp, tn, lang)
171
182
  set(:docsubtitle, main)
172
- if intro
183
+ tp[:intro] and
173
184
  set(:docsubtitleintro,
174
- @c.encode(intro ? intro.text : "", :hexadecimal))
175
- end
176
- set(:docsubtitlepartlabel, part_prefix(partnumber, subpartnumber, lang))
177
- set(:docsubtitlepart, @c.encode(part.text, :hexadecimal)) if part
178
- set(:docsubtitleamdlabel, amd_prefix(amdnumber, lang)) if amdnumber
179
- set(:docsubtitleamd, @c.encode(amd.text, :hexadecimal)) if amd
180
- set(:docsubtitlecorrlabel, corr_prefix(corrnumber, lang)) if corrnumber
185
+ @c.encode(tp[:intro] ? tp[:intro].text : "", :hexadecimal))
186
+ set(:docsubtitlepartlabel, part_prefix(tn, lang))
187
+ tp[:part] and
188
+ set(:docsubtitlepart,
189
+ @c.encode(tp[:part].text, :hexadecimal))
190
+ set(:docsubtitleamdlabel, amd_prefix(tn, lang)) if tn[:amd]
191
+ set(:docsubtitleamd, @c.encode(tp[:amd].text, :hexadecimal)) if tp[:amd]
192
+ set(:docsubtitlecorrlabel, corr_prefix(tn, lang)) if tn[:corr]
181
193
  end
182
194
 
183
195
  def author(xml, _out)
@@ -231,8 +243,8 @@ module IsoDoc
231
243
  ics = []
232
244
  isoxml.xpath(ns("//bibdata/ext/ics/code")).each { |i| ics << i.text }
233
245
  set(:ics, ics.empty? ? nil : ics.join(", "))
234
- a = isoxml.at(ns("//bibdata/ext/horizontal")) and set(:horizontal,
235
- a.text)
246
+ a = isoxml.at(ns("//bibdata/ext/horizontal")) and
247
+ set(:horizontal, a.text)
236
248
  end
237
249
  end
238
250
  end
@@ -0,0 +1,90 @@
1
+ module IsoDoc
2
+ module Iso
3
+ class PresentationXMLConvert < IsoDoc::PresentationXMLConvert
4
+ def xref_init(lang, script, klass, labels, options)
5
+ @xrefs = Xref.new(lang, script, klass, labels, options)
6
+ end
7
+
8
+ def eref_delim(delim, type)
9
+ if delim == ";" then ";"
10
+ else type == "list" ? " " : delim
11
+ end
12
+ end
13
+
14
+ def can_conflate_eref_rendering?(refs)
15
+ super or return false
16
+
17
+ first = subclause?(nil, refs.first.at(ns("./locality/@type"))&.text,
18
+ refs.first.at(ns("./locality/referenceFrom"))&.text)
19
+ refs.all? do |r|
20
+ subclause?(nil, r.at(ns("./locality/@type"))&.text,
21
+ r.at(ns("./locality/referenceFrom"))&.text) == first
22
+ end
23
+ end
24
+
25
+ def locality_delimiter(loc)
26
+ loc&.next_element&.attribute("type")&.text == "list" and return " "
27
+ super
28
+ end
29
+
30
+ def eref_localities_conflated(refs, target, node)
31
+ droploc = node["droploc"]
32
+ node["droploc"] = true
33
+ ret = resolve_eref_connectives(eref_locality_stacks(refs, target,
34
+ node))
35
+ node["droploc"] = droploc
36
+ eref_localities1(target,
37
+ prefix_clause(target, refs.first.at(ns("./locality"))),
38
+ l10n(ret[1..-1].join), nil, node, @lang)
39
+ end
40
+
41
+ def prefix_clause(target, loc)
42
+ loc["type"] == "clause" or return loc["type"]
43
+
44
+ if subclause?(target, loc["type"],
45
+ loc&.at(ns("./referenceFrom"))&.text)
46
+ ""
47
+ else
48
+ "clause"
49
+ end
50
+ end
51
+
52
+ def subclause?(target, type, from)
53
+ (from&.match?(/\./) && type == "clause") ||
54
+ type == "list" || target&.match(/^IEV$|^IEC 60050-/)
55
+ end
56
+
57
+ def eref_localities1_zh(target, type, from, upto, node)
58
+ ret = " 第#{from}" if from
59
+ ret += "&ndash;#{upto}" if upto
60
+ if node["droploc"] != "true" && !subclause?(target, type, from)
61
+ ret += eref_locality_populate(type, node)
62
+ end
63
+ ret += ")" if type == "list"
64
+ ret
65
+ end
66
+
67
+ def eref_localities1(target, type, from, upto, node, lang = "en")
68
+ return nil if type == "anchor"
69
+
70
+ type = type.downcase
71
+ lang == "zh" and
72
+ return l10n(eref_localities1_zh(target, type, from, upto, node))
73
+ ret = if node["droploc"] != "true" && !subclause?(target, type,
74
+ from)
75
+ eref_locality_populate(type, node)
76
+ else ""
77
+ end
78
+ ret += " #{from}" if from
79
+ ret += "&ndash;#{upto}" if upto
80
+ ret += ")" if type == "list"
81
+ l10n(ret)
82
+ end
83
+
84
+ def prefix_container(container, linkend, target)
85
+ delim = @xrefs.anchor(target, :type) == "listitem" ? " " : ", "
86
+ l10n(@xrefs.anchor(container, :xref) + delim + linkend)
87
+ end
88
+ end
89
+ end
90
+ end
@@ -1,11 +1,15 @@
1
1
  require_relative "init"
2
2
  require "isodoc"
3
3
  require_relative "index"
4
+ require_relative "presentation_inline"
5
+ require_relative "presentation_xref"
6
+ require_relative "../../relaton/render/general"
4
7
 
5
8
  module IsoDoc
6
9
  module Iso
7
10
  class PresentationXMLConvert < IsoDoc::PresentationXMLConvert
8
11
  def convert1(docxml, filename, dir)
12
+ @iso_class = instance_of?(IsoDoc::Iso::PresentationXMLConvert)
9
13
  if amd(docxml)
10
14
  @oldsuppressheadingnumbers = @suppressheadingnumbers
11
15
  @suppressheadingnumbers = true
@@ -22,13 +26,7 @@ module IsoDoc
22
26
  amd(isoxml) and @suppressheadingnumbers = true
23
27
  end
24
28
 
25
- def xref_init(lang, script, klass, labels, options)
26
- @xrefs = Xref.new(lang, script, klass, labels, options)
27
- end
28
-
29
29
  def figure1(node)
30
- return if labelled_ancestor(node) && node.ancestors("figure").empty?
31
-
32
30
  lbl = @xrefs.anchor(node["id"], :label, false) or return
33
31
  figname = node.parent.name == "figure" ? "" : "#{@i18n.figure} "
34
32
  connective = node.parent.name == "figure" ? "&nbsp; " : "&nbsp;&mdash; "
@@ -37,93 +35,12 @@ module IsoDoc
37
35
 
38
36
  def example1(node)
39
37
  n = @xrefs.get[node["id"]]
40
- lbl = if n.nil? || n[:label].nil? || n[:label].empty?
41
- @i18n.example
42
- else
43
- l10n("#{@i18n.example} #{n[:label]}")
38
+ lbl = if n.nil? || blank?(n[:label]) then @i18n.example
39
+ else l10n("#{@i18n.example} #{n[:label]}")
44
40
  end
45
41
  prefix_name(node, "&nbsp;&mdash; ", lbl, "name")
46
42
  end
47
43
 
48
- def eref_delim(delim, type)
49
- if delim == ";" then ";"
50
- else type == "list" ? " " : delim
51
- end
52
- end
53
-
54
- def can_conflate_eref_rendering?(refs)
55
- super or return false
56
-
57
- first = subclause?(nil, refs.first.at(ns("./locality/@type"))&.text,
58
- refs.first.at(ns("./locality/referenceFrom"))&.text)
59
- refs.all? do |r|
60
- subclause?(nil, r.at(ns("./locality/@type"))&.text,
61
- r.at(ns("./locality/referenceFrom"))&.text) == first
62
- end
63
- end
64
-
65
- def locality_delimiter(loc)
66
- loc&.next_element&.attribute("type")&.text == "list" and return " "
67
- super
68
- end
69
-
70
- def eref_localities_conflated(refs, target, node)
71
- droploc = node["droploc"]
72
- node["droploc"] = true
73
- ret = resolve_eref_connectives(eref_locality_stacks(refs, target,
74
- node))
75
- node["droploc"] = droploc
76
- eref_localities1(target,
77
- prefix_clause(target, refs.first.at(ns("./locality"))),
78
- l10n(ret[1..-1].join), nil, node, @lang)
79
- end
80
-
81
- def prefix_clause(target, loc)
82
- loc["type"] == "clause" or return loc["type"]
83
-
84
- if subclause?(target, loc["type"], loc&.at(ns("./referenceFrom"))&.text)
85
- ""
86
- else
87
- "clause"
88
- end
89
- end
90
-
91
- def subclause?(target, type, from)
92
- (from&.match?(/\./) && type == "clause") ||
93
- type == "list" || target&.match(/^IEV$|^IEC 60050-/)
94
- end
95
-
96
- def eref_localities1_zh(target, type, from, upto, node)
97
- ret = " 第#{from}" if from
98
- ret += "&ndash;#{upto}" if upto
99
- if node["droploc"] != "true" && !subclause?(target, type, from)
100
- ret += eref_locality_populate(type, node)
101
- end
102
- ret += ")" if type == "list"
103
- ret
104
- end
105
-
106
- def eref_localities1(target, type, from, upto, node, lang = "en")
107
- return nil if type == "anchor"
108
-
109
- type = type.downcase
110
- lang == "zh" and
111
- return l10n(eref_localities1_zh(target, type, from, upto, node))
112
- ret = if node["droploc"] != "true" && !subclause?(target, type, from)
113
- eref_locality_populate(type, node)
114
- else ""
115
- end
116
- ret += " #{from}" if from
117
- ret += "&ndash;#{upto}" if upto
118
- ret += ")" if type == "list"
119
- l10n(ret)
120
- end
121
-
122
- def prefix_container(container, linkend, target)
123
- delim = @xrefs.anchor(target, :type) == "listitem" ? " " : ", "
124
- l10n(@xrefs.anchor(container, :xref) + delim + linkend)
125
- end
126
-
127
44
  def example_span_label(_node, div, name)
128
45
  return if name.nil?
129
46
 
@@ -143,8 +60,7 @@ module IsoDoc
143
60
  def clause(docxml)
144
61
  docxml.xpath(ns("//clause[not(ancestor::annex)] | "\
145
62
  "//terms | //definitions | //references | "\
146
- "//preface/introduction[clause]"))
147
- .each do |f|
63
+ "//preface/introduction[clause]")).each do |f|
148
64
  clause1(f)
149
65
  end
150
66
  end
@@ -160,9 +76,7 @@ module IsoDoc
160
76
  def concept_term(docxml)
161
77
  docxml.xpath(ns("//term")).each do |f|
162
78
  m = {}
163
- f.xpath(ns(".//concept")).each do |c|
164
- concept_term1(c, m)
165
- end
79
+ f.xpath(ns(".//concept")).each { |c| concept_term1(c, m) }
166
80
  end
167
81
  end
168
82
 
@@ -179,12 +93,11 @@ module IsoDoc
179
93
  end
180
94
 
181
95
  def concept1_ref_content(ref)
182
- if ref.name == "termref"
183
- ref.replace(@i18n.term_defined_in.sub(/%/,
184
- ref.to_xml))
185
- else
186
- ref.replace("(#{ref.to_xml})")
187
- end
96
+ repl = if ref.name == "termref"
97
+ @i18n.term_defined_in.sub(/%/, ref.to_xml)
98
+ else "(#{ref.to_xml})"
99
+ end
100
+ ref.replace(repl)
188
101
  end
189
102
 
190
103
  def concept1(node)
@@ -246,6 +159,32 @@ module IsoDoc
246
159
  super
247
160
  end
248
161
 
162
+ def admonition1(elem)
163
+ super
164
+ return unless n = elem.at(ns("./name"))
165
+
166
+ p = n.next_element
167
+ return unless p.name == "p"
168
+
169
+ p.children.first.previous = admonition_name(n.remove.children.to_xml)
170
+ end
171
+
172
+ def admonition_name(xml)
173
+ "#{xml} &#x2014; "
174
+ end
175
+
176
+ def bibrenderer
177
+ ::Relaton::Render::Iso::General.new(language: @lang, i18nhash: @i18n.get)
178
+ end
179
+
180
+ def bibrender(xml)
181
+ unless xml.at(ns("./formattedref"))
182
+ xml.children =
183
+ "#{bibrenderer.render(xml.to_xml)}"\
184
+ "#{xml.xpath(ns('./docidentifier | ./uri | ./note')).to_xml}"
185
+ end
186
+ end
187
+
249
188
  include Init
250
189
  end
251
190
  end
@@ -0,0 +1,126 @@
1
+ module IsoDoc
2
+ module Iso
3
+ class PresentationXMLConvert < IsoDoc::PresentationXMLConvert
4
+ def xref_init(lang, script, klass, labels, options)
5
+ @xrefs = Xref.new(lang, script, klass, labels, options)
6
+ end
7
+
8
+ def eref_delim(delim, type)
9
+ if delim == ";" then ";"
10
+ else type == "list" ? " " : delim
11
+ end
12
+ end
13
+
14
+ def can_conflate_eref_rendering?(refs)
15
+ super or return false
16
+
17
+ first = subclause?(nil, refs.first.at(ns("./locality/@type"))&.text,
18
+ refs.first.at(ns("./locality/referenceFrom"))&.text)
19
+ refs.all? do |r|
20
+ subclause?(nil, r.at(ns("./locality/@type"))&.text,
21
+ r.at(ns("./locality/referenceFrom"))&.text) == first
22
+ end
23
+ end
24
+
25
+ def locality_delimiter(loc)
26
+ loc&.next_element&.attribute("type")&.text == "list" and return " "
27
+ super
28
+ end
29
+
30
+ def eref_localities_conflated(refs, target, node)
31
+ droploc = node["droploc"]
32
+ node["droploc"] = true
33
+ ret = resolve_eref_connectives(eref_locality_stacks(refs, target,
34
+ node))
35
+ node["droploc"] = droploc
36
+ eref_localities1(target,
37
+ prefix_clause(target, refs.first.at(ns("./locality"))),
38
+ l10n(ret[1..-1].join), nil, node, @lang)
39
+ end
40
+
41
+ def prefix_clause(target, loc)
42
+ loc["type"] == "clause" or return loc["type"]
43
+
44
+ if subclause?(target, loc["type"],
45
+ loc&.at(ns("./referenceFrom"))&.text)
46
+ ""
47
+ else "clause"
48
+ end
49
+ end
50
+
51
+ def subclause?(target, type, from)
52
+ (from&.match?(/\./) && type == "clause") ||
53
+ type == "list" ||
54
+ target&.gsub(/<[^>]+>/, "")&.match(/^IEV$|^IEC 60050-/)
55
+ end
56
+
57
+ LOCALITY2SPAN = {
58
+ annex: "citeapp",
59
+ dunno: "citebase",
60
+ dunno2: "citebib",
61
+ dunno3: "citebox",
62
+ dunno4: "citeen",
63
+ dunno5: "citeeq",
64
+ figure: "citefig",
65
+ dunno6: "citefn",
66
+ clause: "citesec",
67
+ dunno7: "citesection",
68
+ table: "citetbl",
69
+ dunno8: "citetfn",
70
+ }.freeze
71
+
72
+ def locality_span_wrap(ret, type)
73
+ type or return ret
74
+ m = /^(\s*)(.+?)(\s*)$/.match(ret) or return ret
75
+ ret = [m[1], m[2], m[3]]
76
+ spanclass = LOCALITY2SPAN[type.to_sym] and
77
+ ret[1] = "<span class='#{spanclass}'>#{ret[1]}</span>"
78
+ ret.join
79
+ end
80
+
81
+ def eref_localities1_zh(target, type, from, upto, node)
82
+ ret = " 第#{from}" if from
83
+ ret += "&ndash;#{upto}" if upto
84
+ node["droploc"] != "true" && !subclause?(target, type, from) and
85
+ ret += eref_locality_populate(type, node)
86
+ ret += ")" if type == "list"
87
+ locality_span_wrap(ret, type)
88
+ end
89
+
90
+ def eref_localities1(target, type, from, upto, node, lang = "en")
91
+ return nil if type == "anchor"
92
+
93
+ type = type.downcase
94
+ lang == "zh" and
95
+ return l10n(eref_localities1_zh(target, type, from, upto, node))
96
+ ret = ""
97
+ node["droploc"] != "true" && !subclause?(target, type, from) and
98
+ ret = eref_locality_populate(type, node)
99
+ ret += " #{from}" if from
100
+ ret += "&ndash;#{upto}" if upto
101
+ ret += ")" if type == "list"
102
+ ret = l10n(ret)
103
+ locality_span_wrap(ret, type)
104
+ end
105
+
106
+ def prefix_container(container, linkend, target)
107
+ delim = @xrefs.anchor(target, :type) == "listitem" ? " " : ", "
108
+ l10n(@xrefs.anchor(container, :xref) + delim + linkend)
109
+ end
110
+
111
+ def expand_citeas(text)
112
+ std_docid_semantic(super)
113
+ end
114
+
115
+ def anchor_value(id)
116
+ locality_span_wrap(super, @xrefs.anchor(id, :subtype) ||
117
+ @xrefs.anchor(id, :type))
118
+ end
119
+
120
+ def anchor_linkend1(node)
121
+ locality_span_wrap(super, @xrefs.anchor(node["target"], :subtype) ||
122
+ @xrefs.anchor(node["target"], :type))
123
+ end
124
+ end
125
+ end
126
+ end
@@ -65,7 +65,7 @@ module IsoDoc
65
65
  insert = docxml.at("//div[@id = 'boilerplate-license-destination']")
66
66
  auth = docxml&.at("//div[@class = 'boilerplate-license']")&.remove
67
67
  auth&.xpath(".//p[not(@class)]")&.each { |p| p["class"] = "zzWarning" }
68
- auth and insert.children = auth
68
+ auth and insert and insert.children = auth
69
69
  insert = docxml.at("//div[@id = 'boilerplate-copyright-destination']")
70
70
  auth = docxml&.at("//div[@class = 'boilerplate-copyright']")&.remove
71
71
  auth&.xpath(".//p[not(@class)]")&.each do |p|
@@ -80,7 +80,8 @@ module IsoDoc
80
80
  auth&.xpath(".//p[@id = 'boilerplate-place']")&.each do |p|
81
81
  p["class"] = "zzCopyright1"
82
82
  end
83
- auth and insert.children = auth
83
+ auth and insert and insert.children = auth
84
+ coverpage_note_cleanup(docxml)
84
85
  end
85
86
 
86
87
  def word_cleanup(docxml)
@@ -89,6 +90,19 @@ module IsoDoc
89
90
  style_cleanup(docxml)
90
91
  docxml
91
92
  end
93
+
94
+ # supply missing annex title
95
+ def make_WordToC(docxml, level)
96
+ toc = ""
97
+ xpath = (1..level).each.map { |i| "//h#{i}" }.join (" | ")
98
+ docxml.xpath(xpath).each do |h|
99
+ x = ""
100
+ x = @anchor[h.parent["id"]][:xref] if h["class"] == "ANNEX"
101
+ toc += word_toc_entry(h.name[1].to_i, x + header_strip(h))
102
+ end
103
+ toc.sub(/(<p class="MsoToc1">)/,
104
+ %{\\1#{word_toc_preface(level)}}) + WORD_TOC_SUFFIX1
105
+ end
92
106
  end
93
107
  end
94
108
  end