nora_mark 0.2beta7 → 0.2beta8

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.
@@ -1,5 +1,5 @@
1
- require 'nora_mark/node'
2
1
  require 'nora_mark/parser.kpeg'
2
+ require 'nora_mark/node'
3
3
 
4
4
  module NoraMark
5
5
  class Parser
@@ -1,18 +1,35 @@
1
1
  module NoraMark
2
2
  class Transformer
3
+ include NodeUtil
4
+ attr_accessor :options
3
5
  def initialize(rules, options)
4
6
  @rules = rules
5
7
  @options = options
6
8
  end
9
+
7
10
  def transform(node)
8
- node.all_nodes.each do
9
- |node|
10
- if match_rule = @rules.find { |rule| node.match?(rule[0]) }
11
- selector, action, p = match_rule
12
- NodeBuilder.new(node, @options).send(action, &p)
11
+ frontmatter_node = node.find_node :type => :Frontmatter
12
+ @frontmatter = frontmatter_node.yaml if frontmatter_node
13
+ node.all_nodes.unshift(node).each do
14
+ |n|
15
+ if match_rule = @rules.find { |rule| n.match?(rule[0]) }
16
+ action, p = match_rule[1,2]
17
+ @node = n
18
+ send(action, &p)
13
19
  end
14
- end
20
+ end
21
+ node
22
+ end
23
+
24
+ def modify(&block)
25
+ instance_eval(&block)
15
26
  end
27
+
28
+ def replace(&block)
29
+ new_node = instance_eval(&block)
30
+ @node.replace new_node if new_node
31
+ end
32
+
16
33
  end
17
34
 
18
35
  class TransformerFactory
@@ -26,7 +43,7 @@ module NoraMark
26
43
  if text
27
44
  instance_eval text
28
45
  else
29
- instance_eval &block
46
+ instance_eval(&block)
30
47
  end
31
48
  Transformer.new(@rules, @options)
32
49
  end
@@ -36,8 +53,16 @@ module NoraMark
36
53
  (@options ||= {}).merge options
37
54
  end
38
55
 
39
- def for_node(selector, action = :replace, &block)
40
- @rules << [ selector, action, block ]
41
- end
56
+ def modify(selector, &block)
57
+ @rules << [ selector, :modify, block ]
58
+ end
59
+
60
+ def replace(selector, &block)
61
+ @rules << [ selector, :replace, block ]
62
+ end
63
+
64
+ def rename(selector, name)
65
+ @rules << [ selector, :modify, proc { @node.name = name } ]
66
+ end
42
67
  end
43
68
  end
@@ -1,3 +1,3 @@
1
1
  module NoraMark
2
- VERSION = "0.2beta7"
2
+ VERSION = "0.2beta8"
3
3
  end
@@ -4,8 +4,8 @@ require File.expand_path('../lib/nora_mark/version', __FILE__)
4
4
  Gem::Specification.new do |gem|
5
5
  gem.authors = ["KOJIMA Satoshi"]
6
6
  gem.email = ["skoji@mac.com"]
7
- gem.description = %q{simple and customizable text markup language for EPUB}
8
- gem.summary = %q{simple and customizable text markup language for EPUB}
7
+ gem.description = %q{Simple and customizable text markup language for EPUB/XHTML}
8
+ gem.summary = %q{Simple and customizable text markup language for EPUB/XHTML}
9
9
  gem.homepage = ""
10
10
 
11
11
  gem.files = `git ls-files`.split($\)
@@ -19,5 +19,6 @@ Gem::Specification.new do |gem|
19
19
  gem.add_dependency "kpeg"
20
20
  gem.add_development_dependency "rspec", "~> 2.14"
21
21
  gem.add_development_dependency "rake"
22
+ gem.add_development_dependency "byebug"
22
23
  gem.add_development_dependency "nokogiri", "~> 1.6.0"
23
24
  end
@@ -0,0 +1,280 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+ require File.dirname(__FILE__) + '/../lib/nora_mark'
3
+ require 'nokogiri'
4
+ require File.dirname(__FILE__) + '/nokogiri_test_helper.rb'
5
+
6
+ describe NoraMark::Node do
7
+ describe 'node manipulation' do
8
+ before do
9
+ @text = <<EOF
10
+ 1st line.
11
+ d.the_class {
12
+ 3rd line.
13
+ }
14
+ 5th line.
15
+ EOF
16
+ end
17
+ it 'should access line number' do
18
+ noramark = NoraMark::Document.parse(@text)
19
+ page = noramark.root.children[0]
20
+ expect(page.children.size).to eq 3
21
+ expect(page.line_no).to eq 1
22
+ expect(page.children[0].line_no).to eq 1
23
+ expect(page.children[1].line_no).to eq 2
24
+ expect(page.children[2].children[0].line_no).to eq 5
25
+ end
26
+
27
+ it 'replace existing node' do
28
+ noramark = NoraMark::Document.parse(@text)
29
+ page = noramark.root.children[0]
30
+ first_pgroup = page.children[0]
31
+ line_no = first_pgroup.line_no
32
+ new_node = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [ NoraMark::Text.new("replaced.", line_no)], line_no)
33
+ first_pgroup.replace(new_node)
34
+ body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
35
+ expect(body.element_children[0].selector_and_children(remove_id: false))
36
+ .to eq(
37
+ ['p#the_id.the_class', 'replaced.'])
38
+ end
39
+
40
+ it 'replace existing node by multiple nodes' do
41
+ noramark = NoraMark::Document.parse(@text)
42
+ page = noramark.root.children[0]
43
+ first_pgroup = page.children[0]
44
+ line_no = first_pgroup.line_no
45
+ new_node1 = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [ NoraMark::Text.new("replaced.", line_no)], line_no)
46
+ new_node2 = NoraMark::ParagraphGroup.new(['the_id2'], ['the_class2'], [], {}, [ NoraMark::Text.new("replaced2.", line_no)], line_no)
47
+ first_pgroup.replace([new_node1, new_node2])
48
+ body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
49
+ expect(body.element_children[0].selector_and_children(remove_id: false))
50
+ .to eq(
51
+ ['p#the_id.the_class', 'replaced.'])
52
+ expect(body.element_children[1].selector_and_children(remove_id: false))
53
+ .to eq(
54
+ ['p#the_id2.the_class2', 'replaced2.'])
55
+ expect(body.element_children[2].selector_and_children(remove_id: false))
56
+ .to eq(
57
+ ['div.the_class', ['p', '3rd line.']])
58
+ end
59
+
60
+ it 'wraps existing node' do
61
+ noramark = NoraMark::Document.parse(@text)
62
+ page = noramark.root.children[0]
63
+ first_pgroup = page.children[0]
64
+ line_no = first_pgroup.line_no
65
+ new_node = NoraMark::Block.new('div', ['the_id'], ['the_class'], [], {}, [
66
+ NoraMark::Block.new('p', [], [], [], {}, [
67
+ NoraMark::Text.new("replaced.", line_no)], line_no)
68
+ ], line_no)
69
+ first_pgroup.wrap(new_node)
70
+ body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
71
+ expect(body.element_children[0].selector_and_children(remove_id: false))
72
+ .to eq(['div#the_id.the_class', ['p', '1st line.'], ['p', 'replaced.']])
73
+ end
74
+
75
+ it 'append to existing node' do
76
+ noramark = NoraMark::Document.parse(@text)
77
+ page = noramark.root.children[0]
78
+ first_pgroup = page.children[0]
79
+ line_no = first_pgroup.line_no
80
+ new_node = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [ NoraMark::Text.new("added.", line_no)], line_no)
81
+ first_pgroup.after(new_node)
82
+ body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
83
+ expect(body.element_children[0].selector_and_children(remove_id: false))
84
+ .to eq(
85
+ ['p', '1st line.'])
86
+ expect(body.element_children[1].selector_and_children(remove_id: false))
87
+ .to eq(
88
+ ['p#the_id.the_class', 'added.'])
89
+ expect(body.element_children[2].selector_and_children(remove_id: false))
90
+ .to eq(
91
+ ['div.the_class', ['p', '3rd line.']])
92
+ end
93
+
94
+ it 'append to the last existing node' do
95
+ noramark = NoraMark::Document.parse(@text)
96
+ page = noramark.root.children[0]
97
+ last_pgroup = page.children[2]
98
+ line_no = last_pgroup.line_no
99
+ new_node = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [ NoraMark::Text.new("added.", line_no)], line_no)
100
+ last_pgroup.after(new_node)
101
+ body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
102
+ expect(body.element_children[1].selector_and_children(remove_id: false))
103
+ .to eq(
104
+ ['div.the_class', ['p', '3rd line.']])
105
+ expect(body.element_children[2].selector_and_children(remove_id: false))
106
+ .to eq(
107
+ ['p', '5th line.'])
108
+ expect(body.element_children[3].selector_and_children(remove_id: false))
109
+ .to eq(
110
+ ['p#the_id.the_class', 'added.'])
111
+ end
112
+
113
+ it 'prepend to existing node' do
114
+ noramark = NoraMark::Document.parse(@text)
115
+ page = noramark.root.children[0]
116
+ first_pgroup = page.children[0]
117
+ line_no = first_pgroup.line_no
118
+ new_node = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [ NoraMark::Text.new("added.", line_no)], line_no)
119
+ first_pgroup.before(new_node)
120
+ body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
121
+ expect(body.element_children[0].selector_and_children(remove_id: false))
122
+ .to eq(
123
+ ['p#the_id.the_class', 'added.'])
124
+ expect(body.element_children[1].selector_and_children(remove_id: false))
125
+ .to eq(
126
+ ['p', '1st line.'])
127
+ expect(body.element_children[2].selector_and_children(remove_id: false))
128
+ .to eq(
129
+ ['div.the_class', ['p', '3rd line.']])
130
+ end
131
+
132
+ it 'modify existing node by DSL' do
133
+ text = "1st line.\nfoobar(title)[level: 3] {\n in the section.\n}\n# section 2."
134
+ noramark = NoraMark::Document.parse(text, lang: 'ja')
135
+
136
+ noramark.add_transformer(generator: :html) do
137
+ modify 'foobar' do
138
+ @node.name = 'section'
139
+ @node.prepend_child block("h#{@node.n[:level]}", @node.p[0])
140
+ end
141
+ end
142
+ body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
143
+ expect(body.element_children[0].selector_and_children())
144
+ .to eq(
145
+ ['div.pgroup', [ 'p', '1st line.' ]])
146
+ expect(body.element_children[1].selector_and_children())
147
+ .to eq(
148
+ ['section', [ 'h3', 'title' ], ['div.pgroup', ['p', 'in the section.']]])
149
+ expect(body.element_children[2].selector_and_children())
150
+ .to eq(
151
+ ['section', [ 'h1','section 2.' ]])
152
+ end
153
+ it 'replace existing node by DSL' do
154
+ text = "1st line.\nfoobar(title)[level: 3] {\n in the section.\n}\n# section 2."
155
+ noramark = NoraMark::Document.parse(text, lang: 'ja')
156
+
157
+ noramark.add_transformer(generator: :html) do
158
+ replace 'foobar' do
159
+ block('section',
160
+ [
161
+ block( "h#{@node.named_params[:level]}", @node.params[0]),
162
+ ] + @node.children)
163
+ end
164
+ end
165
+ body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
166
+ expect(body.element_children[0].selector_and_children())
167
+ .to eq(
168
+ ['div.pgroup', [ 'p', '1st line.' ]])
169
+ expect(body.element_children[1].selector_and_children())
170
+ .to eq(
171
+ ['section', [ 'h3', 'title' ], ['div.pgroup', ['p', 'in the section.']]])
172
+ expect(body.element_children[2].selector_and_children())
173
+ .to eq(
174
+ ['section', [ 'h1','section 2.' ]])
175
+ end
176
+ it 'generate complex-style headed section' do
177
+ text = <<EOF
178
+ ---
179
+ lang: ja
180
+ ---
181
+
182
+ # 見出し
183
+ sub: 副見出し
184
+
185
+ パラグラフ。
186
+ パラグラフ。
187
+
188
+ EOF
189
+ noramark = NoraMark::Document.parse(text)
190
+ noramark.add_transformer(generator: :html) do
191
+ replace({:type => :HeadedSection}) do
192
+ header = block('header',
193
+ block('div',
194
+ block("h#{@node.level}", @node.heading),
195
+ classes: ['hgroup']))
196
+ if (fc = @node.first_child).name == 'sub'
197
+ fc.name = 'p'
198
+ fc.classes = ['subh']
199
+ header.first_child.append_child fc
200
+ end
201
+ body = block('div', @node.children, classes:['section-body'])
202
+ block('section', [ header, body ], template: @node)
203
+ end
204
+ end
205
+ body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
206
+ expect(body.element_children[0].selector_and_children())
207
+ .to eq(
208
+ ['section', [ 'header', ['div.hgroup', ['h1', '見出し'], ['p.subh', '副見出し']]],
209
+ ['div.section-body',
210
+ ['div.pgroup', ['p', 'パラグラフ。'], ['p', 'パラグラフ。']]]])
211
+ end
212
+ it 'converts my markup' do
213
+ text = "speak(Alice): Alice is speaking.\nspeak(Bob): and this is Bob."
214
+ noramark = NoraMark::Document.parse(text)
215
+ noramark.add_transformer(generator: :html) do
216
+ modify "speak" do
217
+ @node.name = 'p'
218
+ @node.prepend_child inline('span', @node.params[0], classes: ['speaker'])
219
+ end
220
+ end
221
+ body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
222
+ expect(body.element_children[0].selector_and_children())
223
+ .to eq(
224
+ ['p', ['span.speaker', 'Alice'], 'Alice is speaking.'])
225
+ expect(body.element_children[1].selector_and_children())
226
+ .to eq(
227
+ ['p', ['span.speaker', 'Bob'], 'and this is Bob.'])
228
+
229
+ end
230
+
231
+
232
+ it 'should reparent tree' do
233
+ text = <<EOF
234
+ 1st line.
235
+ d {
236
+ in the div
237
+ }
238
+ *: ul item
239
+ text [s{with inline}] within
240
+ EOF
241
+ root = NoraMark::Document.parse(text).root
242
+
243
+ expect(root.parent).to be nil
244
+ expect(root.prev).to be nil
245
+ expect(root.next).to be nil
246
+ expect(root.content).to be nil
247
+
248
+ expect(root.children.size).to eq 1
249
+ page = root.first_child
250
+ expect(root.children[0]).to eq page
251
+ expect(root.last_child).to eq page
252
+ expect(page.parent).to eq root
253
+ expect(page.prev).to be nil
254
+ expect(page.next).to be nil
255
+
256
+ first_pgroup = page.first_child
257
+ expect(first_pgroup.class).to be NoraMark::ParagraphGroup
258
+ expect(first_pgroup.parent).to eq page
259
+ expect(first_pgroup.children.size).to eq 1
260
+ expect(first_pgroup.prev).to be nil
261
+
262
+ paragraph = first_pgroup.first_child
263
+ expect(paragraph.class).to be NoraMark::Paragraph
264
+ expect(paragraph.parent).to be first_pgroup
265
+ expect(paragraph.prev).to be nil
266
+ expect(paragraph.next).to be nil
267
+ expect(paragraph.children.size).to eq 1
268
+ text = paragraph.first_child
269
+ expect(text.class).to be NoraMark::Text
270
+ expect(text.content).to eq '1st line.'
271
+ expect(text.children.size).to eq 0
272
+ expect(text.prev).to be nil
273
+ expect(text.next).to be nil
274
+ expect(text.parent).to eq paragraph
275
+
276
+ second_div = first_pgroup.next
277
+ expect(second_div.class).to be NoraMark::Block
278
+ end
279
+ end
280
+ end
@@ -4,825 +4,971 @@ require File.dirname(__FILE__) + '/../lib/nora_mark'
4
4
  require 'nokogiri'
