metanorma-nist 1.0.6 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d4718e306a8584f427aa244ce10552c267eca1310510e99981582dc7d028ba3d
4
- data.tar.gz: 4c976e465bfbd218bd3b02577ce2a2ee64b031cec48a5168a717d91f04cc6698
3
+ metadata.gz: '05109623d4ab89934b15717692765c6c29015007695efad9ea8258b81d1e956c'
4
+ data.tar.gz: f848bb3f40e50382a2bfeca5f2bd89a78d06d7808bbb3aa4e01d3ce88a8cb87e
5
5
  SHA512:
6
- metadata.gz: ca687ca19884fd7aa3d63e174811448a8bc2380a60721bdb39d87c76d6a93951223bb27f70f4f54d422476f82255606fcc798cb0f3734a937472391a09e551f1
7
- data.tar.gz: 5cd16e3ed0dd3bd4f9b6655f50e184c6499fd784599436b3d81a2e422e90d69505ece3bcdc1b9f08118588ff03d14e48e784686baa523048279ac8b0dd575c69
6
+ metadata.gz: 5b3e0c43ab7a515b8dcba5a6c988254d361934a87091dca35a9134b3d51833c463126695bc2ebee8a3c1430b309210fd08adc8efec6e1ddce727dd2a9c96ad28
7
+ data.tar.gz: edc0d9b4b5aa9b8fe2c98a7369cfec29a44a93a3b4808dfb95b8eb618aa6ff7ada7e0110190bb84cf35355fbcb4497c84827ddbd0eb540aeba2a3389525fd20d
@@ -6,15 +6,23 @@ on:
6
6
  push:
7
7
  branches: [ master ]
8
8
  pull_request:
9
+ paths-ignore:
10
+ - .github/workflows/ubuntu.yml
11
+ - .github/workflows/windows.yml
9
12
 
10
13
  jobs:
11
14
  test-macos:
12
15
  name: Test on Ruby ${{ matrix.ruby }} macOS
13
16
  runs-on: macos-latest
17
+ continue-on-error: ${{ matrix.experimental }}
14
18
  strategy:
15
19
  fail-fast: false
16
20
  matrix:
17
21
  ruby: [ '2.6', '2.5', '2.4' ]
22
+ experimental: [false]
23
+ include:
24
+ - ruby: '2.7'
25
+ experimental: true
18
26
  steps:
19
27
  - uses: actions/checkout@master
20
28
  - name: Use Ruby
@@ -5,16 +5,26 @@ name: ubuntu
5
5
  on:
6
6
  push:
7
7
  branches: [ master ]
8
+ tags:
9
+ - '*'
8
10
  pull_request:
11
+ paths-ignore:
12
+ - .github/workflows/macos.yml
13
+ - .github/workflows/windows.yml
9
14
 
10
15
  jobs:
11
16
  test-linux:
12
17
  name: Test on Ruby ${{ matrix.ruby }} Ubuntu
13
18
  runs-on: ubuntu-latest
19
+ continue-on-error: ${{ matrix.experimental }}
14
20
  strategy:
15
21
  fail-fast: false
16
22
  matrix:
17
23
  ruby: [ '2.6', '2.5', '2.4' ]
24
+ experimental: [false]
25
+ include:
26
+ - ruby: '2.7'
27
+ experimental: true
18
28
  steps:
19
29
  - uses: actions/checkout@master
20
30
  - name: Use Ruby
@@ -6,15 +6,23 @@ on:
6
6
  push:
7
7
  branches: [ master ]
8
8
  pull_request:
9
+ paths-ignore:
10
+ - .github/workflows/macos.yml
11
+ - .github/workflows/ubuntu.yml
9
12
 
10
13
  jobs:
11
14
  test-windows:
12
15
  name: Test on Ruby ${{ matrix.ruby }} Windows
13
16
  runs-on: windows-latest
17
+ continue-on-error: ${{ matrix.experimental }}
14
18
  strategy:
