nora_mark 0.2beta16 → 0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.github/FUNDING.yml +3 -0
- data/.github/dependabot.yml +8 -0
- data/.github/workflows/test.yml +19 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +3 -0
- data/.travis.yml +2 -2
- data/CHANGELOG.md +5 -0
- data/Gemfile +0 -1
- data/README.md +1 -2
- data/Rakefile +1 -4
- data/lib/nora_mark/document.rb +14 -14
- data/lib/nora_mark/extensions.rb +6 -6
- data/lib/nora_mark/html/abstract_node_writer.rb +2 -1
- data/lib/nora_mark/html/context.rb +18 -16
- data/lib/nora_mark/html/default_transformer.rb +41 -38
- data/lib/nora_mark/html/frontmatter_writer.rb +2 -2
- data/lib/nora_mark/html/generator.rb +22 -22
- data/lib/nora_mark/html/pages.rb +13 -14
- data/lib/nora_mark/html/paragraph_writer.rb +24 -26
- data/lib/nora_mark/html/raw_text_block_writer.rb +13 -0
- data/lib/nora_mark/html/tag_writer.rb +14 -13
- data/lib/nora_mark/html/util.rb +5 -5
- data/lib/nora_mark/node.rb +46 -56
- data/lib/nora_mark/node_set.rb +1 -1
- data/lib/nora_mark/node_util.rb +7 -8
- data/lib/nora_mark/parser.kpeg.rb +16 -16
- data/lib/nora_mark/parser.rb +1 -3
- data/lib/nora_mark/rake_task.rb +23 -23
- data/lib/nora_mark/transformer.rb +13 -15
- data/lib/nora_mark/version.rb +1 -1
- data/lib/nora_mark.rb +0 -4
- data/lib/tilt/nora_mark.rb +1 -1
- data/nora_mark.gemspec +7 -6
- data/spec/extensions_spec.rb +1 -2
- data/spec/fixtures/test-plugins/nora_mark_tester.rb +3 -1
- data/spec/node_spec.rb +69 -49
- data/spec/nokogiri_test_helper.rb +9 -7
- data/spec/nora_mark_spec.rb +467 -491
- data/spec/spec_helper.rb +2 -6
- data/spec/tilt_spec.rb +1 -1
- data/spec/transformer_spec.rb +16 -18
- metadata +39 -29
@@ -350,7 +350,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
350
350
|
|
351
351
|
# BOM = /\uFEFF/
|
352
352
|
def _BOM
|
353
|
-
_tmp = scan(/\
|
353
|
+
_tmp = scan(/\G(?-mix:\uFEFF)/)
|
354
354
|
set_failed_rule :_BOM unless _tmp
|
355
355
|
return _tmp
|
356
356
|
end
|
@@ -507,7 +507,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
507
507
|
|
508
508
|
_save = self.pos
|
509
509
|
while true # sequence
|
510
|
-
_tmp = scan(/\
|
510
|
+
_tmp = scan(/\G(?-mix:^)/)
|
511
511
|
unless _tmp
|
512
512
|
self.pos = _save
|
513
513
|
break
|
@@ -544,7 +544,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
544
544
|
|
545
545
|
# Nl = /\r?\n/
|
546
546
|
def _Nl
|
547
|
-
_tmp = scan(/\
|
547
|
+
_tmp = scan(/\G(?-mix:\r?\n)/)
|
548
548
|
set_failed_rule :_Nl unless _tmp
|
549
549
|
return _tmp
|
550
550
|
end
|
@@ -576,7 +576,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
576
576
|
|
577
577
|
_save1 = self.pos
|
578
578
|
while true # sequence
|
579
|
-
_tmp = scan(/\
|
579
|
+
_tmp = scan(/\G(?-mix:[\w])/)
|
580
580
|
unless _tmp
|
581
581
|
self.pos = _save1
|
582
582
|
break
|
@@ -588,7 +588,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
588
588
|
_tmp = match_string("-")
|
589
589
|
break if _tmp
|
590
590
|
self.pos = _save3
|
591
|
-
_tmp = scan(/\
|
591
|
+
_tmp = scan(/\G(?-mix:[\w])/)
|
592
592
|
break if _tmp
|
593
593
|
self.pos = _save3
|
594
594
|
break
|
@@ -891,7 +891,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
891
891
|
break
|
892
892
|
end
|
893
893
|
_save1 = self.pos
|
894
|
-
_tmp = scan(/\
|
894
|
+
_tmp = scan(/\G(?-mix:[,)])/)
|
895
895
|
self.pos = _save1
|
896
896
|
unless _tmp
|
897
897
|
self.pos = _save
|
@@ -936,7 +936,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
936
936
|
break
|
937
937
|
end
|
938
938
|
_save1 = self.pos
|
939
|
-
_tmp = scan(/\
|
939
|
+
_tmp = scan(/\G(?-mix:[,)])/)
|
940
940
|
self.pos = _save1
|
941
941
|
unless _tmp
|
942
942
|
self.pos = _save
|
@@ -998,7 +998,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
998
998
|
while true # sequence
|
999
999
|
_text_start = self.pos
|
1000
1000
|
while true
|
1001
|
-
_tmp = scan(/\
|
1001
|
+
_tmp = scan(/\G(?-mix:[^,\]])/)
|
1002
1002
|
break unless _tmp
|
1003
1003
|
end
|
1004
1004
|
_tmp = true
|
@@ -1033,7 +1033,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
1033
1033
|
end
|
1034
1034
|
_text_start = self.pos
|
1035
1035
|
while true
|
1036
|
-
_tmp = scan(/\
|
1036
|
+
_tmp = scan(/\G(?-mix:[^"])/)
|
1037
1037
|
break unless _tmp
|
1038
1038
|
end
|
1039
1039
|
_tmp = true
|
@@ -1055,7 +1055,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
1055
1055
|
break
|
1056
1056
|
end
|
1057
1057
|
_save2 = self.pos
|
1058
|
-
_tmp = scan(/\
|
1058
|
+
_tmp = scan(/\G(?-mix:[,\]])/)
|
1059
1059
|
self.pos = _save2
|
1060
1060
|
unless _tmp
|
1061
1061
|
self.pos = _save
|
@@ -1085,7 +1085,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
1085
1085
|
end
|
1086
1086
|
_text_start = self.pos
|
1087
1087
|
while true
|
1088
|
-
_tmp = scan(/\
|
1088
|
+
_tmp = scan(/\G(?-mix:[^'])/)
|
1089
1089
|
break unless _tmp
|
1090
1090
|
end
|
1091
1091
|
_tmp = true
|
@@ -1107,7 +1107,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
1107
1107
|
break
|
1108
1108
|
end
|
1109
1109
|
_save2 = self.pos
|
1110
|
-
_tmp = scan(/\
|
1110
|
+
_tmp = scan(/\G(?-mix:[,\]])/)
|
1111
1111
|
self.pos = _save2
|
1112
1112
|
unless _tmp
|
1113
1113
|
self.pos = _save
|
@@ -2943,7 +2943,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
2943
2943
|
break
|
2944
2944
|
end
|
2945
2945
|
_text_start = self.pos
|
2946
|
-
_tmp = scan(/\
|
2946
|
+
_tmp = scan(/\G(?-mix:[`])/)
|
2947
2947
|
if _tmp
|
2948
2948
|
text = get_text(_text_start)
|
2949
2949
|
end
|
@@ -3076,7 +3076,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
3076
3076
|
|
3077
3077
|
_save = self.pos
|
3078
3078
|
while true # sequence
|
3079
|
-
_tmp = scan(/\
|
3079
|
+
_tmp = scan(/\G(?-mix:^)/)
|
3080
3080
|
unless _tmp
|
3081
3081
|
self.pos = _save
|
3082
3082
|
break
|
@@ -3087,7 +3087,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
3087
3087
|
break
|
3088
3088
|
end
|
3089
3089
|
_text_start = self.pos
|
3090
|
-
_tmp = scan(/\
|
3090
|
+
_tmp = scan(/\G(?-mix:\*+)/)
|
3091
3091
|
if _tmp
|
3092
3092
|
text = get_text(_text_start)
|
3093
3093
|
end
|
@@ -4533,7 +4533,7 @@ class NoraMark::Parser < KPeg::CompiledParser
|
|
4533
4533
|
_save = self.pos
|
4534
4534
|
while true # sequence
|
4535
4535
|
_text_start = self.pos
|
4536
|
-
_tmp = scan(/\
|
4536
|
+
_tmp = scan(/\G(?-mix:[[:print:]])/)
|
4537
4537
|
if _tmp
|
4538
4538
|
text = get_text(_text_start)
|
4539
4539
|
end
|
data/lib/nora_mark/parser.rb
CHANGED
data/lib/nora_mark/rake_task.rb
CHANGED
@@ -3,7 +3,7 @@ require 'rake/tasklib'
|
|
3
3
|
|
4
4
|
module NoraMark
|
5
5
|
class RakeTask < ::Rake::TaskLib
|
6
|
-
attr_accessor :lang, :page_number_digits, :write_toc_file
|
6
|
+
attr_accessor :lang, :page_number_digits, :title, :stylesheets, :write_toc_file
|
7
7
|
def initialize(lang: 'en')
|
8
8
|
@preprocessors = []
|
9
9
|
@transformers = []
|
@@ -31,40 +31,40 @@ module NoraMark
|
|
31
31
|
|
32
32
|
def define
|
33
33
|
desc "rule for *-nora.txt to *-nora_xxx.html. Use *-nora-transform.rb on same directory as transformer"
|
34
|
-
rule(
|
35
|
-
proc {|task_name|
|
34
|
+
rule(/-((nora)|(arti))_[0-9]{#{page_number_digits}}\.xhtml/ =>
|
35
|
+
proc { |task_name|
|
36
36
|
task_name.sub(/^(.+?-((nora)|(arti)))_[0-9]{#{page_number_digits}}\.xhtml/, '\1.txt')
|
37
|
-
}) do
|
38
|
-
|t|
|
37
|
+
}) do |t|
|
39
38
|
|
40
|
-
dir =
|
39
|
+
dir = File.dirname File.expand_path(t.source)
|
41
40
|
basename = File.basename(t.source, '.txt')
|
42
41
|
transformer_name = File.join dir, basename + '-transform.rb'
|
42
|
+
parameters = {
|
43
|
+
:lang => @lang.to_s,
|
44
|
+
:sequence_format => "%0#{page_number_digits}d",
|
45
|
+
:document_name => t.name.sub(/_[0-9]{#{page_number_digits}}\.xhtml/, '')
|
46
|
+
}
|
47
|
+
parameters[:stylesheets] = @stylesheets unless @stylesheets.nil?
|
48
|
+
parameters[:title] = @title unless @title.nil?
|
43
49
|
@nora =
|
44
50
|
NoraMark::Document.parse(
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
51
|
+
File.open(t.source), parameters
|
52
|
+
) do |doc|
|
53
|
+
@preprocessors.each do |prepro|
|
54
|
+
doc.preprocessor(&prepro)
|
55
|
+
end
|
56
|
+
@transformers.each do |transformer|
|
57
|
+
doc.add_transformer(&transformer)
|
58
|
+
end
|
59
|
+
if File.exist? transformer_name
|
60
|
+
doc.add_transformer(text: File.open(transformer_name).read)
|
61
|
+
end
|
53
62
|
end
|
54
|
-
@transformers.each do
|
55
|
-
|transformer|
|
56
|
-
doc.add_transformer(&transformer)
|
57
|
-
end
|
58
|
-
if File.exist? transformer_name
|
59
|
-
doc.add_transformer(text: File.open(transformer_name).read)
|
60
|
-
end
|
61
|
-
end
|
62
63
|
@nora.html.write_as_files
|
63
64
|
if (@write_toc_file)
|
64
65
|
@nora.html.write_toc_as_file
|
65
66
|
end
|
66
67
|
end
|
67
|
-
|
68
68
|
end
|
69
69
|
end
|
70
70
|
end
|
@@ -10,13 +10,12 @@ module NoraMark
|
|
10
10
|
def transform(node)
|
11
11
|
frontmatter_node = node.find_node :type => :Frontmatter
|
12
12
|
@frontmatter = frontmatter_node.yaml if frontmatter_node
|
13
|
-
node.all_nodes.unshift(node).each do
|
14
|
-
|n
|
15
|
-
|
16
|
-
action, p = match_rule[1,2]
|
13
|
+
node.all_nodes.unshift(node).each do |n|
|
14
|
+
if (match_rule = @rules.find { |rule| n.match?(rule[0]) })
|
15
|
+
action, p = match_rule[1, 2]
|
17
16
|
@node = n
|
18
17
|
send(action, &p)
|
19
|
-
end
|
18
|
+
end
|
20
19
|
end
|
21
20
|
node
|
22
21
|
end
|
@@ -29,12 +28,11 @@ module NoraMark
|
|
29
28
|
new_node = instance_eval(&block)
|
30
29
|
@node.replace new_node if new_node
|
31
30
|
end
|
32
|
-
|
33
31
|
end
|
34
|
-
|
32
|
+
|
35
33
|
class TransformerFactory
|
36
34
|
attr_accessor :rules, :options
|
37
|
-
|
35
|
+
|
38
36
|
def self.create(text: nil, &block)
|
39
37
|
instance = new
|
40
38
|
instance.instance_eval do
|
@@ -47,22 +45,22 @@ module NoraMark
|
|
47
45
|
end
|
48
46
|
Transformer.new(@rules, @options)
|
49
47
|
end
|
50
|
-
end
|
51
|
-
|
48
|
+
end
|
49
|
+
|
52
50
|
def transform_options options
|
53
|
-
(@options ||= {}).merge options
|
51
|
+
(@options ||= {}).merge options
|
54
52
|
end
|
55
|
-
|
53
|
+
|
56
54
|
def modify(selector, &block)
|
57
|
-
@rules << [
|
55
|
+
@rules << [selector, :modify, block]
|
58
56
|
end
|
59
57
|
|
60
58
|
def replace(selector, &block)
|
61
|
-
@rules << [
|
59
|
+
@rules << [selector, :replace, block]
|
62
60
|
end
|
63
61
|
|
64
62
|
def rename(selector, name)
|
65
|
-
@rules << [
|
63
|
+
@rules << [selector, :modify, proc { @node.name = name }]
|
66
64
|
end
|
67
65
|
end
|
68
66
|
end
|
data/lib/nora_mark/version.rb
CHANGED
data/lib/nora_mark.rb
CHANGED
data/lib/tilt/nora_mark.rb
CHANGED
data/nora_mark.gemspec
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
|
2
3
|
require File.expand_path('../lib/nora_mark/version', __FILE__)
|
3
4
|
|
4
5
|
Gem::Specification.new do |gem|
|
@@ -9,17 +10,17 @@ Gem::Specification.new do |gem|
|
|
9
10
|
gem.homepage = ""
|
10
11
|
|
11
12
|
gem.files = `git ls-files`.split($\)
|
12
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
13
14
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
15
|
gem.name = "nora_mark"
|
15
16
|
gem.require_paths = ["lib"]
|
16
17
|
gem.version = NoraMark::VERSION
|
17
18
|
|
18
|
-
gem.required_ruby_version = '>=
|
19
|
-
gem.add_dependency "kpeg"
|
19
|
+
gem.required_ruby_version = '>= 3.0.0'
|
20
|
+
gem.add_dependency "kpeg", "1.3.1"
|
21
|
+
gem.add_development_dependency "debug"
|
20
22
|
gem.add_development_dependency "tilt", ">= 2.0"
|
21
|
-
gem.add_development_dependency "rspec", "
|
23
|
+
gem.add_development_dependency "rspec", ">= 2.14"
|
22
24
|
gem.add_development_dependency "rake"
|
23
|
-
gem.add_development_dependency "
|
24
|
-
gem.add_development_dependency "nokogiri", "~> 1.6.0"
|
25
|
+
gem.add_development_dependency "nokogiri", ">= 1.13.6", "< 2.0"
|
25
26
|
end
|
data/spec/extensions_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
|
2
3
|
require File.dirname(__FILE__) + '/spec_helper.rb'
|
3
4
|
require File.dirname(__FILE__) + '/../lib/nora_mark'
|
4
5
|
require 'nokogiri'
|
@@ -25,7 +26,5 @@ describe NoraMark::Extensions do
|
|
25
26
|
after(:each) do
|
26
27
|
$:.delete @test_plugin_dir
|
27
28
|
end
|
28
|
-
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
data/spec/node_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/../lib/nora_mark'
|
|
3
3
|
require 'nokogiri'
|
4
4
|
require File.dirname(__FILE__) + '/nokogiri_test_helper.rb'
|
5
5
|
|
6
|
-
describe NoraMark::Node do
|
6
|
+
describe NoraMark::Node do
|
7
7
|
describe 'node manipulation' do
|
8
8
|
before do
|
9
9
|
@text = <<EOF
|
@@ -24,17 +24,18 @@ EOF
|
|
24
24
|
expect(page.children[2].children[0].line_no).to eq 5
|
25
25
|
end
|
26
26
|
|
27
|
-
it 'replace existing node'
|
27
|
+
it 'replace existing node' do
|
28
28
|
noramark = NoraMark::Document.parse(@text)
|
29
29
|
page = noramark.root.children[0]
|
30
30
|
first_pgroup = page.children[0]
|
31
31
|
line_no = first_pgroup.line_no
|
32
|
-
new_node = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [
|
32
|
+
new_node = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [NoraMark::Text.new("replaced.", line_no)], line_no)
|
33
33
|
first_pgroup.replace(new_node)
|
34
34
|
body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
|
35
35
|
expect(body.element_children[0].selector_and_children(remove_id: false))
|
36
36
|
.to eq(
|
37
|
-
|
37
|
+
['p#the_id.the_class', 'replaced.']
|
38
|
+
)
|
38
39
|
end
|
39
40
|
|
40
41
|
it 'replace existing node by multiple nodes' do
|
@@ -42,91 +43,104 @@ EOF
|
|
42
43
|
page = noramark.root.children[0]
|
43
44
|
first_pgroup = page.children[0]
|
44
45
|
line_no = first_pgroup.line_no
|
45
|
-
new_node1 = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [
|
46
|
-
new_node2 = NoraMark::ParagraphGroup.new(['the_id2'], ['the_class2'], [], {}, [
|
46
|
+
new_node1 = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [NoraMark::Text.new("replaced.", line_no)], line_no)
|
47
|
+
new_node2 = NoraMark::ParagraphGroup.new(['the_id2'], ['the_class2'], [], {}, [NoraMark::Text.new("replaced2.", line_no)], line_no)
|
47
48
|
first_pgroup.replace([new_node1, new_node2])
|
48
49
|
body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
|
49
50
|
expect(body.element_children[0].selector_and_children(remove_id: false))
|
50
51
|
.to eq(
|
51
|
-
|
52
|
+
['p#the_id.the_class', 'replaced.']
|
53
|
+
)
|
52
54
|
expect(body.element_children[1].selector_and_children(remove_id: false))
|
53
55
|
.to eq(
|
54
|
-
|
56
|
+
['p#the_id2.the_class2', 'replaced2.']
|
57
|
+
)
|
55
58
|
expect(body.element_children[2].selector_and_children(remove_id: false))
|
56
59
|
.to eq(
|
57
|
-
|
60
|
+
['div.the_class', ['p', '3rd line.']]
|
61
|
+
)
|
58
62
|
end
|
59
63
|
|
60
|
-
it 'wraps existing node'
|
64
|
+
it 'wraps existing node' do
|
61
65
|
noramark = NoraMark::Document.parse(@text)
|
62
66
|
page = noramark.root.children[0]
|
63
67
|
first_pgroup = page.children[0]
|
64
68
|
line_no = first_pgroup.line_no
|
65
69
|
new_node = NoraMark::Block.new('div', ['the_id'], ['the_class'], [], {}, [
|
66
|
-
|
67
|
-
|
68
|
-
|
70
|
+
NoraMark::Block.new('p', [], [], [], {}, [
|
71
|
+
NoraMark::Text.new("replaced.", line_no)
|
72
|
+
], line_no)
|
73
|
+
], line_no)
|
69
74
|
first_pgroup.wrap(new_node)
|
70
75
|
body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
|
71
76
|
expect(body.element_children[0].selector_and_children(remove_id: false))
|
72
77
|
.to eq(['div#the_id.the_class', ['p', '1st line.'], ['p', 'replaced.']])
|
73
78
|
end
|
74
79
|
|
75
|
-
it 'append to existing node'
|
80
|
+
it 'append to existing node' do
|
76
81
|
noramark = NoraMark::Document.parse(@text)
|
77
82
|
page = noramark.root.children[0]
|
78
83
|
first_pgroup = page.children[0]
|
79
84
|
line_no = first_pgroup.line_no
|
80
|
-
new_node = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [
|
85
|
+
new_node = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [NoraMark::Text.new("added.", line_no)], line_no)
|
81
86
|
first_pgroup.after(new_node)
|
82
87
|
body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
|
83
88
|
expect(body.element_children[0].selector_and_children(remove_id: false))
|
84
89
|
.to eq(
|
85
|
-
|
90
|
+
['p', '1st line.']
|
91
|
+
)
|
86
92
|
expect(body.element_children[1].selector_and_children(remove_id: false))
|
87
93
|
.to eq(
|
88
|
-
|
94
|
+
['p#the_id.the_class', 'added.']
|
95
|
+
)
|
89
96
|
expect(body.element_children[2].selector_and_children(remove_id: false))
|
90
97
|
.to eq(
|
91
|
-
|
98
|
+
['div.the_class', ['p', '3rd line.']]
|
99
|
+
)
|
92
100
|
end
|
93
101
|
|
94
|
-
it 'append to the last existing node'
|
102
|
+
it 'append to the last existing node' do
|
95
103
|
noramark = NoraMark::Document.parse(@text)
|
96
104
|
page = noramark.root.children[0]
|
97
105
|
last_pgroup = page.children[2]
|
98
106
|
line_no = last_pgroup.line_no
|
99
|
-
new_node = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [
|
107
|
+
new_node = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [NoraMark::Text.new("added.", line_no)], line_no)
|
100
108
|
last_pgroup.after(new_node)
|
101
109
|
body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
|
102
110
|
expect(body.element_children[1].selector_and_children(remove_id: false))
|
103
111
|
.to eq(
|
104
|
-
|
112
|
+
['div.the_class', ['p', '3rd line.']]
|
113
|
+
)
|
105
114
|
expect(body.element_children[2].selector_and_children(remove_id: false))
|
106
115
|
.to eq(
|
107
|
-
|
116
|
+
['p', '5th line.']
|
117
|
+
)
|
108
118
|
expect(body.element_children[3].selector_and_children(remove_id: false))
|
109
119
|
.to eq(
|
110
|
-
|
120
|
+
['p#the_id.the_class', 'added.']
|
121
|
+
)
|
111
122
|
end
|
112
|
-
|
113
|
-
it 'prepend to existing node'
|
123
|
+
|
124
|
+
it 'prepend to existing node' do
|
114
125
|
noramark = NoraMark::Document.parse(@text)
|
115
126
|
page = noramark.root.children[0]
|
116
127
|
first_pgroup = page.children[0]
|
117
128
|
line_no = first_pgroup.line_no
|
118
|
-
new_node = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [
|
129
|
+
new_node = NoraMark::ParagraphGroup.new(['the_id'], ['the_class'], [], {}, [NoraMark::Text.new("added.", line_no)], line_no)
|
119
130
|
first_pgroup.before(new_node)
|
120
131
|
body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
|
121
132
|
expect(body.element_children[0].selector_and_children(remove_id: false))
|
122
133
|
.to eq(
|
123
|
-
|
134
|
+
['p#the_id.the_class', 'added.']
|
135
|
+
)
|
124
136
|
expect(body.element_children[1].selector_and_children(remove_id: false))
|
125
137
|
.to eq(
|
126
|
-
|
138
|
+
['p', '1st line.']
|
139
|
+
)
|
127
140
|
expect(body.element_children[2].selector_and_children(remove_id: false))
|
128
141
|
.to eq(
|
129
|
-
|
142
|
+
['div.the_class', ['p', '3rd line.']]
|
143
|
+
)
|
130
144
|
end
|
131
145
|
|
132
146
|
it 'removes node' do
|
@@ -161,7 +175,6 @@ EOF
|
|
161
175
|
.to eq(["body", ["div.the_class", ["p", "3rd line."]], ["p", "5th line."]])
|
162
176
|
end
|
163
177
|
|
164
|
-
|
165
178
|
it 'modify existing node by DSL' do
|
166
179
|
text = "1st line.\nfoobar(title)[level: 3] {\n in the section.\n}\n# section 2."
|
167
180
|
noramark = NoraMark::Document.parse(text, lang: 'ja')
|
@@ -175,13 +188,16 @@ EOF
|
|
175
188
|
body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
|
176
189
|
expect(body.element_children[0].selector_and_children())
|
177
190
|
.to eq(
|
178
|
-
|
191
|
+
['div.pgroup', ['p', '1st line.']]
|
192
|
+
)
|
179
193
|
expect(body.element_children[1].selector_and_children())
|
180
194
|
.to eq(
|
181
|
-
|
195
|
+
['section', ['h3', 'title'], ['div.pgroup', ['p', 'in the section.']]]
|
196
|
+
)
|
182
197
|
expect(body.element_children[2].selector_and_children())
|
183
198
|
.to eq(
|
184
|
-
|
199
|
+
['section', ['h1', 'section 2.']]
|
200
|
+
)
|
185
201
|
end
|
186
202
|
it 'replace existing node by DSL' do
|
187
203
|
text = "1st line.\nfoobar(title)[level: 3] {\n in the section.\n}\n# section 2."
|
@@ -191,20 +207,23 @@ EOF
|
|
191
207
|
replace 'foobar' do
|
192
208
|
block('section',
|
193
209
|
[
|
194
|
-
|
210
|
+
block("h#{@node.named_params[:level]}", @node.params[0]),
|
195
211
|
] + @node.children)
|
196
212
|
end
|
197
213
|
end
|
198
214
|
body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
|
199
215
|
expect(body.element_children[0].selector_and_children())
|
200
216
|
.to eq(
|
201
|
-
|
217
|
+
['div.pgroup', ['p', '1st line.']]
|
218
|
+
)
|
202
219
|
expect(body.element_children[1].selector_and_children())
|
203
220
|
.to eq(
|
204
|
-
|
221
|
+
['section', ['h3', 'title'], ['div.pgroup', ['p', 'in the section.']]]
|
222
|
+
)
|
205
223
|
expect(body.element_children[2].selector_and_children())
|
206
224
|
.to eq(
|
207
|
-
|
225
|
+
['section', ['h1', 'section 2.']]
|
226
|
+
)
|
208
227
|
end
|
209
228
|
it 'generate complex-style headed section' do
|
210
229
|
text = <<EOF
|
@@ -221,26 +240,27 @@ sub: 副見出し
|
|
221
240
|
EOF
|
222
241
|
noramark = NoraMark::Document.parse(text)
|
223
242
|
noramark.add_transformer(generator: :html) do
|
224
|
-
replace({:type => :HeadedSection}) do
|
243
|
+
replace({ :type => :HeadedSection }) do
|
225
244
|
header = block('header',
|
226
245
|
block('div',
|
227
246
|
block("h#{@node.level}", @node.heading),
|
228
|
-
classes: ['hgroup']))
|
247
|
+
classes: ['hgroup']))
|
229
248
|
if (fc = @node.first_child).name == 'sub'
|
230
249
|
fc.name = 'p'
|
231
250
|
fc.classes = ['subh']
|
232
|
-
header.first_child.append_child fc
|
251
|
+
header.first_child.append_child fc
|
233
252
|
end
|
234
|
-
body = block('div', @node.children, classes:['section-body'])
|
235
|
-
block('section', [
|
253
|
+
body = block('div', @node.children, classes: ['section-body'])
|
254
|
+
block('section', [header, body], template: @node)
|
236
255
|
end
|
237
256
|
end
|
238
257
|
body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
|
239
258
|
expect(body.element_children[0].selector_and_children())
|
240
259
|
.to eq(
|
241
|
-
|
242
|
-
|
243
|
-
|
260
|
+
['section', ['header', ['div.hgroup', ['h1', '見出し'], ['p.subh', '副見出し']]],
|
261
|
+
['div.section-body',
|
262
|
+
['div.pgroup', ['p', 'パラグラフ。'], ['p', 'パラグラフ。']]]]
|
263
|
+
)
|
244
264
|
end
|
245
265
|
it 'converts my markup' do
|
246
266
|
text = "speak(Alice): Alice is speaking.\nspeak(Bob): and this is Bob."
|
@@ -254,13 +274,13 @@ EOF
|
|
254
274
|
body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
|
255
275
|
expect(body.element_children[0].selector_and_children())
|
256
276
|
.to eq(
|
257
|
-
|
277
|
+
['p', ['span.speaker', 'Alice'], 'Alice is speaking.']
|
278
|
+
)
|
258
279
|
expect(body.element_children[1].selector_and_children())
|
259
280
|
.to eq(
|
260
|
-
|
261
|
-
|
281
|
+
['p', ['span.speaker', 'Bob'], 'and this is Bob.']
|
282
|
+
)
|
262
283
|
end
|
263
|
-
|
264
284
|
|
265
285
|
it 'should reparent tree' do
|
266
286
|
text = <<EOF
|