metanorma-standoc 1.9.0 → 1.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +3 -13
- data/.hound.yml +3 -1
- data/.rubocop.yml +4 -8
- data/lib/asciidoctor/standoc/base.rb +31 -35
- data/lib/asciidoctor/standoc/biblio.rng +1 -0
- data/lib/asciidoctor/standoc/blocks.rb +25 -9
- data/lib/asciidoctor/standoc/blocks_notes.rb +41 -24
- data/lib/asciidoctor/standoc/cleanup.rb +59 -84
- data/lib/asciidoctor/standoc/cleanup_block.rb +63 -85
- data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +28 -15
- data/lib/asciidoctor/standoc/cleanup_footnotes.rb +1 -0
- data/lib/asciidoctor/standoc/cleanup_image.rb +71 -0
- data/lib/asciidoctor/standoc/cleanup_inline.rb +117 -77
- data/lib/asciidoctor/standoc/cleanup_maths.rb +36 -27
- data/lib/asciidoctor/standoc/cleanup_ref.rb +31 -15
- data/lib/asciidoctor/standoc/cleanup_ref_dl.rb +1 -1
- data/lib/asciidoctor/standoc/cleanup_reqt.rb +47 -0
- data/lib/asciidoctor/standoc/cleanup_section.rb +77 -135
- data/lib/asciidoctor/standoc/cleanup_section_names.rb +75 -0
- data/lib/asciidoctor/standoc/cleanup_terms.rb +19 -18
- data/lib/asciidoctor/standoc/converter.rb +7 -2
- data/lib/asciidoctor/standoc/datamodel/plantuml_renderer.rb +67 -66
- data/lib/asciidoctor/standoc/front.rb +35 -18
- data/lib/asciidoctor/standoc/front_contributor.rb +70 -45
- data/lib/asciidoctor/standoc/inline.rb +45 -34
- data/lib/asciidoctor/standoc/isodoc.rng +209 -4
- data/lib/asciidoctor/standoc/lists.rb +4 -2
- data/lib/asciidoctor/standoc/macros.rb +11 -11
- data/lib/asciidoctor/standoc/macros_form.rb +63 -0
- data/lib/asciidoctor/standoc/macros_plantuml.rb +19 -21
- data/lib/asciidoctor/standoc/macros_terms.rb +33 -23
- data/lib/asciidoctor/standoc/ref.rb +87 -112
- data/lib/asciidoctor/standoc/ref_date_id.rb +62 -0
- data/lib/asciidoctor/standoc/ref_sect.rb +20 -17
- data/lib/asciidoctor/standoc/section.rb +3 -1
- data/lib/asciidoctor/standoc/term_lookup_cleanup.rb +40 -27
- data/lib/asciidoctor/standoc/terms.rb +25 -18
- data/lib/asciidoctor/standoc/utils.rb +35 -9
- data/lib/asciidoctor/standoc/validate.rb +48 -33
- data/lib/metanorma-standoc.rb +0 -1
- data/lib/metanorma/standoc/version.rb +1 -1
- data/metanorma-standoc.gemspec +4 -4
- data/spec/asciidoctor/base_spec.rb +701 -508
- data/spec/asciidoctor/blocks_spec.rb +831 -738
- data/spec/asciidoctor/cleanup_sections_spec.rb +51 -14
- data/spec/asciidoctor/cleanup_spec.rb +889 -682
- data/spec/asciidoctor/inline_spec.rb +62 -14
- data/spec/asciidoctor/isobib_cache_spec.rb +404 -358
- data/spec/asciidoctor/lists_spec.rb +149 -137
- data/spec/asciidoctor/macros_plantuml_spec.rb +8 -8
- data/spec/asciidoctor/macros_spec.rb +923 -503
- data/spec/asciidoctor/macros_yaml2text_spec.rb +1 -1
- data/spec/asciidoctor/refs_dl_spec.rb +4 -4
- data/spec/asciidoctor/refs_spec.rb +1528 -1533
- data/spec/asciidoctor/section_spec.rb +405 -299
- data/spec/asciidoctor/table_spec.rb +6 -6
- data/spec/asciidoctor/validate_spec.rb +342 -304
- data/spec/spec_helper.rb +13 -9
- data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +54 -54
- data/spec/vcr_cassettes/isobib_get_123.yml +13 -13
- data/spec/vcr_cassettes/isobib_get_123_1.yml +25 -25
- data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +37 -37
- data/spec/vcr_cassettes/isobib_get_123_2001.yml +12 -12
- data/spec/vcr_cassettes/isobib_get_124.yml +13 -13
- data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +14 -14
- data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +46 -46
- metadata +16 -15
- data/lib/liquid/custom_blocks/key_iterator.rb +0 -21
- data/lib/liquid/custom_blocks/with_json_nested_context.rb +0 -18
- data/lib/liquid/custom_blocks/with_yaml_nested_context.rb +0 -19
- data/lib/liquid/custom_filters/values.rb +0 -7
@@ -1,3 +1,5 @@
|
|
1
|
+
require "csv"
|
2
|
+
|
1
3
|
module Asciidoctor
|
2
4
|
module Standoc
|
3
5
|
class AltTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
|
@@ -36,46 +38,54 @@ module Asciidoctor
|
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
39
|
-
# Macro to transform `term[X,Y]` into em, termxref xml
|
40
41
|
class TermRefInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
|
41
42
|
use_dsl
|
42
43
|
named :term
|
43
|
-
name_positional_attributes
|
44
|
+
name_positional_attributes "name", "termxref"
|
44
45
|
using_format :short
|
45
46
|
|
46
47
|
def process(_parent, _target, attrs)
|
47
|
-
termref = attrs[
|
48
|
-
"<
|
48
|
+
termref = attrs["termxref"] || attrs["name"]
|
49
|
+
"<concept><termxref>#{attrs['name']}</termxref>"\
|
50
|
+
"<renderterm>#{termref}</renderterm><xrefrender/></concept>"
|
49
51
|
end
|
50
52
|
end
|
51
53
|
|
54
|
+
# Possibilities:
|
55
|
+
# {{<<id>>, term}}
|
56
|
+
# {{<<id>>, term, text}}
|
57
|
+
# {{<<termbase:id>>, term}}
|
58
|
+
# {{<<termbase:id>>, term, text}}
|
59
|
+
# {{term}} equivalent to term:[term]
|
60
|
+
# {{term, text}} equivalent to term:[term, text]
|
61
|
+
# text may optionally be followed by crossreference-rendering, options=""
|
52
62
|
class ConceptInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
|
53
63
|
use_dsl
|
54
64
|
named :concept
|
55
|
-
name_positional_attributes "id", "word", "term"
|
56
|
-
# match %r{concept:(?<target>[^\[]*)\[(?<content>|.*?[^\\])\]$}
|
57
65
|
match /\{\{(?<content>|.*?[^\\])\}\}/
|
58
66
|
using_format :short
|
59
67
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
attrs[
|
66
|
-
attrs[
|
67
|
-
|
68
|
+
def preprocess_attrs(target)
|
69
|
+
m = /^(?<id><<.+?>>)?(?<rest>.*)$/.match(target)
|
70
|
+
ret = { id: m[:id]&.sub(/^<</, "")&.sub(/>>$/, "") }
|
71
|
+
m2 = /^(?<rest>.*)(?<opt>,option=.+)?$/.match(m[:rest].sub(/^,/, ""))
|
72
|
+
ret[:opt] = m2[:opt]&.sub(/^,option=/, "")
|
73
|
+
attrs = CSV.parse_line(m2[:rest]) || []
|
74
|
+
ret.merge(term: attrs[0], word: attrs[1] || attrs[0],
|
75
|
+
xrefrender: attrs[2])
|
68
76
|
end
|
69
77
|
|
70
|
-
def process(parent,
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
78
|
+
def process(parent, target, _attrs)
|
79
|
+
attrs = preprocess_attrs(target)
|
80
|
+
termout = Asciidoctor::Inline.new(parent, :quoted, attrs[:term]).convert
|
81
|
+
wordout = Asciidoctor::Inline.new(parent, :quoted, attrs[:word]).convert
|
82
|
+
xrefout = Asciidoctor::Inline.new(parent, :quoted,
|
83
|
+
attrs[:xrefrender]).convert
|
84
|
+
attrs[:id] and return "<concept key='#{attrs[:id]}'><refterm>"\
|
85
|
+
"#{termout}</refterm><renderterm>#{wordout}</renderterm>"\
|
86
|
+
"<xrefrender>#{xrefout}</xrefrender></concept>"
|
87
|
+
"<concept><termxref>#{termout}</termxref><renderterm>#{wordout}"\
|
88
|
+
"</renderterm><xrefrender>#{xrefout}</xrefrender></concept>"
|
79
89
|
end
|
80
90
|
end
|
81
91
|
end
|
@@ -1,12 +1,14 @@
|
|
1
|
+
require_relative "ref_date_id"
|
2
|
+
|
1
3
|
module Asciidoctor
|
2
4
|
module Standoc
|
3
5
|
module Refs
|
4
|
-
def iso_publisher(
|
6
|
+
def iso_publisher(bib, code)
|
5
7
|
code.sub(/ .*$/, "").split(/\//).each do |abbrev|
|
6
|
-
|
8
|
+
bib.contributor do |c|
|
7
9
|
c.role **{ type: "publisher" }
|
8
10
|
c.organization do |org|
|
9
|
-
organization(org, abbrev)
|
11
|
+
organization(org, abbrev, true)
|
10
12
|
end
|
11
13
|
end
|
12
14
|
end
|
@@ -20,58 +22,19 @@ module Asciidoctor
|
|
20
22
|
{ id: m[:anchor], type: "standard" }
|
21
23
|
end
|
22
24
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
date.to matched[:to]
|
29
|
-
else
|
30
|
-
date.on matched[:from]
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def use_my_anchor(ref, id)
|
35
|
-
ref.parent.elements.last["id"] = id
|
36
|
-
ref
|
37
|
-
end
|
38
|
-
|
39
|
-
def id_and_year(id, year)
|
40
|
-
year ? "#{id}:#{year}" : id
|
41
|
-
end
|
42
|
-
|
43
|
-
def docid(t, code)
|
44
|
-
type, code1 = /^\[\d+\]$|^\([^)]+\).*$/.match(code) ?
|
45
|
-
["metanorma", mn_code(code)] : @bibdb&.docid_type(code) || [nil, code]
|
46
|
-
code1.sub!(/^nofetch\((.+)\)$/, "\\1")
|
47
|
-
t.docidentifier **attr_code(type: type) do |d|
|
48
|
-
d << code1
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def docnumber(t, code)
|
53
|
-
t.docnumber do |d|
|
54
|
-
d << HTMLEntities.new.decode(code).sub(/^[^\d]*/, "")
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def norm_year(yr)
|
59
|
-
/^\&\#821[12];$/.match(yr) and return "--"
|
60
|
-
/^\d\d\d\d-\d\d\d\d$/.match(yr) and return yr
|
61
|
-
yr&.sub(/(?<=[0-9])-.*$/, "")
|
62
|
-
end
|
63
|
-
|
64
|
-
def isorefrender1(t, m, yr, allp = "")
|
65
|
-
t.title(**plaintxt) { |i| i << ref_normalise(m[:text]) }
|
66
|
-
docid(t, m[:usrlbl]) if m[:usrlbl]
|
67
|
-
docid(t, id_and_year(m[:code], yr) + allp)
|
68
|
-
docnumber(t, m[:code])
|
25
|
+
def isorefrender1(bib, m, yr, allp = "")
|
26
|
+
bib.title(**plaintxt) { |i| i << ref_normalise(m[:text]) }
|
27
|
+
docid(bib, m[:usrlbl]) if m[:usrlbl]
|
28
|
+
docid(bib, id_and_year(m[:code], yr) + allp)
|
29
|
+
docnumber(bib, m[:code])
|
69
30
|
end
|
70
31
|
|
71
32
|
def isorefmatches(xml, m)
|
72
33
|
yr = norm_year(m[:year])
|
73
|
-
ref = fetch_ref xml, m[:code], yr, title: m[:text], usrlbl: m[:usrlbl],
|
34
|
+
ref = fetch_ref xml, m[:code], yr, title: m[:text], usrlbl: m[:usrlbl],
|
35
|
+
lang: (@lang || :all)
|
74
36
|
return use_my_anchor(ref, m[:anchor]) if ref
|
37
|
+
|
75
38
|
xml.bibitem **attr_code(ref_attributes(m)) do |t|
|
76
39
|
isorefrender1(t, m, yr)
|
77
40
|
yr and t.date **{ type: "published" } do |d|
|
@@ -85,6 +48,7 @@ module Asciidoctor
|
|
85
48
|
ref = fetch_ref xml, m[:code], nil, no_year: true, note: m[:fn],
|
86
49
|
title: m[:text], usrlbl: m[:usrlbl], lang: (@lang || :all)
|
87
50
|
return use_my_anchor(ref, m[:anchor]) if ref
|
51
|
+
|
88
52
|
isorefmatches2_1(xml, m)
|
89
53
|
end
|
90
54
|
|
@@ -95,49 +59,51 @@ module Asciidoctor
|
|
95
59
|
d.on "--"
|
96
60
|
end
|
97
61
|
iso_publisher(t, m[:code])
|
98
|
-
m[:fn].nil?
|
99
|
-
|
62
|
+
unless m[:fn].nil?
|
63
|
+
t.note(**plaintxt.merge(type: "Unpublished-Status")) do |p|
|
64
|
+
p << (m[:fn]).to_s
|
65
|
+
end
|
100
66
|
end
|
101
67
|
end
|
102
68
|
end
|
103
69
|
|
104
|
-
def conditional_date(t, m, noyr)
|
105
|
-
m.names.include?("year") and !m[:year].nil? and
|
106
|
-
t.date(**{ type: "published" }) do |d|
|
107
|
-
noyr and d.on "--" or set_date_range(d, norm_year(m[:year]))
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
70
|
def isorefmatches3(xml, m)
|
112
71
|
yr = norm_year(m[:year])
|
113
72
|
hasyr = !yr.nil? && yr != "--"
|
114
|
-
ref = fetch_ref
|
115
|
-
|
73
|
+
ref = fetch_ref(xml, m[:code], hasyr ? yr : nil,
|
74
|
+
all_parts: true,
|
75
|
+
no_year: yr == "--", text: m[:text], usrlbl: m[:usrlbl],
|
76
|
+
lang: (@lang || :all))
|
116
77
|
return use_my_anchor(ref, m[:anchor]) if ref
|
78
|
+
|
117
79
|
isorefmatches3_1(xml, m, yr, hasyr, ref)
|
118
80
|
end
|
119
81
|
|
120
|
-
def isorefmatches3_1(xml, m, yr,
|
82
|
+
def isorefmatches3_1(xml, m, yr, _hasyr, _ref)
|
121
83
|
xml.bibitem(**attr_code(ref_attributes(m))) do |t|
|
122
84
|
isorefrender1(t, m, yr, " (all parts)")
|
123
85
|
conditional_date(t, m, yr == "--")
|
124
86
|
iso_publisher(t, m[:code])
|
125
|
-
m.names.include?("fn") && m[:fn]
|
126
|
-
t.note(**plaintxt.merge(type: "Unpublished-Status"))
|
127
|
-
|
87
|
+
if m.names.include?("fn") && m[:fn]
|
88
|
+
t.note(**plaintxt.merge(type: "Unpublished-Status")) do |p|
|
89
|
+
p << (m[:fn]).to_s
|
90
|
+
end
|
91
|
+
end
|
92
|
+
t.extent **{ type: "part" } do |e|
|
128
93
|
e.referenceFrom "all"
|
129
94
|
end
|
130
95
|
end
|
131
96
|
end
|
132
97
|
|
133
|
-
def refitem_render1(m, code,
|
98
|
+
def refitem_render1(m, code, bib)
|
134
99
|
if code[:type] == "path"
|
135
|
-
|
136
|
-
|
100
|
+
bib.uri code[:key].sub(/\.[a-zA-Z0-9]+$/, ""), **{ type: "URI" }
|
101
|
+
bib.uri code[:key].sub(/\.[a-zA-Z0-9]+$/, ""), **{ type: "citation" }
|
137
102
|
end
|
138
|
-
docid(
|
139
|
-
docid(
|
140
|
-
code[:type] == "repo" and
|
103
|
+
docid(bib, m[:usrlbl]) if m[:usrlbl]
|
104
|
+
docid(bib, /^\d+$/.match?(code[:id]) ? "[#{code[:id]}]" : code[:id])
|
105
|
+
code[:type] == "repo" and
|
106
|
+
bib.docidentifier code[:key], **{ type: "repository" }
|
141
107
|
end
|
142
108
|
|
143
109
|
def refitem_render(xml, m, code)
|
@@ -146,7 +112,7 @@ module Asciidoctor
|
|
146
112
|
i << ref_normalise_no_format(m[:text])
|
147
113
|
end
|
148
114
|
refitem_render1(m, code, t)
|
149
|
-
docnumber(t, code[:id]) unless /^\d+$|^\(.+\)$/.match(code[:id])
|
115
|
+
docnumber(t, code[:id]) unless /^\d+$|^\(.+\)$/.match?(code[:id])
|
150
116
|
end
|
151
117
|
end
|
152
118
|
|
@@ -156,25 +122,30 @@ module Asciidoctor
|
|
156
122
|
|
157
123
|
def analyse_ref_nofetch(ret)
|
158
124
|
return ret unless m = /^nofetch\((?<id>.+)\)$/.match(ret[:id])
|
125
|
+
|
159
126
|
ret.merge(id: m[:id], nofetch: true)
|
160
127
|
end
|
161
128
|
|
162
129
|
def analyse_ref_repo_path(ret)
|
163
|
-
return ret unless m =
|
130
|
+
return ret unless m =
|
131
|
+
/^(?<type>repo|path):\((?<key>[^,]+),?(?<id>.*)\)$/.match(ret[:id])
|
132
|
+
|
164
133
|
id = m[:id].empty? ? m[:key].sub(%r{^[^/]+/}, "") : m[:id]
|
165
134
|
ret.merge(id: id, type: m[:type], key: m[:key], nofetch: true)
|
166
135
|
end
|
167
136
|
|
168
137
|
def analyse_ref_numeric(ret)
|
169
|
-
return ret unless /^\d+$/.match(ret[:id])
|
138
|
+
return ret unless /^\d+$/.match?(ret[:id])
|
139
|
+
|
170
140
|
ret.merge(numeric: true)
|
171
141
|
end
|
172
142
|
|
173
143
|
# ref id = (usrlbl)code[:-]year
|
174
144
|
# code = nofetch(code) | (repo|path):(key,code) | \[? number \]? | ident
|
175
145
|
def analyse_ref_code(code)
|
176
|
-
ret = {id: code}
|
177
|
-
return ret if code.
|
146
|
+
ret = { id: code }
|
147
|
+
return ret if code.blank?
|
148
|
+
|
178
149
|
analyse_ref_nofetch(analyse_ref_repo_path(analyse_ref_numeric(ret)))
|
179
150
|
end
|
180
151
|
|
@@ -185,11 +156,13 @@ module Asciidoctor
|
|
185
156
|
nil
|
186
157
|
end
|
187
158
|
|
188
|
-
def refitem1(xml,
|
159
|
+
def refitem1(xml, _item, m)
|
189
160
|
code = analyse_ref_code(m[:code])
|
190
161
|
unless code[:id] && code[:numeric] || code[:nofetch]
|
191
|
-
ref = fetch_ref
|
192
|
-
|
162
|
+
ref = fetch_ref(xml, code[:id],
|
163
|
+
m.names.include?("year") ? m[:year] : nil,
|
164
|
+
title: m[:text],
|
165
|
+
usrlbl: m[:usrlbl], lang: (@lang || :all))
|
193
166
|
return use_my_anchor(ref, m[:anchor]) if ref
|
194
167
|
end
|
195
168
|
refitem_render(xml, m, code)
|
@@ -203,44 +176,46 @@ module Asciidoctor
|
|
203
176
|
ref.gsub(/&amp;/, "&")
|
204
177
|
end
|
205
178
|
|
206
|
-
ISO_REF =
|
179
|
+
ISO_REF =
|
180
|
+
%r{^<ref\sid="(?<anchor>[^"]+)">
|
207
181
|
\[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9-]+|IEV)
|
208
|
-
(:(?<year>[0-9][0-9-]+))?\]</ref>,?\s*(?<text>.*)$}xm
|
182
|
+
(:(?<year>[0-9][0-9-]+))?\]</ref>,?\s*(?<text>.*)$}xm.freeze
|
209
183
|
|
210
|
-
|
184
|
+
ISO_REF_NO_YEAR =
|
185
|
+
%r{^<ref\sid="(?<anchor>[^"]+)">
|
211
186
|
\[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9-]+):
|
212
|
-
(
|
187
|
+
(--|&\#821[12];)\]</ref>,?\s*
|
213
188
|
(<fn[^>]*>\s*<p>(?<fn>[^\]]+)</p>\s*</fn>)?,?\s?(?<text>.*)$}xm
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
(
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
code.sub(/^\(/, "[").sub(/\).*$/, "]").sub(/^nofetch\((.+)\)$/, "\\1")
|
189
|
+
.freeze
|
190
|
+
|
191
|
+
ISO_REF_ALL_PARTS =
|
192
|
+
%r{^<ref\sid="(?<anchor>[^"]+)">
|
193
|
+
\[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9]+)
|
194
|
+
(:(?<year>--|&\#821[12];|[0-9][0-9-]+))?\s
|
195
|
+
\(all\sparts\)\]</ref>,?\s*
|
196
|
+
(<fn[^>]*>\s*<p>(?<fn>[^\]]+)</p>\s*</fn>,?\s?)?(?<text>.*)$}xm.freeze
|
197
|
+
|
198
|
+
NON_ISO_REF = %r{^<ref\sid="(?<anchor>[^"]+)">
|
199
|
+
\[(?<usrlbl>\([^)]+\))?(?<code>[^\]]+?)
|
200
|
+
([:-](?<year>(19|20)[0-9][0-9][0-9-]*))?\]</ref>,?\s*(?<text>.*)$}xm
|
201
|
+
.freeze
|
202
|
+
|
203
|
+
def reference1_matches(item)
|
204
|
+
matched = ISO_REF.match item
|
205
|
+
matched2 = ISO_REF_NO_YEAR.match item
|
206
|
+
matched3 = ISO_REF_ALL_PARTS.match item
|
207
|
+
[matched, matched2, matched3]
|
208
|
+
end
|
209
|
+
|
210
|
+
def reference1(node, item, xml)
|
211
|
+
matched, matched2, matched3 = reference1_matches(item)
|
212
|
+
if matched3.nil? && matched2.nil? && matched.nil?
|
213
|
+
refitem(xml, item, node)
|
214
|
+
elsif !matched.nil? then isorefmatches(xml, matched)
|
215
|
+
elsif !matched2.nil? then isorefmatches2(xml, matched2)
|
216
|
+
elsif !matched3.nil? then isorefmatches3(xml, matched3)
|
243
217
|
end
|
218
|
+
end
|
244
219
|
end
|
245
220
|
end
|
246
221
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Asciidoctor
|
2
|
+
module Standoc
|
3
|
+
module Refs
|
4
|
+
def set_date_range(date, text)
|
5
|
+
matched = /^(?<from>[0-9]+)(-+(?<to>[0-9]+))?$/.match text
|
6
|
+
return unless matched[:from]
|
7
|
+
|
8
|
+
if matched[:to]
|
9
|
+
date.from matched[:from]
|
10
|
+
date.to matched[:to]
|
11
|
+
else
|
12
|
+
date.on matched[:from]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def id_and_year(id, year)
|
17
|
+
year ? "#{id}:#{year}" : id
|
18
|
+
end
|
19
|
+
|
20
|
+
def norm_year(year)
|
21
|
+
/^&\#821[12];$/.match(year) and return "--"
|
22
|
+
/^\d\d\d\d-\d\d\d\d$/.match(year) and return year
|
23
|
+
year&.sub(/(?<=[0-9])-.*$/, "")
|
24
|
+
end
|
25
|
+
|
26
|
+
def conditional_date(bib, match, noyr)
|
27
|
+
if match.names.include?("year") && !match[:year].nil?
|
28
|
+
bib.date(**{ type: "published" }) do |d|
|
29
|
+
noyr and d.on "--" or set_date_range(d, norm_year(match[:year]))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def use_my_anchor(ref, id)
|
35
|
+
ref.parent.elements.last["id"] = id
|
36
|
+
ref
|
37
|
+
end
|
38
|
+
|
39
|
+
def docid(bib, code)
|
40
|
+
type, code1 = if /^\[\d+\]$|^\([^)]+\).*$/.match?(code)
|
41
|
+
["metanorma", mn_code(code)]
|
42
|
+
else
|
43
|
+
@bibdb&.docid_type(code) || [nil, code]
|
44
|
+
end
|
45
|
+
code1.sub!(/^nofetch\((.+)\)$/, "\\1")
|
46
|
+
bib.docidentifier **attr_code(type: type) do |d|
|
47
|
+
d << code1
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def docnumber(bib, code)
|
52
|
+
bib.docnumber do |d|
|
53
|
+
d << HTMLEntities.new.decode(code).sub(/^[^\d]*/, "")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def mn_code(code)
|
58
|
+
code.sub(/^\(/, "[").sub(/\).*$/, "]").sub(/^nofetch\((.+)\)$/, "\\1")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|