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
@@ -2,6 +2,7 @@ require_relative "base_convert"
2
2
  require "isodoc"
3
3
  require_relative "init"
4
4
  require_relative "word_cleanup"
5
+ require_relative "word_dis_convert"
5
6
 
6
7
  module IsoDoc
7
8
  module Iso
@@ -13,6 +14,11 @@ module IsoDoc
13
14
  @wordToClevels = 3 if @wordToClevels.zero?
14
15
  @htmlToClevels = options[:htmltoclevels].to_i
15
16
  @htmlToClevels = 3 if @htmlToClevels.zero?
17
+ init_dis
18
+ end
19
+
20
+ def init_dis
21
+ @dis = ::IsoDoc::Iso::WordDISConvert.new(options)
16
22
  end
17
23
 
18
24
  def font_choice(options)
@@ -45,16 +51,16 @@ module IsoDoc
45
51
  olstyle: "l2" }
46
52
  end
47
53
 
48
- def convert1(docxml, filename, dir)
49
- @dis = /^[45].$/.match?(docxml&.at(ns("//bibdata/status/stage"))&.text)
50
- if @dis
51
- @wordstylesheet_name = html_doc_path("wordstyle-dis.scss")
52
- @standardstylesheet_name = html_doc_path("isodoc-dis.scss")
53
- @wordcoverpage = html_doc_path("word_iso_titlepage-dis.html")
54
- @wordintropage = html_doc_path("word_iso_intro-dis.html")
55
- @header = html_doc_path("header-dis.html")
54
+ def convert(input_filename, file = nil, debug = false,
55
+ output_filename = nil)
56
+ file = File.read(input_filename, encoding: "utf-8") if file.nil?
57
+ docxml = Nokogiri::XML(file) { |config| config.huge }
58
+ if @dis &&
59
+ /^[45].$/.match?(docxml&.at(ns("//bibdata/status/stage"))&.text)
60
+ @dis.convert(input_filename, file, debug, output_filename)
61
+ else
62
+ super
56
63
  end
57
- super
58
64
  end
59
65
 
60
66
  def make_body(xml, docxml)
@@ -171,11 +177,22 @@ module IsoDoc
171
177
 
172
178
  name&.at(ns("./strong"))&.remove # supplied by CSS list numbering
173
179
  div.h1 **{ class: "Annex" } do |t|
174
- name.children.each { |c2| parse(c2, t) }
180
+ annex_name1(name, t)
175
181
  clause_parse_subtitle(name, t)
176
182
  end
177
183
  end
178
184
 
185
+ def annex_name1(name, out)
186
+ name.children.each do |c2|
187
+ if c2.name == "span" && c2["class"] == "obligation"
188
+ out.span **{ style: "font-weight:normal;" } do |s|
189
+ c2.children.each { |c3| parse(c3, s) }
190
+ end
191
+ else parse(c2, out)
192
+ end
193
+ end
194
+ end
195
+
179
196
  include BaseConvert
180
197
  include Init
181
198
  end
