nora_mark 0.2beta15 → 0.2beta16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/nora_mark/document.rb +1 -7
- data/lib/nora_mark/html/context.rb +1 -1
- data/lib/nora_mark/html/generator.rb +1 -1
- data/lib/nora_mark/html/pages.rb +10 -0
- data/lib/nora_mark/node.rb +28 -3
- data/lib/nora_mark/rake_task.rb +16 -4
- data/lib/nora_mark/version.rb +1 -1
- data/spec/node_spec.rb +33 -0
- data/spec/nora_mark_spec.rb +22 -4
- data/spec/transformer_spec.rb +102 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d90789f0a20df993346e159dd0b37cdd1f664f9c
|
4
|
+
data.tar.gz: 4c373042623881fcc820041c5454219d12c2f2ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb21f8791bccb24784e2761a4aa3bbe92c77723f83643acf5a60a33e84db5715b99b824b0b77e331c91d83600286d7b87198fff6fce101ca1fbe34d01367e0e5
|
7
|
+
data.tar.gz: 8797e08d2c24486f596028f6b65f036c4097f5126ae058b29feae8dc7a859c4267a250ebeab02b6dc86f4930256f41363e620b1d600a02a94cdbb894533e3068
|
data/lib/nora_mark/document.rb
CHANGED
@@ -50,13 +50,7 @@ module NoraMark
|
|
50
50
|
@root = parser.result
|
51
51
|
@root.document_name ||= @document_name
|
52
52
|
@root.reparent
|
53
|
-
@root.
|
54
|
-
if node.kind_of? Page
|
55
|
-
node.page_no = page_no
|
56
|
-
page_no = page_no + 1
|
57
|
-
end
|
58
|
-
page_no
|
59
|
-
end
|
53
|
+
@root.assign_pageno
|
60
54
|
end
|
61
55
|
frontmatter = instance.root.find_node :type => :Frontmatter
|
62
56
|
if (frontmatter)
|
@@ -93,7 +93,7 @@ module NoraMark
|
|
93
93
|
end
|
94
94
|
|
95
95
|
# save metadata written with Frontmatter Writer
|
96
|
-
def
|
96
|
+
def save_default_metas
|
97
97
|
@default_param[:styleheets] ||= @stylesheets if !@stylesheets.nil? && @stylesheets.size > 0
|
98
98
|
@default_param[:title] ||= @title
|
99
99
|
@default_param[:lang] ||= @lang
|
@@ -26,10 +26,10 @@ module NoraMark
|
|
26
26
|
node_preprocessor: proc do |node|
|
27
27
|
@context.end_html
|
28
28
|
if node.first_child.class == Frontmatter
|
29
|
-
@context.save_metas
|
30
29
|
frontmatter = node.first_child
|
31
30
|
frontmatter_writer.write frontmatter
|
32
31
|
frontmatter.remove
|
32
|
+
@context.save_default_metas
|
33
33
|
end
|
34
34
|
node
|
35
35
|
end);
|
data/lib/nora_mark/html/pages.rb
CHANGED
@@ -57,6 +57,16 @@ module NoraMark
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
60
|
+
def write_toc_as_file(directory: nil)
|
61
|
+
return if @toc.nil?
|
62
|
+
dir = directory || Dir.pwd
|
63
|
+
Dir.chdir(dir) do
|
64
|
+
File.open("#{@file_basename}.yaml", 'w+') do
|
65
|
+
|file|
|
66
|
+
file << YAML.dump(@toc)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
60
70
|
end
|
61
71
|
end
|
62
72
|
end
|
data/lib/nora_mark/node.rb
CHANGED
@@ -36,8 +36,8 @@ module NoraMark
|
|
36
36
|
def each
|
37
37
|
node = self
|
38
38
|
while !node.nil?
|
39
|
-
|
40
|
-
|
39
|
+
node, node_old = node.next, node
|
40
|
+
yield node_old
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
@@ -151,16 +151,31 @@ module NoraMark
|
|
151
151
|
@next = nil
|
152
152
|
end
|
153
153
|
|
154
|
-
def
|
154
|
+
def _remove_internal
|
155
155
|
@parent.first_child = @next if !@parent.nil? && @parent.first_child == self
|
156
156
|
@parent.last_child = @prev if !@parent.nil? && @parent.last_child == self
|
157
157
|
@next.prev = @prev unless @next.nil?
|
158
158
|
@prev.next = @next unless @prev.nil?
|
159
|
+
end
|
160
|
+
|
161
|
+
def remove
|
162
|
+
_remove_internal
|
159
163
|
@parent.children_replaced unless @parent.nil?
|
160
164
|
unlink
|
161
165
|
self
|
162
166
|
end
|
163
167
|
|
168
|
+
def remove_following
|
169
|
+
parent = @parent
|
170
|
+
r = self.map do |node|
|
171
|
+
node._remove_internal
|
172
|
+
node.unlink
|
173
|
+
node
|
174
|
+
end
|
175
|
+
parent.children_replaced
|
176
|
+
r
|
177
|
+
end
|
178
|
+
|
164
179
|
def after(node)
|
165
180
|
node.remove
|
166
181
|
node.parent = @parent
|
@@ -309,6 +324,16 @@ module NoraMark
|
|
309
324
|
|
310
325
|
class Root < Node
|
311
326
|
attr_accessor :document_name
|
327
|
+
|
328
|
+
def assign_pageno
|
329
|
+
@first_child.inject(1) do |page_no, node|
|
330
|
+
if node.kind_of? Page
|
331
|
+
node.page_no = page_no
|
332
|
+
page_no = page_no + 1
|
333
|
+
end
|
334
|
+
page_no
|
335
|
+
end
|
336
|
+
end
|
312
337
|
end
|
313
338
|
|
314
339
|
class Page < Node
|
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
|
6
|
+
attr_accessor :lang, :page_number_digits, :write_toc_file
|
7
7
|
def initialize(lang: 'en')
|
8
8
|
@preprocessors = []
|
9
9
|
@transformers = []
|
@@ -21,6 +21,14 @@ module NoraMark
|
|
21
21
|
@transformers << block;
|
22
22
|
end
|
23
23
|
|
24
|
+
def html
|
25
|
+
return @nora.html if !@nora.nil?
|
26
|
+
end
|
27
|
+
|
28
|
+
def toc
|
29
|
+
return @nora.html.toc if !@nora.nil? && !@nora.html.nil?
|
30
|
+
end
|
31
|
+
|
24
32
|
def define
|
25
33
|
desc "rule for *-nora.txt to *-nora_xxx.html. Use *-nora-transform.rb on same directory as transformer"
|
26
34
|
rule( /-((nora)|(arti))_[0-9]{#{page_number_digits}}\.xhtml/ =>
|
@@ -30,8 +38,9 @@ module NoraMark
|
|
30
38
|
|t|
|
31
39
|
|
32
40
|
dir = File.dirname File.expand_path(t.source)
|
33
|
-
|
34
|
-
|
41
|
+
basename = File.basename(t.source, '.txt')
|
42
|
+
transformer_name = File.join dir, basename + '-transform.rb'
|
43
|
+
@nora =
|
35
44
|
NoraMark::Document.parse(
|
36
45
|
File.open(t.source),
|
37
46
|
:lang => @lang.to_s,
|
@@ -50,7 +59,10 @@ module NoraMark
|
|
50
59
|
doc.add_transformer(text: File.open(transformer_name).read)
|
51
60
|
end
|
52
61
|
end
|
53
|
-
nora.html.write_as_files
|
62
|
+
@nora.html.write_as_files
|
63
|
+
if (@write_toc_file)
|
64
|
+
@nora.html.write_toc_as_file
|
65
|
+
end
|
54
66
|
end
|
55
67
|
|
56
68
|
end
|
data/lib/nora_mark/version.rb
CHANGED
data/spec/node_spec.rb
CHANGED
@@ -129,6 +129,39 @@ EOF
|
|
129
129
|
['div.the_class', ['p', '3rd line.']])
|
130
130
|
end
|
131
131
|
|
132
|
+
it 'removes node' do
|
133
|
+
noramark = NoraMark::Document.parse(@text)
|
134
|
+
page = noramark.root.children[0]
|
135
|
+
second_div = page.children[1]
|
136
|
+
second_div.remove
|
137
|
+
body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
|
138
|
+
expect(body.selector_and_children(remove_id: false))
|
139
|
+
.to eq(["body", ["p", "1st line."], ["p", "5th line."]])
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'removes all nodes after specified node' do
|
143
|
+
noramark = NoraMark::Document.parse(@text)
|
144
|
+
page = noramark.root.children[0]
|
145
|
+
second_div = page.children[1]
|
146
|
+
second_div.remove_following
|
147
|
+
body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
|
148
|
+
expect(body.selector_and_children(remove_id: false))
|
149
|
+
.to eq(["body", ["p", "1st line."]])
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'replace with removed nodes' do
|
153
|
+
noramark = NoraMark::Document.parse(@text)
|
154
|
+
page = noramark.root.children[0]
|
155
|
+
first_p = page.children[0]
|
156
|
+
second_div = page.children[1]
|
157
|
+
removed = second_div.remove_following
|
158
|
+
first_p.replace(removed)
|
159
|
+
body = Nokogiri::XML::Document.parse(noramark.html[0]).root.at_xpath('xmlns:body')
|
160
|
+
expect(body.selector_and_children(remove_id: false))
|
161
|
+
.to eq(["body", ["div.the_class", ["p", "3rd line."]], ["p", "5th line."]])
|
162
|
+
end
|
163
|
+
|
164
|
+
|
132
165
|
it 'modify existing node by DSL' do
|
133
166
|
text = "1st line.\nfoobar(title)[level: 3] {\n in the section.\n}\n# section 2."
|
134
167
|
noramark = NoraMark::Document.parse(text, lang: 'ja')
|
data/spec/nora_mark_spec.rb
CHANGED
@@ -1388,6 +1388,7 @@ EOF
|
|
1388
1388
|
expect(files).to include 'nora-test-file_001.xhtml'
|
1389
1389
|
expect(files).to include 'nora-test-file_002.xhtml'
|
1390
1390
|
end
|
1391
|
+
|
1391
1392
|
end
|
1392
1393
|
describe 'parse and create manual' do
|
1393
1394
|
before {
|
@@ -1421,6 +1422,7 @@ EOF
|
|
1421
1422
|
end
|
1422
1423
|
describe 'table of contents' do
|
1423
1424
|
before do
|
1425
|
+
@basedir = File.join(File.dirname(__FILE__), 'created_files')
|
1424
1426
|
@text = <<EOF
|
1425
1427
|
---
|
1426
1428
|
lang: ja
|
@@ -1436,8 +1438,9 @@ h6: [strong{some column}]
|
|
1436
1438
|
text
|
1437
1439
|
}
|
1438
1440
|
EOF
|
1439
|
-
@noramark = NoraMark::Document.parse(@text, document_name: 'nora')
|
1441
|
+
@noramark = NoraMark::Document.parse(@text, document_name: 'nora-with-toc')
|
1440
1442
|
end
|
1443
|
+
after { Dir.glob(File.join(@basedir, '*.yaml')) { |file| File.delete file } }
|
1441
1444
|
it 'should assign ids to headers' do
|
1442
1445
|
body = Nokogiri::XML::Document.parse(@noramark.html[0]).root.at_xpath('xmlns:body')
|
1443
1446
|
h1 = body.at_xpath('//xmlns:h1')
|
@@ -1452,12 +1455,27 @@ EOF
|
|
1452
1455
|
toc = @noramark.html.toc
|
1453
1456
|
expect(toc.size).to eq 3
|
1454
1457
|
expect(toc[0])
|
1455
|
-
.to eq({link: "
|
1458
|
+
.to eq({link: "nora-with-toc_00001.xhtml#heading_index_1", level: 1, text: "chapter 1"})
|
1456
1459
|
expect(toc[1])
|
1457
|
-
.to eq({link: "
|
1460
|
+
.to eq({link: "nora-with-toc_00001.xhtml#heading_index_2", level: 2, text: "section 1-1"})
|
1458
1461
|
expect(toc[2])
|
1459
|
-
.to eq({link: "
|
1462
|
+
.to eq({link: "nora-with-toc_00002.xhtml#heading_index_3", level: 6, text: "some column"})
|
1463
|
+
end
|
1464
|
+
it 'should generate and write tocs' do
|
1465
|
+
@noramark.html.write_toc_as_file(directory: @basedir)
|
1466
|
+
expect(File.exist?(File.join(@basedir, 'nora-with-toc.yaml')))
|
1467
|
+
File.open(File.join(@basedir, 'nora-with-toc.yaml')) do
|
1468
|
+
|file|
|
1469
|
+
toc = YAML.load(file.read)
|
1470
|
+
expect(toc[0])
|
1471
|
+
.to eq({link: "nora-with-toc_00001.xhtml#heading_index_1", level: 1, text: "chapter 1"})
|
1472
|
+
expect(toc[1])
|
1473
|
+
.to eq({link: "nora-with-toc_00001.xhtml#heading_index_2", level: 2, text: "section 1-1"})
|
1474
|
+
expect(toc[2])
|
1475
|
+
.to eq({link: "nora-with-toc_00002.xhtml#heading_index_3", level: 6, text: "some column"})
|
1476
|
+
end
|
1460
1477
|
end
|
1478
|
+
|
1461
1479
|
end
|
1462
1480
|
it 'should raise error' do
|
1463
1481
|
text = "d {\n block is\nd {\n nested but\nd {\n not terminated }"
|
data/spec/transformer_spec.rb
CHANGED
@@ -18,9 +18,15 @@ d.class-1 {
|
|
18
18
|
text is here
|
19
19
|
}
|
20
20
|
|
21
|
+
#(split-me) section 2
|
22
|
+
|
23
|
+
next text.
|
24
|
+
|
25
|
+
# section 3
|
21
26
|
EOF
|
22
27
|
@parsed = NoraMark::Document.parse(@text)
|
23
28
|
end
|
29
|
+
|
24
30
|
it 'can access frontmatter' do
|
25
31
|
@parsed.add_transformer(generator: :html) do
|
26
32
|
modify 'd' do
|
@@ -34,4 +40,100 @@ EOF
|
|
34
40
|
['div.custom1', ['div.pgroup', ['p', 'text is here']]]]
|
35
41
|
)
|
36
42
|
end
|
43
|
+
it 'can split page' do
|
44
|
+
@parsed.add_transformer(generator: :html) do
|
45
|
+
modify type: :Root do
|
46
|
+
def split page
|
47
|
+
splitted = page.children.inject([]) do |result, node|
|
48
|
+
if node.params && node.params.select { |param| param.text == 'split-me' }.size > 0
|
49
|
+
rest = node.remove_following
|
50
|
+
as_page = rest.shift
|
51
|
+
result << NoraMark::Page.new([as_page], as_page.line_no)
|
52
|
+
result = result + split(NoraMark::Page.new(rest, rest[0].line_no)) if rest.size > 0
|
53
|
+
end
|
54
|
+
result
|
55
|
+
end
|
56
|
+
splitted.unshift page
|
57
|
+
end
|
58
|
+
@node.children.each do |page|
|
59
|
+
splitted = split page
|
60
|
+
if (splitted.size > 1)
|
61
|
+
page = splitted.shift
|
62
|
+
splitted.inject(page) do |page_before, page_after|
|
63
|
+
page_before.after(page_after)
|
64
|
+
page_after
|
65
|
+
end
|
66
|
+
@node.assign_pageno
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
converted = @parsed.html
|
72
|
+
expect(converted.size).to eq(3)
|
73
|
+
body = Nokogiri::XML::Document.parse(@parsed.html[0]).root.at_xpath('xmlns:body')
|
74
|
+
expect(body.element_children[0].selector_and_children())
|
75
|
+
.to eq(
|
76
|
+
['section', ['h1', 'section 1'],
|
77
|
+
['div.class-1', ['div.pgroup', ['p', 'text is here']]]]
|
78
|
+
)
|
79
|
+
|
80
|
+
body = Nokogiri::XML::Document.parse(@parsed.html[1]).root.at_xpath('xmlns:body')
|
81
|
+
expect(body.element_children[0].selector_and_children())
|
82
|
+
.to eq(
|
83
|
+
["section", ["h1", "section 2"],
|
84
|
+
["div.pgroup", ["p", "next text."]]]
|
85
|
+
)
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'can add frontmatter' do
|
89
|
+
@parsed.add_transformer(generator: :html) do
|
90
|
+
modify type: :Root do
|
91
|
+
def split page
|
92
|
+
splitted = page.children.inject([]) do |result, node|
|
93
|
+
if node.params && node.params.select { |param| param.text == 'split-me' }.size > 0
|
94
|
+
rest = node.remove_following
|
95
|
+
as_page = rest.shift
|
96
|
+
new_frontmatter = NoraMark::Frontmatter.new(['stylesheets: new_stylesheet.css'], as_page.line_no)
|
97
|
+
|
98
|
+
result << NoraMark::Page.new([new_frontmatter, as_page], as_page.line_no)
|
99
|
+
result = result + split(NoraMark::Page.new(rest, rest[0].line_no)) if rest.size > 0
|
100
|
+
end
|
101
|
+
result
|
102
|
+
end
|
103
|
+
splitted.unshift page
|
104
|
+
end
|
105
|
+
|
106
|
+
@node.children.each do |page|
|
107
|
+
splitted = split page
|
108
|
+
if (splitted.size > 1)
|
109
|
+
page = splitted.shift
|
110
|
+
splitted.inject(page) do |page_before, page_after|
|
111
|
+
page_before.after(page_after)
|
112
|
+
page_after
|
113
|
+
end
|
114
|
+
@node.assign_pageno
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
end
|
120
|
+
html = @parsed.html
|
121
|
+
body1 = Nokogiri::XML::Document.parse(html[0]).root.at_xpath('xmlns:body')
|
122
|
+
expect(body1.element_children[0].selector_and_children())
|
123
|
+
.to eq(
|
124
|
+
['section', ['h1', 'section 1'],
|
125
|
+
['div.class-1', ['div.pgroup', ['p', 'text is here']]]]
|
126
|
+
)
|
127
|
+
head2 = Nokogiri::XML::Document.parse(html[1]).root.at_xpath('xmlns:head')
|
128
|
+
expect(head2.element_children[1].a).to eq ["link[rel='stylesheet'][type='text/css'][href='new_stylesheet.css']", '']
|
129
|
+
|
130
|
+
body2 = Nokogiri::XML::Document.parse(@parsed.html[1]).root.at_xpath('xmlns:body')
|
131
|
+
expect(body2.element_children[0].selector_and_children())
|
132
|
+
.to eq(
|
133
|
+
["section", ["h1", "section 2"],
|
134
|
+
["div.pgroup", ["p", "next text."]]]
|
135
|
+
)
|
136
|
+
|
137
|
+
|
138
|
+
end
|
37
139
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nora_mark
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2beta16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KOJIMA Satoshi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kpeg
|