5
5
  require File.dirname(__FILE__) + '/nokogiri_test_helper.rb'
6
6
 
7
- describe NoraMark do
8
- describe 'convert' do
9
- it 'should generate valid xhtml' do
7
+ describe NoraMark::Document do
8
+ describe 'parse' do
9
+ it 'generate valid xhtml' do
10
10
  text = 'some text'
11
11
  noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
12
12
  xhtml = Nokogiri::XML::Document.parse(noramark.html[0])
13
13
  expect(xhtml.root.name).to eq('html')
14
- expect(xhtml.root.namespaces['xmlns']).to eq('http://www.w3.org/1999/xhtml')
15
- expect(xhtml.root['xml:lang']).to eq('ja')
14
+ expect(xhtml.root.namespaces['xmlns'])
15
+ .to eq('http://www.w3.org/1999/xhtml')
16
+ expect(xhtml.root['xml:lang'])
17
+ .to eq('ja')
16
18
  expect(xhtml.root.element_children[0].name).to eq 'head'
17
- expect(xhtml.root.at_xpath('xmlns:head/xmlns:title').text).to eq('the title')
19
+ expect(xhtml.root.at_xpath('xmlns:head/xmlns:title').text)
20
+ .to eq('the title')
18
21
  expect(xhtml.root.element_children[1].name).to eq 'body'
19
22
  end
20
- it 'should convert simple paragraph' do
21
- text = "ここから、パラグラフがはじまります。\n「二行目です。」\n三行目です。\n\n\n ここから、次のパラグラフです。"
22
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
23
- converted = noramark.html
24
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
25
- expect(body.element_children.size).to eq 2
26
- expect(body.element_children[0].selector_and_children).to eq(
27
- ['div.pgroup',
28
- ['p', 'ここから、パラグラフがはじまります。'],
29
- ['p.noindent', '「二行目です。」'],
30
- ['p', '三行目です。']
31
- ]
32
- )
33
-
34
- expect(body.element_children[1].selector_and_children).to eq(
35
- ['div.pgroup',
36
- ['p', 'ここから、次のパラグラフです。']]
37
- )
38
- end
39
- it 'should convert simple paragraph with BOM' do
40
- text = "\uFEFFここから、パラグラフがはじまります。\n「二行目です。」\n三行目です。\n\n\n ここから、次のパラグラフです。"
41
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
42
- converted = noramark.html
43
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
44
- expect(body.element_children.size).to eq 2
45
- expect(body.element_children[0].selector_and_children).to eq(
46
- ['div.pgroup',
47
- ['p', 'ここから、パラグラフがはじまります。'],
48
- ['p.noindent', '「二行目です。」'],
49
- ['p', '三行目です。']
50
- ]
51
- )
52
-
53
- expect(body.element_children[1].selector_and_children).to eq(
54
- ['div.pgroup',
55
- ['p', 'ここから、次のパラグラフです。']]
56
- )
57
- end
58
-
59
- it 'should convert simple paragraph in english mode' do
60
- text = "paragraph begins.\n2nd line.\n 3rd line.\n\n\n next paragraph."
61
- noramark = NoraMark::Document.parse(text, lang: 'en', title: 'the title')
62
- converted = noramark.html
63
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
64
- expect(body.element_children.size).to eq 2
65
- expect(body.element_children[0].selector_and_children).to eq(
66
- ['p',
67
- 'paragraph begins.', ['br', ''],
68
- '2nd line.', ['br', ''],
69
- '3rd line.'
70
- ]
71
- )
72
-
73
- expect(body.element_children[1].selector_and_children).to eq(
74
- ['p', 'next paragraph.']
75
- )
76
- end
77
-
78
-
79
- it 'should convert simple paragraph in english mode specified in frontmatter' do
80
- text = "---\nlang: en\ntitle: the title\n---\n\n\n\nparagraph begins.\n2nd line.\n 3rd line.\n\n\n next paragraph."
81
- noramark = NoraMark::Document.parse(text)
82
- converted = noramark.html
83
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
84
- expect(body.element_children.size).to eq 2
85
- expect(body.element_children[0].selector_and_children).to eq(
86
- ['p',
87
- 'paragraph begins.', ['br', ''],
88
- '2nd line.', ['br', ''],
89
- '3rd line.'
90
- ]
91
- )
92
-
93
- expect(body.element_children[1].selector_and_children).to eq(
94
- ['p', 'next paragraph.']
95
- )
96
- end
97
-
98
- it 'should convert simple paragraph in japanese mode, but paragraph mode is default' do
99
- text = "paragraph begins.\n2nd line.\n 3rd line.\n\n\n next paragraph."
100
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title', paragraph_style: :default)
101
- converted = noramark.html
102
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
103
- expect(body.element_children.size).to eq 2
104
- expect(body.element_children[0].selector_and_children).to eq(
105
- ['p',
106
- 'paragraph begins.', ['br', ''],
107
- '2nd line.', ['br', ''],
108
- '3rd line.'
109
- ]
110
- )
111
-
112
- expect(body.element_children[1].selector_and_children).to eq(
113
- ['p', 'next paragraph.']
114
- )
115
- end
23
+ describe 'implicit markup' do
24
+ it 'convert simple paragraph' do
25
+ text = "ここから、パラグラフがはじまります。\n「二行目です。」\n三行目です。\n\n\n ここから、次のパラグラフです。"
26
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
27
+ converted = noramark.html
28
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
29
+ expect(body.element_children.size).to eq 2
30
+ expect(body.element_children[0].selector_and_children)
31
+ .to eq(
32
+ ['div.pgroup',
33
+ ['p', 'ここから、パラグラフがはじまります。'],
34
+ ['p.noindent', '「二行目です。」'],
35
+ ['p', '三行目です。']
36
+ ]
37
+ )
38
+
39
+ expect(body.element_children[1].selector_and_children)
40
+ .to eq(
41
+ ['div.pgroup',
42
+ ['p', 'ここから、次のパラグラフです。']]
43
+ )
44
+ end
45
+ it 'convert simple paragraph with BOM' do
46
+ text = "\uFEFFここから、パラグラフがはじまります。\n「二行目です。」\n三行目です。\n\n\n ここから、次のパラグラフです。"
47
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
48
+ converted = noramark.html
49
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
50
+ expect(body.element_children.size).to eq 2
51
+ expect(body.element_children[0].selector_and_children)
52
+ .to eq(
53
+ ['div.pgroup',
54
+ ['p', 'ここから、パラグラフがはじまります。'],
55
+ ['p.noindent', '「二行目です。」'],
56
+ ['p', '三行目です。']
57
+ ]
58
+ )
59
+
60
+ expect(body.element_children[1].selector_and_children)
61
+ .to eq(
62
+ ['div.pgroup',
63
+ ['p', 'ここから、次のパラグラフです。']]
64
+ )
65
+ end
116
66
 
117
- it 'should convert simple paragraph in japanese mode, but paragraph mode is default (using frontmatter)' do
118
- text = "---\nlang: ja\ntitle: the title\nparagraph_style: default\n---\nparagraph begins.\n2nd line.\n 3rd line.\n\n\n next paragraph."
119
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title', paragraph_styl: :default)
120
- converted = noramark.html
121
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
122
- expect(body.element_children.size).to eq 2
123
- expect(body.element_children[0].selector_and_children).to eq(
124
- ['p',
125
- 'paragraph begins.', ['br', ''],
126
- '2nd line.', ['br', ''],
127
- '3rd line.'
128
- ]
129
- )
130
-
131
- expect(body.element_children[1].selector_and_children).to eq(
132
- ['p', 'next paragraph.']
133
- )
134
- end
67
+ it 'convert simple paragraph in english mode' do
68
+ text = "paragraph begins.\n2nd line.\n 3rd line.\n\n\n next paragraph."
69
+ noramark = NoraMark::Document.parse(text, lang: 'en', title: 'the title')
70
+ converted = noramark.html
71
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
72
+ expect(body.element_children.size).to eq 2
73
+ expect(body.element_children[0].selector_and_children)
74
+ .to eq(
75
+ ['p',
76
+ 'paragraph begins.', ['br', ''],
77
+ '2nd line.', ['br', ''],
78
+ '3rd line.'
79
+ ]
80
+ )
81
+
82
+ expect(body.element_children[1].selector_and_children)
83
+ .to eq(
84
+ ['p', 'next paragraph.']
85
+ )
86
+ end
135
87
 
136
- it 'should convert paragraph with header' do
137
- text = "h1: タイトルです。\r\nここから、パラグラフがはじまります。\n\nh2.column:ふたつめの見出しです。\n ここから、次のパラグラフです。\nh3.third.foo: クラスが複数ある見出しです"
138
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
139
- converted = noramark.html
140
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
141
- expect(body.element_children.size).to eq 5
142
- expect(body.element_children[0].a).to eq ['h1', 'タイトルです。']
143
- expect(body.element_children[1].selector_and_children).to eq(
144
- ['div.pgroup',
145
- ['p', 'ここから、パラグラフがはじまります。']
146
- ]
147
- )
148
- expect(body.element_children[2].a).to eq ['h2.column', 'ふたつめの見出しです。']
149
- expect(body.element_children[3].selector_and_children).to eq(
150
- ['div.pgroup',
151
- ['p', 'ここから、次のパラグラフです。']
152
- ]
153
- )
154
- expect(body.element_children[4].a).to eq ['h3.third.foo', 'クラスが複数ある見出しです']
155
- end
156
88
 
157
- it 'should convert div and paragraph' do
158
- text = "d {\n1st line. \n}"
159
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the document title')
160
- converted = noramark.html
161
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
162
- expect(body.element_children[0].selector_and_children).to eq(
163
- ['div',
164
- ['div.pgroup',
165
- ['p', '1st line.']
166
- ]
167
- ]
168
- )
169
- end
89
+ it 'convert simple paragraph in english mode specified in frontmatter' do
90
+ text = "---\nlang: en\ntitle: the title\n---\n\n\n\nparagraph begins.\n2nd line.\n 3rd line.\n\n\n next paragraph."
91
+ noramark = NoraMark::Document.parse(text)
92
+ converted = noramark.html
93
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
94
+ expect(body.element_children.size).to eq 2
95
+ expect(body.element_children[0].selector_and_children)
96
+ .to eq(
97
+ ['p',
98
+ 'paragraph begins.', ['br', ''],
99
+ '2nd line.', ['br', ''],
100
+ '3rd line.'
101
+ ]
102
+ )
103
+
104
+ expect(body.element_children[1].selector_and_children)
105
+ .to eq(
106
+ ['p', 'next paragraph.']
107
+ )
108
+ end
170
109
 
110
+ it 'convert simple paragraph in japanese mode, but paragraph mode is default' do
111
+ text = "paragraph begins.\n2nd line.\n 3rd line.\n\n\n next paragraph."
112
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title', paragraph_style: :default)
113
+ converted = noramark.html
114
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
115
+ expect(body.element_children.size).to eq 2
116
+ expect(body.element_children[0].selector_and_children)
117
+ .to eq(
118
+ ['p',
119
+ 'paragraph begins.', ['br', ''],
120
+ '2nd line.', ['br', ''],
121
+ '3rd line.'
122
+ ]
123
+ )
124
+
125
+ expect(body.element_children[1].selector_and_children)
126
+ .to eq(
127
+ ['p', 'next paragraph.']
128
+ )
129
+ end
171
130
 
172
- it 'should convert div without pgroup' do
173
- text = "d('wo-pgroup') {\n1st line. \n}"
174
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
175
- converted = noramark.html
176
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
177
- expect(body.element_children[0].selector_and_children).to eq(
178
- ['div',
179
- ['p', '1st line.']
180
- ]
181
- )
131
+ it 'convert simple paragraph in japanese mode, but paragraph mode is default (using frontmatter)' do
132
+ text = "---\nlang: ja\ntitle: the title\nparagraph_style: default\n---\nparagraph begins.\n2nd line.\n 3rd line.\n\n\n next paragraph."
133
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title', paragraph_styl: :default)
134
+ converted = noramark.html
135
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
136
+ expect(body.element_children.size).to eq 2
137
+ expect(body.element_children[0].selector_and_children)
138
+ .to eq(
139
+ ['p',
140
+ 'paragraph begins.', ['br', ''],
141
+ '2nd line.', ['br', ''],
142
+ '3rd line.'
143
+ ]
144
+ )
145
+
146
+ expect(body.element_children[1].selector_and_children)
147
+ .to eq(
148
+ ['p', 'next paragraph.']
149
+ )
150
+ end
182
151
  end
