metanorma-nist 0.2.14 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 70c9e42e24e708b9f976011dfa482e7479f69236bbab12085fca5000f67f5f46
4
- data.tar.gz: 3b50a5e413ebee30ffcebc8c95ebd4cf2bba893686026dcdf9c0218063ba37ce
3
+ metadata.gz: 390fa7e0d2b9f5159246cb5334ac5aa765da260f7e01305806f011e90bb0e357
4
+ data.tar.gz: 3e571e05d0a8885bf9c857fbd3a9a0f588eb114a47a1f7e2f70e1fa76dd15653
5
5
  SHA512:
6
- metadata.gz: c75d78cc1dc4c160b47de98a9591b013affc1759afef6def5d65d023db1d7e3aeaaed4dd173995ba7b1c7945813d3db74d8fd3aa2aed23b16cce83976e28b15b
7
- data.tar.gz: 07bd75b3208d1fc23919eb0d5550dacd4833bbb34fb06b191dd74054b21923d120bbb75cb12c28f6c142ac4598f3bccdb2a2930444fa8d32d8892dfbdbc8a8fa
6
+ metadata.gz: 929748797649b3913451079a7f6ea48f975eb35aa395cf7ac26077a9a662c8785e2923cf51aa3b17651323235eb14b72331f7b2c3637796b5bf203e46f51079d
7
+ data.tar.gz: 2e29269159b3938c08f7c3ea1c3db30de91a648afb2e11713ebe171823b25a91c9aeee0469f5c8e8d0eafd9b17fe066f52b2eafcaff89c9033cf682ba20148a3
@@ -13,7 +13,7 @@ module Asciidoctor
13
13
  module NIST
14
14
  class Converter < Standoc::Converter
15
15
  XML_ROOT_TAG = "nist-standard".freeze
16
- XML_NAMESPACE = "https://www.metanorma.com/ns/nist".freeze
16
+ XML_NAMESPACE = "https://www.metanorma.org/ns/nist".freeze
17
17
 
18
18
  register_for "nist"
19
19
 
@@ -58,7 +58,7 @@ module Asciidoctor
58
58
  dn += "#{vol_delim}#{args[:vol]}" if args[:vol]
59
59
  dn += "," if args[:vol] && args[:revision]
60
60
  dn += "#{ed_delim}#{args[:revision]}" if args[:revision]
61
- stage = IsoDoc::NIST::Metadata.new(nil, nil, {}).stage_abbr(args[:stage], args[:iter])
61
+ stage = IsoDoc::NIST::Metadata.new(nil, nil, {}).status_abbr(args[:stage], args[:iter])
62
62
  dn += " (#{stage})" if stage
63
63
  dn += " (#{MMMddyyyy(args[:date])})" if args[:date]
64
64
  dn
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <grammar ns="https://www.metanorma.com/ns/nist" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
2
+ <grammar ns="https://www.metanorma.org/ns/nist" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
3
3
  <!--
4
4
  Currently we inherit from a namespaced grammar, isostandard. Until we inherit from isodoc,
5
5
  we cannot have a new default namespace: we will end up with a grammar with two different
@@ -1,5 +1,6 @@
1
1
  require "isodoc"
2
2
  require "twitter_cldr"
3
+ require_relative "./metadata_id.rb"
3
4
 
4
5
  module IsoDoc
5
6
  module NIST
@@ -7,42 +8,16 @@ module IsoDoc
7
8
  def initialize(lang, script, labels)
8
9
  super
9
10
  here = File.dirname(__FILE__)
10
- set(:logo_nist,
11
- File.expand_path(File.join(here, "html", "logo.png")))
11
+ set(:logo_nist, File.expand_path(File.join(here, "html", "logo.png")))
12
12
  set(:logo_cswp,
13
13
  File.expand_path(File.join(here, "html", "logo_cswp.png")))
14
14
  set(:logo_commerce,
15
- File.expand_path(File.join(here, "html", "commerce-logo-color.png")))
15
+ File.expand_path(File.join(here, "html",
16
+ "commerce-logo-color.png")))
16
17
  set(:logo_commerce_word,
17
18
  File.expand_path(File.join(here, "html", "deptofcommerce.png")))
18
19
  end
19
20
 
20
- def iter_abbr(stage, iter)
21
- return "F" if iter&.downcase == "final" &&
22
- %w(draft-wip draft-prelim draft-public draft-approval).include?(stage)
23
- case stage
24
- when "draft-wip", "draft-prelim", "dradt-internal", "draft-approval"
25
- iter || ""
26
- when "draft-public"
27
- iter ||= "1"
28
- iter == "1" ? "I" : iter
29
- else
30
- ""
31
- end
32
- end
33
-
34
- def stage_abbr(stage, iter)
35
- case stage
36
- when "draft-internal" then "#{iter_abbr(stage, iter)}ID"
37
- when "draft-wip" then "#{iter_abbr(stage, iter)}WD"
38
- when "draft-prelim" then "#{iter_abbr(stage, iter)}PreD"
39
- when "draft-public" then "#{iter_abbr(stage, iter)}PD"
40
- when "draft-approval" then "#{iter_abbr(stage, iter)}AD"
41
- else
42
- nil
43
- end
44
- end
45
-
46
21
  def title(ixml, out)
