nora_mark 0.2beta16 → 0.3
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 +5 -5
- data/.github/FUNDING.yml +3 -0
- data/.github/dependabot.yml +8 -0
- data/.github/workflows/test.yml +19 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +3 -0
- data/.travis.yml +2 -2
- data/CHANGELOG.md +5 -0
- data/Gemfile +0 -1
- data/README.md +1 -2
- data/Rakefile +1 -4
- data/lib/nora_mark/document.rb +14 -14
- data/lib/nora_mark/extensions.rb +6 -6
- data/lib/nora_mark/html/abstract_node_writer.rb +2 -1
- data/lib/nora_mark/html/context.rb +18 -16
- data/lib/nora_mark/html/default_transformer.rb +41 -38
- data/lib/nora_mark/html/frontmatter_writer.rb +2 -2
- data/lib/nora_mark/html/generator.rb +22 -22
- data/lib/nora_mark/html/pages.rb +13 -14
- data/lib/nora_mark/html/paragraph_writer.rb +24 -26
- data/lib/nora_mark/html/raw_text_block_writer.rb +13 -0
- data/lib/nora_mark/html/tag_writer.rb +14 -13
- data/lib/nora_mark/html/util.rb +5 -5
- data/lib/nora_mark/node.rb +46 -56
- data/lib/nora_mark/node_set.rb +1 -1
- data/lib/nora_mark/node_util.rb +7 -8
- data/lib/nora_mark/parser.kpeg.rb +16 -16
- data/lib/nora_mark/parser.rb +1 -3
- data/lib/nora_mark/rake_task.rb +23 -23
- data/lib/nora_mark/transformer.rb +13 -15
- data/lib/nora_mark/version.rb +1 -1
- data/lib/nora_mark.rb +0 -4
- data/lib/tilt/nora_mark.rb +1 -1
- data/nora_mark.gemspec +7 -6
- data/spec/extensions_spec.rb +1 -2
- data/spec/fixtures/test-plugins/nora_mark_tester.rb +3 -1
- data/spec/node_spec.rb +69 -49
- data/spec/nokogiri_test_helper.rb +9 -7
- data/spec/nora_mark_spec.rb +467 -491
- data/spec/spec_helper.rb +2 -6
- data/spec/tilt_spec.rb +1 -1
- data/spec/transformer_spec.rb +16 -18
- metadata +39 -29
data/spec/nora_mark_spec.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
|
2
3
|
require File.dirname(__FILE__) + '/spec_helper.rb'
|
3
4
|
require File.dirname(__FILE__) + '/../lib/nora_mark'
|
4
5
|
require 'nokogiri'
|
5
6
|
require File.dirname(__FILE__) + '/nokogiri_test_helper.rb'
|
6
7
|
|
7
|
-
describe NoraMark::Document do
|
8
|
+
describe NoraMark::Document do
|
8
9
|
describe 'parse' do
|
9
10
|
it 'generate valid xhtml' do
|
10
11
|
text = 'some text'
|
@@ -29,18 +30,17 @@ describe NoraMark::Document do
|
|
29
30
|
expect(body.element_children.size).to eq 2
|
30
31
|
expect(body.element_children[0].selector_and_children)
|
31
32
|
.to eq(
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
)
|
33
|
+
['div.pgroup',
|
34
|
+
['p', 'ここから、パラグラフがはじまります。'],
|
35
|
+
['p.noindent', '「二行目です。」'],
|
36
|
+
['p', '三行目です。']]
|
37
|
+
)
|
38
38
|
|
39
39
|
expect(body.element_children[1].selector_and_children)
|
40
40
|
.to eq(
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
['div.pgroup',
|
42
|
+
['p', 'ここから、次のパラグラフです。']]
|
43
|
+
)
|
44
44
|
end
|
45
45
|
it 'convert simple paragraph with BOM' do
|
46
46
|
text = "\uFEFFここから、パラグラフがはじまります。\n「二行目です。」\n三行目です。\n\n\n ここから、次のパラグラフです。"
|
@@ -50,18 +50,17 @@ describe NoraMark::Document do
|
|
50
50
|
expect(body.element_children.size).to eq 2
|
51
51
|
expect(body.element_children[0].selector_and_children)
|
52
52
|
.to eq(
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
)
|
53
|
+
['div.pgroup',
|
54
|
+
['p', 'ここから、パラグラフがはじまります。'],
|
55
|
+
['p.noindent', '「二行目です。」'],
|
56
|
+
['p', '三行目です。']]
|
57
|
+
)
|
59
58
|
|
60
59
|
expect(body.element_children[1].selector_and_children)
|
61
60
|
.to eq(
|
62
|
-
|
63
|
-
|
64
|
-
|
61
|
+
['div.pgroup',
|
62
|
+
['p', 'ここから、次のパラグラフです。']]
|
63
|
+
)
|
65
64
|
end
|
66
65
|
|
67
66
|
it 'convert simple paragraph in english mode' do
|
@@ -72,20 +71,18 @@ describe NoraMark::Document do
|
|
72
71
|
expect(body.element_children.size).to eq 2
|
73
72
|
expect(body.element_children[0].selector_and_children)
|
74
73
|
.to eq(
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
)
|
74
|
+
['p',
|
75
|
+
'paragraph begins.', ['br', ''],
|
76
|
+
'2nd line.', ['br', ''],
|
77
|
+
'3rd line.']
|
78
|
+
)
|
81
79
|
|
82
80
|
expect(body.element_children[1].selector_and_children)
|
83
81
|
.to eq(
|
84
|
-
|
85
|
-
|
82
|
+
['p', 'next paragraph.']
|
83
|
+
)
|
86
84
|
end
|
87
85
|
|
88
|
-
|
89
86
|
it 'convert simple paragraph in english mode specified in frontmatter' do
|
90
87
|
text = "---\nlang: en\ntitle: the title\n---\n\n\n\nparagraph begins.\n2nd line.\n 3rd line.\n\n\n next paragraph."
|
91
88
|
noramark = NoraMark::Document.parse(text)
|
@@ -94,17 +91,16 @@ describe NoraMark::Document do
|
|
94
91
|
expect(body.element_children.size).to eq 2
|
95
92
|
expect(body.element_children[0].selector_and_children)
|
96
93
|
.to eq(
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
)
|
94
|
+
['p',
|
95
|
+
'paragraph begins.', ['br', ''],
|
96
|
+
'2nd line.', ['br', ''],
|
97
|
+
'3rd line.']
|
98
|
+
)
|
103
99
|
|
104
100
|
expect(body.element_children[1].selector_and_children)
|
105
101
|
.to eq(
|
106
|
-
|
107
|
-
|
102
|
+
['p', 'next paragraph.']
|
103
|
+
)
|
108
104
|
end
|
109
105
|
|
110
106
|
it 'convert simple paragraph in japanese mode, but paragraph mode is default' do
|
@@ -115,17 +111,16 @@ describe NoraMark::Document do
|
|
115
111
|
expect(body.element_children.size).to eq 2
|
116
112
|
expect(body.element_children[0].selector_and_children)
|
117
113
|
.to eq(
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
)
|
114
|
+
['p',
|
115
|
+
'paragraph begins.', ['br', ''],
|
116
|
+
'2nd line.', ['br', ''],
|
117
|
+
'3rd line.']
|
118
|
+
)
|
124
119
|
|
125
120
|
expect(body.element_children[1].selector_and_children)
|
126
121
|
.to eq(
|
127
|
-
|
128
|
-
|
122
|
+
['p', 'next paragraph.']
|
123
|
+
)
|
129
124
|
end
|
130
125
|
|
131
126
|
it 'convert simple paragraph in japanese mode, but paragraph mode is default (using frontmatter)' do
|
@@ -136,17 +131,16 @@ describe NoraMark::Document do
|
|
136
131
|
expect(body.element_children.size).to eq 2
|
137
132
|
expect(body.element_children[0].selector_and_children)
|
138
133
|
.to eq(
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
)
|
134
|
+
['p',
|
135
|
+
'paragraph begins.', ['br', ''],
|
136
|
+
'2nd line.', ['br', ''],
|
137
|
+
'3rd line.']
|
138
|
+
)
|
145
139
|
|
146
140
|
expect(body.element_children[1].selector_and_children)
|
147
141
|
.to eq(
|
148
|
-
|
149
|
-
|
142
|
+
['p', 'next paragraph.']
|
143
|
+
)
|
150
144
|
end
|
151
145
|
end
|
152
146
|
describe 'attribute handling' do
|
@@ -156,9 +150,9 @@ describe NoraMark::Document do
|
|
156
150
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
157
151
|
expect(body.element_children[0].selector_and_children)
|
158
152
|
.to eq(
|
159
|
-
|
160
|
-
|
161
|
-
|
153
|
+
['p',
|
154
|
+
["span[data-type='foobar']", 'lorem ipsum']]
|
155
|
+
)
|
162
156
|
end
|
163
157
|
end
|
164
158
|
describe 'divs and hN headers' do
|
@@ -171,17 +165,15 @@ describe NoraMark::Document do
|
|
171
165
|
expect(body.element_children[0].a).to eq ['h1', 'タイトルです。']
|
172
166
|
expect(body.element_children[1].selector_and_children)
|
173
167
|
.to eq(
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
)
|
168
|
+
['div.pgroup',
|
169
|
+
['p', 'ここから、パラグラフがはじまります。']]
|
170
|
+
)
|
178
171
|
expect(body.element_children[2].a).to eq ['h2.column', 'ふたつめの見出しです。']
|
179
172
|
expect(body.element_children[3].selector_and_children)
|
180
173
|
.to eq(
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
)
|
174
|
+
['div.pgroup',
|
175
|
+
['p', 'ここから、次のパラグラフです。']]
|
176
|
+
)
|
185
177
|
expect(body.element_children[4].a).to eq ['h3.third.foo', 'クラスが複数ある見出しです']
|
186
178
|
end
|
187
179
|
|
@@ -192,15 +184,12 @@ describe NoraMark::Document do
|
|
192
184
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
193
185
|
expect(body.element_children[0].selector_and_children)
|
194
186
|
.to eq(
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
]
|
200
|
-
)
|
187
|
+
['div',
|
188
|
+
['div.pgroup',
|
189
|
+
['p', '1st line.']]]
|
190
|
+
)
|
201
191
|
end
|
202
192
|
|
203
|
-
|
204
193
|
it 'parse div without pgroup' do
|
205
194
|
text = "d('wo-pgroup') {\n1st line. \n}"
|
206
195
|
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
@@ -208,10 +197,9 @@ describe NoraMark::Document do
|
|
208
197
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
209
198
|
expect(body.element_children[0].selector_and_children)
|
210
199
|
.to eq(
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
)
|
200
|
+
['div',
|
201
|
+
['p', '1st line.']]
|
202
|
+
)
|
215
203
|
end
|
216
204
|
|
217
205
|
it 'parse nested div without pgroup' do
|
@@ -221,12 +209,10 @@ describe NoraMark::Document do
|
|
221
209
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
222
210
|
expect(body.element_children[0].selector_and_children)
|
223
211
|
.to eq(
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
]
|
229
|
-
)
|
212
|
+
['div',
|
213
|
+
['div',
|
214
|
+
['p', 'nested.']]]
|
215
|
+
)
|
230
216
|
end
|
231
217
|
|
232
218
|
it 'handle divs with empty lines' do
|
@@ -236,17 +222,15 @@ describe NoraMark::Document do
|
|
236
222
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
237
223
|
expect(body.element_children[0].selector_and_children)
|
238
224
|
.to eq(
|
239
|
-
|
240
|
-
|
241
|
-
|
225
|
+
['div',
|
226
|
+
['p', '1st line.']]
|
227
|
+
)
|
242
228
|
expect(body.element_children[1].selector_and_children)
|
243
229
|
.to eq(
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
)
|
230
|
+
['div',
|
231
|
+
['div.pgroup',
|
232
|
+
['p', '2nd div.']]]
|
233
|
+
)
|
250
234
|
end
|
251
235
|
|
252
236
|
it 'parse nested div without pgroup and with pgroup' do
|
@@ -256,18 +240,16 @@ describe NoraMark::Document do
|
|
256
240
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
257
241
|
expect(body.element_children[0].selector_and_children)
|
258
242
|
.to eq(
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
])
|
243
|
+
['div',
|
244
|
+
['div',
|
245
|
+
['p', 'nested.']]]
|
246
|
+
)
|
264
247
|
expect(body.element_children[1].selector_and_children)
|
265
248
|
.to eq(
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
])
|
249
|
+
['div',
|
250
|
+
['div.pgroup',
|
251
|
+
['p', 'in pgroup']]]
|
252
|
+
)
|
271
253
|
end
|
272
254
|
|
273
255
|
it 'parse div with class' do
|
@@ -277,10 +259,9 @@ describe NoraMark::Document do
|
|
277
259
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
278
260
|
expect(body.element_children[0].selector_and_children)
|
279
261
|
.to eq(
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
)
|
262
|
+
['div.preface-one',
|
263
|
+
['h1', 'title.']]
|
264
|
+
)
|
284
265
|
end
|
285
266
|
|
286
267
|
it 'parse div with id and class' do
|
@@ -290,10 +271,9 @@ describe NoraMark::Document do
|
|
290
271
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
291
272
|
expect(body.element_children[0].selector_and_children(remove_id: false))
|
292
273
|
.to eq(
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
)
|
274
|
+
['div#thecontents.preface-one',
|
275
|
+
['h1#heading_index_1', 'title.']]
|
276
|
+
)
|
297
277
|
end
|
298
278
|
|
299
279
|
it 'parse nested div' do
|
@@ -303,20 +283,15 @@ describe NoraMark::Document do
|
|
303
283
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
304
284
|
expect(body.element_children[0].selector_and_children)
|
305
285
|
.to eq(
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
['div.pgroup',
|
316
|
-
['p', 'outer div again.']
|
317
|
-
],
|
318
|
-
]
|
319
|
-
)
|
286
|
+
['div.preface',
|
287
|
+
['div.pgroup',
|
288
|
+
['p', 'outer div.']],
|
289
|
+
['div.nested',
|
290
|
+
['div.pgroup',
|
291
|
+
['p', 'nested!']]],
|
292
|
+
['div.pgroup',
|
293
|
+
['p', 'outer div again.']],]
|
294
|
+
)
|
320
295
|
end
|
321
296
|
end
|
322
297
|
describe 'article and section' do
|
@@ -327,12 +302,10 @@ describe NoraMark::Document do
|
|
327
302
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
328
303
|
expect(body.element_children[0].selector_and_children)
|
329
304
|
.to eq(
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
]
|
335
|
-
)
|
305
|
+
['article',
|
306
|
+
['div.pgroup',
|
307
|
+
['p', 'in the article.']]]
|
308
|
+
)
|
336
309
|
end
|
337
310
|
|
338
311
|
it 'parse article with other notation' do
|
@@ -342,12 +315,10 @@ describe NoraMark::Document do
|
|
342
315
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
343
316
|
expect(body.element_children[0].selector_and_children)
|
344
317
|
.to eq(
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
]
|
350
|
-
)
|
318
|
+
['article',
|
319
|
+
['div.pgroup',
|
320
|
+
['p', 'in the article.']]]
|
321
|
+
)
|
351
322
|
end
|
352
323
|
|
353
324
|
it 'parse article with yet anther notation' do
|
@@ -357,12 +328,10 @@ describe NoraMark::Document do
|
|
357
328
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
358
329
|
expect(body.element_children[0].selector_and_children)
|
359
330
|
.to eq(
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
]
|
365
|
-
)
|
331
|
+
['article',
|
332
|
+
['div.pgroup',
|
333
|
+
['p', 'in the article.']]]
|
334
|
+
)
|
366
335
|
end
|
367
336
|
|
368
337
|
it 'parse section ' do
|
@@ -372,14 +341,11 @@ describe NoraMark::Document do
|
|
372
341
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
373
342
|
expect(body.element_children[0].selector_and_children)
|
374
343
|
.to eq(
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
]
|
381
|
-
]
|
382
|
-
)
|
344
|
+
['article',
|
345
|
+
['section',
|
346
|
+
['div.pgroup',
|
347
|
+
['p', 'section in the article.']]]]
|
348
|
+
)
|
383
349
|
end
|
384
350
|
|
385
351
|
it 'parse section with other notation' do
|
@@ -389,14 +355,11 @@ describe NoraMark::Document do
|
|
389
355
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
390
356
|
expect(body.element_children[0].selector_and_children)
|
391
357
|
.to eq(
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
]
|
398
|
-
]
|
399
|
-
)
|
358
|
+
['article',
|
359
|
+
['section',
|
360
|
+
['div.pgroup',
|
361
|
+
['p', 'section in the article.']]]]
|
362
|
+
)
|
400
363
|
end
|
401
364
|
|
402
365
|
it 'parse section with yet other notation' do
|
@@ -406,14 +369,11 @@ describe NoraMark::Document do
|
|
406
369
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
407
370
|
expect(body.element_children[0].selector_and_children)
|
408
371
|
.to eq(
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
]
|
415
|
-
]
|
416
|
-
)
|
372
|
+
['article',
|
373
|
+
['section',
|
374
|
+
['div.pgroup',
|
375
|
+
['p', 'section in the article.']]]]
|
376
|
+
)
|
417
377
|
end
|
418
378
|
end
|
419
379
|
describe 'other block command' do
|
@@ -424,17 +384,15 @@ describe NoraMark::Document do
|
|
424
384
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
425
385
|
expect(body.element_children[0].selector_and_children)
|
426
386
|
.to eq(
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
)
|
387
|
+
['div.pgroup',
|
388
|
+
['p', 'this is normal line.']]
|
389
|
+
)
|
431
390
|
expect(body.element_children[1].selector_and_children)
|
432
391
|
.to eq(
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
)
|
392
|
+
['figure.img-wrap',
|
393
|
+
["img[src='./image1.jpg'][alt='alt text']", ''],
|
394
|
+
['figcaption', 'caption text']]
|
395
|
+
)
|
438
396
|
end
|
439
397
|
|
440
398
|
it 'handle block image with before caption' do
|
@@ -444,17 +402,15 @@ describe NoraMark::Document do
|
|
444
402
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
445
403
|
expect(body.element_children[0].selector_and_children)
|
446
404
|
.to eq(
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
)
|
405
|
+
['div.pgroup',
|
406
|
+
['p', 'this is normal line.']]
|
407
|
+
)
|
451
408
|
expect(body.element_children[1].selector_and_children)
|
452
409
|
.to eq(
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
)
|
410
|
+
['figure.img-wrap',
|
411
|
+
['figcaption', 'caption text'],
|
412
|
+
["img[src='./image1.jpg'][alt='alt text']", '']]
|
413
|
+
)
|
458
414
|
end
|
459
415
|
|
460
416
|
it 'handle block image without caption' do
|
@@ -464,16 +420,14 @@ describe NoraMark::Document do
|
|
464
420
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
465
421
|
expect(body.element_children[0].selector_and_children)
|
466
422
|
.to eq(
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
)
|
423
|
+
['div.pgroup',
|
424
|
+
['p', 'this is normal line.']]
|
425
|
+
)
|
471
426
|
expect(body.element_children[1].selector_and_children)
|
472
427
|
.to eq(
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
)
|
428
|
+
['figure.img-wrap',
|
429
|
+
["img[src='./image1.jpg'][alt='alt text']", '']]
|
430
|
+
)
|
477
431
|
end
|
478
432
|
|
479
433
|
it 'handle page change article' do
|
@@ -485,30 +439,27 @@ describe NoraMark::Document do
|
|
485
439
|
body1 = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
486
440
|
expect(body1.element_children[0].selector_and_children)
|
487
441
|
.to eq(
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
)
|
442
|
+
['div.pgroup',
|
443
|
+
['p', 'this is start.']]
|
444
|
+
)
|
492
445
|
|
493
446
|
head2 = Nokogiri::XML::Document.parse(converted[1]).root.at_xpath('xmlns:head')
|
494
447
|
expect(head2.element_children[0].a).to eq ['title', 'page changed']
|
495
448
|
body2 = Nokogiri::XML::Document.parse(converted[1]).root.at_xpath('xmlns:body')
|
496
449
|
expect(body2.element_children[0].selector_and_children)
|
497
450
|
.to eq(
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
)
|
451
|
+
['div.pgroup',
|
452
|
+
['p', 'this is second page.']]
|
453
|
+
)
|
502
454
|
|
503
455
|
head3 = Nokogiri::XML::Document.parse(converted[2]).root.at_xpath('xmlns:head')
|
504
|
-
expect(head3.element_children[0].a).to eq ['title', 'the title']
|
456
|
+
expect(head3.element_children[0].a).to eq ['title', 'the title']
|
505
457
|
body3 = Nokogiri::XML::Document.parse(converted[2]).root.at_xpath('xmlns:body')
|
506
458
|
expect(body3.element_children[0].selector_and_children)
|
507
459
|
.to eq(
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
)
|
460
|
+
['div.pgroup',
|
461
|
+
['p', 'and the third.']]
|
462
|
+
)
|
512
463
|
end
|
513
464
|
|
514
465
|
it 'handle stylesheets' do
|
@@ -528,11 +479,10 @@ describe NoraMark::Document do
|
|
528
479
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
529
480
|
expect(body.element_children[0].selector_and_children)
|
530
481
|
.to eq(
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
)
|
482
|
+
['div.pgroup',
|
483
|
+
['p', 'this is normal line.'],
|
484
|
+
['p.custom', 'this text is in custom class.']]
|
485
|
+
)
|
536
486
|
end
|
537
487
|
|
538
488
|
it 'handle any block' do
|
@@ -542,18 +492,15 @@ describe NoraMark::Document do
|
|
542
492
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
543
493
|
expect(body.element_children[0].selector_and_children)
|
544
494
|
.to eq(
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
)
|
495
|
+
['div.pgroup',
|
496
|
+
['p', 'this is normal line.']]
|
497
|
+
)
|
549
498
|
expect(body.element_children[1].selector_and_children)
|
550
499
|
.to eq(
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
]
|
556
|
-
)
|
500
|
+
['cite',
|
501
|
+
['div.pgroup',
|
502
|
+
['p', 'this block should be in cite.']]]
|
503
|
+
)
|
557
504
|
end
|
558
505
|
it 'convert h1 in article after title' do
|
559
506
|
text = "---\nstylesheets: css/default.css\ntitle: foo\n---\narticle.atogaki {\n\nh1: あとがき。\n\natogaki\n}"
|
@@ -562,13 +509,12 @@ describe NoraMark::Document do
|
|
562
509
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
563
510
|
expect(body.element_children[0].selector_and_children)
|
564
511
|
.to eq(
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
512
|
+
["article.atogaki",
|
513
|
+
["h1", "あとがき。"],
|
514
|
+
["div.pgroup",
|
515
|
+
["p", "atogaki"]]]
|
516
|
+
)
|
570
517
|
end
|
571
|
-
|
572
518
|
end
|
573
519
|
describe 'inline' do
|
574
520
|
it 'handle link' do
|
@@ -578,15 +524,13 @@ describe NoraMark::Document do
|
|
578
524
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
579
525
|
expect(body.element_children[0].selector_and_children)
|
580
526
|
.to eq(
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
]
|
589
|
-
)
|
527
|
+
['div.pgroup',
|
528
|
+
['p',
|
529
|
+
'link to ',
|
530
|
+
["a[href='http://github.com/skoji/noramark']", 'noramark repository'],
|
531
|
+
'.'],
|
532
|
+
['p', 'can you see this?']]
|
533
|
+
)
|
590
534
|
end
|
591
535
|
|
592
536
|
it 'handle link with l' do
|
@@ -596,15 +540,13 @@ describe NoraMark::Document do
|
|
596
540
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
597
541
|
expect(body.element_children[0].selector_and_children)
|
598
542
|
.to eq(
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
]
|
607
|
-
)
|
543
|
+
['div.pgroup',
|
544
|
+
['p',
|
545
|
+
'link to ',
|
546
|
+
["a[href='http://github.com/skoji/noramark']", 'noramark repository'],
|
547
|
+
'.'],
|
548
|
+
['p', 'can you see this?']]
|
549
|
+
)
|
608
550
|
end
|
609
551
|
|
610
552
|
it 'handle span' do
|
@@ -614,10 +556,9 @@ describe NoraMark::Document do
|
|
614
556
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
615
557
|
expect(body.element_children[0].selector_and_children)
|
616
558
|
.to eq(
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
)
|
559
|
+
['div.pgroup',
|
560
|
+
['p.custom', 'this text is in ', ['span.keyword', 'custom'], ' class.']]
|
561
|
+
)
|
621
562
|
end
|
622
563
|
|
623
564
|
it 'handle inline image' do
|
@@ -627,10 +568,10 @@ describe NoraMark::Document do
|
|
627
568
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
628
569
|
expect(body.element_children[0].selector_and_children)
|
629
570
|
.to eq(
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
571
|
+
['div.pgroup',
|
572
|
+
['p',
|
573
|
+
'simple image ', ["img[src='./image1.jpg'][alt='alt']", ''], '.']]
|
574
|
+
)
|
634
575
|
end
|
635
576
|
|
636
577
|
it 'handle any inline' do
|
@@ -640,9 +581,9 @@ describe NoraMark::Document do
|
|
640
581
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
641
582
|
expect(body.element_children[0].selector_and_children)
|
642
583
|
.to eq(
|
643
|
-
|
644
|
-
|
645
|
-
|
584
|
+
['div.pgroup',
|
585
|
+
['p', 'should be ', ['strong', 'marked as strong'], '.']]
|
586
|
+
)
|
646
587
|
end
|
647
588
|
|
648
589
|
it 'convert inline command within line block' do
|
@@ -658,10 +599,10 @@ describe NoraMark::Document do
|
|
658
599
|
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
659
600
|
converted = noramark.html
|
660
601
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
661
|
-
expect(body.element_children[0].selector_and_children).to eq ['div.pgroup', ['p',
|
662
|
-
['ruby', '蜻蛉', ['rp','('],['rt','とんぼ'],['rp', ')']],
|
663
|
-
'の',
|
664
|
-
['ruby', '眼鏡', ['rp','('],['rt','めがね'],['rp', ')']],
|
602
|
+
expect(body.element_children[0].selector_and_children).to eq ['div.pgroup', ['p',
|
603
|
+
['ruby', '蜻蛉', ['rp', '('], ['rt', 'とんぼ'], ['rp', ')']],
|
604
|
+
'の',
|
605
|
+
['ruby', '眼鏡', ['rp', '('], ['rt', 'めがね'], ['rp', ')']],
|
665
606
|
'はみずいろめがね']]
|
666
607
|
end
|
667
608
|
|
@@ -672,54 +613,54 @@ describe NoraMark::Document do
|
|
672
613
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
673
614
|
expect(body.element_children[0].selector_and_children)
|
674
615
|
.to eq(
|
675
|
-
|
676
|
-
|
677
|
-
|
616
|
+
['div.pgroup',
|
617
|
+
['p', ['span.tcy', '10'], '年前のことだった']]
|
618
|
+
)
|
678
619
|
end
|
679
620
|
|
680
621
|
it 'handle code inline' do
|
681
622
|
text = "`this is inside code and [s{will not parsed}]`. you see?"
|
682
623
|
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
683
|
-
converted = noramark.html
|
624
|
+
converted = noramark.html
|
684
625
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
685
626
|
expect(body.element_children[0].selector_and_children)
|
686
627
|
.to eq(
|
687
|
-
|
688
|
-
|
689
|
-
|
628
|
+
['div.pgroup',
|
629
|
+
['p', ['code', 'this is inside code and [s{will not parsed}]'], '. you see?']]
|
630
|
+
)
|
690
631
|
end
|
691
632
|
it 'handle code escaped inline' do
|
692
633
|
text = "\\`this is not inside code and [strong{will be parsed}]\\`. you see?"
|
693
634
|
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
694
|
-
converted = noramark.html
|
635
|
+
converted = noramark.html
|
695
636
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
696
637
|
expect(body.element_children[0].selector_and_children)
|
697
638
|
.to eq(
|
698
|
-
|
699
|
-
|
700
|
-
|
639
|
+
['div.pgroup',
|
640
|
+
['p', '`this is not inside code and ', ['strong', 'will be parsed'], '`. you see?']]
|
641
|
+
)
|
701
642
|
end
|
702
643
|
it 'handle code inline (long format)' do
|
703
644
|
text = "[code.the-class{this is inside code and `backquote will not be parsed`}]. you see?"
|
704
645
|
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
705
|
-
converted = noramark.html
|
646
|
+
converted = noramark.html
|
706
647
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
707
648
|
expect(body.element_children[0].selector_and_children)
|
708
649
|
.to eq(
|
709
|
-
|
710
|
-
|
711
|
-
|
650
|
+
['div.pgroup',
|
651
|
+
['p', ['code.the-class', 'this is inside code and `backquote will not be parsed`'], '. you see?']]
|
652
|
+
)
|
712
653
|
end
|
713
654
|
it 'handle non-escaped inline' do
|
714
655
|
text = "the text following will not be escaped: [noescape{©}]"
|
715
656
|
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
716
|
-
converted = noramark.html
|
657
|
+
converted = noramark.html
|
717
658
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
718
659
|
expect(body.element_children[0].selector_and_children)
|
719
660
|
.to eq(
|
720
|
-
|
721
|
-
|
722
|
-
|
661
|
+
['div.pgroup',
|
662
|
+
['p', 'the text following will not be escaped: ©']]
|
663
|
+
)
|
723
664
|
end
|
724
665
|
end
|
725
666
|
describe 'list' do
|
@@ -731,21 +672,21 @@ describe NoraMark::Document do
|
|
731
672
|
expect(body.element_children.size).to eq 3
|
732
673
|
expect(body.element_children[0].selector_and_children)
|
733
674
|
.to eq(
|
734
|
-
|
735
|
-
|
736
|
-
|
675
|
+
['div.pgroup',
|
676
|
+
['p', 'this is normal line.']]
|
677
|
+
)
|
737
678
|
expect(body.element_children[1].selector_and_children)
|
738
679
|
.to eq(
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
680
|
+
['ol',
|
681
|
+
['li', 'for the 1st.'],
|
682
|
+
['li', 'secondly, blah.'],
|
683
|
+
['li', 'and last...']]
|
684
|
+
)
|
744
685
|
expect(body.element_children[2].selector_and_children)
|
745
686
|
.to eq(
|
746
|
-
|
747
|
-
|
748
|
-
|
687
|
+
['div.pgroup',
|
688
|
+
['p', 'the ordered list ends.']]
|
689
|
+
)
|
749
690
|
end
|
750
691
|
|
751
692
|
it 'handle unordered list ' do
|
@@ -756,21 +697,21 @@ describe NoraMark::Document do
|
|
756
697
|
expect(body.element_children.size).to eq 3
|
757
698
|
expect(body.element_children[0].selector_and_children)
|
758
699
|
.to eq(
|
759
|
-
|
760
|
-
|
761
|
-
|
700
|
+
['div.pgroup',
|
701
|
+
['p', 'this is normal line.']]
|
702
|
+
)
|
762
703
|
expect(body.element_children[1].selector_and_children)
|
763
704
|
.to eq(
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
705
|
+
['ul',
|
706
|
+
['li', 'for the 1st.'],
|
707
|
+
['li', 'secondly, blah.'],
|
708
|
+
['li', 'and last...']]
|
709
|
+
)
|
769
710
|
expect(body.element_children[2].selector_and_children)
|
770
711
|
.to eq(
|
771
|
-
|
772
|
-
|
773
|
-
|
712
|
+
['div.pgroup',
|
713
|
+
['p', 'the ordered list ends.']]
|
714
|
+
)
|
774
715
|
end
|
775
716
|
|
776
717
|
it 'handle nested unordered list ' do
|
@@ -781,22 +722,22 @@ describe NoraMark::Document do
|
|
781
722
|
expect(body.element_children.size).to eq 3
|
782
723
|
expect(body.element_children[0].selector_and_children)
|
783
724
|
.to eq(
|
784
|
-
|
785
|
-
|
786
|
-
|
725
|
+
['div.pgroup',
|
726
|
+
['p', 'this is normal line.']]
|
727
|
+
)
|
787
728
|
expect(body.element_children[1].selector_and_children)
|
788
729
|
.to eq(
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
730
|
+
['ul',
|
731
|
+
['li', 'for the 1st.',
|
732
|
+
['ul',
|
733
|
+
['li', 'nested.']]],
|
734
|
+
['li', 'and last...']]
|
735
|
+
)
|
795
736
|
expect(body.element_children[2].selector_and_children)
|
796
737
|
.to eq(
|
797
|
-
|
798
|
-
|
799
|
-
|
738
|
+
['div.pgroup',
|
739
|
+
['p', 'the ordered list ends.']]
|
740
|
+
)
|
800
741
|
end
|
801
742
|
|
802
743
|
it 'handle definition list ' do
|
@@ -807,21 +748,21 @@ describe NoraMark::Document do
|
|
807
748
|
expect(body.element_children.size).to eq 3
|
808
749
|
expect(body.element_children[0].selector_and_children)
|
809
750
|
.to eq(
|
810
|
-
|
811
|
-
|
812
|
-
|
751
|
+
['div.pgroup',
|
752
|
+
['p', 'this is normal line.']]
|
753
|
+
)
|
813
754
|
expect(body.element_children[1].selector_and_children)
|
814
755
|
.to eq(
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
756
|
+
['dl',
|
757
|
+
['dt', '1st'], ['dd', 'this is the first definition'],
|
758
|
+
['dt', '2nd'], ['dd', 'blah :blah.'],
|
759
|
+
['dt', '3rd'], ['dd', 'this term is the last.'],]
|
760
|
+
)
|
820
761
|
expect(body.element_children[2].selector_and_children)
|
821
762
|
.to eq(
|
822
|
-
|
823
|
-
|
824
|
-
|
763
|
+
['div.pgroup',
|
764
|
+
['p', 'the list ends.']]
|
765
|
+
)
|
825
766
|
end
|
826
767
|
|
827
768
|
it 'handle long definition list ' do
|
@@ -832,21 +773,21 @@ describe NoraMark::Document do
|
|
832
773
|
expect(body.element_children.size).to eq 3
|
833
774
|
expect(body.element_children[0].selector_and_children)
|
834
775
|
.to eq(
|
835
|
-
|
836
|
-
|
837
|
-
|
776
|
+
['div.pgroup',
|
777
|
+
['p', 'this is normal line.']]
|
778
|
+
)
|
838
779
|
expect(body.element_children[1].selector_and_children)
|
839
780
|
.to eq(
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
781
|
+
['dl',
|
782
|
+
['dt', '1st'], ['dd', ['div.pgroup', ['p', 'this is the first definition']]],
|
783
|
+
['dt', '2nd'], ['dd', ['div.pgroup', ['p', 'blah :blah.']]],
|
784
|
+
['dt', '3rd'], ['dd', ['div.pgroup', ['p', 'this term is the last.']]]]
|
785
|
+
)
|
845
786
|
expect(body.element_children[2].selector_and_children)
|
846
787
|
.to eq(
|
847
|
-
|
848
|
-
|
849
|
-
|
788
|
+
['div.pgroup',
|
789
|
+
['p', 'the list ends.']]
|
790
|
+
)
|
850
791
|
end
|
851
792
|
it 'escape html in definition list' do
|
852
793
|
text = ";:definition<div>:</div>"
|
@@ -855,12 +796,12 @@ describe NoraMark::Document do
|
|
855
796
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
856
797
|
expect(body.element_children[0].selector_and_children)
|
857
798
|
.to eq(
|
858
|
-
|
859
|
-
|
860
|
-
|
799
|
+
['dl',
|
800
|
+
['dt', 'definition<div>'], ['dd', '</div>']]
|
801
|
+
)
|
861
802
|
end
|
862
803
|
end
|
863
|
-
|
804
|
+
|
864
805
|
describe 'metadata' do
|
865
806
|
it 'specify stylesheets' do
|
866
807
|
text = <<EOF
|
@@ -881,9 +822,10 @@ EOF
|
|
881
822
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
882
823
|
expect(body.element_children[0].selector_and_children)
|
883
824
|
.to eq(
|
884
|
-
|
885
|
-
|
886
|
-
|
825
|
+
['div.pgroup',
|
826
|
+
['p',
|
827
|
+
'text.']]
|
828
|
+
)
|
887
829
|
end
|
888
830
|
|
889
831
|
it 'specify title' do
|
@@ -895,10 +837,10 @@ EOF
|
|
895
837
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
896
838
|
expect(body.element_children[0].selector_and_children)
|
897
839
|
.to eq(
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
840
|
+
['div.pgroup',
|
841
|
+
['p',
|
842
|
+
'text.']]
|
843
|
+
)
|
902
844
|
end
|
903
845
|
|
904
846
|
it 'specify title on each page' do
|
@@ -912,16 +854,18 @@ EOF
|
|
912
854
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
913
855
|
expect(body.element_children[0].selector_and_children)
|
914
856
|
.to eq(
|
915
|
-
|
916
|
-
|
917
|
-
|
857
|
+
['div.pgroup',
|
858
|
+
['p',
|
859
|
+
'1st page.']]
|
860
|
+
)
|
918
861
|
# 2nd page
|
919
862
|
head = Nokogiri::XML::Document.parse(converted[1]).root.at_xpath('xmlns:head')
|
920
863
|
expect(head.element_children[0].a).to eq ['title', 'page2']
|
921
864
|
body = Nokogiri::XML::Document.parse(converted[1]).root.at_xpath('xmlns:body')
|
922
865
|
expect(body.element_children[0].selector_and_children)
|
923
866
|
.to eq(
|
924
|
-
|
867
|
+
['h1', "2nd page"]
|
868
|
+
)
|
925
869
|
end
|
926
870
|
|
927
871
|
it 'specify stylesheet on each page' do
|
@@ -956,7 +900,7 @@ EOF
|
|
956
900
|
expect(head.element_children[1].a).to eq ["link[rel='stylesheet'][type='text/css'][href='default.css']", '']
|
957
901
|
end
|
958
902
|
|
959
|
-
|
903
|
+
it 'specify stylesheet on each page, with default supplied' do
|
960
904
|
text = <<EOF
|
961
905
|
---
|
962
906
|
title: document title 1st
|
@@ -987,7 +931,6 @@ EOF
|
|
987
931
|
expect(head.element_children[1].a).to eq ["link[rel='stylesheet'][type='text/css'][href='default.css']", '']
|
988
932
|
end
|
989
933
|
|
990
|
-
|
991
934
|
it 'ignore comments' do
|
992
935
|
text = "// この行はコメントです\nここから、パラグラフがはじまります。\n // これもコメント\n「二行目です。」\n三行目です。\n\n// これもコメント\n\n ここから、次のパラグラフです。\n// 最後のコメントです"
|
993
936
|
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
@@ -997,26 +940,23 @@ EOF
|
|
997
940
|
|
998
941
|
expect(body.element_children[0].selector_and_children)
|
999
942
|
.to eq(
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
1003
|
-
|
1004
|
-
|
1005
|
-
)
|
943
|
+
['div.pgroup',
|
944
|
+
['p', 'ここから、パラグラフがはじまります。'],
|
945
|
+
['p.noindent', '「二行目です。」'],
|
946
|
+
['p', '三行目です。']]
|
947
|
+
)
|
1006
948
|
|
1007
949
|
expect(body.element_children[1].selector_and_children)
|
1008
950
|
.to eq(
|
1009
|
-
|
1010
|
-
|
1011
|
-
|
951
|
+
['div.pgroup',
|
952
|
+
['p', 'ここから、次のパラグラフです。']]
|
953
|
+
)
|
1012
954
|
end
|
1013
955
|
|
1014
956
|
it 'handle preprocessor' do
|
1015
957
|
text = "pre-preprocess text"
|
1016
|
-
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title') do
|
1017
|
-
|
1018
|
-
nora.preprocessor do
|
1019
|
-
|t|
|
958
|
+
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title') do |nora|
|
959
|
+
nora.preprocessor do |t|
|
1020
960
|
t.gsub('pre-preprocess', 'post-process')
|
1021
961
|
end
|
1022
962
|
end
|
@@ -1024,10 +964,9 @@ EOF
|
|
1024
964
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
1025
965
|
expect(body.element_children[0].selector_and_children)
|
1026
966
|
.to eq(
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
1030
|
-
)
|
967
|
+
['div.pgroup',
|
968
|
+
['p', 'post-process text'],]
|
969
|
+
)
|
1031
970
|
end
|
1032
971
|
end
|
1033
972
|
|
@@ -1097,7 +1036,7 @@ EOF
|
|
1097
1036
|
.to eq(["div.pgroup", ["p", "normal line again."]])
|
1098
1037
|
end
|
1099
1038
|
|
1100
|
-
it 'convert preformatted code with language fence format' do
|
1039
|
+
it 'convert preformatted code with language fence format' do
|
1101
1040
|
text = <<EOF
|
1102
1041
|
normal line.
|
1103
1042
|
```ruby
|
@@ -1172,15 +1111,13 @@ EOF
|
|
1172
1111
|
.to eq(["div.pgroup", ["p", "normal line."]])
|
1173
1112
|
expect(body.element_children[1].selector_and_children)
|
1174
1113
|
.to eq(
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1114
|
+
["div.pre",
|
1115
|
+
["p.caption", "caption ", ["span.the-text", "text"]],
|
1116
|
+
["pre", "d {\n this will not converted to div or p or pgroup.\nline_command: this will be not converted too.\n}"]]
|
1117
|
+
)
|
1181
1118
|
end
|
1182
1119
|
|
1183
|
-
it 'convert preformatted code with language fence format with caption' do
|
1120
|
+
it 'convert preformatted code with language fence format with caption' do
|
1184
1121
|
text = <<EOF
|
1185
1122
|
normal line.
|
1186
1123
|
```ruby(the caption text)
|
@@ -1196,14 +1133,38 @@ EOF
|
|
1196
1133
|
.to eq(["div.pgroup", ["p", "normal line."]])
|
1197
1134
|
expect(body.element_children[1].selector_and_children)
|
1198
1135
|
.to eq(
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1136
|
+
["div.pre",
|
1137
|
+
["p.caption", "the caption text"],
|
1138
|
+
["pre.code-ruby[data-code-language='ruby']",
|
1139
|
+
["code", "# ruby code example.\n\"Hello, World\".split(',').map(&:strip).map(&:to_sym) # => [:Hello, :World]"]]]
|
1140
|
+
)
|
1141
|
+
expect(body.element_children[2].selector_and_children)
|
1142
|
+
.to eq(["div.pgroup", ["p", "normal line again."]])
|
1143
|
+
end
|
1144
|
+
it 'convert noescape block' do
|
1145
|
+
text = <<EOF
|
1146
|
+
normal line.
|
1147
|
+
noescape {
|
1148
|
+
<table>
|
1149
|
+
<tr><td>you can write anything here.</td></tr>
|
1150
|
+
</table>
|
1151
|
+
}
|
1152
|
+
normal line again.
|
1153
|
+
EOF
|
1154
|
+
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
1155
|
+
converted = noramark.html
|
1156
|
+
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
1157
|
+
expect(body.element_children[0].selector_and_children)
|
1158
|
+
.to eq(["div.pgroup", ["p", "normal line."]])
|
1159
|
+
expect(body.element_children[1].selector_and_children)
|
1160
|
+
.to eq(
|
1161
|
+
["table",
|
1162
|
+
["tr",
|
1163
|
+
["td", 'you can write anything here.']]]
|
1164
|
+
)
|
1203
1165
|
expect(body.element_children[2].selector_and_children)
|
1204
1166
|
.to eq(["div.pgroup", ["p", "normal line again."]])
|
1205
1167
|
end
|
1206
|
-
|
1207
1168
|
end
|
1208
1169
|
|
1209
1170
|
describe 'markdown style' do
|
@@ -1215,12 +1176,27 @@ EOF
|
|
1215
1176
|
expect(body.element_children.size).to eq 1
|
1216
1177
|
expect(body.element_children[0].selector_and_children)
|
1217
1178
|
.to eq(
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1179
|
+
['section',
|
1180
|
+
['h1', 'タイトル です。'],
|
1181
|
+
['div.pgroup',
|
1182
|
+
['p', 'これは、セクションの中です。']]]
|
1183
|
+
)
|
1223
1184
|
end
|
1185
|
+
|
1186
|
+
it 'should convert markdown style heading : without header' do
|
1187
|
+
text = "#[without_header: true]: タイトル です。\r\n\r\nこれは、セクションの中です。"
|
1188
|
+
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
1189
|
+
converted = noramark.html
|
1190
|
+
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
1191
|
+
expect(body.element_children.size).to eq 1
|
1192
|
+
expect(body.element_children[0].selector_and_children)
|
1193
|
+
.to eq(
|
1194
|
+
['section',
|
1195
|
+
['div.pgroup',
|
1196
|
+
['p', 'これは、セクションの中です。']]]
|
1197
|
+
)
|
1198
|
+
end
|
1199
|
+
|
1224
1200
|
it 'should convert markdown style heading with empty body' do
|
1225
1201
|
text = "# タイトルです。\n* 中身です。\n\n## 次のタイトルです。これから書きます。\n\n## ここもこれから。"
|
1226
1202
|
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
@@ -1228,13 +1204,14 @@ EOF
|
|
1228
1204
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
1229
1205
|
expect(body.element_children[0].selector_and_children)
|
1230
1206
|
.to eq(
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
1237
|
-
|
1207
|
+
['section',
|
1208
|
+
['h1', 'タイトルです。'],
|
1209
|
+
['ul', ['li', '中身です。']],
|
1210
|
+
['section',
|
1211
|
+
['h2', '次のタイトルです。これから書きます。']],
|
1212
|
+
['section',
|
1213
|
+
['h2', 'ここもこれから。']]]
|
1214
|
+
)
|
1238
1215
|
end
|
1239
1216
|
it 'should markdown style heading interrupted by other headed section' do
|
1240
1217
|
text = "# タイトルです。\r\nこれは、セクションの中です。\n # また次のセクションです。\n次のセクションの中です。"
|
@@ -1244,17 +1221,18 @@ EOF
|
|
1244
1221
|
expect(body.element_children.size).to eq 2
|
1245
1222
|
expect(body.element_children[0].selector_and_children)
|
1246
1223
|
.to eq(
|
1247
|
-
|
1248
|
-
|
1249
|
-
|
1250
|
-
|
1224
|
+
['section',
|
1225
|
+
['h1', 'タイトルです。'],
|
1226
|
+
['div.pgroup',
|
1227
|
+
['p', 'これは、セクションの中です。']]]
|
1228
|
+
)
|
1251
1229
|
expect(body.element_children[1].selector_and_children)
|
1252
1230
|
.to eq(
|
1253
|
-
|
1254
|
-
|
1255
|
-
|
1256
|
-
|
1257
|
-
|
1231
|
+
['section',
|
1232
|
+
['h1', 'また次のセクションです。'],
|
1233
|
+
['div.pgroup',
|
1234
|
+
['p', '次のセクションの中です。']]]
|
1235
|
+
)
|
1258
1236
|
end
|
1259
1237
|
it 'should markdown style heading not interrupted by other explicit section' do
|
1260
1238
|
text = "# タイトルです。\r\nこれは、セクションの中です。\n section {\n h2: また次のセクションです。\n入れ子になります。\n}\nこのように。"
|
@@ -1264,17 +1242,17 @@ EOF
|
|
1264
1242
|
expect(body.element_children.size).to eq 1
|
1265
1243
|
expect(body.element_children[0].selector_and_children)
|
1266
1244
|
.to eq(
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
1273
|
-
|
1274
|
-
|
1275
|
-
|
1276
|
-
|
1277
|
-
|
1245
|
+
['section',
|
1246
|
+
['h1', 'タイトルです。'],
|
1247
|
+
['div.pgroup',
|
1248
|
+
['p', 'これは、セクションの中です。']],
|
1249
|
+
['section',
|
1250
|
+
['h2', 'また次のセクションです。'],
|
1251
|
+
['div.pgroup',
|
1252
|
+
['p', '入れ子になります。']]],
|
1253
|
+
['div.pgroup',
|
1254
|
+
['p', 'このように。']]]
|
1255
|
+
)
|
1278
1256
|
end
|
1279
1257
|
it 'should markdown style heading not interrupted by other explicit section' do
|
1280
1258
|
text = "# タイトルです。\r\nこれは、セクションの中です。\n ## また次のセクションです。{\n 入れ子になります。\n# 中にもかけます。\nさらにネストされます。\n}\nこのように。"
|
@@ -1284,21 +1262,21 @@ EOF
|
|
1284
1262
|
expect(body.element_children.size).to eq 1
|
1285
1263
|
expect(body.element_children[0].selector_and_children)
|
1286
1264
|
.to eq(
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1291
|
-
|
1292
|
-
|
1293
|
-
|
1294
|
-
|
1295
|
-
|
1296
|
-
|
1297
|
-
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1265
|
+
['section',
|
1266
|
+
['h1', 'タイトルです。'],
|
1267
|
+
['div.pgroup',
|
1268
|
+
['p', 'これは、セクションの中です。']],
|
1269
|
+
['section',
|
1270
|
+
['h2', 'また次のセクションです。'],
|
1271
|
+
['div.pgroup',
|
1272
|
+
['p', '入れ子になります。']],
|
1273
|
+
['section',
|
1274
|
+
['h1', '中にもかけます。'],
|
1275
|
+
['div.pgroup',
|
1276
|
+
['p', 'さらにネストされます。']]]],
|
1277
|
+
['div.pgroup',
|
1278
|
+
['p', 'このように。']]]
|
1279
|
+
)
|
1302
1280
|
end
|
1303
1281
|
|
1304
1282
|
it 'should markdown style explicit heading correctly nested' do
|
@@ -1309,17 +1287,17 @@ EOF
|
|
1309
1287
|
expect(body.element_children.size).to eq 1
|
1310
1288
|
expect(body.element_children[0].selector_and_children)
|
1311
1289
|
.to eq(
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
|
1316
|
-
|
1317
|
-
|
1318
|
-
|
1319
|
-
|
1320
|
-
|
1321
|
-
|
1322
|
-
|
1290
|
+
['section',
|
1291
|
+
['h1', 'head one'],
|
1292
|
+
['div.pgroup',
|
1293
|
+
['p', 'in the top level section.']],
|
1294
|
+
['section',
|
1295
|
+
['h2', 'second level section.'],
|
1296
|
+
['div.pgroup',
|
1297
|
+
['p', 'in the second level.']]],
|
1298
|
+
['div.pgroup',
|
1299
|
+
['p', 'top level again.']]]
|
1300
|
+
)
|
1323
1301
|
end
|
1324
1302
|
|
1325
1303
|
it 'should markdown style heading not interrupted by smaller section' do
|
@@ -1330,45 +1308,49 @@ EOF
|
|
1330
1308
|
expect(body.element_children.size).to eq 2
|
1331
1309
|
expect(body.element_children[0].selector_and_children)
|
1332
1310
|
.to eq(
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
|
1337
|
-
|
1338
|
-
|
1339
|
-
|
1340
|
-
|
1341
|
-
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1311
|
+
['section',
|
1312
|
+
['h1', 'タイトルです。'],
|
1313
|
+
['div.pgroup',
|
1314
|
+
['p', 'これは、セクションの中です。']],
|
1315
|
+
['section',
|
1316
|
+
['h2', 'また次のセクションです。'],
|
1317
|
+
['div.pgroup',
|
1318
|
+
['p', '入れ子になります。']],
|
1319
|
+
['section',
|
1320
|
+
['h3', 'さらに中のセクション'],
|
1321
|
+
['div.pgroup',
|
1322
|
+
['p', 'さらに入れ子になっているはず。']]]]]
|
1323
|
+
)
|
1345
1324
|
expect(body.element_children[1].selector_and_children)
|
1346
1325
|
.to eq(
|
1347
|
-
|
1348
|
-
|
1349
|
-
|
1350
|
-
|
1351
|
-
|
1326
|
+
['section',
|
1327
|
+
['h1', 'ここで次のセクションです。'],
|
1328
|
+
['div.pgroup',
|
1329
|
+
['p', '脱出しているはずです。']]]
|
1330
|
+
)
|
1352
1331
|
end
|
1353
1332
|
end
|
1354
1333
|
describe 'nonpaged mode' do
|
1355
1334
|
it 'should create single html' do
|
1356
1335
|
text = "some text\nnewpage:\nnext page"
|
1357
|
-
noramark = NoraMark::Document.parse(text, lang: 'ja', title:'the document title')
|
1336
|
+
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the document title')
|
1358
1337
|
converted = noramark.render_parameter(nonpaged: true).html
|
1359
1338
|
expect(converted.size).to eq 1
|
1360
1339
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
1361
1340
|
expect(body.element_children[0].selector_and_children)
|
1362
1341
|
.to eq(
|
1363
|
-
|
1364
|
-
|
1342
|
+
['div.pgroup',
|
1343
|
+
['p', 'some text']]
|
1344
|
+
)
|
1365
1345
|
expect(body.element_children[1].selector_and_children)
|
1366
1346
|
.to eq(
|
1367
|
-
|
1347
|
+
['hr.page-break']
|
1348
|
+
)
|
1368
1349
|
expect(body.element_children[2].selector_and_children)
|
1369
1350
|
.to eq(
|
1370
|
-
|
1371
|
-
|
1351
|
+
['div.pgroup',
|
1352
|
+
['p', 'next page']]
|
1353
|
+
)
|
1372
1354
|
end
|
1373
1355
|
end
|
1374
1356
|
describe 'create file' do
|
@@ -1382,18 +1364,17 @@ EOF
|
|
1382
1364
|
end
|
1383
1365
|
it 'should create named file' do
|
1384
1366
|
text = "some text\nnewpage:\nnext page"
|
1385
|
-
noramark = NoraMark::Document.parse(text, lang: 'ja', title:'the document title', document_name: 'nora-test-file', sequence_format: '%03d'
|
1367
|
+
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the document title', document_name: 'nora-test-file', sequence_format: '%03d')
|
1386
1368
|
noramark.html.write_as_files(directory: @basedir)
|
1387
1369
|
files = Dir.glob(File.join(@basedir, '*.xhtml')).map { |file| File.basename(file) }
|
1388
1370
|
expect(files).to include 'nora-test-file_001.xhtml'
|
1389
1371
|
expect(files).to include 'nora-test-file_002.xhtml'
|
1390
1372
|
end
|
1391
|
-
|
1392
1373
|
end
|
1393
1374
|
describe 'parse and create manual' do
|
1394
1375
|
before {
|
1395
1376
|
@here = File.dirname(__FILE__)
|
1396
|
-
@basedir = File.join(File.dirname(__FILE__), 'created_files')
|
1377
|
+
@basedir = File.join(File.dirname(__FILE__), 'created_files')
|
1397
1378
|
@exampledir = File.join(@here, '..', 'example')
|
1398
1379
|
}
|
1399
1380
|
after { Dir.glob(File.join(@basedir, '*.xhtml')) { |file| File.delete file } }
|
@@ -1404,17 +1385,15 @@ EOF
|
|
1404
1385
|
schema = File.join(@here, 'epub30-schemas/epub-xhtml-30.rnc')
|
1405
1386
|
original_file = File.join(@exampledir, 'noramark-reference-ja_00001.xhtml')
|
1406
1387
|
file_to_validate = File.join(@basedir, 'noramark-reference-ja_00001.xhtml')
|
1407
|
-
File.open(original_file) do
|
1408
|
-
|original|
|
1388
|
+
File.open(original_file) do |original|
|
1409
1389
|
nokogiri_doc = Nokogiri::XML::Document.parse(original)
|
1410
1390
|
set = nokogiri_doc.xpath('//xmlns:pre[@data-code-language]')
|
1411
1391
|
set.remove_attr('data-code-language')
|
1412
|
-
File.open(file_to_validate, 'w+') do
|
1413
|
-
|to_validate|
|
1392
|
+
File.open(file_to_validate, 'w+') do |to_validate|
|
1414
1393
|
to_validate << nokogiri_doc.to_s
|
1415
1394
|
end
|
1416
1395
|
end
|
1417
|
-
@stdout = capture(:stdout) do
|
1396
|
+
@stdout = capture(:stdout) do
|
1418
1397
|
puts %x(java -jar #{jar} -c #{schema} #{file_to_validate})
|
1419
1398
|
end
|
1420
1399
|
expect(@stdout.strip).to eq ""
|
@@ -1422,7 +1401,7 @@ EOF
|
|
1422
1401
|
end
|
1423
1402
|
describe 'table of contents' do
|
1424
1403
|
before do
|
1425
|
-
@basedir = File.join(File.dirname(__FILE__), 'created_files')
|
1404
|
+
@basedir = File.join(File.dirname(__FILE__), 'created_files')
|
1426
1405
|
@text = <<EOF
|
1427
1406
|
---
|
1428
1407
|
lang: ja
|
@@ -1455,27 +1434,25 @@ EOF
|
|
1455
1434
|
toc = @noramark.html.toc
|
1456
1435
|
expect(toc.size).to eq 3
|
1457
1436
|
expect(toc[0])
|
1458
|
-
.to eq({link: "nora-with-toc_00001.xhtml#heading_index_1", level: 1, text: "chapter 1"})
|
1437
|
+
.to eq({ link: "nora-with-toc_00001.xhtml#heading_index_1", level: 1, text: "chapter 1" })
|
1459
1438
|
expect(toc[1])
|
1460
|
-
.to eq({link: "nora-with-toc_00001.xhtml#heading_index_2", level: 2, text: "section 1-1"})
|
1439
|
+
.to eq({ link: "nora-with-toc_00001.xhtml#heading_index_2", level: 2, text: "section 1-1" })
|
1461
1440
|
expect(toc[2])
|
1462
|
-
.to eq({link: "nora-with-toc_00002.xhtml#heading_index_3", level: 6, text: "some column"})
|
1441
|
+
.to eq({ link: "nora-with-toc_00002.xhtml#heading_index_3", level: 6, text: "some column" })
|
1463
1442
|
end
|
1464
1443
|
it 'should generate and write tocs' do
|
1465
1444
|
@noramark.html.write_toc_as_file(directory: @basedir)
|
1466
1445
|
expect(File.exist?(File.join(@basedir, 'nora-with-toc.yaml')))
|
1467
|
-
File.open(File.join(@basedir, 'nora-with-toc.yaml')) do
|
1468
|
-
|file|
|
1446
|
+
File.open(File.join(@basedir, 'nora-with-toc.yaml')) do |file|
|
1469
1447
|
toc = YAML.load(file.read)
|
1470
1448
|
expect(toc[0])
|
1471
|
-
.to eq({link: "nora-with-toc_00001.xhtml#heading_index_1", level: 1, text: "chapter 1"})
|
1449
|
+
.to eq({ link: "nora-with-toc_00001.xhtml#heading_index_1", level: 1, text: "chapter 1" })
|
1472
1450
|
expect(toc[1])
|
1473
|
-
.to eq({link: "nora-with-toc_00001.xhtml#heading_index_2", level: 2, text: "section 1-1"})
|
1451
|
+
.to eq({ link: "nora-with-toc_00001.xhtml#heading_index_2", level: 2, text: "section 1-1" })
|
1474
1452
|
expect(toc[2])
|
1475
|
-
.to eq({link: "nora-with-toc_00002.xhtml#heading_index_3", level: 6, text: "some column"})
|
1453
|
+
.to eq({ link: "nora-with-toc_00002.xhtml#heading_index_3", level: 6, text: "some column" })
|
1476
1454
|
end
|
1477
1455
|
end
|
1478
|
-
|
1479
1456
|
end
|
1480
1457
|
it 'should raise error' do
|
1481
1458
|
text = "d {\n block is\nd {\n nested but\nd {\n not terminated }"
|
@@ -1490,9 +1467,9 @@ EOF
|
|
1490
1467
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
1491
1468
|
expect(body.element_children[0].selector_and_children)
|
1492
1469
|
.to eq(
|
1493
|
-
|
1494
|
-
|
1495
|
-
|
1470
|
+
['p', 'this text includes ',
|
1471
|
+
["video[src='video.mp4'][poster='poster.jpg']", 'alternate message']]
|
1472
|
+
)
|
1496
1473
|
end
|
1497
1474
|
it 'should render video with autoplay and controls' do
|
1498
1475
|
text = "this text includes [video(video.mp4, autoplay, controls)[poster: poster.jpg]]"
|
@@ -1501,9 +1478,9 @@ EOF
|
|
1501
1478
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
1502
1479
|
expect(body.element_children[0].selector_and_children)
|
1503
1480
|
.to eq(
|
1504
|
-
|
1505
|
-
|
1506
|
-
|
1481
|
+
['p', 'this text includes ',
|
1482
|
+
["video[src='video.mp4'][poster='poster.jpg'][autoplay='autoplay'][controls='controls']", '']]
|
1483
|
+
)
|
1507
1484
|
end
|
1508
1485
|
end
|
1509
1486
|
describe 'audio' do
|
@@ -1514,9 +1491,9 @@ EOF
|
|
1514
1491
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
1515
1492
|
expect(body.element_children[0].selector_and_children)
|
1516
1493
|
.to eq(
|
1517
|
-
|
1518
|
-
|
1519
|
-
|
1494
|
+
['p', 'this text includes ',
|
1495
|
+
["audio[src='audio.mp3'][volume='0.2']", 'alternate message']]
|
1496
|
+
)
|
1520
1497
|
end
|
1521
1498
|
it 'should render audio with autoplay and controls' do
|
1522
1499
|
text = "this text includes [audio(audio.mp3, autoplay, controls)]"
|
@@ -1525,9 +1502,9 @@ EOF
|
|
1525
1502
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
1526
1503
|
expect(body.element_children[0].selector_and_children)
|
1527
1504
|
.to eq(
|
1528
|
-
|
1529
|
-
|
1530
|
-
|
1505
|
+
['p', 'this text includes ',
|
1506
|
+
["audio[src='audio.mp3'][autoplay='autoplay'][controls='controls']", '']]
|
1507
|
+
)
|
1531
1508
|
end
|
1532
1509
|
end
|
1533
1510
|
describe 'Frontmatter MetaData' do
|
@@ -1539,7 +1516,7 @@ namespace: { epub: "http://www.idpf.org/2007/ops" }
|
|
1539
1516
|
text
|
1540
1517
|
EOF
|
1541
1518
|
converted = NoraMark::Document.parse(text)
|
1542
|
-
xhtml = Nokogiri::XML::Document.parse(converted.html[0])
|
1519
|
+
xhtml = Nokogiri::XML::Document.parse(converted.html[0])
|
1543
1520
|
expect(xhtml.root.namespaces['xmlns:epub'])
|
1544
1521
|
.to eq 'http://www.idpf.org/2007/ops'
|
1545
1522
|
end
|
@@ -1560,4 +1537,3 @@ EOF
|
|
1560
1537
|
end
|
1561
1538
|
end
|
1562
1539
|
end
|
1563
|
-
|