nora_mark 0.2beta6 → 0.2beta7
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/CHANGELOG.md +8 -0
- data/README.md +86 -2
- data/example/nora-simple-ja.css +19 -0
- data/example/nora-simple.css +6 -15
- data/example/noramark-reference-ja.nora +23 -1
- data/example/noramark-reference-ja_00001.xhtml +39 -23
- data/lib/nora_mark/html/abstract_node_writer.rb +1 -1
- data/lib/nora_mark/html/context.rb +4 -3
- data/lib/nora_mark/html/generator.rb +58 -27
- data/lib/nora_mark/html/pages.rb +50 -37
- data/lib/nora_mark/html/paragraph_writer.rb +3 -3
- data/lib/nora_mark/html/tag_writer.rb +8 -7
- data/lib/nora_mark/node.rb +258 -2
- data/lib/nora_mark/node_builder.rb +18 -0
- data/lib/nora_mark/node_set.rb +24 -0
- data/lib/nora_mark/node_util.rb +38 -0
- data/lib/nora_mark/parser.kpeg +72 -57
- data/lib/nora_mark/parser.kpeg.rb +766 -246
- data/lib/nora_mark/transformer.rb +43 -0
- data/lib/nora_mark/version.rb +1 -1
- data/lib/nora_mark.rb +28 -11
- data/spec/nokogiri_test_helper.rb +9 -9
- data/spec/nora_mark_spec.rb +236 -9
- metadata +7 -2
@@ -0,0 +1,43 @@
|
|
1
|
+
module NoraMark
|
2
|
+
class Transformer
|
3
|
+
def initialize(rules, options)
|
4
|
+
@rules = rules
|
5
|
+
@options = options
|
6
|
+
end
|
7
|
+
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)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class TransformerFactory
|
19
|
+
attr_accessor :rules, :options
|
20
|
+
|
21
|
+
def self.create(text: nil, &block)
|
22
|
+
instance = new
|
23
|
+
instance.instance_eval do
|
24
|
+
@rules = []
|
25
|
+
@options = {}
|
26
|
+
if text
|
27
|
+
instance_eval text
|
28
|
+
else
|
29
|
+
instance_eval &block
|
30
|
+
end
|
31
|
+
Transformer.new(@rules, @options)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def transform_options options
|
36
|
+
(@options ||= {}).merge options
|
37
|
+
end
|
38
|
+
|
39
|
+
def for_node(selector, action = :replace, &block)
|
40
|
+
@rules << [ selector, action, block ]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/nora_mark/version.rb
CHANGED
data/lib/nora_mark.rb
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
require "nora_mark/version"
|
2
2
|
require 'nora_mark/html/generator'
|
3
|
-
require 'nora_mark/node'
|
4
3
|
require 'nora_mark/parser'
|
4
|
+
require 'nora_mark/node_util'
|
5
|
+
require 'nora_mark/node'
|
6
|
+
require 'nora_mark/node_set'
|
7
|
+
require 'nora_mark/transformer'
|
8
|
+
require 'nora_mark/node_builder'
|
5
9
|
require 'securerandom'
|
6
10
|
|
7
11
|
module NoraMark
|
8
|
-
class Document
|
9
|
-
attr_accessor :document_name
|
12
|
+
class Document
|
13
|
+
attr_accessor :document_name, :root
|
10
14
|
private_class_method :new
|
11
15
|
|
12
16
|
def self.parse(string_or_io, param = {})
|
@@ -18,11 +22,20 @@ module NoraMark
|
|
18
22
|
|pr|
|
19
23
|
src = pr.call(src)
|
20
24
|
end
|
21
|
-
|
22
|
-
if (
|
23
|
-
raise
|
25
|
+
parser = Parser.new(src)
|
26
|
+
if (!parser.parse)
|
27
|
+
raise parser.raise_error
|
28
|
+
end
|
29
|
+
@root = parser.result
|
30
|
+
@root.document_name ||= @document_name
|
31
|
+
@root.reparent
|
32
|
+
@root.first_child.inject(1) do |page_no, node|
|
33
|
+
if node.kind_of? Page
|
34
|
+
node.page_no = page_no
|
35
|
+
page_no = page_no + 1
|
36
|
+
end
|
37
|
+
page_no
|
24
38
|
end
|
25
|
-
@content = @parser.result
|
26
39
|
end
|
27
40
|
instance
|
28
41
|
end
|
@@ -33,7 +46,8 @@ module NoraMark
|
|
33
46
|
|
34
47
|
def html
|
35
48
|
if @html.nil?
|
36
|
-
@html
|
49
|
+
@transformers[:html].each { |t| t.transform @root }
|
50
|
+
@html = Html::Generator.new(@param).convert(@root.clone, @render_parameter)
|
37
51
|
end
|
38
52
|
@html
|
39
53
|
end
|
@@ -42,16 +56,19 @@ module NoraMark
|
|
42
56
|
@render_parameter.merge! param
|
43
57
|
self
|
44
58
|
end
|
59
|
+
|
60
|
+
def add_transformer(generator: :html, text: nil, &block)
|
61
|
+
(@transformers[generator] ||= []) << TransformerFactory.create(text: text, &block)
|
62
|
+
end
|
45
63
|
|
46
64
|
def initialize(param = {})
|
65
|
+
@param = param
|
47
66
|
@preprocessors = [
|
48
67
|
Proc.new { |text| text.gsub(/\r?\n(\r?\n)+/, "\n\n") },
|
49
68
|
]
|
50
|
-
@html_generator = Html::Generator.new(param)
|
51
69
|
@document_name = param[:document_name] || "noramark_#{SecureRandom.uuid}"
|
52
70
|
@render_parameter = {}
|
71
|
+
@transformers = { html: []}
|
53
72
|
end
|
54
|
-
|
55
|
-
|
56
73
|
end
|
57
74
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Nokogiri
|
2
2
|
module XML
|
3
3
|
class Element
|
4
|
-
def selector
|
4
|
+
def selector remove_id: true
|
5
5
|
sel = name
|
6
|
-
if !self['id'].nil?
|
6
|
+
if !remove_id && !self['id'].nil?
|
7
7
|
sel = sel + '#' + self['id'].split(' ').join('#')
|
8
8
|
end
|
9
9
|
if !self['class'].nil?
|
@@ -15,8 +15,8 @@ module Nokogiri
|
|
15
15
|
}
|
16
16
|
sel
|
17
17
|
end
|
18
|
-
def selector_and_text
|
19
|
-
[selector, text]
|
18
|
+
def selector_and_text remove_id: true
|
19
|
+
[selector(remove_id: remove_id), text]
|
20
20
|
end
|
21
21
|
alias a selector_and_text
|
22
22
|
def child_loop
|
@@ -25,17 +25,17 @@ module Nokogiri
|
|
25
25
|
def child_a(index)
|
26
26
|
element_children[index].selector_and_text
|
27
27
|
end
|
28
|
-
def selector_and_children
|
29
|
-
[selector] + children.select{|c| c.elem? || c.text.strip.size > 0}.map{|c|
|
28
|
+
def selector_and_children remove_id: true
|
29
|
+
[selector(remove_id: remove_id)] + children.select{|c| c.elem? || c.text.strip.size > 0}.map{|c|
|
30
30
|
if !c.elem?
|
31
31
|
c.text
|
32
32
|
elsif c.element_children.size == 0
|
33
|
-
c.selector_and_text
|
33
|
+
c.selector_and_text remove_id: remove_id
|
34
34
|
else
|
35
|
-
c.selector_and_children
|
35
|
+
c.selector_and_children remove_id: remove_id
|
36
36
|
end
|
37
37
|
}
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
41
|
-
end
|
41
|
+
end
|
data/spec/nora_mark_spec.rb
CHANGED
@@ -77,7 +77,7 @@ describe NoraMark do
|
|
77
77
|
|
78
78
|
|
79
79
|
it 'should convert simple paragraph in english mode specified in frontmatter' do
|
80
|
-
text = "---\nlang: en\ntitle: the title\n---\nparagraph begins.\n2nd line.\n 3rd line.\n\n\n next paragraph."
|
80
|
+
text = "---\nlang: en\ntitle: the title\n---\n\n\n\nparagraph begins.\n2nd line.\n 3rd line.\n\n\n next paragraph."
|
81
81
|
noramark = NoraMark::Document.parse(text)
|
82
82
|
converted = noramark.html
|
83
83
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
@@ -195,8 +195,26 @@ describe NoraMark do
|
|
195
195
|
)
|
196
196
|
end
|
197
197
|
|
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
|
+
|
198
216
|
it 'should nest div without pgroup and with pgroup' do
|
199
|
-
text = "d(wo-pgroup) {\nd {\nnested.\n} \n}\nd {\nin pgroup\n}"
|
217
|
+
text = "d(wo-pgroup) {\nd {\nnested.\n} \n}\n\nd {\nin pgroup\n}"
|
200
218
|
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
201
219
|
converted = noramark.html
|
202
220
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
@@ -232,9 +250,9 @@ describe NoraMark do
|
|
232
250
|
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
233
251
|
converted = noramark.html
|
234
252
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
235
|
-
expect(body.element_children[0].selector_and_children).to eq(
|
253
|
+
expect(body.element_children[0].selector_and_children(remove_id: false)).to eq(
|
236
254
|
['div#thecontents.preface-one',
|
237
|
-
['h1', 'title.']
|
255
|
+
['h1#heading_index_1', 'title.']
|
238
256
|
]
|
239
257
|
)
|
240
258
|
end
|
@@ -370,7 +388,7 @@ describe NoraMark do
|
|
370
388
|
end
|
371
389
|
|
372
390
|
it 'should handle block image with before caption' do
|
373
|
-
text = "this is normal line.\nimage(./image1.jpg, alt text
|
391
|
+
text = "this is normal line.\nimage(./image1.jpg, alt text)[caption_before: true]: caption text"
|
374
392
|
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
375
393
|
converted = noramark.html
|
376
394
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
@@ -891,16 +909,18 @@ EOF
|
|
891
909
|
)
|
892
910
|
end
|
893
911
|
it 'should convert markdown style heading with empty body' do
|
894
|
-
text = "=: タイトルです。\n==:
|
912
|
+
text = "=: タイトルです。\n*:中身です。\n\n==: 次のタイトルです。これから書きます。\n\n==:ここもこれから。"
|
895
913
|
noramark = NoraMark::Document.parse(text, lang: 'ja', title: 'the title')
|
896
914
|
converted = noramark.html
|
897
915
|
body = Nokogiri::XML::Document.parse(converted[0]).root.at_xpath('xmlns:body')
|
898
|
-
expect(body.element_children.size).to eq 1
|
899
916
|
expect(body.element_children[0].selector_and_children).to eq(
|
900
917
|
['section',
|
901
918
|
['h1', 'タイトルです。'],
|
919
|
+
['ul', ['li', '中身です。']],
|
902
920
|
['section',
|
903
|
-
['h2', '次のタイトルです。これから書きます。']]
|
921
|
+
['h2', '次のタイトルです。これから書きます。']],
|
922
|
+
['section',
|
923
|
+
['h2', 'ここもこれから。']]])
|
904
924
|
end
|
905
925
|
it 'should markdown style heading interrupted by other headed section' do
|
906
926
|
text = "=: タイトルです。\r\nこれは、セクションの中です。\n =: また次のセクションです。\n次のセクションの中です。"
|
@@ -1025,13 +1045,220 @@ EOF
|
|
1025
1045
|
to_validate << nokogiri_doc.to_s
|
1026
1046
|
end
|
1027
1047
|
end
|
1028
|
-
|
1029
1048
|
@stdout = capture(:stdout) do
|
1030
1049
|
puts %x(java -jar #{jar} -c #{schema} #{file_to_validate})
|
1031
1050
|
end
|
1032
1051
|
expect(@stdout.strip).to eq ""
|
1033
1052
|
end
|
1034
1053
|
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
|
+
describe 'table of contents' do
|
1226
|
+
before do
|
1227
|
+
@text = <<EOF
|
1228
|
+
---
|
1229
|
+
lang: ja
|
1230
|
+
title: title
|
1231
|
+
---
|
1232
|
+
=: [strong{chapter 1}]
|
1233
|
+
text
|
1234
|
+
==: section 1-1
|
1235
|
+
text
|
1236
|
+
newpage:
|
1237
|
+
section {
|
1238
|
+
h6: [strong{some column}]
|
1239
|
+
text
|
1240
|
+
}
|
1241
|
+
EOF
|
1242
|
+
@noramark = NoraMark::Document.parse(@text, document_name: 'nora')
|
1243
|
+
end
|
1244
|
+
it 'should assign ids to headers' do
|
1245
|
+
body = Nokogiri::XML::Document.parse(@noramark.html[0]).root.at_xpath('xmlns:body')
|
1246
|
+
h1 = body.at_xpath('//xmlns:h1')
|
1247
|
+
expect(h1.selector remove_id: false).to eq "h1#heading_index_1"
|
1248
|
+
h2 = body.at_xpath('//xmlns:h2')
|
1249
|
+
expect(h2.selector remove_id: false).to eq "h2#heading_index_2"
|
1250
|
+
body = Nokogiri::XML::Document.parse(@noramark.html[1]).root.at_xpath('xmlns:body')
|
1251
|
+
h6 = body.at_xpath('//xmlns:h6')
|
1252
|
+
expect(h6.selector remove_id: false).to eq "h6#heading_index_3"
|
1253
|
+
end
|
1254
|
+
it 'should generate tocs' do
|
1255
|
+
toc = @noramark.html.toc
|
1256
|
+
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"})
|
1260
|
+
end
|
1261
|
+
end
|
1035
1262
|
end
|
1036
1263
|
end
|
1037
1264
|
|
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.2beta7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KOJIMA Satoshi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kpeg
|
@@ -82,6 +82,7 @@ files:
|
|
82
82
|
- README.md
|
83
83
|
- Rakefile
|
84
84
|
- bin/nora2html
|
85
|
+
- example/nora-simple-ja.css
|
85
86
|
- example/nora-simple.css
|
86
87
|
- example/noramark-reference-ja.nora
|
87
88
|
- example/noramark-reference-ja_00001.xhtml
|
@@ -96,9 +97,13 @@ files:
|
|
96
97
|
- lib/nora_mark/html/util.rb
|
97
98
|
- lib/nora_mark/html/writer_selector.rb
|
98
99
|
- lib/nora_mark/node.rb
|
100
|
+
- lib/nora_mark/node_builder.rb
|
101
|
+
- lib/nora_mark/node_set.rb
|
102
|
+
- lib/nora_mark/node_util.rb
|
99
103
|
- lib/nora_mark/parser.kpeg
|
100
104
|
- lib/nora_mark/parser.kpeg.rb
|
101
105
|
- lib/nora_mark/parser.rb
|
106
|
+
- lib/nora_mark/transformer.rb
|
102
107
|
- lib/nora_mark/version.rb
|
103
108
|
- nora_mark.gemspec
|
104
109
|
- spec/created_files/.gitignore
|