47
22
  main = ixml&.at(ns("//bibdata/title[@type = 'main']"))&.text
48
23
  set(:doctitle, main)
@@ -64,86 +39,8 @@ module IsoDoc
64
39
  set(:tc, tc.text.upcase) if tc
65
40
  personal_authors(ixml)
66
41
  subdiv = ixml.at(ns("//bibdata/contributor[role/@type = 'publisher']/"\
67
- "organization/subdivision"))
68
- set(:nist_subdiv, subdiv.text) if subdiv
69
- end
70
-
71
- def docid(ixml, _out)
72
- docid = ixml.at(ns("//bibdata/docidentifier[@type = 'NIST']"))&.text
73
- docid_long = ixml.at(ns("//bibdata/docidentifier"\
74
- "[@type = 'nist-long']"))&.text
75
- docnumber = ixml.at(ns("//bibdata/docnumber"))&.text
76
- set(:docidentifier, docid)
77
- set(:docidentifier_long, docid_long)
78
- set(:docidentifier_undated, stripdate(docid))
79
- set(:docidentifier_long_undated, stripdate(docid_long))
80
- d = draft_prefix(ixml) and set(:draft_prefix, d)
81
- d = iter_code(ixml) and set(:iteration_code, d)
82
- d = iter_ordinal(ixml) and set(:iteration_ordinal, d)
83
- set(:docnumber, docnumber)
84
- end
85
-
86
- def stripdate(id)
87
- return if id.nil?
88
- id.sub(/ \((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[^)]+\)$/,
89
- "")
90
- end
91
-
92
- def draft_prefix(ixml)
93
- docstatus = ixml.at(ns("//bibdata/status/stage"))&.text
94
- return nil unless docstatus && /^draft/.match(docstatus)
95
- iter = iter_code(ixml)
96
- prefix = "DRAFT "
97
- iter and prefix += "(#{iter}) "
98
- prefix
99
- end
100
-
101
- def iter_code(ixml)
102
- docstatus = ixml.at(ns("//bibdata/status/stage"))&.text
103
- iter = ixml.at(ns("//bibdata/status/iteration"))&.text
104
- stage_abbr(docstatus, iter)
105
- end
106
-
107
- def iter_ordinal(ixml)
108
- docstatus = ixml.at(ns("//bibdata/status/stage"))&.text
109
- iter = ixml.at(ns("//bibdata/status/iteration"))&.text
110
- iter ||= "1" if docstatus == "draft-public"
111
- return if iter.nil?
112
- return "Initial" if iter == "1" && docstatus == "draft-public"
113
- return "Final" if iter.downcase == "final"
114
- iter.to_i.localize.to_rbnf_s("SpelloutRules", "spellout-ordinal")
115
- end
116
-
117
- def draftinfo(draft, revdate)
118
- draftinfo = ""
119
- if draft
120
- draftinfo = " #{@labels["draft_label"]} #{draft}"
121
- end
122
- IsoDoc::Function::I18n::l10n(draftinfo, @lang, @script)
123
- end
124
-
125
- def docstatus(ixml, _out)
126
- docstatus = ixml.at(ns("//bibdata/status/stage"))&.text
127
- set(:unpublished, !/^draft/.match(docstatus).nil?)
128
- substage = ixml.at(ns("//bibdata/status/substage"))&.text
129
- substage and set(:substage, substage)
130
- iter = ixml.at(ns("//bibdata/status/iteration"))&.text
131
- set(:iteration, iter) if iter
132
- set(:status, status_print(docstatus || "final"))
133
- set(:errata, true) if ixml.at(ns("//errata"))
134
- end
135
-
136
- def status_print(status)
137
- case status
138
- when "draft-internal" then "Internal Draft"
139
- when "draft-wip" then "Work-in-Progress Draft"
140
- when "draft-prelim" then "Preliminary Draft"
141
- when "draft-public" then "Public Draft"
142
- when "draft-approval" then "Approval Draft"
143
- when "final" then "Final"
144
- when "final-review" then "Under Review"
145
- when "final-withdrawn" then "Withdrawn"
146
- end
42
+ "organization/subdivision")) and
43
+ set(:nist_subdiv, subdiv.text)
147
44
  end
148
45
 
149
46
  def version(ixml, _out)
@@ -203,14 +100,13 @@ module IsoDoc
203
100
  end
204
101
 
205
102
  def series(ixml, _out)
206
- series = ixml.at(ns("//bibdata/series[@type = 'main']/title"))&.text
207
- set(:series, series) if series
103
+ series = ixml.at(ns("//bibdata/series[@type = 'main']/title"))&.text and
104
+ set(:series, series)
208
105
  seriesabbr =
209
106
  ixml.at(ns("//bibdata/series[@type = 'main']/abbreviation"))&.text
210
107
  set(:seriesabbr, seriesabbr) if seriesabbr