152
+ describe 'divs and hN headers' do
153
+ it 'parse paragraph with header' do
154
+ text = "h1: タイトルです。\r\nここから、パラグラフがはじまります。\n\nh2.column:ふたつめの見出しです。\n ここから、次のパラグラフです。\nh3.third.foo: クラスが複数ある見出しです"
155
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
156
+ converted = noramark.html
157
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
158
+ expect(body.element_children.size).to eq 5
159
+ expect(body.element_children[0].a).to eq ['h1', 'タイトルです。']
160
+ expect(body.element_children[1].selector_and_children)
161
+ .to eq(
162
+ ['div.pgroup',
163
+ ['p', 'ここから、パラグラフがはじまります。']
164
+ ]
165
+ )
166
+ expect(body.element_children[2].a).to eq ['h2.column', 'ふたつめの見出しです。']
167
+ expect(body.element_children[3].selector_and_children)
168
+ .to eq(
169
+ ['div.pgroup',
170
+ ['p', 'ここから、次のパラグラフです。']
171
+ ]
172
+ )
173
+ expect(body.element_children[4].a).to eq ['h3.third.foo', 'クラスが複数ある見出しです']
174
+ end
183
175
 
184
- it 'should nest div without pgroup' do
185
- text = "d(wo-pgroup) {\nd {\nnested.\n} \n}"
186
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
187
- converted = noramark.html
188
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
189
- expect(body.element_children[0].selector_and_children).to eq(
190
- ['div',
191
- ['div',
192
- ['p', 'nested.']
193
- ]
194
- ]
195
- )
196
- end
176
+ it 'parse div and paragraph' do
177
+ text = "d {\n1st line. \n}"
178
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the document title')
179
+ converted = noramark.html
180
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
181
+ expect(body.element_children[0].selector_and_children)
182
+ .to eq(
183
+ ['div',
184
+ ['div.pgroup',
185
+ ['p', '1st line.']
186
+ ]
187
+ ]
188
+ )
189
+ end
197
190
 
198
- it 'should handle divs with empty lines' do
199
- text = "\n\n\nd('wo-pgroup') {\n\n\n1st line. \n\n\n}\n\n\nd {\n 2nd div.\n}"
200
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
201
- converted = noramark.html
202
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
203
- expect(body.element_children[0].selector_and_children).to eq(
204
- ['div',
205
- ['p', '1st line.']
206
- ])
207
- expect(body.element_children[1].selector_and_children).to eq(
208
- ['div',
209
- ['div.pgroup',
210
- ['p', '2nd div.']]
211
- ]
212
-
213
- )
214
- end
215
191
 
216
- it 'should nest div without pgroup and with pgroup' do
217
- text = "d(wo-pgroup) {\nd {\nnested.\n} \n}\n\nd {\nin pgroup\n}"
218
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
219
- converted = noramark.html
220
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
221
- expect(body.element_children[0].selector_and_children).to eq(
222
- ['div',
223
- ['div',
224
- ['p', 'nested.']
225
- ]
226
- ])
227
- expect(body.element_children[1].selector_and_children).to eq(
228
- ['div',
229
- ['div.pgroup',
230
- ['p', 'in pgroup']
231
- ]
232
- ])
233
- end
192
+ it 'parse div without pgroup' do
193
+ text = "d('wo-pgroup') {\n1st line. \n}"
194
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
195
+ converted = noramark.html
196
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
197
+ expect(body.element_children[0].selector_and_children)
198
+ .to eq(
199
+ ['div',
200
+ ['p', '1st line.']
201
+ ]
202
+ )
203
+ end
234
204
 
205
+ it 'parse nested div without pgroup' do
206
+ text = "d(wo-pgroup) {\nd {\nnested.\n} \n}"
207
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
208
+ converted = noramark.html
209
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
210
+ expect(body.element_children[0].selector_and_children)
211
+ .to eq(
212
+ ['div',
213
+ ['div',
214
+ ['p', 'nested.']
215
+ ]
216
+ ]
217
+ )
218
+ end
235
219
 
236
- it 'should convert div with class' do
237
- text = "d.preface-one {\n h1: title.\n}"
238
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
239
- converted = noramark.html
240
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
241
- expect(body.element_children[0].selector_and_children).to eq(
242
- ['div.preface-one',
243
- ['h1', 'title.']
244
- ]
245
- )
246
- end
220
+ it 'handle divs with empty lines' do
221
+ text = "\n\n\nd('wo-pgroup') {\n\n\n1st line. \n\n\n}\n\n\nd {\n 2nd div.\n}"
222
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
223
+ converted = noramark.html
224
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
225
+ expect(body.element_children[0].selector_and_children)
226
+ .to eq(
227
+ ['div',
228
+ ['p', '1st line.']
229
+ ])
230
+ expect(body.element_children[1].selector_and_children)
231
+ .to eq(
232
+ ['div',
233
+ ['div.pgroup',
234
+ ['p', '2nd div.']]
235
+ ]
236
+
237
+ )
238
+ end
247
239
 
248
- it 'should convert div with id and class' do
249
- text = "d#thecontents.preface-one {\nh1: title.\n}"
250
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
251
- converted = noramark.html
252
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
253
- expect(body.element_children[0].selector_and_children(remove_id: false)).to eq(
254
- ['div#thecontents.preface-one',
255
- ['h1#heading_index_1', 'title.']
256
- ]
257
- )
258
- end
240
+ it 'parse nested div without pgroup and with pgroup' do
241
+ text = "d(wo-pgroup) {\nd {\nnested.\n} \n}\n\nd {\nin pgroup\n}"
242
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
243
+ converted = noramark.html
244
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
245
+ expect(body.element_children[0].selector_and_children)
246
+ .to eq(
247
+ ['div',
248
+ ['div',
249
+ ['p', 'nested.']
250
+ ]
251
+ ])
252
+ expect(body.element_children[1].selector_and_children)
253
+ .to eq(
254
+ ['div',
255
+ ['div.pgroup',
256
+ ['p', 'in pgroup']
257
+ ]
258
+ ])
259
+ end
259
260
 
260
- it 'should convert nested div' do
261
- text = "d.preface {\n outer div. \n d.nested {\n nested!\n}\nouter div again.\n}"
262
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
263
- converted = noramark.html
264
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
265
- expect(body.element_children[0].selector_and_children).to eq(
266
- ['div.preface',
267
- ['div.pgroup',
268
- ['p', 'outer div.']
269
- ],
270
- ['div.nested',
271
- ['div.pgroup',
272
- ['p', 'nested!']
273
- ]
274
- ],
275
- ['div.pgroup',
276
- ['p', 'outer div again.']
277
- ],
278
- ]
279
- )
280
- end
261
+ it 'parse div with class' do
262
+ text = "d.preface-one {\n h1: title.\n}"
263
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
264
+ converted = noramark.html
265
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
266
+ expect(body.element_children[0].selector_and_children)
267
+ .to eq(
268
+ ['div.preface-one',
269
+ ['h1', 'title.']
270
+ ]
271
+ )
272
+ end
281
273
 
282
- it 'should convert article' do
283
- text = "art {\n in the article.\n}"
284
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
285
- converted = noramark.html
286
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
287
- expect(body.element_children[0].selector_and_children).to eq(
288
- ['article',
289
- ['div.pgroup',
290
- ['p', 'in the article.']
291
- ]
292
- ]
293
- )
294
- end
274
+ it 'parse div with id and class' do
275
+ text = "d#thecontents.preface-one {\nh1: title.\n}"
276
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
277
+ converted = noramark.html
278
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
279
+ expect(body.element_children[0].selector_and_children(remove_id: false))
280
+ .to eq(
281
+ ['div#thecontents.preface-one',
282
+ ['h1#heading_index_1', 'title.']
283
+ ]
284
+ )
285
+ end
295
286
 
296
- it 'should convert article with other notation' do
297
- text = "arti {\n in the article.\n}"
298
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
299
- converted = noramark.html
300
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
301
- expect(body.element_children[0].selector_and_children).to eq(
302
- ['article',
303
- ['div.pgroup',
304
- ['p', 'in the article.']
305
- ]
306
- ]
307
- )
287
+ it 'parse nested div' do
288
+ text = "d.preface {\n outer div. \n d.nested {\n nested!\n}\nouter div again.\n}"
289
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
290
+ converted = noramark.html
291
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
292
+ expect(body.element_children[0].selector_and_children)
293
+ .to eq(
294
+ ['div.preface',
295
+ ['div.pgroup',
296
+ ['p', 'outer div.']
297
+ ],
298
+ ['div.nested',
299
+ ['div.pgroup',
300
+ ['p', 'nested!']
301
+ ]
302
+ ],
303
+ ['div.pgroup',
304
+ ['p', 'outer div again.']
305
+ ],
306
+ ]
307
+ )
308
+ end
308
309
  end
310
+ describe 'article and section' do
311
+ it 'parse article' do
312
+ text = "art {\n in the article.\n}"
313
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
314
+ converted = noramark.html
315
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
316
+ expect(body.element_children[0].selector_and_children)
317
+ .to eq(
318
+ ['article',
319
+ ['div.pgroup',
320
+ ['p', 'in the article.']
321
+ ]
322
+ ]
323
+ )
324
+ end
309
325
 
310
- it 'should convert article with yet anther notation' do
311
- text = "article {\n in the article.\n}"
312
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
313
- converted = noramark.html
314
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
315
- expect(body.element_children[0].selector_and_children).to eq(
316
- ['article',
317
- ['div.pgroup',
318
- ['p', 'in the article.']
319
- ]
320
- ]
321
- )
322
- end
326
+ it 'parse article with other notation' do
327
+ text = "arti {\n in the article.\n}"
328
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
329
+ converted = noramark.html
330
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
331
+ expect(body.element_children[0].selector_and_children)
332
+ .to eq(
333
+ ['article',
334
+ ['div.pgroup',
335
+ ['p', 'in the article.']
336
+ ]
337
+ ]
338
+ )
339
+ end
323
340
 
324
- it 'should convert section ' do
325
- text = "art {\nsec {\n section in the article. \n}\n}"
326
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
327
- converted = noramark.html
328
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
329
- expect(body.element_children[0].selector_and_children).to eq(
330
- ['article',
331
- ['section',
332
- ['div.pgroup',
333
- ['p', 'section in the article.']
334
- ]
335
- ]
336
- ]
337
- )
338
- end
341
+ it 'parse article with yet anther notation' do
342
+ text = "article {\n in the article.\n}"
343
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
344
+ converted = noramark.html
345
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
346
+ expect(body.element_children[0].selector_and_children)
347
+ .to eq(
348
+ ['article',
349
+ ['div.pgroup',
350
+ ['p', 'in the article.']
351
+ ]
352
+ ]
353
+ )
354
+ end
339
355
 
340
- it 'should convert section with other notation' do
341
- text = "art {\nsect {\n section in the article. \n}\n}"
342
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
343
- converted = noramark.html
344
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
345
- expect(body.element_children[0].selector_and_children).to eq(
346
- ['article',
347
- ['section',
348
- ['div.pgroup',
349
- ['p', 'section in the article.']
350
- ]
351
- ]
352
- ]
353
- )
354
- end
356
+ it 'parse section ' do
357
+ text = "art {\nsec {\n section in the article. \n}\n}"
358
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
359
+ converted = noramark.html
360
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
361
+ expect(body.element_children[0].selector_and_children)
362
+ .to eq(
363
+ ['article',
364
+ ['section',
365
+ ['div.pgroup',
366
+ ['p', 'section in the article.']
367
+ ]
368
+ ]
369
+ ]
370
+ )
371
+ end
355
372
 
356
- it 'should convert section with yet other notation' do
357
- text = "art {\nsection {\n section in the article. \n}\n}"
358
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
359
- converted = noramark.html
360
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
361
- expect(body.element_children[0].selector_and_children).to eq(
362
- ['article',
363
- ['section',
364
- ['div.pgroup',
365
- ['p', 'section in the article.']
366
- ]
367
- ]
368
- ]
369
- )
370
- end
373
+ it 'parse section with other notation' do
374
+ text = "art {\nsect {\n section in the article. \n}\n}"
375
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
376
+ converted = noramark.html
377
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
378
+ expect(body.element_children[0].selector_and_children)
379
+ .to eq(
380
+ ['article',
381
+ ['section',
382
+ ['div.pgroup',
383
+ ['p', 'section in the article.']
384
+ ]
385
+ ]
386
+ ]
387
+ )
388
+ end
371
389
 
372
- it 'should handle block image' do
373
- text = "this is normal line.\nimage(./image1.jpg, \"alt text\"): caption text"
374
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
375
- converted = noramark.html
376
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
377
- expect(body.element_children[0].selector_and_children).to eq(
378
- ['div.pgroup',
379
- ['p', 'this is normal line.']
380
- ]
381
- )
382
- expect(body.element_children[1].selector_and_children).to eq(
383
- ['div.img-wrap',
384
- ["img[src='./image1.jpg'][alt='alt text']", ''],
385
- ['p', 'caption text']
386
- ]
387
- )
390
+ it 'parse section with yet other notation' do
391
+ text = "art {\nsection {\n section in the article. \n}\n}"
392
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
393
+ converted = noramark.html
394
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
395
+ expect(body.element_children[0].selector_and_children)
396
+ .to eq(
397
+ ['article',
398
+ ['section',
399
+ ['div.pgroup',
400
+ ['p', 'section in the article.']
401
+ ]
402
+ ]
403
+ ]
404
+ )
405
+ end
388
406
  end
