Class: IsoDoc::NIST::Metadata

Inherits:
Metadata
  • Object
show all
Defined in:
lib/isodoc/nist/metadata.rb

Instance Method Summary collapse

Constructor Details

#initialize(lang, script, labels) ⇒ Metadata

Returns a new instance of Metadata.



7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/isodoc/nist/metadata.rb', line 7

def initialize(lang, script, labels)
  super
  here = File.dirname(__FILE__)
  set(:logo_nist,
      File.expand_path(File.join(here, "html", "logo.png")))
  set(:logo_cswp,
      File.expand_path(File.join(here, "html", "logo_cswp.png")))
  set(:logo_commerce,
      File.expand_path(File.join(here, "html", "commerce-logo-color.png")))
  set(:logo_commerce_word,
      File.expand_path(File.join(here, "html", "deptofcommerce.png")))
end

Instance Method Details

#author(ixml, _out) ⇒ Object



62
63
64
65
66
67
68
69
# File 'lib/isodoc/nist/metadata.rb', line 62

def author(ixml, _out)
  tc = ixml.at(ns("//bibdata/ext/editorialgroup/committee"))
  set(:tc, tc.text.upcase) if tc
  personal_authors(ixml)
  subdiv = ixml.at(ns("//bibdata/contributor[role/@type = 'publisher']/"\
                      "organization/subdivision"))
  set(:nist_subdiv, subdiv.text) if subdiv
end

#bibdate(ixml, _out) ⇒ Object



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/isodoc/nist/metadata.rb', line 158

def bibdate(ixml, _out)
  super
  ixml.xpath(ns("//bibdata/date")).each do |d|
    val = Common::date_range(d)
    next if val == "XXX"
    set("#{d['type']}date_monthyear".to_sym,
        daterange_proc(val, :monthyr))
    set("#{d['type']}date_mmddyyyy".to_sym,
        daterange_proc(val, :mmddyyyy))
    set("#{d['type']}date_MMMddyyyy".to_sym,
        daterange_proc(val, :MMMddyyyy))
  end
  withdrawal_pending(ixml)
  most_recent_date(ixml)
end

#commentperiod(ixml, _out) ⇒ Object



239
240
241
242
243
244
245
246
# File 'lib/isodoc/nist/metadata.rb', line 239

def commentperiod(ixml, _out)
  from = ixml.at(ns("//bibdata/ext/commentperiod/from"))&.text
  to = ixml.at(ns("//bibdata/ext/commentperiod/to"))&.text
  extended = ixml.at(ns("//bibdata/ext/commentperiod/extended"))&.text
  set(:comment_from, from) if from
  set(:comment_to, to) if to
  set(:comment_extended, extended) if extended
end

#daterange_proc(val, fn) ⇒ Object



197
198
199
200
201
202
203
# File 'lib/isodoc/nist/metadata.rb', line 197

def daterange_proc(val, fn)
  m = /^(?<date1>[^&]+)(?<ndash>\&ndash;)?(?<date2>.*)$/.match val
  val_monthyear = self.send(fn, m[:date1])
  val_monthyear += "&ndash;" if m[:ndash]
  val_monthyear += self.send(fn, m[:date2]) unless m[:date2].empty?
  val_monthyear
end

#docid(ixml, _out) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/isodoc/nist/metadata.rb', line 71

def docid(ixml, _out)
  docid = ixml.at(ns("//bibdata/docidentifier[@type = 'NIST']"))&.text
  docid_long = ixml.at(ns("//bibdata/docidentifier"\
                          "[@type = 'nist-long']"))&.text
  docnumber = ixml.at(ns("//bibdata/docnumber"))&.text
  set(:docidentifier, docid)
  set(:docidentifier_long, docid_long)
  set(:docidentifier_undated, stripdate(docid))
  set(:docidentifier_long_undated, stripdate(docid_long))
  d = draft_prefix(ixml) and set(:draft_prefix, d)
  d = iter_code(ixml) and set(:iteration_code, d)
  d = iter_ordinal(ixml) and set(:iteration_ordinal, d)
  set(:docnumber, docnumber)
end

#docstatus(ixml, _out) ⇒ Object



125
126
127
128
129
130
131
132
133
134
# File 'lib/isodoc/nist/metadata.rb', line 125

def docstatus(ixml, _out)
  docstatus = ixml.at(ns("//bibdata/status/stage"))&.text
  set(:unpublished, !/^draft/.match(docstatus).nil?)
  substage = ixml.at(ns("//bibdata/status/substage"))&.text
  substage and set(:substage, substage)
  iter = ixml.at(ns("//bibdata/status/iteration"))&.text
  set(:iteration, iter) if iter
  set(:status, status_print(docstatus || "final"))
  set(:errata, true) if ixml.at(ns("//errata"))
