metanorma-bipm 2.0.8 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,6 +3,7 @@ require "metanorma-generic"
3
3
  require "metanorma-iso"
4
4
  require_relative "init"
5
5
  require_relative "index"
6
+ require_relative "doccontrol"
6
7
 
7
8
  module IsoDoc
8
9
  module BIPM
@@ -85,99 +86,6 @@ module IsoDoc
85
86
  doccontrol docxml
86
87
  end
87
88
 
88
- def doccontrol(doc)
89
- return unless doc.at(ns("//bibdata/relation[@type = 'supersedes']"))
90
-
91
- clause = <<~DOCCONTROL
92
- <doccontrol>
93
- <title>Document Control</title>
94
- <table unnumbered="true"><tbody>
95
- <tr><th>Authors:</th><td/><td>#{list_authors(doc)}</td></tr>
96
- #{doccontrol_row1(doc)} #{doccontrol_row2(doc)} #{list_drafts(doc)}
97
- </tbody></table></doccontrol>
98
- DOCCONTROL
99
- doc.root << clause
100
- end
101
-
102
- def doccontrol_row1(doc)
103
- return "" if list_draft(doc, 1) == ["", ""] && list_cochairs(doc).empty?
104
-
105
- <<~ROW
106
- <tr>#{list_draft(doc, 1)&.map { |x| "<td>#{x}</td>" }&.join}
107
- <td>#{list_cochairs(doc)}</td></tr>
108
- ROW
109
- end
110
-
111
- def doccontrol_row2(docxml)
112
- list_draft(docxml, 2) == ["", ""] && list_chairs(docxml).empty? and
113
- return ""
114
-
115
- <<~ROW
116
- <tr>#{list_draft(docxml, 2)&.map { |x| "<td>#{x}</td>" }&.join}
117
- <td>#{list_chairs(docxml)}</td></tr>
118
- ROW
119
- end
120
-
121
- def list_drafts(xml)
122
- ret = ""
123
- i = 3
124
- while list_draft(xml, i) != ["", ""]
125
- ret += "<tr>#{list_draft(xml, i).map { |x| "<td>#{x}</td>" }.join} "\
126
- "<td/></tr>"
127
- i += 1
128
- end
129
- ret
130
- end
131
-
132
- def list_draft(xml, idx)
133
- d = xml.at(ns("//bibdata/relation[@type = 'supersedes'][#{idx}]"\
134
- "/bibitem")) or return ["", ""]
135
-
136
- draft = d&.at(ns("./version/draft"))&.text and draft = "Draft #{draft}"
137
- edn = d&.at(ns("./edition"))&.text and edn = "Version #{edn}"
138
- [[draft, edn].join(" "), d&.at(ns("./date"))&.text]
139
- end
140
-
141
- def list_authors(xml)
142
- ret = list_people(
143
- xml, "//bibdata/contributor[xmlns:role/@type = 'author']/person"
144
- )
145
- @i18n.boolean_conj(ret, "and")
146
- end
147
-
148
- COCHAIR = "xmlns:role[contains(text(),'co-chair')]".freeze
149
- CHAIR = "[xmlns:role[contains(text(),'chair')]"\
150
- "[not(contains(text(),'co-chair'))]]".freeze
151
-
152
- def list_cochairs(xml)
153
- ret = list_people(xml, "//bibdata/contributor[#{COCHAIR}]/person")
154
- ret.empty? and return ""
155
- role = xml&.at(ns("//bibdata/contributor[#{COCHAIR}]/role"))&.text
156
- label = ret.size > 1 && role ? "#{role}s" : role
157
- "#{label}: #{@i18n.boolean_conj(ret, 'and')}"
158
- end
159
-
160
- def list_chairs(xml)
161
- ret = list_people(xml, "//bibdata/contributor#{CHAIR}/person")
162
- ret.empty? and return ""
163
- role = xml&.at(ns("//bibdata/contributor#{CHAIR}/role"))&.text
164
- label = ret.size > 1 && role ? "#{role}s" : role
165
- "#{label}: #{@i18n.boolean_conj(ret, 'and')}"
166
- end
167
-
168
- def list_people(xml, xpath)
169
- ret = []
170
- xml.xpath(ns(xpath)).each do |p|
171
- name = p&.at(ns("./name/completename"))&.text
172
- aff = p&.at(ns("./affiliation/organization/abbreviation"))&.text ||
173
- p&.at(ns("./affiliation/organization/name"))&.text
174
- c = name || ""
175
- aff and c += " (#{aff})"
176
- ret << c
177
- end
178
- ret
179
- end
180
-
181
89
  def twitter_cldr_localiser_symbols
