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.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.gitmodules +3 -0
- data/.travis.yml +1 -0
- data/Gemfile +3 -0
- data/Rakefile +11 -0
- data/koara.gemspec +18 -0
- data/lib/koara.rb +7 -0
- data/lib/koara/ast/blockelement.rb +40 -0
- data/lib/koara/ast/blockquote.rb +7 -0
- data/lib/koara/ast/code.rb +7 -0
- data/lib/koara/ast/codeblock.rb +9 -0
- data/lib/koara/ast/document.rb +8 -0
- data/lib/koara/ast/em.rb +7 -0
- data/lib/koara/ast/heading.rb +8 -0
- data/lib/koara/ast/image.rb +7 -0
- data/lib/koara/ast/linebreak.rb +7 -0
- data/lib/koara/ast/link.rb +7 -0
- data/lib/koara/ast/listblock.rb +13 -0
- data/lib/koara/ast/listitem.rb +9 -0
- data/lib/koara/ast/node.rb +25 -0
- data/lib/koara/ast/paragraph.rb +7 -0
- data/lib/koara/ast/strong.rb +7 -0
- data/lib/koara/ast/text.rb +7 -0
- data/lib/koara/charstream.rb +123 -0
- data/lib/koara/io/filereader.rb +25 -0
- data/lib/koara/io/stringreader.rb +26 -0
- data/lib/koara/koararenderer.rb +203 -0
- data/lib/koara/lookahead_success.rb +4 -0
- data/lib/koara/parser.rb +2475 -0
- data/lib/koara/token.rb +19 -0
- data/lib/koara/token_manager.rb +349 -0
- data/lib/koara/tree_state.rb +46 -0
- data/test/charstream_test.rb +76 -0
- data/test/compliance_test.rb +43 -0
- data/test/end_to_end_test.rb +1049 -0
- data/test/filereader-unicode.kd +1 -0
- data/test/filereader.kd +1 -0
- data/test/filereader_test.rb +103 -0
- data/test/html5renderer.rb +179 -0
- data/test/stringreader_test.rb +103 -0
- data/test/token_manager_test.rb +157 -0
- metadata +94 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: bba89278b2604ce234d22609f49a0d6814524527
|
|
4
|
+
data.tar.gz: e719bf6bba3af0decbd8f1035ec01dc0fd434bcf
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: d26cbe40a7e74f5345e2c15965a12d2c3ea5206e3ce5027628ad123bb5ff7792a8c33e54c91160762b4dd9fd75b4a16e44cf7ad012b1de2bc404c6e9a6215a2f
|
|
7
|
+
data.tar.gz: 32a13742f23bf5d452411575242d697348d0eff0933a0e9d43bafaa69c1a67a025e64f221a2f66ce7b548cda71485f6f85f1dddcd9bc93a8c17308132dfa3152
|
data/.gitignore
ADDED
data/.gitmodules
ADDED
data/.travis.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
language: ruby
|
data/Gemfile
ADDED
data/Rakefile
ADDED
data/koara.gemspec
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |gem|
|
|
6
|
+
gem.name = "koara"
|
|
7
|
+
gem.version = "0.9.0"
|
|
8
|
+
gem.authors = ["Andy VAn Den Heuvel"]
|
|
9
|
+
gem.email = ["andy.vandenheuvel@gmail.com"]
|
|
10
|
+
gem.description = "Koara parser written in Ruby"
|
|
11
|
+
gem.summary = "Koara parser written in Ruby"
|
|
12
|
+
gem.homepage = "https://github.com/koara/koara-rb"
|
|
13
|
+
gem.license = "Apache 2.0"
|
|
14
|
+
|
|
15
|
+
gem.files = `git ls-files`.split($/)
|
|
16
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
|
17
|
+
gem.require_paths = ["lib"]
|
|
18
|
+
end
|
data/lib/koara.rb
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require_relative 'node'
|
|
2
|
+
|
|
3
|
+
class BlockElement < Node
|
|
4
|
+
|
|
5
|
+
def has_children
|
|
6
|
+
self.children && self.children.length > 0
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def is_first_child
|
|
10
|
+
parent.children[0] == self
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def is_last_child
|
|
14
|
+
parent.children.last == self
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def nested
|
|
18
|
+
!parent.instance_of? Document
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def is_single_child
|
|
22
|
+
parent.children.length == 1
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def next
|
|
26
|
+
i = 0
|
|
27
|
+
while (i < parent.children.length - 1)
|
|
28
|
+
if(parent.children[i] == self)
|
|
29
|
+
return parent.children[i + 1]
|
|
30
|
+
end
|
|
31
|
+
i+=1
|
|
32
|
+
end
|
|
33
|
+
return nil
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def accept(renderer)
|
|
37
|
+
renderer.visit_block_element(self)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
data/lib/koara/ast/em.rb
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require_relative 'node'
|
|
2
|
+
|
|
3
|
+
class Node
|
|
4
|
+
attr_accessor :parent
|
|
5
|
+
attr_accessor :value
|
|
6
|
+
attr_accessor :children
|
|
7
|
+
|
|
8
|
+
def add(n, i)
|
|
9
|
+
if@children.nil?
|
|
10
|
+
@children = Array.new
|
|
11
|
+
end
|
|
12
|
+
@children[i] = n
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def children_accept(renderer)
|
|
16
|
+
if !@children.nil?
|
|
17
|
+
i = 0
|
|
18
|
+
while i < @children.length
|
|
19
|
+
@children[i].accept(renderer)
|
|
20
|
+
i += 1
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
class CharStream
|
|
2
|
+
def initialize(reader)
|
|
3
|
+
@available = 4096
|
|
4
|
+
@buf_size = 4096
|
|
5
|
+
@buf_column = Array.new(4096,0)
|
|
6
|
+
@buf_pos = -1
|
|
7
|
+
@buf_line = Array.new(4096,0)
|
|
8
|
+
@column = 0
|
|
9
|
+
@line = 1
|
|
10
|
+
@prev_char_is_lf = false
|
|
11
|
+
@buffer = Array.new(4096,'')
|
|
12
|
+
@max_next_char_ind = 0
|
|
13
|
+
@reader = reader
|
|
14
|
+
@in_buf = 0
|
|
15
|
+
@tab_size = 4
|
|
16
|
+
@token_begin = 0
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def begin_token
|
|
20
|
+
@token_begin = -1
|
|
21
|
+
c = read_char
|
|
22
|
+
@token_begin = @buf_pos
|
|
23
|
+
c
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def read_char
|
|
27
|
+
if @in_buf > 0
|
|
28
|
+
@in_buf -= 1
|
|
29
|
+
if (@buf_pos += 1) == @buf_size
|
|
30
|
+
@buf_pos = 0
|
|
31
|
+
end
|
|
32
|
+
return @buffer[@buf_pos]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
if (@buf_pos += 1) >= @max_next_char_ind
|
|
36
|
+
fill_buff
|
|
37
|
+
end
|
|
38
|
+
c = @buffer[@buf_pos]
|
|
39
|
+
update_line_column(c)
|
|
40
|
+
c
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def fill_buff
|
|
44
|
+
if @max_next_char_ind == @available
|
|
45
|
+
if @available == @buf_size
|
|
46
|
+
@buf_pos = 0
|
|
47
|
+
@max_next_char_ind = 0
|
|
48
|
+
if @token_begin > 2048
|
|
49
|
+
@available = @token_begin
|
|
50
|
+
end
|
|
51
|
+
else
|
|
52
|
+
@available = @buf_size
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
i = 0
|
|
56
|
+
|
|
57
|
+
begin
|
|
58
|
+
if (i = @reader.read(@buffer, @max_next_char_ind, @available - @max_next_char_ind)) == -1
|
|
59
|
+
raise IOError
|
|
60
|
+
else
|
|
61
|
+
@max_next_char_ind += i
|
|
62
|
+
end
|
|
63
|
+
rescue => e
|
|
64
|
+
@buf_pos -= 1
|
|
65
|
+
backup(0)
|
|
66
|
+
if @token_begin == -1
|
|
67
|
+
@token_begin = @buf_pos
|
|
68
|
+
end
|
|
69
|
+
raise e
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def backup(amount)
|
|
74
|
+
@in_buf += amount
|
|
75
|
+
if (@buf_pos -= amount) < 0
|
|
76
|
+
@buf_pos += @buf_size
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def update_line_column(c)
|
|
81
|
+
@column += 1
|
|
82
|
+
|
|
83
|
+
if @prev_char_is_lf
|
|
84
|
+
@prev_char_is_lf = false
|
|
85
|
+
@column = 1
|
|
86
|
+
@line += @column
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
case c
|
|
90
|
+
when "\n"
|
|
91
|
+
@prev_char_is_lf = true
|
|
92
|
+
when "\t"
|
|
93
|
+
@column -= 1
|
|
94
|
+
@column += (@tab_size - (@column % @tab_size))
|
|
95
|
+
end
|
|
96
|
+
@buf_line[@buf_pos] = @line
|
|
97
|
+
@buf_column[@buf_pos] = @column
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def image
|
|
101
|
+
if @buf_pos >= @token_begin
|
|
102
|
+
return @buffer[@token_begin, @buf_pos - @token_begin + 1].join
|
|
103
|
+
end
|
|
104
|
+
return @buffer[@token_begin, @buf_size - @token_begin].join + @buffer[0, @buf_pos + 1].join
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def end_column
|
|
108
|
+
@buf_column[@buf_pos]
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def end_line
|
|
112
|
+
@buf_line[@buf_pos]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def begin_column
|
|
116
|
+
@buf_column[@token_begin]
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def begin_line
|
|
120
|
+
@buf_line[@token_begin]
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
class FileReader
|
|
2
|
+
def initialize(file_name)
|
|
3
|
+
@text = File.read(file_name)
|
|
4
|
+
@index=0
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def read(buffer, offset, length)
|
|
8
|
+
slice = @text.slice(@index, @text.length)
|
|
9
|
+
|
|
10
|
+
if @text != '' && slice && slice.length > 0
|
|
11
|
+
characters_read = 0
|
|
12
|
+
0.upto(length - 1) do |i|
|
|
13
|
+
c = @text.slice(@index + i)
|
|
14
|
+
if c
|
|
15
|
+
buffer[offset + i] = c
|
|
16
|
+
characters_read += 1
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
@index += length
|
|
20
|
+
return characters_read
|
|
21
|
+
end
|
|
22
|
+
-1
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
class StringReader
|
|
2
|
+
def initialize(text='')
|
|
3
|
+
@text = text
|
|
4
|
+
@index = 0
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def read(buffer, offset, length)
|
|
8
|
+
slice = @text.slice(@index, @text.length)
|
|
9
|
+
|
|
10
|
+
if @text != '' && slice && slice.length > 0
|
|
11
|
+
characters_read = 0
|
|
12
|
+
0.upto(length - 1) do |i|
|
|
13
|
+
c = @text.slice(@index + i)
|
|
14
|
+
if c
|
|
15
|
+
|
|
16
|
+
buffer[offset + i] = c
|
|
17
|
+
characters_read += 1
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
@index += length
|
|
21
|
+
return characters_read
|
|
22
|
+
end
|
|
23
|
+
-1
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|