pseudohikiparser 0.0.4.develop → 0.0.4
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/pseudohiki/blockparser.rb +15 -100
- data/lib/pseudohiki/htmlformat.rb +0 -57
- data/lib/pseudohiki/markdownformat.rb +1 -8
- data/lib/pseudohiki/version.rb +1 -1
- data/lib/pseudohikiparser.rb +0 -2
- data/test/test_blockparser.rb +0 -67
- data/test/test_htmlformat.rb +0 -363
- data/test/test_markdownformat.rb +0 -153
- data/test/test_plaintextformat.rb +0 -85
- metadata +3 -4
- data/lib/pseudohiki/sinatra_helpers.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38493340a4c48448be37a5e6d800bf6ad0fa8f8f
|
4
|
+
data.tar.gz: 43c9ef5c8dadb24c502d0bdb8f3dd47a511c3157
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 381ec4accb316ca35c4c82d49e9189657a330cfb318e12c0783f528b1c5b41a156352538c0297e232358cb43058c4a3ca90a6fefaf11bea378244a2b3da0c497
|
7
|
+
data.tar.gz: 552e791bf5fc72f022d499a069911b2705d121304c2a23381b3e6e7039287d6019a9dfea005f769c2fe05ea63ecfc99411ccf9bf1fdd8781a19645a23e761bc6
|
@@ -38,21 +38,14 @@ module PseudoHiki
|
|
38
38
|
end
|
39
39
|
|
40
40
|
class BlockStack < TreeStack
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
current_node.parse_leafs(breaker)
|
45
|
-
pop
|
46
|
-
end
|
47
|
-
|
48
|
-
def current_heading_level
|
49
|
-
i = @stack.rindex {|node| node.kind_of? BlockElement::HeadingNode }
|
50
|
-
@stack[i].level || 0
|
41
|
+
def pop
|
42
|
+
current_node.parse_leafs
|
43
|
+
super
|
51
44
|
end
|
52
45
|
end
|
53
46
|
|
54
47
|
class BlockLeaf < BlockStack::Leaf
|
55
|
-
attr_accessor :level, :node_id
|
48
|
+
attr_accessor :level, :node_id
|
56
49
|
|
57
50
|
class << self
|
58
51
|
attr_accessor :head_re
|
@@ -88,7 +81,7 @@ module PseudoHiki
|
|
88
81
|
super(stack)
|
89
82
|
end
|
90
83
|
|
91
|
-
def parse_leafs
|
84
|
+
def parse_leafs
|
92
85
|
parsed = InlineParser.parse(join)
|
93
86
|
clear
|
94
87
|
concat(parsed)
|
@@ -138,10 +131,6 @@ module PseudoHiki
|
|
138
131
|
first.level if first # @cached_level ||= (first.level if first)
|
139
132
|
end
|
140
133
|
|
141
|
-
def decorator
|
142
|
-
first.decorator if first
|
143
|
-
end
|
144
|
-
|
145
134
|
def push_self(stack)
|
146
135
|
@stack = stack
|
147
136
|
super(stack)
|
@@ -151,11 +140,11 @@ module PseudoHiki
|
|
151
140
|
not (kind_of? breaker.block and level == breaker.level)
|
152
141
|
end
|
153
142
|
|
154
|
-
def parse_leafs
|
143
|
+
def parse_leafs; end
|
155
144
|
|
156
145
|
def add_leaf(line, blockparser)
|
157
146
|
leaf = create_leaf(line, blockparser)
|
158
|
-
blockparser.stack.
|
147
|
+
blockparser.stack.pop while blockparser.breakable?(leaf)
|
159
148
|
blockparser.stack.push leaf
|
160
149
|
end
|
161
150
|
|
@@ -167,8 +156,8 @@ module PseudoHiki
|
|
167
156
|
end
|
168
157
|
|
169
158
|
class NonNestedBlockNode < BlockNode
|
170
|
-
def parse_leafs
|
171
|
-
each {|leaf| leaf.parse_leafs
|
159
|
+
def parse_leafs
|
160
|
+
each {|leaf| leaf.parse_leafs }
|
172
161
|
end
|
173
162
|
end
|
174
163
|
|
@@ -186,15 +175,13 @@ module PseudoHiki
|
|
186
175
|
end
|
187
176
|
end
|
188
177
|
|
189
|
-
class UnmatchedSectioningTagError < StandardError; end
|
190
|
-
|
191
178
|
module BlockElement
|
192
179
|
{
|
193
|
-
BlockLeaf => %w(DescLeaf VerbatimLeaf TableLeaf CommentOutLeaf BlockNodeEnd HrLeaf
|
180
|
+
BlockLeaf => %w(DescLeaf VerbatimLeaf TableLeaf CommentOutLeaf BlockNodeEnd HrLeaf),
|
194
181
|
NonNestedBlockLeaf => %w(QuoteLeaf ParagraphLeaf),
|
195
182
|
NestedBlockLeaf => %w(HeadingLeaf),
|
196
183
|
ListTypeLeaf => %w(ListLeaf EnumLeaf),
|
197
|
-
BlockNode => %w(DescNode VerbatimNode TableNode CommentOutNode HrNode
|
184
|
+
BlockNode => %w(DescNode VerbatimNode TableNode CommentOutNode HrNode),
|
198
185
|
NonNestedBlockNode => %w(QuoteNode ParagraphNode),
|
199
186
|
NestedBlockNode => %w(HeadingNode),
|
200
187
|
ListTypeBlockNode => %w(ListNode EnumNode),
|
@@ -217,85 +204,15 @@ module PseudoHiki
|
|
217
204
|
attr_accessor :in_block_tag
|
218
205
|
|
219
206
|
def add_leaf(line, blockparser)
|
220
|
-
return @stack.
|
207
|
+
return @stack.pop if VERBATIM_END =~ line
|
221
208
|
return super(line, blockparser) unless @in_block_tag
|
222
209
|
line = " #{line}" if BlockNodeEnd.head_re =~ line and not @in_block_tag
|
223
210
|
@stack.push VerbatimLeaf.create(line, @in_block_tag)
|
224
211
|
end
|
225
212
|
end
|
226
213
|
|
227
|
-
class DecoratorNode
|
228
|
-
DECORATOR_PAT = /\A(?:([^\[\]:]+))?(?:\[([^\[\]]+)\])?(?::\s*(\S.*))?/o
|
229
|
-
|
230
|
-
class DecoratorItem < Struct.new(:string, :type, :id, :value)
|
231
|
-
def initialize(*args)
|
232
|
-
super
|
233
|
-
self.value = InlineParser.parse(self.value) if self.value
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
def parse_leafs(breaker)
|
238
|
-
decorator = {}
|
239
|
-
breaker.decorator = decorator
|
240
|
-
@stack.remove_current_node.each do |leaf|
|
241
|
-
m = DECORATOR_PAT.match(leaf.join)
|
242
|
-
return nil unless m
|
243
|
-
item = DecoratorItem.new(*(m.to_a))
|
244
|
-
decorator[item.type || :id] = item
|
245
|
-
end
|
246
|
-
end
|
247
|
-
|
248
|
-
def breakable?(breaker)
|
249
|
-
return super if breaker.kind_of? DecoratorLeaf
|
250
|
-
parse_leafs(breaker)
|
251
|
-
@stack.current_node.breakable?(breaker)
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
class DecoratorLeaf
|
256
|
-
def push_sectioning_node(stack, node_class)
|
257
|
-
node = node_class.new
|
258
|
-
m = DecoratorNode::DECORATOR_PAT.match(join)
|
259
|
-
node.node_id = m[2]
|
260
|
-
node.section_level = stack.current_heading_level if node.kind_of? SectioningNode
|
261
|
-
stack.push(node)
|
262
|
-
end
|
263
|
-
|
264
|
-
def push_self(stack)
|
265
|
-
decorator_type = self[0][0]
|
266
|
-
if decorator_type.start_with? "begin[".freeze
|
267
|
-
push_sectioning_node(stack, SectioningNode)
|
268
|
-
elsif decorator_type.start_with? "end[".freeze
|
269
|
-
push_sectioning_node(stack, SectioningNodeEnd)
|
270
|
-
else
|
271
|
-
super
|
272
|
-
end
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
class SectioningNode
|
277
|
-
attr_accessor :section_level
|
278
|
-
|
279
|
-
def breakable?(breaker)
|
280
|
-
breaker.kind_of? HeadingLeaf and @section_level >= breaker.level
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
class SectioningNodeEnd
|
285
|
-
def push_self(stack)
|
286
|
-
n = stack.stack.rindex do |node|
|
287
|
-
node.kind_of? SectioningNode and node.node_id == node_id
|
288
|
-
end
|
289
|
-
raise UnmatchedSectioningTagError unless n
|
290
|
-
stack.pop until stack.stack.length == n
|
291
|
-
rescue UnmatchedSectioningTagError => e
|
292
|
-
STDERR.puts "#{e}: The start tag for '#{node_id}' is not found."
|
293
|
-
# FIXME: The handling of this error should be changed appropriately.
|
294
|
-
end
|
295
|
-
end
|
296
|
-
|
297
214
|
class QuoteNode
|
298
|
-
def parse_leafs
|
215
|
+
def parse_leafs
|
299
216
|
self[0] = BlockParser.parse(self[0], AutoLink::Off)
|
300
217
|
end
|
301
218
|
end
|
@@ -356,8 +273,7 @@ module PseudoHiki
|
|
356
273
|
[HrLeaf, HrNode],
|
357
274
|
[ListLeaf, ListNode],
|
358
275
|
[EnumLeaf, EnumNode],
|
359
|
-
[BlockNodeEnd, BlockNodeEnd]
|
360
|
-
[DecoratorLeaf, DecoratorNode]
|
276
|
+
[BlockNodeEnd, BlockNodeEnd] # special case
|
361
277
|
].each do |leaf, node|
|
362
278
|
PARENT_NODE[leaf] = node
|
363
279
|
end
|
@@ -370,7 +286,6 @@ module PseudoHiki
|
|
370
286
|
['!', HeadingLeaf],
|
371
287
|
['""', QuoteLeaf],
|
372
288
|
['||', TableLeaf],
|
373
|
-
['//@', DecoratorLeaf],
|
374
289
|
['//', CommentOutLeaf],
|
375
290
|
['----\s*$', HrLeaf]]
|
376
291
|
|
@@ -416,7 +331,7 @@ module PseudoHiki
|
|
416
331
|
def read_lines(lines)
|
417
332
|
each_line = lines.respond_to?(:each_line) ? :each_line : :each
|
418
333
|
lines.send(each_line) {|line| @stack.current_node.add_leaf(line, self) }
|
419
|
-
@stack.
|
334
|
+
@stack.pop
|
420
335
|
end
|
421
336
|
end
|
422
337
|
|
@@ -78,7 +78,6 @@ module PseudoHiki
|
|
78
78
|
|
79
79
|
def visit(tree)
|
80
80
|
htmlelement = create_element(tree)
|
81
|
-
decorate(htmlelement, tree)
|
82
81
|
push_visited_results(htmlelement, tree)
|
83
82
|
htmlelement
|
84
83
|
end
|
@@ -97,21 +96,6 @@ module PseudoHiki
|
|
97
96
|
chunks.push tree
|
98
97
|
end
|
99
98
|
|
100
|
-
def decorate(htmlelement, tree)
|
101
|
-
each_decorator(htmlelement, tree) do |elm, decorator|
|
102
|
-
elm[CLASS] = HtmlElement.escape(decorator[CLASS].id) if decorator[CLASS]
|
103
|
-
if id_item = decorator[ID] || decorator[:id]
|
104
|
-
elm[ID] = HtmlElement.escape(id_item.id).upcase
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def each_decorator(element, tree)
|
110
|
-
return unless element.kind_of? HtmlElement
|
111
|
-
return unless tree.kind_of? BlockParser::BlockNode and tree.decorator
|
112
|
-
tree.decorator.tap {|decorator| yield element, decorator }
|
113
|
-
end
|
114
|
-
|
115
99
|
class ListLeafNodeFormatter < self
|
116
100
|
def create_element(tree)
|
117
101
|
super(tree).tap do |elm|
|
@@ -137,7 +121,6 @@ module PseudoHiki
|
|
137
121
|
[EnumNode, "ol"],
|
138
122
|
[TableLeaf, "tr"],
|
139
123
|
[VerbatimNode, "pre"],
|
140
|
-
[SectioningNode, "section"],
|
141
124
|
[CommentOutNode, nil],
|
142
125
|
[HeadingNode, "section"],
|
143
126
|
[DescLeaf, DT],
|
@@ -206,15 +189,6 @@ module PseudoHiki
|
|
206
189
|
|
207
190
|
# for BlockParser
|
208
191
|
|
209
|
-
class << Formatter[TableNode]
|
210
|
-
def decorate(htmlelement, tree)
|
211
|
-
each_decorator(htmlelement, tree) do |elm, decorator|
|
212
|
-
summary = decorator["summary"] && decorator["summary"].value.join
|
213
|
-
htmlelement["summary"] = HtmlElement.escape(summary) if summary
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
192
|
class << Formatter[VerbatimNode]
|
219
193
|
def visit(tree)
|
220
194
|
contents = add_link(@generator.escape(tree.join))
|
@@ -229,37 +203,6 @@ module PseudoHiki
|
|
229
203
|
end
|
230
204
|
end
|
231
205
|
|
232
|
-
class << Formatter[SectioningNode]
|
233
|
-
ID_MARK = "#"
|
234
|
-
|
235
|
-
alias :orig_create_element :create_element
|
236
|
-
|
237
|
-
def section_with_id(tree, node_id)
|
238
|
-
orig_create_element(tree).tap do |elm|
|
239
|
-
elm[ID] = node_id[1..-1] # remove the first charactor from node_id
|
240
|
-
end
|
241
|
-
end
|
242
|
-
|
243
|
-
def section_for_class(tree, node_id)
|
244
|
-
if HtmlElement::HTML5_TAGS.include? node_id
|
245
|
-
@generator.create(node_id)
|
246
|
-
else
|
247
|
-
orig_create_element(tree).tap do |elm|
|
248
|
-
elm[CLASS] = elm[CLASS] ? "#{elm[CLASS]} #{node_id}" : node_id
|
249
|
-
end
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
def create_element(tree)
|
254
|
-
node_id = tree.node_id
|
255
|
-
if node_id.start_with? ID_MARK
|
256
|
-
section_with_id(tree, node_id)
|
257
|
-
else
|
258
|
-
section_for_class(tree, node_id)
|
259
|
-
end
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
206
|
class << Formatter[CommentOutNode]
|
264
207
|
def visit(tree); BLANK; end
|
265
208
|
end
|
@@ -275,14 +275,13 @@ module PseudoHiki
|
|
275
275
|
class VerbatimNodeFormatter < self
|
276
276
|
def visit(tree)
|
277
277
|
element = super(tree)
|
278
|
-
@language_name = language_name(tree)
|
279
278
|
return gfm_verbatim(element) if @options.gfm_style
|
280
279
|
md_verbatim(element)
|
281
280
|
end
|
282
281
|
|
283
282
|
def gfm_verbatim(element)
|
284
283
|
element.tap do |lines|
|
285
|
-
lines.unshift "```#{
|
284
|
+
lines.unshift "```#{$/}"
|
286
285
|
lines.push "```#{$/ * 2}"
|
287
286
|
end
|
288
287
|
end
|
@@ -290,12 +289,6 @@ module PseudoHiki
|
|
290
289
|
def md_verbatim(element)
|
291
290
|
element.join.gsub(/^/o, " ").sub(/ \Z/o, "").concat $/
|
292
291
|
end
|
293
|
-
|
294
|
-
def language_name(tree)
|
295
|
-
tree.decorator.tap do |decorator|
|
296
|
-
return decorator ? decorator["code"].id : ""
|
297
|
-
end
|
298
|
-
end
|
299
292
|
end
|
300
293
|
|
301
294
|
class QuoteNodeFormatter < self
|
data/lib/pseudohiki/version.rb
CHANGED
data/lib/pseudohikiparser.rb
CHANGED
data/test/test_blockparser.rb
CHANGED
@@ -311,73 +311,6 @@ TEXT
|
|
311
311
|
assert_equal([[[["heading"]]]],parsed)
|
312
312
|
end
|
313
313
|
|
314
|
-
|
315
|
-
def test_decorator
|
316
|
-
text = <<TEXT
|
317
|
-
//@class[section_name]
|
318
|
-
!!title of section
|
319
|
-
|
320
|
-
//@summary: Summary of the table
|
321
|
-
||!header 1||! header 2
|
322
|
-
||cell 1||cell 2
|
323
|
-
|
324
|
-
a paragraph.
|
325
|
-
|
326
|
-
//@class[class_name]
|
327
|
-
//@[id_name]
|
328
|
-
another paragraph.
|
329
|
-
TEXT
|
330
|
-
|
331
|
-
tree = PseudoHiki::BlockParser.parse(text.lines.to_a.map {|line| line.chomp })
|
332
|
-
assert_equal(PseudoHiki::BlockParser::BlockNode, tree.class)
|
333
|
-
assert_equal("section_name", tree[0].decorator["class"].id)
|
334
|
-
assert_equal(PseudoHiki::BlockParser::BlockElement::HeadingNode, tree[0].class)
|
335
|
-
assert_equal([[["title of section"]], [[[["header 1"]], [[" header 2"]]], [[["cell 1"]], [["cell 2"]]]], [[["a paragraph."]]], [[["another paragraph."]]]], tree[0])
|
336
|
-
assert_equal([["Summary of the table"]], tree[0][1].decorator["summary"].value)
|
337
|
-
assert_equal(PseudoHiki::BlockParser::BlockElement::TableNode, tree[0][1].class)
|
338
|
-
assert_equal(nil, tree[0][2].decorator)
|
339
|
-
assert_equal('id_name', tree[0][3].decorator[:id].id)
|
340
|
-
assert_equal('class_name', tree[0][3].decorator["class"].id)
|
341
|
-
end
|
342
|
-
|
343
|
-
def test_sectioning_node
|
344
|
-
text = <<TEXT
|
345
|
-
! Main title
|
346
|
-
|
347
|
-
//@begin[header]
|
348
|
-
!! first title in header
|
349
|
-
|
350
|
-
paragraph
|
351
|
-
|
352
|
-
!! second title in header
|
353
|
-
|
354
|
-
paragraph2
|
355
|
-
|
356
|
-
//@end[header]
|
357
|
-
|
358
|
-
!! first subtitle in main part
|
359
|
-
|
360
|
-
paragraph3
|
361
|
-
|
362
|
-
TEXT
|
363
|
-
|
364
|
-
expected_tree = [[[[" Main title\n"]],
|
365
|
-
[
|
366
|
-
[[[" first title in header\n"]],
|
367
|
-
[[["paragraph\n"]]]],
|
368
|
-
[[[" second title in header\n"]],
|
369
|
-
[[["paragraph2\n"]]]]
|
370
|
-
],
|
371
|
-
[[[" first subtitle in main part\n"]],
|
372
|
-
[[["paragraph3\n"]]]]]]
|
373
|
-
|
374
|
-
|
375
|
-
tree = PseudoHiki::BlockParser.parse(text)
|
376
|
-
assert_equal(expected_tree, tree)
|
377
|
-
assert_kind_of(PseudoHiki::BlockParser::BlockElement::SectioningNode, tree[0][1])
|
378
|
-
assert_equal("header", tree[0][1].node_id)
|
379
|
-
end
|
380
|
-
|
381
314
|
def test_comment_out_followed_by_a_verbatim_block
|
382
315
|
text = <<TEXT
|
383
316
|
the first paragraph
|
data/test/test_htmlformat.rb
CHANGED
@@ -769,369 +769,6 @@ HTML
|
|
769
769
|
assert_equal(xhtml, HtmlFormat.format(tree, {:auto_link_in_verbatim => false }).to_s)
|
770
770
|
end
|
771
771
|
|
772
|
-
def test_decorator
|
773
|
-
text = <<TEXT
|
774
|
-
//@class[section_type]
|
775
|
-
!!title of section
|
776
|
-
|
777
|
-
a paragraph.
|
778
|
-
|
779
|
-
//@class[class_name]
|
780
|
-
//@id[id_name]
|
781
|
-
another paragraph.
|
782
|
-
TEXT
|
783
|
-
|
784
|
-
xhtml = <<HTML
|
785
|
-
<div class="section_type">
|
786
|
-
<h2>title of section</h2>
|
787
|
-
<p>
|
788
|
-
a paragraph.</p>
|
789
|
-
<p class="class_name" id="ID_NAME">
|
790
|
-
another paragraph.</p>
|
791
|
-
<!-- end of section_type -->
|
792
|
-
</div>
|
793
|
-
HTML
|
794
|
-
tree = BlockParser.parse(text.lines.to_a.map {|line| line.chomp })
|
795
|
-
assert_equal(xhtml, XhtmlFormat.format(tree).to_s)
|
796
|
-
end
|
797
|
-
|
798
|
-
def test_decorator_for_table
|
799
|
-
text = <<TEXT
|
800
|
-
//@summary: Summary of the table
|
801
|
-
||!header 1||! header 2
|
802
|
-
||cell 1||cell 2
|
803
|
-
TEXT
|
804
|
-
|
805
|
-
xhtml = <<HTML
|
806
|
-
<table summary="Summary of the table">
|
807
|
-
<tr><th>header 1</th><th> header 2</th></tr>
|
808
|
-
<tr><td>cell 1</td><td>cell 2</td></tr>
|
809
|
-
</table>
|
810
|
-
HTML
|
811
|
-
tree = BlockParser.parse(text.lines.to_a.map {|line| line.chomp })
|
812
|
-
assert_equal(xhtml, XhtmlFormat.format(tree).to_s)
|
813
|
-
end
|
814
|
-
|
815
|
-
def test_decorator_for_verbatim
|
816
|
-
text = <<TEXT
|
817
|
-
//@code[ruby]
|
818
|
-
def bonjour!
|
819
|
-
puts "Bonjour!"
|
820
|
-
end
|
821
|
-
TEXT
|
822
|
-
|
823
|
-
xhtml = <<HTML
|
824
|
-
<pre>
|
825
|
-
def bonjour!
|
826
|
-
puts "Bonjour!"
|
827
|
-
end
|
828
|
-
</pre>
|
829
|
-
HTML
|
830
|
-
|
831
|
-
tree = BlockParser.parse(text.lines.to_a)
|
832
|
-
assert_equal(xhtml, XhtmlFormat.format(tree).to_s)
|
833
|
-
end
|
834
|
-
|
835
|
-
def test_sectioning_node
|
836
|
-
text = <<TEXT
|
837
|
-
! Main title
|
838
|
-
|
839
|
-
//@begin[header]
|
840
|
-
!! first title in header
|
841
|
-
|
842
|
-
paragraph
|
843
|
-
|
844
|
-
!! second title in header
|
845
|
-
|
846
|
-
paragraph2
|
847
|
-
|
848
|
-
//@end[header]
|
849
|
-
|
850
|
-
!! first subtitle in main part
|
851
|
-
|
852
|
-
paragraph3
|
853
|
-
|
854
|
-
//@begin[#footer]
|
855
|
-
|
856
|
-
paragraph4
|
857
|
-
|
858
|
-
//@end[#footer]
|
859
|
-
|
860
|
-
TEXT
|
861
|
-
|
862
|
-
expected_html = <<HTML
|
863
|
-
<div class="section h1">
|
864
|
-
<h1> Main title
|
865
|
-
</h1>
|
866
|
-
<div class="header">
|
867
|
-
<div class="section h2">
|
868
|
-
<h2> first title in header
|
869
|
-
</h2>
|
870
|
-
<p>
|
871
|
-
paragraph
|
872
|
-
</p>
|
873
|
-
<!-- end of section h2 -->
|
874
|
-
</div>
|
875
|
-
<div class="section h2">
|
876
|
-
<h2> second title in header
|
877
|
-
</h2>
|
878
|
-
<p>
|
879
|
-
paragraph2
|
880
|
-
</p>
|
881
|
-
<!-- end of section h2 -->
|
882
|
-
</div>
|
883
|
-
<!-- end of header -->
|
884
|
-
</div>
|
885
|
-
<div class="section h2">
|
886
|
-
<h2> first subtitle in main part
|
887
|
-
</h2>
|
888
|
-
<p>
|
889
|
-
paragraph3
|
890
|
-
</p>
|
891
|
-
<div class="section" id="footer">
|
892
|
-
<p>
|
893
|
-
paragraph4
|
894
|
-
</p>
|
895
|
-
<!-- end of footer -->
|
896
|
-
</div>
|
897
|
-
<!-- end of section h2 -->
|
898
|
-
</div>
|
899
|
-
<!-- end of section h1 -->
|
900
|
-
</div>
|
901
|
-
HTML
|
902
|
-
|
903
|
-
tree = BlockParser.parse(text.lines.to_a)
|
904
|
-
assert_equal(expected_html, XhtmlFormat.format(tree).to_s)
|
905
|
-
end
|
906
|
-
|
907
|
-
def test_sectioning_node_for_html5
|
908
|
-
text = <<TEXT
|
909
|
-
! Main title
|
910
|
-
|
911
|
-
//@begin[header]
|
912
|
-
!! first title in header
|
913
|
-
|
914
|
-
paragraph
|
915
|
-
|
916
|
-
!! second title in header
|
917
|
-
|
918
|
-
paragraph2
|
919
|
-
|
920
|
-
//@end[header]
|
921
|
-
|
922
|
-
!! first subtitle in main part
|
923
|
-
|
924
|
-
paragraph3
|
925
|
-
|
926
|
-
//@begin[#footer]
|
927
|
-
|
928
|
-
paragraph4
|
929
|
-
|
930
|
-
//@end[#footer]
|
931
|
-
|
932
|
-
TEXT
|
933
|
-
|
934
|
-
expected_html = <<HTML
|
935
|
-
<section class="h1">
|
936
|
-
<h1> Main title
|
937
|
-
</h1>
|
938
|
-
<header>
|
939
|
-
<section class="h2">
|
940
|
-
<h2> first title in header
|
941
|
-
</h2>
|
942
|
-
<p>
|
943
|
-
paragraph
|
944
|
-
</p>
|
945
|
-
<!-- end of h2 -->
|
946
|
-
</section>
|
947
|
-
<section class="h2">
|
948
|
-
<h2> second title in header
|
949
|
-
</h2>
|
950
|
-
<p>
|
951
|
-
paragraph2
|
952
|
-
</p>
|
953
|
-
<!-- end of h2 -->
|
954
|
-
</section>
|
955
|
-
</header>
|
956
|
-
<section class="h2">
|
957
|
-
<h2> first subtitle in main part
|
958
|
-
</h2>
|
959
|
-
<p>
|
960
|
-
paragraph3
|
961
|
-
</p>
|
962
|
-
<section id="footer">
|
963
|
-
<p>
|
964
|
-
paragraph4
|
965
|
-
</p>
|
966
|
-
<!-- end of footer -->
|
967
|
-
</section>
|
968
|
-
<!-- end of h2 -->
|
969
|
-
</section>
|
970
|
-
<!-- end of h1 -->
|
971
|
-
</section>
|
972
|
-
HTML
|
973
|
-
|
974
|
-
tree = BlockParser.parse(text.lines.to_a)
|
975
|
-
assert_equal(expected_html, Xhtml5Format.format(tree).to_s)
|
976
|
-
end
|
977
|
-
|
978
|
-
def test_sectioning_node_when_end_tag_is_omitted
|
979
|
-
text = <<TEXT
|
980
|
-
!! First part
|
981
|
-
|
982
|
-
paragraph1
|
983
|
-
|
984
|
-
//@begin[first_sub_part]
|
985
|
-
!!! first title in first sub-part
|
986
|
-
|
987
|
-
paragraph2
|
988
|
-
|
989
|
-
!!! second title in first sub-part
|
990
|
-
|
991
|
-
paragraph3
|
992
|
-
|
993
|
-
//you should put //@end[first_sub_part] here.
|
994
|
-
|
995
|
-
!! Second part
|
996
|
-
|
997
|
-
paragraph4
|
998
|
-
|
999
|
-
//@begin[#footer]
|
1000
|
-
|
1001
|
-
paragraph5
|
1002
|
-
|
1003
|
-
//@end[#footer]
|
1004
|
-
|
1005
|
-
TEXT
|
1006
|
-
|
1007
|
-
expected_html = <<HTML
|
1008
|
-
<div class=\"section h2\">
|
1009
|
-
<h2> First part
|
1010
|
-
</h2>
|
1011
|
-
<p>
|
1012
|
-
paragraph1
|
1013
|
-
</p>
|
1014
|
-
<div class=\"section first_sub_part\">
|
1015
|
-
<div class=\"section h3\">
|
1016
|
-
<h3> first title in first sub-part
|
1017
|
-
</h3>
|
1018
|
-
<p>
|
1019
|
-
paragraph2
|
1020
|
-
</p>
|
1021
|
-
<!-- end of section h3 -->
|
1022
|
-
</div>
|
1023
|
-
<div class=\"section h3\">
|
1024
|
-
<h3> second title in first sub-part
|
1025
|
-
</h3>
|
1026
|
-
<p>
|
1027
|
-
paragraph3
|
1028
|
-
</p>
|
1029
|
-
<!-- end of section h3 -->
|
1030
|
-
</div>
|
1031
|
-
<!-- end of section first_sub_part -->
|
1032
|
-
</div>
|
1033
|
-
<!-- end of section h2 -->
|
1034
|
-
</div>
|
1035
|
-
<div class=\"section h2\">
|
1036
|
-
<h2> Second part
|
1037
|
-
</h2>
|
1038
|
-
<p>
|
1039
|
-
paragraph4
|
1040
|
-
</p>
|
1041
|
-
<div class=\"section\" id=\"footer\">
|
1042
|
-
<p>
|
1043
|
-
paragraph5
|
1044
|
-
</p>
|
1045
|
-
<!-- end of footer -->
|
1046
|
-
</div>
|
1047
|
-
<!-- end of section h2 -->
|
1048
|
-
</div>
|
1049
|
-
HTML
|
1050
|
-
|
1051
|
-
tree = BlockParser.parse(text.lines.to_a)
|
1052
|
-
assert_equal(expected_html, XhtmlFormat.format(tree).to_s)
|
1053
|
-
end
|
1054
|
-
|
1055
|
-
def test_sectioning_node_when_end_tag_is_wrongly_placed
|
1056
|
-
text = <<TEXT
|
1057
|
-
!! First part
|
1058
|
-
|
1059
|
-
paragraph1
|
1060
|
-
|
1061
|
-
//@begin[first_sub_part]
|
1062
|
-
!!! first title in first sub-part
|
1063
|
-
|
1064
|
-
paragraph2
|
1065
|
-
|
1066
|
-
!!! second title in first sub-part
|
1067
|
-
|
1068
|
-
paragraph3
|
1069
|
-
|
1070
|
-
//you should put //@end[first_sub_part] here.
|
1071
|
-
|
1072
|
-
!! Second part
|
1073
|
-
|
1074
|
-
paragraph4
|
1075
|
-
|
1076
|
-
|
1077
|
-
//@end[first_sub_part] this end tag is wrongly placed.
|
1078
|
-
|
1079
|
-
//@begin[#footer]
|
1080
|
-
|
1081
|
-
paragraph5
|
1082
|
-
|
1083
|
-
//@end[#footer]
|
1084
|
-
|
1085
|
-
TEXT
|
1086
|
-
|
1087
|
-
expected_html = <<HTML
|
1088
|
-
<div class=\"section h2\">
|
1089
|
-
<h2> First part
|
1090
|
-
</h2>
|
1091
|
-
<p>
|
1092
|
-
paragraph1
|
1093
|
-
</p>
|
1094
|
-
<div class=\"section first_sub_part\">
|
1095
|
-
<div class=\"section h3\">
|
1096
|
-
<h3> first title in first sub-part
|
1097
|
-
</h3>
|
1098
|
-
<p>
|
1099
|
-
paragraph2
|
1100
|
-
</p>
|
1101
|
-
<!-- end of section h3 -->
|
1102
|
-
</div>
|
1103
|
-
<div class=\"section h3\">
|
1104
|
-
<h3> second title in first sub-part
|
1105
|
-
</h3>
|
1106
|
-
<p>
|
1107
|
-
paragraph3
|
1108
|
-
</p>
|
1109
|
-
<!-- end of section h3 -->
|
1110
|
-
</div>
|
1111
|
-
<!-- end of section first_sub_part -->
|
1112
|
-
</div>
|
1113
|
-
<!-- end of section h2 -->
|
1114
|
-
</div>
|
1115
|
-
<div class=\"section h2\">
|
1116
|
-
<h2> Second part
|
1117
|
-
</h2>
|
1118
|
-
<p>
|
1119
|
-
paragraph4
|
1120
|
-
</p>
|
1121
|
-
<div class=\"section\" id=\"footer\">
|
1122
|
-
<p>
|
1123
|
-
paragraph5
|
1124
|
-
</p>
|
1125
|
-
<!-- end of footer -->
|
1126
|
-
</div>
|
1127
|
-
<!-- end of section h2 -->
|
1128
|
-
</div>
|
1129
|
-
HTML
|
1130
|
-
|
1131
|
-
tree = BlockParser.parse(text.lines.to_a)
|
1132
|
-
assert_equal(expected_html, XhtmlFormat.format(tree).to_s)
|
1133
|
-
end
|
1134
|
-
|
1135
772
|
def test_comment_out_followed_by_a_verbatim_block
|
1136
773
|
text = <<TEXT
|
1137
774
|
the first paragraph
|
data/test/test_markdownformat.rb
CHANGED
@@ -518,159 +518,6 @@ TEXT
|
|
518
518
|
assert_equal(md_text, @formatter.format(tree).to_s)
|
519
519
|
end
|
520
520
|
|
521
|
-
def test_decorator_for_verbatim
|
522
|
-
text = <<TEXT
|
523
|
-
//@code[ruby]
|
524
|
-
def bonjour!
|
525
|
-
puts "Bonjour!"
|
526
|
-
end
|
527
|
-
TEXT
|
528
|
-
|
529
|
-
gfm_text =<<TEXT
|
530
|
-
```ruby
|
531
|
-
def bonjour!
|
532
|
-
puts "Bonjour!"
|
533
|
-
end
|
534
|
-
```
|
535
|
-
|
536
|
-
TEXT
|
537
|
-
|
538
|
-
md_text = <<TEXT
|
539
|
-
def bonjour!
|
540
|
-
puts "Bonjour!"
|
541
|
-
end
|
542
|
-
|
543
|
-
TEXT
|
544
|
-
|
545
|
-
tree = BlockParser.parse(text.lines.to_a)
|
546
|
-
assert_equal(gfm_text, @gfm_formatter.format(tree).to_s)
|
547
|
-
assert_equal(md_text, @formatter.format(tree).to_s)
|
548
|
-
end
|
549
|
-
|
550
|
-
def test_decorator_for_verbatim_block
|
551
|
-
text = <<TEXT
|
552
|
-
//@code[ruby]
|
553
|
-
<<<
|
554
|
-
def bonjour!
|
555
|
-
puts "Bonjour!"
|
556
|
-
end
|
557
|
-
>>>
|
558
|
-
TEXT
|
559
|
-
|
560
|
-
gfm_text =<<TEXT
|
561
|
-
```ruby
|
562
|
-
def bonjour!
|
563
|
-
puts "Bonjour!"
|
564
|
-
end
|
565
|
-
```
|
566
|
-
|
567
|
-
TEXT
|
568
|
-
|
569
|
-
md_text = <<TEXT
|
570
|
-
def bonjour!
|
571
|
-
puts "Bonjour!"
|
572
|
-
end
|
573
|
-
|
574
|
-
TEXT
|
575
|
-
|
576
|
-
tree = BlockParser.parse(text.lines.to_a)
|
577
|
-
assert_equal(gfm_text, @gfm_formatter.format(tree).to_s)
|
578
|
-
assert_equal(md_text, @formatter.format(tree).to_s)
|
579
|
-
end
|
580
|
-
|
581
|
-
def test_without_sectioning_node
|
582
|
-
text = <<TEXT
|
583
|
-
! Main title
|
584
|
-
|
585
|
-
!! first title in header
|
586
|
-
|
587
|
-
paragraph
|
588
|
-
|
589
|
-
!! second title in header
|
590
|
-
|
591
|
-
paragraph2
|
592
|
-
|
593
|
-
!! first subtitle in main part
|
594
|
-
|
595
|
-
paragraph3
|
596
|
-
|
597
|
-
paragraph4
|
598
|
-
|
599
|
-
TEXT
|
600
|
-
|
601
|
-
expected_text = <<HTML
|
602
|
-
# Main title
|
603
|
-
|
604
|
-
## first title in header
|
605
|
-
|
606
|
-
paragraph
|
607
|
-
|
608
|
-
## second title in header
|
609
|
-
|
610
|
-
paragraph2
|
611
|
-
|
612
|
-
## first subtitle in main part
|
613
|
-
|
614
|
-
paragraph3
|
615
|
-
|
616
|
-
paragraph4
|
617
|
-
|
618
|
-
HTML
|
619
|
-
|
620
|
-
tree = BlockParser.parse(text.lines.to_a)
|
621
|
-
assert_equal(expected_text, @gfm_formatter.format(tree).to_s)
|
622
|
-
end
|
623
|
-
|
624
|
-
def test_sectioning_node
|
625
|
-
text = <<TEXT
|
626
|
-
! Main title
|
627
|
-
|
628
|
-
//@begin[header]
|
629
|
-
!! first title in header
|
630
|
-
|
631
|
-
paragraph
|
632
|
-
|
633
|
-
!! second title in header
|
634
|
-
|
635
|
-
paragraph2
|
636
|
-
|
637
|
-
//@end[header]
|
638
|
-
|
639
|
-
!! first subtitle in main part
|
640
|
-
|
641
|
-
paragraph3
|
642
|
-
|
643
|
-
//@begin[#footer]
|
644
|
-
|
645
|
-
paragraph4
|
646
|
-
|
647
|
-
//@end[#footer]
|
648
|
-
|
649
|
-
TEXT
|
650
|
-
|
651
|
-
expected_text = <<HTML
|
652
|
-
# Main title
|
653
|
-
|
654
|
-
## first title in header
|
655
|
-
|
656
|
-
paragraph
|
657
|
-
|
658
|
-
## second title in header
|
659
|
-
|
660
|
-
paragraph2
|
661
|
-
|
662
|
-
## first subtitle in main part
|
663
|
-
|
664
|
-
paragraph3
|
665
|
-
|
666
|
-
paragraph4
|
667
|
-
|
668
|
-
HTML
|
669
|
-
|
670
|
-
tree = BlockParser.parse(text.lines.to_a)
|
671
|
-
assert_equal(expected_text, @gfm_formatter.format(tree).to_s)
|
672
|
-
end
|
673
|
-
|
674
521
|
def test_collect_headings
|
675
522
|
text = <<TEXT
|
676
523
|
!![main-heading] heading
|
@@ -265,89 +265,4 @@ TEXT
|
|
265
265
|
assert_equal(expected_text_in_verbose_mode, PlainTextFormat.format(tree, { :verbose_mode => true }).to_s)
|
266
266
|
assert_equal(expected_text, PlainTextFormat.format(tree, { :verbose_mode => false }).to_s)
|
267
267
|
end
|
268
|
-
|
269
|
-
def test_without_sectioning_node
|
270
|
-
text = <<TEXT
|
271
|
-
! Main title
|
272
|
-
|
273
|
-
!! first title in header
|
274
|
-
|
275
|
-
paragraph
|
276
|
-
|
277
|
-
!! second title in header
|
278
|
-
|
279
|
-
paragraph2
|
280
|
-
|
281
|
-
!! first subtitle in main part
|
282
|
-
|
283
|
-
paragraph3
|
284
|
-
|
285
|
-
paragraph4
|
286
|
-
|
287
|
-
TEXT
|
288
|
-
|
289
|
-
expected_text = <<HTML
|
290
|
-
Main title
|
291
|
-
first title in header
|
292
|
-
paragraph
|
293
|
-
|
294
|
-
second title in header
|
295
|
-
paragraph2
|
296
|
-
|
297
|
-
first subtitle in main part
|
298
|
-
paragraph3
|
299
|
-
|
300
|
-
paragraph4
|
301
|
-
|
302
|
-
HTML
|
303
|
-
|
304
|
-
tree = BlockParser.parse(text.lines.to_a)
|
305
|
-
assert_equal(expected_text, PlainTextFormat.format(tree, { :verbose_mode => false }).to_s)
|
306
|
-
end
|
307
|
-
|
308
|
-
def test_sectioning_node
|
309
|
-
text = <<TEXT
|
310
|
-
! Main title
|
311
|
-
|
312
|
-
//@begin[header]
|
313
|
-
!! first title in header
|
314
|
-
|
315
|
-
paragraph
|
316
|
-
|
317
|
-
!! second title in header
|
318
|
-
|
319
|
-
paragraph2
|
320
|
-
|
321
|
-
//@end[header]
|
322
|
-
|
323
|
-
!! first subtitle in main part
|
324
|
-
|
325
|
-
paragraph3
|
326
|
-
|
327
|
-
//@begin[#footer]
|
328
|
-
|
329
|
-
paragraph4
|
330
|
-
|
331
|
-
//@end[#footer]
|
332
|
-
|
333
|
-
TEXT
|
334
|
-
|
335
|
-
expected_text = <<HTML
|
336
|
-
Main title
|
337
|
-
first title in header
|
338
|
-
paragraph
|
339
|
-
|
340
|
-
second title in header
|
341
|
-
paragraph2
|
342
|
-
|
343
|
-
first subtitle in main part
|
344
|
-
paragraph3
|
345
|
-
|
346
|
-
paragraph4
|
347
|
-
|
348
|
-
HTML
|
349
|
-
|
350
|
-
tree = BlockParser.parse(text.lines.to_a)
|
351
|
-
assert_equal(expected_text, PlainTextFormat.format(tree, { :verbose_mode => false }).to_s)
|
352
|
-
end
|
353
268
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pseudohikiparser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.4
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- HASHIMOTO, Naoki
|
@@ -89,7 +89,6 @@ files:
|
|
89
89
|
- lib/pseudohiki/inlineparser.rb
|
90
90
|
- lib/pseudohiki/markdownformat.rb
|
91
91
|
- lib/pseudohiki/plaintextformat.rb
|
92
|
-
- lib/pseudohiki/sinatra_helpers.rb
|
93
92
|
- lib/pseudohiki/treestack.rb
|
94
93
|
- lib/pseudohiki/utils.rb
|
95
94
|
- lib/pseudohiki/version.rb
|
@@ -123,9 +122,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
123
122
|
version: 1.8.7
|
124
123
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
124
|
requirements:
|
126
|
-
- - "
|
125
|
+
- - ">="
|
127
126
|
- !ruby/object:Gem::Version
|
128
|
-
version:
|
127
|
+
version: '0'
|
129
128
|
requirements: []
|
130
129
|
rubyforge_project:
|
131
130
|
rubygems_version: 2.2.3
|
@@ -1,23 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
begin
|
4
|
-
module Sinatra
|
5
|
-
module PseudoHikiParserHelpers
|
6
|
-
XHTML5_CONTENT_TYPE = 'application/xhtml+xml'
|
7
|
-
def phiki(hiki_data, &block)
|
8
|
-
case content_type
|
9
|
-
when XHTML5_CONTENT_TYPE
|
10
|
-
PseudoHiki::Format.to_html5(hiki_data, &block)
|
11
|
-
else
|
12
|
-
PseudoHiki::Format.to_xhtml(hiki_data, &block)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class Base
|
18
|
-
helpers PseudoHikiParserHelpers
|
19
|
-
end
|
20
|
-
end
|
21
|
-
rescue
|
22
|
-
#Sinatra is not available
|
23
|
-
end
|