metanorma-standoc 1.1.9 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +0 -2
- data/Gemfile.lock +63 -64
- data/lib/asciidoctor/standoc/base.rb +9 -11
- data/lib/asciidoctor/standoc/biblio.rng +24 -3
- data/lib/asciidoctor/standoc/blocks.rb +16 -8
- data/lib/asciidoctor/standoc/cleanup.rb +1 -0
- data/lib/asciidoctor/standoc/cleanup_ref.rb +80 -1
- data/lib/asciidoctor/standoc/front.rb +22 -4
- data/lib/asciidoctor/standoc/isodoc.rng +45 -63
- data/lib/asciidoctor/standoc/ref.rb +4 -11
- data/lib/asciidoctor/standoc/reqt.rng +5 -0
- data/lib/asciidoctor/standoc/section.rb +1 -0
- data/lib/asciidoctor/standoc/table.rb +1 -0
- data/lib/metanorma/standoc/version.rb +1 -1
- data/metanorma-standoc.gemspec +9 -5
- data/spec/asciidoctor-standoc/base_spec.rb +14 -7
- data/spec/asciidoctor-standoc/blocks_spec.rb +26 -19
- data/spec/asciidoctor-standoc/cleanup_spec.rb +13 -31
- data/spec/asciidoctor-standoc/inline_spec.rb +0 -2
- data/spec/asciidoctor-standoc/isobib_cache_spec.rb +272 -62
- data/spec/asciidoctor-standoc/refs_dl_spec.rb +56 -0
- data/spec/asciidoctor-standoc/refs_spec.rb +139 -115
- data/spec/asciidoctor-standoc/table_spec.rb +2 -2
- data/spec/asciidoctor-standoc/validate_spec.rb +1 -1
- data/spec/spec_helper.rb +5 -5
- data/spec/vcr_cassettes/isobib_get_123.yml +55 -43
- metadata +28 -16
- data/docs/customisation.adoc +0 -178
- data/docs/guidance.adoc +0 -436
- data/docs/htmloutput.adoc +0 -115
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30d5bcdf81251b8337ccbc89b87c995e53f2899277d814e6668f20c88b4cfd2e
|
4
|
+
data.tar.gz: 85b27e1f408c227f92aa9912e8937867583e25dfaec0fb05b7d644dff19fd514
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51cd7259dad7810f4496001fe1013ba6e88bb0cbc033babbba19ce545c3b9210abc7fb169aefc26c850db72493e5016316c6b60fa7f712c04872ff7a0b48bfad
|
7
|
+
data.tar.gz: 21c1588e83613777b5e25eb412eaf0d4cdaf82b927bdb4f824751af139585c4416a40779fe243505d180ea3db97c2647f393c4d73be09b06b540adba175d8e43
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,20 +1,14 @@
|
|
1
|
-
GIT
|
2
|
-
remote: https://github.com/vcr/vcr.git
|
3
|
-
revision: a0bb140184e8518baad640a705e04155911bf31f
|
4
|
-
ref: a0bb140184e8518baad640a705e04155911bf31f
|
5
|
-
specs:
|
6
|
-
vcr (4.0.0)
|
7
|
-
|
8
1
|
PATH
|
9
2
|
remote: .
|
10
3
|
specs:
|
11
|
-
metanorma-standoc (1.
|
4
|
+
metanorma-standoc (1.2.0)
|
12
5
|
asciidoctor (~> 1.5.7)
|
13
6
|
concurrent-ruby
|
14
|
-
html2doc (~> 0.8.
|
7
|
+
html2doc (~> 0.8.11)
|
15
8
|
iev (~> 0.2.1)
|
16
|
-
isodoc (~> 0.
|
17
|
-
relaton (~> 0.
|
9
|
+
isodoc (~> 0.10.0)
|
10
|
+
relaton (~> 0.4.0)
|
11
|
+
relaton-cli (~> 0.2.0)
|
18
12
|
ruby-jing
|
19
13
|
sterile (~> 1.0.14)
|
20
14
|
unicode2latex (~> 0.0.1)
|
@@ -37,16 +31,12 @@ GEM
|
|
37
31
|
crack (0.4.3)
|
38
32
|
safe_yaml (~> 1.0.0)
|
39
33
|
diff-lcs (1.3)
|
40
|
-
docile (1.3.
|
34
|
+
docile (1.3.2)
|
41
35
|
equivalent-xml (0.6.0)
|
42
36
|
nokogiri (>= 1.4.3)
|
43
|
-
ffi (1.
|
37
|
+
ffi (1.11.1)
|
44
38
|
formatador (0.2.5)
|
45
39
|
gb-agencies (0.0.5)
|
46
|
-
gbbib (0.4.4)
|
47
|
-
cnccs (~> 0.1.1)
|
48
|
-
gb-agencies (~> 0.0.1)
|
49
|
-
iso-bib-item (~> 0.4.2)
|
50
40
|
guard (2.15.0)
|
51
41
|
formatador (>= 0.2.4)
|
52
42
|
listen (>= 2.7, < 4.0)
|
@@ -61,8 +51,8 @@ GEM
|
|
61
51
|
guard (~> 2.1)
|
62
52
|
guard-compat (~> 1.1)
|
63
53
|
rspec (>= 2.99.0, < 4.0)
|
64
|
-
hashdiff (0.
|
65
|
-
html2doc (0.8.
|
54
|
+
hashdiff (0.4.0)
|
55
|
+
html2doc (0.8.11)
|
66
56
|
asciimath (~> 1.0.7)
|
67
57
|
htmlentities (~> 4.3.4)
|
68
58
|
image_size
|
@@ -72,32 +62,19 @@ GEM
|
|
72
62
|
uuidtools
|
73
63
|
htmlentities (4.3.4)
|
74
64
|
httpclient (2.8.3)
|
75
|
-
iecbib (0.2.2)
|
76
|
-
addressable
|
77
|
-
iso-bib-item (~> 0.4.2)
|
78
|
-
ietfbib (0.4.6)
|
79
|
-
iso-bib-item (~> 0.4.2)
|
80
65
|
iev (0.2.2)
|
81
66
|
nokogiri
|
82
|
-
image_size (2.0.
|
83
|
-
|
84
|
-
isoics (~> 0.1.6)
|
85
|
-
nokogiri (~> 1.8.4)
|
86
|
-
ruby_deep_clone (~> 0.8.0)
|
87
|
-
isobib (0.4.4)
|
88
|
-
algoliasearch
|
89
|
-
iecbib (~> 0.2.1)
|
90
|
-
iso-bib-item (~> 0.4.2)
|
91
|
-
isodoc (0.9.23)
|
67
|
+
image_size (2.0.1)
|
68
|
+
isodoc (0.10.0)
|
92
69
|
asciimath
|
93
|
-
html2doc (~> 0.8.
|
70
|
+
html2doc (~> 0.8.11)
|
94
71
|
htmlentities (~> 4.3.4)
|
95
72
|
liquid
|
96
73
|
metanorma (~> 0.3.0)
|
97
74
|
nokogiri (>= 1)
|
98
75
|
rake (~> 12.0)
|
99
76
|
roman-numerals
|
100
|
-
sassc (~>
|
77
|
+
sassc (~> 2)
|
101
78
|
thread_safe
|
102
79
|
uuidtools
|
103
80
|
isoics (0.1.7)
|
@@ -117,8 +94,6 @@ GEM
|
|
117
94
|
mime-types-data (3.2019.0331)
|
118
95
|
mini_portile2 (2.3.0)
|
119
96
|
nenv (0.3.0)
|
120
|
-
nistbib (0.1.3)
|
121
|
-
relaton-bib (~> 0.1.0)
|
122
97
|
nokogiri (1.8.5)
|
123
98
|
mini_portile2 (~> 2.3.0)
|
124
99
|
notiffany (0.1.1)
|
@@ -132,36 +107,64 @@ GEM
|
|
132
107
|
pry (0.12.2)
|
133
108
|
coderay (~> 1.1.0)
|
134
109
|
method_source (~> 0.9.0)
|
135
|
-
public_suffix (3.0
|
110
|
+
public_suffix (3.1.0)
|
136
111
|
rainbow (3.0.0)
|
137
112
|
rake (12.3.2)
|
138
113
|
rb-fsevent (0.10.3)
|
139
114
|
rb-inotify (0.10.0)
|
140
115
|
ffi (~> 1.0)
|
141
|
-
relaton (0.
|
116
|
+
relaton (0.4.0)
|
117
|
+
algoliasearch
|
118
|
+
relaton-gb (~> 0.5.0)
|
119
|
+
relaton-iec (~> 0.3.0)
|
120
|
+
relaton-ietf (~> 0.5.0)
|
121
|
+
relaton-iso (~> 0.5.0)
|
122
|
+
relaton-iso-bib (~> 0.2.0)
|
123
|
+
relaton-itu (~> 0.2.0)
|
124
|
+
relaton-nist (~> 0.2.0)
|
125
|
+
relaton-bib (0.2.1)
|
126
|
+
addressable
|
127
|
+
nokogiri (~> 1.8.4)
|
128
|
+
relaton-cli (0.2.0)
|
129
|
+
liquid
|
130
|
+
relaton (~> 0.4)
|
131
|
+
thor
|
132
|
+
relaton-gb (0.5.0)
|
133
|
+
cnccs (~> 0.1.1)
|
134
|
+
gb-agencies (~> 0.0.1)
|
135
|
+
relaton-iso-bib (~> 0.2.0)
|
136
|
+
relaton-iec (0.3.0)
|
137
|
+
addressable
|
138
|
+
relaton-iso-bib (~> 0.2.0)
|
139
|
+
relaton-ietf (0.5.0)
|
140
|
+
relaton-iso-bib (~> 0.2.0)
|
141
|
+
relaton-iso (0.5.0)
|
142
142
|
algoliasearch
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
isobib (~> 0.4.0)
|
148
|
-
nistbib (~> 0.1.1)
|
149
|
-
relaton-bib (0.1.1)
|
143
|
+
relaton-iec (~> 0.3.0)
|
144
|
+
relaton-iso-bib (~> 0.2.0)
|
145
|
+
relaton-iso-bib (0.2.1)
|
146
|
+
isoics (~> 0.1.6)
|
150
147
|
nokogiri (~> 1.8.4)
|
148
|
+
relaton-bib (~> 0.2.0)
|
149
|
+
ruby_deep_clone (~> 0.8.0)
|
150
|
+
relaton-itu (0.2.0)
|
151
|
+
relaton-iso-bib (~> 0.2.0)
|
152
|
+
relaton-nist (0.2.0)
|
153
|
+
relaton-bib (~> 0.2.0)
|
151
154
|
roman-numerals (0.3.0)
|
152
155
|
rspec (3.8.0)
|
153
156
|
rspec-core (~> 3.8.0)
|
154
157
|
rspec-expectations (~> 3.8.0)
|
155
158
|
rspec-mocks (~> 3.8.0)
|
156
|
-
rspec-core (3.8.
|
159
|
+
rspec-core (3.8.1)
|
157
160
|
rspec-support (~> 3.8.0)
|
158
|
-
rspec-expectations (3.8.
|
161
|
+
rspec-expectations (3.8.4)
|
159
162
|
diff-lcs (>= 1.2.0, < 2.0)
|
160
163
|
rspec-support (~> 3.8.0)
|
161
|
-
rspec-mocks (3.8.
|
164
|
+
rspec-mocks (3.8.1)
|
162
165
|
diff-lcs (>= 1.2.0, < 2.0)
|
163
166
|
rspec-support (~> 3.8.0)
|
164
|
-
rspec-support (3.8.
|
167
|
+
rspec-support (3.8.2)
|
165
168
|
rubocop (0.54.0)
|
166
169
|
parallel (~> 1.10)
|
167
170
|
parser (>= 2.5)
|
@@ -171,18 +174,13 @@ GEM
|
|
171
174
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
172
175
|
ruby-jing (0.0.1)
|
173
176
|
optout (>= 0.0.2)
|
174
|
-
ruby-progressbar (1.10.
|
177
|
+
ruby-progressbar (1.10.1)
|
175
178
|
ruby_deep_clone (0.8.0)
|
176
179
|
ruby_dep (1.5.0)
|
177
180
|
safe_yaml (1.0.5)
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
rb-fsevent (~> 0.9, >= 0.9.4)
|
182
|
-
rb-inotify (~> 0.9, >= 0.9.7)
|
183
|
-
sassc (1.12.1)
|
184
|
-
ffi (~> 1.9.6)
|
185
|
-
sass (>= 3.3.0)
|
181
|
+
sassc (2.0.1)
|
182
|
+
ffi (~> 1.9)
|
183
|
+
rake
|
186
184
|
shellany (0.0.1)
|
187
185
|
simplecov (0.16.1)
|
188
186
|
docile (~> 1.1)
|
@@ -194,13 +192,14 @@ GEM
|
|
194
192
|
thor (0.20.3)
|
195
193
|
thread_safe (0.3.6)
|
196
194
|
timecop (0.9.1)
|
197
|
-
unicode-display_width (1.
|
195
|
+
unicode-display_width (1.6.0)
|
198
196
|
unicode2latex (0.0.2)
|
199
197
|
uuidtools (2.1.5)
|
200
|
-
|
198
|
+
vcr (5.0.0)
|
199
|
+
webmock (3.6.0)
|
201
200
|
addressable (>= 2.3.6)
|
202
201
|
crack (>= 0.3.2)
|
203
|
-
hashdiff
|
202
|
+
hashdiff (>= 0.4.0, < 2.0.0)
|
204
203
|
|
205
204
|
PLATFORMS
|
206
205
|
ruby
|
@@ -218,7 +217,7 @@ DEPENDENCIES
|
|
218
217
|
rubocop (= 0.54.0)
|
219
218
|
simplecov (~> 0.15)
|
220
219
|
timecop (~> 0.9)
|
221
|
-
vcr
|
220
|
+
vcr (~> 5.0.0)
|
222
221
|
webmock
|
223
222
|
|
224
223
|
BUNDLED WITH
|
@@ -5,7 +5,6 @@ require "json"
|
|
5
5
|
require "pathname"
|
6
6
|
require "open-uri"
|
7
7
|
require "pp"
|
8
|
-
require "sass"
|
9
8
|
require "isodoc"
|
10
9
|
require "relaton"
|
11
10
|
require "fileutils"
|
@@ -106,15 +105,14 @@ module Asciidoctor
|
|
106
105
|
end
|
107
106
|
|
108
107
|
def init_bib_caches(node)
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
@bibdb = Relaton::Db.new(globalname, localname) unless @no_isobib
|
108
|
+
return if @no_isobib
|
109
|
+
global = !@no_isobib_cache && !node.attr("local-cache-only")
|
110
|
+
local = node.attr("local-cache") || node.attr("local-cache-only")
|
111
|
+
local = nil if @no_isobib_cache
|
112
|
+
@bibdb = Relaton::DbCache.init_bib_caches(
|
113
|
+
local_cache: local,
|
114
|
+
flush_caches: node.attr("flush-caches"),
|
115
|
+
global_cache: global)
|
118
116
|
end
|
119
117
|
|
120
118
|
def init_iev_caches(node)
|
@@ -177,7 +175,7 @@ module Asciidoctor
|
|
177
175
|
end
|
178
176
|
|
179
177
|
def front(node, xml)
|
180
|
-
xml.bibdata **attr_code(type:
|
178
|
+
xml.bibdata **attr_code(type: "standard") do |b|
|
181
179
|
metadata node, b
|
182
180
|
end
|
183
181
|
end
|
@@ -35,7 +35,28 @@
|
|
35
35
|
</define>
|
36
36
|
<define name="status">
|
37
37
|
<element name="status">
|
38
|
-
<ref name="
|
38
|
+
<ref name="stage"/>
|
39
|
+
<optional>
|
40
|
+
<ref name="substage"/>
|
41
|
+
</optional>
|
42
|
+
<optional>
|
43
|
+
<ref name="iteration"/>
|
44
|
+
</optional>
|
45
|
+
</element>
|
46
|
+
</define>
|
47
|
+
<define name="stage">
|
48
|
+
<element name="stage">
|
49
|
+
<text/>
|
50
|
+
</element>
|
51
|
+
</define>
|
52
|
+
<define name="substage">
|
53
|
+
<element name="substage">
|
54
|
+
<text/>
|
55
|
+
</element>
|
56
|
+
</define>
|
57
|
+
<define name="iteration">
|
58
|
+
<element name="iteration">
|
59
|
+
<text/>
|
39
60
|
</element>
|
40
61
|
</define>
|
41
62
|
<define name="language">
|
@@ -523,9 +544,9 @@
|
|
523
544
|
<zeroOrMore>
|
524
545
|
<ref name="script"/>
|
525
546
|
</zeroOrMore>
|
526
|
-
<
|
547
|
+
<zeroOrMore>
|
527
548
|
<ref name="abstract"/>
|
528
|
-
</
|
549
|
+
</zeroOrMore>
|
529
550
|
<optional>
|
530
551
|
<ref name="status"/>
|
531
552
|
</optional>
|
@@ -10,11 +10,17 @@ module Asciidoctor
|
|
10
10
|
{ id: Utils::anchor_or_uuid(node) }
|
11
11
|
end
|
12
12
|
|
13
|
+
def id_unnum_attr(node)
|
14
|
+
attr_code( id: Utils::anchor_or_uuid(node),
|
15
|
+
unnumbered: node.option?("unnumbered") ? "true" : nil )
|
16
|
+
end
|
17
|
+
|
13
18
|
# open block is a container of multiple blocks,
|
14
19
|
# treated as a single block.
|
15
20
|
# We append each contained block to its parent
|
16
21
|
def open(node)
|
17
|
-
|
22
|
+
role = node.role || node.attr("style")
|
23
|
+
Utils::reqt_subpart(role) and
|
18
24
|
return requirement_subpart(node)
|
19
25
|
result = []
|
20
26
|
node.blocks.each do |b|
|
@@ -24,7 +30,7 @@ module Asciidoctor
|
|
24
30
|
end
|
25
31
|
|
26
32
|
def requirement_subpart(node)
|
27
|
-
name = node.attr("style")
|
33
|
+
name = node.role || node.attr("style")
|
28
34
|
noko do |xml|
|
29
35
|
xml.send name, **attr_code(exclude: node.option?("exclude"),
|
30
36
|
type: node.attr("type")) do |o|
|
@@ -46,7 +52,7 @@ module Asciidoctor
|
|
46
52
|
def stem(node)
|
47
53
|
stem_content = node.lines.join("\n")
|
48
54
|
noko do |xml|
|
49
|
-
xml.formula **
|
55
|
+
xml.formula **id_unnum_attr(node) do |s|
|
50
56
|
stem_parse(stem_content, s, node.style.to_sym)
|
51
57
|
end
|
52
58
|
end
|
@@ -144,11 +150,12 @@ module Asciidoctor
|
|
144
150
|
|
145
151
|
def example(node)
|
146
152
|
return term_example(node) if in_terms?
|
147
|
-
|
148
|
-
return requirement(node, "
|
149
|
-
return requirement(node, "
|
153
|
+
role = node.role || node.attr("style")
|
154
|
+
return requirement(node, "recommendation") if role == "recommendation"
|
155
|
+
return requirement(node, "requirement") if role == "requirement"
|
156
|
+
return requirement(node, "permission") if role == "permission"
|
150
157
|
noko do |xml|
|
151
|
-
xml.example **
|
158
|
+
xml.example **id_unnum_attr(node) do |ex|
|
152
159
|
wrap_in_para(node, ex)
|
153
160
|
end
|
154
161
|
end.join("\n")
|
@@ -176,6 +183,7 @@ module Asciidoctor
|
|
176
183
|
def reqt_attributes(node)
|
177
184
|
{
|
178
185
|
id: Utils::anchor_or_uuid,
|
186
|
+
unnumbered: node.option?("unnumbered") ? "true" : nil,
|
179
187
|
obligation: node.attr("obligation"),
|
180
188
|
filename: node.attr("filename")
|
181
189
|
}
|
@@ -233,7 +241,7 @@ module Asciidoctor
|
|
233
241
|
|
234
242
|
def image(node)
|
235
243
|
noko do |xml|
|
236
|
-
xml.figure **
|
244
|
+
xml.figure **id_unnum_attr(node) do |f|
|
237
245
|
figure_title(node, f)
|
238
246
|
f.image **attr_code(image_attributes(node))
|
239
247
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "set"
|
2
|
+
require "relaton-cli"
|
2
3
|
|
3
4
|
module Asciidoctor
|
4
5
|
module Standoc
|
@@ -122,7 +123,7 @@ module Asciidoctor
|
|
122
123
|
end
|
123
124
|
|
124
125
|
# converts generic IEV citation to citation of IEC 60050-n
|
125
|
-
# assumes IEV citations are of form
|
126
|
+
# assumes IEV citations are of form
|
126
127
|
# <eref type="inline" bibitemid="a" citeas="IEC 60050">
|
127
128
|
# <locality type="clause"><referenceFrom>101-01-01</referenceFrom></locality></eref>
|
128
129
|
def linksIev2iec60050part(xmldoc)
|
@@ -159,6 +160,84 @@ module Asciidoctor
|
|
159
160
|
parts = linksIev2iec60050part(xmldoc)
|
160
161
|
refsIev2iec60050part(xmldoc, parts, iev)
|
161
162
|
end
|
163
|
+
|
164
|
+
def ref_dl_cleanup(xmldoc)
|
165
|
+
xmldoc.xpath("//clause[@bibitem = 'true']").each do |c|
|
166
|
+
bib = dl_bib_extract(c) or next
|
167
|
+
b = Nokogiri::XML::Node.new('bibitem', xmldoc)
|
168
|
+
b["id"] = bib["ref"]&.strip
|
169
|
+
b["type"] = bib["doctype"]&.strip
|
170
|
+
b << %Q[<title format="text/plain">#{bib['title']}</title>]
|
171
|
+
#b << extract_from_p("docidentifier", bib, "docidentifier")
|
172
|
+
|
173
|
+
b << %Q[<docidentifier>#{bib['docidentifier']}</docidentifier>]
|
174
|
+
|
175
|
+
Array(bib["publisher"]).each do |name|
|
176
|
+
b << %Q[<contributor><role type="publisher"/><organization>
|
177
|
+
<name>#{name}</name>
|
178
|
+
</organization></contributor>]
|
179
|
+
#{extract_from_p("publisher", bib, "name")}
|
180
|
+
end
|
181
|
+
|
182
|
+
Array(bib["author"]).each do |name|
|
183
|
+
b << %Q[<contributor><role type="author"/><person>
|
184
|
+
<name><completename>#{name}</completename></name>
|
185
|
+
</person></contributor>]
|
186
|
+
end
|
187
|
+
c.replace(b)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def ref_dl_cleanup(xmldoc)
|
192
|
+
xmldoc.xpath("//clause[@bibitem = 'true']").each do |c|
|
193
|
+
bib = dl_bib_extract(c) or next
|
194
|
+
bibitemxml = Relaton::Bibdata.new(bib).to_xml or next
|
195
|
+
# TODO move this into relaton-cli
|
196
|
+
bibitem = Nokogiri::XML(bibitemxml)
|
197
|
+
bibitem.root.name = "bibitem"
|
198
|
+
bibitem.root["id"] = bib["ref"]&.strip
|
199
|
+
bibitem.root["type"] = bib["doctype"]&.strip
|
200
|
+
c.replace(bibitem.root)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def extract_from_p(tag, bib, key)
|
205
|
+
return unless bib[tag]
|
206
|
+
"<#{key}>#{bib[tag].at('p').children}</#{key}>"
|
207
|
+
end
|
208
|
+
|
209
|
+
# if the content is a single paragraph, replace it with its children
|
210
|
+
def p_unwrap(p)
|
211
|
+
elems = p.elements
|
212
|
+
if elems.size == 1 && elems[0].name == "p"
|
213
|
+
elems[0].children.to_xml
|
214
|
+
else
|
215
|
+
p.to_xml
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def dd_bib_extract(dtd)
|
220
|
+
elems = dtd.remove.elements
|
221
|
+
return p_unwrap(dtd) unless elems.size == 1 && elems[0].name == "ol"
|
222
|
+
ret = []
|
223
|
+
elems[0].xpath("./li").each do |li|
|
224
|
+
ret << p_unwrap(li)
|
225
|
+
end
|
226
|
+
ret
|
227
|
+
end
|
228
|
+
|
229
|
+
# definition list, with at most one level of unordered lists
|
230
|
+
def dl_bib_extract(c)
|
231
|
+
dl = c.at("./dl") or return
|
232
|
+
bib = {}
|
233
|
+
key = ""
|
234
|
+
dl.xpath("./dt | ./dd").each do |dtd|
|
235
|
+
key = dtd.text if dtd.name == "dt"
|
236
|
+
bib[key] = dd_bib_extract(dtd) if dtd.name == "dd"
|
237
|
+
end
|
238
|
+
bib["title"] = c.at("./title").remove.children
|
239
|
+
bib
|
240
|
+
end
|
162
241
|
end
|
163
242
|
end
|
164
243
|
end
|