koara 0.9.0

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.
@@ -0,0 +1 @@
1
+ ðinæ
@@ -0,0 +1 @@
1
+ abcd
@@ -0,0 +1,103 @@
1
+ require 'koara'
2
+ require 'minitest/autorun'
3
+
4
+ class FileReaderTest < MiniTest::Unit::TestCase
5
+ def setup
6
+ @buffer = Array.new
7
+ end
8
+
9
+ def test_read
10
+ @reader = FileReader.new('test/filereader.kd')
11
+ assert_equal(4, @reader.read(@buffer, 0, 4))
12
+ assert_equal('a', @buffer[0])
13
+ assert_equal('b', @buffer[1])
14
+ assert_equal('c', @buffer[2])
15
+ assert_equal('d', @buffer[3])
16
+ assert_equal(4, @buffer.length)
17
+ assert_equal(-1, @reader.read(@buffer, 0, 4))
18
+ end
19
+
20
+ def test_read_part_of_string
21
+ @reader = FileReader.new('test/filereader.kd')
22
+ assert_equal(2, @reader.read(@buffer, 0, 2))
23
+ assert_equal('a', @buffer[0])
24
+ assert_equal('b', @buffer[1])
25
+ assert_equal(2, @buffer.length)
26
+ end
27
+
28
+ def test_read_with_offset_part_of_string
29
+ @reader = FileReader.new('test/filereader.kd')
30
+ assert_equal(4, @reader.read(@buffer, 2, 4))
31
+ assert_equal(nil, @buffer[0])
32
+ assert_equal(nil, @buffer[1])
33
+ assert_equal('a', @buffer[2])
34
+ assert_equal('b', @buffer[3])
35
+ end
36
+
37
+ def test_read_with_offset_too_large_part_of_string
38
+ @reader = FileReader.new('test/filereader.kd')
39
+ assert_equal(4, @reader.read(@buffer, 6, 4))
40
+ assert_equal(nil, @buffer[0])
41
+ assert_equal(nil, @buffer[1])
42
+ assert_equal(nil, @buffer[2])
43
+ assert_equal(nil, @buffer[3])
44
+ end
45
+
46
+ def test_read_until_eof
47
+ @reader = FileReader.new('test/filereader.kd')
48
+ assert_equal(2, @reader.read(@buffer, 0, 2))
49
+ assert_equal('a', @buffer[0])
50
+ assert_equal('b', @buffer[1])
51
+ assert_equal(2, @reader.read(@buffer, 0, 3))
52
+ assert_equal('c', @buffer[0])
53
+ assert_equal('d', @buffer[1])
54
+ assert_equal(-1, @reader.read(@buffer, 0, 2))
55
+ end
56
+
57
+ def test_read_with_unicode
58
+ @reader = FileReader.new('test/filereader-unicode.kd')
59
+ assert_equal(4, @reader.read(@buffer, 0, 4))
60
+ assert_equal('ð', @buffer[0])
61
+ assert_equal('i', @buffer[1])
62
+ assert_equal('n', @buffer[2])
63
+ assert_equal('æ', @buffer[3])
64
+ assert_equal(4, @buffer.length)
65
+ end
66
+
67
+ def test_read_with_unicode_part_of_string
68
+ @reader = FileReader.new('test/filereader-unicode.kd')
69
+ assert_equal(2, @reader.read(@buffer, 0, 2))
70
+ assert_equal('ð', @buffer[0])
71
+ assert_equal('i', @buffer[1])
72
+ assert_equal(2, @buffer.length)
73
+ end
74
+
75
+ def test_read_with_unicode_and_offset_part_of_string
76
+ @reader = FileReader.new('test/filereader-unicode.kd')
77
+ assert_equal(4, @reader.read(@buffer, 2, 4))
78
+ assert_equal(nil, @buffer[0])
79
+ assert_equal(nil, @buffer[1])
80
+ assert_equal('ð', @buffer[2])
81
+ assert_equal('i', @buffer[3])
82
+ end
83
+
84
+ def test_read_with_unicode_and_offset_too_large_part_of_string
85
+ @reader = FileReader.new('test/filereader-unicode.kd')
86
+ assert_equal(4, @reader.read(@buffer, 6, 4))
87
+ assert_equal(nil, @buffer[0])
88
+ assert_equal(nil, @buffer[1])
89
+ assert_equal(nil, @buffer[2])
90
+ assert_equal(nil, @buffer[3])
91
+ end
92
+
93
+ def test_read_with_unicode_until_eof
94
+ @reader = FileReader.new('test/filereader-unicode.kd')
95
+ assert_equal(3, @reader.read(@buffer, 0, 3))
96
+ assert_equal('ð', @buffer[0])
97
+ assert_equal('i', @buffer[1])
98
+ assert_equal(1, @reader.read(@buffer, 0, 3))
99
+ assert_equal('æ', @buffer[0])
100
+ assert_equal(-1, @reader.read(@buffer, 0, 2))
101
+ end
102
+
103
+ end
@@ -0,0 +1,179 @@
1
+ class Html5Renderer
2
+
3
+ def visit_document(node)
4
+ @level = 0
5
+ @list_sequence = Array.new
6
+ @out = StringIO.new
7
+ node.children_accept(self)
8
+ end
9
+
10
+ def visit_heading(node)
11
+ @out << indent + '<h' + node.value.to_s + '>'
12
+ node.children_accept(self)
13
+ @out << '</h' + node.value.to_s + ">\n"
14
+ unless node.nested
15
+ @out << "\n"
16
+ end
17
+ end
18
+
19
+ def visit_blockquote(node)
20
+ @out << indent + '<blockquote>'
21
+ if !node.children.nil? && node.children.any?
22
+ @out << "\n"
23
+ end
24
+ @level += 1
25
+ node.children_accept(self)
26
+ @level-=1
27
+ @out << indent + "</blockquote>\n"
28
+ if !node.nested
29
+ @out << "\n"
30
+ end
31
+ end
32
+
33
+ def visit_list_block(node)
34
+ @list_sequence.push(0)
35
+ tag = node.ordered ? 'ol' : 'ul'
36
+ @out << "#{indent}<#{tag}>\n"
37
+ @level += 1
38
+ node.children_accept(self)
39
+ @level -= 1
40
+ @out << "#{indent}</#{tag}>\n"
41
+ if !node.nested
42
+ @out << "\n"
43
+ end
44
+ @list_sequence.pop
45
+ end
46
+
47
+ def visit_list_item(node)
48
+ seq = @list_sequence.last.to_i + 1
49
+ @list_sequence[-1] = seq
50
+ @out << "#{indent}<li"
51
+
52
+ if node.number && seq != node.number.to_i
53
+ @out << " value=\"#{node.number}\""
54
+ @list_sequence.push(node.number)
55
+ end
56
+ @out << '>'
57
+ if !node.children.nil?
58
+ block = node.children[0].instance_of?(Paragraph) || node.children[0].instance_of?(BlockElement)
59
+ if (node.children.length > 1 || !block)
60
+ @out << "\n"
61
+ end
62
+ @level += 1
63
+ node.children_accept(self)
64
+ @level -= 1
65
+ if (node.children.length > 1 || !block)
66
+ @out << indent
67
+ end
68
+ end
69
+ @out << "</li>\n"
70
+ end
71
+
72
+ def visit_codeblock(node)
73
+ @out << indent + '<pre><code'
74
+ if node.language
75
+ @out << " class=\"language-" + escape(node.language) + "\""
76
+ end
77
+ @out << '>'
78
+ @out << escape(node.value) + "</code></pre>\n"
79
+ @out << ("\n") if !node.nested
80
+ end
81
+
82
+ def visit_paragraph(node)
83
+ if node.nested && node.parent.instance_of?(ListItem) && node.is_single_child
84
+ node.children_accept(self)
85
+ else
86
+ @out << indent + '<p>'
87
+ node.children_accept(self)
88
+ @out << "</p>\n"
89
+ unless node.nested
90
+ @out << "\n"
91
+ end
92
+ end
93
+ end
94
+
95
+ def visit_block_element(node)
96
+ if node.nested && node.parent.instance_of?(ListItem) && node.is_single_child
97
+ node.children_accept(self)
98
+ else
99
+ @out << indent
100
+ node.children_accept(self)
101
+ if !node.nested
102
+ @out << "\n"
103
+ end
104
+ end
105
+ end
106
+
107
+ def visit_image(node)
108
+ @out << "<img src=\"" + escape_url(node.value) + "\" alt=\""
109
+ node.children_accept(self)
110
+ @out << "\" />"
111
+ end
112
+
113
+ def visit_link(node)
114
+ @out << "<a href=\"" + escape_url(node.value) + "\">"
115
+ node.children_accept(self)
116
+ @out << '</a>'
117
+ end
118
+
119
+ def visit_strong(node)
120
+ @out << '<strong>'
121
+ node.children_accept(self)
122
+ @out << '</strong>'
123
+ end
124
+
125
+ def visit_em(node)
126
+ @out << '<em>'
127
+ node.children_accept(self)
128
+ @out << '</em>'
129
+ end
130
+
131
+ def visit_code(node)
132
+ @out << '<code>'
133
+ node.children_accept(self)
134
+ @out << '</code>'
135
+ end
136
+
137
+ def visit_text(node)
138
+ @out << escape(node.value.to_s)
139
+ end
140
+
141
+ #
142
+ def escape(text)
143
+ return text.gsub(/&/, '&amp;')
144
+ .gsub(/</, '&lt;')
145
+ .gsub(/>/, '&gt;')
146
+ .gsub(/"/, '&quot;')
147
+ end
148
+
149
+ def visit_linebreak(node)
150
+ @out << "<br>\n" + indent
151
+ node.children_accept(self)
152
+ end
153
+
154
+ def escape_url(text)
155
+ text.gsub(/ /, '%20')
156
+ .gsub(/"/, '%22')
157
+ .gsub(/`/, '%60')
158
+ .gsub(/</, '%3C')
159
+ .gsub(/>/, '%3E')
160
+ .gsub(/\[/, '%5B')
161
+ .gsub(/\]/, '%5D')
162
+ .gsub(/\\/, '%5C')
163
+ end
164
+
165
+ def indent
166
+ repeat = @level * 2
167
+ str = StringIO.new
168
+ repeat.times {
169
+ str << ' '
170
+ }
171
+ str.string
172
+ end
173
+
174
+ def output
175
+ @out.string.strip
176
+ end
177
+
178
+
179
+ end
@@ -0,0 +1,103 @@
1
+ require 'koara'
2
+ require 'minitest/autorun'
3
+
4
+ class StringReaderTest < MiniTest::Unit::TestCase
5
+ def setup
6
+ @buffer = Array.new
7
+ end
8
+
9
+ def test_read
10
+ @reader = StringReader.new('abcd')
11
+ assert_equal(4, @reader.read(@buffer, 0, 4))
12
+ assert_equal('a', @buffer[0])
13
+ assert_equal('b', @buffer[1])
14
+ assert_equal('c', @buffer[2])
15
+ assert_equal('d', @buffer[3])
16
+ assert_equal(4, @buffer.length)
17
+ assert_equal(-1, @reader.read(@buffer, 0, 4))
18
+ end
19
+
20
+ def test_read_part_of_string
21
+ @reader = StringReader.new('abcd')
22
+ assert_equal(2, @reader.read(@buffer, 0, 2))
23
+ assert_equal('a', @buffer[0])
24
+ assert_equal('b', @buffer[1])
25
+ assert_equal(2, @buffer.length)
26
+ end
27
+
28
+ def test_read_with_offset_part_of_string
29
+ @reader = StringReader.new('abcd')
30
+ assert_equal(4, @reader.read(@buffer, 2, 4))
31
+ assert_equal(nil, @buffer[0])
32
+ assert_equal(nil, @buffer[1])
33
+ assert_equal('a', @buffer[2])
34
+ assert_equal('b', @buffer[3])
35
+ end
36
+
37
+ def test_read_with_offset_too_large_part_of_string
38
+ @reader = StringReader.new('abcd')
39
+ assert_equal(4, @reader.read(@buffer, 6, 4))
40
+ assert_equal(nil, @buffer[0])
41
+ assert_equal(nil, @buffer[1])
42
+ assert_equal(nil, @buffer[2])
43
+ assert_equal(nil, @buffer[3])
44
+ end
45
+
46
+ def test_read_until_eof
47
+ @reader = StringReader.new('abcd')
48
+ assert_equal(2, @reader.read(@buffer, 0, 2))
49
+ assert_equal('a', @buffer[0])
50
+ assert_equal('b', @buffer[1])
51
+ assert_equal(2, @reader.read(@buffer, 0, 3))
52
+ assert_equal('c', @buffer[0])
53
+ assert_equal('d', @buffer[1])
54
+ assert_equal(-1, @reader.read(@buffer, 0, 2))
55
+ end
56
+
57
+ def test_read_with_unicode
58
+ @reader = StringReader.new('ðinæ')
59
+ assert_equal(4, @reader.read(@buffer, 0, 4))
60
+ assert_equal('ð', @buffer[0])
61
+ assert_equal('i', @buffer[1])
62
+ assert_equal('n', @buffer[2])
63
+ assert_equal('æ', @buffer[3])
64
+ assert_equal(4, @buffer.length)
65
+ end
66
+
67
+ def test_read_with_unicode_part_of_string
68
+ @reader = StringReader.new('ðinæ')
69
+ assert_equal(2, @reader.read(@buffer, 0, 2))
70
+ assert_equal('ð', @buffer[0])
71
+ assert_equal('i', @buffer[1])
72
+ assert_equal(2, @buffer.length)
73
+ end
74
+
75
+ def test_Read_with_unicode_and_offset_part_of_string
76
+ @reader = StringReader.new('ðinæ')
77
+ assert_equal(4, @reader.read(@buffer, 2, 4))
78
+ assert_equal(nil, @buffer[0])
79
+ assert_equal(nil, @buffer[1])
80
+ assert_equal('ð', @buffer[2])
81
+ assert_equal('i', @buffer[3])
82
+ end
83
+
84
+ def test_read_with_unicode_and_offset_too_large_part_of_string
85
+ @reader = StringReader.new('ðinæ')
86
+ assert_equal(4, @reader.read(@buffer, 6, 4))
87
+ assert_equal(nil, @buffer[0])
88
+ assert_equal(nil, @buffer[1])
89
+ assert_equal(nil, @buffer[2])
90
+ assert_equal(nil, @buffer[3])
91
+ end
92
+
93
+ def test_read_with_unicode_until_eof
94
+ @reader = StringReader.new('ðinæ')
95
+ assert_equal(3, @reader.read(@buffer, 0, 3))
96
+ assert_equal('ð', @buffer[0])
97
+ assert_equal('i', @buffer[1])
98
+ assert_equal(1, @reader.read(@buffer, 0, 3))
99
+ assert_equal('æ', @buffer[0])
100
+ assert_equal(-1, @reader.read(@buffer, 0, 2))
101
+ end
102
+
103
+ end
@@ -0,0 +1,157 @@
1
+ require 'koara'
2
+ require 'minitest/autorun'
3
+
4
+ class TokenManagerTest < MiniTest::Unit::TestCase
5
+
6
+
7
+ def test_eof
8
+ token = TokenManager.new(CharStream.new(StringReader.new('')))::get_next_token
9
+ assert_equal(TokenManager::EOF, token.kind)
10
+ end
11
+
12
+ def test_asterisk
13
+ token = TokenManager.new(CharStream.new(StringReader.new('*'))).get_next_token
14
+ assert_equal(TokenManager::ASTERISK, token.kind)
15
+ assert_equal('*', token.image)
16
+ end
17
+
18
+ def test_backslash
19
+ token = TokenManager.new(CharStream.new(StringReader.new('\\'))).get_next_token
20
+ assert_equal(TokenManager::BACKSLASH, token.kind)
21
+ assert_equal('\\', token.image)
22
+ end
23
+
24
+ def test_backtick
25
+ token = TokenManager.new(CharStream.new(StringReader.new('`'))).get_next_token
26
+ assert_equal(TokenManager::BACKTICK, token.kind)
27
+ assert_equal('`', token.image)
28
+ end
29
+
30
+ def test_char_sequence_lowercase
31
+ token = TokenManager.new(CharStream.new(StringReader.new('m'))).get_next_token
32
+ assert_equal(TokenManager::CHAR_SEQUENCE, token.kind)
33
+ assert_equal('m', token.image)
34
+ end
35
+
36
+ def test_char_sequence_uppercase
37
+ token = TokenManager.new(CharStream.new(StringReader.new('C'))).get_next_token
38
+ assert_equal(TokenManager::CHAR_SEQUENCE, token.kind)
39
+ assert_equal('C', token.image)
40
+ end
41
+
42
+ def test_colon
43
+ token = TokenManager.new(CharStream.new(StringReader.new(':'))).get_next_token
44
+ assert_equal(TokenManager::COLON, token.kind)
45
+ assert_equal(':', token.image)
46
+ end
47
+
48
+ def test_dash
49
+ token = TokenManager.new(CharStream.new(StringReader.new('-'))).get_next_token
50
+ assert_equal(TokenManager::DASH, token.kind)
51
+ assert_equal('-', token.image)
52
+ end
53
+
54
+ def test_digits
55
+ token = TokenManager.new(CharStream.new(StringReader.new('4'))).get_next_token
56
+ assert_equal(TokenManager::DIGITS, token.kind)
57
+ assert_equal('4', token.image)
58
+ end
59
+
60
+ def test_dot
61
+ token = TokenManager.new(CharStream.new(StringReader.new('.'))).get_next_token
62
+ assert_equal(TokenManager::DOT, token.kind)
63
+ assert_equal('.', token.image)
64
+ end
65
+
66
+ def test_eol
67
+ token = TokenManager.new(CharStream.new(StringReader.new("\n"))).get_next_token
68
+ assert_equal(TokenManager::EOL, token.kind)
69
+ assert_equal("\n", token.image)
70
+ end
71
+
72
+ def test_eq
73
+ token = TokenManager.new(CharStream.new(StringReader.new('='))).get_next_token
74
+ assert_equal(TokenManager::EQ, token.kind)
75
+ assert_equal('=', token.image)
76
+ end
77
+
78
+ def test_escaped_char
79
+ token = TokenManager.new(CharStream.new(StringReader.new("\\*"))).get_next_token
80
+ assert_equal(TokenManager::ESCAPED_CHAR, token.kind)
81
+ assert_equal("\\*", token.image)
82
+ end
83
+
84
+ def test_gt
85
+ token = TokenManager.new(CharStream.new(StringReader.new('>'))).get_next_token
86
+ assert_equal(TokenManager::GT, token.kind)
87
+ assert_equal('>', token.image)
88
+ end
89
+
90
+ def test_image_label
91
+ token = TokenManager.new(CharStream.new(StringReader.new('image:'))).get_next_token
92
+ assert_equal(TokenManager::IMAGE_LABEL, token.kind)
93
+ assert_equal('image:', token.image)
94
+ end
95
+
96
+ def test_lbrack
97
+ token = TokenManager.new(CharStream.new(StringReader.new('['))).get_next_token
98
+ assert_equal(TokenManager::LBRACK, token.kind)
99
+ assert_equal('[', token.image)
100
+ end
101
+
102
+ def test_lparen
103
+ token = TokenManager.new(CharStream.new(StringReader.new('('))).get_next_token
104
+ assert_equal(TokenManager::LPAREN, token.kind)
105
+ assert_equal('(', token.image)
106
+ end
107
+
108
+ def test_lt
109
+ token = TokenManager.new(CharStream.new(StringReader.new('<'))).get_next_token
110
+ assert_equal(TokenManager::LT, token.kind)
111
+ assert_equal('<', token.image)
112
+ end
113
+
114
+ def test_rbrack
115
+ token = TokenManager.new(CharStream.new(StringReader.new(']'))).get_next_token
116
+ assert_equal(TokenManager::RBRACK, token.kind)
117
+ assert_equal(']', token.image)
118
+ end
119
+
120
+ def test_rparen
121
+ token = TokenManager.new(CharStream.new(StringReader.new(')'))).get_next_token
122
+ assert_equal(TokenManager::RPAREN, token.kind)
123
+ assert_equal(')', token.image)
124
+ end
125
+
126
+ def test_space
127
+ token = TokenManager.new(CharStream.new(StringReader.new(' '))).get_next_token
128
+ assert_equal(TokenManager::SPACE, token.kind)
129
+ assert_equal(' ', token.image)
130
+ end
131
+
132
+ def test_tab
133
+ token = TokenManager.new(CharStream.new(StringReader.new("\t"))).get_next_token
134
+ assert_equal(TokenManager::TAB, token.kind)
135
+ assert_equal("\t", token.image)
136
+ end
137
+
138
+ def test_underscore
139
+ token = TokenManager.new(CharStream.new(StringReader.new('_'))).get_next_token
140
+ assert_equal(TokenManager::UNDERSCORE, token.kind)
141
+ assert_equal('_', token.image)
142
+ end
143
+
144
+ def test_space_after_char_sequence
145
+ tm = TokenManager.new(CharStream.new(StringReader.new('a ')))
146
+ assert_equal('a', tm.get_next_token.image)
147
+ assert_equal(' ', tm.get_next_token.image)
148
+ end
149
+
150
+ def test_two_distinct_char_sequences
151
+ tm = TokenManager.new(CharStream.new(StringReader.new('ði ı')))
152
+ assert_equal('ði', tm.get_next_token.image)
153
+ assert_equal(' ', tm.get_next_token.image)
154
+ assert_equal('ı', tm.get_next_token.image)
155
+ end
156
+
157
+ end