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 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
@@ -0,0 +1,3 @@
1
+ .classpath
2
+ .idea
3
+ .project
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "testsuite"]
2
+ path = testsuite
3
+ url = https://github.com/koara/testsuite.git
data/.travis.yml ADDED
@@ -0,0 +1 @@
1
+ language: ruby
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ task :default => 'test:unit'
2
+
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new('test:unit') do |t|
6
+ t.libs << 'lib'
7
+ t.libs << 'test'
8
+ t.pattern = 'test/*.rb'
9
+ t.verbose = true
10
+ t.warning = false
11
+ end
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,7 @@
1
+ require 'koara/charstream'
2
+ require 'koara/koararenderer'
3
+ require 'koara/parser'
4
+ require 'koara/ast/document'
5
+ require 'koara/io/stringreader'
6
+ require 'koara/io/filereader'
7
+ require 'koara/token_manager'
@@ -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
@@ -0,0 +1,7 @@
1
+ require_relative 'blockelement'
2
+
3
+ class BlockQuote < BlockElement
4
+ def accept(renderer)
5
+ renderer.visit_blockquote(self)
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'node'
2
+
3
+ class Code < Node
4
+ def accept(renderer)
5
+ renderer.visit_code(self)
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'blockelement'
2
+
3
+ class CodeBlock < BlockElement
4
+ attr_accessor :language
5
+
6
+ def accept(renderer)
7
+ renderer.visit_codeblock(self)
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ require_relative 'node'
2
+
3
+ class Document < Node
4
+ def accept(renderer)
5
+ renderer.visit_document(self)
6
+ end
7
+
8
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'node'
2
+
3
+ class Em < Node
4
+ def accept(renderer)
5
+ renderer.visit_em(self)
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ require_relative 'heading'
2
+
3
+ class Heading < BlockElement
4
+ def accept(renderer)
5
+ renderer.visit_heading(self)
6
+ end
7
+
8
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'node'
2
+
3
+ class Image < Node
4
+ def accept(renderer)
5
+ renderer.visit_image(self)
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'linebreak'
2
+
3
+ class LineBreak < Node
4
+ def accept(renderer)
5
+ renderer.visit_linebreak(self)
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'node'
2
+
3
+ class Link < Node
4
+ def accept(renderer)
5
+ renderer.visit_link(self)
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'blockelement'
2
+
3
+ class ListBlock < BlockElement
4
+ attr_accessor :ordered
5
+
6
+ def initialize(ordered)
7
+ @ordered = ordered
8
+ end
9
+
10
+ def accept(renderer)
11
+ renderer.visit_list_block(self)
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'blockelement'
2
+
3
+ class ListItem < BlockElement
4
+ attr_accessor :number
5
+
6
+ def accept(renderer)
7
+ renderer.visit_list_item(self)
8
+ end
9
+ end
@@ -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,7 @@
1
+ require_relative 'blockelement'
2
+
3
+ class Paragraph < BlockElement
4
+ def accept(renderer)
5
+ renderer.visit_paragraph(self)
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'node'
2
+
3
+ class Strong < Node
4
+ def accept(renderer)
5
+ renderer.visit_strong(self)
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'node'
2
+
3
+ class Text < Node
4
+ def accept(renderer)
5
+ renderer.visit_text(self)
6
+ end
7
+ 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