relaton-bipm 1.5.0 → 1.7.1

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.
data/grammars/isodoc.rng CHANGED
@@ -24,6 +24,14 @@
24
24
  <start>
25
25
  <ref name="standard-document"/>
26
26
  </start>
27
+ <define name="doctype">
28
+ <element name="doctype">
29
+ <optional>
30
+ <attribute name="abbreviation"/>
31
+ </optional>
32
+ <ref name="DocumentType"/>
33
+ </element>
34
+ </define>
27
35
  <define name="hyperlink">
28
36
  <element name="link">
29
37
  <attribute name="target">
@@ -141,6 +149,11 @@
141
149
  <data type="boolean"/>
142
150
  </attribute>
143
151
  </optional>
152
+ <optional>
153
+ <attribute name="key">
154
+ <data type="boolean"/>
155
+ </attribute>
156
+ </optional>
144
157
  <oneOrMore>
145
158
  <ref name="dt"/>
146
159
  <ref name="dd"/>
@@ -1164,49 +1177,7 @@
1164
1177
  </define>
1165
1178
  <define name="annex">
1166
1179
  <element name="annex">
1167
- <optional>
1168
- <attribute name="id">
1169
- <data type="ID"/>
1170
- </attribute>
1171
- </optional>
1172
- <optional>
1173
- <attribute name="language"/>
1174
- </optional>
1175
- <optional>
1176
- <attribute name="script"/>
1177
- </optional>
1178
- <optional>
1179
- <attribute name="inline-header">
1180
- <data type="boolean"/>
1181
- </attribute>
1182
- </optional>
1183
- <attribute name="obligation">
1184
- <choice>
1185
- <value>normative</value>
1186
- <value>informative</value>
1187
- </choice>
1188
- </attribute>
1189
- <optional>
1190
- <ref name="section-title"/>
1191
- </optional>
1192
- <group>
1193
- <group>
1194
- <zeroOrMore>
1195
- <ref name="BasicBlock"/>
1196
- </zeroOrMore>
1197
- <zeroOrMore>
1198
- <ref name="note"/>
1199
- </zeroOrMore>
1200
- </group>
1201
- <zeroOrMore>
1202
- <choice>
1203
- <ref name="annex-subsection"/>
1204
- <ref name="terms"/>
1205
- <ref name="definitions"/>
1206
- <ref name="references"/>
1207
- </choice>
1208
- </zeroOrMore>
1209
- </group>
1180
+ <ref name="Annex-Section"/>
1210
1181
  </element>
1211
1182
  </define>
1212
1183
  <define name="terms">
data/lib/relaton_bipm.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  require "relaton_bib"
2
2
  require "relaton_bipm/version"
3
3
  require "relaton_bipm/editorial_group"
4
+ require "relaton_bipm/committee"
5
+ require "relaton_bipm/workgroup"
4
6
  require "relaton_bipm/structured_identifier"
5
7
  require "relaton_bipm/bibliographic_date"
6
8
  require "relaton_bipm/document_relation"
7
9
  require "relaton_bipm/comment_periond"
8
- require "relaton_bipm/document_status"
9
10
  require "relaton_bipm/bipm_bibliographic_item"
10
11
  require "relaton_bipm/bipm_bibliography"
11
12
  require "relaton_bipm/hash_converter"