182
90
  { group: "&#xA0;", fraction_group: "&#xA0;", fraction_group_digits: 3 }
183
91
  end
@@ -261,6 +169,23 @@ module IsoDoc
261
169
  super || @xrefs.klass.standard?(bibitem)
262
170
  end
263
171
 
172
+ def expand_citeas(text)
173
+ ret = super
174
+ if @lang == "fr" && /^(CGPM|CIPM) /.match?(ret)
175
+ ret.sub!(/^(CGPM|CIPM) (\S+)/) do |_m|
176
+ "#{$1} &#x2013; #{FR_OUTCOME_TYPE[$2.to_sym] || $2}"
177
+ end
178
+ end
179
+ ret
180
+ end
181
+
182
+ FR_OUTCOME_TYPE = {
183
+ Resolution: "Résolution",
184
+ Decision: "Décision",
185
+ Recommendation: "Recommandation",
186
+ Declaration: "Déclaration",
187
+ }.freeze
188
+
264
189
  include Init
265
190
  end
266
191
  end
@@ -153,8 +153,9 @@ module IsoDoc
153
153
 
154
154
  def annex_names(clause, num)
155
155
  @anchors[clause["id"]] = annex_name_anchors(clause, num)
156
- if a = single_annex_special_section(clause)
157
- annex_names1(a, num.to_s, 1)
156
+ if @klass.single_term_clause?(clause)
157
+ annex_names1(clause.at(ns("./references | ./terms | ./definitions")),
158
+ num.to_s, 1)
158
159
  else
159
160
  i = Counter.new
160
161
  prefix = @jcgm ? "" : "A"
@@ -176,8 +177,9 @@ module IsoDoc
176
177
  def unnumbered_annex_names(clause)
177
178
  lbl = clause&.at(ns("./title"))&.text || "[#{clause['id']}]"
178
179
  @anchors[clause["id"]] = unnumbered_annex_anchors(lbl)
179
- if a = single_annex_special_section(clause)
180
- annex_names1(a, num.to_s, 1)
180
+ if @klass.single_term_clause?(clause)
181
+ annex_names1(clause.at(ns("./references | ./terms | ./definitions")),
182
+ num.to_s, 1)
181
183
  else
182
184
  clause.xpath(ns(SUBCLAUSES))
183
185
  .each { |c| unnumbered_annex_names1(c, 2) }
@@ -229,10 +231,12 @@ module IsoDoc
229
231
 
230
232
  def initial_anchor_names(doc)
231
233
  super
234
+ if @parse_settings.empty? || @parse_settings[:clauses]
232
235
  if @jcgm
233
236
  @iso.introduction_names(doc.at(ns("//introduction")))
234
237
  @anchors.merge!(@iso.get)
235
238
  end
239
+ end
236
240
  end
237
241
 
238
242
  def sequential_figure_names(clause)
@@ -614,12 +614,12 @@
614
614
  <optional>
615
615
  <ref name="fetched"/>
616
616
  </optional>
617
- <choice>
618
- <oneOrMore>
619
- <ref name="btitle"/>
620
- </oneOrMore>
617
+ <optional>
621
618
  <ref name="formattedref"/>
622
- </choice>
619
+ </optional>
620
+ <oneOrMore>
621
+ <ref name="btitle"/>
622
+ </oneOrMore>
623
623
  <zeroOrMore>
624
624
  <ref name="bsource"/>
625
625
  </zeroOrMore>
@@ -851,17 +851,46 @@
851
851
  </define>
852
852
  <define name="bplace">
853
853
  <element name="place">
854
- <optional>
855
- <attribute name="uri">
856
- <data type="anyURI"/>
857
- </attribute>
858
- </optional>
859
- <optional>
860
- <attribute name="region"/>
861
- </optional>
854
+ <choice>
855
+ <text/>
856
+ <group>
857
+ <ref name="bibliocity"/>
858
+ <zeroOrMore>
859
+ <ref name="biblioregion"/>
860
+ </zeroOrMore>
861
+ <zeroOrMore>
862
+ <ref name="bibliocountry"/>
863
+ </zeroOrMore>
864
+ </group>
865
+ </choice>
866
+ </element>
867
+ </define>
868
+ <define name="bibliocity">
869
+ <element name="city">
862
870
  <text/>
863
871
  </element>
864
872
  </define>