@@ -0,0 +1,174 @@
1
+ module IsoDoc
2
+ module Iso
3
+ class WordDISConvert < WordConvert
4
+ def default_file_locations(_options)
5
+ {
6
+ wordstylesheet: html_doc_path("wordstyle-dis.scss"),
7
+ standardstylesheet: html_doc_path("isodoc-dis.scss"),
8
+ header: html_doc_path("header-dis.html"),
9
+ wordcoverpage: html_doc_path("word_iso_titlepage-dis.html"),
10
+ wordintropage: html_doc_path("word_iso_intro-dis.html"),
11
+ ulstyle: "l3",
12
+ olstyle: "l2",
13
+ }
14
+ end
15
+
16
+ def initialize(options)
17
+ @libdir ||= File.dirname(__FILE__) # rubocop:disable Lint/DisjunctiveAssignmentInConstructor
18
+ options.merge!(default_file_locations(options))
19
+ super
20
+ end
21
+
22
+ def init_dis; end
23
+
24
+ def style_cleanup(docxml)
25
+ super
26
+ dis_styles(docxml)
27
+ end
28
+
29
+ STYLESMAP = {
30
+ AltTerms: "AdmittedTerm",
31
+ TableFootnote: "Tablefootnote",
32
+ formula: "Formula",
33
+ note: "Note",
34
+ NormRef: "RefNorm",
35
+ biblio: "BiblioEntry",
36
+ MsoNormal: "MsoBodyText",
37
+ FigureTitle: "Figuretitle",
38
+ }.freeze
39
+
40
+ def dis_styles(docxml)
41
+ STYLESMAP.each do |k, v|
42
+ docxml.xpath("//*[@class = '#{k}']").each { |s| s["class"] = v }
43
+ end
44
+ docxml.xpath("//h1[@class = 'ForewordTitle' or @class = 'IntroTitle']")
45
+ .each { |h| h.name = "p" }
46
+ dis_styles1(docxml)
47
+ docxml.xpath("//p[not(@class)]").each { |p| p["class"] = "MsoBodyText" }
48
+ end
49
+
50
+ def dis_styles1(docxml)
51
+ code_style(docxml)
52
+ figure_style(docxml)
53
+ example_style(docxml)
54
+ end
55
+
56
+ def example_style(docxml)
57
+ docxml.xpath("//div[@class = 'Example']").each do |d|
58
+ d.xpath("./p").each_with_index do |p, i|
59
+ next if p["class"] && p["class"] != "Example"
60
+
61
+ p["class"] = (i.zero? ? "Example" : "Examplecontinued")
62
+ end
63
+ end
64
+ end
65
+
66
+ def figure_name_attrs(_node)
67
+ { class: "FigureTitle", style: "text-align:center;" }
68
+ end
69
+
70
+ def table_title_attrs(_node)
71
+ { class: "Tabletitle", style: "text-align:center;" }
72
+ end
73
+
74
+ def word_annex_cleanup1(docxml, lvl)
75
+ docxml.xpath("//h#{lvl}[ancestor::*[@class = 'Section3']]").each do |h2|
76
+ h2.name = "p"
77
+ h2["class"] = "a#{lvl}"
78
+ end
79
+ end
80
+
81
+ def span_parse(node, out)
82
+ out.span **{ class: node["class"] } do |x|
83
+ node.children.each { |n| parse(n, x) }
84
+ end
85
+ end
86
+
87
+ def word_toc_preface(level)
88
+ <<~TOC.freeze
89
+ <span lang="EN-GB"><span
90
+ style='mso-element:field-begin'></span><span
91
+ style='mso-spacerun:yes'>&#xA0;</span>TOC \\o &quot;2-#{level}&quot; \\h \\z \\t
92
+ &quot;Heading 1;1;ANNEX;1;Biblio Title;1;Foreword Title;1;Intro Title;1;ANNEXN;1;ANNEXZ;1;na2;1;na3;1;na4;1;na5;1;na6;1;Title;1;Base_Heading;1;Box-title;1;Front Head;1;Index Head;1;AMEND Terms Heading;1;AMEND Heading 1 Unnumbered;1&quot;
93
+ <span style='mso-element:field-separator'></span></span>
94
+ TOC
95
+ end
96
+
97
+ def render_identifier(ident)
98
+ ret = super
99
+ ret[:sdo] = std_docid_semantic(ret[:sdo])
100
+ ret
101
+ end
102
+
103
+ FIGURE_NESTED_STYLES =
104
+ { Note: "Figurenote", example: "Figureexample" }.freeze
105
+
106
+ def figure_style(docxml)
107
+ docxml.xpath("//div[@class = 'figure']").each do |f|
108
+ FIGURE_NESTED_STYLES.each do |k, v|
109
+ f.xpath(".//*[@class = '#{k}']").each { |n| n["class"] = v }
110
+ end
111
+ f.xpath("./img").each do |i|
112
+ i.replace("<p class='FigureGraphic'>#{i.to_xml}</p>")
113
+ end
114
+ end
115
+ end
116
+
117
+ def code_style(doc)
118
+ span_style((doc.xpath("//tt//b") - doc.xpath("//tt//i//b")),
119
+ "ISOCodebold")
120
+ span_style((doc.xpath("//tt//i") - doc.xpath("//tt//b//i")),
121
+ "ISOCodeitalic")
122
+ span_style((doc.xpath("//b//tt") - doc.xpath("//b//i//tt")),
123
+ "ISOCodebold")
124
+ span_style((doc.xpath("//i//tt") - doc.xpath("//i//b//tt")),
125
+ "ISOCodeitalic")
126
+ span_style(doc.xpath("//tt"), "ISOCode")
127
+ end
128
+
129
+ def span_style(xpath, style)
130
+ xpath.each do |elem|
131
+ elem.name = "span"
132
+ elem["class"] = style
133
+ end
134
+ end
135
+
136
+ def make_tr_attr(cell, row, totalrows, header)
137
+ super.merge(header: header)
138
+ end
139
+
140
+ def word_cleanup(docxml)
141
+ word_table_cell_para(docxml)
142
+ super
143
+ end
144
+
145
+ def word_table_cell_para(docxml)
146
+ docxml.xpath("//td | //th").each do |t|
147
+ s = t["header"] == "true" ? "Tableheader" : "Tablebody"
148
+ t.delete("header")
149
+ if t.at("./p |./div")
150
+ t.xpath("./p | ./div").each { |p| p["class"] = s }
151
+ else
152
+ t.children = "<div class='#{s}'>#{t.children.to_xml}</div>"
153
+ end
154
+ end
155
+ end
156
+
157
+ def toWord(result, filename, dir, header)
158
+ result = from_xhtml(word_cleanup(to_xhtml(result)))
159
+ .gsub(/-DOUBLE_HYPHEN_ESCAPE-/, "--")
160
+ @wordstylesheet = wordstylesheet_update
161
+ ::Html2Doc::IsoDIS.new(
162
+ filename: filename,
163
+ imagedir: @localdir,
164
+ stylesheet: @wordstylesheet&.path,
165
+ header_file: header&.path, dir: dir,
166
+ asciimathdelims: [@openmathdelim, @closemathdelim],
167
+ liststyles: { ul: @ulstyle, ol: @olstyle }
168
+ ).process(result)
169
+ header&.unlink
170
+ @wordstylesheet.unlink if @wordstylesheet.is_a?(Tempfile)
171
+ end
172
+ end
173
+ end
174
+ end
@@ -10,36 +10,48 @@ module IsoDoc
10
10
  else