end

#draft_prefix(ixml) ⇒ Object



92
93
94
95
96
97
98
99
# File 'lib/isodoc/nist/metadata.rb', line 92

def draft_prefix(ixml)
  docstatus = ixml.at(ns("//bibdata/status/stage"))&.text
  return nil unless docstatus && /^draft/.match(docstatus)
  iter = iter_code(ixml)
  prefix = "DRAFT "
  iter and prefix += "(#{iter}) "
  prefix
end

#draftinfo(draft, revdate) ⇒ Object



117
118
119
120
121
122
123
# File 'lib/isodoc/nist/metadata.rb', line 117

def draftinfo(draft, revdate)
  draftinfo = ""
  if draft
    draftinfo = " #{@labels["draft_label"]} #{draft}"
  end
  IsoDoc::Function::I18n::l10n(draftinfo, @lang, @script)
end

#iter_abbr(stage, iter) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/isodoc/nist/metadata.rb', line 20

def iter_abbr(stage, iter)
  return "F" if iter&.downcase == "final" &&
    %w(draft-wip draft-prelim draft-public draft-approval).include?(stage)
  case stage
  when "draft-wip", "draft-prelim", "dradt-internal", "draft-approval"
    iter || ""
  when "draft-public"
    iter ||= "1"
    iter == "1" ? "I" : iter
  else
    ""
  end
end

#iter_code(ixml) ⇒ Object



101
102
103
104
105
# File 'lib/isodoc/nist/metadata.rb', line 101

def iter_code(ixml)
  docstatus = ixml.at(ns("//bibdata/status/stage"))&.text
  iter = ixml.at(ns("//bibdata/status/iteration"))&.text
  stage_abbr(docstatus, iter)
end

#iter_ordinal(ixml) ⇒ Object



107
108
109
110
111
112
113
114
115
# File 'lib/isodoc/nist/metadata.rb', line 107

def iter_ordinal(ixml)
  docstatus = ixml.at(ns("//bibdata/status/stage"))&.text
  iter = ixml.at(ns("//bibdata/status/iteration"))&.text
  iter ||= "1" if docstatus == "draft-public"
  return if iter.nil?
  return "Initial" if iter == "1" && docstatus == "draft-public"
  return "Final" if iter.downcase == "final"
  iter.to_i.localize.to_rbnf_s("SpelloutRules", "spellout-ordinal")
end

#keywords(ixml, _out) ⇒ Object



231
232
233
234
235
236
237
# File 'lib/isodoc/nist/metadata.rb', line 231

def keywords(ixml, _out)
  keywords = []
  ixml.xpath(ns("//bibdata/keyword")).each do |kw|
    keywords << kw.text
  end
  set(:keywords, keywords)
end

#mmddyyyy(isodate) ⇒ Object



221
222
223
224
# File 'lib/isodoc/nist/metadata.rb', line 221

def mmddyyyy(isodate)
  return nil if isodate.nil?
  Date.parse(isodate).strftime("%m-%d-%Y")
end

#MMMddyyyy(isodate) ⇒ Object



226
227
228
229
# File 'lib/isodoc/nist/metadata.rb', line 226

def MMMddyyyy(isodate)
  return nil if isodate.nil?
  Date.parse(isodate).strftime("%B %d, %Y")
end

#monthyr(isodate) ⇒ Object



216
217
218
219
# File 'lib/isodoc/nist/metadata.rb', line 216

def monthyr(isodate)
  return nil if isodate.nil?
  DateTime.parse(isodate).localize(:en).to_additional_s("yMMMM")
end

#most_recent_date(ixml) ⇒ Object



174
175
176
177
178
179
180
181
# File 'lib/isodoc/nist/metadata.rb', line 174

def most_recent_date(ixml)
  date = most_recent_date1(ixml) || return
  val = Common::date_range(date)
  return if val == "XXX"
  set(:most_recent_date_monthyear, daterange_proc(val, :monthyr))
  set(:most_recent_date_mmddyyyy, daterange_proc(val, :mmddyyyy))
  set(:most_recent_date_MMMddyyyy, daterange_proc(val, :MMMddyyyy))
end

#most_recent_date1(ixml) ⇒ Object



183
184
185
186
187
188
189
# File 'lib/isodoc/nist/metadata.rb', line 183

def most_recent_date1(ixml)
  docstatus = ixml.at(ns("//bibdata/status/stage"))&.text
  /^draft/.match(docstatus) ?
    (ixml.at(ns("//bibdata/date[@type = 'circulated']")) ||
     ixml.at(ns("//version/revision-date"))) :
  ( ixml.at(ns("//bibdata/date[@type = 'issued']")))
end

#note(xml, _out) ⇒ Object



345
346
347
348
349
350
351
352
353
# File 'lib/isodoc/nist/metadata.rb', line 345

