Module: IsoDoc::Function::References

Included in:
Common
Defined in:
lib/isodoc/function/references.rb

Instance Method Summary collapse

Instance Method Details

#bibitem_ref_code(b) ⇒ Object

returns [metanorma, non-metanorma, DOI/ISSN/ISBN] identifiers



54
55
56
57
58
59
60
61
62
63
# File 'lib/isodoc/function/references.rb', line 54

def bibitem_ref_code(b)
  id = b.at(ns("./docidentifier[@type = 'metanorma']"))
  id1 = pref_ref_code(b)
  id2 = b.at(ns("./docidentifier[@type = 'DOI' or @type = 'ISSN' or "\
                "@type = 'ISBN']")) 
  return [id, id1, id2] if id || id1 || id2
  id = Nokogiri::XML::Node.new("docidentifier", b.document)
  id << "(NO ID)"
  [nil, id, nil]
end

#biblio_list(f, div, biblio) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/isodoc/function/references.rb', line 143

def biblio_list(f, div, biblio)
  i = 0
  f.children.each do |b|
    if b.name == "bibitem"
      next if implicit_reference(b)
      i += 1
      (is_standard(b)) ? std_bibitem_entry(div, b, i, biblio) :
        nonstd_bibitem(div, b, i, biblio)
    else
      parse(b, div) unless %w(title).include? b.name
    end
  end
end

#bibliography(isoxml, out) ⇒ Object



182
183
184
185
186
187
188
189
190
191
192
# File 'lib/isodoc/function/references.rb', line 182

def bibliography(isoxml, out)
  f = isoxml.at(ns(bibliography_xpath)) || return
  page_break(out)
  out.div do |div|
    #div.h1 @bibliography_lbl, **{ class: "Section3" }
    div.h1 **{class: "Section3"} do |h1|
      f&.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
    end
    biblio_list(f, div, true)
  end
end

#bibliography_parse(node, out) ⇒ Object



194
195
196
197
198
199
200
201
# File 'lib/isodoc/function/references.rb', line 194

def bibliography_parse(node, out)
  title = node&.at(ns("./title"))&.text || ""
  out.div do |div|
    clause_parse_title(node, div, node.at(ns("./title")), out,
                       { class: "Section3" })
    biblio_list(node, div, true)
  end
end

#bibliography_xpathObject



176
177
178
179
180
# File 'lib/isodoc/function/references.rb', line 176

def bibliography_xpath 
  "//bibliography/clause[.//references]"\
    "[not(.//references[@normative = 'true'])] | "\
    "//bibliography/references[@normative = 'false']"
end

#bracket_if_num(x) ⇒ Object



65
66
67
68
69
70
# File 'lib/isodoc/function/references.rb', line 65

def bracket_if_num(x)
  return nil if x.nil?
  x = x.text.sub(/^\[/, "").sub(/\]$/, "")
  return "[#{x}]" if /^\d+$/.match(x)
  x
end

#date_note_process(b, ref) ⇒ Object



92
93
94
95
96
97
# File 'lib/isodoc/function/references.rb', line 92

def date_note_process(b, ref)
  date_note = b.at(ns("./note[@type = 'ISO DATE']"))
  return if date_note.nil?
  date_note.children.first.replace("<p>#{date_note.content}</p>")
  footnote_parse(date_note, ref)
end

#docid_l10n(x) ⇒ Object

This is highly specific to ISO, but it’s not a bad precedent for references anyway; keeping here instead of in IsoDoc::Iso for now



6
7
8
9
10
# File 'lib/isodoc/function/references.rb', line 6

def docid_l10n(x)
  return x if x.nil?
  x.gsub(/All Parts/i, @i18n.all_parts.downcase) if @i18n.all_parts
  x
end

#docid_prefix(prefix, docid) ⇒ Object



82
83
84
85
# File 'lib/isodoc/function/references.rb', line 82

def docid_prefix(prefix, docid)
  docid = "#{prefix} #{docid}" if prefix && !omit_docid_prefix(prefix)
  docid_l10n(docid)
end

#format_ref(ref, prefix, isopub, date, allparts) ⇒ Object



203
204
205
206
207
208
# File 'lib/isodoc/function/references.rb', line 203

def format_ref(ref, prefix, isopub, date, allparts)
  ref = docid_prefix(prefix, ref)
  return "[#{ref}]" if /^\d+$/.match(ref) && !prefix &&
    !/^\[.*\]$/.match(ref)
    ref
end

#implicit_reference(b) ⇒ Object

reference not to be rendered because it is deemed implicit in the standards environment



113
114
115
# File 'lib/isodoc/function/references.rb', line 113

def implicit_reference(b)
  false
end

#is_standard(b) ⇒ Object



133
134
135
136
137
138
139
140
141
# File 'lib/isodoc/function/references.rb', line 133

def is_standard(b)
  ret = false
  b.xpath(ns("./docidentifier")).each do |id|
    next if id["type"].nil? ||
      %w(metanorma DOI ISSN ISBN).include?(id["type"])
    ret = true
  end
  ret
end

#iso_bibitem_entry_attrs(b, biblio) ⇒ Object



