Class: RelatonIetf::RfcEntry
- Inherits:
-
Object
- Object
- RelatonIetf::RfcEntry
- Defined in:
- lib/relaton_ietf/rfc_entry.rb
Class Method Summary collapse
-
.parse(doc) ⇒ RelatonIetf::IetfBibliographicItem
Initialize parser & parse document.
Instance Method Summary collapse
-
#anchor ⇒ String
Create acnhor.
-
#code ⇒ String
Parse document code.
-
#docnum ⇒ String
Parse document number.
-
#forename(int) ⇒ Array<RelatonBib::Forename>
Ctreat initials.
-
#initialize(doc) ⇒ RfcEntry
constructor
Initalize parser.
-
#parse ⇒ RelatonIetf::IetfBibliographicItem
Parse document.
-
#parse_abstract ⇒ Array<RelatonBib::FormattedString>
Parse document abstract.
-
#parse_contributor ⇒ Array<RelatonBib::ContributionInfo>
Parse document contributors.
-
#parse_date ⇒ Array<RelatonBib::BibliographicDate>
Parse document date.
-
#parse_docid ⇒ Array<RelatonBib::DocumentIdettifier>
Parse document identifiers.
-
#parse_editorialgroup ⇒ RelatonBib::EditorialGroup
Parse document editorial group.
-
#parse_keyword ⇒ Array<String>
Parse document keywords.
-
#parse_link ⇒ Array<RelatonBib::TypedUri>
Create link.
-
#parse_relation ⇒ Arra<RelatonBib::DocumentRelation>
Parse document relations.
-
#parse_role(contrib, desc = nil) ⇒ Array<Hash>
Parse contributors role.
-
#parse_series ⇒ Array<RelatonBib::Series>
Parse series.
-
#parse_status ⇒ RelatonBib::DocuemntStatus
Parse document status.
-
#parse_title ⇒ Array<RelatonBib::TypedTileString>
Parse document title.
-
#pub_id ⇒ String
Create PubID.
Constructor Details
#initialize(doc) ⇒ RfcEntry
Initalize parser
8 9 10 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 8 def initialize(doc) @doc = doc end |
Class Method Details
.parse(doc) ⇒ RelatonIetf::IetfBibliographicItem
Initialize parser & parse document
19 20 21 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 19 def self.parse(doc) new(doc).parse end |
Instance Method Details
#anchor ⇒ String
Create acnhor
119 120 121 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 119 def anchor "RFC#{docnum}" end |
#code ⇒ String
Parse document code
110 111 112 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 110 def code @doc.at("./xmlns:doc-id").text end |
#docnum ⇒ String
Parse document number
101 102 103 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 101 def docnum /\d+$/.match(code).to_s.sub(/^0+/, "") end |
#forename(int) ⇒ Array<RelatonBib::Forename>
Ctreat initials
226 227 228 229 230 231 232 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 226 def forename(int) return [] unless int int.split(/\.-?\s?|\s/).map do |i| RelatonBib::Forename.new initial: i, language: "en", script: "Latn" end end |
#parse ⇒ RelatonIetf::IetfBibliographicItem
Parse document
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 28 def parse # rubocop:disable Metrics/MethodLength IetfBibliographicItem.new( type: "standard", language: ["en"], script: ["Latn"], docid: parse_docid, docnumber: code, title: parse_title, link: parse_link, date: parse_date, contributor: parse_contributor, keyword: parse_keyword, abstract: parse_abstract, relation: parse_relation, status: parse_status, series: parse_series, editorialgroup: parse_editorialgroup, ) end |
#parse_abstract ⇒ Array<RelatonBib::FormattedString>
Parse document abstract
248 249 250 251 252 253 254 255 256 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 248 def parse_abstract @doc.xpath("./xmlns:abstract").map do |c| content = c.xpath("./xmlns:p").map do |p| "<#{p.name}>#{p.text.strip}</#{p.name}>" end.join RelatonBib::FormattedString.new(content: content, language: "en", script: "Latn", format: "text/html") end end |
#parse_contributor ⇒ Array<RelatonBib::ContributionInfo>
Parse document contributors
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 152 def parse_contributor # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity @doc.xpath("./xmlns:author").map do |contrib| # rubocop:disable Metrics/BlockLength n = contrib.at("./xmlns:name").text case n when "ISO" entity = RelatonBib::Organization.new(abbrev: n, name: "International Organization for Standardization") when "International Organization for Standardization" entity = RelatonBib::Organization.new(abbrev: "ISO", name: n) # when "IAB", "IESG", "Internet Architecture Board", "IAB and IESG", # "IAB Advisory Committee", "Internet Engineering Steering Group" when /#{RelatonBib::BibXMLParser::FULLNAMEORG.join("|")}/ abbr = n.upcase == n ? n : n.split.reduce([]) { |a, w| w == w.upcase ? break : a << w[0] }&.join entity = RelatonBib::Organization.new(abbrev: abbr, name: n) desc = "BibXML author" # when "IESG" # entity = RelatonBib::Organization.new(abbrev: n, name: "Internet Engineering Steering Group") when "Federal Networking Council", "Internet Activities Board", "Defense Advanced Research Projects Agency", "National Science Foundation", "National Research Council", "National Bureau of Standards" abbr = n.split.map { |w| w[0] if w[0] == w[0].upcase }.join entity = RelatonBib::Organization.new(abbrev: abbr, name: n) when "IETF Secretariat" entity = RelatonBib::Organization.new(abbrev: "IETF", name: n) when "Audio-Video Transport Working Group", /North American Directory Forum/, "EARN Staff", "Vietnamese Standardization Working Group", "ACM SIGUCCS", "ESCC X.500/X.400 Task Force", "Sun Microsystems", "NetBIOS Working Group in the Defense Advanced Research Projects Agency", "End-to-End Services Task Force", "Network Technical Advisory Group", "Bolt Beranek", "Newman Laboratories", "Gateway Algorithms and Data Structures Task Force", "Network Information Center. Stanford Research Institute", "RFC Editor", "Information Sciences Institute University of Southern California" entity = RelatonBib::Organization.new(name: n) when "Internet Assigned Numbers Authority (IANA)" entity = RelatonBib::Organization.new(abbrev: "IANA", name: "Internet Assigned Numbers Authority") when "ESnet Site Coordinating Comittee (ESCC)" entity = RelatonBib::Organization.new(abbrev: "ESCC", name: "ESnet Site Coordinating Comittee") when "Energy Sciences Network (ESnet)" entity = RelatonBib::Organization.new(abbrev: "ESnet", name: "Energy Sciences Network") when "International Telegraph and Telephone Consultative Committee of the International Telecommunication Union" entity = RelatonBib::Organization.new(abbrev: "CCITT", name: n) else /^(?:(?<int>(?:\p{Lu}+(?:-\w|\(\w\))?\.{0,2}[-\s]?)+)\s)?(?<snm>[[:alnum:]\s'-.]+)$/ =~ n surname = RelatonBib::LocalizedString.new(snm, "en", "Latn") name = RelatonBib::LocalizedString.new(n, "en", "Latn") fname = RelatonBib::FullName.new( completename: name, initials: int, forename: forename(int), surname: surname, ) entity = RelatonBib::Person.new(name: fname) end RelatonBib::ContributionInfo.new(entity: entity, role: parse_role(contrib, desc)) end end |
#parse_date ⇒ Array<RelatonBib::BibliographicDate>
Parse document date
138 139 140 141 142 143 144 145 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 138 def parse_date @doc.xpath("./xmlns:date").map do |date| month = date.at("./xmlns:month").text year = date.at("./xmlns:year").text on = "#{year}-#{Date::MONTHNAMES.index(month).to_s.rjust(2, '0')}" RelatonBib::BibliographicDate.new(on: on, type: "published") end end |
#parse_docid ⇒ Array<RelatonBib::DocumentIdettifier>
Parse document identifiers
67 68 69 70 71 72 73 74 75 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 67 def parse_docid ids = [ RelatonBib::DocumentIdentifier.new(id: pub_id, type: "IETF", primary: true), # RelatonBib::DocumentIdentifier.new(id: anchor, type: "IETF", scope: "anchor"), ] doi = @doc.at("./xmlns:doi").text ids << RelatonBib::DocumentIdentifier.new(id: doi, type: "DOI") ids end |
#parse_editorialgroup ⇒ RelatonBib::EditorialGroup
Parse document editorial group
288 289 290 291 292 293 294 295 296 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 288 def parse_editorialgroup tc = @doc.xpath("./xmlns:wg_acronym").each_with_object([]) do |wg, arr| next if wg.text == "NON WORKING GROUP" wg = RelatonBib::WorkGroup.new(name: wg.text) arr << RelatonBib::TechnicalCommittee.new(wg) end RelatonBib::EditorialGroup.new(tc) if tc.any? end |
#parse_keyword ⇒ Array<String>
Parse document keywords
239 240 241 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 239 def parse_keyword @doc.xpath("./xmlns:keywords/xmlns:kw").map &:text end |
#parse_link ⇒ Array<RelatonBib::TypedUri>
Create link
128 129 130 131 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 128 def parse_link url = "https://www.rfc-editor.org/info/rfc#{docnum}" [RelatonBib::TypedUri.new(content: url, type: "src")] end |
#parse_relation ⇒ Arra<RelatonBib::DocumentRelation>
Parse document relations
263 264 265 266 267 268 269 270 271 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 263 def parse_relation types = { "updates" => "updates", "obsoleted-by" => "obsoletedBy"} @doc.xpath("./xmlns:updates/xmlns:doc-id|./xmlns:obsoleted-by/xmlns:doc-id").map do |r| fref = RelatonBib::FormattedRef.new(content: r.text) docid = RelatonBib::DocumentIdentifier.new type: "IETF", id: r.text, primary: true bib = IetfBibliographicItem.new(formattedref: fref, docid: [docid]) RelatonBib::DocumentRelation.new(type: types[r.parent.name], bibitem: bib) end end |
#parse_role(contrib, desc = nil) ⇒ Array<Hash>
Parse contributors role
212 213 214 215 216 217 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 212 def parse_role(contrib, desc = nil) type = contrib.at("./xmlns:title")&.text&.downcase || "author" role = { type: type } role[:description] = [desc] if desc [role] end |
#parse_series ⇒ Array<RelatonBib::Series>
Parse series
53 54 55 56 57 58 59 60 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 53 def parse_series title = RelatonBib::TypedTitleString.new(content: "RFC") @doc.xpath("./xmlns:is-also/xmlns:doc-id").map do |s| /^(?<name>\D+)(?<num>\d+)/ =~ s.text t = RelatonBib::TypedTitleString.new(content: name) RelatonBib::Series.new title: t, number: num.gsub(/^0+/, "") end + [RelatonBib::Series.new(title: title, number: docnum)] end |
#parse_status ⇒ RelatonBib::DocuemntStatus
Parse document status
278 279 280 281 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 278 def parse_status stage = @doc.at("./xmlns:current-status").text RelatonBib::DocumentStatus.new(stage: stage) end |
#parse_title ⇒ Array<RelatonBib::TypedTileString>
Parse document title
82 83 84 85 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 82 def parse_title content = @doc.at("./xmlns:title").text [RelatonBib::TypedTitleString.new(content: content, type: "main")] end |
#pub_id ⇒ String
Create PubID
92 93 94 |
# File 'lib/relaton_ietf/rfc_entry.rb', line 92 def pub_id "RFC #{docnum}" end |