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



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

def anchor
  "RFC#{docnum}"
end

#codeString

Parse document code

Returns:

  • (String)

    document code



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

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

#docnumString

Parse document number

Returns:

  • (String)

    document number



102
103
104
# File 'lib/relaton_ietf/rfc_entry.rb', line 102

def docnum
  /\d+$/.match(code).to_s.sub(/^0+/, "")
end

#initials(int) ⇒ Array<RelatonBib::LocalizedString>

Ctreat initials

Parameters:

  • int (String)

Returns:

  • (Array<RelatonBib::LocalizedString>)


207
208
209
210
211
# File 'lib/relaton_ietf/rfc_entry.rb', line 207

def initials(int)
  return [] unless int

  int.split(/\.-?\s?|\s/).map { |i| RelatonBib::LocalizedString.new i, "en", "Latn" }
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
47
# File 'lib/relaton_ietf/rfc_entry.rb', line 28

def parse # rubocop:disable Metrics/MethodLength
  IetfBibliographicItem.new(
    type: "standard",
    language: ["en"],
    script: ["Latn"],
    fetched: Date.today.to_s,
    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



227
228
229
230
231
232
233
234
235
# File 'lib/relaton_ietf/rfc_entry.rb', line 227

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



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
# File 'lib/relaton_ietf/rfc_entry.rb', line 153

def parse_contributor # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity
  @doc.xpath("./xmlns:author").map do |contributor| # rubocop:disable Metrics/BlockLength
    n = contributor.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"
      entity = RelatonBib::Organization.new(abbrev: n, name: "Internet Architecture Board")
    when "IESG"
      entity = RelatonBib::Organization.new(abbrev: n, name: "Internet Engineering Steering Group")
    when "Internet Engineering Steering Group", "Federal Networking Council", "Internet Architecture Board",
      "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, snm = n.split
      /^(?:(?<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, initial: initials(int), surname: surname)
      entity = RelatonBib::Person.new(name: fname)
    end
    RelatonBib::ContributionInfo.new(entity: entity, role: [{ type: "author" }])
  end
end

#parse_dateArray<RelatonBib::BibliographicDate>

Parse document date

Returns:

  • (Array<RelatonBib::BibliographicDate>)

    document date



139
140
141
142
143
144
145
146
# File 'lib/relaton_ietf/rfc_entry.rb', line 139

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



68
69
70
71
72
73
74
75
76
# File 'lib/relaton_ietf/rfc_entry.rb', line 68

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



266
267
268
269
270
271
272
273
274
# File 'lib/relaton_ietf/rfc_entry.rb', line 266

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



218
219
220
# File 'lib/relaton_ietf/rfc_entry.rb', line 218

def parse_keyword
  @doc.xpath("./xmlns:keywords/xmlns:kw").map &:text
end

Create link

Returns:

  • (Array<RelatonBib::TypedUri>)


129
130
131
132
# File 'lib/relaton_ietf/rfc_entry.rb', line 129

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



242
243
244
245
246
247
248
249
# File 'lib/relaton_ietf/rfc_entry.rb', line 242

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)
    bib = IetfBibliographicItem.new(formattedref: fref)
    RelatonBib::DocumentRelation.new(type: types[r.parent.name], bibitem: bib)
  end
end

#parse_seriesArray<RelatonBib::Series>

Parse series

Returns:

  • (Array<RelatonBib::Series>)

    series



54
55
56
57
58
59
60
61
# File 'lib/relaton_ietf/rfc_entry.rb', line 54

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



256
257
258
259
# File 'lib/relaton_ietf/rfc_entry.rb', line 256

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



83
84
85
86
# File 'lib/relaton_ietf/rfc_entry.rb', line 83

def parse_title
  content = @doc.at("./xmlns:title").text
  [RelatonBib::TypedTitleString.new(content: content, type: "main")]
end

#pub_idString

Create PubID

Returns:

  • (String)

    PubID



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

def pub_id
  "RFC #{docnum}"
end