211
- subseries = ixml.at(ns("//bibdata/series[@type = 'secondary']/"\
212
- "title"))&.text
213
- set(:subseries, subseries) if subseries
108
+ subs = ixml.at(ns("//bibdata/series[@type = 'secondary']/"\
109
+ "title"))&.text and set(:subseries, subs)
214
110
  end
215
111
 
216
112
  def monthyr(isodate)
@@ -230,9 +126,7 @@ module IsoDoc
230
126
 
231
127
  def keywords(ixml, _out)
232
128
  keywords = []
233
- ixml.xpath(ns("//bibdata/keyword")).each do |kw|
234
- keywords << kw.text
235
- end
129
+ ixml.xpath(ns("//bibdata/keyword")).each { |kw| keywords << kw.text }
236
130
  set(:keywords, keywords)
237
131
  end
238
132
 
@@ -296,8 +190,7 @@ module IsoDoc
296
190
  end
297
191
 
298
192
  def superseding_titles(ixml, d)
299
- title = d.at(ns("./title[@type = 'main']"))&.text
300
- if title
193
+ if title = d.at(ns("./title[@type = 'main']"))&.text
301
194
  set(:superseding_title, d.at(ns("./title[@type = 'main']"))&.text)
302
195
  set(:superseding_subtitle,
303
196
  d.at(ns("./title[@type = 'subtitle']"))&.text)
@@ -0,0 +1,125 @@
1
+ module IsoDoc
2
+ module NIST
3
+ class Metadata < IsoDoc::Metadata
4
+ def iter_abbr(stage, iter)
5
+ return "F" if iter&.downcase == "final" &&
6
+ %w(draft-wip draft-prelim draft-public draft-approval).include?(stage)
7
+ case stage
8
+ when "draft-wip", "draft-prelim", "dradt-internal", "draft-approval"
9
+ iter || ""
10
+ when "draft-public"
11
+ iter ||= "1"
12
+ iter == "1" ? "I" : iter
13
+ else
14
+ ""
15
+ end
16
+ end
17
+
18
+ def stage_abbr(stage)
19
+ case stage
20
+ when "draft-internal" then "ID"
21
+ when "draft-wip" then "WD"
22
+ when "draft-prelim" then "PreD"
23
+ when "draft-public" then "PD"
24
+ when "draft-approval" then "AD"
25
+ else
26
+ nil
27
+ end
28
+ end
29
+
30
+ def status_abbr(stage, iter)
31
+ case stage
32
+ when "draft-internal" then "#{iter_abbr(stage, iter)}ID"
33
+ when "draft-wip" then "#{iter_abbr(stage, iter)}WD"
34
+ when "draft-prelim" then "#{iter_abbr(stage, iter)}PreD"
35
+ when "draft-public" then "#{iter_abbr(stage, iter)}PD"
36
+ when "draft-approval" then "#{iter_abbr(stage, iter)}AD"
37
+ else
38
+ nil
39
+ end
40
+ end
41
+
42
+ def docstatus(ixml, _out)
43
+ docstatus = ixml.at(ns("//bibdata/status/stage"))&.text
44
+ set(:unpublished, unpublished(docstatus))
45
+ substage = ixml.at(ns("//bibdata/status/substage"))&.text
46
+ substage and set(:substage, substage)
47
+ iter = ixml.at(ns("//bibdata/status/iteration"))&.text
48
+ set(:iteration, iter) if iter
49
+ set(:status, status_print(docstatus || "final"))
50
+ set(:errata, true) if ixml.at(ns("//errata"))
51
+ unpublished(docstatus) and
52
+ set(:stageabbr, stage_abbr(docstatus))
53
+ end
54
+
55
+ def unpublished(status)
56
+ !/^draft/.match(status).nil?
57
+ end
58
+
59
+ def status_print(status)
60
+ case status
61
+ when "draft-internal" then "Internal Draft"
62
+ when "draft-wip" then "Work-in-Progress Draft"
63
+ when "draft-prelim" then "Preliminary Draft"
64
+ when "draft-public" then "Public Draft"
65
+ when "draft-approval" then "Approval Draft"
66
+ when "final" then "Final"
67
+ when "final-review" then "Under Review"
68
+ when "final-withdrawn" then "Withdrawn"
69
+ end
70
+ end
71
+
72
+ def docid(ixml, _out)
73
+ docid = ixml.at(ns("//bibdata/docidentifier[@type = 'NIST']"))&.text
74
+ docid_long = ixml.at(ns("//bibdata/docidentifier"\
75
+ "[@type = 'nist-long']"))&.text
76
+ set(:docidentifier, docid)
77
+ set(:docidentifier_long, docid_long)
78
+ set(:docidentifier_undated, stripdate(docid))
79
+ set(:docidentifier_long_undated, stripdate(docid_long))
80
+ d = draft_prefix(ixml) and set(:draft_prefix, d)
81
+ d = iter_code(ixml) and set(:iteration_code, d)
82
+ d = iter_ordinal(ixml) and set(:iteration_ordinal, d)
83
+ end
84
+
85
+ def stripdate(id)
86
+ return if id.nil?
87
+ id.sub(/ \((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[^)]+\)$/,
88
+ "")
89
+ end
90
+
91
+ def draft_prefix(ixml)
92
+ docstatus = ixml.at(ns("//bibdata/status/stage"))&.text
93
+ return nil unless docstatus && /^draft/.match(docstatus)
94
+ iter = iter_code(ixml)
95
+ prefix = "DRAFT "
96
+ iter and prefix += "(#{iter}) "
97
+ prefix
98
+ end
99
+
100
+ def iter_code(ixml)
101
+ docstatus = ixml.at(ns("//bibdata/status/stage"))&.text
102
+ iter = ixml.at(ns("//bibdata/status/iteration"))&.text
103
+ status_abbr(docstatus, iter)
104
+ end
105
+
106
+ def iter_ordinal(ixml)
107
+ docstatus = ixml.at(ns("//bibdata/status/stage"))&.text
108
+ iter = ixml.at(ns("//bibdata/status/iteration"))&.text
109
+ iter ||= "1" if docstatus == "draft-public"
110
+ return if iter.nil?
111
+ return "Initial" if iter == "1" && docstatus == "draft-public"
112
+ return "Final" if iter.downcase == "final"
113
+ iter.to_i.localize.to_rbnf_s("SpelloutRules", "spellout-ordinal")
114
+ end
115
+
116
+ def draftinfo(draft, revdate)
117
+ draftinfo = ""
118
+ if draft
119
+ draftinfo = " #{@labels["draft_label"]} #{draft}"
120
+ end
121
+ IsoDoc::Function::I18n::l10n(draftinfo, @lang, @script)
122
+ end
123
+ end
124
+ end
125
+ end
@@ -1,5 +1,7 @@
1
1
  require "nokogiri"
