pseudohikiparser 0.0.3.develop → 0.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 +4 -4
- data/lib/pseudohiki/blockparser.rb +15 -49
- data/lib/pseudohiki/htmlformat.rb +0 -24
- 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 -29
- data/test/test_htmlformat.rb +0 -63
- data/test/test_markdownformat.rb +0 -60
- 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: 32c71494df02c4ef6701259bd2f7731e2ec14508
|
4
|
+
data.tar.gz: fb7bceffb5fc2f9d67c6959bd71485862e71bff2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a3a20edf96dba9d41d837dc44009f4b1bb6eb6136476abd08cfaf882bcde8a213ded999647f2a067548b7b3f089e768390399d7e8f69fdccdbb6f4bcdff871b
|
7
|
+
data.tar.gz: 14cb9c5b77e7e4cdc9f153e91c0c8d2f4ae85a292637dcfa5c55d0982ef5b3adb3faa92e140184f318e33b76c00e1106affabf252c270d38e3d4aeca1e369ca5
|
@@ -37,14 +37,14 @@ module PseudoHiki
|
|
37
37
|
end
|
38
38
|
|
39
39
|
class BlockStack < TreeStack
|
40
|
-
def
|
41
|
-
self.current_node.parse_leafs
|
42
|
-
|
40
|
+
def pop
|
41
|
+
self.current_node.parse_leafs
|
42
|
+
super
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
46
|
class BlockLeaf < BlockStack::Leaf
|
47
|
-
attr_accessor :nominal_level, :node_id
|
47
|
+
attr_accessor :nominal_level, :node_id
|
48
48
|
|
49
49
|
def self.head_re=(head_regex)
|
50
50
|
@self_head_re = head_regex
|
@@ -84,7 +84,7 @@ module PseudoHiki
|
|
84
84
|
super(stack)
|
85
85
|
end
|
86
86
|
|
87
|
-
def parse_leafs
|
87
|
+
def parse_leafs
|
88
88
|
parsed = InlineParser.parse(self.join)
|
89
89
|
self.clear
|
90
90
|
self.concat(parsed)
|
@@ -134,10 +134,6 @@ module PseudoHiki
|
|
134
134
|
first.nominal_level if first # @cached_nominal_level ||= (first.nominal_level if first)
|
135
135
|
end
|
136
136
|
|
137
|
-
def decorator
|
138
|
-
first.decorator if first
|
139
|
-
end
|
140
|
-
|
141
137
|
def push_self(stack)
|
142
138
|
@stack = stack
|
143
139
|
super(stack)
|
@@ -147,7 +143,7 @@ module PseudoHiki
|
|
147
143
|
not (kind_of?(breaker.block) and nominal_level == breaker.nominal_level)
|
148
144
|
end
|
149
145
|
|
150
|
-
def parse_leafs
|
146
|
+
def parse_leafs; end
|
151
147
|
|
152
148
|
def in_link_tag?(preceding_str)
|
153
149
|
preceding_str[-2, 2] == "[[".freeze or preceding_str[-1, 1] == "|".freeze
|
@@ -159,7 +155,7 @@ module PseudoHiki
|
|
159
155
|
|
160
156
|
def add_leaf(line, blockparser)
|
161
157
|
leaf = create_leaf(line, blockparser)
|
162
|
-
blockparser.stack.
|
158
|
+
blockparser.stack.pop while blockparser.breakable?(leaf)
|
163
159
|
blockparser.stack.push leaf
|
164
160
|
end
|
165
161
|
|
@@ -171,8 +167,8 @@ module PseudoHiki
|
|
171
167
|
end
|
172
168
|
|
173
169
|
class NonNestedBlockNode < BlockNode
|
174
|
-
def parse_leafs
|
175
|
-
self.each {|leaf| leaf.parse_leafs
|
170
|
+
def parse_leafs
|
171
|
+
self.each {|leaf| leaf.parse_leafs }
|
176
172
|
end
|
177
173
|
end
|
178
174
|
|
@@ -192,11 +188,11 @@ module PseudoHiki
|
|
192
188
|
|
193
189
|
module BlockElement
|
194
190
|
{
|
195
|
-
BlockLeaf => %w(DescLeaf VerbatimLeaf TableLeaf CommentOutLeaf BlockNodeEnd HrLeaf
|
191
|
+
BlockLeaf => %w(DescLeaf VerbatimLeaf TableLeaf CommentOutLeaf BlockNodeEnd HrLeaf),
|
196
192
|
NonNestedBlockLeaf => %w(QuoteLeaf ParagraphLeaf),
|
197
193
|
NestedBlockLeaf => %w(HeadingLeaf),
|
198
194
|
ListTypeLeaf => %w(ListLeaf EnumLeaf),
|
199
|
-
BlockNode => %w(DescNode VerbatimNode TableNode CommentOutNode HrNode
|
195
|
+
BlockNode => %w(DescNode VerbatimNode TableNode CommentOutNode HrNode),
|
200
196
|
NonNestedBlockNode => %w(QuoteNode ParagraphNode),
|
201
197
|
NestedBlockNode => %w(HeadingNode),
|
202
198
|
ListTypeBlockNode => %w(ListNode EnumNode),
|
@@ -221,43 +217,15 @@ module PseudoHiki
|
|
221
217
|
attr_accessor :in_block_tag
|
222
218
|
|
223
219
|
def add_leaf(line, blockparser)
|
224
|
-
return @stack.
|
220
|
+
return @stack.pop if LINE_PAT::VERBATIM_END =~ line
|
225
221
|
return super(line, blockparser) unless @in_block_tag
|
226
222
|
line = " ".concat(line) if BlockElement::BlockNodeEnd.head_re =~ line and not @in_block_tag
|
227
223
|
@stack.push BlockElement::VerbatimLeaf.create(line, @in_block_tag)
|
228
224
|
end
|
229
225
|
end
|
230
226
|
|
231
|
-
class BlockElement::DecoratorNode
|
232
|
-
DECORATOR_PAT = /\A(?:([^\[\]:]+))?(?:\[([^\[\]]+)\])?(?::\s*(\S.*))?/o
|
233
|
-
|
234
|
-
class DecoratorItem < Struct.new(:string, :type, :id, :value)
|
235
|
-
def initialize(*args)
|
236
|
-
super
|
237
|
-
self.value = InlineParser.parse(self.value) if self.value
|
238
|
-
end
|
239
|
-
end
|
240
|
-
|
241
|
-
def parse_leafs(breaker)
|
242
|
-
decorator = {}
|
243
|
-
breaker.decorator = decorator
|
244
|
-
@stack.remove_current_node.each do |leaf|
|
245
|
-
m = DECORATOR_PAT.match(leaf.join)
|
246
|
-
return nil unless m
|
247
|
-
item = DecoratorItem.new(*(m.to_a))
|
248
|
-
decorator[item.type||:id] = item
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
def breakable?(breaker)
|
253
|
-
return super if breaker.kind_of?(BlockElement::DecoratorLeaf)
|
254
|
-
parse_leafs(breaker)
|
255
|
-
@stack.current_node.breakable?(breaker)
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
227
|
class BlockElement::QuoteNode
|
260
|
-
def parse_leafs
|
228
|
+
def parse_leafs
|
261
229
|
self[0] = BlockParser.parse(self[0])
|
262
230
|
end
|
263
231
|
end
|
@@ -315,8 +283,7 @@ module PseudoHiki
|
|
315
283
|
[ParagraphLeaf, ParagraphNode],
|
316
284
|
[HrLeaf, HrNode],
|
317
285
|
[ListLeaf, ListNode],
|
318
|
-
[EnumLeaf, EnumNode]
|
319
|
-
[DecoratorLeaf, DecoratorNode]
|
286
|
+
[EnumLeaf, EnumNode]
|
320
287
|
].each do |leaf, node|
|
321
288
|
ParentNode[leaf] = node
|
322
289
|
end
|
@@ -334,7 +301,6 @@ module PseudoHiki
|
|
334
301
|
['!', HeadingLeaf],
|
335
302
|
['""', QuoteLeaf],
|
336
303
|
['||', TableLeaf],
|
337
|
-
['//@', DecoratorLeaf],
|
338
304
|
['//', CommentOutLeaf],
|
339
305
|
['----\s*$', HrLeaf]
|
340
306
|
].each do |head, leaf|
|
@@ -373,7 +339,7 @@ module PseudoHiki
|
|
373
339
|
def read_lines(lines)
|
374
340
|
each_line = lines.respond_to?(:each_line) ? :each_line : :each
|
375
341
|
lines.send(each_line) {|line| @stack.current_node.add_leaf(line, self) }
|
376
|
-
@stack.
|
342
|
+
@stack.pop
|
377
343
|
end
|
378
344
|
end
|
379
345
|
end
|
@@ -61,7 +61,6 @@ module PseudoHiki
|
|
61
61
|
|
62
62
|
def visit(tree)
|
63
63
|
htmlelement = create_self_element(tree)
|
64
|
-
decorate(htmlelement, tree)
|
65
64
|
push_visited_results(htmlelement, tree)
|
66
65
|
htmlelement
|
67
66
|
end
|
@@ -79,21 +78,6 @@ module PseudoHiki
|
|
79
78
|
chunks.push tree
|
80
79
|
end
|
81
80
|
|
82
|
-
def decorate(htmlelement, tree)
|
83
|
-
each_decorator(htmlelement, tree) do |element, decorator|
|
84
|
-
element[CLASS] = HtmlElement.escape(decorator[CLASS].id) if decorator[CLASS]
|
85
|
-
if id_item = decorator[ID]||decorator[:id]
|
86
|
-
element[ID] = HtmlElement.escape(id_item.id).upcase
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def each_decorator(element, tree)
|
92
|
-
return unless element.kind_of? HtmlElement
|
93
|
-
return unless tree.kind_of? BlockParser::BlockNode and tree.decorator
|
94
|
-
tree.decorator.tap {|decorator| yield element, decorator }
|
95
|
-
end
|
96
|
-
|
97
81
|
class ListLeafNodeFormatter < self
|
98
82
|
def create_self_element(tree)
|
99
83
|
super(tree).tap do |element|
|
@@ -192,14 +176,6 @@ module PseudoHiki
|
|
192
176
|
|
193
177
|
#for BlockParser
|
194
178
|
|
195
|
-
class << Formatter[TableNode]
|
196
|
-
def decorate(htmlelement, tree)
|
197
|
-
each_decorator(htmlelement, tree) do |element, decorator|
|
198
|
-
htmlelement["summary"] = HtmlElement.escape(decorator["summary"].value.join) if decorator["summary"]
|
199
|
-
end
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
179
|
class << Formatter[VerbatimNode]
|
204
180
|
def visit(tree)
|
205
181
|
create_self_element.tap do |element|
|
@@ -284,14 +284,13 @@ module PseudoHiki
|
|
284
284
|
class VerbatimNodeFormatter < self
|
285
285
|
def visit(tree)
|
286
286
|
element = super(tree)
|
287
|
-
@language_name = language_name(tree)
|
288
287
|
return gfm_verbatim(element) if @options.gfm_style
|
289
288
|
md_verbatim(element)
|
290
289
|
end
|
291
290
|
|
292
291
|
def gfm_verbatim(element)
|
293
292
|
element.tap do |lines|
|
294
|
-
lines.unshift "```#{
|
293
|
+
lines.unshift "```#{$/}"
|
295
294
|
lines.push "```#{$/ * 2}"
|
296
295
|
end
|
297
296
|
end
|
@@ -299,12 +298,6 @@ module PseudoHiki
|
|
299
298
|
def md_verbatim(element)
|
300
299
|
element.join.gsub(/^/o, " ").sub(/ \Z/o, "").concat $/
|
301
300
|
end
|
302
|
-
|
303
|
-
def language_name(tree)
|
304
|
-
tree.decorator.tap do |decorator|
|
305
|
-
return decorator ? decorator["code"].id : ""
|
306
|
-
end
|
307
|
-
end
|
308
301
|
end
|
309
302
|
|
310
303
|
class QuoteNodeFormatter < self
|
data/lib/pseudohiki/version.rb
CHANGED
data/lib/pseudohikiparser.rb
CHANGED
data/test/test_blockparser.rb
CHANGED
@@ -311,35 +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
314
|
def test_comment_out_followed_by_a_verbatim_block
|
344
315
|
text = <<TEXT
|
345
316
|
the first paragraph
|
data/test/test_htmlformat.rb
CHANGED
@@ -696,69 +696,6 @@ HTML
|
|
696
696
|
assert_equal(xhtml, XhtmlFormat.format(tree).to_s)
|
697
697
|
end
|
698
698
|
|
699
|
-
def test_decorator
|
700
|
-
text = <<TEXT
|
701
|
-
//@class[section_type]
|
702
|
-
!!title of section
|
703
|
-
|
704
|
-
a paragraph.
|
705
|
-
|
706
|
-
//@class[class_name]
|
707
|
-
//@id[id_name]
|
708
|
-
another paragraph.
|
709
|
-
TEXT
|
710
|
-
|
711
|
-
xhtml = <<HTML
|
712
|
-
<div class="section_type">
|
713
|
-
<h2>title of section</h2>
|
714
|
-
<p>
|
715
|
-
a paragraph.</p>
|
716
|
-
<p class="class_name" id="ID_NAME">
|
717
|
-
another paragraph.</p>
|
718
|
-
<!-- end of section_type -->
|
719
|
-
</div>
|
720
|
-
HTML
|
721
|
-
tree = BlockParser.parse(text.lines.to_a.map {|line| line.chomp })
|
722
|
-
assert_equal(xhtml, XhtmlFormat.format(tree).to_s)
|
723
|
-
end
|
724
|
-
|
725
|
-
def test_decorator_for_table
|
726
|
-
text = <<TEXT
|
727
|
-
//@summary: Summary of the table
|
728
|
-
||!header 1||! header 2
|
729
|
-
||cell 1||cell 2
|
730
|
-
TEXT
|
731
|
-
|
732
|
-
xhtml = <<HTML
|
733
|
-
<table summary="Summary of the table">
|
734
|
-
<tr><th>header 1</th><th> header 2</th></tr>
|
735
|
-
<tr><td>cell 1</td><td>cell 2</td></tr>
|
736
|
-
</table>
|
737
|
-
HTML
|
738
|
-
tree = BlockParser.parse(text.lines.to_a.map {|line| line.chomp })
|
739
|
-
assert_equal(xhtml, XhtmlFormat.format(tree).to_s)
|
740
|
-
end
|
741
|
-
|
742
|
-
def test_decorator_for_verbatim
|
743
|
-
text = <<TEXT
|
744
|
-
//@code[ruby]
|
745
|
-
def bonjour!
|
746
|
-
puts "Bonjour!"
|
747
|
-
end
|
748
|
-
TEXT
|
749
|
-
|
750
|
-
xhtml = <<HTML
|
751
|
-
<pre>
|
752
|
-
def bonjour!
|
753
|
-
puts "Bonjour!"
|
754
|
-
end
|
755
|
-
</pre>
|
756
|
-
HTML
|
757
|
-
|
758
|
-
tree = BlockParser.parse(text.lines.to_a)
|
759
|
-
assert_equal(xhtml, XhtmlFormat.format(tree).to_s)
|
760
|
-
end
|
761
|
-
|
762
699
|
def test_comment_out_followed_by_a_verbatim_block
|
763
700
|
text = <<TEXT
|
764
701
|
the first paragraph
|
data/test/test_markdownformat.rb
CHANGED
@@ -518,66 +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
521
|
def test_collect_headings
|
582
522
|
text = <<TEXT
|
583
523
|
!![main-heading] heading
|
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.3
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- HASHIMOTO, Naoki
|
@@ -74,7 +74,6 @@ files:
|
|
74
74
|
- lib/pseudohiki/inlineparser.rb
|
75
75
|
- lib/pseudohiki/markdownformat.rb
|
76
76
|
- lib/pseudohiki/plaintextformat.rb
|
77
|
-
- lib/pseudohiki/sinatra_helpers.rb
|
78
77
|
- lib/pseudohiki/treestack.rb
|
79
78
|
- lib/pseudohiki/utils.rb
|
80
79
|
- lib/pseudohiki/version.rb
|
@@ -107,9 +106,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
107
106
|
version: 1.8.7
|
108
107
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
108
|
requirements:
|
110
|
-
- - "
|
109
|
+
- - ">="
|
111
110
|
- !ruby/object:Gem::Version
|
112
|
-
version:
|
111
|
+
version: '0'
|
113
112
|
requirements: []
|
114
113
|
rubyforge_project:
|
115
114
|
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
|