873
+ <define name="biblioregion">
874
+ <element name="region">
875
+ <ref name="RegionType"/>
876
+ </element>
877
+ </define>
878
+ <define name="bibliocountry">
879
+ <element name="country">
880
+ <ref name="RegionType"/>
881
+ </element>
882
+ </define>
883
+ <define name="RegionType">
884
+ <optional>
885
+ <attribute name="iso"/>
886
+ </optional>
887
+ <optional>
888
+ <attribute name="recommended">
889
+ <data type="boolean"/>
890
+ </attribute>
891
+ </optional>
892
+ <text/>
893
+ </define>
865
894
  <define name="bprice">
866
895
  <element name="price">
867
896
  <attribute name="currency"/>
@@ -957,36 +986,34 @@
957
986
  <ref name="SeriesType"/>
958
987
  </attribute>
959
988
  </optional>
960
- <choice>
989
+ <optional>
961
990
  <ref name="formattedref"/>
962
- <group>
963
- <ref name="btitle"/>
964
- <optional>
965
- <ref name="bplace"/>
966
- </optional>
967
- <optional>
968
- <ref name="seriesorganization"/>
969
- </optional>
970
- <optional>
971
- <ref name="abbreviation"/>
972
- </optional>
973
- <optional>
974
- <ref name="seriesfrom"/>
975
- </optional>
976
- <optional>
977
- <ref name="seriesto"/>
978
- </optional>
979
- <optional>
980
- <ref name="seriesnumber"/>
981
- </optional>
982
- <optional>
983
- <ref name="seriespartnumber"/>
984
- </optional>
985
- <optional>
986
- <ref name="seriesrun"/>
987
- </optional>
988
- </group>
989
- </choice>
991
+ </optional>
992
+ <ref name="btitle"/>
993
+ <optional>
994
+ <ref name="bplace"/>
995
+ </optional>
996
+ <optional>
997
+ <ref name="seriesorganization"/>
998
+ </optional>
999
+ <optional>
1000
+ <ref name="abbreviation"/>
1001
+ </optional>
1002
+ <optional>
1003
+ <ref name="seriesfrom"/>
1004
+ </optional>
1005
+ <optional>
1006
+ <ref name="seriesto"/>
1007
+ </optional>
1008
+ <optional>
1009
+ <ref name="seriesnumber"/>
1010
+ </optional>
1011
+ <optional>
1012
+ <ref name="seriespartnumber"/>
1013
+ </optional>
1014
+ <optional>
1015
+ <ref name="seriesrun"/>
1016
+ </optional>
990
1017
  </element>
991
1018
  </define>
992
1019
  <define name="SeriesType">
@@ -198,6 +198,9 @@
198
198
  <optional>
199
199
  <attribute name="start"/>
200
200
  </optional>
201
+ <optional>
202
+ <ref name="tname"/>
203
+ </optional>
201
204
  <oneOrMore>
202
205
  <ref name="li"/>
203
206
  </oneOrMore>
@@ -1,5 +1,6 @@
1
1
  require "metanorma/standoc/converter"
2
2
  require "metanorma/generic/converter"
3
+ require_relative "front"
3
4
 
4
5
  module Metanorma
5
6
  module BIPM
@@ -22,114 +23,6 @@ module Metanorma
22
23
  { org_name_long => configuration.organization_name_short }
23
24
  end
24
25
 