def note(xml, _out)
  note = xml.at(ns("//bibdata/note[@type = 'additional-note']"))&.text and
    set(:additional_note, note)
  note = xml.at(ns("//bibdata/note[@type = 'withdrawal-note']"))&.text and
    set(:withdrawal_note, note)
  note = xml.at(ns("//bibdata/note[@type = "\
                   "'withdrawal-announcement-link']"))&.text and
                  set(:withdrawal_announcement_link, note)
end

#relations(ixml, _out) ⇒ Object



264
265
266
267
268
269
270
271
272
273
274
# File 'lib/isodoc/nist/metadata.rb', line 264

def relations(ixml, _out)
  ret = relations1(ixml, "obsoletes")
  set(:obsoletes, ret) unless ret.empty?
  ret = relations1(ixml, "obsoletedBy")
  set(:obsoletedby, ret) unless ret.empty?
  ret = relations1(ixml, "supersedes")
  set(:supersedes, ret) unless ret.empty?
  ret = relations1(ixml, "supersededBy")
  set(:supersededby, ret) unless ret.empty?
  superseding_doc(ixml)
end

#relations1(ixml, type) ⇒ Object



256
257
258
259
260
261
262
# File 'lib/isodoc/nist/metadata.rb', line 256

def relations1(ixml, type)
  ret = []
  ixml.xpath(ns("//bibdata/relation[@type = '#{type}']")).each do |x|
    id = x&.at(ns(".//docidentifier"))&.text and ret << id
  end
  ret
end

#series(ixml, _out) ⇒ Object



205
206
207
208
209
210
211
212
213
214
# File 'lib/isodoc/nist/metadata.rb', line 205

def series(ixml, _out)
  series = ixml.at(ns("//bibdata/series[@type = 'main']/title"))&.text
  set(:series, series) if series
  seriesabbr =
    ixml.at(ns("//bibdata/series[@type = 'main']/abbreviation"))&.text
  set(:seriesabbr, seriesabbr) if seriesabbr
  subseries = ixml.at(ns("//bibdata/series[@type = 'secondary']/"\
                         "title"))&.text
  set(:subseries, subseries) if subseries
end

#stage_abbr(stage, iter) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/isodoc/nist/metadata.rb', line 34

def stage_abbr(stage, iter)
  case stage
  when "draft-internal" then "#{iter_abbr(stage, iter)}ID"
  when "draft-wip" then "#{iter_abbr(stage, iter)}WD"
  when "draft-prelim" then "#{iter_abbr(stage, iter)}PreD"
  when "draft-public" then "#{iter_abbr(stage, iter)}PD"
  when "draft-approval" then "#{iter_abbr(stage, iter)}AD"
  else
    nil
  end
end

#status_print(status) ⇒ Object



136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/isodoc/nist/metadata.rb', line 136

def status_print(status)
  case status
  when "draft-internal" then "Internal Draft"
  when "draft-wip" then "Work-in-Progress Draft"
  when "draft-prelim" then "Preliminary Draft"
  when "draft-public" then "Public Draft"
  when "draft-approval" then "Approval Draft"
  when "final" then "Final"
  when "final-review" then "Under Review"
  when "final-withdrawn" then "Withdrawn"
  end
end

#stripdate(id) ⇒ Object



86
87
88
89
90
# File 'lib/isodoc/nist/metadata.rb', line 86

def stripdate(id)
  return if id.nil?
  id.sub(/ \((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[^)]+\)$/,
         "")
end

#subtitle(ixml, _out) ⇒ Object



53
54
55
56
57
58
59
60
# File 'lib/isodoc/nist/metadata.rb', line 53

def subtitle(ixml, _out)
  main = ixml&.at(ns("//bibdata/title[@type = 'subtitle']"))&.text
  set(:docsubtitle, main) if main
  short = ixml&.at(ns("//bibdata/title[@type = 'short-subtitle']"))&.text
  set(:docsubtitle_short, short || main) if (short || main)
  main = ixml&.at(ns("//bibdata/title[@type = 'document-class']"))&.text
  set(:docclasstitle, main) if main
end

#superseding_dates(d) ⇒ Object



329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
# File 'lib/isodoc/nist/metadata.rb', line 329

def superseding_dates(d)
  if cdate = d.at(ns("./date[@type = 'circulated']/on"))&.text
    set(:superseding_circulated_date, cdate)
    set(:superseding_circulated_date_monthyear, monthyr(cdate))
  end
  if cdate = d.at(ns("./date[@type = 'issued']/on"))&.text
    set(:superseding_issued_date, cdate)
    set(:superseding_issued_date_monthyear, monthyr(cdate))
  end
  if cdate = d.at(ns("./date[@type = 'updated']/on"))&.text
    set(:superseding_updated_date, cdate)
    set(:superseding_updated_date_monthyear, monthyr(cdate))
    set(:superseding_updated_date_MMMddyyyy, MMMddyyyy(cdate))
  end