11
11
  initial_anchor_names1(doc)
12
12
  end
13
- introduction_names(doc.at(ns("//introduction")))
13
+ if @parse_settings.empty? || @parse_settings[:clauses]
14
+ introduction_names(doc.at(ns("//introduction")))
15
+ end
14
16
  end
15
17
 
16
18
  def initial_anchor_names_amd(doc)
17
- doc.xpath(ns("//preface/*")).each do |c|
18
- c.element? and preface_names(c)
19
+ if @parse_settings.empty? || @parse_settings[:clauses]
20
+ doc.xpath(ns("//preface/*")).each do |c|
21
+ c.element? and preface_names(c)
22
+ end
23
+ doc.xpath(ns("//sections/clause")).each do |c|
24
+ c.element? and preface_names(c)
25
+ end
19
26
  end
20
- sequential_asset_names(doc.xpath(ns("//preface/*")))
21
- doc.xpath(ns("//sections/clause")).each do |c|
22
- c.element? and preface_names(c)
27
+ if @parse_settings.empty?
28
+ sequential_asset_names(doc.xpath(ns("//preface/*")))
29
+ middle_section_asset_names(doc)
30
+ termnote_anchor_names(doc)
31
+ termexample_anchor_names(doc)
23
32
  end
24
- middle_section_asset_names(doc)
25
- termnote_anchor_names(doc)
26
- termexample_anchor_names(doc)
27
33
  end
28
34
 
29
35
  def initial_anchor_names1(doc)