15
19
  fail-fast: false
16
20
  matrix:
17
21
  ruby: [ '2.6', '2.5', '2.4' ]
22
+ experimental: [false]
23
+ include:
24
+ - ruby: '2.7'
25
+ experimental: true
18
26
  steps:
19
27
  - uses: actions/checkout@master
20
28
  - name: Use Ruby
@@ -223,6 +223,10 @@ Used to indicate the date of errata releases.
223
223
  The date at which a draft is circulated. Displayed on the cover page of drafts.
224
224
  MANDATORY FOR DRAFTS.
225
225
 
226
+ `:language:`::
227
+ Two-letter code (ISO 639-1) of the language the document is written in. Defaults to `en`.
228
+ If multiple languages are used in the document, comma-delimited; e.g. `en,fr`.
229
+
226
230
  === NIST-specific attributes
227
231
 
228
232
  The following document attributes are specific to this document class:
@@ -239,11 +243,29 @@ Added to authority statement as document contact. Use line breaks (in Asciidocto
239
243
  `:revision:`:: The document revision; e.g. `1` (Revision 1). Will be stored in Metanorma XML
240
244
  under the `<edition>` tag, with the prefix `Revision `.
241
245
 
246
+ `:version:`:: The document version, when titled as version. Will be stored in Metanorma XML
247
+ under the `<edition>` tag, with the prefix `Version `.
248
+
242
249
  `:volume:`::
243
250
  The number of the volume of a standard. Is ignored if a precomposed
244
251
  document identifier (`:docidentifier:`) is supplied.
245
252
  Is prefixed with "Volume" or "Vol." in display.
246
253
 
254
+ `:part:`::
255
+ The part number of a standard. Is only used to generate machine readable NIST identifier (nist-mr).
256
+
257
+ `:section:`::
258
+ The section number of a standard. Is only used to generate machine readable NIST identifier (nist-mr).
259
+
260
+ `:supplement:`::
261
+ The supplement number of a standard. Is only used to generate machine readable NIST identifier (nist-mr).
262
+
263
+ `:index:`::
264
+ The index number of a standard. Is only used to generate machine readable NIST identifier (nist-mr).
265
+
266
+ `:update:`::
267
+ The update number of a standard. Is only used to generate machine readable NIST identifier (nist-mr).
268
+
247
269
  `:title-main:`:: The title of the document.
248
270
  `:title-sub:`:: The subtitle of the document.
249
271
 
@@ -88,7 +88,7 @@
88
88
  <text/>
89
89
  </element>
90
90
  </define>
91
- <define name="LocalizedString">
91
+ <define name="LocalizedString1">
92
92
  <optional>
93
93
  <!-- multiple languages and scripts possible: comma delimit them if so -->
94
94
  <attribute name="language"/>
@@ -98,6 +98,16 @@
98
98
  </optional>
99
99
  <text/>
100
100
  </define>
101
+ <define name="LocalizedString">
102
+ <choice>
103
+ <ref name="LocalizedString1"/>
104
+ <oneOrMore>
105
+ <element name="variant">
106
+ <ref name="LocalizedString1"/>
107
+ </element>
108
+ </oneOrMore>
109
+ </choice>
110
+ </define>
101
111
  <!--
102
112
  Unlike UML, change type to format: type is overloaded
103
113
  Would be need if plain were default value and could omit the attribute
@@ -121,7 +131,7 @@
121
131
  </optional>
122
132
  <ref name="LocalizedStringOrXsAny"/>
123
133
  </define>
124
- <define name="LocalizedStringOrXsAny">
134
+ <define name="LocalizedStringOrXsAny1">
125
135
  <optional>
126
136
  <!-- multiple languages and scripts possible: comma delimit them if so -->
127
137
  <attribute name="language"/>
@@ -136,6 +146,16 @@
136
146
  </choice>
137
147
  </oneOrMore>
138
148
  </define>
149
+ <define name="LocalizedStringOrXsAny">
150
+ <choice>
151
+ <ref name="LocalizedStringOrXsAny1"/>
152
+ <oneOrMore>
153
+ <element name="variant">
154
+ <ref name="LocalizedStringOrXsAny1"/>
155
+ </element>
156
+ </oneOrMore>
157
+ </choice>
158
+ </define>
139
159
  <define name="contributor">
140
160
  <element name="contributor">
141
161
  <zeroOrMore>
@@ -512,7 +532,7 @@
512
532
  </define>
513
533
  <define name="LocalityType">
514
534
  <data type="string">
515
- <param name="pattern">section|clause|part|paragraph|chapter|page|whole|table|annex|figure|note|list|example|volume|issue|time|locality:[a-zA-Z0-9_]+</param>
535
+ <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>
516
536
  </data>
517
537
  </define>
518
538
  <define name="referenceFrom">
@@ -641,9 +661,9 @@
641
661
  <optional>
642
662
  <ref name="status"/>
643
663
  </optional>
644
- <optional>
664
+ <zeroOrMore>
645
665
  <ref name="copyright"/>
646
- </optional>
666
+ </zeroOrMore>
647
667
  <zeroOrMore>
648
668
  <ref name="docrelation"/>
649
669
  </zeroOrMore>
@@ -1001,7 +1021,17 @@
1001
1021
  <optional>
1002
1022
  <ref name="to"/>
1003
1023
  </optional>
1004
- <ref name="owner"/>
1024
+ <oneOrMore>
1025
+ <ref name="owner"/>
1026
+ </oneOrMore>
1027
+ <optional>
1028
+ <ref name="copyright_scope"/>
1029
+ </optional>
1030
+ </element>
1031
+ </define>
1032
+ <define name="copyright_scope">
1033
+ <element name="scope">
1034
+ <text/>
1005
1035
  </element>
1006
1036
  </define>
1007
1037
  <define name="from">
@@ -100,12 +100,12 @@ module Asciidoctor
100
100
  super
101
101
  ret = get_all_nist_refs(docxml)
102
102
  tallies = ret.inject(Hash.new(0)) do |memo, (k, v)|
103
- memo[v[:trunc]] += 1
103
+ memo[v[:trunc]] += 1 unless v[:trunc].nil?
104
104
  memo
105
105
  end
106
106
  ret.each do |k, v|
107
107
  tallies[v[:trunc]] == 1 and @anchors[k][:xref] = v[:trunc]
108
- @anchors[k][:xref].sub!(/^NIST /, "")
108
+ @anchors&.dig(k, :xref)&.sub!(/^NIST /, "")
109
109
  end
110
110
  end
111
111
 
@@ -149,10 +149,11 @@ module Asciidoctor
149
149
  key = /^\[\d+\]$/.match(metaid) ? ( @citation_order[metaid] % "09%d" ) : metaid
150
150
  elsif metaid = bib&.at("./docidentifier[@type = 'NIST']")&.text
151
151
  key = metaid.sub(/-(\d+)/) {|m| sprintf "-%09d", ($1.to_i) }
152
- else
153
- metaid = bib&.at("./docidentifier[not(@type = 'DOI' or "\
152
+ elsif metaid = bib&.at("./docidentifier[not(@type = 'DOI' or "\
154
153
  "@type = 'metanorma' or @type = 'ISSN' or @type = 'ISBN')]")&.text
155
154
  key = metaid.sub(/-(\d+)/) {|m| sprintf "-%09d", ($1.to_i) }
155
+ else # no usable docid
156
+ key = "000000000" + bib["id"]
156
157
  end
157
158
  title = bib&.at("./title[@type = 'main']")&.text ||
158
159
  bib&.at("./title")&.text || bib&.at("./formattedref")&.text
@@ -97,21 +97,12 @@ module Asciidoctor
97
97
  super
98
98
  end
99
99
 
100
- def document(node)
101
- init(node)
102
- ret1 = makexml(node)
103
- ret = ret1.to_xml(indent: 2)
104
- unless node.attr("nodoc") || !node.attr("docfile")
105
- filename = node.attr("docfile").gsub(/\.adoc/, ".xml").
106
- gsub(%r{^.*/}, "")
107
- File.open(filename, "w:UTF-8") { |f| f.write(ret) }
108
- html_converter(node).convert filename unless node.attr("nodoc")
109
- word_converter(node).convert filename unless node.attr("nodoc")
110
- pdf_converter(node)&.convert filename unless node.attr("nodoc")
111
- end
112
- @log.write(@localdir + @filename + ".err") unless @novalid
113
- @files_to_delete.each { |f| FileUtils.rm f }
114
- ret
100
+ def outputs(node, ret)
101
+ File.open(@filename + ".xml", "w:UTF-8") { |f| f.write(ret) }
102
+ presentation_xml_converter(node).convert(@filename + ".xml")
103
+ html_converter(node).convert(@filename + ".presentation.xml", nil, false, "#{@filename}.html")
104
+ doc_converter(node).convert(@filename + ".presentation.xml", nil, false, "#{@filename}.doc")
105
+ pdf_converter(node)&.convert(@filename + ".presentation.xml", nil, false, "#{@filename}.pdf")
115
106
  end
116
107
 
117
108
  def clause_parse(attrs, xml, node)
@@ -151,36 +142,12 @@ module Asciidoctor
151
142
  end
152
143
  end
153
144
 
154
- def section(node)
155
- a = section_attributes(node)
156
- noko do |xml|
157
- case sectiontype(node)
158
- #when "normative references" then norm_ref_parse(a, xml, node)
159
- when "terms and definitions"
160
- if node.attr("style") == "appendix" && node.level == 1
161
- @term_def = true
162
- terms_annex_parse(a, xml, node)
163
- @term_def = false
164
- else
165
- clause_parse(a, xml, node)
166
- end
167
- when "acknowledgements"
168
- acknowledgements_parse(a, xml, node)
169
- else
170
- if @term_def
171
- term_def_subclause_parse(a, xml, node)
172
- elsif @biblio then bibliography_parse(a, xml, node)
173
- elsif node.attr("style") == "bibliography"
174
- bibliography_parse(a, xml, node)
175
- elsif node.attr("style") == "abstract"
176
- abstract_parse(a, xml, node)
177
- elsif node.attr("style") == "appendix" && node.level == 1
178
- annex_parse(a, xml, node)
179
- else
180
- clause_parse(a, xml, node)
181
- end
182
- end
183
- end.join("\n")
145
+ def term_def_parse(attrs, xml, node, toplevel)
146
+ if node.attr("style") == "appendix" && node.level == 1
147
+ terms_annex_parse(attrs, xml, node)
148
+ else
149
+ clause_parse(attrs, xml, node)
150
+ end
184
151
  end
185
152
 
186
153
  def bibliography_parse(a, xml, node)
@@ -194,8 +161,8 @@ module Asciidoctor
194
161
  xml.annex **attr_code(attrs1) do |xml_section|
195
162
  xml_section.title { |t| t << "Bibliography" }
196
163
  @biblio = true
197
- xml.references **attr_code(attrs) do |xml_section|
198
- xml_section << node.content
164
+ xml.references **attr_code(attrs.merge(normative: true)) do |r|
165
+ r << node.content
199
166
  end
200
167
  end
201
168
  @biblio = false
@@ -227,11 +194,15 @@ module Asciidoctor
227
194
  super
228
195
  end
229
196
 
197
+ def presentation_xml_converter(node)
198
+ IsoDoc::NIST::PresentationXMLConvert.new(html_extract_attributes(node))
199
+ end
200
+
230
201
  def html_converter(node)
231
202
  IsoDoc::NIST::HtmlConvert.new(html_extract_attributes(node))
232
203
  end
233
204
 
234
- def word_converter(node)
205
+ def doc_converter(node)
235
206
  IsoDoc::NIST::WordConvert.new(doc_extract_attributes(node))
236
207
  end
237
208
 
@@ -20,6 +20,7 @@ module Asciidoctor
20
20
  def metadata_version(node, xml)
21
21
  xml.edition node.attr("edition") if node.attr("edition")
22
22
  xml.edition "Revision #{node.attr("revision")}" if node.attr("revision")
23
+ xml.edition "Version #{node.attr("version")}" if node.attr("version")
23
24
  xml.version do |v|
24
25
  v.revision_date node.attr("revdate") if node.attr("revdate")
25
26
  v.draft node.attr("draft") if node.attr("draft")
@@ -1,17 +1,16 @@
1
+ require "iso-639"
2
+
1
3
  module Asciidoctor
2
4
  module NIST
3
5
  class Converter < Standoc::Converter
4
6
  def metadata_id(node, xml)
5
7
  did = node.attr("docidentifier")
6
8
  dn = node.attr("docnumber")
7
- dn = Iso690Render.MMMddyyyy(node.attr("issued-date")) if @series == "nist-cswp" and !dn
8
- if did
9
- xml.docidentifier did, **attr_code(type: "NIST")
10
- xml.docidentifier unabbreviate(did), **attr_code(type: "nist-long")
11
- else
12
- metadata_id_compose(node, xml, dn)
13
- end
14
- xml.docnumber node.attr("docnumber")
9
+ @series == "nist-cswp" && !node.attr("docnumber") and
10
+ dn = Iso690Render.MMMddyyyy(node.attr("issued-date"))
11
+ metadata_id_compose(node, xml, dn, did)
12
+ xml.docnumber node.attr("docnumber") ||
13
+ did&.sub(/^[^0-9]*/, "")&.sub(/[ -].*$/, "")
15
14
  end
16
15
 
17
16
  def unabbreviate(did)
@@ -21,26 +20,42 @@ module Asciidoctor
21
20
  end
22
21
 
23
22
  def id_args(node, dn0)
23
+ return nil unless dn0
24
24
  {
25
25
  id: dn0,
26
26
  series: node.attr("series"),
27
+ edition: node.attr("edition"),
28
+ version: node.attr("version"),
27
29
  revision: node.attr("revision"),
30
+ update: node.attr("update"),
31
+ year: (node.attr("copyright-year") || node.attr("updated-date") ||
32
+ node.attr("revdate") || node.attr("circulated-date") ||
33
+ Date.today.year.to_s).sub(/^(....).*$/, "\\1"),
28
34
  vol: node.attr("volume"),
35
+ part: node.attr("part") || node.attr("part-number"),
36
+ section: node.attr("section") || node.attr("section-number"),
37
+ supplement: node.attr("supplement") || node.attr("supplement-number"),
38
+ index: node.attr("index") || node.attr("index-number"),
29
39
  stage: node.attr("status") || node.attr("docstage"),
30
40
  iter: node.attr("iteration"),
41
+ language: node.attr("language") || "en",
31
42
  date: /^draft/.match(node.attr("status") || node.attr("docstage")) ?
32
43
  (node.attr("circulated-date") || node.attr("revdate")) :
33
44
  node.attr("updated-date")
34
45
  }
35
46
  end
36
47
 
37
- def metadata_id_compose(node, xml, dn0)
38
- return unless dn0
39
- args = id_args(node, dn0)
40
- xml.docidentifier add_id_parts(args, false), **attr_code(type: "NIST")
41
- xml.docidentifier add_id_parts(args, true),
42
- **attr_code(type: "nist-long")
43
- xml.docidentifier add_id_parts_mr(args), **attr_code(type: "nist-mr")
48
+ def metadata_id_compose(node, xml, dn0, did)
49
+ if did
50
+ xml.docidentifier did, **attr_code(type: "NIST")
51
+ xml.docidentifier unabbreviate(did), **attr_code(type: "nist-long")
52
+ else
53
+ args = id_args(node, dn0) || return
54
+ xml.docidentifier add_id_parts(args, false), **attr_code(type: "NIST")
55
+ xml.docidentifier add_id_parts(args, true),
56
+ **attr_code(type: "nist-long")
57
+ xml.docidentifier add_id_parts_mr(args), **attr_code(type: "nist-mr")
58
+ end
44
59
  end
45
60
 
46
61
  def MMMddyyyy(isodate)
@@ -48,26 +63,61 @@ module Asciidoctor
48
63
  Date.parse(isodate).strftime("%B %d, %Y")
49
64
  end
50
65
 
66
+ def status_abbr(stage, iter)
67
+ IsoDoc::NIST::Metadata.new(nil, nil, {}).status_abbr(stage, iter)
68
+ end
69
+
51
70
  def add_id_parts(args, long)
52
- vol_delim = " Volume "
53
- ed_delim = " Revision "
54
71
  args[:series] and series_name = long ?
55
72
  SERIES.dig(args[:series].to_sym) :
56
73
  SERIES_ABBR.dig(args[:series].to_sym)
57
74
  dn = (series_name || "NIST #{args[:series]}") + " " + args[:id]
58
- dn += "#{vol_delim}#{args[:vol]}" if args[:vol]
75
+ dn += " Volume #{args[:vol]}" if args[:vol]
59
76
  dn += "," if args[:vol] && args[:revision]
60
- dn += "#{ed_delim}#{args[:revision]}" if args[:revision]
61
- stage = IsoDoc::NIST::Metadata.new(nil, nil, {}).status_abbr(args[:stage], args[:iter])
62
- dn += " (#{stage})" if stage
77
+ dn += " Revision #{args[:revision]}" if args[:revision]
78
+ dn += "/Upd #{args[:update]}:#{args[:year]}" if args[:update]
79
+ stage = status_abbr(args[:stage], args[:iter]) and dn += " (#{stage})"
63
80
  dn += " (#{MMMddyyyy(args[:date])})" if args[:date]
64
81
  dn
65
82
  end
66
83
 
84
+ def id_parts_mr(args)
85
+ part = []
86
+ part << "v-#{args[:vol]}" if args[:vol]
87
+ part << "pt-#{args[:part]}" if args[:part]
88
+ part << "sec-#{args[:section]}" if args[:section]
89
+ part << "sup-#{args[:supplement]}" if args[:supplement]
90
+ part << "indx-#{args[:index]}" if args[:index]
91
+ part
92
+ end
93
+
94
+ def id_editions_mr(args)
95
+ part = []
96
+ part << "e-#{args[:edition]}" if args[:edition]
97
+ part << "r-#{args[:revision]}" if args[:revision]
98
+ part << "ver-#{args[:version]}" if args[:version]
99
+ part
100
+ end
101
+
102
+ def id_lang_mr(args)
103
+ ret = args[:language].split(/,\s*/).map do |l|
104
+ ISO_639.find(l).alpha3
105
+ end.join(",")
106
+ end
107
+
67
108
  def add_id_parts_mr(args)
109
+ ret = ["NIST"]
68
110
  args[:series] and
69
- name = SERIES_ABBR&.dig(args[:series].to_sym)&.sub(/^NIST /, "")
70
- "NIST.#{name}.#{args[:id]}.#{args[:vol]}.#{args[:revision]}.#{args[:date]}"
111
+ ret << SERIES_ABBR&.dig(args[:series].to_sym)&.sub(/^NIST /, "")
112
+ stage = status_abbr(args[:stage], nil) || ""
113
+ stage += "[-#{args[:iter]}]" if args[:iter]
114
+ ret << stage unless stage.empty?
115
+ ret << args[:id]
116
+ ret += id_parts_mr(args)
117
+ ret += id_editions_mr(args)
118
+ ret << id_lang_mr(args)
119
+ args[:update] and ret << "upd-#{args[:update]}:#{args[:year]}"
120
+ ret.join(".")
71
121
  end
72
122
  end
73
123
  end