407
+ describe 'other block command' do
408
+ it 'handle block image' do
409
+ text = "this is normal line.\nimage(./image1.jpg, \"alt text\"): caption text"
410
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
411
+ converted = noramark.html
412
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
413
+ expect(body.element_children[0].selector_and_children)
414
+ .to eq(
415
+ ['div.pgroup',
416
+ ['p', 'this is normal line.']
417
+ ]
418
+ )
419
+ expect(body.element_children[1].selector_and_children)
420
+ .to eq(
421
+ ['figure.img-wrap',
422
+ ["img[src='./image1.jpg'][alt='alt text']", ''],
423
+ ['figcaption', 'caption text']
424
+ ]
425
+ )
426
+ end
389
427
 
390
- it 'should handle block image with before caption' do
391
- text = "this is normal line.\nimage(./image1.jpg, alt text)[caption_before: true]: caption text"
392
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
393
- converted = noramark.html
394
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
395
- expect(body.element_children[0].selector_and_children).to eq(
396
- ['div.pgroup',
397
- ['p', 'this is normal line.']
398
- ]
399
- )
400
- expect(body.element_children[1].selector_and_children).to eq(
401
- ['div.img-wrap',
402
- ['p', 'caption text'],
403
- ["img[src='./image1.jpg'][alt='alt text']", '']
404
- ]
405
- )
406
- end
428
+ it 'handle block image with before caption' do
429
+ text = "this is normal line.\nimage(./image1.jpg, alt text)[caption_before: 'true']: caption text"
430
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
431
+ converted = noramark.html
432
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
433
+ expect(body.element_children[0].selector_and_children)
434
+ .to eq(
435
+ ['div.pgroup',
436
+ ['p', 'this is normal line.']
437
+ ]
438
+ )
439
+ expect(body.element_children[1].selector_and_children)
440
+ .to eq(
441
+ ['figure.img-wrap',
442
+ ['figcaption', 'caption text'],
443
+ ["img[src='./image1.jpg'][alt='alt text']", '']
444
+ ]
445
+ )
446
+ end
407
447
 
408
- it 'should handle block image without caption' do
409
- text = "this is normal line.\nimage(./image1.jpg, alt text):"
410
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
411
- converted = noramark.html
412
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
413
- expect(body.element_children[0].selector_and_children).to eq(
414
- ['div.pgroup',
415
- ['p', 'this is normal line.']
416
- ]
417
- )
418
- expect(body.element_children[1].selector_and_children).to eq(
419
- ['div.img-wrap',
420
- ["img[src='./image1.jpg'][alt='alt text']", '']
421
- ]
422
- )
423
- end
448
+ it 'handle block image without caption' do
449
+ text = "this is normal line.\nimage(./image1.jpg, alt text):"
450
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
451
+ converted = noramark.html
452
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
453
+ expect(body.element_children[0].selector_and_children)
454
+ .to eq(
455
+ ['div.pgroup',
456
+ ['p', 'this is normal line.']
457
+ ]
458
+ )
459
+ expect(body.element_children[1].selector_and_children)
460
+ .to eq(
461
+ ['figure.img-wrap',
462
+ ["img[src='./image1.jpg'][alt='alt text']", '']
463
+ ]
464
+ )
465
+ end
424
466
 
425
- it 'should handle page change article' do
426
- text = "this is start.\nnewpage(page changed):\nthis is second page.\nnewpage:\nand the third."
427
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
428
- converted = noramark.html
429
- expect(converted.size).to eq 3
430
- body1 = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
431
- expect(body1.element_children[0].selector_and_children).to eq(
432
- ['div.pgroup',
433
- ['p', 'this is start.']
434
- ]
435
- )
436
-
437
- head2 = Nokogiri::XML::Document.parse(converted[1]).root.at_xpath('xmlns:head')
438
- expect(head2.element_children[0].a).to eq ['title', 'page changed']
439
- body2 = Nokogiri::XML::Document.parse(converted[1]).root.at_xpath('xmlns:body')
440
- expect(body2.element_children[0].selector_and_children).to eq(
441
- ['div.pgroup',
442
- ['p', 'this is second page.']
443
- ]
444
- )
445
-
446
- head3 = Nokogiri::XML::Document.parse(converted[2]).root.at_xpath('xmlns:head')
447
- expect(head3.element_children[0].a).to eq ['title', 'page changed']
448
- body3 = Nokogiri::XML::Document.parse(converted[2]).root.at_xpath('xmlns:body')
449
- expect(body3.element_children[0].selector_and_children).to eq(
450
- ['div.pgroup',
451
- ['p', 'and the third.']
452
- ]
453
- )
454
- end
467
+ it 'handle page change article' do
468
+ text = "this is start.\nnewpage:\n---\ntitle: page changed\n---\n\nthis is second page.\nnewpage:\nand the third."
469
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
470
+ converted = noramark.html
471
+ expect(converted.size).to eq 3
472
+ body1 = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
473
+ expect(body1.element_children[0].selector_and_children)
474
+ .to eq(
475
+ ['div.pgroup',
476
+ ['p', 'this is start.']
477
+ ]
478
+ )
479
+
480
+ head2 = Nokogiri::XML::Document.parse(converted[1]).root.at_xpath('xmlns:head')
481
+ expect(head2.element_children[0].a).to eq ['title', 'page changed']
482
+ body2 = Nokogiri::XML::Document.parse(converted[1]).root.at_xpath('xmlns:body')
483
+ expect(body2.element_children[0].selector_and_children)
484
+ .to eq(
485
+ ['div.pgroup',
486
+ ['p', 'this is second page.']
487
+ ]
488
+ )
489
+
490
+ head3 = Nokogiri::XML::Document.parse(converted[2]).root.at_xpath('xmlns:head')
491
+ expect(head3.element_children[0].a).to eq ['title', 'page changed']
492
+ body3 = Nokogiri::XML::Document.parse(converted[2]).root.at_xpath('xmlns:body')
493
+ expect(body3.element_children[0].selector_and_children)
494
+ .to eq(
495
+ ['div.pgroup',
496
+ ['p', 'and the third.']
497
+ ]
498
+ )
499
+ end
455
500
 
456
- it 'should handle stylesheets' do
457
- text = "d.styled {\n this is styled document.\n}"
458
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the document title', stylesheets: ['reset.css', 'mystyle.css'])
459
- converted = noramark.html
460
- head = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:head')
461
- expect(head.element_children[0].a).to eq ['title', 'the document title']
462
- expect(head.element_children[1].a).to eq ["link[rel='stylesheet'][type='text/css'][href='reset.css']", '']
463
- expect(head.element_children[2].a).to eq ["link[rel='stylesheet'][type='text/css'][href='mystyle.css']", '']
464
- end
501
+ it 'handle stylesheets' do
502
+ text = "d.styled {\n this is styled document.\n}"
503
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the document title', stylesheets: ['reset.css', 'mystyle.css'])
504
+ converted = noramark.html
505
+ head = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:head')
506
+ expect(head.element_children[0].a).to eq ['title', 'the document title']
507
+ expect(head.element_children[1].a).to eq ["link[rel='stylesheet'][type='text/css'][href='reset.css']", '']
508
+ expect(head.element_children[2].a).to eq ["link[rel='stylesheet'][type='text/css'][href='mystyle.css']", '']
509
+ end
465
510
 
466
- it 'should handle link' do
467
- text = " link to [link(http://github.com/skoji/noramark){noramark repository}]. \ncan you see this?"
468
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
469
- converted = noramark.html
470
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
471
- expect(body.element_children[0].selector_and_children).to eq(
472
- ['div.pgroup',
473
- ['p',
474
- 'link to ',
475
- ["a[href='http://github.com/skoji/noramark']", 'noramark repository'],
476
- '.'
477
- ],
478
- ['p', 'can you see this?']
479
- ]
480
- )
481
- end
511
+ it 'handle custom paragraph' do
512
+ text = "this is normal line.\np.custom: this text is in custom class."
513
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
514
+ converted = noramark.html
515
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
516
+ expect(body.element_children[0].selector_and_children)
517
+ .to eq(
518
+ ['div.pgroup',
519
+ ['p', 'this is normal line.'],
520
+ ['p.custom', 'this text is in custom class.']
521
+ ]
522
+ )
523
+ end
482
524
 
483
- it 'should handle link with l' do
484
- text = "link to [l(http://github.com/skoji/noramark){noramark repository}]. \ncan you see this?"
485
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
486
- converted = noramark.html
487
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
488
- expect(body.element_children[0].selector_and_children).to eq(
489
- ['div.pgroup',
490
- ['p',
491
- 'link to ',
492
- ["a[href='http://github.com/skoji/noramark']", 'noramark repository'],
493
- '.'
494
- ],
495
- ['p', 'can you see this?']
496
- ]
497
- )
498
- end
525
+ it 'handle any block' do
526
+ text = "this is normal line.\ncite {\n this block should be in cite. \n}"
527
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
528
+ converted = noramark.html
529
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
530
+ expect(body.element_children[0].selector_and_children)
531
+ .to eq(
532
+ ['div.pgroup',
533
+ ['p', 'this is normal line.']
534
+ ]
535
+ )
536
+ expect(body.element_children[1].selector_and_children)
537
+ .to eq(
538
+ ['cite',
539
+ ['div.pgroup',
540
+ ['p', 'this block should be in cite.']
541
+ ]
542
+ ]
543
+ )
544
+ end
545
+ it 'convert h1 in article after title' do
546
+ text = "---\nstylesheets: css/default.css\ntitle: foo\n---\narticle.atogaki {\n\nh1: あとがき。\n\natogaki\n}"
547
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
548
+ converted = noramark.html
549
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
550
+ expect(body.element_children[0].selector_and_children)
551
+ .to eq(
552
+ ["article.atogaki",
553
+ ["h1", "あとがき。"],
554
+ ["div.pgroup",
555
+ ["p", "atogaki"]]]
556
+ )
557
+ end
499
558
 
500
- it 'should handle custom paragraph' do
501
- text = "this is normal line.\np.custom: this text is in custom class."
502
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
503
- converted = noramark.html
504
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
505
- expect(body.element_children[0].selector_and_children).to eq(
506
- ['div.pgroup',
507
- ['p', 'this is normal line.'],
508
- ['p.custom', 'this text is in custom class.']
509
- ]
510
- )
511
559
  end
560
+ describe 'inline' do
561
+ it 'handle link' do
562
+ text = " link to [link(http://github.com/skoji/noramark){noramark repository}]. \ncan you see this?"
563
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
564
+ converted = noramark.html
565
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
566
+ expect(body.element_children[0].selector_and_children)
567
+ .to eq(
568
+ ['div.pgroup',
569
+ ['p',
570
+ 'link to ',
571
+ ["a[href='http://github.com/skoji/noramark']", 'noramark repository'],
572
+ '.'
573
+ ],
574
+ ['p', 'can you see this?']
575
+ ]
576
+ )
577
+ end
512
578
 
513
- it 'should handle span' do
514
- text = "p.custom: this text is in [s.keyword{custom}] class."
515
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
516
- converted = noramark.html
517
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
518
- expect(body.element_children[0].selector_and_children).to eq(
519
- ['div.pgroup',
520
- ['p.custom', 'this text is in ', ['span.keyword', 'custom'], ' class.'
521
- ]]
522
- )
523
- end
579
+ it 'handle link with l' do
580
+ text = "link to [l(http://github.com/skoji/noramark){noramark repository}]. \ncan you see this?"
581
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
582
+ converted = noramark.html
583
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
584
+ expect(body.element_children[0].selector_and_children)
585
+ .to eq(
586
+ ['div.pgroup',
587
+ ['p',
588
+ 'link to ',
589
+ ["a[href='http://github.com/skoji/noramark']", 'noramark repository'],
590
+ '.'
591
+ ],
592
+ ['p', 'can you see this?']
593
+ ]
594
+ )
595
+ end
524
596
 
525
- it 'should handle any block' do
526
- text = "this is normal line.\ncite {\n this block should be in cite. \n}"
527
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
528
- converted = noramark.html
529
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
530
- expect(body.element_children[0].selector_and_children).to eq(
531
- ['div.pgroup',
532
- ['p', 'this is normal line.']
533
- ]
534
- )
535
- expect(body.element_children[1].selector_and_children).to eq(
536
- ['cite',
537
- ['div.pgroup',
538
- ['p', 'this block should be in cite.']
539
- ]
540
- ]
541
- )
542
- end
597
+ it 'handle span' do
598
+ text = "p.custom: this text is in [sp.keyword{custom}] class."
599
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
600
+ converted = noramark.html
601
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
602
+ expect(body.element_children[0].selector_and_children)
603
+ .to eq(
604
+ ['div.pgroup',
605
+ ['p.custom', 'this text is in ', ['span.keyword', 'custom'], ' class.'
606
+ ]]
607
+ )
608
+ end
543
609
 
544
- it 'should handle inline image' do
545
- text = "simple image [img(./image1.jpg, alt)]."
546
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
547
- converted = noramark.html
548
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
549
- expect(body.element_children[0].selector_and_children).to eq(
550
- ['div.pgroup',
551
- ['p',
552
- 'simple image ', ["img[src='./image1.jpg'][alt='alt']", ''], '.']]
553
- )
554
- end
610
+ it 'handle inline image' do
611
+ text = "simple image [img(./image1.jpg, alt)]."
612
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
613
+ converted = noramark.html
614
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
615
+ expect(body.element_children[0].selector_and_children)
616
+ .to eq(
617
+ ['div.pgroup',
618
+ ['p',
619
+ 'simple image ', ["img[src='./image1.jpg'][alt='alt']", ''], '.']]
620
+ )
621
+ end
555
622
 