25
- def metadata_committee(node, xml)
26
- return unless node.attr("committee-en") || node.attr("committee-fr")
27
-
28
- xml.editorialgroup do |a|
29
- metadata_committee1(node, a)
30
- i = 2
31
- while node.attr("committee-en_#{i}") || node.attr("committee-fr_#{i}")
32
- metadata_committee2(node, a, i)
33
- i += 1
34
- end
35
- metadata_workgroup(node, a)
36
- end
37
- end
38
-
39
- def metadata_committee1(node, xml)
40
- xml.committee **attr_code(acronym:
41
- node.attr("committee-acronym")) do |c|
42
- e = node.attr("committee-en") and
43
- c.variant e, language: "en", script: "Latn"
44
- e = node.attr("committee-fr") and
45
- c.variant e, language: "fr", script: "Latn"
46
- end
47
- end
48
-
49
- def metadata_committee2(node, xml, num)
50
- xml.committee **attr_code(acronym:
51
- node.attr("committee-acronym_#{num}")) do |c|
52
- %w(en fr).each do |lg|
53
- e = node.attr("committee-#{lg}_#{num}") and
54
- c.variant e, language: lg, script: "Latn"
55
- end
56
- end
57
- end
58
-
59
- def metadata_workgroup(node, xml)
60
- xml.workgroup(node.attr("workgroup"),
61
- **attr_code(acronym: node.attr("workgroup-acronym")))
62
- i = 2
63
- while node.attr("workgroup_#{i}")
64
- xml.workgroup(
65
- node.attr("workgroup_#{i}"),
66
- **attr_code(acronym: node.attr("workgroup-acronym_#{i}"))
67
- )
68
- i += 1
69
- end
70
- end
71
-
72
- def metadata_relations(node, xml)
73
- super
74
- relation_supersedes_self(node, xml, "")
75
- i = 2
76
- while relation_supersedes_self(node, xml, "_#{i}")
77
- i += 1
78
- end
79
- end
80
-
81
- def relation_supersedes_self(node, xml, suffix)
82
- d = node.attr("supersedes-date#{suffix}")
83
- draft = node.attr("supersedes-draft#{suffix}")
84
- edition = node.attr("supersedes-edition#{suffix}")
85
- return false unless d || draft || edition
86
-
87
- relation_supersedes_self1(xml, d, edition, draft)
88
- end
89
-
90
- def relation_supersedes_self1(xml, date, edition, draft)
91
- xml.relation **{ type: "supersedes" } do |r|
92
- r.bibitem do |b|
93
- date and b.date(date,
94
- **{ type: edition ? "published" : "circulated" })
95
- edition and b.edition edition
96
- draft and b.version do |v|
97
- v.draft draft
98
- end
99
- end
100
- end
101
- end
102
-
103
- def personal_role(node, xml, suffix)
104
- role = node.attr("role#{suffix}") || "author"
105
- unless %w(author editor).include?(role.downcase)
106
- desc = role
107
- role = "editor"
108
- end
109
- xml.role desc, **{ type: role.downcase }
110
- end
111
-
112
- def title(node, xml)
113
- ["en", "fr"].each do |lang|
114
- at = { language: lang, format: "text/plain" }
115
- xml.title **attr_code(at.merge(type: "main")) do |t1|
116
- t1 << Metanorma::Utils::asciidoc_sub(node.attr("title-#{lang}"))
117
- end
118
- %w(cover appendix annex part subpart provenance).each do |w|
119
- typed_title(node, xml, lang, w)
120
- end
121
- end
122
- end
123
-
124
- def typed_title(node, xml, lang, type)
125
- at = { language: lang, format: "text/plain" }
126
- return unless title = node.attr("title-#{type}-#{lang}")
127
-
128
- xml.title **attr_code(at.merge(type: type)) do |t1|
129
- t1 << Metanorma::Utils::asciidoc_sub(title)
130
- end
131
- end
132
-
133
26
  def sectiontype_streamline(ret)
134
27
  case ret
135
28
  when "introduction" then @jcgm ? "introduction" : "clause"
@@ -157,6 +50,46 @@ module Metanorma
157
50
  ret
158
51
  end
159
52
 
53
+ =begin
54
+ def reference_names(xmldoc)
55
+ xmldoc.xpath("//bibitem[not(ancestor::bibitem)]").each do |ref|
56
+ docid = ref.at("./docidentifier[@type = 'metanorma']") ||
57
+ ref.at("./docidentifier[not(@type = 'DOI')]") or next
58
+ #date = ref.at("./date[@type = 'published']")
59
+ #reference = format_ref(reference_names1(docid, date, docid["type"]),
60
+ #docid["type"])
61
+ reference = format_ref(docid.children.to_xml, docid["type"])
62
+ @anchors[ref["id"]] = { xref: reference }
63
+ end
64
+ end
65
+
66
+ def reference_names1(docid, date, type)
67
+ ret = docid.children.to_xml
68
+ if type == "BIPM" && date &&
69
+ /(CIPM|CGPM) (Decision|Resolution)/.match?(docid)
70
+ ret += " (#{date_range(date)})"
71
+ end
72
+ ret
73
+ end
74
+ =end
75
+
76
+ def date_range(date)
77
+ from = date.at(("./from"))
78
+ to = date.at(("./to"))
79
+ on = date.at(("./on"))
80
+ return date.text unless from || on || to
81
+ return on.text.sub(/-.*$/, "") if on
82
+
83
+ ret = "#{from.text.sub(/-.*$/, '')}&#x2013;"
84
+ ret += to.text.sub(/-.*$/, "") if to
85
+ ret
86
+ end
87
+
88
+ def format_ref(ref, type)
89
+ ref = ref.sub(/^BIPM /, "") if type == "BIPM"
90
+ super
91
+ end
92
+
160
93
  def clause_parse(attrs, xml, node)
