Class: IsoDoc::Gb::Metadata

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

Overview

A Converter implementation that generates GB output, and a document schema encapsulation of the document for validation

Constant Summary collapse

STAGE_ABBRS_CN =
{
  "00": "新工作项目建议",
  "10": "新工作项目",
  "20": "标准草案工作组讨论稿",
  "30": "标准草案征求意见稿",
  "40": "标准草案送审稿",
  "50": "标准草案报批稿",
  "60": "国家标准",
  "90": "(Review)",
  "95": "(Withdrawal)",
}.freeze
STATUS_CSS =
{
  "00": "working-draft",
  "10": "working-draft",
  "20": "working-draft",
  "30": "committee-draft",
  "40": "draft-standard",
  "50": "draft-standard",
  "60": "standard",
  "90": "standard",
  "95": "obsolete",
}
ISO_STD_XPATH =
"//bibdata/relation[xmlns:description[text() = 'equivalent' or "\
"text() = 'identical' or text() = 'nonequivalent']]/bibitem".freeze

Instance Method Summary collapse

Constructor Details

#initialize(lang, script, labels) ⇒ Metadata

Returns a new instance of Metadata.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/isodoc/gb/metadata.rb', line 11

def initialize(lang, script, labels)
  super
  set(:docmaintitlezh, "")
  set(:docsubtitlezh, "XXXX")
  set(:docparttitlezh, "")
  set(:docmaintitleen, "")
  set(:docsubtitleen, "XXXX")
  set(:docparttitleen, "")
  set(:gbequivalence, "")
  set(:isostandard, nil)
  set(:isostandardtitle, "")
  set(:doctitle, "XXXX")
  set(:obsoletes, nil)
  set(:obsoletes_part, nil)
  set(:publisheddate, "XXX")
  set(:implementeddate, "XXX")
end

Instance Method Details

#author(isoxml, _out) ⇒ Object



64
65
66
67
# File 'lib/isodoc/gb/metadata.rb', line 64

def author(isoxml, _out)
  gbcommittee = isoxml.at(ns("//bibdata/ext/gbcommittee"))
  set(:committee, gbcommittee&.text)
end

#bibdate(isoxml, _out) ⇒ Object



207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
# File 'lib/isodoc/gb/metadata.rb', line 207

def bibdate(isoxml, _out)
  super
  m = get
  if @lang == "zh"
    set(:labelled_publisheddate, m[:publisheddate] + " " +
        (@labels["publicationdate_lbl"] || ""))
    set(:labelled_implementeddate, m[:implementeddate] + " " +
        (@labels["implementationdate_lbl"] || ""))
  else
    set(:labelled_publisheddate, (@labels["publicationdate_lbl"] || "") +
        ": " + m[:publisheddate])
    set(:labelled_implementeddate,
        (@labels["implementationdate_lbl"] || "") + ": " +
        m[:implementeddate])
  end
end

#docid(isoxml, _out) ⇒ Object



129
130
131
132
133
134
# File 'lib/isodoc/gb/metadata.rb', line 129

def docid(isoxml, _out)
  docid1(isoxml, _out)
  gb_identifier(isoxml)
  gb_library_identifier(isoxml)
  gb_equivalence(isoxml)
end

#docid1(isoxml, _out) ⇒ Object



124
125
126
127
# File 'lib/isodoc/gb/metadata.rb', line 124

def docid1(isoxml, _out)
  dn = isoxml.at(ns("//bibdata/docidentifier[@type = 'gb']"))
  set(:docnumber, dn&.text)
end

#docstatus(isoxml, _out) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/isodoc/gb/metadata.rb', line 103

def docstatus(isoxml, _out)
  docstatus = isoxml.at(ns("//bibdata/status/stage"))
  set(:unpublished, true)
  if docstatus
    set(:stage, docstatus.text.to_i)
    set(:unpublished, unpublished(docstatus.text))
    set(:statusabbr, status_abbrev_cn(docstatus["abbreviation"],
                                      isoxml&.at(ns("//bibdata/status/substage"))&.text,
                                      isoxml&.at(ns("//bibdata/status/iteration"))&.text,
                                      isoxml&.at(ns("//version/draft"))&.text,
                                      isoxml&.at(ns("//bibdata/ext/doctype"))&.text))
    set(:status, STATUS_CSS[docstatus.text.to_sym])
    unpublished(docstatus.text) and
      set(:stageabbr, docstatus["abbreviation"])
  end
end

#gb_equivalence(isoxml) ⇒ Object



139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/isodoc/gb/metadata.rb', line 139

def gb_equivalence(isoxml)
  isostdid = isoxml.at(ns("#{ISO_STD_XPATH}/docidentifier")) || return
  set(:isostandard, isostdid.text)
  isostdtitle = isoxml.at(ns("#{ISO_STD_XPATH}/title"))
  set(:isostandardtitle, isostdtitle.text) if isostdtitle
  eq = isoxml.at(ns("//bibdata/relation/description"))
  case eq.text
  when "equivalent" then set(:gbequivalence, "MOD")
  when "nonequivalent" then set(:gbequivalence, "NEQ")
  when "identical" then set(:gbequivalence, "IDT")
  end
end

#gb_identifier(isoxml) ⇒ Object



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/isodoc/gb/metadata.rb', line 159