@@ -0,0 +1,57 @@
1
+ CCAUV:
2
+ fr: Comité consultatif de l’acoustique, des ultrasons et des vibrations
3
+ en: Consultative Committee for Acoustics, Ultrasound and Vibration
4
+ CCDS:
5
+ fr: Comité consultatif pour la définition de la seconde
6
+ en: Consultative Committee for the Definition of the Second
7
+ note: see CCTF
8
+ CCE:
9
+ fr: Comité consultatif d’électricité
10
+ en: Consultative Committee for Electricity
11
+ note: see CCEM
12
+ CCEM:
13
+ fr: Comité consultatif d’électricité et magnétisme
14
+ en: Consultative Committee for Electricity and Magnetism
15
+ note: formerly the CCE
16
+ CCL:
17
+ fr: Comité consultatif des longueurs
18
+ en: Consultative Committee for Length
19
+ CCM:
20
+ fr: Comité consultatif pour la masse et les grandeurs apparentées
21
+ en: Consultative Committee for Mass and Related Quantities
22
+ CCPR:
23
+ fr: Comité consultatif de photométrie et radiométrie
24
+ en: Consultative Committee for Photometry and Radiometry
25
+ CCQM:
26
+ fr: 'Comité consultatif pour la quantité de matière : métrologie en chimie et biologie'
27
+ en: 'Consultative Committee for Amount of Substance: Metrology in Chemistry and Biology'
28
+ CCRI:
29
+ fr: Comité consultatif des rayonnements ionisants
30
+ en: Consultative Committee for Ionizing Radiation
31
+ CCT:
32
+ fr: Comité consultatif de thermométrie
33
+ en: Consultative Committee for Thermometry
34
+ CCTF:
35
+ fr: Comité consultatif du temps et des fréquences
36
+ en: Consultative Committee for Time and Frequency
37
+ note: formerly the CCDS
38
+ CCU:
39
+ fr: Comité consultatif des unités
40
+ en: Consultative Committee for Units
41
+ CGPM:
42
+ fr: Conférence générale des poids et mesures
43
+ en: General Conference on Weights and Measures
44
+ CIPM:
45
+ fr: Comité international des poids et mesures
46
+ en: International Committee for Weights and Measures
47
+ BIPM:
48
+ en: Joint Committees of the BIPM and other international organizations
49
+ CCL-CCTF:
50
+ JCGM:
51
+ en: Joint Committee for Guides in Metrology
52
+ JCRB:
53
+ en: Joint Committee of the Regional Metrology Organizations and the BIPM
54
+ JCTLM:
55
+ en: Joint Committee for Traceability in Laboratory Medicine
56
+ INetQI:
57
+ en: International Network on Quality Infrastructure
@@ -13,30 +13,32 @@ module RelatonBipm
13
13
  kg_h_c_deltanu kg_h m_c_deltanu m_c mol_NA s_deltanu
14
14
  ].freeze
15
15
 
16
- # @return [RelatonBipm::CommentPeriod, NilClass]
16
+ # @return [RelatonBipm::CommentPeriod, nil]
17
17
  attr_reader :comment_period
18
18
 
19
- # @return [String]
20
- attr_reader :si_aspect
19
+ # @return [String, nil]
20
+ attr_reader :si_aspect, :meeting_note
21
21
 
22
22
  # @param relation [Array<RelatonBipm::DocumentRelation>]
23
23
  # @param editorialgroup [RelatonBipm::EditorialGroup]
24
- # @param comment_period [RelatonBipm::CommentPeriod, NilClass]
25
- # @param si_aspect [String]
24
+ # @param comment_period [RelatonBipm::CommentPeriod, nil]
25
+ # @param si_aspect [String, nil]
26
+ # @param meeting_note [String, nil]
26
27
  # @param structuredidentifier [RelatonBipm::StructuredIdentifier]
27
28
  def initialize(**args) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
28
- if args[:docstatus] && !STATUSES.include?(args[:docstatus].stage)
29
- warn "[relaton-bipm] Warning: invalid docstatus #{args[:docstatus]}. "\
29
+ if args[:docstatus] && !STATUSES.include?(args[:docstatus].stage.value)
30
+ warn "[relaton-bipm] Warning: invalid docstatus: #{args[:docstatus].stage.value}. "\
30
31
  "It should be one of: #{STATUSES}"
31
32
  end
32
33
 
33
34
  if args[:si_aspect] && !SI_ASPECTS.include?(args[:si_aspect])
34
- warn "[relaton-bipm] Warning: invalid si_aspect #{args[:si_aspect]}. "\
35
+ warn "[relaton-bipm] Warning: invalid si_aspect: #{args[:si_aspect]}. "\
35
36
  "It should be one of: #{SI_ASPECTS}"
36
37
  end
37
38
 
38
39
  @comment_period = args.delete :comment_period
39
40
  @si_aspect = args.delete :si_aspect
41
+ @meeting_note = args[:meeting_note]
40
42
  super
41
43
  end
42
44
 
@@ -55,6 +57,7 @@ module RelatonBipm
55
57
  editorialgroup&.to_xml b
56
58
  comment_period&.to_xml b
57
59
  b.send "si-aspect", si_aspect if si_aspect
60
+ b.send "meeting-note", meeting_note if meeting_note
58
61
  structuredidentifier&.to_xml b
59
62
  end
60
63
  end
@@ -66,6 +69,7 @@ module RelatonBipm
66
69
  hash = super
