Class: RelatonIetf::RfcEntry

Inherits:
Object
  • Object
show all
Defined in:
lib/relaton_ietf/rfc_entry.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(doc) ⇒ RfcEntry

Initalize parser

Parameters:

  • doc (Nokogiri::XML::Element)

    document



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

Parameters:

  • doc (Nokogiri::XML::Element)

    document

Returns:



19
20
21
# File 'lib/relaton_ietf/rfc_entry.rb', line 19

def self.parse(doc)
  new(doc).parse
end

Instance Method Details

#anchorString

Create acnhor

Returns:

  • (String)

    anchor



119
120
121
# File 'lib/relaton_ietf/rfc_entry.rb', line 119

def anchor
  "RFC#{docnum}"
end

#codeString

Parse document code

Returns:

  • (String)

    document code



110
111
112
# File 'lib/relaton_ietf/rfc_entry.rb', line 110

def code
  @doc.at("./xmlns:doc-id").text
end

#docnumString

Parse document number

Returns:

  • (String)

    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

Parameters:

  • int (String)

Returns:

  • (Array<RelatonBib::Forename>)


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

#parseRelatonIetf::IetfBibliographicItem

Parse document

Returns:



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_abstractArray<RelatonBib::FormattedString>

Parse document abstract

Returns:

  • (Array<RelatonBib::FormattedString>)

    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_contributorArray<RelatonBib::ContributionInfo>

Parse document contributors

Returns:

  • (Array<RelatonBib::ContributionInfo>)

    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_dateArray<RelatonBib::BibliographicDate>

Parse document date

Returns:

  • (Array<RelatonBib::BibliographicDate>)

    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_docidArray<RelatonBib::DocumentIdettifier>

Parse document identifiers

Returns:

  • (Array<RelatonBib::DocumentIdettifier>)

    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_editorialgroupRelatonBib::EditorialGroup

Parse document editorial group

Returns:

  • (RelatonBib::EditorialGroup)

    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_keywordArray<String>

Parse document keywords

Returns:

  • (Array<String>)

    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

Create link

Returns:

  • (Array<RelatonBib::TypedUri>)


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_relationArra<RelatonBib::DocumentRelation>

Parse document relations

Returns:

  • (Arra<RelatonBib::DocumentRelation>)

    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

Parameters:

  • contrib (Nokogiri::XML::Node)

    contributor

  • desc (String, nil) (defaults to: nil)

    contributor description

Returns:

  • (Array<Hash>)

    contributor’s 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_seriesArray<RelatonBib::Series>

Parse series

Returns:

  • (Array<RelatonBib::Series>)

    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_statusRelatonBib::DocuemntStatus

Parse document status

Returns:

  • (RelatonBib::DocuemntStatus)

    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_titleArray<RelatonBib::TypedTileString>

Parse document title

Returns:

  • (Array<RelatonBib::TypedTileString>)

    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_idString

Create PubID

Returns:

  • (String)

    PubID



92
93
94
# File 'lib/relaton_ietf/rfc_entry.rb', line 92

def pub_id
  "RFC #{docnum}"
end