module IsoDoc module NIST class Metadata < IsoDoc::Metadata 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 def stage_abbr(stage) case stage when "draft-internal" then "ID" when "draft-wip" then "WD" when "draft-prelim" then "PreD" when "draft-public" then "PD" when "draft-approval" then "AD" else nil end end def status_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 def docstatus(ixml, _out) docstatus = ixml.at(ns("//bibdata/status/stage"))&.text set(:unpublished, unpublished(docstatus)) 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")) unpublished(docstatus) and set(:stageabbr, stage_abbr(docstatus)) end def unpublished(status) !/^draft/.match(status).nil? end 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 def docid(ixml, _out) docid = ixml.at(ns("//bibdata/docidentifier[@type = 'NIST']"))&.text docid_long = ixml.at(ns("//bibdata/docidentifier"\ "[@type = 'nist-long']"))&.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) end def stripdate(id) return if id.nil? id.sub(/ \((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[^)]+\)$/, "") end 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 def iter_code(ixml) docstatus = ixml.at(ns("//bibdata/status/stage"))&.text iter = ixml.at(ns("//bibdata/status/iteration"))&.text status_abbr(docstatus, iter) end 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 def draftinfo(draft, revdate) draftinfo = "" if draft draftinfo = " #{@labels["draft_label"]} #{draft}" end @i18n.l10n(draftinfo, @lang, @script) end end end end