67
70
  hash["comment_period"] = comment_period.to_hash if comment_period
68
71
  hash["si_aspect"] = si_aspect if si_aspect
72
+ hash["meeting-note"] = meeting_note if meeting_note
69
73
  hash
70
74
  end
71
75
 
@@ -75,7 +79,8 @@ module RelatonBipm
75
79
  pref = prefix.empty? ? prefix : prefix + "."
76
80
  out = super
77
81
  out += comment_period.to_asciibib prefix if comment_period
78
- out += "#{pref}.si_aspect:: #{si_aspect}\n" if si_aspect
82
+ out += "#{pref}si_aspect:: #{si_aspect}\n" if si_aspect
83
+ out += "#{pref}meeting_note:: #{meeting_note}\h" if meeting_note
79
84
  out
80
85
  end
81
86
  end
@@ -1,39 +1,320 @@
1
- require "net/http"
1
+ require "mechanize"
2
2
 
3
3
  module RelatonBipm
4
4
  class BipmBibliography
5
- ENDPOINT = "https://raw.githubusercontent.com/relaton/relaton-data-bipm/master/data/"
6
- .freeze
5
+ GH_ENDPOINT = "https://raw.githubusercontent.com/relaton/relaton-data-bipm/master/data/".freeze
6
+ IOP_DOMAIN = "https://iopscience.iop.org".freeze
7
+ USERAGENTS = [
8
+ "Mozilla/5.0 CK={} (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
9
+ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",
10
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)",
11
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",
12
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
13
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; KTXN)",
14
+ "Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1",
15
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
16
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0",
17
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1",
18
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36",
19
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
20
+ "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",
21
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/605.1.15 (KHTML, like Gecko)",
22
+ "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
23
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0",
24
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
25
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko)",
26
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)",
27
+ "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko",
28
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)",
29
+ "Mozilla/5.0 (Linux; U; Android 2.2) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
30
+ "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36",
31
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.83 Safari/537.1",
32
+ "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)",
33
+ ].freeze
7
34
 
8
35
  class << self
9
36
  # @param text [String]
10
37
  # @return [RelatonBipm::BipmBibliographicItem]
11
- def search(text, _year = nil, _opts = {}) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
38
+ def search(text, _year = nil, _opts = {})
12
39
  warn "[relaton-bipm] (\"#{text}\") fetching..."
13
- ref = text.sub(/^BIPM\s/, "").downcase # .sub /^([[:alpha:]]+)(\d+)/, '\1-\2'
14
- uri = URI("#{ENDPOINT}#{ref}.yaml")
15
- resp = Net::HTTP.get_response uri
16
- return unless resp.code == "200"
40
+ ref = text.sub(/^BIPM\s/, "")
41
+ item = ref.match?(/^Metrologia/i) ? get_metrologia(ref, magent) : get_bipm(ref, magent)
42
+ return unless item
17
43
 
18
- hash = HashConverter.hash_to_bib YAML.safe_load(resp.body, [Date])
19
- item = BipmBibliographicItem.new hash
20
- warn "[relaton-bipm] (\"#{text}\") found #{item.docidentifier.first.id}"
44
+ warn("[relaton-bipm] (\"#{text}\") found #{item.docidentifier[0].id}")
21
45
  item