end

#superseding_doc(ixml) ⇒ Object



276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
# File 'lib/isodoc/nist/metadata.rb', line 276

def superseding_doc(ixml)
  d = ixml.at(ns("//bibdata/relation[@type = 'obsoletedBy']/bibitem"))
  return unless d
  set(:superseding_status,
      status_print(d.at(ns("./status/stage"))&.text || "final"))
  superseding_iteration(d)
  docid = d.at(ns("./docidentifier[@type = 'NIST']"))&.text and
    set(:superseding_docidentifier, docid)
  docid_long = d.at(ns("./docidentifier[@type = 'nist-long']"))&.text and
    set(:superseding_docidentifier_long, docid_long)
  superseding_dates(d)
  doi = d.at(ns("./uri[@type = 'doi']"))&.text and
    set(:superseding_doi, doi)
  uri = d.at(ns("./uri[@type = 'uri']"))&.text and
    set(:superseding_uri, uri)
  superseding_titles(ixml, d)
  authors = d.xpath(ns("./contributor[role/@type = 'author']/person"))
  authors.empty? and authors =
    ixml.xpath(ns("//bibdata/contributor[role/@type = 'author']/person"))
  set(:superseding_authors, extract_person_names(authors))
end

#superseding_iteration(d) ⇒ Object



312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
# File 'lib/isodoc/nist/metadata.rb', line 312

def superseding_iteration(d)
  return unless d.at(ns("./status/stage"))&.text == "draft-public"
  iter = d.at(ns("./status/iteration"))&.text || "1"
  case iter.downcase
  when "1"
    set(:superseding_iteration_ordinal, "Initial")
    set(:superseding_iteration_code, "IPD")
  when "final"
    set(:superseding_iteration_ordinal, "Final")
    set(:superseding_iteration_code, "FPD")
  else
    set(:superseding_iteration_ordinal,
        iter.to_i.localize.to_rbnf_s("SpelloutRules", "spellout-ordinal"))
    set(:superseding_iteration_code, "#{iter}PD")
  end
end

#superseding_titles(ixml, d) ⇒ Object



298
299
300
301
302
303
304
305
306
307
308
309
310
# File 'lib/isodoc/nist/metadata.rb', line 298

def superseding_titles(ixml, d)
  title = d.at(ns("./title[@type = 'main']"))&.text
  if title
    set(:superseding_title, d.at(ns("./title[@type = 'main']"))&.text)
    set(:superseding_subtitle,
        d.at(ns("./title[@type = 'subtitle']"))&.text)
  else
    set(:superseding_title,
        ixml.at(ns("//bibdata/title[@type = 'main']"))&.text)
    set(:superseding_subtitle,
        ixml.at(ns("//bibdata/title[@type = 'subtitle']"))&.text)
  end
end

#title(ixml, out) ⇒ Object



46
47
48
49
50
51
# File 'lib/isodoc/nist/metadata.rb', line 46

def title(ixml, out)
  main = ixml&.at(ns("//bibdata/title[@type = 'main']"))&.text
  set(:doctitle, main)
  short = ixml&.at(ns("//bibdata/title[@type = 'short-title']"))&.text
  set(:doctitle_short, short || main)
end

#url(xml, _out) ⇒ Object



248
249
250
251
252
253
254
# File 'lib/isodoc/nist/metadata.rb', line 248

def url(xml, _out)
  super
  a = xml.at(ns("//bibdata/uri[@type = 'email']")) and set(:email, a.text)
  a = xml.at(ns("//bibdata/uri[@type = 'doi']")) and set(:doi, a.text)
  a = xml.at(ns("//bibdata/uri[@type = 'uri' or not(@type)]")) and
    set(:url, a.text)
end

#version(ixml, _out) ⇒ Object



149
150
151
152
153
154
155
156
# File 'lib/isodoc/nist/metadata.rb', line 149

def version(ixml, _out)
  super
  rev = ixml&.at(ns("//bibdata/edition"))&.text&.sub(/^Revision /, "")
  set(:revision, rev) if rev
  revdate = get[:revdate]
  set(:revdate_monthyear, monthyr(revdate))
  set(:revdate_MMMddyyyy, MMMddyyyy(revdate))
end

#withdrawal_pending(ixml) ⇒ Object



191
192
193
194
195
# File 'lib/isodoc/nist/metadata.rb', line 191

def withdrawal_pending(ixml)
  d = ixml&.at(ns("//bibdata/date[@type = 'obsoleted']"))&.text or return
  date = Date.parse(d) or return
  set(:withdrawal_pending, true) if date > Date.today
end