koara 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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