556
- it 'should handle any inline' do
557
- text = "should be [strong{marked as strong}]."
558
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
559
- converted = noramark.html
560
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
561
- expect(body.element_children[0].selector_and_children).to eq(
562
- ['div.pgroup',
563
- ['p', 'should be ', ['strong', 'marked as strong'],'.']]
564
- )
565
- end
623
+ it 'handle any inline' do
624
+ text = "should be [strong{marked as strong}]."
625
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
626
+ converted = noramark.html
627
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
628
+ expect(body.element_children[0].selector_and_children)
629
+ .to eq(
630
+ ['div.pgroup',
631
+ ['p', 'should be ', ['strong', 'marked as strong'],'.']]
632
+ )
633
+ end
566
634
 
567
- it 'should convert inline command within line block' do
568
- text = "h1: [tcy{20}]縦中横タイトル"
569
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
570
- converted = noramark.html
571
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
572
- expect(body.element_children[0].selector_and_children).to eq ['h1', ['span.tcy', '20'], '縦中横タイトル']
573
- end
635
+ it 'convert inline command within line block' do
636
+ text = "h1: [tcy{20}]縦中横タイトル"
637
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
638
+ converted = noramark.html
639
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
640
+ expect(body.element_children[0].selector_and_children).to eq ['h1', ['span.tcy', '20'], '縦中横タイトル']
641
+ end
574
642
 
575
- it 'should handle ruby' do
576
- text = "[ruby(とんぼ){蜻蛉}]の[ruby(めがね){眼鏡}]はみずいろめがね"
577
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
578
- converted = noramark.html
579
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
580
- expect(body.element_children[0].selector_and_children).to eq ['div.pgroup', ['p',
581
- ['ruby', '蜻蛉', ['rp','('],['rt','とんぼ'],['rp', ')']],
582
- 'の',
583
- ['ruby', '眼鏡', ['rp','('],['rt','めがね'],['rp', ')']],
584
- 'はみずいろめがね']]
585
- end
643
+ it 'handle ruby' do
644
+ text = "[ruby(とんぼ){蜻蛉}]の[ruby(めがね){眼鏡}]はみずいろめがね"
645
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
646
+ converted = noramark.html
647
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
648
+ expect(body.element_children[0].selector_and_children).to eq ['div.pgroup', ['p',
649
+ ['ruby', '蜻蛉', ['rp','('],['rt','とんぼ'],['rp', ')']],
650
+ 'の',
651
+ ['ruby', '眼鏡', ['rp','('],['rt','めがね'],['rp', ')']],
652
+ 'はみずいろめがね']]
653
+ end
586
654
 
587
- it 'should handle tatechuyoko' do
588
- text = "[tcy{10}]年前のことだった"
589
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
590
- converted = noramark.html
591
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
592
- expect(body.element_children[0].selector_and_children).to eq(
593
- ['div.pgroup',
594
- ['p', ['span.tcy', '10'], '年前のことだった']
595
- ])
596
- end
655
+ it 'handle tatechuyoko' do
656
+ text = "[tcy{10}]年前のことだった"
657
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
658
+ converted = noramark.html
659
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
660
+ expect(body.element_children[0].selector_and_children)
661
+ .to eq(
662
+ ['div.pgroup',
663
+ ['p', ['span.tcy', '10'], '年前のことだった']
664
+ ])
665
+ end
597
666
 
598
- it 'should handle ordered list ' do
599
- text = "this is normal line.\n1: for the 1st.\n2: secondly, blah.\n3: and last...\nthe ordered list ends."
600
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
601
- converted = noramark.html
602
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
603
- expect(body.element_children.size).to eq 3
604
- expect(body.element_children[0].selector_and_children).to eq(
605
- ['div.pgroup',
606
- ['p', 'this is normal line.']
607
- ])
608
- expect(body.element_children[1].selector_and_children).to eq(
609
- ['ol',
610
- ['li', 'for the 1st.'],
611
- ['li', 'secondly, blah.'],
612
- ['li', 'and last...']
613
- ])
614
- expect(body.element_children[2].selector_and_children).to eq(
615
- ['div.pgroup',
616
- ['p', 'the ordered list ends.']
617
- ])
667
+ it 'handle code inline' do
668
+ text = "`this is inside code and [s{will not parsed}]`. you see?"
669
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
670
+ converted = noramark.html
671
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
672
+ expect(body.element_children[0].selector_and_children)
673
+ .to eq(
674
+ ['div.pgroup',
675
+ ['p', ['code', 'this is inside code and [s{will not parsed}]'], '. you see?']
676
+ ])
677
+ end
678
+ it 'handle code escaped inline' do
679
+ text = "\\`this is not inside code and [strong{will be parsed}]\\`. you see?"
680
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
681
+ converted = noramark.html
682
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
683
+ expect(body.element_children[0].selector_and_children)
684
+ .to eq(
685
+ ['div.pgroup',
686
+ ['p', '`this is not inside code and ', ['strong', 'will be parsed'], '`. you see?']
687
+ ])
688
+ end
689
+ it 'handle code inline (long format)' do
690
+ text = "[code.the-class{this is inside code and `backquote will not be parsed`}]. you see?"
691
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
692
+ converted = noramark.html
693
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
694
+ expect(body.element_children[0].selector_and_children)
695
+ .to eq(
696
+ ['div.pgroup',
697
+ ['p', ['code.the-class', 'this is inside code and `backquote will not be parsed`'], '. you see?']
698
+ ])
699
+ end
618
700
  end
701
+ describe 'list' do
702
+ it 'handle ordered list ' do
703
+ text = "this is normal line.\n1. for the 1st.\n2. secondly, blah.\n3. and last...\nthe ordered list ends."
704
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
705
+ converted = noramark.html
706
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
707
+ expect(body.element_children.size).to eq 3
708
+ expect(body.element_children[0].selector_and_children)
709
+ .to eq(
710
+ ['div.pgroup',
711
+ ['p', 'this is normal line.']
712
+ ])
713
+ expect(body.element_children[1].selector_and_children)
714
+ .to eq(
715
+ ['ol',
716
+ ['li', 'for the 1st.'],
717
+ ['li', 'secondly, blah.'],
718
+ ['li', 'and last...']
719
+ ])
720
+ expect(body.element_children[2].selector_and_children)
721
+ .to eq(
722
+ ['div.pgroup',
723
+ ['p', 'the ordered list ends.']
724
+ ])
725
+ end
619
726
 
620
- it 'should handle unordered list ' do
621
- text = "this is normal line.\n*: for the 1st.\n*: secondly, blah.\n*: and last...\nthe ordered list ends."
622
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
623
- converted = noramark.html
624
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
625
- expect(body.element_children.size).to eq 3
626
- expect(body.element_children[0].selector_and_children).to eq(
627
- ['div.pgroup',
628
- ['p', 'this is normal line.']
629
- ])
630
- expect(body.element_children[1].selector_and_children).to eq(
631
- ['ul',
632
- ['li', 'for the 1st.'],
633
- ['li', 'secondly, blah.'],
634
- ['li', 'and last...']
635
- ])
636
- expect(body.element_children[2].selector_and_children).to eq(
637
- ['div.pgroup',
638
- ['p', 'the ordered list ends.']
639
- ])
640
- end
727
+ it 'handle unordered list ' do
728
+ text = "this is normal line.\n* for the 1st.\n* secondly, blah.\n* and last...\nthe ordered list ends."
729
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
730
+ converted = noramark.html
731
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
732
+ expect(body.element_children.size).to eq 3
733
+ expect(body.element_children[0].selector_and_children)
734
+ .to eq(
735
+ ['div.pgroup',
736
+ ['p', 'this is normal line.']
737
+ ])
738
+ expect(body.element_children[1].selector_and_children)
739
+ .to eq(
740
+ ['ul',
741
+ ['li', 'for the 1st.'],
742
+ ['li', 'secondly, blah.'],
743
+ ['li', 'and last...']
744
+ ])
745
+ expect(body.element_children[2].selector_and_children)
746
+ .to eq(
747
+ ['div.pgroup',
748
+ ['p', 'the ordered list ends.']
749
+ ])
750
+ end
641
751
 
642
- it 'should handle definition list ' do
643
- text = "this is normal line.\n;: 1st : this is the first definition\n;: 2nd : blah :blah.\n;: 3rd: this term is the last.\nthe list ends."
644
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
645
- converted = noramark.html
646
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
647
- expect(body.element_children.size).to eq 3
648
- expect(body.element_children[0].selector_and_children).to eq(
649
- ['div.pgroup',
650
- ['p', 'this is normal line.']
651
- ])
652
- expect(body.element_children[1].selector_and_children).to eq(
653
- ['dl',
654
- ['dt', '1st'],['dd', 'this is the first definition'],
655
- ['dt', '2nd'],['dd', 'blah :blah.'],
656
- ['dt', '3rd'],['dd', 'this term is the last.'],
657
- ])
658
- expect(body.element_children[2].selector_and_children).to eq(
659
- ['div.pgroup',
660
- ['p', 'the list ends.']
661
- ])
662
- end
752
+ it 'handle nested unordered list ' do
753
+ text = "this is normal line.\n* for the 1st.\n** nested.\n* and last...\nthe ordered list ends."
754
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
755
+ converted = noramark.html
756
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
757
+ expect(body.element_children.size).to eq 3
758
+ expect(body.element_children[0].selector_and_children)
759
+ .to eq(
760
+ ['div.pgroup',
761
+ ['p', 'this is normal line.']
762
+ ])
763
+ expect(body.element_children[1].selector_and_children)
764
+ .to eq(
765
+ ['ul',
766
+ ['li', 'for the 1st.',
767
+ ['ul',
768
+ ['li', 'nested.']]],
769
+ ['li', 'and last...']
770
+ ])
771
+ expect(body.element_children[2].selector_and_children)
772
+ .to eq(
773
+ ['div.pgroup',
774
+ ['p', 'the ordered list ends.']
775
+ ])
776
+ end
663
777
 
664
- it 'should handle long definition list ' do
665
- text = "this is normal line.\n;: 1st {\n this is the first definition\n}\n;: 2nd { \nblah :blah.\n}\n;: 3rd{\n this term is the last.\n}\nthe list ends."
666
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
667
- converted = noramark.html
668
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
669
- expect(body.element_children.size).to eq 3
670
- expect(body.element_children[0].selector_and_children).to eq(
671
- ['div.pgroup',
672
- ['p', 'this is normal line.']
673
- ])
674
- expect(body.element_children[1].selector_and_children).to eq(
675
- ['dl',
676
- ['dt', '1st'],['dd', ['div.pgroup', ['p', 'this is the first definition']]],
677
- ['dt', '2nd'],['dd', ['div.pgroup', ['p', 'blah :blah.']]],
678
- ['dt', '3rd'],['dd', ['div.pgroup', ['p', 'this term is the last.']]]
679
- ])
680
- expect(body.element_children[2].selector_and_children).to eq(
681
- ['div.pgroup',
682
- ['p', 'the list ends.']
683
- ])
684
- end
778
+ it 'handle definition list ' do
779
+ text = "this is normal line.\n;: 1st : this is the first definition\n;: 2nd : blah :blah.\n;: 3rd: this term is the last.\nthe list ends."
780
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
781
+ converted = noramark.html
782
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
783
+ expect(body.element_children.size).to eq 3
784
+ expect(body.element_children[0].selector_and_children)
785
+ .to eq(
786
+ ['div.pgroup',
787
+ ['p', 'this is normal line.']
788
+ ])
789
+ expect(body.element_children[1].selector_and_children)
790
+ .to eq(
791
+ ['dl',
792
+ ['dt', '1st'],['dd', 'this is the first definition'],
793
+ ['dt', '2nd'],['dd', 'blah :blah.'],
794
+ ['dt', '3rd'],['dd', 'this term is the last.'],
795
+ ])
796
+ expect(body.element_children[2].selector_and_children)
797
+ .to eq(
798
+ ['div.pgroup',
799
+ ['p', 'the list ends.']
800
+ ])
801
+ end
685
802
 
686
- it 'should escape html' do
687
- text = ";:definition<div>:</div>&"
688
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
689
- converted = noramark.html
690
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
691
- expect(body.element_children[0].selector_and_children).to eq(
692
- ['dl',
693
- ['dt', 'definition<div>'],['dd', '</div>&']
694
- ])
803
+ it 'handle long definition list ' do
804
+ text = "this is normal line.\n;: 1st {\n this is the first definition\n}\n;: 2nd { \nblah :blah.\n}\n;: 3rd{\n this term is the last.\n}\nthe list ends."
805
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
806
+ converted = noramark.html
807
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
808
+ expect(body.element_children.size).to eq 3
809
+ expect(body.element_children[0].selector_and_children)
810
+ .to eq(
811
+ ['div.pgroup',
812
+ ['p', 'this is normal line.']
813
+ ])
814
+ expect(body.element_children[1].selector_and_children)
815
+ .to eq(
816
+ ['dl',
817
+ ['dt', '1st'],['dd', ['div.pgroup', ['p', 'this is the first definition']]],
818
+ ['dt', '2nd'],['dd', ['div.pgroup', ['p', 'blah :blah.']]],
819
+ ['dt', '3rd'],['dd', ['div.pgroup', ['p', 'this term is the last.']]]
820
+ ])
821
+ expect(body.element_children[2].selector_and_children)
822
+ .to eq(
823
+ ['div.pgroup',
824
+ ['p', 'the list ends.']
825
+ ])
826
+ end
827
+ it 'escape html in definition list' do
828
+ text = ";:definition<div>:</div>"
829
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
830
+ converted = noramark.html
831
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
832
+ expect(body.element_children[0].selector_and_children)
833
+ .to eq(
834
+ ['dl',
835
+ ['dt', 'definition<div>'],['dd', '</div>']
836
+ ])
837
+ end
695
838
  end
696
-
697
- it 'should specify stylesheets' do
698
- text = <<EOF
839
+
840
+ describe 'metadata' do
841
+ it 'specify stylesheets' do
842
+ text = <<EOF
699
843
  ---