30
- doc.xpath(ns("//preface/*")).each { |c| c.element? and preface_names(c) }
31
- # potentially overridden in middle_section_asset_names()
32
- sequential_asset_names(doc.xpath(ns("//preface/*")))
33
- n = Counter.new
34
- n = section_names(doc.at(ns("//clause[@type = 'scope']")), n, 1)
35
- n = section_names(doc.at(ns(@klass.norm_ref_xpath)), n, 1)
36
- doc.xpath(ns("//sections/clause[not(@type = 'scope')] | "\
37
- "//sections/terms | //sections/definitions")).each do |c|
38
- n = section_names(c, n, 1)
36
+ if @parse_settings.empty? || @parse_settings[:clauses]
37
+ doc.xpath(ns("//preface/*")).each do |c|
38
+ c.element? and preface_names(c)
39
+ end
40
+ # potentially overridden in middle_section_asset_names()
41
+ sequential_asset_names(doc.xpath(ns("//preface/*")))
42
+ n = Counter.new
43
+ n = section_names(doc.at(ns("//clause[@type = 'scope']")), n, 1)
44
+ n = section_names(doc.at(ns(@klass.norm_ref_xpath)), n, 1)
45
+ doc.xpath(ns("//sections/clause[not(@type = 'scope')] | "\
46
+ "//sections/terms | //sections/definitions")).each do |c|
47
+ n = section_names(c, n, 1)
48
+ end
49
+ end
50
+ if @parse_settings.empty?
51
+ middle_section_asset_names(doc)
52
+ termnote_anchor_names(doc)
53
+ termexample_anchor_names(doc)
39
54
  end
40
- middle_section_asset_names(doc)
41
- termnote_anchor_names(doc)
42
- termexample_anchor_names(doc)
43
55
  end
44
56
 
45
57
  # we can reference 0-number clauses in introduction
@@ -68,6 +80,7 @@ module IsoDoc
68
80
  @anchors[c["id"]] = anchor_struct(i.print, nil, @labels["appendix"],
69
81
  "clause")
70
82
  @anchors[c["id"]][:level] = 2
83
+ @anchors[c["id"]][:subtype] = "annex"
71
84
  @anchors[c["id"]][:container] = clause["id"]
72
85
  j = Counter.new
73
86
  c.xpath(ns("./clause | ./references")).each do |c1|
@@ -78,10 +91,11 @@ module IsoDoc
78
91
  end
79
92
  end
80
93
 
94
+ # subclauses are not prefixed with "Clause"
95
+ # retaining sybtupe for the semantics
81
96
  def section_names1(clause, num, level)
82
97
  @anchors[clause["id"]] =
83
- { label: num, level: level, xref: num }
84
- # subclauses are not prefixed with "Clause"
98
+ { label: num, level: level, xref: num, subtype: "clause" }
85
99
  i = Counter.new
86
100
  clause.xpath(ns("./clause | ./terms | ./term | ./definitions | "\
87
101
  "./references"))
@@ -92,7 +106,8 @@ module IsoDoc
92
106
  end
93
107
 
94
108
  def annex_names1(clause, num, level)
95
- @anchors[clause["id"]] = { label: num, xref: num, level: level }
109
+ @anchors[clause["id"]] = { label: num, xref: num, level: level,
110
+ subtype: "annex" }
96
111
  i = Counter.new
97
112
  clause.xpath(ns("./clause | ./references")).each do |c|
98
113
  i.increment(c)
@@ -113,7 +128,7 @@ module IsoDoc
113
128
  def hierarchical_formula_names(clause, num)
114
129
  c = IsoDoc::XrefGen::Counter.new
115
130
  clause.xpath(ns(".//formula")).each do |t|
116
- next if t["id"].nil? || t["id"].empty?
131
+ next if blank?(t["id"])
117
132
 