22
- rescue SocketError, Errno::EINVAL, Errno::ECONNRESET, EOFError,
23
- Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
24
- Net::ProtocolError, Net::ReadTimeout, # OpenSSL::SSL::SSLError,
25
- Errno::ETIMEDOUT => e
26
- raise RelatonBib::RequestError, "Could not access #{uri}: #{e.message}"
46
+ rescue Mechanize::ResponseCodeError => e
47
+ raise RelatonBib::RequestError, e.message unless e.response_code == "404"
48
+ end
49
+
50
+ # @return [Mechanize]
51
+ def magent
52
+ a = Mechanize.new
53
+ a.request_headers = {
54
+ "Accept" => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,"\
55
+ "*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
56
+ "Accept-Encoding" => "gzip, deflate, br",
57
+ "Accept-Language" => "en-US,en;q=0.9,ru-RU;q=0.8,ru;q=0.7",
58
+ "Cache-Control" => "max-age=0",
59
+ "Upgrade-Insecure-Requests" => "1",
60
+ "User-Agent" => USERAGENTS.shuffle.first,
61
+ }
62
+ a
63
+ end
64
+
65
+ # @param ref [String]
66
+ # @param agent [Mechanize]
67
+ # @return [RelatonBipm::BipmBibliographicItem]
68
+ def get_bipm(ref, agent)
69
+ url = "#{GH_ENDPOINT}#{ref.downcase.split(' ').join '-'}.yaml"
70
+ resp = agent.get url
71
+ return unless resp.code == "200"
72
+
73
+ bib_hash = HashConverter.hash_to_bib YAML.safe_load(resp.body, [Date])
74
+ BipmBibliographicItem.new **bib_hash
75
+ end
76
+
77
+ # @param ref [String]
78
+ # @param agent [Mechanize]
79
+ # @return [RelatonBipm::BipmBibliographicItem]
80
+ def get_metrologia(ref, agent)
81
+ agent.redirect_ok = false
82
+ ref_arr = ref.split(" ")
83
+ case ref_arr.size
84
+ when 1 then get_journal agent
85
+ when 2 then get_volume ref_arr[1], agent
86
+ when 3 then get_issue(*ref_arr[1..2], agent)
87
+ when 4 then get_article_from_issue(*ref_arr[1..3], agent)
88
+ end
89
+ end
90
+
91
+ # @param agent [Mechanize]
92
+ # @return [RelatonBipm::BipmBibliographicItem]
93
+ def get_journal(agent)
94
+ url = IOP_DOMAIN + "/journal/0026-1394"
95
+ rsp = agent.get url
96
+ rel = rsp.xpath('//select[@id="allVolumesSelector"]/option').map do |v|
97
+ { type: "partOf", bibitem: journal_rel(v) }
98
+ end
99
+ did = doc_id []
100
+ bibitem(formattedref: fref(did.id), docid: [did], link: blink(url), relation: rel)
101
+ end
102
+
103
+ # @param elm [Nokogiri::XML::Element]
104
+ def journal_rel(elm)
105
+ vol = elm[:value].split("/").last
106
+ did = doc_id [vol]
107
+ url = IOP_DOMAIN + elm[:value]
108
+ BipmBibliographicItem.new(formattedref: fref(did.id), docid: [did], link: blink(url))
109
+ end
110
+
111
+ # @param vol [String]
112
+ # @param agent [Mechanize]
113
+ # @return [RelatonBipm::BipmBibliographicItem]
114
+ def get_volume(vol, agent)
115
+ url = "#{IOP_DOMAIN}/volume/0026-1394/#{vol}"
116
+ rsp = agent.get url
117
+ rel = rsp.xpath('//li[@itemprop="hasPart"]').map do |i|
118
+ { type: "partOf", bibitem: volume_rel(i, vol) }
119
+ end
120
+ did = doc_id [vol]
121
+ bibitem(formattedref: fref(did.id), docid: [did], link: blink(url), date: bdate(rsp), relation: rel,
122
+ extent: btextent(vol), series: series)
123
+ end
124
+
125
+ def volume_rel(elm, vol) # rubocop:disable Metrics/AbcSize
126
+ a = elm.at 'a[@itemprop="issueNumber"]'
127
+ ish = a[:href].split("/").last
128
+ url = IOP_DOMAIN + a[:href]
129
+ docid = doc_id [vol, ish]
130
+ t = elm.at "p"
131
+ title_fref = t ? { title: titles(t.text) } : { formattedref: fref(docid.id) }
132
+ BipmBibliographicItem.new **title_fref, docid: [docid], link: blink(url)
133
+ end
134
+
135
+ # @param title [String]
136
+ # @return [RelatonBib::TypedTitleStringCollection]
137
+ def titles(title)
138
+ RelatonBib::TypedTitleString.from_string title, "en", "Latn"
139
+ end
140
+
141
+ # @param vol [String]
142
+ # @param ish [String]
143
+ # @param agent [Mechanize]
144
+ # @return [RelatonBipm::BipmBibliographicItem]
145
+ def get_issue(vol, ish, agent) # rubocop:disable Metrics/AbcSize
146
+ url = issue_url vol, ish
147
+ rsp = agent.get url
148
+ rel = rsp.xpath('//div[@class="art-list-item-body"]').map do |a|
149
+ { type: "partOf", bibitem: issue_rel(a, vol, ish) }
150
+ end
151
+ did = doc_id [vol, ish]
152
+ title_fref = { title: issue_title(rsp) }
153
+ title_fref[:formattedref] = fref did.id unless title_fref[:title].any?
154
+ bibitem(**title_fref, link: blink(url), relation: rel, docid: [did],
155
+ date: bdate(rsp), extent: btextent(vol, ish), series: series)
156
+ end
157
+
158
+ # @param ref [String]
159
+ # @return [RelatonBib::FormattedRef]
160
+ def fref(ref)
161
+ RelatonBib::FormattedRef.new content: ref, language: "en", script: "Latn"
162
+ end
163
+
164
+ # @param rsp [Mechanize::Page]
165
+ # @return [RelatonBib::TypedTitleStringCollection]
166
+ def issue_title(rsp)
167
+ t = rsp.at('//div[@id="wd-jnl-issue-title"]/h4')
168
+ return RelatonBib::TypedTitleStringCollection.new [] unless t
169
+
170
+ titles(t.text)
171
+ end
172
+
173
+ # @oaran vol [String]
174
+ # @param ish [String]
175
+ # @return [String]
176
+ def issue_url(vol, ish)
177
+ "#{IOP_DOMAIN}/issue/0026-1394/#{vol}/#{ish}"
178
+ end
179
+
180
+ # @param elm [Nokogiri::XML::Element]
181
+ # @param vol [String]
182
+ # @param ish [String]
183
+ # @return [RelatonBipm::BipmBibliographicItem]
184
+ def issue_rel(elm, vol, ish)
185
+ art = elm.at('div[@class="indexer"]').text
186
+ ref = elm.at('div/a[@class="art-list-item-title"]')
187
+ title = titles ref.text.strip
188
+ docid = doc_id [vol, ish, art]
189
+ link = blink IOP_DOMAIN + ref[:href]
190
+ BipmBibliographicItem.new(title: title, docid: [docid], link: link)
191
+ end
192
+
193
+ # @param content [RelatonBib::TypedTitleString]
194
+ # @return [RelatonBib::TypedTitleString]
195
+ def btitle(content)
196
+ RelatonBib::TypedTitleString.new type: "main", content: content, language: "en", script: "Latn"
197
+ end
198
+
199
+ # @param url [String]
200
+ # @return [String]
201
+ def blink(url)
202
+ [RelatonBib::TypedUri.new(type: "src", content: url)]
203
+ end
204
+
205
+ # @param rsp [Mechanize::Page]
206
+ # @return [Array<RelatonBib::BibliographicDate>]
207
+ def bdate(rsp)
208
+ date = rsp.at('//p[@itemprop="issueNumber"]|//h2[@itemprop="volumeNumber"]').text.split(", ").last
209
+ on = date.match?(/^\d{4}$/) ? date : Date.parse(date).strftime("%Y-%m")
210
+ [RelatonBib::BibliographicDate.new(type: "published", on: on)]
211
+ end
212
+
213
+ # @param args [Array<String>]
214
+ # @return [RelatonBib::DocumentIdentifier]
215
+ def doc_id(args)
216
+ id = args.clone.unshift "Metrologia"
217
+ RelatonBib::DocumentIdentifier.new(type: "BIPM", id: id.join(" "))
218
+ end
219
+
220
+ # @param vol [String]
221
+ # @param ish [String]
222
+ # @param art [String]
223
+ # @param agent [Mechanize]
224
+ # @return [RelatonBipm::BipmBibliographicItem]
225
+ def get_article_from_issue(vol, ish, art, agent)
226
+ url = issue_url vol, ish
227
+ rsp = agent.get url
228
+ get_article rsp.at("//div[@class='indexer'][.='#{art}']/../div/a")[:href], vol, ish, agent
229
+ end
230
+
231
+ # @param path [String]
232
+ # @param vol [String]
233
+ # @param ish [String]
234
+ # @param agent [Mechanize]
235
+ # @return [RelatonBipm::BipmBibliographicItem]
236
+ def get_article(path, vol, ish, agent) # rubocop:disable Metrics/AbcSize
237
+ url = URI IOP_DOMAIN + path
238
+ rsp = agent.get url
239
+ bib = rsp.link_with(text: "BibTeX").href
240
+ rsp = agent.get URI IOP_DOMAIN + bib
241
+ bt = BibTeX.parse(rsp.body).first
242
+ bibitem(docid: btdocid(bt), title: titles(bt.title.to_s), abstract: btabstract(bt), doctype: bt.type.to_s,
243
+ link: btlink(bt, url), date: btdate(bt), contributor: btcontrib(bt), series: series,
244
+ extent: btextent(vol, ish, bt))
245
+ end
246
+
247
+ # @param args [Hash]
248
+ # @return [RelatonBipm::BipmBibliographicItem]
249
+ def bibitem(**args)
250
+ BipmBibliographicItem.new(
251
+ fetched: Date.today.to_s, type: "standard", language: ["en"], script: ["Latn"], **args
252
+ )
253
+ end
254
+
255
+ # @return [Array<RelatonBib::Series>]
256
+ def series
257
+ [RelatonBib::Series.new(title: btitle("Metrologia"))]
258
+ end
259
+
260
+ # @param bibtex [BibTeX::Entry]
261
+ # @return [Array<RelatonBib::DocumentIdentifier>]
262
+ def btdocid(bibtex)
263
+ id = "#{bibtex.journal} #{bibtex.volume} #{bibtex.number} #{bibtex.pages.match(/^\d+/)}"
264
+ [RelatonBib::DocumentIdentifier.new(type: "BIPM", id: id)]
265
+ end
266
+
267
+ # @param bibtex [BibTeX::Entry]
268
+ # @return [Array<RelatonBib::FormattedString>]
269
+ def btabstract(bibtex)
270
+ [RelatonBib::FormattedString.new(content: bibtex.abstract.to_s, language: "en", script: "Latn")]
271
+ end
272
+
273
+ # @param bibtex [BibTeX::Entry]
274
+ # @param ref [URI]
275
+ # @return [Array<RelatonBib::TypedUri>]
276
+ def btlink(bibtex, ref)
277
+ [
278
+ RelatonBib::TypedUri.new(type: "src", content: ref.to_s),
279
+ RelatonBib::TypedUri.new(type: "doi", content: bibtex.url.to_s),
280
+ ]
281
+ end
282
+
283
+ # @param bibtex [BibTeX::Entry]
284
+ # @return [Array<RelatonBib::BibliographicDate>]
285
+ def btdate(bibtex)
286
+ on = Date.new(bibtex.year.to_i, bibtex.month_numeric)
287
+ [RelatonBib::BibliographicDate.new(type: "published", on: on)]
288
+ end
289
+
290
+ # @param bibtex [BibTeX::Entry]
291
+ # @return [Array<Hash>]
292
+ def btcontrib(bibtex)
293
+ surname, initial = bibtex.author.split ", "
294
+ initial = initial.split(" ").map { |i| RelatonBib::LocalizedString.new i, "en", "Latn" }
295
+ surname = RelatonBib::LocalizedString.new surname, "en", "Latn"
296
+ name = RelatonBib::FullName.new surname: surname, initial: initial
297
+ author = RelatonBib::Person.new name: name
298
+ [
299
+ { entity: { name: bibtex.publisher.to_s }, role: [{ type: "publisher" }] },
300
+ { entity: author, role: [{ type: "author" }] },
301
+ ]
302
+ end
303
+
304
+ # @param vol [String]
305
+ # @param ish [String]
306
+ # @param bibtex [BibTeX::Entry]
307
+ # @return [Array<RelatonBib::BibItemLocality>]
308
+ def btextent(vol, ish = nil, bibtex = nil)
309
+ ext = [RelatonBib::BibItemLocality.new("volume", vol)]
310
+ ext << RelatonBib::BibItemLocality.new("issue", ish) if ish
311
+ ext << RelatonBib::BibItemLocality.new("page", *bibtex.pages.split("--")) if bibtex
312
+ ext
27
313
  end
28
314
 
29
315
  # @param ref [String] the BIPM standard Code to look up (e..g "BIPM B-11")
30
- # @param year [String] the year the standard was published (optional)
31
- #
32
- # @param opts [Hash] options
33
- # @option opts [TrueClass, FalseClass] :all_parts restricted to all parts
34
- # if all-parts reference is required
35
- # @option opts [TrueClass, FalseClass] :bibdata
36
- #
316
+ # @param year [String] not used
317
+ # @param opts [Hash] not used
37
318
  # @return [RelatonBipm::BipmBibliographicItem]
38
319
  def get(ref, year = nil, opts = {})
39
320
  search(ref, year, opts)