99
100
101
# File 'lib/isodoc/function/references.rb', line 99

def iso_bibitem_entry_attrs(b, biblio)
  { id: b["id"], class: biblio ? "Biblio" : "NormRef" }
end

#iso_title(b) ⇒ Object



103
104
105
106
107
108
109
# File 'lib/isodoc/function/references.rb', line 103

def iso_title(b)
  title = b.at(ns("./title[@language = '#{@lang}' and @type = 'main']")) ||
    b.at(ns("./title[@language = '#{@lang}']")) ||
    b.at(ns("./title[@type = 'main']")) ||
    b.at(ns("./title"))
  title
end

#nonstd_bibitem(list, b, ordinal, biblio) ⇒ Object

TODO generate formatted ref if not present



13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/isodoc/function/references.rb', line 13

def nonstd_bibitem(list, b, ordinal, biblio)
  list.p **attr_code(iso_bibitem_entry_attrs(b, biblio)) do |ref|
    ids = bibitem_ref_code(b)
    identifiers = render_identifier(ids)
    if biblio then ref_entry_code(ref, ordinal, identifiers, ids)
    else
      ref << "#{identifiers[0] || identifiers[1]}"
      ref << ", #{identifiers[1]}" if identifiers[0] && identifiers[1]
    end
    ref << ", " unless biblio && !identifiers[1]
    reference_format(b, ref)
  end
end

#norm_ref(isoxml, out, num) ⇒ Object



162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/isodoc/function/references.rb', line 162

def norm_ref(isoxml, out, num)
  f = isoxml.at(ns(norm_ref_xpath)) or return num
  out.div do |div|
    num = num + 1
    clause_name(num, f.at(ns("./title")), div, nil)
    if f.name == "clause"
      f.elements.each { |e| parse(e, div) unless e.name == "title" }
    else
      biblio_list(f, div, false)
    end
  end
  num
end

#norm_ref_xpathObject



157
158
159
160
# File 'lib/isodoc/function/references.rb', line 157

def norm_ref_xpath
  "//bibliography/references[@normative = 'true'] | "\
    "//bibliography/clause[.//references[@normative = 'true']]"
end

#omit_docid_prefix(prefix) ⇒ Object



87
88
89
90
# File 'lib/isodoc/function/references.rb', line 87

def omit_docid_prefix(prefix)
  return true if prefix.nil? || prefix.empty?
  return %w(ISO IEC ITU W3C metanorma).include? prefix
end

#pref_ref_code(b) ⇒ Object



48
49
50
51
# File 'lib/isodoc/function/references.rb', line 48

def pref_ref_code(b)
  b.at(ns("./docidentifier[not(@type = 'DOI' or @type = 'metanorma' "\
          "or @type = 'ISSN' or @type = 'ISBN' or @type = 'rfc-anchor')]"))
end

#prefix_bracketed_ref(ref, text) ⇒ Object



117
118
119
120
# File 'lib/isodoc/function/references.rb', line 117

def prefix_bracketed_ref(ref, text)
  ref << text.to_s
  insert_tab(ref, 1)
end

#ref_entry_code(r, ordinal, t, id) ⇒ Object

if t is just a number, only use that ([1] Non-Standard) else, use both ordinal, as prefix, and t



43
44
45
46
# File 'lib/isodoc/function/references.rb', line 43

def ref_entry_code(r, ordinal, t, id)
  prefix_bracketed_ref(r, t[0] || "[#{ordinal}]")
  t[1] and r << "#{t[1]}"
end

#reference_format(b, r) ⇒ Object



122
123
124
125
126
127
128
129
130
131
# File 'lib/isodoc/function/references.rb', line 122

def reference_format(b, r)
  if ftitle = b.at(ns("./formattedref"))
    ftitle&.children&.each { |n| parse(n, r) }
  else
    title = iso_title(b)
    r.i do |i|
      title&.children&.each { |n| parse(n, i) }
    end
  end
end

#render_identifier(id) ⇒ Object



72
73
74
75
76
77
78
79
80
# File 'lib/isodoc/function/references.rb', line 72

def render_identifier(id)
  [
    bracket_if_num(id[0]),
    id[1].nil? ? nil :
    docid_prefix(id[1]["type"], id[1].text.sub(/^\[/, "").sub(/\]$/, "")),
    id[2].nil? ? nil :
    docid_prefix(id[2]["type"], id[2].text.sub(/^\[/, "").sub(/\]$/, "")),
  ]
end

#std_bibitem_entry(list, b, ordinal, biblio) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/isodoc/function/references.rb', line 27

def std_bibitem_entry(list, b, ordinal, biblio)
  list.p **attr_code(iso_bibitem_entry_attrs(b, biblio)) do |ref|
    identifiers = render_identifier(bibitem_ref_code(b))
    if biblio then ref_entry_code(ref, ordinal, identifiers, nil)
    else
      ref << "#{identifiers[0] || identifiers[1]}"
      ref << ", #{identifiers[1]}" if identifiers[0] && identifiers[1]
    end
    date_note_process(b, ref)
    ref << ", " unless biblio && !identifiers[1]
    reference_format(b, ref)
  end
end