118
133
  @anchors[t["id"]] = anchor_struct(
119
134
  "#{num}#{hiersep}#{c.increment(t).print}", t,
@@ -133,13 +148,12 @@ module IsoDoc
133
148
  end
134
149
 
135
150
  def sequential_figure_names(clause)
136
- c = IsoDoc::XrefGen::Counter.new
137
151
  j = 0
138
152
  clause.xpath(ns(".//figure | .//sourcecode[not(ancestor::example)]"))
139
- .each do |t|
153
+ .each_with_object(IsoDoc::XrefGen::Counter.new) do |t, c|
140
154
  j = subfigure_increment(j, c, t)
141
155
  sublabel = j.zero? ? nil : "#{(j + 96).chr})"
142
- next if t["id"].nil? || t["id"].empty?
156
+ next if blank?(t["id"])
143
157
 
144
158
  figure_anchor(t, sublabel, c.print)
145
159
  end
@@ -153,7 +167,7 @@ module IsoDoc
153
167
  j = subfigure_increment(j, c, t)
154
168
  label = "#{num}#{hiersep}#{c.print}"
155
169
  sublabel = j.zero? ? nil : "#{(j + 96).chr})"
156
- next if t["id"].nil? || t["id"].empty?
170
+ next if blank?(t["id"])
157
171
 
158
172
  figure_anchor(t, sublabel, label)
159
173
  end
@@ -167,7 +181,13 @@ module IsoDoc
167
181
 
168
182
  def back_anchor_names(docxml)
169
183
  super
170
- docxml.xpath(ns("//indexsect")).each { |b| preface_names(b) }
184
+ if @parse_settings.empty? || @parse_settings[:clauses]
185
+ docxml.xpath(ns("//indexsect")).each { |b| preface_names(b) }
186
+ end
187
+ end
188
+
189
+ def annex_name_lbl(clause, num)
190
+ super.sub(%r{<br/>(.*)$}, "<br/><span class='obligation'>\\1</span>")
171
191
  end
172
192
  end
173
193
  end
@@ -527,7 +527,7 @@
527
527
  </define>
528
528
  <define name="LocalityType">
529
529
  <data type="string">
530
- <param name="pattern">section|clause|part|paragraph|chapter|page|whole|table|annex|figure|note|list|example|volume|issue|time|anchor|locality:[a-zA-Z0-9_]+</param>
530
+ <param name="pattern">section|clause|part|paragraph|chapter|page|title|line|whole|table|annex|figure|note|list|example|volume|issue|time|anchor|locality:[a-zA-Z0-9_]+</param>
531
531
  </data>
532
532
  </define>
533
533
  <define name="referenceFrom">
@@ -677,6 +677,9 @@
677
677
  <zeroOrMore>
678
678
  <ref name="extent"/>
679
679
  </zeroOrMore>
680
+ <optional>
681
+ <ref name="bibliographic_size"/>
682
+ </optional>
680
683
  <zeroOrMore>
681
684
  <ref name="accesslocation"/>
682
685
  </zeroOrMore>
@@ -848,17 +851,46 @@
848
851
  </define>
849
852
  <define name="bplace">
850
853
  <element name="place">
851
- <optional>
852
- <attribute name="uri">
853
- <data type="anyURI"/>
854
- </attribute>
855
- </optional>
856
- <optional>
857
- <attribute name="region"/>
858
- </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">
859
870
  <text/>
860
871
  </element>
861
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>
862
894
  <define name="bprice">
863
895
  <element name="price">
864
896
  <attribute name="currency"/>
@@ -922,9 +954,29 @@
922
954
  <text/>
923
955
  </element>
924
956
  </define>
957
+ <define name="sizevalue">
958
+ <element name="value">
959
+ <attribute name="type"/>
960
+ <text/>
961
+ </element>
962
+ </define>
963
+ <define name="bibliographic_size">
964
+ <element name="size">
965
+ <oneOrMore>
966
+ <ref name="sizevalue"/>
967
+ </oneOrMore>
968
+ </element>
969
+ </define>
925
970
  <define name="extent">
926
971
  <element name="extent">
927
- <ref name="BibItemLocality"/>
972
+ <choice>
973
+ <zeroOrMore>
974
+ <ref name="locality"/>
975
+ </zeroOrMore>
976
+ <zeroOrMore>
977
+ <ref name="localityStack"/>
978
+ </zeroOrMore>
979
+ </choice>
928
980
  </element>
929
981
  </define>
930
982
  <define name="series">
@@ -1,7 +1,7 @@
1
1
  <boilerplate>
2
2
  <copyright-statement>
3
3
  <clause>
4
- <p id="boilerplate-year">&#xa9; {{ agency }} {{ docyear }}</p>
4
+ <p id="boilerplate-year">&#xa9; <span class="std_publisher">{{ agency }}</span> <span class="std_docNumber">{{ docyear }}</span></p>
5
5
 
6
6
  <p id="boilerplate-message">
7
7
  Droits de reproduction réservés. Sauf indication contraire, ou requise dans le cadre de sa mise en œuvre,
@@ -1,9 +1,7 @@
1
1
  <boilerplate>
2
2
  <copyright-statement>
3
3
  <clause>
4
- <p id="boilerplate-year">
5
- &#xa9; {{ agency }} {{ docyear }}
6
- </p>
4
+ <p id="boilerplate-year">&#xa9; <span class="std_publisher">{{ agency }}</span> <span class="std_docNumber">{{ docyear }}</span></p>
7
5
 
8
6
  <p id="boilerplate-message">
9
7
  Все права защищены. Если иначе не определено или не требуется в контексте его реализации, никакая часть этой публикации не может быть воспроизведена или использована иначе в любой форме или каким-либо образом, электронным или механическим, включая фотокопирование, или публикацию в Интернете или интранете, без предварительного письменного разрешения. Разрешение может быть запрошено ISO по адресу, указанному ниже, или у органа — члена ISO страны запрашивающего.
@@ -1,9 +1,7 @@
1
1
  <boilerplate>
2
2
  <copyright-statement>
3
3
  <clause>
4
- <p id="boilerplate-year">
5
- &#xa9; {{ agency }} {{ docyear }}
6
- </p>
4
+ <p id="boilerplate-year">&#xa9; <span class="std_publisher">{{ agency }}</span> <span class="std_docNumber">{{ docyear }}</span></p>
7
5
 
8
6
  <p id="boilerplate-message">
9
7
  All rights
@@ -40,7 +40,8 @@ module Metanorma
40
40
  xmldoc.xpath("//bibdata/contributor[role/@type = 'publisher']"\
41
41
  "/organization").each_with_object([]) do |x, prefix|
42
42
  x1 = x.at("abbreviation")&.text || x.at("name")&.text
43
- (x1 == "ISO" and prefix.unshift("ISO")) or prefix << x1
43
+ #(x1 == "ISO" and prefix.unshift("ISO")) or prefix << x1
44
+ prefix << x1
44
45
  end
45
46
  end
46
47
 
@@ -51,10 +52,10 @@ module Metanorma
51
52
  id.content = id_prefix(prefix, id)
52
53
  id = xmldoc.at("//bibdata/ext/structuredidentifier/project-number") and
53
54
  id.content = id_prefix(prefix, id)
54
- id = xmldoc.at("//bibdata/docidentifier[@type = 'iso-with-lang']") and
55
- id.content = id_prefix(prefix, id)
56
- id = xmldoc.at("//bibdata/docidentifier[@type = 'iso-reference']") and
57
- id.content = id_prefix(prefix, id)
55
+ %w(iso-with-lang iso-reference iso-undated).each do |t|
56
+ id = xmldoc.at("//bibdata/docidentifier[@type = '#{t}']") and
57
+ id.content = id_prefix(prefix, id)
58
+ end
58
59
  end
59
60
 
60
61
  def format_ref(ref, type)
@@ -140,7 +141,7 @@ module Metanorma
140
141
  xmldoc.xpath("//bibitem/note[@type = 'Unpublished-Status']").each do |n|
141
142
  e = xmldoc.at("//eref[@bibitemid = '#{n.parent['id']}']") or next
142
143
  fn = n.children.to_xml
143
- n&.elements&.first&.name == "p" or fn = "<p>#{fn}</p>"
144
+ n.elements&.first&.name == "p" or fn = "<p>#{fn}</p>"
144
145
  e.next = "<fn>#{fn}</fn>"
145
146
  end
146
147
  end
@@ -73,13 +73,19 @@ module Metanorma
73
73
  (!@amd && node.attr("docnumber")) || (@amd && node.attr("updates")) or
74
74
  return
75
75
 
76
- dn = iso_id1(node)
77
- dn1 = id_stage_prefix(dn, node, false)
78
- dn2 = id_stage_prefix(dn, node, true)
79
- xml.docidentifier dn1, **attr_code(type: "ISO")
80
- xml.docidentifier(id_langsuffix(dn1, node),
76
+ dn = id_stage_prefix(iso_id1(node), node)
77
+ dns = [id_year(dn, node, mode: :default),
78
+ id_year(dn, node, mode: :force),
79
+ id_year(dn, node, mode: :strip)]
80
+ iso_id_out(node, xml, dns)
81
+ end
82
+
83
+ def iso_id_out(node, xml, dns)
84
+ xml.docidentifier dns[0], **attr_code(type: "ISO")
85
+ xml.docidentifier dns[2], **attr_code(type: "iso-undated")
86
+ xml.docidentifier(id_langsuffix(dns[0], node),
81
87
  **attr_code(type: "iso-with-lang"))
82
- xml.docidentifier(id_langsuffix(dn2, node),
88
+ xml.docidentifier(id_langsuffix(dns[1], node),
83
89
  **attr_code(type: "iso-reference"))
84
90
  end
85
91
 
@@ -160,14 +166,14 @@ module Metanorma
160
166
  def cover_stage_abbr(node)
161
167
  stage = get_stage(node)
162
168
  abbr = id_stage_abbr(get_stage(node), get_substage(node), node, true)
163
- typeabbr = get_typeabbr(node, true)
169
+ typeabbr = get_typeabbr(node, amd: true)
164
170
  if stage.to_i > 50 || (stage.to_i == 60 && get_substage(node).to_i < 60)
165
171
  typeabbr = ""
166
172
  end
167
173
  "#{abbr}#{typeabbr}".strip
168
174
  end
169
175
 
170
- def id_stage_prefix(docnum, node, force_year)
176
+ def id_stage_prefix(docnum, node)
171
177
  stage = get_stage(node)
172
178
  typeabbr = get_typeabbr(node)
173
179
  if stage && (stage.to_i < 60)
@@ -175,11 +181,22 @@ module Metanorma
175
181
  elsif typeabbr == "DIR " then docnum = "#{typeabbr}#{docnum}"
176
182
  elsif typeabbr && !@amd then docnum = "/#{typeabbr}#{docnum}"
177
183
  end
178
- (force_year || !(stage && (stage.to_i < 60))) and
179
- docnum = id_add_year(docnum, node)
180
184
  docnum
181
185
  end
182
186
 
187
+ def id_year(docnum, node, mode: :default)
188
+ case mode
189
+ when :strip then docnum.sub(/:(19|20)\d\d(?!\d)/, "")
190
+ when :force then id_add_year(docnum, node)
191
+ else
192
+ stage = get_stage(node)
193
+ if stage && (stage.to_i < 60)
194
+ docnum
195
+ else id_add_year(docnum, node)
196
+ end
197
+ end
198
+ end
199
+
183
200
  def unpub_stage_prefix(docnum, stage, typeabbr, node)
184
201
  abbr = id_stage_abbr(stage, get_substage(node), node)
185
202
  %w(40 50).include?(stage) && i = node.attr("iteration") and
@@ -213,7 +230,7 @@ module Metanorma
213
230
  ret
214
231
  end
215
232
 
216
- def get_typeabbr(node, amd = false)
233
+ def get_typeabbr(node, amd: false)
217
234
  case doctype(node)
218
235
  when "directive" then "DIR "
219
236
  when "technical-report" then "TR "