2
2
  require "twitter_cldr"
3
+ require_relative "render_contributors"
4
+ require_relative "render_dates"
3
5
 
4
6
  module Iso690Render
5
7
  =begin
@@ -12,85 +14,6 @@ module Iso690Render
12
14
  parse(docxml.root, embedded)
13
15
  end
14
16
 
15
- =begin
16
- def self.multiplenames_and(names)
17
- return "" if names.length == 0
18
- return names[0] if names.length == 1
19
- return "#{names[0]} and #{names[1]}" if names.length == 2
20
- names[0..-2].join(", ") + " and #{names[-1]}"
21
- end
22
- =end
23
-
24
- def self.multiplenames(names)
25
- names.join(", ")
26
- end
27
-
28
- def self.extract_orgname(org)
29
- name = org.at("./name")
30
- name&.text || "--"
31
- end
32
-
33
- def self.frontname(given, initials)
34
- if given.empty? && initials.empty? then ""
35
- elsif initials.empty?
36
- given.map{ |m| m.text[0] }.join("")
37
- else
38
- initials.map{ |m| m.text[0] }.join("")
39
- end
40
- end
41
-
42
- def self.commajoin(a, b)
43
- return a unless b
44
- return b unless a
45
- #"#{a}, #{b}"
46
- "#{a} #{b}"
47
- end
48
-
49
- def self.extract_personname(person)
50
- completename = person.at("./name/completename")
51
- return completename.text if completename
52
- surname = person.at("./name/surname")
53
- initials = person.xpath("./name/initials")
54
- forenames = person.xpath("./name/forename")
55
- #given = []
56
- #forenames.each { |x| given << x.text }
57
- #given.empty? && initials.each { |x| given << x.text }
58
- commajoin(surname&.text, frontname(forenames, initials))
59
- end
60
-
61
- def self.extractname(contributor)
62
- org = contributor.at("./organization")
63
- person = contributor.at("./person")
64
- return extract_orgname(org) if org
65
- return extract_personname(person) if person
66
- "--"
67
- end
68
-
69
- def self.contributorRole(contributors)
70
- return "" unless contributors.length > 0
71
- if contributors[0]&.at("role/@type")&.text == "editor"
72
- return contributors.length > 1 ? " (Eds.)" : "(Ed.)"
73
- end
74
- ""
75
- end
76
-
77
- def self.creatornames(doc)
78
- cr = doc.xpath("./contributor[role/@type = 'author']")
79
- cr.empty? and cr = doc.xpath("./contributor[role/@type = 'performer']")
80
- cr.empty? and cr = doc.xpath("./contributor[role/@type = 'adapter']")
81
- cr.empty? and cr = doc.xpath("./contributor[role/@type = 'translator']")
82
- cr.empty? and cr = doc.xpath("./contributor[role/@type = 'editor']")
83
- cr.empty? and cr = doc.xpath("./contributor[role/@type = 'publisher']")
84
- cr.empty? and cr = doc.xpath("./contributor[role/@type = 'distributor']")
85
- cr.empty? and cr = doc.xpath("./contributor")
86
- cr.empty? and return ""
87
- ret = []
88
- cr.each do |x|
89
- ret << extractname(x)
90
- end
91
- multiplenames(ret) + contributorRole(cr)
92
- end
93
-
94
17
  def self.title(doc)
95
18
  doc&.at("./title")&.text
96
19
  end
@@ -131,34 +54,6 @@ module Iso690Render
131
54
  ret
132
55
  end
