pseudohikiparser 0.0.0.4.develop
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/pseudohiki2html.rb +319 -0
- data/lib/htmlelement/htmltemplate.rb +169 -0
- data/lib/htmlelement.rb +172 -0
- data/lib/pseudohiki/blockparser.rb +359 -0
- data/lib/pseudohiki/htmlformat.rb +229 -0
- data/lib/pseudohiki/htmlplugin.rb +155 -0
- data/lib/pseudohiki/inlineparser.rb +169 -0
- data/lib/pseudohiki/plaintextformat.rb +235 -0
- data/lib/pseudohiki/treestack.rb +119 -0
- data/lib/pseudohiki/version.rb +3 -0
- data/lib/pseudohikiparser.rb +6 -0
- data/test/test_blockparser.rb +313 -0
- data/test/test_htmlelement.rb +73 -0
- data/test/test_htmlformat.rb +538 -0
- data/test/test_htmlplugin.rb +14 -0
- data/test/test_htmltemplate.rb +190 -0
- data/test/test_inlineparser.rb +94 -0
- data/test/test_plaintextformat.rb +205 -0
- data/test/test_treestack.rb +133 -0
- metadata +107 -0
@@ -0,0 +1,190 @@
|
|
1
|
+
#/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'htmlelement/htmltemplate'
|
5
|
+
|
6
|
+
class TC_HtmlTemplate < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def test_new
|
9
|
+
html_result = <<HTML
|
10
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
11
|
+
"http://www.w3.org/TR/html4/loose.dtd">
|
12
|
+
<html lang="en">
|
13
|
+
<head>
|
14
|
+
<meta content="en" http-equiv="Content-Language">
|
15
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
|
16
|
+
<meta content="text/javascript" http-equiv="Content-Script-Type">
|
17
|
+
<title></title>
|
18
|
+
<link href="default.css" rel="stylesheet" type="text/css">
|
19
|
+
</head>
|
20
|
+
<body>
|
21
|
+
</body>
|
22
|
+
</html>
|
23
|
+
HTML
|
24
|
+
|
25
|
+
assert_equal(html_result, HtmlTemplate.new.to_s)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_charset
|
29
|
+
sjis_result =<<HTML
|
30
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
31
|
+
"http://www.w3.org/TR/html4/loose.dtd">
|
32
|
+
<html lang="ja">
|
33
|
+
<head>
|
34
|
+
<meta content="ja" http-equiv="Content-Language">
|
35
|
+
<meta content="text/html; charset=Shift_JIS" http-equiv="Content-Type">
|
36
|
+
<meta content="text/javascript" http-equiv="Content-Script-Type">
|
37
|
+
<title></title>
|
38
|
+
<link href="default.css" rel="stylesheet" type="text/css">
|
39
|
+
</head>
|
40
|
+
<body>
|
41
|
+
</body>
|
42
|
+
</html>
|
43
|
+
HTML
|
44
|
+
|
45
|
+
euc_jp_result = <<HTML
|
46
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
47
|
+
"http://www.w3.org/TR/html4/loose.dtd">
|
48
|
+
<html lang="ja">
|
49
|
+
<head>
|
50
|
+
<meta content="ja" http-equiv="Content-Language">
|
51
|
+
<meta content="text/html; charset=EUC-JP" http-equiv="Content-Type">
|
52
|
+
<meta content="text/javascript" http-equiv="Content-Script-Type">
|
53
|
+
<title></title>
|
54
|
+
<link href="default.css" rel="stylesheet" type="text/css">
|
55
|
+
</head>
|
56
|
+
<body>
|
57
|
+
</body>
|
58
|
+
</html>
|
59
|
+
HTML
|
60
|
+
|
61
|
+
html = HtmlTemplate.new
|
62
|
+
|
63
|
+
html.sjis!
|
64
|
+
assert_equal(sjis_result, html.to_s)
|
65
|
+
|
66
|
+
html.euc_jp!
|
67
|
+
assert_equal(euc_jp_result, html.to_s)
|
68
|
+
|
69
|
+
html.charset = 'Shift_JIS'
|
70
|
+
assert_equal(sjis_result, html.to_s)
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_base
|
74
|
+
html_result = <<HTML
|
75
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
76
|
+
"http://www.w3.org/TR/html4/loose.dtd">
|
77
|
+
<html lang="en">
|
78
|
+
<head>
|
79
|
+
<meta content="en" http-equiv="Content-Language">
|
80
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
|
81
|
+
<meta content="text/javascript" http-equiv="Content-Script-Type">
|
82
|
+
<title></title>
|
83
|
+
<link href="default.css" rel="stylesheet" type="text/css">
|
84
|
+
<base href="/base/path">
|
85
|
+
</head>
|
86
|
+
<body>
|
87
|
+
</body>
|
88
|
+
</html>
|
89
|
+
HTML
|
90
|
+
|
91
|
+
html = HtmlTemplate.new
|
92
|
+
html.base = '/base/path'
|
93
|
+
assert_equal(html_result, html.to_s)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
class TC_XhtmlTemplate < Test::Unit::TestCase
|
98
|
+
|
99
|
+
def test_new
|
100
|
+
html_result = <<HTML
|
101
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
102
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
103
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
104
|
+
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
105
|
+
<head>
|
106
|
+
<meta content="en" http-equiv="Content-Language" />
|
107
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
108
|
+
<meta content="text/javascript" http-equiv="Content-Script-Type" />
|
109
|
+
<title></title>
|
110
|
+
<link href="default.css" rel="stylesheet" type="text/css" />
|
111
|
+
</head>
|
112
|
+
<body>
|
113
|
+
</body>
|
114
|
+
</html>
|
115
|
+
HTML
|
116
|
+
|
117
|
+
assert_equal(html_result, XhtmlTemplate.new.to_s)
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_charset
|
121
|
+
sjis_result =<<HTML
|
122
|
+
<?xml version="1.0" encoding="Shift_JIS"?>
|
123
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
124
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
125
|
+
<html lang="ja" xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
|
126
|
+
<head>
|
127
|
+
<meta content="ja" http-equiv="Content-Language" />
|
128
|
+
<meta content="text/html; charset=Shift_JIS" http-equiv="Content-Type" />
|
129
|
+
<meta content="text/javascript" http-equiv="Content-Script-Type" />
|
130
|
+
<title></title>
|
131
|
+
<link href="default.css" rel="stylesheet" type="text/css" />
|
132
|
+
</head>
|
133
|
+
<body>
|
134
|
+
</body>
|
135
|
+
</html>
|
136
|
+
HTML
|
137
|
+
|
138
|
+
euc_jp_result = <<HTML
|
139
|
+
<?xml version="1.0" encoding="EUC-JP"?>
|
140
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
141
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
142
|
+
<html lang="ja" xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
|
143
|
+
<head>
|
144
|
+
<meta content="ja" http-equiv="Content-Language" />
|
145
|
+
<meta content="text/html; charset=EUC-JP" http-equiv="Content-Type" />
|
146
|
+
<meta content="text/javascript" http-equiv="Content-Script-Type" />
|
147
|
+
<title></title>
|
148
|
+
<link href="default.css" rel="stylesheet" type="text/css" />
|
149
|
+
</head>
|
150
|
+
<body>
|
151
|
+
</body>
|
152
|
+
</html>
|
153
|
+
HTML
|
154
|
+
|
155
|
+
html = XhtmlTemplate.new
|
156
|
+
|
157
|
+
html.sjis!
|
158
|
+
assert_equal(sjis_result, html.to_s)
|
159
|
+
|
160
|
+
html.euc_jp!
|
161
|
+
assert_equal(euc_jp_result, html.to_s)
|
162
|
+
|
163
|
+
html.charset = 'Shift_JIS'
|
164
|
+
assert_equal(sjis_result, html.to_s)
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_base
|
168
|
+
html_result = <<HTML
|
169
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
170
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
171
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
172
|
+
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
173
|
+
<head>
|
174
|
+
<meta content="en" http-equiv="Content-Language" />
|
175
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
176
|
+
<meta content="text/javascript" http-equiv="Content-Script-Type" />
|
177
|
+
<title></title>
|
178
|
+
<link href="default.css" rel="stylesheet" type="text/css" />
|
179
|
+
<base href="/base/path" />
|
180
|
+
</head>
|
181
|
+
<body>
|
182
|
+
</body>
|
183
|
+
</html>
|
184
|
+
HTML
|
185
|
+
|
186
|
+
html = XhtmlTemplate.new
|
187
|
+
html.base = '/base/path'
|
188
|
+
assert_equal(html_result, html.to_s)
|
189
|
+
end
|
190
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
#/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'lib/pseudohiki/inlineparser'
|
5
|
+
require 'lib/pseudohiki/htmlformat'
|
6
|
+
|
7
|
+
|
8
|
+
class TC_InlineParser < Test::Unit::TestCase
|
9
|
+
include PseudoHiki
|
10
|
+
|
11
|
+
def test_inlineparser_compile_token_pat
|
12
|
+
parser = InlineParser.new("")
|
13
|
+
assert_equal(/'''|\}\}|\|\||\{\{|\]\]|\[\[|==|''|\||:/,parser.token_pat)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_inlineparser_split_into_tokens
|
17
|
+
parser = InlineParser.new("")
|
18
|
+
tokens = parser.split_into_tokens("As a test case, '''this part''' must be in <strong>.")
|
19
|
+
assert_equal(["As a test case, ","'''","this part","'''"," must be in <strong>."],tokens)
|
20
|
+
tokens = parser.split_into_tokens("As another {{test case}}, '''this part''' must be in <strong>.")
|
21
|
+
assert_equal(["As another ","{{","test case","}}", ", ","'''","this part","'''"," must be in <strong>."],tokens)
|
22
|
+
tokens = parser.split_into_tokens("As another ''test case'', '''this part''' must be in <strong>.")
|
23
|
+
assert_equal(["As another ","''","test case","''", ", ","'''","this part","'''"," must be in <strong>."],tokens)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_inlineparser_parse
|
27
|
+
tree = InlineParser.parse("As {{''another test'' case}}, '''this part''' must be in <strong>.")
|
28
|
+
assert_equal([["As "], [[["another test"]], [" case"]], [", "], [["this part"]], [" must be in <strong>."]],tree)
|
29
|
+
tree = InlineParser.parse("this is a line that ends with a {{node}}")
|
30
|
+
assert_equal([["this is a line that ends with a "],[["node"]]],tree)
|
31
|
+
tree = InlineParser.parse("this is another line that ends with a {{node")
|
32
|
+
assert_equal([["this is another line that ends with a "],[["node"]]],tree)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_inlineparser_convert_last_node_into_leaf
|
36
|
+
parser = InlineParser.new("this is another line that ends with a {{node")
|
37
|
+
stack = parser.parse
|
38
|
+
assert_equal([["this is another line that ends with a "],[["node"]]],stack.tree)
|
39
|
+
stack.convert_last_node_into_leaf
|
40
|
+
assert_equal([["this is another line that ends with a "],["{{"], ["node"]],stack.tree)
|
41
|
+
tree = InlineParser.parse("As {{''another '''test'' case}}, '''this part''' must be in <strong>.")
|
42
|
+
assert_equal([["As "], [[["another "], ["'''"], ["test"]], [" case"]], [", "], [["this part"]], [" must be in <strong>."]],tree)
|
43
|
+
tree = InlineParser.parse("As {{''another ]]test case with a [[node]]''.}}, '''this part''' must be in <strong>.")
|
44
|
+
assert_equal([["As "], [[["another "], ["]]"], ["test case with a "], [["node"]]], ["."]], [", "], [["this part"]], [" must be in <strong>."]],tree)
|
45
|
+
tree = InlineParser.parse("As {{''another {{test'' case}}, '''this part''' must be in <strong>.")
|
46
|
+
assert_equal([["As "], [[["another "], ["{{"], ["test"]], [" case"]], [", "], [["this part"]], [" must be in <strong>."]],tree)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class TC_HtmlFormat < Test::Unit::TestCase
|
51
|
+
include PseudoHiki
|
52
|
+
|
53
|
+
def test_visit_linknode
|
54
|
+
formatter = HtmlFormat.get_plain
|
55
|
+
|
56
|
+
tree = InlineParser.parse("[[image.html]] is a link to a html file.")
|
57
|
+
assert_equal('<a href="image.html">image.html</a> is a link to a html file.', tree.accept(formatter).to_s)
|
58
|
+
|
59
|
+
tree = InlineParser.parse("[[LINK|image.html]] is a link to a html file.")
|
60
|
+
assert_equal('<a href="image.html">LINK</a> is a link to a html file.', tree.accept(formatter).to_s)
|
61
|
+
assert_equal('<a href="image.html">LINK</a> is a link to a html file.', tree.accept(formatter).to_s)
|
62
|
+
|
63
|
+
tree = InlineParser.parse("[[LINK|http://www.example.org/]] is a link to an url.")
|
64
|
+
assert_equal('<a href="http://www.example.org/">LINK</a> is a link to an url.', tree.accept(formatter).to_s)
|
65
|
+
assert_equal('<a href="http://www.example.org/">LINK</a> is a link to an url.', tree.accept(formatter).to_s)
|
66
|
+
|
67
|
+
tree = InlineParser.parse("[[an explanation about {{co2}}|co2.html]] is a link to a html file.")
|
68
|
+
assert_equal('<a href="co2.html">an explanation about <span>co2</span></a> is a link to a html file.', tree.accept(formatter).to_s)
|
69
|
+
assert_equal('<a href="co2.html">an explanation about <span>co2</span></a> is a link to a html file.', tree.accept(formatter).to_s)
|
70
|
+
|
71
|
+
tree = InlineParser.parse("[[image name|image.png]] is a link to a image file.")
|
72
|
+
assert_equal("<img alt=\"image name\" src=\"image.png\">\n is a link to a image file.", tree.accept(formatter).to_s)
|
73
|
+
|
74
|
+
tree = InlineParser.parse("[[image.png]] is a link to a image file.")
|
75
|
+
assert_equal("<img src=\"image.png\">\n is a link to a image file.", tree.accept(formatter).to_s)
|
76
|
+
|
77
|
+
tree = InlineParser.parse("[[link with an empty uri|]]")
|
78
|
+
assert_equal("<a href=\"\">link with an empty uri</a>", tree.accept(formatter).to_s)
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_visit_leafnode
|
82
|
+
formatter = HtmlFormat.get_plain
|
83
|
+
tree = InlineParser.parse("a string with <charactors> that are replaced by &entity references.")
|
84
|
+
assert_equal("a string with <charactors> that are replaced by &entity references.", tree.accept(formatter).to_s)
|
85
|
+
tree = InlineParser.parse("a string with a token |.")
|
86
|
+
assert_equal("a string with a token |.", tree.accept(formatter).to_s)
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_visit_pluginnode
|
90
|
+
formatter = HtmlFormat.get_plain
|
91
|
+
tree = InlineParser.new("{{co2}} represents the carbon dioxide.").parse.tree
|
92
|
+
assert_equal("<span>co2</span> represents the carbon dioxide.",tree.accept(formatter).to_s)
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,205 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'pseudohiki/plaintextformat'
|
5
|
+
|
6
|
+
class TC_PlainTextFormat < Test::Unit::TestCase
|
7
|
+
include PseudoHiki
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@formatter = PlainTextFormat.create
|
11
|
+
@verbose_formatter = PlainTextFormat.create(:verbose_mode => true)
|
12
|
+
@strict_formatter = PlainTextFormat.create(:strict_mode => true)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_plain
|
16
|
+
text = <<TEXT
|
17
|
+
test string
|
18
|
+
TEXT
|
19
|
+
tree = BlockParser.parse(text.lines.to_a)
|
20
|
+
assert_equal("test string\n\n", @formatter.format(tree).to_s)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_em
|
24
|
+
text = <<TEXT
|
25
|
+
A test string with ''emphasis'' is here.
|
26
|
+
TEXT
|
27
|
+
tree = BlockParser.parse(text.lines.to_a)
|
28
|
+
assert_equal("A test string with emphasis is here.\n\n", @formatter.format(tree).to_s)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_strong
|
32
|
+
text = <<TEXT
|
33
|
+
A test string with '''strong''' is here.
|
34
|
+
TEXT
|
35
|
+
tree = BlockParser.parse(text.lines.to_a)
|
36
|
+
assert_equal("A test string with strong is here.\n\n", @formatter.format(tree).to_s)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_del
|
40
|
+
text = <<TEXT
|
41
|
+
A test string ==with deleted words ==is here.
|
42
|
+
TEXT
|
43
|
+
expected_text = <<TEXT
|
44
|
+
A test string is here.
|
45
|
+
|
46
|
+
TEXT
|
47
|
+
|
48
|
+
expected_text_in_verbose_mode = <<TEXT
|
49
|
+
A test string [deleted:with deleted words ]is here.
|
50
|
+
|
51
|
+
TEXT
|
52
|
+
tree = BlockParser.parse(text.lines.to_a)
|
53
|
+
assert_equal(expected_text, @formatter.format(tree).to_s)
|
54
|
+
assert_equal(expected_text_in_verbose_mode, @verbose_formatter.format(tree).to_s)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_link_url
|
58
|
+
text = <<TEXT
|
59
|
+
A test string with a [[link|http://www.example.org/]] is here.
|
60
|
+
TEXT
|
61
|
+
tree = BlockParser.parse(text.lines.to_a)
|
62
|
+
assert_equal("A test string with a link is here.\n\n", @formatter.format(tree).to_s)
|
63
|
+
assert_equal("A test string with a link (http://www.example.org/) is here.\n\n",
|
64
|
+
@verbose_formatter.format(tree).to_s)
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_link_image
|
68
|
+
text = <<TEXT
|
69
|
+
A test string with an [[image|image.jpg]] is here.
|
70
|
+
TEXT
|
71
|
+
tree = BlockParser.parse(text.lines.to_a)
|
72
|
+
assert_equal("A test string with an image is here.\n\n", @formatter.format(tree).to_s)
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_commentout
|
76
|
+
text = <<TEXT
|
77
|
+
lines including a comment out in these
|
78
|
+
//Comment out
|
79
|
+
another line
|
80
|
+
TEXT
|
81
|
+
expected_text = <<TEXT
|
82
|
+
lines including a comment out in these
|
83
|
+
|
84
|
+
another line
|
85
|
+
|
86
|
+
TEXT
|
87
|
+
|
88
|
+
tree = BlockParser.parse(text.lines.to_a)
|
89
|
+
assert_equal(expected_text, @formatter.format(tree).to_s)
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_heading
|
93
|
+
text = <<TEXT
|
94
|
+
!!heading
|
95
|
+
a normal line
|
96
|
+
TEXT
|
97
|
+
|
98
|
+
expected_text = <<TEXT
|
99
|
+
heading
|
100
|
+
a normal line
|
101
|
+
|
102
|
+
TEXT
|
103
|
+
tree = BlockParser.parse(text.lines.to_a)
|
104
|
+
assert_equal(expected_text, @formatter.format(tree).to_s)
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_desc
|
108
|
+
text = <<TEXT
|
109
|
+
:tel: 03-xxxx-xxxx
|
110
|
+
:: 03-yyyy-yyyy
|
111
|
+
:fax: 03-xxxx-xxxx
|
112
|
+
TEXT
|
113
|
+
|
114
|
+
expected_text = <<TEXT
|
115
|
+
tel: 03-xxxx-xxxx
|
116
|
+
03-yyyy-yyyy
|
117
|
+
fax: 03-xxxx-xxxx
|
118
|
+
TEXT
|
119
|
+
tree = BlockParser.parse(text.lines.to_a)
|
120
|
+
assert_equal(expected_text, @formatter.format(tree).to_s)
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_table
|
124
|
+
text = <<TEXT
|
125
|
+
||cell 1-1||^>> cell 1-2||cell 1-5
|
126
|
+
||cell 2-1||cell 2-5
|
127
|
+
TEXT
|
128
|
+
|
129
|
+
expected_text = <<TEXT
|
130
|
+
cell 1-1 cell 1-2 cell 1-5
|
131
|
+
cell 2-1 cell 2-5
|
132
|
+
TEXT
|
133
|
+
tree = BlockParser.parse(text.lines.to_a)
|
134
|
+
assert_equal(expected_text, @formatter.format(tree).to_s)
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_verbose_mode_table
|
138
|
+
text = <<TEXT
|
139
|
+
||cell 1-1||^>> cell 1-2||cell 1-5
|
140
|
+
||cell 2-1||cell 2-5
|
141
|
+
TEXT
|
142
|
+
|
143
|
+
expected_verbose_text = <<TEXT
|
144
|
+
cell 1-1 cell 1-2 == == cell 1-5
|
145
|
+
cell 2-1 || || || cell 2-5
|
146
|
+
TEXT
|
147
|
+
tree = BlockParser.parse(text.lines.to_a)
|
148
|
+
assert_equal(expected_verbose_text, @verbose_formatter.format(tree).to_s)
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_verbose_mode_table_with_expansion_in_the_last_column
|
152
|
+
text = <<TEXT
|
153
|
+
||cell 1-1||^> cell 1-2||>cell 1-4
|
154
|
+
||cell 2-1||cell 2-4||cell 2-5
|
155
|
+
TEXT
|
156
|
+
|
157
|
+
expected_verbose_text = <<TEXT
|
158
|
+
cell 1-1 cell 1-2 == cell 1-4 ==
|
159
|
+
cell 2-1 || || cell 2-4 cell 2-5
|
160
|
+
TEXT
|
161
|
+
tree = BlockParser.parse(text.lines.to_a)
|
162
|
+
assert_equal(expected_verbose_text, @verbose_formatter.format(tree).to_s)
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_malformed_table
|
166
|
+
well_formed_text = <<TEXT
|
167
|
+
||cell 1-1||>>cell 1-2,3,4||cell 1-5
|
168
|
+
||cell 2-1||^>cell 2-2,3 3-2,3||cell 2-4||cell 2-5
|
169
|
+
||cell 3-1||cell 3-4||cell 3-5
|
170
|
+
||cell 4-1||cell 4-2||cell 4-3||cell 4-4||cell 4-5
|
171
|
+
TEXT
|
172
|
+
|
173
|
+
expected_well_formed_text = <<TEXT
|
174
|
+
cell 1-1 cell 1-2,3,4 == == cell 1-5
|
175
|
+
cell 2-1 cell 2-2,3 3-2,3 == cell 2-4 cell 2-5
|
176
|
+
cell 3-1 || || cell 3-4 cell 3-5
|
177
|
+
cell 4-1 cell 4-2 cell 4-3 cell 4-4 cell 4-5
|
178
|
+
TEXT
|
179
|
+
|
180
|
+
tree = BlockParser.parse(well_formed_text.lines.to_a)
|
181
|
+
assert_equal(expected_well_formed_text, @verbose_formatter.format(tree).to_s)
|
182
|
+
|
183
|
+
mal_formed_text = <<TEXT
|
184
|
+
||cell 1-1||>>cell 1-2,3,4||cell 1-5
|
185
|
+
||cell 2-1||^>cell 2-2,3 3-2,3||cell 2-5
|
186
|
+
||cell 3-1||cell 3-4||cell 3-5
|
187
|
+
||cell 4-1||cell 4-2||cell 4-3||cell 4-4||cell 4-5
|
188
|
+
TEXT
|
189
|
+
|
190
|
+
expected_mal_formed_text = <<TEXT
|
191
|
+
cell 1-1 cell 1-2,3,4 == == cell 1-5
|
192
|
+
cell 2-1 cell 2-2,3 3-2,3 == cell 2-5
|
193
|
+
cell 3-1 || || cell 3-4 cell 3-5
|
194
|
+
cell 4-1 cell 4-2 cell 4-3 cell 4-4 cell 4-5
|
195
|
+
TEXT
|
196
|
+
|
197
|
+
assert_raise(PlainTextFormat::TableNodeFormatter::MalFormedTableError) do
|
198
|
+
tree = BlockParser.parse(mal_formed_text.lines.to_a)
|
199
|
+
@strict_formatter.format(tree).to_s
|
200
|
+
end
|
201
|
+
|
202
|
+
tree = BlockParser.parse(mal_formed_text.lines.to_a)
|
203
|
+
assert_equal(expected_mal_formed_text, @verbose_formatter.format(tree).to_s)
|
204
|
+
end
|
205
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
#/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'pseudohiki/treestack'
|
5
|
+
|
6
|
+
class TC_TreeStack < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def test_push_node
|
9
|
+
stack = TreeStack.new
|
10
|
+
node = TreeStack::Node.new
|
11
|
+
stack.push(node)
|
12
|
+
assert_equal([[]],stack.tree)
|
13
|
+
second_node = TreeStack::Node.new
|
14
|
+
stack.push(second_node)
|
15
|
+
assert_equal([[[]]],stack.tree)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_push_leaf
|
19
|
+
stack = TreeStack.new
|
20
|
+
leaf = TreeStack::Leaf.new
|
21
|
+
leaf.push "leaf"
|
22
|
+
stack.push(leaf)
|
23
|
+
assert_equal([["leaf"]],stack.tree)
|
24
|
+
second_leaf = TreeStack::Leaf.new
|
25
|
+
second_leaf.push "second_leaf"
|
26
|
+
stack.push(second_leaf)
|
27
|
+
assert_equal([["leaf"],["second_leaf"]],stack.tree)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_push_leaf_then_node
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_without_mergeable
|
34
|
+
node = TreeStack::Node.new
|
35
|
+
assert_same node.class, TreeStack::Node
|
36
|
+
assert_equal true, node.kind_of?(TreeStack::Node)
|
37
|
+
assert_not_equal true, node.kind_of?(TreeStack::Mergeable)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_with_mergeable
|
41
|
+
node = TreeStack::Node.new
|
42
|
+
class <<node #
|
43
|
+
include TreeStack::Mergeable
|
44
|
+
end
|
45
|
+
assert node.kind_of?(TreeStack::Mergeable)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_node_end
|
49
|
+
tree = TreeStack.new
|
50
|
+
assert tree.node_end.kind_of?(TreeStack::NodeEnd)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_leaf_create
|
54
|
+
leaf = TreeStack::Leaf.create("leaf")
|
55
|
+
assert_equal(["leaf"],leaf)
|
56
|
+
assert_kind_of(TreeStack::Leaf,leaf)
|
57
|
+
empty_leaf = TreeStack::Leaf.create
|
58
|
+
assert_equal([],empty_leaf)
|
59
|
+
assert_kind_of(TreeStack::Leaf,leaf)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_push_as_sibling
|
63
|
+
stack = TreeStack.new
|
64
|
+
leaf = TreeStack::Leaf.create("leaf")
|
65
|
+
# leaf.push "leaf"
|
66
|
+
stack.push(leaf)
|
67
|
+
assert_equal([["leaf"]],stack.tree)
|
68
|
+
node = TreeStack::Node.new
|
69
|
+
stack.push(node)
|
70
|
+
stack.push(leaf)
|
71
|
+
assert_equal([["leaf"],[["leaf"]]],stack.tree)
|
72
|
+
subnode = TreeStack::Node.new
|
73
|
+
stack.push(subnode)
|
74
|
+
stack.push(leaf)
|
75
|
+
assert_equal([["leaf"],[["leaf"],[["leaf"]]]],stack.tree)
|
76
|
+
sibling_node = TreeStack::Node.new
|
77
|
+
stack.push_as_sibling(sibling_node)
|
78
|
+
stack.push(leaf)
|
79
|
+
assert_equal([["leaf"],[["leaf"],[["leaf"]],[["leaf"]]]],stack.tree)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_depth
|
83
|
+
stack = TreeStack.new
|
84
|
+
leaf = TreeStack::Leaf.create("leaf")
|
85
|
+
leaf2 = TreeStack::Leaf.create("leaf2")
|
86
|
+
leaf3 = TreeStack::Leaf.create("leaf2")
|
87
|
+
leaf4 = TreeStack::Leaf.create("leaf2")
|
88
|
+
node = TreeStack::Node.new
|
89
|
+
node2 = TreeStack::Node.new
|
90
|
+
assert_nil(leaf.depth)
|
91
|
+
stack.push(leaf)
|
92
|
+
assert_equal(1,leaf.depth)
|
93
|
+
stack.push(leaf2)
|
94
|
+
assert_equal(1,leaf2.depth)
|
95
|
+
stack.push(node)
|
96
|
+
assert_equal(1,node.depth)
|
97
|
+
stack.push(leaf3)
|
98
|
+
assert_equal(2,leaf3.depth)
|
99
|
+
stack.push(node2)
|
100
|
+
assert_equal(2,node2.depth)
|
101
|
+
stack.push(leaf4)
|
102
|
+
assert_equal(3,leaf4.depth)
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_last_leaf
|
106
|
+
stack = TreeStack.new
|
107
|
+
leaf = TreeStack::Leaf.create("leaf")
|
108
|
+
node = TreeStack::Node.new
|
109
|
+
stack.push(leaf)
|
110
|
+
assert_equal(leaf,stack.last_leaf)
|
111
|
+
stack.push(node)
|
112
|
+
assert_nil(stack.last_leaf)
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_node_end
|
116
|
+
stack = TreeStack.new
|
117
|
+
leaf1 = TreeStack::Leaf.create("leaf1")
|
118
|
+
leaf2 = TreeStack::Leaf.create("leaf2")
|
119
|
+
leaf3 = TreeStack::Leaf.create("leaf3")
|
120
|
+
leaf4 = TreeStack::Leaf.create("leaf4")
|
121
|
+
node = TreeStack::Node.new
|
122
|
+
node_end = stack.node_end
|
123
|
+
stack.push(leaf1)
|
124
|
+
stack.push(node)
|
125
|
+
stack.push(leaf2)
|
126
|
+
stack.push(leaf3)
|
127
|
+
assert_equal(["leaf3"],stack.last_leaf)
|
128
|
+
stack.push(node_end)
|
129
|
+
assert_nil(stack.last_leaf)
|
130
|
+
stack.push(leaf4)
|
131
|
+
assert_equal([["leaf1"],[["leaf2"],["leaf3"]],["leaf4"]],stack.tree)
|
132
|
+
end
|
133
|
+
end
|