metanorma-nist 1.0.7 → 1.1.1

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: 72c7502d9dc8978bc2402c8fdd67a5cb1c8d1c2776c15d74468ea5310d4f6d62
4
- data.tar.gz: b1ce3e575c5037b59efe26d4ad95081fa54faccb3314cb9e38f697a0636cf6df
3
+ metadata.gz: 9fd53abb651e6ed6f607f8cd697e00819b5db05c5e4540df273348c2bc61a85f
4
+ data.tar.gz: c76ec958d5ebae5b2fb3f9b24db5186645022e48745fcf3f4382c93d2634a046
5
5
  SHA512:
6
- metadata.gz: 6cb6ee595c62afbf5b0e827d8f06b56bc8eb19f382c7f01f6937eca0eb73a88d666a9261545d28330290e3e57a7cd4d8d4d08bfa793b4deecedecf53999f9553
7
- data.tar.gz: b340ff8aa99bdfd02185c86235624ab56cf18193be0265da03e5770d9d95e6df1be22c8bed76db2d90d3189f9297e4a264281d888838b29e8bffe9a59268aa29
6
+ metadata.gz: a96a9016064a2ab39601cb0d500e77625d550f1175c84a1bcc4f4858d2a46c3661507797ed627e059500242a9a7fd78dc37f3f74592eee9ea66dad0e5e70257d
7
+ data.tar.gz: 61ea2bf1cb04e1840010e0f7af70b08987fd7d957584ed44862d3eaf1adc74d7bb9f6d0f0bab83635c0b63825d1f3580201c0981e0462bc7ce82a96fb1dd3069
@@ -6,22 +6,29 @@ 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
21
29
  uses: actions/setup-ruby@v1
22
30
  with:
23
31
  ruby-version: ${{ matrix.ruby }}
24
- architecture: 'x64'
25
32
  - name: Update gems
26
33
  run: |
27
34
  sudo gem install bundler --force
@@ -5,23 +5,32 @@ 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
21
31
  uses: actions/setup-ruby@v1
22
32
  with:
23
33
  ruby-version: ${{ matrix.ruby }}
24
- architecture: 'x64'
25
34
  - name: Update gems
26
35
  run: |
27
36
  gem install bundler
@@ -29,15 +38,19 @@ jobs:
29
38
  - name: Run specs
30
39
  run: |
31
40
  bundle exec rake
32
- - name: Trigger dependent repositories
33
- if: github.ref == 'refs/heads/master' && matrix.ruby == '2.6'
41
+ - name: Trigger repositories
42
+ if: matrix.ruby == '2.6'
34
43
  env:
35
- GH_USERNAME: ${{ secrets.PAT_USERNAME }}
36
- GH_ACCESS_TOKEN: ${{ secrets.PAT_TOKEN }}
44
+ GH_USERNAME: metanorma-ci
45
+ GH_ACCESS_TOKEN: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
37
46
  run: |
38
47
  curl -LO --retry 3 https://raw.githubusercontent.com/metanorma/metanorma-build-scripts/master/trigger-gh-actions.sh
39
48
  [[ -f ".github/workflows/dependent_repos.env" ]] && source .github/workflows/dependent_repos.env
40
- for repo in $DEPENDENT_REPOS
49
+ CLIENT_PAYLOAD=$(cat <<EOF
50
+ "{ "ref": "${GITHUB_REF}", "repo": "${GITHUB_REPOSITORY}" }"
51
+ EOF
52
+ )
53
+ for repo in $REPOS
41
54
  do
42
- sh trigger-gh-actions.sh $ORGANISATION $repo $GH_USERNAME $GH_ACCESS_TOKEN $GITHUB_REPOSITORY "{ \"ref\": \"${GITHUB_REF}\" }"
55
+ sh trigger-gh-actions.sh $ORGANISATION $repo $GH_USERNAME $GH_ACCESS_TOKEN $GITHUB_REPOSITORY "$CLIENT_PAYLOAD"
43
56
  done
@@ -6,22 +6,29 @@ 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
21
29
  uses: actions/setup-ruby@v1
22
30
  with:
23
31
  ruby-version: ${{ matrix.ruby }}
24
- architecture: 'x64'
25
32
  - name: Update gems
26
33
  shell: pwsh
27
34
  run: |
@@ -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)
@@ -170,8 +161,8 @@ module Asciidoctor
170
161
  xml.annex **attr_code(attrs1) do |xml_section|
171
162
  xml_section.title { |t| t << "Bibliography" }
172
163
  @biblio = true
173
- xml.references **attr_code(attrs) do |xml_section|
174
- xml_section << node.content
164
+ xml.references **attr_code(attrs.merge(normative: true)) do |r|
165
+ r << node.content
175
166
  end
176
167
  end
177
168
  @biblio = false
@@ -203,11 +194,15 @@ module Asciidoctor
203
194
  super
204
195
  end
205
196
 
197
+ def presentation_xml_converter(node)
198
+ IsoDoc::NIST::PresentationXMLConvert.new(html_extract_attributes(node))
199
+ end
200
+
206
201
  def html_converter(node)
207
202
  IsoDoc::NIST::HtmlConvert.new(html_extract_attributes(node))
208
203
  end
209
204
 
210
- def word_converter(node)
205
+ def doc_converter(node)
211
206
  IsoDoc::NIST::WordConvert.new(doc_extract_attributes(node))
212
207
  end
213
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