133
56
 
134
- def self.date1(date)
135
- return nil if date.nil?
136
- on = date&.at("./on")&.text
137
- from = date&.at("./from")&.text
138
- to = date&.at("./to")&.text
139
- return MMMddyyyy(on) if on
140
- return "#{MMMddyyyy(from)}&ndash;#{MMMddyyyy(to)}" if from
141
- nil
142
- end
143
-
144
- def self.date(doc)
145
- updated = date1(doc&.at("./date[@type = 'updated']"))
146
- pub = date1(doc&.at("./date[@type = 'issued']"))
147
- if pub
148
- ret = pub
149
- ret += " (updated #{updated})" if updated
150
- return ret
151
- end
152
- pub = date1(doc&.at("./date[@type = 'circulated']")) and
153
- return pub
154
- date1(doc&.at("./date"))
155
- end
156
-
157
- def self.year(date)
158
- return nil if date.nil?
159
- date.sub(/^(\d\d\d\d).*$/, "\\1")
160
- end
161
-
162
57
  def self.series_title(doc)
163
58
  s = doc.at("./series[@type = 'main']") ||
164
59
  doc.at("./series[not(@type)]") ||
@@ -260,43 +155,6 @@ module Iso690Render
260
155
  ret.join(", ")
261
156
  end
262
157
 
263
- =begin
264
- def self.monthyr(isodate)
265
- return nil if isodate.nil?
266
- arr = isodate.split("-")
267
- date = if arr.size == 2
268
- DateTime.new(*arr.map(&:to_i))
269
- else
270
- DateTime.parse(isodate)
271
- end
272
- date.localize(:en).to_additional_s("yMMMM")
273
- end
274
-
275
- def self.mmddyyyy(isodate)
276
- return nil if isodate.nil?
277
- arr = isodate.split("-")
278
- date = if arr.size == 1 and (/^\d+$/.match isodate)
279
- Date.new(*arr.map(&:to_i)).strftime("%Y")
280
- elsif arr.size == 2
281
- Date.new(*arr.map(&:to_i)).strftime("%m-%Y")
282
- else
283
- Date.parse(isodate).strftime("%m-%d-%Y")
284
- end
285
- end
286
- =end
287
-
288
- def self.MMMddyyyy(isodate)
289
- return nil if isodate.nil?
290
- arr = isodate.split("-")
291
- date = if arr.size == 1 and (/^\d+$/.match isodate)
292
- Date.new(*arr.map(&:to_i)).strftime("%Y")
293
- elsif arr.size == 2
294
- Date.new(*arr.map(&:to_i)).strftime("%B %Y")
295
- else
296
- Date.parse(isodate).strftime("%B %d, %Y")
297
- end
298
- end
299
-
300
158
  def self.draft(doc)
301
159
  return nil unless is_nist(doc)
302
160
  dr = doc&.at("./status/stage")&.text