def gb_identifier(isoxml)
  scope = isoxml.at(ns("//bibdata/ext/gbtype/gbscope"))&.text || "national"
  mandate = isoxml.at(ns("//bibdata/ext/gbtype/gbmandate"))&.text || "mandatory"
  prefix = isoxml.at(ns("//bibdata/ext/gbtype/gbprefix"))&.text || "XXX"
  docyear = isoxml&.at(ns("//bibdata/copyright/from"))&.text
  issuer = isoxml&.at(ns("//bibdata/contributor[role/@type = 'issuer']/"\
                         "organization/name"))&.text || "GB"
  @agencies = GbAgencies::Agencies.new(@lang, @labels, issuer)
  set(:docidentifier, get[:docnumber])
  set(:issuer, issuer)
  set(:standard_class, standard_class(scope, prefix, mandate))
  set(:standard_agency, @agencies.standard_agency(scope, prefix, mandate))
  if scope == "local"
    set(:gbprefix, "DB")
    set(:gblocalcode, prefix)
  else
    set(:gbprefix, prefix)
  end 
  set(:gbscope, scope)
end

#gb_library_identifier(isoxml) ⇒ Object



192
193
194
195
196
197
198
# File 'lib/isodoc/gb/metadata.rb', line 192

def gb_library_identifier(isoxml)
  ccs = []
  isoxml.xpath(ns("//bibdata/ext/ccs")).each { |i| ccs << i.text }
  p = isoxml.at(ns("//bibdata/ext/plannumber"))
  set(:libraryid_ccs, ccs.empty? ? "XXX" : ccs.join(", "))
  set(:libraryid_plan, p ? p.text : "XXX")
end

#part_label(partnumber, lang) ⇒ Object



200
201
202
203
204
205
# File 'lib/isodoc/gb/metadata.rb', line 200

def part_label(partnumber, lang)
  case lang
  when "en" then "Part #{partnumber}"
  when "zh" then "#{partnumber}部分"
  end
end

#set_doctitleObject



41
42
43
44
45
46
47
48
49
# File 'lib/isodoc/gb/metadata.rb', line 41

def set_doctitle
  if @lang == "zh"
    set(:doctitle, get[:docmaintitlezh] + 
                 get[:docsubtitlezh] + get[:docparttitlezh])
  else
    set(:doctitle, get[:docmaintitleen] + 
                 get[:docsubtitleen] + get[:docparttitleen])
  end
end

#standard_class(scope, prefix, mandate) ⇒ Object



152
153
154
155
156
157
# File 'lib/isodoc/gb/metadata.rb', line 152

def standard_class(scope, prefix, mandate)
  standardclassimg = get[:standardclassimg]
  ret = @agencies.standard_class(scope, prefix, mandate)
  return "<img class='logo' src='#{standardclassimg}' alt='#{ret}'></img>" if standardclassimg
  ret
end

#standard_logo(gbprefix) ⇒ Object



180
181
182
183
184
185
186
187
188
189
190
# File 'lib/isodoc/gb/metadata.rb', line 180

def (gbprefix)
  return nil unless gbprefix
  case gbprefix.downcase
  when "db" then "gb-standard-db"
  when "gb" then "gb-standard-gb"
  when "gjb" then "gb-standard-gjb"
  when "gm" then "gb-standard-gm"
  when "jjf" then "gb-standard-jjf"
  when "zb" then "gb-standard-zb"
  end
end

#status_abbrev_cn(stage, _substage, iter, draft, doctype) ⇒ Object



93
94
95
96
97
98
99
100
101
# File 'lib/isodoc/gb/metadata.rb', line 93

def status_abbrev_cn(stage, _substage, iter, draft, doctype)
  return status_abbrev(stage, _substage, iter, draft, doctype) if @lang != "zh"
  stage_num = stage == "PRF" ? "60" : 
    (Asciidoctor::Gb::Converter::STAGE_ABBRS&.invert[stage]&.to_s || "??")
  stage = STAGE_ABBRS_CN[stage_num.to_sym] || "??"
  stage = "#{iter.to_i.localize(:zh).spellout.force_encoding("UTF-8")}#{stage}" if iter
  stage = "Pre" + HTMLEntities.new.encode(stage, :hexadecimal) if draft =~ /^0\./
  stage
end

#subtitle(isoxml, _out) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/isodoc/gb/metadata.rb', line 51

def subtitle(isoxml, _out)
  intro = isoxml.at(ns("//bibdata//title[@type='title-intro' and @language='en']"))
  main = isoxml.at(ns("//bibdata//title[@type='title-main' and @language='en']"))
  part = isoxml.at(ns("//bibdata//title[@type='title-part' and @language='en']"))
  partnumber = isoxml.at(ns("//bibdata/ext/structuredidentifier/project-number/@part"))
  intro.nil? || set(:docmaintitleen, intro.text + "&mdash;")
  main.nil? || set(:docsubtitleen, main.text)
  partnum = partnumber ? "#{part_label(partnumber, 'en')}: " : ""
  part.nil? || set(:docparttitleen,
                            "&mdash;#{partnum} #{part.text}")
  set_doctitle
end

#title(isoxml, _out) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
# File 'lib/isodoc/gb/metadata.rb', line 29

def title(isoxml, _out)
  intro = isoxml.at(ns("//bibdata//title[@type='title-intro' and @language='zh']"))
  main = isoxml.at(ns("//bibdata//title[@type='title-main' and @language='zh']"))
  part = isoxml.at(ns("//bibdata//title[@type='title-part' and @language='zh']"))
  partnumber = isoxml.at(ns("//bibdata/ext/structuredidentifier/project-number/@part"))
  intro.nil? || set(:docmaintitlezh, intro.text + "&nbsp;")
  main.nil? || set(:docsubtitlezh, main.text)
  partnum = partnumber ? "#{part_label(partnumber, 'zh')}:" : ""
  part.nil? || set(:docparttitlezh,
                            "&nbsp;#{partnum}#{part.text}")
end

#unpublished(status) ⇒ Object



120
121
122
# File 'lib/isodoc/gb/metadata.rb', line 120

def unpublished(status)
  status.to_i < 60
end