161
94
  node.option?("unnumbered") and attrs[:unnumbered] = true
162
95
  super
@@ -0,0 +1,113 @@
1
+ module Metanorma
2
+ module BIPM
3
+ class Converter < Metanorma::Generic::Converter
4
+ def metadata_committee(node, xml)
5
+ return unless node.attr("committee-en") || node.attr("committee-fr")
6
+
7
+ xml.editorialgroup do |a|
8
+ metadata_committee1(node, a)
9
+ i = 2
10
+ while node.attr("committee-en_#{i}") || node.attr("committee-fr_#{i}")
11
+ metadata_committee2(node, a, i)
12
+ i += 1
13
+ end
14
+ metadata_workgroup(node, a)
15
+ end
16
+ end
17
+
18
+ def metadata_committee1(node, xml)
19
+ xml.committee **attr_code(acronym:
20
+ node.attr("committee-acronym")) do |c|
21
+ e = node.attr("committee-en") and
22
+ c.variant e, language: "en", script: "Latn"
23
+ e = node.attr("committee-fr") and
24
+ c.variant e, language: "fr", script: "Latn"
25
+ end
26
+ end
27
+
28
+ def metadata_committee2(node, xml, num)
29
+ xml.committee **attr_code(acronym:
30
+ node.attr("committee-acronym_#{num}")) do |c|
31
+ %w(en fr).each do |lg|
32
+ e = node.attr("committee-#{lg}_#{num}") and
33
+ c.variant e, language: lg, script: "Latn"
34
+ end
35
+ end
36
+ end
37
+
38
+ def metadata_workgroup(node, xml)
39
+ xml.workgroup(node.attr("workgroup"),
40
+ **attr_code(acronym: node.attr("workgroup-acronym")))
41
+ i = 2
42
+ while node.attr("workgroup_#{i}")
43
+ xml.workgroup(
44
+ node.attr("workgroup_#{i}"),
45
+ **attr_code(acronym: node.attr("workgroup-acronym_#{i}")),
46
+ )
47
+ i += 1
48
+ end
49
+ end
50
+
51
+ def metadata_relations(node, xml)
52
+ super
53
+ relation_supersedes_self(node, xml, "")
54
+ i = 2
55
+ while relation_supersedes_self(node, xml, "_#{i}")
56
+ i += 1
57
+ end
58
+ end
59
+
60
+ def relation_supersedes_self(node, xml, suffix)
61
+ d = node.attr("supersedes-date#{suffix}")
62
+ draft = node.attr("supersedes-draft#{suffix}")
63
+ edition = node.attr("supersedes-edition#{suffix}")
64
+ return false unless d || draft || edition
65
+
66
+ relation_supersedes_self1(xml, d, edition, draft)
67
+ end
68
+
69
+ def relation_supersedes_self1(xml, date, edition, draft)
70
+ xml.relation **{ type: "supersedes" } do |r|
71
+ r.bibitem do |b|
72
+ date and b.date(date,
73
+ **{ type: edition ? "published" : "circulated" })
74
+ edition and b.edition edition
75
+ draft and b.version do |v|
76
+ v.draft draft
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ def personal_role(node, xml, suffix)
83
+ role = node.attr("role#{suffix}") || "author"
84
+ unless %w(author editor).include?(role.downcase)
85
+ desc = role
86
+ role = "editor"
87
+ end
88
+ xml.role desc, **{ type: role.downcase }
89
+ end
90
+
91
+ def title(node, xml)
92
+ ["en", "fr"].each do |lang|
93
+ at = { language: lang, format: "text/plain" }
94
+ xml.title **attr_code(at.merge(type: "main")) do |t1|
95
+ t1 << Metanorma::Utils::asciidoc_sub(node.attr("title-#{lang}"))
96
+ end
97
+ %w(cover appendix annex part subpart provenance).each do |w|
98
+ typed_title(node, xml, lang, w)
99
+ end
100
+ end
101
+ end
102
+
103
+ def typed_title(node, xml, lang, type)
104
+ at = { language: lang, format: "text/plain" }
105
+ return unless title = node.attr("title-#{type}-#{lang}")
106
+
107
+ xml.title **attr_code(at.merge(type: type)) do |t1|
108
+ t1 << Metanorma::Utils::asciidoc_sub(title)
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end