@@ -0,0 +1,80 @@
1
+ module Iso690Render
2
+ =begin
3
+ def self.multiplenames_and(names)
4
+ return "" if names.length == 0
5
+ return names[0] if names.length == 1
6
+ return "#{names[0]} and #{names[1]}" if names.length == 2
7
+ names[0..-2].join(", ") + " and #{names[-1]}"
8
+ end
9
+ =end
10
+
11
+ def self.multiplenames(names)
12
+ names.join(", ")
13
+ end
14
+
15
+ def self.extract_orgname(org)
16
+ name = org.at("./name")
17
+ name&.text || "--"
18
+ end
19
+
20
+ def self.frontname(given, initials)
21
+ if given.empty? && initials.empty? then ""
22
+ elsif initials.empty?
23
+ given.map{ |m| m.text[0] }.join("")
24
+ else
25
+ initials.map{ |m| m.text[0] }.join("")
26
+ end
27
+ end
28
+
29
+ def self.commajoin(a, b)
30
+ return a unless b
31
+ return b unless a
32
+ #"#{a}, #{b}"
33
+ "#{a} #{b}"
34
+ end
35
+
36
+ def self.extract_personname(person)
37
+ completename = person.at("./name/completename")
38
+ return completename.text if completename
39
+ surname = person.at("./name/surname")
40
+ initials = person.xpath("./name/initials")
41
+ forenames = person.xpath("./name/forename")
42
+ #given = []
43
+ #forenames.each { |x| given << x.text }
44
+ #given.empty? && initials.each { |x| given << x.text }
45
+ commajoin(surname&.text, frontname(forenames, initials))
46
+ end
47
+
48
+ def self.extractname(contributor)
49
+ org = contributor.at("./organization")
50
+ person = contributor.at("./person")
51
+ return extract_orgname(org) if org
52
+ return extract_personname(person) if person
53
+ "--"
54
+ end
55
+
56
+ def self.contributorRole(contributors)
57
+ return "" unless contributors.length > 0
58
+ if contributors[0]&.at("role/@type")&.text == "editor"
59
+ return contributors.length > 1 ? " (Eds.)" : "(Ed.)"
60
+ end
61
+ ""
62
+ end
63
+
64
+ def self.creatornames(doc)
65
+ cr = doc.xpath("./contributor[role/@type = 'author']")
66
+ cr.empty? and cr = doc.xpath("./contributor[role/@type = 'performer']")
67
+ cr.empty? and cr = doc.xpath("./contributor[role/@type = 'adapter']")
68
+ cr.empty? and cr = doc.xpath("./contributor[role/@type = 'translator']")
69
+ cr.empty? and cr = doc.xpath("./contributor[role/@type = 'editor']")
70
+ cr.empty? and cr = doc.xpath("./contributor[role/@type = 'publisher']")
71
+ cr.empty? and cr = doc.xpath("./contributor[role/@type = 'distributor']")
72
+ cr.empty? and cr = doc.xpath("./contributor")
73
+ cr.empty? and return ""
74
+ ret = []
75
+ cr.each do |x|
76
+ ret << extractname(x)
77
+ end
78
+ multiplenames(ret) + contributorRole(cr)
79
+ end
80
+ end
@@ -0,0 +1,66 @@
1
+ module Iso690Render
2
+ def self.date1(date)
3
+ return nil if date.nil?
4
+ on = date&.at("./on")&.text
5
+ from = date&.at("./from")&.text
6
+ to = date&.at("./to")&.text
7
+ return MMMddyyyy(on) if on
8
+ return "#{MMMddyyyy(from)}&ndash;#{MMMddyyyy(to)}" if from
9
+ nil
10
+ end
11
+
12
+ def self.date(doc)
13
+ updated = date1(doc&.at("./date[@type = 'updated']"))
14
+ pub = date1(doc&.at("./date[@type = 'issued']"))
15
+ if pub
16
+ ret = pub
17
+ ret += " (updated #{updated})" if updated
18
+ return ret
19
+ end
20
+ pub = date1(doc&.at("./date[@type = 'circulated']")) and
21
+ return pub
22
+ date1(doc&.at("./date"))
23
+ end
24
+
25
+ def self.year(date)
26
+ return nil if date.nil?
27
+ date.sub(/^(\d\d\d\d).*$/, "\\1")
28
+ end
29
+
30
+ =begin
31
+ def self.monthyr(isodate)
32
+ return nil if isodate.nil?
33
+ arr = isodate.split("-")
34
+ date = if arr.size == 2
35
+ DateTime.new(*arr.map(&:to_i))
36
+ else
37
+ DateTime.parse(isodate)
38
+ end
39
+ date.localize(:en).to_additional_s("yMMMM")
40
+ end
41
+
42
+ def self.mmddyyyy(isodate)
43
+ return nil if isodate.nil?
44
+ arr = isodate.split("-")
45
+ date = if arr.size == 1 and (/^\d+$/.match isodate)
46
+ Date.new(*arr.map(&:to_i)).strftime("%Y")
47
+ elsif arr.size == 2
48
+ Date.new(*arr.map(&:to_i)).strftime("%m-%Y")
49
+ else
50
+ Date.parse(isodate).strftime("%m-%d-%Y")
51
+ end
52
+ end
53
+ =end
54
+
55
+ def self.MMMddyyyy(isodate)
56
+ return nil if isodate.nil?
57
+ arr = isodate.split("-")
58
+ date = if arr.size == 1 and (/^\d+$/.match isodate)
59
+ Date.new(*arr.map(&:to_i)).strftime("%Y")
60
+ elsif arr.size == 2
61
+ Date.new(*arr.map(&:to_i)).strftime("%B %Y")
62
+ else
63
+ Date.parse(isodate).strftime("%B %d, %Y")
64
+ end
65
+ end
66
+ end
@@ -3,6 +3,7 @@ require_relative "metadata"
3
3
  require "fileutils"
4
4
  require "sassc"
5
5
  require_relative "base_convert"
6
+ require_relative "word_convert_toc"
6
7
 
7
8
  module IsoDoc
8
9
  module NIST
@@ -31,25 +32,21 @@ module IsoDoc
31
32
  end
32
33
 
33
34
  def default_fonts(options)