700
844
  stylesheets: [ css/default.css, css/specific.css, [ css/iphone.css, 'only screen and (min-device-width : 320px) and (max-device-width : 480px)']]
701
845
  ---
702
846
  text.
703
847
 
704
848
  EOF
705
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the document title')
706
- converted = noramark.html
707
- head = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:head')
708
- expect(head.element_children[0].a).to eq ['title', 'the document title']
709
- expect(head.element_children[1].a).to eq ["link[rel='stylesheet'][type='text/css'][href='css/default.css']", '']
710
- expect(head.element_children[2].a).to eq ["link[rel='stylesheet'][type='text/css'][href='css/specific.css']", '']
711
- expect(head.element_children[3].a).to eq ["link[rel='stylesheet'][type='text/css'][media='only screen and (min-device-width : 320px) and (max-device-width : 480px)'][href='css/iphone.css']", '']
849
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the document title')
850
+ converted = noramark.html
851
+ head = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:head')
852
+ expect(head.element_children[0].a).to eq ['title', 'the document title']
853
+ expect(head.element_children[1].a).to eq ["link[rel='stylesheet'][type='text/css'][href='css/default.css']", '']
854
+ expect(head.element_children[2].a).to eq ["link[rel='stylesheet'][type='text/css'][href='css/specific.css']", '']
855
+ expect(head.element_children[3].a).to eq ["link[rel='stylesheet'][type='text/css'][media='only screen and (min-device-width : 320px) and (max-device-width : 480px)'][href='css/iphone.css']", '']
712
856
 
713
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
714
- expect(body.element_children[0].selector_and_children).to eq(
715
- ['div.pgroup',
716
- ['p',
717
- 'text.']])
718
- end
857
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
858
+ expect(body.element_children[0].selector_and_children)
859
+ .to eq(
860
+ ['div.pgroup',
861
+ ['p',
862
+ 'text.']])
863
+ end
719
864
 
720
- it 'should specify title' do
721
- text = "---\ntitle: the title of the book in the text.\n---\n\ntext."
722
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
723
- converted = noramark.html
724
- head = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:head')
725
- expect(head.element_children[0].a).to eq ['title', 'the title of the book in the text.']
726
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
727
- expect(body.element_children[0].selector_and_children).to eq(
728
- ['div.pgroup',
729
- ['p',
730
- 'text.']])
865
+ it 'specify title' do
866
+ text = "---\ntitle: the title of the book in the text.\n---\n\ntext."
867
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
868
+ converted = noramark.html
869
+ head = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:head')
870
+ expect(head.element_children[0].a).to eq ['title', 'the title of the book in the text.']
871
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
872
+ expect(body.element_children[0].selector_and_children)
873
+ .to eq(
874
+ ['div.pgroup',
875
+ ['p',
876
+ 'text.']])
731
877
 
732
- end
878
+ end
733
879
 
734
- it 'should specify title on each page' do
735
- text = "---\ntitle: page1\n---\n\n1st page.\nnewpage:\n---\ntitle: page2\n---\nh1:2nd page"
736
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title', paragraph_style: :use_paragraph_group)
737
- converted = noramark.html
738
- # 1st page
739
- head = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:head')
740
- expect(head.element_children[0].a).to eq ['title', 'page1']
741
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
742
- expect(body.element_children[0].selector_and_children).to eq(
743
- ['div.pgroup',
744
- ['p',
745
- '1st page.']])
746
- # 2nd page
747
- head = Nokogiri::XML::Document.parse(converted[1]).root.at_xpath('xmlns:head')
748
- expect(head.element_children[0].a).to eq ['title', 'page2']
749
- body = Nokogiri::XML::Document.parse(converted[1]).root.at_xpath('xmlns:body')
750
- expect(body.element_children[0].selector_and_children).to eq(
751
- ['h1',"2nd page"])
752
- end
880
+ it 'specify title on each page' do
881
+ text = "---\ntitle: page1\n---\n\n1st page.\nnewpage:\n---\ntitle: page2\n---\nh1:2nd page"
882
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title', paragraph_style: :use_paragraph_group)
883
+ converted = noramark.html
753
884
 
885
+ # 1st page
886
+ head = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:head')
887
+ expect(head.element_children[0].a).to eq ['title', 'page1']
888
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
889
+ expect(body.element_children[0].selector_and_children)
890
+ .to eq(
891
+ ['div.pgroup',
892
+ ['p',
893
+ '1st page.']])
894
+ # 2nd page
895
+ head = Nokogiri::XML::Document.parse(converted[1]).root.at_xpath('xmlns:head')
896
+ expect(head.element_children[0].a).to eq ['title', 'page2']
897
+ body = Nokogiri::XML::Document.parse(converted[1]).root.at_xpath('xmlns:body')
898
+ expect(body.element_children[0].selector_and_children)
899
+ .to eq(
900
+ ['h1',"2nd page"])
901
+ end
754
902
 
755
- it 'should ignore comments' do
756
- text = "# この行はコメントです\nここから、パラグラフがはじまります。\n # これもコメント\n「二行目です。」\n三行目です。\n\n# これもコメント\n\n ここから、次のパラグラフです。\n#最後のコメントです"
757
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
758
- converted = noramark.html
759
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
760
- expect(body.element_children.size).to eq 2
761
-
762
- expect(body.element_children[0].selector_and_children).to eq(
763
- ['div.pgroup',
764
- ['p', 'ここから、パラグラフがはじまります。'],
765
- ['p.noindent', '「二行目です。」'],
766
- ['p', '三行目です。']
767
- ]
768
- )
769
-
770
- expect(body.element_children[1].selector_and_children).to eq(
771
- ['div.pgroup',
772
- ['p', 'ここから、次のパラグラフです。']]
773
- )
774
- end
903
+ it 'ignore comments' do
904
+ text = "// この行はコメントです\nここから、パラグラフがはじまります。\n // これもコメント\n「二行目です。」\n三行目です。\n\n// これもコメント\n\n ここから、次のパラグラフです。\n// 最後のコメントです"
905
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
906
+ converted = noramark.html
907
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
908
+ expect(body.element_children.size).to eq 2
775
909
 
776
- it 'should handle preprocessor' do
777
- text = "pre-preprocess text"
778
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title') do
779
- |nora|
780
- nora.preprocessor do
781
- |text|
782
- text.gsub('pre-preprocess', 'post-process')
783
- end
910
+ expect(body.element_children[0].selector_and_children)
911
+ .to eq(
912
+ ['div.pgroup',
913
+ ['p', 'ここから、パラグラフがはじまります。'],
914
+ ['p.noindent', '「二行目です。」'],
915
+ ['p', '三行目です。']
916
+ ]
917
+ )
918
+
919
+ expect(body.element_children[1].selector_and_children)
920
+ .to eq(
921
+ ['div.pgroup',
922
+ ['p', 'ここから、次のパラグラフです。']]
923
+ )
784
924
  end
785
- converted = noramark.html
786
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
787
- expect(body.element_children[0].selector_and_children).to eq(
788
- ['div.pgroup',
789
- ['p', 'post-process text'],
790
- ]
791
- )
792
- end
793
925
 
794
- it 'should convert h1 in article after title' do
795
- text = "---\nstylesheets: css/default.css\ntitle: foo\n---\narticle.atogaki {\n\nh1: あとがき。\n\natogaki\n}"
796
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
797
- converted = noramark.html
798
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
799
- expect(body.element_children[0].selector_and_children).to eq(
800
- ["article.atogaki",
801
- ["h1", "あとがき。"],
802
- ["div.pgroup",
803
- ["p", "atogaki"]]]
804
- )
926
+ it 'handle preprocessor' do
927
+ text = "pre-preprocess text"
928
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title') do
929
+ |nora|
930
+ nora.preprocessor do
931
+ |t|
932
+ t.gsub('pre-preprocess', 'post-process')
933
+ end
934
+ end
935
+ converted = noramark.html
936
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
937
+ expect(body.element_children[0].selector_and_children)
938
+ .to eq(
939
+ ['div.pgroup',
940
+ ['p', 'post-process text'],
941
+ ]
942
+ )
943
+ end
805
944
  end
806
945
 
807
- it 'should convert preformatted text' do
808
- text = <<EOF
946
+ describe 'preformatted' do
947
+ it 'convert preformatted text' do
948
+ text = <<EOF
809
949
  normal line.
