flannel 0.2.7 → 0.2.9
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.
- data/Rakefile +4 -1
- data/VERSION.yml +1 -1
- data/features/fixtures/external_link.flannel +1 -0
- data/features/fixtures/external_link.out +1 -1
- data/features/fixtures/feed.flannel +4 -2
- data/features/fixtures/feed.out +2 -2
- data/features/fixtures/list.flannel +4 -3
- data/features/fixtures/list.out +1 -1
- data/features/fixtures/paragraph.flannel +3 -1
- data/features/fixtures/paragraph.out +3 -3
- data/features/fixtures/preformatted.flannel +8 -6
- data/features/fixtures/preformatted.out +13 -7
- data/features/fixtures/wiki_links.flannel +1 -0
- data/features/fixtures/wiki_links.out +1 -1
- data/features/fixtures/wiki_links_for_lambda.flannel +1 -0
- data/features/fixtures/wiki_links_for_lambda.out +1 -1
- data/flannel.gemspec +24 -10
- data/lib/flannel.rb +5 -0
- data/lib/flannel/base_block.rb +41 -0
- data/lib/flannel/block.treetop +152 -0
- data/lib/flannel/block_cutter.rb +8 -5
- data/lib/flannel/html_formatter.rb +21 -15
- data/lib/flannel/wrappable.rb +6 -2
- data/test/base_block_html_generation_test.rb +30 -0
- data/test/base_block_test.rb +60 -0
- data/test/block_cutter_test.rb +27 -28
- data/test/block_parser_test.rb +47 -0
- data/test/feed_parser_test.rb +3 -2
- data/test/flannel_test.rb +19 -19
- data/test/html_formatter_test.rb +1 -2
- data/test/test_helper.rb +48 -3
- metadata +41 -6
- data/lib/flannel/text_block.rb +0 -48
- data/test/text_block_test.rb +0 -64
data/Rakefile
CHANGED
@@ -11,7 +11,10 @@ begin
|
|
11
11
|
gem.homepage = "http://github.com/rubyyot/flannel"
|
12
12
|
gem.authors = ["Jamal Hansen"]
|
13
13
|
gem.rubyforge_project = "flannel"
|
14
|
-
gem.
|
14
|
+
gem.add_dependency 'treetop'
|
15
|
+
gem.add_dependency 'polyglot'
|
16
|
+
gem.add_development_dependency 'shoulda'
|
17
|
+
gem.add_development_dependency 'mocha'
|
15
18
|
|
16
19
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
17
20
|
end
|
data/VERSION.yml
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
:paragraph external_link_paragraph
|
1
2
|
Lorem ipsum [dolor sit amet|http://www.example.com], consectetur adipiscing elit. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
2
3
|
Proin malesuada, nunc vel [porttitor|www.example.com] [ commodo | http://www.example.com | nunc ], justo. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
3
4
|
Proin malesuada, nunc vel [ porttitor | http://www.example.com ] commodo, justo.
|
@@ -1,3 +1,3 @@
|
|
1
|
-
<p>Lorem ipsum <a href="http://www.example.com" target="_blank">dolor sit amet</a>, consectetur adipiscing elit. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
1
|
+
<p id='external_link_paragraph'>Lorem ipsum <a href="http://www.example.com" target="_blank">dolor sit amet</a>, consectetur adipiscing elit. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
2
2
|
Proin malesuada, nunc vel <a href="http://www.example.com" target="_blank">porttitor</a> <a href="http://www.example.com" title="nunc" target="_blank">commodo</a>, justo. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
3
3
|
Proin malesuada, nunc vel <a href="http://www.example.com" target="_blank">porttitor</a> commodo, justo.</p>
|
@@ -1,3 +1,5 @@
|
|
1
|
-
|
1
|
+
:feed rubyyot
|
2
|
+
blog.rubyyot.com/tag/rubyyot/feed/rss
|
2
3
|
|
3
|
-
|
4
|
+
:feed javascript-demystified
|
5
|
+
http://devlicio.us/blogs/sergio_pereira/rss.aspx?Tags=JavaScript-Demystified&AndTags=1
|
data/features/fixtures/feed.out
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
<ul><li>
|
1
|
+
<ul id='rubyyot'><li>
|
2
2
|
<a href='http://blog.rubyyot.com/2009/05/summer-of-learning-challenge/'>Plans for Rubyyot.com and the Summer of Learning Challenge</a>
|
3
3
|
</li>
|
4
4
|
<li>
|
@@ -8,7 +8,7 @@
|
|
8
8
|
<a href='http://blog.rubyyot.com/2009/03/rubyyotcom-is-dead-long-live-rubyyotcom/'>Rubyyot.com is dead; Long live Rubyyot.com</a>
|
9
9
|
</li></ul>
|
10
10
|
|
11
|
-
<ul><li>
|
11
|
+
<ul id='javascript-demystified'><li>
|
12
12
|
<a href='http://devlicio.us/blogs/sergio_pereira/archive/2009/09/19/javascript-and-its-love-for-zeroes.aspx'>JavaScript and its love for zeroes</a>
|
13
13
|
</li>
|
14
14
|
<li>
|
@@ -1,3 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
:list test-list
|
2
|
+
Item one
|
3
|
+
Item two
|
4
|
+
This is the much longer item and this item is known simply as item three.
|
data/features/fixtures/list.out
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
<p>This is paragraph one.</p>
|
1
|
+
<p id='p_one'>This is paragraph one.</p>
|
2
2
|
|
3
|
-
<p>This is paragraph two.</p>
|
3
|
+
<p id='p_two'>This is paragraph two.</p>
|
4
4
|
|
5
|
-
<p>This is paragraph three. Watchout for the end of file.</p>
|
5
|
+
<p id='p_three'>This is paragraph three. Watchout for the end of file.</p>
|
@@ -1,16 +1,18 @@
|
|
1
|
+
:paragraph p_one
|
1
2
|
This is a paragraph
|
2
3
|
|
3
|
-
|
4
|
+
:preformatted pre_one
|
5
|
+
This is preformatted text
|
4
6
|
it's cool
|
5
7
|
|
6
8
|
and Spiffy
|
7
|
-
_
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
:preformatted pre_two
|
11
|
+
This is preformatted too
|
11
12
|
|
12
|
-
|
13
|
+
|
14
|
+
:preformatted pre_three
|
13
15
|
So is this
|
14
|
-
_
|
15
16
|
|
17
|
+
:paragraph p_two
|
16
18
|
This is a paragraph
|
@@ -1,13 +1,19 @@
|
|
1
|
-
<p>This is a paragraph</p>
|
1
|
+
<p id='p_one'>This is a paragraph</p>
|
2
2
|
|
3
|
-
<pre> This is preformatted text
|
3
|
+
<pre id='pre_one'> This is preformatted text
|
4
4
|
it's cool
|
5
5
|
|
6
|
-
and Spiffy
|
6
|
+
and Spiffy
|
7
7
|
|
8
|
-
|
8
|
+
</pre>
|
9
9
|
|
10
|
-
<pre>
|
11
|
-
So is this</pre>
|
10
|
+
<pre id='pre_two'>This is preformatted too
|
12
11
|
|
13
|
-
|
12
|
+
|
13
|
+
</pre>
|
14
|
+
|
15
|
+
<pre id='pre_three'> So is this
|
16
|
+
|
17
|
+
</pre>
|
18
|
+
|
19
|
+
<p id='p_two'>This is a paragraph</p>
|
@@ -1,2 +1,2 @@
|
|
1
|
-
<p>Lorem ipsum <a href="dolor-sit-amet">dolor sit amet</a>, consectetur adipiscing elit. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
1
|
+
<p id='lorem'>Lorem ipsum <a href="dolor-sit-amet">dolor sit amet</a>, consectetur adipiscing elit. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
2
2
|
Proin malesuada, nunc vel <a href="porttitor">porttitor</a> commodo, justo.</p>
|
@@ -1,2 +1,2 @@
|
|
1
|
-
<p>Lorem ipsum <a href="http://www.example.com/foo/dolor-sit-amet">dolor sit amet</a>, consectetur adipiscing elit. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
1
|
+
<p id='lorem'>Lorem ipsum <a href="http://www.example.com/foo/dolor-sit-amet">dolor sit amet</a>, consectetur adipiscing elit. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
2
2
|
Proin malesuada, nunc vel <a href="http://www.example.com/foo/porttitor">porttitor</a> commodo, justo.</p>
|
data/flannel.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{flannel}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.9"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jamal Hansen"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-02-23}
|
13
13
|
s.email = %q{jamal.hansen@gmail.com}
|
14
14
|
s.executables = ["quilt-it~", "quilt-it"]
|
15
15
|
s.extra_rdoc_files = [
|
@@ -51,20 +51,23 @@ Gem::Specification.new do |s|
|
|
51
51
|
"features/wiki_links.feature",
|
52
52
|
"flannel.gemspec",
|
53
53
|
"lib/flannel.rb",
|
54
|
+
"lib/flannel/base_block.rb",
|
55
|
+
"lib/flannel/block.treetop",
|
54
56
|
"lib/flannel/block_cutter.rb",
|
55
57
|
"lib/flannel/cache_location_does_not_exist_error.rb",
|
56
58
|
"lib/flannel/feed_parser.rb",
|
57
59
|
"lib/flannel/file_cache.rb",
|
58
60
|
"lib/flannel/html_formatter.rb",
|
59
|
-
"lib/flannel/text_block.rb",
|
60
61
|
"lib/flannel/wrappable.rb",
|
62
|
+
"test/base_block_html_generation_test.rb",
|
63
|
+
"test/base_block_test.rb",
|
61
64
|
"test/block_cutter_test.rb",
|
65
|
+
"test/block_parser_test.rb",
|
62
66
|
"test/feed_parser_test.rb",
|
63
67
|
"test/file_cache_test.rb",
|
64
68
|
"test/flannel_test.rb",
|
65
69
|
"test/html_formatter_test.rb",
|
66
|
-
"test/test_helper.rb"
|
67
|
-
"test/text_block_test.rb"
|
70
|
+
"test/test_helper.rb"
|
68
71
|
]
|
69
72
|
s.homepage = %q{http://github.com/rubyyot/flannel}
|
70
73
|
s.rdoc_options = ["--charset=UTF-8"]
|
@@ -77,9 +80,11 @@ Gem::Specification.new do |s|
|
|
77
80
|
"test/block_cutter_test.rb",
|
78
81
|
"test/test_helper.rb",
|
79
82
|
"test/file_cache_test.rb",
|
80
|
-
"test/
|
83
|
+
"test/base_block_test.rb",
|
84
|
+
"test/block_parser_test.rb",
|
81
85
|
"test/feed_parser_test.rb",
|
82
|
-
"test/flannel_test.rb"
|
86
|
+
"test/flannel_test.rb",
|
87
|
+
"test/base_block_html_generation_test.rb"
|
83
88
|
]
|
84
89
|
|
85
90
|
if s.respond_to? :specification_version then
|
@@ -87,12 +92,21 @@ Gem::Specification.new do |s|
|
|
87
92
|
s.specification_version = 3
|
88
93
|
|
89
94
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
90
|
-
s.
|
95
|
+
s.add_runtime_dependency(%q<treetop>, [">= 0"])
|
96
|
+
s.add_runtime_dependency(%q<polyglot>, [">= 0"])
|
97
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
98
|
+
s.add_development_dependency(%q<mocha>, [">= 0"])
|
91
99
|
else
|
92
|
-
s.add_dependency(%q<
|
100
|
+
s.add_dependency(%q<treetop>, [">= 0"])
|
101
|
+
s.add_dependency(%q<polyglot>, [">= 0"])
|
102
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
103
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
93
104
|
end
|
94
105
|
else
|
95
|
-
s.add_dependency(%q<
|
106
|
+
s.add_dependency(%q<treetop>, [">= 0"])
|
107
|
+
s.add_dependency(%q<polyglot>, [">= 0"])
|
108
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
109
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
96
110
|
end
|
97
111
|
end
|
98
112
|
|
data/lib/flannel.rb
CHANGED
@@ -0,0 +1,41 @@
|
|
1
|
+
module Flannel
|
2
|
+
class BaseBlock
|
3
|
+
attr_reader :type, :id, :text, :parent_id, :attributes
|
4
|
+
|
5
|
+
def initialize args
|
6
|
+
header = args.shift
|
7
|
+
@type = header.shift[1]
|
8
|
+
@id = header.shift[1]
|
9
|
+
@attributes = {}
|
10
|
+
|
11
|
+
next_arg = header.shift
|
12
|
+
while next_arg
|
13
|
+
case next_arg[0]
|
14
|
+
when :parent_id then
|
15
|
+
@parent_id = next_arg[1]
|
16
|
+
when :attribute_list then
|
17
|
+
next_arg.shift
|
18
|
+
next_arg.each do |attribute|
|
19
|
+
@attributes[attribute[0]] = attribute[1]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
next_arg = header.shift
|
23
|
+
end
|
24
|
+
|
25
|
+
@text = args.shift
|
26
|
+
strip_text
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_h
|
30
|
+
html_formatter = Flannel::HtmlFormatter.new
|
31
|
+
html_formatter.do(@text, @type, @id)
|
32
|
+
end
|
33
|
+
|
34
|
+
def strip_text
|
35
|
+
return if @type == :preformatted
|
36
|
+
return unless @text
|
37
|
+
|
38
|
+
@text = @text.strip
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
grammar Block
|
2
|
+
rule document
|
3
|
+
block* {
|
4
|
+
def content
|
5
|
+
elements.map{ |element| element.content}
|
6
|
+
end
|
7
|
+
}
|
8
|
+
end
|
9
|
+
|
10
|
+
rule block
|
11
|
+
block_header block_text? {
|
12
|
+
def content
|
13
|
+
elements.map{ |element| element.respond_to?(:content) ? element.content : nil}.compact
|
14
|
+
end
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
rule block_header
|
19
|
+
block_start block_type block_id parent_id? attribute_list? [\n]* {
|
20
|
+
def content
|
21
|
+
elements.map{ |element| element.respond_to?(:content) ? element.content : nil}.compact
|
22
|
+
end
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
rule block_start
|
27
|
+
":" {
|
28
|
+
def content
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
rule block_text
|
35
|
+
(!(block_header) .)+ {
|
36
|
+
def content
|
37
|
+
text_value
|
38
|
+
end
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
rule block_type
|
43
|
+
( paragraph / feed / preformatted / list / header ) {
|
44
|
+
def content
|
45
|
+
[:block_type, text_value.to_sym ]
|
46
|
+
end
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
rule paragraph
|
51
|
+
"paragraph" { def content; text_value; end }
|
52
|
+
end
|
53
|
+
|
54
|
+
rule header
|
55
|
+
( header_one / header_two / header_three / header_four / header_five / header_six ) { def content; text_value; end }
|
56
|
+
end
|
57
|
+
|
58
|
+
rule header_one
|
59
|
+
"header_one" { def content; text_value; end }
|
60
|
+
end
|
61
|
+
|
62
|
+
rule header_two
|
63
|
+
"header_two" { def content; text_value; end }
|
64
|
+
end
|
65
|
+
|
66
|
+
rule header_three
|
67
|
+
"header_three" { def content; text_value; end }
|
68
|
+
end
|
69
|
+
|
70
|
+
rule header_four
|
71
|
+
"header_four" { def content; text_value; end }
|
72
|
+
end
|
73
|
+
|
74
|
+
rule header_five
|
75
|
+
"header_five" { def content; text_value; end }
|
76
|
+
end
|
77
|
+
|
78
|
+
rule header_six
|
79
|
+
"header_six" { def content; text_value; end }
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
rule feed
|
85
|
+
"feed" { def content; text_value; end }
|
86
|
+
end
|
87
|
+
|
88
|
+
rule preformatted
|
89
|
+
"preformatted" { def content; text_value; end }
|
90
|
+
end
|
91
|
+
|
92
|
+
rule list
|
93
|
+
"list" { def content; text_value; end }
|
94
|
+
end
|
95
|
+
|
96
|
+
rule block_id
|
97
|
+
" "+ [a-z\-_]+ {
|
98
|
+
def content
|
99
|
+
[:block_id, text_value.strip]
|
100
|
+
end
|
101
|
+
}
|
102
|
+
end
|
103
|
+
|
104
|
+
rule parent_id
|
105
|
+
block_id {
|
106
|
+
def content
|
107
|
+
[:parent_id, text_value.strip]
|
108
|
+
end
|
109
|
+
}
|
110
|
+
end
|
111
|
+
|
112
|
+
rule name
|
113
|
+
[A-Za-z0-9]+ {
|
114
|
+
def content
|
115
|
+
text_value
|
116
|
+
end
|
117
|
+
}
|
118
|
+
end
|
119
|
+
|
120
|
+
rule attribute_list
|
121
|
+
attribute* {
|
122
|
+
def content
|
123
|
+
attributes = elements.map{ |element| element.content }
|
124
|
+
attributes.unshift :attribute_list
|
125
|
+
end
|
126
|
+
}
|
127
|
+
end
|
128
|
+
|
129
|
+
rule attribute
|
130
|
+
[\s]+ name "=" attribute_value {
|
131
|
+
def content
|
132
|
+
[elements[1].content.to_sym, elements[3].content]
|
133
|
+
end
|
134
|
+
}
|
135
|
+
end
|
136
|
+
|
137
|
+
rule attribute_value
|
138
|
+
[a-z\-_]+ {
|
139
|
+
def content
|
140
|
+
text_value
|
141
|
+
end
|
142
|
+
}
|
143
|
+
end
|
144
|
+
|
145
|
+
#rule beginning_of_line
|
146
|
+
# {
|
147
|
+
# def content
|
148
|
+
# nil
|
149
|
+
# end
|
150
|
+
# }
|
151
|
+
#end
|
152
|
+
end
|
data/lib/flannel/block_cutter.rb
CHANGED
@@ -1,15 +1,18 @@
|
|
1
1
|
module Flannel
|
2
2
|
class BlockCutter
|
3
3
|
def cut markup
|
4
|
-
pieces = split_preformatted_blocks(markup)
|
5
|
-
pieces = pieces.map { |part| split_into_blocks(part) }
|
6
|
-
pieces.flatten!
|
7
|
-
convert_to_text_blocks pieces
|
4
|
+
#pieces = split_preformatted_blocks(markup)
|
5
|
+
#pieces = pieces.map { |part| split_into_blocks(part) }
|
6
|
+
#pieces.flatten!
|
7
|
+
#convert_to_text_blocks pieces
|
8
|
+
|
9
|
+
parser = BlockParser.new
|
10
|
+
blocks = parser.parse(markup).content.map { |block| Flannel::BaseBlock.new(block) }
|
8
11
|
end
|
9
12
|
|
10
13
|
def split_into_blocks markup
|
11
14
|
if is_preformatted markup
|
12
|
-
|
15
|
+
markup
|
13
16
|
else
|
14
17
|
markup.split(/\n\s*?\n/).map { |s| s.strip }
|
15
18
|
end
|
@@ -6,18 +6,24 @@ module Flannel
|
|
6
6
|
@tags ={:preformatted => "pre",
|
7
7
|
:feed => "ul",
|
8
8
|
:list => "ul",
|
9
|
-
:header_1 => "h1",
|
9
|
+
:header_1 => "h1", #old style
|
10
10
|
:header_2 => "h2",
|
11
11
|
:header_3 => "h3",
|
12
12
|
:header_4 => "h4",
|
13
13
|
:header_5 => "h5",
|
14
14
|
:header_6 => "h6",
|
15
|
+
:header_one => "h1", #new style
|
16
|
+
:header_two => "h2",
|
17
|
+
:header_three => "h3",
|
18
|
+
:header_four => "h4",
|
19
|
+
:header_five => "h5",
|
20
|
+
:header_six => "h6",
|
15
21
|
:paragraph => "p",
|
16
22
|
:blockquote => "blockquote"}
|
17
23
|
end
|
18
24
|
|
19
|
-
def do text, style
|
20
|
-
steps = get_steps_for style
|
25
|
+
def do text, style, id=nil
|
26
|
+
steps = get_steps_for style, id
|
21
27
|
inject text, steps
|
22
28
|
end
|
23
29
|
|
@@ -27,33 +33,33 @@ module Flannel
|
|
27
33
|
|
28
34
|
def inject text, steps
|
29
35
|
if steps.empty?
|
30
|
-
|
36
|
+
text
|
31
37
|
else
|
32
|
-
|
33
|
-
|
34
|
-
|
38
|
+
step = steps.shift
|
39
|
+
text = step.call text
|
40
|
+
inject text, steps
|
35
41
|
end
|
36
42
|
end
|
37
43
|
|
38
|
-
def get_steps_for style
|
44
|
+
def get_steps_for style, id
|
39
45
|
steps = []
|
40
46
|
|
41
47
|
case style
|
42
48
|
|
43
49
|
when :preformatted
|
44
|
-
|
50
|
+
steps << lambda { |text| html_escape text}
|
45
51
|
when :feed
|
46
|
-
|
52
|
+
steps << lambda { |text| parse_feed text }
|
47
53
|
else
|
48
|
-
|
49
|
-
|
54
|
+
steps << lambda { |text| build_wiki_links text }
|
55
|
+
steps << lambda { |text| convert_external_links text }
|
50
56
|
end
|
51
57
|
|
52
58
|
if style == :list
|
53
|
-
|
59
|
+
steps << lambda { |text| format_list text }
|
54
60
|
end
|
55
61
|
|
56
|
-
steps << lambda { |text| wrap
|
62
|
+
steps << lambda { |text| wrap(text, @tags[style], id) }
|
57
63
|
|
58
64
|
steps
|
59
65
|
end
|
@@ -104,7 +110,7 @@ module Flannel
|
|
104
110
|
end
|
105
111
|
|
106
112
|
def format_list text
|
107
|
-
text.split(
|
113
|
+
text.split(/\n/).reject { |item| item == "" }.map { |item| wrap(item.chomp, "li") }.join("\n")
|
108
114
|
end
|
109
115
|
|
110
116
|
def parse_feed text
|
data/lib/flannel/wrappable.rb
CHANGED
@@ -1,13 +1,17 @@
|
|
1
1
|
module Flannel
|
2
2
|
module Wrappable
|
3
|
-
def wrap content, tag
|
3
|
+
def wrap content, tag, element_id=nil
|
4
4
|
if empty_string?(content) || empty_string?(tag)
|
5
5
|
return content
|
6
6
|
end
|
7
7
|
|
8
8
|
content.strip! unless tag == "pre"
|
9
9
|
|
10
|
-
|
10
|
+
if element_id
|
11
|
+
"<#{tag} id='#{element_id}'>#{content}</#{tag}>"
|
12
|
+
else
|
13
|
+
"<#{tag}>#{content}</#{tag}>"
|
14
|
+
end
|
11
15
|
end
|
12
16
|
|
13
17
|
def empty_string? str
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class HtmlGenerationTest < Test::Unit::TestCase
|
4
|
+
context "basic behavior" do
|
5
|
+
should "wrap in pre tags when preformatted" do
|
6
|
+
block = Flannel::BaseBlock.new [[[:block_type, :preformatted], [:block_id, "some-id"], [:attribute_list]], "foo"]
|
7
|
+
assert_equal "<pre id='some-id'>foo</pre>", block.to_h
|
8
|
+
end
|
9
|
+
|
10
|
+
should "wrap in ul tags when unordered_list" do
|
11
|
+
block = Flannel::BaseBlock.new [[[:block_type, :list], [:block_id, "some-id"], [:attribute_list]], "foo"]
|
12
|
+
assert_equal "<ul id='some-id'><li>foo</li></ul>", block.to_h
|
13
|
+
end
|
14
|
+
|
15
|
+
should "convert [|] pattern to an external link" do
|
16
|
+
block = Flannel::BaseBlock.new [[[:block_type, :paragraph], [:block_id, "some-id"], [:attribute_list]], "yadda [yadda|http://example.com] yadda"]
|
17
|
+
assert_equal %q{<p id='some-id'>yadda <a href="http://example.com" target="_blank">yadda</a> yadda</p>}, block.to_h
|
18
|
+
end
|
19
|
+
|
20
|
+
should "add http:// to external links" do
|
21
|
+
block = Flannel::BaseBlock.new [[[:block_type, :paragraph], [:block_id, "some-id"], [:attribute_list]], "yadda [yadda|example.com] yadda"]
|
22
|
+
assert_equal %q{<p id='some-id'>yadda <a href="http://example.com" target="_blank">yadda</a> yadda</p>}, block.to_h
|
23
|
+
end
|
24
|
+
|
25
|
+
should "add create title if provided to external links" do
|
26
|
+
block = Flannel::BaseBlock.new [[[:block_type, :paragraph], [:block_id, "some-id"], [:attribute_list]], "yadda [yadda|example.com|My title] yadda"]
|
27
|
+
assert_equal %q{<p id='some-id'>yadda <a href="http://example.com" title="My title" target="_blank">yadda</a> yadda</p>}, block.to_h
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BaseBlockTest < Test::Unit::TestCase
|
4
|
+
def test_initializes_with_header_array_and_text
|
5
|
+
block = Flannel::BaseBlock.new [[[:block_type, :paragraph], [:block_id, "some-id"], [:attribute_list]], "some text"]
|
6
|
+
|
7
|
+
assert_equal :paragraph, block.type
|
8
|
+
assert_equal "some-id", block.id
|
9
|
+
assert_equal "some text", block.text
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_initializes_with_parent_id
|
13
|
+
block = Flannel::BaseBlock.new [[[:block_type, :paragraph], [:block_id, "some-id"], [:parent_id, "parent-id"]], "some text"]
|
14
|
+
|
15
|
+
assert_equal :paragraph, block.type
|
16
|
+
assert_equal "some-id", block.id
|
17
|
+
assert_equal "parent-id", block.parent_id
|
18
|
+
assert_equal "some text", block.text
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_initializes_with_attribute_list
|
22
|
+
block = Flannel::BaseBlock.new [[[:block_type, :paragraph], [:block_id, "some-id"], [:attribute_list, [:class, "cool"]]], "some text"]
|
23
|
+
|
24
|
+
assert_equal :paragraph, block.type
|
25
|
+
assert_equal "some-id", block.id
|
26
|
+
assert_equal "cool", block.attributes[:class]
|
27
|
+
assert_equal "some text", block.text
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_initializes_with_attribute_list_and_parent_id
|
31
|
+
block = Flannel::BaseBlock.new [[[:block_type, :paragraph], [:block_id, "some-id"], [:parent_id, "parent-id"], [:attribute_list, [:class, "cool"]]], "some text"]
|
32
|
+
|
33
|
+
assert_equal :paragraph, block.type
|
34
|
+
assert_equal "some-id", block.id
|
35
|
+
assert_equal "parent-id", block.parent_id
|
36
|
+
assert_equal "cool", block.attributes[:class]
|
37
|
+
assert_equal "some text", block.text
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_initializes_with_header_array_and_no_text
|
41
|
+
block = Flannel::BaseBlock.new [[[:block_type, :paragraph], [:block_id, "some-id"]]]
|
42
|
+
|
43
|
+
assert_equal :paragraph, block.type
|
44
|
+
assert_equal "some-id", block.id
|
45
|
+
assert_nil block.text, "Block#text should be nil"
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_initialized_from_parser_output
|
49
|
+
text = ":preformatted my-code great-code class=ruby whiz=bang\ndef foo arg\n\t puts arg\n end"
|
50
|
+
doc = BlockParser.new.parse(text)
|
51
|
+
block = Flannel::BaseBlock.new doc.content[0]
|
52
|
+
|
53
|
+
assert_equal :preformatted, block.type
|
54
|
+
assert_equal "my-code", block.id
|
55
|
+
assert_equal "great-code", block.parent_id
|
56
|
+
assert_equal "ruby", block.attributes[:class]
|
57
|
+
assert_equal "bang", block.attributes[:whiz]
|
58
|
+
assert_equal "def foo arg\n\t puts arg\n end", block.text
|
59
|
+
end
|
60
|
+
end
|
data/test/block_cutter_test.rb
CHANGED
@@ -6,52 +6,51 @@ class BlockCutterTest < Test::Unit::TestCase
|
|
6
6
|
@block_cutter = Flannel::BlockCutter.new
|
7
7
|
end
|
8
8
|
|
9
|
-
should "split a flannel document into
|
10
|
-
markup = "
|
9
|
+
should "split a flannel document into blocks based on block_headers" do
|
10
|
+
markup = ":paragraph bar\n some text\n:paragraph baz\n some more text"
|
11
|
+
|
12
|
+
blocks = @block_cutter.cut markup
|
13
|
+
assert_equal 2, blocks.length
|
14
|
+
|
15
|
+
assert_equal :paragraph, blocks[0].type
|
16
|
+
assert_equal "bar", blocks[0].id
|
17
|
+
assert_equal :paragraph, blocks[1].type
|
18
|
+
assert_equal "baz", blocks[1].id
|
11
19
|
|
12
|
-
squares = @block_cutter.cut markup
|
13
|
-
assert_equal 2, squares.length
|
14
|
-
assert_equal "foo", squares[0].to_s
|
15
|
-
assert_equal "bar", squares[1].to_s
|
16
20
|
end
|
17
21
|
|
18
22
|
should "not split preformatted text based on blank lines" do
|
19
|
-
markup = "
|
23
|
+
markup = ":preformatted my_preformatted\n foo\n\nbar\n"
|
20
24
|
|
21
|
-
|
22
|
-
assert_equal 1,
|
23
|
-
assert_equal :preformatted,
|
25
|
+
blocks = @block_cutter.cut markup
|
26
|
+
assert_equal 1, blocks.length
|
27
|
+
assert_equal :preformatted, blocks[0].type
|
28
|
+
assert_equal "my_preformatted", blocks[0].id
|
29
|
+
assert_equal " foo\n\nbar\n", blocks[0].text
|
24
30
|
end
|
25
31
|
|
26
32
|
|
27
33
|
should "separate preformatted blocks" do
|
28
|
-
markup = "
|
34
|
+
markup = ":preformatted one\nfoo\n:preformatted two\nbar\n"
|
29
35
|
|
30
|
-
|
31
|
-
assert_equal 2,
|
32
|
-
assert_equal :preformatted,
|
33
|
-
assert_equal :preformatted,
|
36
|
+
blocks = @block_cutter.cut markup
|
37
|
+
assert_equal 2, blocks.length
|
38
|
+
assert_equal :preformatted, blocks[0].type
|
39
|
+
assert_equal :preformatted, blocks[1].type
|
34
40
|
end
|
35
41
|
|
36
42
|
should "strip preformatted markers when found" do
|
37
|
-
markup = "
|
43
|
+
markup = ":preformatted foo\nfoo\n\nbar\n"
|
38
44
|
|
39
|
-
|
40
|
-
assert_equal "foo\n\nbar",
|
45
|
+
blocks = @block_cutter.cut markup
|
46
|
+
assert_equal "foo\n\nbar\n", blocks[0].text
|
41
47
|
end
|
42
48
|
|
43
49
|
should "set square style to feed based on full tag " do
|
44
|
-
markup = ":feed
|
45
|
-
|
46
|
-
squares = @block_cutter.cut markup
|
47
|
-
assert_equal :feed, squares[0].style
|
48
|
-
end
|
49
|
-
|
50
|
-
should "set square style to feed based on ampersand abbrev" do
|
51
|
-
markup = "& http://www.example.com/rss"
|
50
|
+
markup = ":feed wonki\nhttp://www.example.com/rss"
|
52
51
|
|
53
|
-
|
54
|
-
assert_equal :feed,
|
52
|
+
blocks = @block_cutter.cut markup
|
53
|
+
assert_equal :feed, blocks[0].type
|
55
54
|
end
|
56
55
|
end
|
57
56
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'pp'
|
3
|
+
|
4
|
+
class BlockParserTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@parser = BlockParser.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_parser_returns_empty_array_for_empty_string
|
10
|
+
assert_equal 0, @parser.parse("").content.length, "Parser was expected to return no elements for an empty string"
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_parser_returns_simple_block
|
14
|
+
doc = @parser.parse(":paragraph wonki\ntext")
|
15
|
+
|
16
|
+
assert_doc doc, :paragraph, "wonki", "text"
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_parser_returns_block_with_dashed_block_id
|
20
|
+
doc = @parser.parse(":paragraph wonki-donki\ntext")
|
21
|
+
|
22
|
+
assert_doc doc, :paragraph, "wonki-donki", "text"
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_parser_returns_block_with_parent_id
|
26
|
+
doc = @parser.parse(":paragraph wonki-donki parent_id\ntext")
|
27
|
+
|
28
|
+
assert_doc doc, :paragraph, "wonki-donki", "text", "parent_id"
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_parser_returns_block_with_parent_id_and_attributes
|
32
|
+
doc = @parser.parse(":paragraph wonki-donki parent_id class=foo title=monkey\ntext")
|
33
|
+
|
34
|
+
assert_doc doc, :paragraph, "wonki-donki", "text", "parent_id", { :class => "foo", :title => "monkey" }
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_parser_returns_two_simple_blocks
|
38
|
+
doc = @parser.parse(":paragraph foo\nbar\n:paragraph baz\nbonzo")
|
39
|
+
|
40
|
+
assert_not_nil doc
|
41
|
+
|
42
|
+
blocks = doc.content
|
43
|
+
|
44
|
+
assert_block blocks[0], :paragraph, "foo", "bar\n"
|
45
|
+
assert_block blocks[1], :paragraph, "baz", "bonzo"
|
46
|
+
end
|
47
|
+
end
|
data/test/feed_parser_test.rb
CHANGED
@@ -5,12 +5,13 @@ class FeedParserTest < Test::Unit::TestCase
|
|
5
5
|
context "wiring" do
|
6
6
|
setup do
|
7
7
|
@rubyyot = IO.read(File.join(File.dirname(__FILE__), "..", "features", "fixtures", "rubyyot.rss"))
|
8
|
-
@expected_rubyyot = "<ul><li>\n <a href='http
|
8
|
+
@expected_rubyyot = "<ul id='my_feed'><li>\n <a href='http:/"
|
9
9
|
end
|
10
10
|
|
11
11
|
should "be set up for feeds" do
|
12
12
|
feed = "http://blog.rubyyot.com/tag/rubyyot/feed/rss"
|
13
|
-
|
13
|
+
Flannel::FeedParser.any_instance.stubs(:get_document).returns @rubyyot
|
14
|
+
body = Flannel.quilt ":feed my_feed #{feed}"
|
14
15
|
|
15
16
|
assert_equal(@expected_rubyyot, body[0..40])
|
16
17
|
end
|
data/test/flannel_test.rb
CHANGED
@@ -2,8 +2,8 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class FlannelTest < Test::Unit::TestCase
|
4
4
|
should "wrap functionality up in a neat package" do
|
5
|
-
markup = "
|
6
|
-
assert_equal "<h2>Foo</h2>\n\n<ul><li>Bar</li></ul>", Flannel.quilt(markup)
|
5
|
+
markup = ":header_two foo Foo\n\n:list list Bar"
|
6
|
+
assert_equal "<h2 id='foo'>Foo</h2>\n\n<ul id='list'><li>Bar</li></ul>", Flannel.quilt(markup)
|
7
7
|
end
|
8
8
|
|
9
9
|
should "return nil if text is nil" do
|
@@ -11,44 +11,44 @@ class FlannelTest < Test::Unit::TestCase
|
|
11
11
|
end
|
12
12
|
|
13
13
|
should "parse paragraphs correctly" do
|
14
|
-
input = "\nThis is paragraph one.\n\nThis is paragraph two.\n\nThis is paragraph three. Watchout for the end of file.\n"
|
15
|
-
output = "<p>This is paragraph one.</p>\n\n<p>This is paragraph two.</p>\n\n<p>This is paragraph three. Watchout for the end of file.</p>"
|
14
|
+
input = ":paragraph p_one\nThis is paragraph one.\n\n:paragraph p_two\nThis is paragraph two.\n\n:paragraph p_three\nThis is paragraph three. Watchout for the end of file.\n"
|
15
|
+
output = "<p id='p_one'>This is paragraph one.</p>\n\n<p id='p_two'>This is paragraph two.</p>\n\n<p id='p_three'>This is paragraph three. Watchout for the end of file.</p>"
|
16
16
|
assert_equal output, Flannel.quilt(input)
|
17
17
|
end
|
18
18
|
|
19
19
|
context "basic behavior" do
|
20
20
|
should "strip and convert underscores to pre tags" do
|
21
|
-
markup = "
|
22
|
-
assert_equal "<pre>foo\n\n bar</pre>", Flannel.quilt(markup)
|
21
|
+
markup = ":preformatted foo\nfoo\n\n bar\n"
|
22
|
+
assert_equal "<pre id='foo'>foo\n\n bar\n</pre>", Flannel.quilt(markup)
|
23
23
|
end
|
24
24
|
|
25
|
-
should "
|
26
|
-
markup = "
|
27
|
-
assert_equal
|
25
|
+
should "escape preformatted text" do
|
26
|
+
markup = ":preformatted math\n4 - 2 > 2 - 2\n"
|
27
|
+
assert_equal "<pre id='math'>4 - 2 > 2 - 2\n</pre>", Flannel.quilt(markup)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
context "When block starts with
|
32
|
-
should "convert one
|
33
|
-
markup = "
|
34
|
-
result = "<h1>Some header</h1>"
|
31
|
+
context "When block starts with header, it" do
|
32
|
+
should "convert one to a header one" do
|
33
|
+
markup = ":header_one h\n Some header"
|
34
|
+
result = "<h1 id='h'>Some header</h1>"
|
35
35
|
|
36
36
|
assert_equal result, Flannel.quilt(markup)
|
37
37
|
end
|
38
38
|
|
39
39
|
should "convert two equals to a header two" do
|
40
|
-
markup = "
|
41
|
-
result = "<h2>Some header</h2>"
|
40
|
+
markup = ":header_two h\n Some header"
|
41
|
+
result = "<h2 id='h'>Some header</h2>"
|
42
42
|
|
43
43
|
assert_equal result, Flannel.quilt(markup)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
context "When block
|
48
|
-
should "
|
47
|
+
context "When block is a list, it" do
|
48
|
+
should "be wrapped in ul tags" do
|
49
49
|
|
50
|
-
markup = "
|
51
|
-
result = "<ul><li>Yadda</li></ul>"
|
50
|
+
markup = ":list list\n Yadda\nYadda\nYadda"
|
51
|
+
result = "<ul id='list'><li>Yadda</li>\n<li>Yadda</li>\n<li>Yadda</li></ul>"
|
52
52
|
|
53
53
|
assert_equal result, Flannel.quilt(markup)
|
54
54
|
end
|
data/test/html_formatter_test.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
require 'flannel/stripe'
|
3
2
|
|
4
3
|
class HtmlFormatterTest < Test::Unit::TestCase
|
5
4
|
context "basic operations" do
|
@@ -8,7 +7,7 @@ class HtmlFormatterTest < Test::Unit::TestCase
|
|
8
7
|
end
|
9
8
|
|
10
9
|
should "return html fragment with format" do
|
11
|
-
assert_equal "<p>foo</p>", @formatter.do('foo', :paragraph)
|
10
|
+
assert_equal "<p id='bar'>foo</p>", @formatter.do('foo', :paragraph, "bar")
|
12
11
|
end
|
13
12
|
|
14
13
|
context "subdirectories" do
|
data/test/test_helper.rb
CHANGED
@@ -16,12 +16,57 @@ class Test::Unit::TestCase
|
|
16
16
|
Dir.foreach(dirname) do |f|
|
17
17
|
path = File.join(dirname, f)
|
18
18
|
if f == '.' or f == '..' then
|
19
|
-
|
19
|
+
next
|
20
20
|
elsif
|
21
|
-
|
21
|
+
File.directory?(path) then FileUtils.rm_rf(path)
|
22
22
|
else
|
23
|
-
|
23
|
+
FileUtils.rm( path )
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
28
|
+
def assert_doc doc, expected_type, expected_id, expected_text, expected_parent_id=nil, expected_attributes=nil
|
29
|
+
assert_not_nil doc
|
30
|
+
block = doc.content[0]
|
31
|
+
|
32
|
+
assert_block block, expected_type, expected_id, expected_text, expected_parent_id, expected_attributes
|
33
|
+
end
|
34
|
+
|
35
|
+
def assert_block block, expected_type, expected_id, expected_text, expected_parent_id=nil, expected_attributes=nil
|
36
|
+
header = block.shift
|
37
|
+
|
38
|
+
type = header.shift
|
39
|
+
assert_equal 2, type.length
|
40
|
+
assert_equal :block_type, type[0]
|
41
|
+
assert_equal expected_type, type[1]
|
42
|
+
|
43
|
+
id = header.shift
|
44
|
+
assert_equal 2, id.length
|
45
|
+
assert_equal :block_id, id[0]
|
46
|
+
assert_equal expected_id, id[1]
|
47
|
+
|
48
|
+
if expected_parent_id
|
49
|
+
parent_id = header.shift
|
50
|
+
assert_equal 2, parent_id.length
|
51
|
+
assert_equal :parent_id, parent_id[0]
|
52
|
+
assert_equal expected_parent_id, parent_id[1]
|
53
|
+
end
|
54
|
+
|
55
|
+
attribute_list = header.shift
|
56
|
+
assert_equal :attribute_list, attribute_list[0]
|
57
|
+
|
58
|
+
if expected_attributes
|
59
|
+
attributes = attribute_list.dup
|
60
|
+
attributes.shift
|
61
|
+
|
62
|
+
assert_equal expected_attributes.length, attributes.length
|
63
|
+
attributes.each do |attribute|
|
64
|
+
assert_equal expected_attributes[attribute[0]], attribute[1]
|
65
|
+
end
|
66
|
+
else
|
67
|
+
assert_equal 1, attribute_list.length
|
68
|
+
end
|
69
|
+
|
70
|
+
assert_equal expected_text, block.shift
|
71
|
+
end
|
27
72
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flannel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamal Hansen
|
@@ -9,11 +9,41 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-02-23 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: treetop
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: polyglot
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: shoulda
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: mocha
|
17
47
|
type: :development
|
18
48
|
version_requirement:
|
19
49
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -67,20 +97,23 @@ files:
|
|
67
97
|
- features/wiki_links.feature
|
68
98
|
- flannel.gemspec
|
69
99
|
- lib/flannel.rb
|
100
|
+
- lib/flannel/base_block.rb
|
101
|
+
- lib/flannel/block.treetop
|
70
102
|
- lib/flannel/block_cutter.rb
|
71
103
|
- lib/flannel/cache_location_does_not_exist_error.rb
|
72
104
|
- lib/flannel/feed_parser.rb
|
73
105
|
- lib/flannel/file_cache.rb
|
74
106
|
- lib/flannel/html_formatter.rb
|
75
|
-
- lib/flannel/text_block.rb
|
76
107
|
- lib/flannel/wrappable.rb
|
108
|
+
- test/base_block_html_generation_test.rb
|
109
|
+
- test/base_block_test.rb
|
77
110
|
- test/block_cutter_test.rb
|
111
|
+
- test/block_parser_test.rb
|
78
112
|
- test/feed_parser_test.rb
|
79
113
|
- test/file_cache_test.rb
|
80
114
|
- test/flannel_test.rb
|
81
115
|
- test/html_formatter_test.rb
|
82
116
|
- test/test_helper.rb
|
83
|
-
- test/text_block_test.rb
|
84
117
|
has_rdoc: true
|
85
118
|
homepage: http://github.com/rubyyot/flannel
|
86
119
|
licenses: []
|
@@ -114,6 +147,8 @@ test_files:
|
|
114
147
|
- test/block_cutter_test.rb
|
115
148
|
- test/test_helper.rb
|
116
149
|
- test/file_cache_test.rb
|
117
|
-
- test/
|
150
|
+
- test/base_block_test.rb
|
151
|
+
- test/block_parser_test.rb
|
118
152
|
- test/feed_parser_test.rb
|
119
153
|
- test/flannel_test.rb
|
154
|
+
- test/base_block_html_generation_test.rb
|
data/lib/flannel/text_block.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
module Flannel
|
2
|
-
class TextBlock
|
3
|
-
attr_reader :style
|
4
|
-
|
5
|
-
def initialize text
|
6
|
-
set_style_marker text
|
7
|
-
end
|
8
|
-
|
9
|
-
def to_s
|
10
|
-
@text
|
11
|
-
end
|
12
|
-
|
13
|
-
def to_h
|
14
|
-
html_formatter = Flannel::HtmlFormatter.new
|
15
|
-
html_formatter.do(@text, @style)
|
16
|
-
end
|
17
|
-
|
18
|
-
def set_style_marker text
|
19
|
-
case text[0]
|
20
|
-
when '_'[0] #preformatted
|
21
|
-
@style = :preformatted
|
22
|
-
@text = text[1..-1]
|
23
|
-
when '&'[0] #feed
|
24
|
-
@style = :feed
|
25
|
-
@text = text[1..-1]
|
26
|
-
when '*'[0] #list
|
27
|
-
@style = :list
|
28
|
-
@text = text
|
29
|
-
when '='[0] #header
|
30
|
-
match = text.match /^(=+)/
|
31
|
-
weight = match.captures[0].length
|
32
|
-
|
33
|
-
@style = "header_#{weight}".to_sym
|
34
|
-
@text = text[weight..-1]
|
35
|
-
when ':'[0] #generic
|
36
|
-
match = text.match /^(:[a-z_]+)/
|
37
|
-
|
38
|
-
@style = match.captures[0][1..-1].to_sym
|
39
|
-
|
40
|
-
style_length = match.captures[0].length
|
41
|
-
@text = text[style_length..-1].strip
|
42
|
-
else #other
|
43
|
-
@style = :paragraph
|
44
|
-
@text = text
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
data/test/text_block_test.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class TextBlockTest < Test::Unit::TestCase
|
4
|
-
context "basic behavior" do
|
5
|
-
should "return html" do
|
6
|
-
text_block = Flannel::TextBlock.new "foo"
|
7
|
-
assert_equal "<p>foo</p>", text_block.to_h
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
context "style" do
|
12
|
-
should "recognize preformatted" do
|
13
|
-
text_block = Flannel::TextBlock.new "_foo"
|
14
|
-
assert_equal :preformatted, text_block.style
|
15
|
-
end
|
16
|
-
|
17
|
-
should "recognize paragraph" do
|
18
|
-
text_block = Flannel::TextBlock.new "foo"
|
19
|
-
assert_equal :paragraph, text_block.style
|
20
|
-
end
|
21
|
-
|
22
|
-
should "recognize list" do
|
23
|
-
text_block = Flannel::TextBlock.new "* foo/n* bar/n* baz"
|
24
|
-
assert_equal :list, text_block.style
|
25
|
-
end
|
26
|
-
|
27
|
-
should "recognize feed" do
|
28
|
-
text_block = Flannel::TextBlock.new "& http://foo.example.com"
|
29
|
-
assert_equal :feed, text_block.style
|
30
|
-
end
|
31
|
-
|
32
|
-
should "recognize header" do
|
33
|
-
text_block = Flannel::TextBlock.new "====My Header"
|
34
|
-
assert_equal :header_4, text_block.style
|
35
|
-
end
|
36
|
-
|
37
|
-
should "wrap in pre tags when preformatted" do
|
38
|
-
text_block = Flannel::TextBlock.new "_foo"
|
39
|
-
assert_equal "<pre>foo</pre>", text_block.to_h
|
40
|
-
end
|
41
|
-
|
42
|
-
should "wrap in ul tags when unordered_list" do
|
43
|
-
text_block = Flannel::TextBlock.new "* foo"
|
44
|
-
assert_equal "<ul><li>foo</li></ul>", text_block.to_h
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context "external links" do
|
49
|
-
should "convert [|] pattern to an external link" do
|
50
|
-
text_block = Flannel::TextBlock.new "yadda [yadda|http://example.com] yadda"
|
51
|
-
assert_equal '<p>yadda <a href="http://example.com" target="_blank">yadda</a> yadda</p>', text_block.to_h
|
52
|
-
end
|
53
|
-
|
54
|
-
should "add http:// to external links" do
|
55
|
-
text_block = Flannel::TextBlock.new "yadda [yadda|example.com] yadda"
|
56
|
-
assert_equal '<p>yadda <a href="http://example.com" target="_blank">yadda</a> yadda</p>', text_block.to_h
|
57
|
-
end
|
58
|
-
|
59
|
-
should "add create title if provided to external links" do
|
60
|
-
text_block = Flannel::TextBlock.new "yadda [yadda|example.com|My title] yadda"
|
61
|
-
assert_equal '<p>yadda <a href="http://example.com" title="My title" target="_blank">yadda</a> yadda</p>', text_block.to_h
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|