34
- {
35
- bodyfont: (options[:script] == "Hans" ? '"SimSun",serif' :
35
+ { bodyfont: (options[:script] == "Hans" ? '"SimSun",serif' :
36
36
  '"Times New Roman",serif'),
37
37
  headerfont: (options[:script] == "Hans" ? '"SimHei",sans-serif' :
38
38
  '"Arial",sans-serif'),
39
- monospacefont: '"Courier New",monospace'
40
- }
39
+ monospacefont: '"Courier New",monospace' }
41
40
  end
42
41
 
43
42
  def default_file_locations(_options)
44
- {
45
- wordstylesheet: html_doc_path("wordstyle.scss"),
43
+ { wordstylesheet: html_doc_path("wordstyle.scss"),
46
44
  standardstylesheet: html_doc_path("nist.scss"),
47
45
  header: html_doc_path("header.html"),
48
46
  wordcoverpage: html_doc_path("word_nist_titlepage.html"),
49
47
  wordintropage: html_doc_path("word_nist_intro.html"),
50
48
  ulstyle: "l3",
51
- olstyle: "l2",
52
- }
49
+ olstyle: "l2" }
53
50
  end
54
51
 
55
52
  def metadata_init(lang, script, labels)
@@ -138,86 +135,6 @@ module IsoDoc
138
135
  word_annex_cleanup1(docxml, 6)
139
136
  end
140
137
 
141
- def toc_insert(docxml, level)
142
- insertion = docxml.at("//div[h1 = 'Executive Summary']/"\
143
- "preceding-sibling::div[h1][1]") ||
144
- docxml.at("//div[@class = 'WordSection2']/child::*[last()]")
145
- if docxml.at("//p[@class = 'TableTitle']")
146
- insertion.next = make_TableWordToC(docxml)
147
- insertion.next = %{<p class="TOCTitle">List of Tables</p>}
148
- end
149
- if docxml.at("//p[@class = 'FigureTitle']")
150
- insertion.next = make_FigureWordToC(docxml)
151
- insertion.next = %{<p class="TOCTitle">List of Figures</p>}
152
- end
153
- if docxml.at("//p[@class = 'h1Annex']")
154
- insertion.next = make_AppendixWordToC(docxml)
155
- insertion.next = %{<p class="TOCTitle">List of Appendices</p>}
156
- end
157
- insertion.next = make_WordToC(docxml, level)
158
- insertion.next = %{<p class="TOCTitle" style="page-break-before:
159
- always;">Table of Contents</p>}
160
- docxml
161
- end
162
-
163
- WORD_TOC_APPENDIX_PREFACE1 = <<~TOC.freeze
164
- <span lang="EN-GB"><span
165
- style='mso-element:field-begin'></span><span
166
- style='mso-spacerun:yes'>&#xA0;</span>TOC
167
- \\h \\z \\t &quot;h1Annex,1,h2Annex,2,h3Annex,3&quot; <span
168
- style='mso-element:field-separator'></span></span>
169
- TOC
170
-
171
- WORD_TOC_TABLE_PREFACE1 = <<~TOC.freeze
172
- <span lang="EN-GB"><span
173
- style='mso-element:field-begin'></span><span
174
- style='mso-spacerun:yes'>&#xA0;</span>TOC
175
- \\h \\z \\t &quot;TableTitle,1&quot; <span
176
- style='mso-element:field-separator'></span></span>
177
- TOC
178
-
179
- WORD_TOC_FIGURE_PREFACE1 = <<~TOC.freeze
180
- <span lang="EN-GB"><span
181
- style='mso-element:field-begin'></span><span
182
- style='mso-spacerun:yes'>&#xA0;</span>TOC
183
- \\h \\z \\t &quot;FigureTitle,1&quot; <span
184
- style='mso-element:field-separator'></span></span>
185
- TOC
186
-
187
- def header_strip(h)
188
- h = h.to_s.gsub(/<\/?p[^>]*>/, "").
189
- gsub(%r{<a [^>]+>[^<]+</a><aside>.*</aside>}m, "")
190
- super
191
- end
192
-
193
- def make_TableWordToC(docxml)
194
- toc = ""
195
- docxml.xpath("//p[@class = 'TableTitle']").each do |h|
196
- toc += word_toc_entry(1, header_strip(h))
197
- end
198
- toc.sub(/(<p class="MsoToc1">)/,
199
- %{\\1#{WORD_TOC_TABLE_PREFACE1}}) + WORD_TOC_SUFFIX1
200
- end
201
-
202
- def make_FigureWordToC(docxml)
203
- toc = ""
204
- docxml.xpath("//p[@class = 'FigureTitle']").each do |h|
205
- toc += word_toc_entry(1, header_strip(h))
206
- end
207
- toc.sub(/(<p class="MsoToc1">)/,
208
- %{\\1#{WORD_TOC_FIGURE_PREFACE1}}) + WORD_TOC_SUFFIX1
209
- end
210
-
211
- def make_AppendixWordToC(docxml)
212
- toc = ""
213
- docxml.xpath("//p[@class = 'h1Annex'] | //p[@class = 'h2Annex'] | "\
214
- "p[@class = 'h3Annex']").each do |h|
215
- toc += word_toc_entry(h["class"][1].to_i, header_strip(h))
216
- end
217
- toc.sub(/(<p class="MsoToc1">)/,
218
- %{\\1#{WORD_TOC_APPENDIX_PREFACE1}}) + WORD_TOC_SUFFIX1
219
- end
220
-
221
138
  def word_preface_cleanup(docxml)
222
139
  docxml.xpath("//h1[@class = 'AbstractTitle'] | "\
223
140
  "//h1[@class = 'IntroTitle'] | "\
@@ -0,0 +1,86 @@
1
+ module IsoDoc
2
+ module NIST
3
+ class WordConvert < IsoDoc::WordConvert
4
+ def toc_insert(docxml, level)
5
+ insertion = docxml.at("//div[h1 = 'Executive Summary']/"\
6
+ "preceding-sibling::div[h1][1]") ||
7
+ docxml.at("//div[@class = 'WordSection2']/child::*[last()]")
8
+ if docxml.at("//p[@class = 'TableTitle']")
9
+ insertion.next = make_TableWordToC(docxml)
10
+ insertion.next = %{<p class="TOCTitle">List of Tables</p>}
11
+ end
12
+ if docxml.at("//p[@class = 'FigureTitle']")
13
+ insertion.next = make_FigureWordToC(docxml)
14
+ insertion.next = %{<p class="TOCTitle">List of Figures</p>}
15
+ end
16
+ if docxml.at("//p[@class = 'h1Annex']")
17
+ insertion.next = make_AppendixWordToC(docxml)
18
+ insertion.next = %{<p class="TOCTitle">List of Appendices</p>}
19
+ end
20
+ insertion.next = make_WordToC(docxml, level)
21
+ insertion.next = %{<p class="TOCTitle" style="page-break-before:
22
+ always;">Table of Contents</p>}
23
+ docxml
24
+ end
25
+
26
+ WORD_TOC_APPENDIX_PREFACE1 = <<~TOC.freeze
27
+ <span lang="EN-GB"><span
28
+ style='mso-element:field-begin'></span><span
29
+ style='mso-spacerun:yes'>&#xA0;</span>TOC
30
+ \\h \\z \\t &quot;h1Annex,1,h2Annex,2,h3Annex,3&quot; <span
31
+ style='mso-element:field-separator'></span></span>
32
+ TOC
33
+
34
+ WORD_TOC_TABLE_PREFACE1 = <<~TOC.freeze
35
+ <span lang="EN-GB"><span
36
+ style='mso-element:field-begin'></span><span
37
+ style='mso-spacerun:yes'>&#xA0;</span>TOC
38
+ \\h \\z \\t &quot;TableTitle,1&quot; <span
39
+ style='mso-element:field-separator'></span></span>
40
+ TOC
41
+
42
+ WORD_TOC_FIGURE_PREFACE1 = <<~TOC.freeze
43
+ <span lang="EN-GB"><span
44
+ style='mso-element:field-begin'></span><span
45
+ style='mso-spacerun:yes'>&#xA0;</span>TOC
46
+ \\h \\z \\t &quot;FigureTitle,1&quot; <span
47
+ style='mso-element:field-separator'></span></span>
48
+ TOC
49
+
50
+ def header_strip(h)
51
+ h = h.to_s.gsub(/<\/?p[^>]*>/, "").
52
+ gsub(%r{<a [^>]+>[^<]+</a><aside>.*</aside>}m, "")
53
+ super
54
+ end
55
+
56
+ def make_TableWordToC(docxml)
57
+ toc = ""
58
+ docxml.xpath("//p[@class = 'TableTitle']").each do |h|
59
+ toc += word_toc_entry(1, header_strip(h))
60
+ end
61
+ toc.sub(/(<p class="MsoToc1">)/,
62
+ %{\\1#{WORD_TOC_TABLE_PREFACE1}}) + WORD_TOC_SUFFIX1
63
+ end
64
+
65
+ def make_FigureWordToC(docxml)
66
+ toc = ""
67
+ docxml.xpath("//p[@class = 'FigureTitle']").each do |h|
68
+ toc += word_toc_entry(1, header_strip(h))
69
+ end
70
+ toc.sub(/(<p class="MsoToc1">)/,
71
+ %{\\1#{WORD_TOC_FIGURE_PREFACE1}}) + WORD_TOC_SUFFIX1
72
+ end
73
+
74
+ def make_AppendixWordToC(docxml)
75
+ toc = ""
76
+ docxml.xpath("//p[@class = 'h1Annex'] | //p[@class = 'h2Annex'] | "\
77
+ "p[@class = 'h3Annex']").each do |h|
78
+ toc += word_toc_entry(h["class"][1].to_i, header_strip(h))
79
+ end
80
+ toc.sub(/(<p class="MsoToc1">)/,
81
+ %{\\1#{WORD_TOC_APPENDIX_PREFACE1}}) + WORD_TOC_SUFFIX1
82
+ end
83
+ end
84
+ end
85
+ end
86
+
@@ -1,5 +1,5 @@
1
1
  module Metanorma
2
2
  module NIST
3
- VERSION = "0.2.14"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metanorma-nist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.14
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-08 00:00:00.000000000 Z
11
+ date: 2020-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: htmlentities
@@ -294,10 +294,14 @@ files:
294
294
  - lib/isodoc/nist/html_convert.rb
295
295
  - lib/isodoc/nist/i18n-en.yaml
296
296
  - lib/isodoc/nist/metadata.rb
297
+ - lib/isodoc/nist/metadata_id.rb
297
298
  - lib/isodoc/nist/pdf_convert.rb
298
299
  - lib/isodoc/nist/refs.rb
299
300
  - lib/isodoc/nist/render.rb
301
+ - lib/isodoc/nist/render_contributors.rb
302
+ - lib/isodoc/nist/render_dates.rb
300
303
  - lib/isodoc/nist/word_convert.rb
304
+ - lib/isodoc/nist/word_convert_toc.rb
301
305
  - lib/isodoc/nist/xrefs.rb
302
306
  - lib/metanorma-nist.rb
303
307
  - lib/metanorma/nist.rb