810
950
  pre {//
811
951
  d {
812
952
  this will not converted to div or p or pgroup.
953
+
813
954
  line_command: this will be not converted too.
814
955
  }
815
956
  //}
957
+ normal line again.
816
958
  EOF
817
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
818
- converted = noramark.html
819
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
820
- expect(body.element_children[0].selector_and_children).to eq(["div.pgroup", ["p", "normal line."]])
821
- expect(body.element_children[1].selector_and_children).to eq(["pre", "d {\n this will not converted to div or p or pgroup.\nline_command: this will be not converted too.\n}"])
822
- end
959
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
960
+ converted = noramark.html
961
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
962
+ expect(body.element_children[0].selector_and_children)
963
+ .to eq(["div.pgroup", ["p", "normal line."]])
964
+ expect(body.element_children[1].selector_and_children)
965
+ .to eq(["pre", "d {\n this will not converted to div or p or pgroup.\n\nline_command: this will be not converted too.\n}"])
966
+ expect(body.element_children[2].selector_and_children)
967
+ .to eq(["div.pgroup", ["p", "normal line again."]])
968
+ end
823
969
 
824
- it 'should convert preformatted code' do
825
- text = <<EOF
970
+ it 'should convert preformatted code' do
971
+ text = <<EOF
826
972
  normal line.
827
973
  code {//
828
974
  d {
@@ -832,16 +978,19 @@ line_command: this will be not converted too.
832
978
  //}
833
979
  normal line again.
834
980
  EOF
835
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
836
- converted = noramark.html
837
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
838
- expect(body.element_children[0].selector_and_children).to eq(["div.pgroup", ["p", "normal line."]])
839
- expect(body.element_children[1].selector_and_children).to eq(["pre", ["code", "d {\n this will not converted to div or p or pgroup.\nline_command: this will be not converted too.\n}"]])
840
- expect(body.element_children[2].selector_and_children).to eq(["div.pgroup", ["p", "normal line again."]])
841
- end
981
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
982
+ converted = noramark.html
983
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
984
+ expect(body.element_children[0].selector_and_children)
985
+ .to eq(["div.pgroup", ["p", "normal line."]])
986
+ expect(body.element_children[1].selector_and_children)
987
+ .to eq(["pre", ["code", "d {\n this will not converted to div or p or pgroup.\nline_command: this will be not converted too.\n}"]])
988
+ expect(body.element_children[2].selector_and_children)
989
+ .to eq(["div.pgroup", ["p", "normal line again."]])
990
+ end
842
991
 
843
- it 'should convert preformatted code with language' do
844
- text = <<EOF
992
+ it 'convert preformatted code with language' do
993
+ text = <<EOF
845
994
  normal line.
846
995
  code {//ruby
847
996
  # ruby code example.
@@ -849,16 +998,39 @@ code {//ruby
849
998
  //}
850
999
  normal line again.
851
1000
  EOF
852
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
853
- converted = noramark.html
854
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
855
- expect(body.element_children[0].selector_and_children).to eq(["div.pgroup", ["p", "normal line."]])
856
- expect(body.element_children[1].selector_and_children).to eq(["pre.code-ruby[data-code-language='ruby']", ["code", "# ruby code example.\n\"Hello, World\".split(',').map(&:strip).map(&:to_sym) # => [:Hello, :World]"]])
857
- expect(body.element_children[2].selector_and_children).to eq(["div.pgroup", ["p", "normal line again."]])
858
- end
1001
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
1002
+ converted = noramark.html
1003
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
1004
+ expect(body.element_children[0].selector_and_children)
1005
+ .to eq(["div.pgroup", ["p", "normal line."]])
1006
+ expect(body.element_children[1].selector_and_children)
1007
+ .to eq(["pre.code-ruby[data-code-language='ruby']", ["code", "# ruby code example.\n\"Hello, World\".split(',').map(&:strip).map(&:to_sym) # => [:Hello, :World]"]])
1008
+ expect(body.element_children[2].selector_and_children)
1009
+ .to eq(["div.pgroup", ["p", "normal line again."]])
1010
+ end
1011
+
1012
+ it 'convert preformatted code with language fence format' do
1013
+ text = <<EOF
1014
+ normal line.
1015
+ ```ruby
1016
+ # ruby code example.
1017
+ "Hello, World".split(',').map(&:strip).map(&:to_sym) # => [:Hello, :World]
1018
+ ```
1019
+ normal line again.
1020
+ EOF
1021
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
1022
+ converted = noramark.html
1023
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
1024
+ expect(body.element_children[0].selector_and_children)
1025
+ .to eq(["div.pgroup", ["p", "normal line."]])
1026
+ expect(body.element_children[1].selector_and_children)
1027
+ .to eq(["pre.code-ruby[data-code-language='ruby']", ["code", "# ruby code example.\n\"Hello, World\".split(',').map(&:strip).map(&:to_sym) # => [:Hello, :World]"]])
1028
+ expect(body.element_children[2].selector_and_children)
1029
+ .to eq(["div.pgroup", ["p", "normal line again."]])
1030
+ end
859
1031
 
860
- it 'should convert preformatted text (simple notation)' do
861
- text = <<EOF
1032
+ it 'convert preformatted text (simple notation)' do
1033
+ text = <<EOF
862
1034
  normal line.
863
1035
  pre {
864
1036
  this [l(link){link}] will not be converted.
@@ -866,123 +1038,228 @@ line_command: this will be not converted too.
866
1038
  }
867
1039
  normal line again.
868
1040
  EOF
869
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
870
- converted = noramark.html
871
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
872
- expect(body.element_children[0].selector_and_children).to eq(["div.pgroup", ["p", "normal line."]])
873
- expect(body.element_children[1].selector_and_children).to eq(["pre", "this [l(link){link}] will not be converted.\nline_command: this will be not converted too."])
874
- expect(body.element_children[2].selector_and_children).to eq(["div.pgroup", ["p", "normal line again."]])
875
- end
876
- it 'should convert preformatted code (simple notation)' do
877
- text = <<EOF
1041
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
1042
+ converted = noramark.html
1043
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
1044
+ expect(body.element_children[0].selector_and_children)
1045
+ .to eq(["div.pgroup", ["p", "normal line."]])
1046
+ expect(body.element_children[1].selector_and_children)
1047
+ .to eq(["pre", "this [l(link){link}] will not be converted.\nline_command: this will be not converted too."])
1048
+ expect(body.element_children[2].selector_and_children)
1049
+ .to eq(["div.pgroup", ["p", "normal line again."]])
1050
+ end
1051
+ it 'should convert preformatted code (simple notation)' do
1052
+ text = <<EOF
878
1053
  normal line.
879
1054
  code {
880
1055
  line_command: this will be not converted too.
881
1056
  }
882
1057
  normal line again.
883
1058
  EOF
884
- noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
885
- converted = noramark.html
886
- body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
887
- expect(body.element_children[0].selector_and_children).to eq(["div.pgroup", ["p", "normal line."]])
888
- expect(body.element_children[1].selector_and_children).to eq(["pre", ["code", "line_command: this will be not converted too."]])
889
- expect(body.element_children[2].selector_and_children).to eq(["div.pgroup", ["p", "normal line again."]])
890
- end
1059
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
1060
+ converted = noramark.html
1061
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
1062
+ expect(body.element_children[0].selector_and_children)
1063
+ .to eq(["div.pgroup", ["p", "normal line."]])
1064
+ expect(body.element_children[1].selector_and_children)
1065
+ .to eq(["pre", ["code", "line_command: this will be not converted too."]])
1066
+ expect(body.element_children[2].selector_and_children)
1067
+ .to eq(["div.pgroup", ["p", "normal line again."]])
1068
+ end
1069
+
1070
+ it 'convert preformatted text with caption' do
1071
+ text = <<EOF
1072
+ normal line.
1073
+ pre(caption [sp.the-text{text}]) {//
1074
+ d {
1075
+ this will not converted to div or p or pgroup.
1076
+ line_command: this will be not converted too.
1077
+ }
1078
+ //}
1079
+ EOF
1080
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
1081
+ converted = noramark.html
1082
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
1083
+ expect(body.element_children[0].selector_and_children)
1084
+ .to eq(["div.pgroup", ["p", "normal line."]])
1085
+ expect(body.element_children[1].selector_and_children)
1086
+ .to eq(
1087
+ ["div.pre",
1088
+ ["p.caption", "caption ", ["span.the-text", "text"]],
1089
+ ["pre", "d {\n this will not converted to div or p or pgroup.\nline_command: this will be not converted too.\n}"]
1090
+ ])
1091
+
1092
+
1093
+ end
1094
+
1095
+ it 'convert preformatted code with language fence format with caption' do
1096
+ text = <<EOF
1097
+ normal line.
1098
+ ```ruby(the caption text)
1099
+ # ruby code example.
1100
+ "Hello, World".split(',').map(&:strip).map(&:to_sym) # => [:Hello, :World]
1101
+ ```
1102
+ normal line again.
1103
+ EOF
1104
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
1105
+ converted = noramark.html
1106
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
1107
+ expect(body.element_children[0].selector_and_children)
1108
+ .to eq(["div.pgroup", ["p", "normal line."]])
1109
+ expect(body.element_children[1].selector_and_children)
1110
+ .to eq(
1111
+ ["div.pre",
1112
+ ["p.caption", "the caption text"],
1113
+ ["pre.code-ruby[data-code-language='ruby']",
1114
+ ["code", "# ruby code example.\n\"Hello, World\".split(',').map(&:strip).map(&:to_sym) # => [:Hello, :World]"]]])
1115
+ expect(body.element_children[2].selector_and_children)
1116
+ .to eq(["div.pgroup", ["p", "normal line again."]])
1117
+ end
891
1118
 
892
- it 'should raise error' do
893
- text = "d {\n block is\nd {\n nested but\nd {\n not terminated }"
894
- expect { NoraMark::Document.parse(text, lang: 'ja', title: 'foo') }.to raise_error KPeg::CompiledParser::ParseError
895
1119
  end
896
1120
 
897
1121
  describe 'markdown style' do
898
1122
  it 'should convert markdown style heading' do
899
- text = "=: タイトル です。\r\n\r\nこれは、セクションの中です。"
1123
+ text = "# タイトル です。\r\n\r\nこれは、セクションの中です。"
900
1124
  noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
901
1125
  converted = noramark.html
902
1126
  body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
903
1127
  expect(body.element_children.size).to eq 1
904
- expect(body.element_children[0].selector_and_children).to eq(
905
- ['section',
906
- ['h1', 'タイトル です。'],
907
- ['div.pgroup',
908
- ['p', 'これは、セクションの中です。']]]
909
- )
1128
+ expect(body.element_children[0].selector_and_children)
1129
+ .to eq(
1130
+ ['section',
1131
+ ['h1', 'タイトル です。'],
1132
+ ['div.pgroup',
1133
+ ['p', 'これは、セクションの中です。']]]
1134
+ )
910
1135
  end
911
1136
  it 'should convert markdown style heading with empty body' do
912
- text = "=: タイトルです。\n*:中身です。\n\n==: 次のタイトルです。これから書きます。\n\n==:ここもこれから。"
1137
+ text = "# タイトルです。\n* 中身です。\n\n## 次のタイトルです。これから書きます。\n\n## ここもこれから。"
913
1138
  noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
914
1139
  converted = noramark.html
915
1140
  body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
916
- expect(body.element_children[0].selector_and_children).to eq(
917
- ['section',
918
- ['h1', 'タイトルです。'],
919
- ['ul', ['li', '中身です。']],
920
- ['section',
921
- ['h2', '次のタイトルです。これから書きます。']],
922
- ['section',
923
- ['h2', 'ここもこれから。']]])
1141
+ expect(body.element_children[0].selector_and_children)
1142
+ .to eq(
1143
+ ['section',
1144
+ ['h1', 'タイトルです。'],
1145
+ ['ul', ['li', '中身です。']],
1146
+ ['section',
1147
+ ['h2', '次のタイトルです。これから書きます。']],
1148
+ ['section',
1149
+ ['h2', 'ここもこれから。']]])
924
1150
  end
925
1151
  it 'should markdown style heading interrupted by other headed section' do
926
- text = "=: タイトルです。\r\nこれは、セクションの中です。\n =: また次のセクションです。\n次のセクションの中です。"
1152
+ text = "# タイトルです。\r\nこれは、セクションの中です。\n # また次のセクションです。\n次のセクションの中です。"
927
1153
  noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
928
1154
  converted = noramark.html
929
1155
  body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
930
1156
  expect(body.element_children.size).to eq 2
931
- expect(body.element_children[0].selector_and_children).to eq(
932
- ['section',
933
- ['h1', 'タイトルです。'],
934
- ['div.pgroup',
935
- ['p', 'これは、セクションの中です。']]])
936
- expect(body.element_children[1].selector_and_children).to eq(
937
- ['section',
938
- ['h1', 'また次のセクションです。'],
939
- ['div.pgroup',
940
- ['p', '次のセクションの中です。']]]
941
- )
1157
+ expect(body.element_children[0].selector_and_children)
1158
+ .to eq(
1159
+ ['section',
1160
+ ['h1', 'タイトルです。'],
1161
+ ['div.pgroup',
1162
+ ['p', 'これは、セクションの中です。']]])
1163
+ expect(body.element_children[1].selector_and_children)
1164
+ .to eq(
1165
+ ['section',
1166
+ ['h1', 'また次のセクションです。'],
1167
+ ['div.pgroup',
1168
+ ['p', '次のセクションの中です。']]]
1169
+ )
942
1170
  end
943
1171
  it 'should markdown style heading not interrupted by other explicit section' do
944
- text = "=: タイトルです。\r\nこれは、セクションの中です。\n section {\n h2: また次のセクションです。\n入れ子になります。\n}\nこのように。"
1172
+ text = "# タイトルです。\r\nこれは、セクションの中です。\n section {\n h2: また次のセクションです。\n入れ子になります。\n}\nこのように。"
945
1173
  noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
946
1174
  converted = noramark.html
947
1175
  body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
948
1176
  expect(body.element_children.size).to eq 1
949
- expect(body.element_children[0].selector_and_children).to eq(
950
- ['section',
951
- ['h1', 'タイトルです。'],
952
- ['div.pgroup',
953
- ['p', 'これは、セクションの中です。']],
954
- ['section',
955
- ['h2', 'また次のセクションです。'],
956
- ['div.pgroup',
957
- ['p', '入れ子になります。']]],
958
- ['div.pgroup',
959
- ['p', 'このように。']]]
960
- )
1177
+ expect(body.element_children[0].selector_and_children)
1178
+ .to eq(
1179
+ ['section',
1180
+ ['h1', 'タイトルです。'],
1181
+ ['div.pgroup',
1182
+ ['p', 'これは、セクションの中です。']],
1183
+ ['section',
1184
+ ['h2', 'また次のセクションです。'],
1185
+ ['div.pgroup',
1186
+ ['p', '入れ子になります。']]],
1187
+ ['div.pgroup',
1188
+ ['p', 'このように。']]]
1189
+ )
961
1190
  end
1191
+ it 'should markdown style heading not interrupted by other explicit section' do
1192
+ text = "# タイトルです。\r\nこれは、セクションの中です。\n ## また次のセクションです。{\n 入れ子になります。\n# 中にもかけます。\nさらにネストされます。\n}\nこのように。"
1193
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
1194
+ converted = noramark.html
1195
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
1196
+ expect(body.element_children.size).to eq 1
1197
+ expect(body.element_children[0].selector_and_children)
1198
+ .to eq(
1199
+ ['section',
1200
+ ['h1', 'タイトルです。'],
1201
+ ['div.pgroup',
1202
+ ['p', 'これは、セクションの中です。']],
1203
+ ['section',
1204
+ ['h2', 'また次のセクションです。'],
1205
+ ['div.pgroup',
1206
+ ['p', '入れ子になります。']],
1207
+ ['section',
1208
+ ['h1', '中にもかけます。'],
1209
+ ['div.pgroup',
1210
+ ['p', 'さらにネストされます。']]]],
1211
+ ['div.pgroup',
1212
+ ['p', 'このように。']]]
1213
+ )
1214
+ end
1215
+
1216
+ it 'should markdown style explicit heading correctly nested' do
1217
+ text = "# head one \n in the top level section.\n ## second level section. { \n\n in the second level.\n}\n top level again."
1218
+ noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
1219
+ converted = noramark.html
1220
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
1221
+ expect(body.element_children.size).to eq 1
1222
+ expect(body.element_children[0].selector_and_children)
1223
+ .to eq(
1224
+ ['section',
1225
+ ['h1', 'head one'],
1226
+ ['div.pgroup',
1227
+ ['p', 'in the top level section.']],
1228
+ ['section',
1229
+ ['h2', 'second level section.'],
1230
+ ['div.pgroup',
1231
+ ['p', 'in the second level.']]],
1232
+ ['div.pgroup',
1233
+ ['p', 'top level again.']]]
1234
+ )
1235
+ end
1236
+
962
1237
  it 'should markdown style heading not interrupted by smaller section' do
963
- text = "=: タイトルです。\r\nこれは、セクションの中です。\n ==: また次のセクションです。\n 入れ子になります。\n===: さらに中のセクション \nさらに入れ子になっているはず。\n=:ここで次のセクションです。\n脱出しているはずです。"
1238
+ text = "# タイトルです。\r\nこれは、セクションの中です。\n ## また次のセクションです。\n 入れ子になります。\n### さらに中のセクション \nさらに入れ子になっているはず。\n# ここで次のセクションです。\n脱出しているはずです。"
964
1239
  noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
965
1240
  converted = noramark.html
966
1241
  body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
967
1242
  expect(body.element_children.size).to eq 2
968
- expect(body.element_children[0].selector_and_children).to eq(
969
- ['section',
970
- ['h1', 'タイトルです。'],
971
- ['div.pgroup',
972
- ['p', 'これは、セクションの中です。']],
973
- ['section',
974
- ['h2', 'また次のセクションです。'],
975
- ['div.pgroup',
976
- ['p', '入れ子になります。']],
977
- ['section',
978
- ['h3', 'さらに中のセクション'],
979
- ['div.pgroup',
980
- ['p', 'さらに入れ子になっているはず。']]]]] )
981
- expect(body.element_children[1].selector_and_children).to eq(
982
- ['section',
983
- ['h1', 'ここで次のセクションです。'],
984
- ['div.pgroup',
985
- ['p', '脱出しているはずです。']]])
1243
+ expect(body.element_children[0].selector_and_children)
1244
+ .to eq(
1245
+ ['section',
1246
+ ['h1', 'タイトルです。'],
1247
+ ['div.pgroup',
1248
+ ['p', 'これは、セクションの中です。']],
1249
+ ['section',
1250
+ ['h2', 'また次のセクションです。'],
1251
+ ['div.pgroup',
1252
+ ['p', '入れ子になります。']],
1253
+ ['section',
1254
+ ['h3', 'さらに中のセクション'],
1255
+ ['div.pgroup',
1256
+ ['p', 'さらに入れ子になっているはず。']]]]] )
1257
+ expect(body.element_children[1].selector_and_children)
1258
+ .to eq(
1259
+ ['section',
1260
+ ['h1', 'ここで次のセクションです。'],
1261
+ ['div.pgroup',
1262
+ ['p', '脱出しているはずです。']]])
986
1263
 
987
1264
  end
988
1265
  end
@@ -993,14 +1270,17 @@ EOF
993
1270
  converted = noramark.render_parameter(nonpaged: true).html
994
1271
  expect(converted.size).to eq 1
995
1272
  body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
996
- expect(body.element_children[0].selector_and_children).to eq(
997
- ['div.pgroup',
998
- ['p', 'some text']])
999
- expect(body.element_children[1].selector_and_children).to eq(
1000
- ['hr.page-break'])
1001
- expect(body.element_children[2].selector_and_children).to eq(
1002
- ['div.pgroup',
1003
- ['p', 'next page']])
1273
+ expect(body.element_children[0].selector_and_children)
1274
+ .to eq(
1275
+ ['div.pgroup',
1276
+ ['p', 'some text']])
1277
+ expect(body.element_children[1].selector_and_children)
1278
+ .to eq(
1279
+ ['hr.page-break'])
1280
+ expect(body.element_children[2].selector_and_children)
1281
+ .to eq(
1282
+ ['div.pgroup',
1283
+ ['p', 'next page']])
1004
1284
  end
1005
1285
  end
1006
1286
  describe 'create file' do
@@ -1010,7 +1290,7 @@ EOF
1010
1290
  text = "some text"
1011
1291
  noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
1012
1292
  noramark.html.write_as_files(directory: @basedir)
1013
- expect(File.basename(Dir.glob(File.join(@basedir, '*.xhtml'))[0])).to match /noramark_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}_00001.xhtml/
1293
+ expect(File.basename(Dir.glob(File.join(@basedir, '*.xhtml'))[0])).to match(/noramark_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}_00001.xhtml/)
1014
1294
  end
1015
1295
  it 'should create named file' do
1016
1296
  text = "some text\nnewpage:\nnext page"
@@ -1029,7 +1309,7 @@ EOF
1029
1309
  }
1030
1310
  after { Dir.glob(File.join(@basedir, '*.xhtml')) { |file| File.delete file } }
1031
1311
  it 'should create valid html5' do
1032
- noramark = NoraMark::Document.parse(File.open(File.join(@exampledir, 'noramark-reference-ja.nora')).read, document_name: 'noramark-reference-ja')
1312
+ noramark = NoraMark::Document.parse(File.open(File.join(@exampledir, 'noramark-reference-ja.nora'), 'rb:UTF-8').read, document_name: 'noramark-reference-ja')
1033
1313
  noramark.html.write_as_files(directory: @exampledir)
1034
1314
  jar = File.join(@here, 'jing-20091111/bin/jing.jar')
1035
1315
  schema = File.join(@here, 'epub30-schemas/epub-xhtml-30.rnc')
@@ -1051,177 +1331,6 @@ EOF
1051
1331
  expect(@stdout.strip).to eq ""
1052
1332
  end
1053
1333
  end
1054
- describe 'node manipulation' do
1055
- before do
1056
- @text = <<EOF
1057
- 1st line.
1058
- d.the_class {
1059
- 3rd line.
1060
- }
1061
- 5th line.
1062
- EOF
1063
- end
1064
- it 'should access line number' do
1065
- noramark = NoraMark::Document.parse(@text)
1066
- page = noramark.root.children[0]
1067
- expect(page.children.size).to eq 3
1068
- expect(page.line_no).to eq 1
1069
- expect(page.children[0].line_no).to eq 1
1070
- expect(page.children[1].line_no).to eq 2
1071
- expect(page.children[2].children[0].line_no).to eq 5
1072
- end
1073
-
1074
- it 'replace existing node' do
1075
- noramark = NoraMark::Document.parse(@text)
1076
- page = noramark.root.children[0]
1077
- first_pgroup = page.children[0]
1078
- line_no = first_pgroup.line_no
1079
- new_node = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [ NoraMark::Text.new("replaced.", line_no)], line_no)
1080
- first_pgroup.replace(new_node)
1081
- body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
1082
- expect(body.element_children[0].selector_and_children(remove_id: false)).to eq(
1083
- ['p#the_id.the_class', 'replaced.'])
1084
- end
1085
-
1086
- it 'modify existing node by DSL' do
1087
- text = "1st line.\nfoobar(title)[level: 3] {\n in the section.\n}\n=: section 2."
1088
- noramark = NoraMark::Document.parse(text, lang: 'ja')
1089
-
1090
- noramark.add_transformer(generator: :html) do
1091
- for_node 'foobar', :modify do
1092
- @node.name = 'section'
1093
- @node.prepend_child block("h#{@node.named_parameters[:level]}", @node.parameters[0])
1094
- end
1095
- end
1096
- body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
1097
- expect(body.element_children[0].selector_and_children()).to eq(
1098
- ['div.pgroup', [ 'p', '1st line.' ]])
1099
- expect(body.element_children[1].selector_and_children()).to eq(
1100
- ['section', [ 'h3', 'title' ], ['div.pgroup', ['p', 'in the section.']]])
1101
- expect(body.element_children[2].selector_and_children()).to eq(
1102
- ['section', [ 'h1','section 2.' ]])
1103
- end
1104
- it 'replace existing node by DSL' do
1105
- text = "1st line.\nfoobar(title)[level: 3] {\n in the section.\n}\n=: section 2."
1106
- noramark = NoraMark::Document.parse(text, lang: 'ja')
1107
-
1108
- noramark.add_transformer(generator: :html) do
1109
- for_node 'foobar', :replace do
1110
- block('section',
1111
- [
1112
- block( "h#{@node.named_parameters[:level]}", @node.parameters[0]),
1113
- ] + @node.children)
1114
- end
1115
- end
1116
- body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
1117
- expect(body.element_children[0].selector_and_children()).to eq(
1118
- ['div.pgroup', [ 'p', '1st line.' ]])
1119
- expect(body.element_children[1].selector_and_children()).to eq(
1120
- ['section', [ 'h3', 'title' ], ['div.pgroup', ['p', 'in the section.']]])
1121
- expect(body.element_children[2].selector_and_children()).to eq(
1122
- ['section', [ 'h1','section 2.' ]])
1123
- end
1124
- it 'generate complex-style headed section' do
1125
- text = <<EOF
1126
- ---
1127
- lang: ja
1128
- ---
1129
-
1130
- =: 見出し
1131
- sub: 副見出し
1132
-
1133
- パラグラフ。
1134
- パラグラフ。
1135
-
1136
- EOF
1137
- noramark = NoraMark::Document.parse(text)
1138
- noramark.add_transformer(generator: :html) do
1139
- for_node({:type => :HeadedSection}, :replace) do
1140
- header = block('header',
1141
- block('div',
1142
- block("h#{@node.level}", @node.heading),
1143
- classes: ['hgroup']))
1144
- if (fc = @node.first_child).name == 'sub'
1145
- fc.name = 'p'
1146
- fc.classes = ['subh']
1147
- header.first_child.append_child fc
1148
- end
1149
- body = block('div', @node.children, classes:['section-body'])
1150
- block('section', [ header, body ], template: @node)
1151
- end
1152
- end
1153
- body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
1154
- expect(body.element_children[0].selector_and_children()).to eq(
1155
- ['section', [ 'header', ['div.hgroup', ['h1', '見出し'], ['p.subh', '副見出し']]],
1156
- ['div.section-body',
1157
- ['div.pgroup', ['p', 'パラグラフ。'], ['p', 'パラグラフ。']]]])
1158
- end
1159
- it 'converts my markup' do
1160
- text = "speak(Alice): Alice is speaking.\nspeak(Bob): and this is Bob."
1161
- noramark = NoraMark::Document.parse(text)
1162
- noramark.add_transformer(generator: :html) do
1163
- for_node("speak", :modify) do
1164
- @node.name = 'p'
1165
- @node.prepend_child inline('span', @node.parameters[0], classes: ['speaker'])
1166
- end
1167
- end
1168
- body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
1169
- expect(body.element_children[0].selector_and_children()).to eq(
1170
- ['p', ['span.speaker', 'Alice'], 'Alice is speaking.'])
1171
- expect(body.element_children[1].selector_and_children()).to eq(
1172
- ['p', ['span.speaker', 'Bob'], 'and this is Bob.'])
1173
-
1174
- end
1175
-
1176
-
1177
- it 'should reparent tree' do
1178
- text = <<EOF
1179
- 1st line.
1180
- d {
1181
- in the div
1182
- }
1183
- *: ul item
1184
- text [s{with inline}] within
1185
- EOF
1186
- root = NoraMark::Document.parse(text).root
1187
-
1188
- expect(root.parent).to be nil
1189
- expect(root.prev).to be nil
1190
- expect(root.next).to be nil
1191
- expect(root.content).to be nil
1192
-
1193
- expect(root.children.size).to eq 1
1194
- page = root.first_child
1195
- expect(root.children[0]).to eq page
1196
- expect(root.last_child).to eq page
1197
- expect(page.parent).to eq root
1198
- expect(page.prev).to be nil
1199
- expect(page.next).to be nil
1200
-
1201
- first_pgroup = page.first_child
1202
- expect(first_pgroup.class).to be NoraMark::ParagraphGroup
1203
- expect(first_pgroup.parent).to eq page
1204
- expect(first_pgroup.children.size).to eq 1
1205
- expect(first_pgroup.prev).to be nil
1206
-
1207
- paragraph = first_pgroup.first_child
1208
- expect(paragraph.class).to be NoraMark::Paragraph
1209
- expect(paragraph.parent).to be first_pgroup
1210
- expect(paragraph.prev).to be nil
1211
- expect(paragraph.next).to be nil
1212
- expect(paragraph.children.size).to eq 1
1213
- text = paragraph.first_child
1214
- expect(text.class).to be NoraMark::Text
1215
- expect(text.content).to eq '1st line.'
1216
- expect(text.children.size).to eq 0
1217
- expect(text.prev).to be nil
1218
- expect(text.next).to be nil
1219
- expect(text.parent).to eq paragraph
1220
-
1221
- second_div = first_pgroup.next
1222
- expect(second_div.class).to be NoraMark::Block
1223
- end
1224
- end
1225
1334
  describe 'table of contents' do
1226
1335
  before do
1227
1336
  @text = <<EOF
@@ -1229,9 +1338,9 @@ EOF
1229
1338
  lang: ja
1230
1339
  title: title
1231
1340
  ---
1232
- =: [strong{chapter 1}]
1341
+ # [strong{chapter 1}]
1233
1342
  text
1234
- ==: section 1-1
1343
+ ## section 1-1
1235
1344
  text
1236
1345
  newpage:
1237
1346
  section {
@@ -1254,11 +1363,66 @@ EOF
1254
1363
  it 'should generate tocs' do
1255
1364
  toc = @noramark.html.toc
1256
1365
  expect(toc.size).to eq 3
1257
- expect(toc[0]).to eq({link: "nora_00001.xhtml#heading_index_1", level: 1, text: "chapter 1"})
1258
- expect(toc[1]).to eq({link: "nora_00001.xhtml#heading_index_2", level: 2, text: "section 1-1"})
1259
- expect(toc[2]).to eq({link: "nora_00002.xhtml#heading_index_3", level: 6, text: "some column"})
1366
+ expect(toc[0])
1367
+ .to eq({link: "nora_00001.xhtml#heading_index_1", level: 1, text: "chapter 1"})
1368
+ expect(toc[1])
1369
+ .to eq({link: "nora_00001.xhtml#heading_index_2", level: 2, text: "section 1-1"})
1370
+ expect(toc[2])
1371
+ .to eq({link: "nora_00002.xhtml#heading_index_3", level: 6, text: "some column"})
1260
1372
  end
1261
1373
  end
1374
+ it 'should raise error' do
1375
+ text = "d {\n block is\nd {\n nested but\nd {\n not terminated }"
1376
+ expect { NoraMark::Document.parse(text, lang: 'ja', title: 'foo') }.to raise_error KPeg::CompiledParser::ParseError
1377
+ end
1378
+ end
1379
+ describe 'video' do
1380
+ it 'should render video' do
1381
+ text = "this text includes [video(video.mp4)[poster: poster.jpg]{alternate message}]"
1382
+ nora = NoraMark::Document.parse(text)
1383
+ converted = nora.html
1384
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
1385
+ expect(body.element_children[0].selector_and_children)
1386
+ .to eq(
1387
+ ['p', 'this text includes ',
1388
+ ["video[src='video.mp4'][poster='poster.jpg']", 'alternate message']]
1389
+ )
1390
+ end
1391
+ it 'should render video with autoplay and controls' do
1392
+ text = "this text includes [video(video.mp4, autoplay, controls)[poster: poster.jpg]]"
1393
+ nora = NoraMark::Document.parse(text)
1394
+ converted = nora.html
1395
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
1396
+ expect(body.element_children[0].selector_and_children)
1397
+ .to eq(
1398
+ ['p', 'this text includes ',
1399
+ ["video[src='video.mp4'][poster='poster.jpg'][autoplay='autoplay'][controls='controls']", '']]
1400
+ )
1401
+ end
1402
+ end
1403
+ describe 'audio' do
1404
+ it 'should render audio' do
1405
+ text = "this text includes [audio(audio.mp3)[volume: 0.2]{alternate message}]"
1406
+ nora = NoraMark::Document.parse(text)
1407
+ converted = nora.html
1408
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
1409
+ expect(body.element_children[0].selector_and_children)
1410
+ .to eq(
1411
+ ['p', 'this text includes ',
1412
+ ["audio[src='audio.mp3'][volume='0.2']", 'alternate message']]
1413
+ )
1414
+ end
1415
+ it 'should render audio with autoplay and controls' do
1416
+ text = "this text includes [audio(audio.mp3, autoplay, controls)]"
1417
+ nora = NoraMark::Document.parse(text)
1418
+ converted = nora.html
1419
+ body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
1420
+ expect(body.element_children[0].selector_and_children)
1421
+ .to eq(
1422
+ ['p', 'this text includes ',
1423
+ ["audio[src='audio.mp3'][autoplay='autoplay'][controls='controls']", '']]
1424
+ )
1425
+ end
1262
1426
  end
1263
1427
  end
1264
1428