udon 0.0.1 → 0.0.2
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.
- data/Gemfile +1 -1
- data/VERSION +1 -1
- data/lib/VERSION +1 -1
- data/lib/udon/udon_parser.rb +66 -46
- data/machines/udon.machine +33 -38
- data/test/test_udon.rb +22 -11
- data/udon.gemspec +5 -5
- metadata +14 -14
data/Gemfile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/lib/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/lib/udon/udon_parser.rb
CHANGED
@@ -1,22 +1,46 @@
|
|
1
1
|
require 'strscan'
|
2
2
|
$KCODE="U"
|
3
3
|
|
4
|
+
class Integer
|
5
|
+
def into(v); v << self end
|
6
|
+
def reset!; :nop end
|
7
|
+
def reset; :nop end
|
8
|
+
end
|
9
|
+
|
4
10
|
module UdonParser
|
5
11
|
def self.parse(str) Parser.new(str).parse end
|
6
12
|
def self.parse_file(fname) Parser.new(IO.read(fname)).parse end
|
7
13
|
|
14
|
+
|
15
|
+
class UArray < Array
|
16
|
+
def into(v)
|
17
|
+
return if size == 0
|
18
|
+
v << self
|
19
|
+
end
|
20
|
+
def reset!; self.clear end
|
21
|
+
def reset; d=dup;d.reset!;d end
|
22
|
+
end
|
23
|
+
|
8
24
|
class UHash < Hash
|
25
|
+
def into(v) v << self end
|
9
26
|
def <<(kv) k,v = kv; self[k] = v end
|
27
|
+
def reset!; self.clear end
|
28
|
+
def reset; d=dup; d.reset!; d end
|
10
29
|
end
|
11
30
|
|
12
31
|
class UString < String
|
32
|
+
def into(v)
|
33
|
+
return if size == 0
|
34
|
+
v << self.dup
|
35
|
+
reset!
|
36
|
+
end
|
37
|
+
|
13
38
|
def <<(v)
|
14
|
-
begin
|
15
|
-
|
16
|
-
rescue
|
17
|
-
super(v)
|
18
|
-
end
|
39
|
+
begin; super([v].pack('U*'))
|
40
|
+
rescue; super(v) end
|
19
41
|
end
|
42
|
+
def reset!; self.gsub! /./um,'' end
|
43
|
+
def reset; d=dup;d.reset!;d end
|
20
44
|
end
|
21
45
|
|
22
46
|
class UNode
|
@@ -29,6 +53,7 @@ module UdonParser
|
|
29
53
|
@c= params.delete(:c) || []
|
30
54
|
@name = params.delete(:name)
|
31
55
|
end
|
56
|
+
def into(val) val << self end
|
32
57
|
def <<(val) @c<<val end
|
33
58
|
def [](key) @c[key] end
|
34
59
|
end
|
@@ -97,15 +122,15 @@ module UdonParser
|
|
97
122
|
@leading = true; @indent = 0
|
98
123
|
when 0x0a
|
99
124
|
nc = peek(4).unpack('U')[0]
|
100
|
-
if nc == 0x0d then getch; c = "\n\r" end
|
125
|
+
if nc == 0x0d then getch; c = UString.new("\n\r") end
|
101
126
|
@last_is_newline = true; @line += 1; @pos = 1
|
102
127
|
@leading = true; @indent = 0
|
103
128
|
when 0x0d
|
104
129
|
nc = peek(4).unpack('U')[0]
|
105
|
-
if nc == 0x0a then getch; c = "\r\n" end
|
130
|
+
if nc == 0x0a then getch; c = UString.new("\r\n") end
|
106
131
|
@last_is_newline = true; @line += 1; @pos = 1
|
107
132
|
@leading = true; @indent = 0
|
108
|
-
when 0x20
|
133
|
+
when 0x20,0x09
|
109
134
|
@indent += 1 if @leading
|
110
135
|
@last_is_space = true; @pos += 1
|
111
136
|
else @leading = false; @pos += 1 end
|
@@ -131,71 +156,66 @@ module UdonParser
|
|
131
156
|
def eof?() return @last_c == :eof end
|
132
157
|
|
133
158
|
def document(p=nil,name='document')
|
134
|
-
|
135
|
-
s =
|
159
|
+
__state=':data_or_child'
|
160
|
+
s = UArray.new
|
136
161
|
a ||= UString.new
|
137
162
|
b ||= UString.new
|
138
|
-
trash ||= UString.new
|
139
163
|
loop do
|
140
|
-
|
141
|
-
|
142
|
-
case
|
164
|
+
__i = nextchar
|
165
|
+
__state = '{eof}' if __i==:eof
|
166
|
+
case __state
|
143
167
|
when ':data_or_child'
|
144
168
|
case
|
145
|
-
when nl?; @fwd=true; (a
|
146
|
-
when space?; b
|
147
|
-
when
|
148
|
-
else @fwd=true; (a
|
169
|
+
when nl?; @fwd=true; b.into(a); __state=':data'; next
|
170
|
+
when __i==9,space?; __i.into(b); next
|
171
|
+
when __i==35,__i==124; @fwd=true; b.reset!; __state=':child'; next
|
172
|
+
else @fwd=true; b.into(a); __state=':data'; next
|
149
173
|
end
|
150
174
|
when ':child'
|
151
|
-
if
|
152
|
-
|
175
|
+
if __i==35
|
176
|
+
a.into(s); __state=comment(':data_or_child',s); next
|
153
177
|
end
|
154
178
|
when '{eof}'
|
155
|
-
@fwd=true; (a
|
179
|
+
@fwd=true; b.into(a); a.into(s); return(s)
|
156
180
|
when ':data'
|
157
181
|
case
|
158
|
-
when nl?;
|
159
|
-
else a
|
182
|
+
when nl?; __i.into(a); a.into(s); __state=':data_or_child'; next
|
183
|
+
else __i.into(a); next
|
160
184
|
end
|
161
185
|
end
|
162
186
|
end
|
163
187
|
end
|
164
188
|
|
165
189
|
def comment(ns,p=nil,name='comment')
|
190
|
+
ibase=@indent+1
|
166
191
|
ipar=@indent
|
167
|
-
|
168
|
-
state=':1st:ws'
|
192
|
+
__state=':first:ws'
|
169
193
|
s = UNode.new(:name=>name,:sline=>@line,:schr=>@pos)
|
170
194
|
a ||= UString.new
|
171
195
|
loop do
|
172
|
-
|
173
|
-
|
174
|
-
case
|
175
|
-
when ':
|
196
|
+
__i = nextchar
|
197
|
+
__state = '{eof}' if __i==:eof
|
198
|
+
case __state
|
199
|
+
when ':first:ws'
|
176
200
|
case
|
177
|
-
when
|
178
|
-
when nl
|
179
|
-
|
180
|
-
else a<<c; ibase = @indent; state=':child'; next
|
201
|
+
when __i==9,space?; ibase += 1; next
|
202
|
+
when nl?; __state=':nl'; next
|
203
|
+
else __i.into(a); __state=':data'; next
|
181
204
|
end
|
182
|
-
when ':
|
183
|
-
case
|
184
|
-
when nl?; (s<<a if a.size>0); a=UString.new; state=':nl'; next
|
185
|
-
else a<<c; next
|
186
|
-
end
|
187
|
-
when ':1st'
|
205
|
+
when ':nl'
|
188
206
|
case
|
189
|
-
when
|
190
|
-
|
207
|
+
when (@indent>ibase); @fwd=true; __state=':data'; next
|
208
|
+
when __i==9,space?; next
|
209
|
+
when nl?; __i.into(a); a.into(s); next
|
210
|
+
when (@indent<=ipar); @fwd=true; s.into(p); return(ns)
|
211
|
+
else __i.into(a); ibase=@indent; __state=':data'; next
|
191
212
|
end
|
192
213
|
when '{eof}'
|
193
|
-
@fwd=true; (s
|
194
|
-
when ':
|
214
|
+
@fwd=true; a.into(s); s.into(p); return(ns)
|
215
|
+
when ':data'
|
195
216
|
case
|
196
|
-
when
|
197
|
-
|
198
|
-
else a<<c; state=':1st'; next
|
217
|
+
when nl?; a.into(s); __state=':nl'; next
|
218
|
+
else __i.into(a); next
|
199
219
|
end
|
200
220
|
end
|
201
221
|
end
|
data/machines/udon.machine
CHANGED
@@ -1,42 +1,37 @@
|
|
1
1
|
Main entrypoint - a complete udon document
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
| :data_or_child | [\n]
|
6
|
-
| :data_or_child | [ ]
|
7
|
-
| :data_or_child | [#|]
|
8
|
-
| :data_or_child | .
|
9
|
-
|
10
|
-
| :data | [\n]
|
11
|
-
| :data | .
|
12
|
-
|
13
|
-
|
|
2
|
+
+-----------------+-----------------+-----+----------------+-------------------------+
|
3
|
+
| document()::[] | | | | :data_or_child |
|
4
|
+
+-----------------+-----------------+-----+-----------------+------------------------+
|
5
|
+
| :data_or_child | [\n] | | b>>a | :data |
|
6
|
+
| :data_or_child | [ \t] | >>b | | :data_or_child |
|
7
|
+
| :data_or_child | [#|] | | b>> | :child |
|
8
|
+
| :data_or_child | . | | b>>a | :data |
|
9
|
+
+-----------------+-----------------+-----+----------------+-------------------------+
|
10
|
+
| :data | [\n] | >>a | a>>s | :data_or_child |
|
11
|
+
| :data | . | >>a | | :data |
|
12
|
+
+-----------------+-----------------+-----+----------------+-------------------------+
|
13
|
+
| :child | [#] | >> | a>>s | comment(:data_or_child) |
|
14
|
+
| {eof} | | | b>>a; a>>s | <done> |
|
15
|
+
+-----------------+-----------------+-----+----------------+-------------------------+
|
14
16
|
# TODO: lots more children
|
15
17
|
|
16
|
-
For error recovery (go to the next line)
|
17
|
-
#+-----------------+----------+-----+----------------+--------------+
|
18
|
-
#| to_nextline(ns) | | | | :scan |
|
19
|
-
#| :scan | {eof?} | | | <ns> |
|
20
|
-
#| :scan | [\n] | | | <ns> |
|
21
|
-
#| :scan | . | << | | :scan |
|
22
|
-
#+-----------------+----------+-----+----------------+--------------+
|
23
|
-
|
24
18
|
Block comments
|
25
|
-
|
26
|
-
| comment(ns)::U | | |
|
27
|
-
: : : :
|
28
|
-
|
29
|
-
| :
|
30
|
-
| :
|
31
|
-
| :
|
32
|
-
|
33
|
-
| :
|
34
|
-
| :
|
35
|
-
|
36
|
-
| :nl |
|
37
|
-
| :
|
38
|
-
| :
|
39
|
-
| {
|
40
|
-
|
41
|
-
|
42
|
-
|
19
|
+
+-----------------+-----------------+-----+-----------------+------------------------+
|
20
|
+
| comment(ns)::U | | | ibase=$indent+1 | :first:ws |
|
21
|
+
: : : : ipar=$indent : :
|
22
|
+
+-----------------+-----------------+-----+-----------------+------------------------+
|
23
|
+
| :first:ws | [ \t] | >> | ibase += 1 | :first:ws |
|
24
|
+
| :first:ws | [\n] | >> | | :nl |
|
25
|
+
| :first:ws | . | >>a | | :data |
|
26
|
+
+-----------------+-----------------+-----+----------------+-------------------------+
|
27
|
+
| :data | [\n] | >> | a>>s | :nl |
|
28
|
+
| :data | . | >>a | | :data |
|
29
|
+
+-----------------+-----------------+-----+----------------+-------------------------+
|
30
|
+
| :nl | {$indent>ibase} | | | :data |
|
31
|
+
| :nl | [ \t] | >> | | :nl |
|
32
|
+
| :nl | [\n] | >>a | a>>s | :nl |
|
33
|
+
| :nl | {$indent<=ipar} | | s>>p | <ns> |
|
34
|
+
| :nl | . | >>a | ibase=$indent | :data |
|
35
|
+
+-----------------+-----------------+-----+----------------+-------------------------+
|
36
|
+
| {eof} | | | a>>s; s>>p | <ns> |
|
37
|
+
+-----------------+-----------------+-----+-----------------+------------------------+
|
data/test/test_udon.rb
CHANGED
@@ -4,9 +4,9 @@ $KCODE='U'
|
|
4
4
|
class TestUdon < MiniTest::Unit::TestCase
|
5
5
|
def test_blank_documents
|
6
6
|
assert_equal(''.udon,[])
|
7
|
-
(0..
|
7
|
+
(0..3).each do
|
8
8
|
s = randstr(200," \t\n\r")
|
9
|
-
assert_equal(s.udon.join('')
|
9
|
+
assert_equal(s,s.udon.join(''))
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
@@ -19,17 +19,28 @@ class TestUdon < MiniTest::Unit::TestCase
|
|
19
19
|
[0.075, (32..126)],
|
20
20
|
[0.05, (0..255)],
|
21
21
|
[0.025, (0..0xffff)]]
|
22
|
-
(0..
|
23
|
-
s = randstr(
|
24
|
-
s.gsub! /^\s*(<\||#|\|)/u, ''
|
25
|
-
assert_equal(s.udon.join('')
|
22
|
+
(0..3).each do
|
23
|
+
s = randstr(100,chars)
|
24
|
+
s.gsub! /^\s*(<\||#|\|)/u, '' # Remove stuff that triggers udon mode
|
25
|
+
assert_equal(s,s.udon.join(''))
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
29
|
+
def test_block_comment_indent_level
|
30
|
+
leading = randstr(200," \t\n\r") + "\n"
|
31
|
+
comment = <<-COMMENT
|
32
|
+
# line 1
|
33
|
+
line 2
|
34
|
+
line 3
|
35
|
+
line 4
|
36
|
+
COMMENT
|
37
|
+
following = randstr(200," \t\n\r")
|
38
|
+
s = (leading + comment + following)
|
39
|
+
r = s.udon
|
40
|
+
assert_instance_of(UdonParser::UNode, r.last)
|
41
|
+
assert_equal('line 1', r.last.c[0])
|
42
|
+
assert_equal('line 2', r.last.c[1])
|
43
|
+
assert_equal('line 3', r.last.c[2])
|
44
|
+
assert_equal('line 4', r.last.c[3])
|
34
45
|
end
|
35
46
|
end
|
data/udon.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{udon}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Joseph Wecker"]
|
12
|
-
s.date = %q{2011-08-
|
12
|
+
s.date = %q{2011-08-19}
|
13
13
|
s.description = %q{Parse and generate udon, inspired by zml, haml, json, and more.}
|
14
14
|
s.email = %q{joseph.wecker@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -47,7 +47,7 @@ Gem::Specification.new do |s|
|
|
47
47
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
48
48
|
s.add_development_dependency(%q<reek>, ["~> 1.2.8"])
|
49
49
|
s.add_development_dependency(%q<roodi>, ["~> 2.1.0"])
|
50
|
-
s.add_development_dependency(%q<genmachine>, ["~> 0.1
|
50
|
+
s.add_development_dependency(%q<genmachine>, ["~> 0.2.1"])
|
51
51
|
else
|
52
52
|
s.add_dependency(%q<minitest>, [">= 0"])
|
53
53
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
@@ -55,7 +55,7 @@ Gem::Specification.new do |s|
|
|
55
55
|
s.add_dependency(%q<rcov>, [">= 0"])
|
56
56
|
s.add_dependency(%q<reek>, ["~> 1.2.8"])
|
57
57
|
s.add_dependency(%q<roodi>, ["~> 2.1.0"])
|
58
|
-
s.add_dependency(%q<genmachine>, ["~> 0.1
|
58
|
+
s.add_dependency(%q<genmachine>, ["~> 0.2.1"])
|
59
59
|
end
|
60
60
|
else
|
61
61
|
s.add_dependency(%q<minitest>, [">= 0"])
|
@@ -64,7 +64,7 @@ Gem::Specification.new do |s|
|
|
64
64
|
s.add_dependency(%q<rcov>, [">= 0"])
|
65
65
|
s.add_dependency(%q<reek>, ["~> 1.2.8"])
|
66
66
|
s.add_dependency(%q<roodi>, ["~> 2.1.0"])
|
67
|
-
s.add_dependency(%q<genmachine>, ["~> 0.1
|
67
|
+
s.add_dependency(%q<genmachine>, ["~> 0.2.1"])
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: udon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Joseph Wecker
|
@@ -15,11 +15,10 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-08-
|
18
|
+
date: 2011-08-19 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
type: :development
|
23
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
23
|
none: false
|
25
24
|
requirements:
|
@@ -32,8 +31,8 @@ dependencies:
|
|
32
31
|
name: minitest
|
33
32
|
version_requirements: *id001
|
34
33
|
prerelease: false
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
34
|
type: :development
|
35
|
+
- !ruby/object:Gem::Dependency
|
37
36
|
requirement: &id002 !ruby/object:Gem::Requirement
|
38
37
|
none: false
|
39
38
|
requirements:
|
@@ -48,8 +47,8 @@ dependencies:
|
|
48
47
|
name: bundler
|
49
48
|
version_requirements: *id002
|
50
49
|
prerelease: false
|
51
|
-
- !ruby/object:Gem::Dependency
|
52
50
|
type: :development
|
51
|
+
- !ruby/object:Gem::Dependency
|
53
52
|
requirement: &id003 !ruby/object:Gem::Requirement
|
54
53
|
none: false
|
55
54
|
requirements:
|
@@ -64,8 +63,8 @@ dependencies:
|
|
64
63
|
name: jeweler
|
65
64
|
version_requirements: *id003
|
66
65
|
prerelease: false
|
67
|
-
- !ruby/object:Gem::Dependency
|
68
66
|
type: :development
|
67
|
+
- !ruby/object:Gem::Dependency
|
69
68
|
requirement: &id004 !ruby/object:Gem::Requirement
|
70
69
|
none: false
|
71
70
|
requirements:
|
@@ -78,8 +77,8 @@ dependencies:
|
|
78
77
|
name: rcov
|
79
78
|
version_requirements: *id004
|
80
79
|
prerelease: false
|
81
|
-
- !ruby/object:Gem::Dependency
|
82
80
|
type: :development
|
81
|
+
- !ruby/object:Gem::Dependency
|
83
82
|
requirement: &id005 !ruby/object:Gem::Requirement
|
84
83
|
none: false
|
85
84
|
requirements:
|
@@ -94,8 +93,8 @@ dependencies:
|
|
94
93
|
name: reek
|
95
94
|
version_requirements: *id005
|
96
95
|
prerelease: false
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
96
|
type: :development
|
97
|
+
- !ruby/object:Gem::Dependency
|
99
98
|
requirement: &id006 !ruby/object:Gem::Requirement
|
100
99
|
none: false
|
101
100
|
requirements:
|
@@ -110,22 +109,23 @@ dependencies:
|
|
110
109
|
name: roodi
|
111
110
|
version_requirements: *id006
|
112
111
|
prerelease: false
|
113
|
-
- !ruby/object:Gem::Dependency
|
114
112
|
type: :development
|
113
|
+
- !ruby/object:Gem::Dependency
|
115
114
|
requirement: &id007 !ruby/object:Gem::Requirement
|
116
115
|
none: false
|
117
116
|
requirements:
|
118
117
|
- - ~>
|
119
118
|
- !ruby/object:Gem::Version
|
120
|
-
hash:
|
119
|
+
hash: 21
|
121
120
|
segments:
|
122
121
|
- 0
|
122
|
+
- 2
|
123
123
|
- 1
|
124
|
-
|
125
|
-
version: 0.1.6
|
124
|
+
version: 0.2.1
|
126
125
|
name: genmachine
|
127
126
|
version_requirements: *id007
|
128
127
|
prerelease: false
|
128
|
+
type: :development
|
129
129
|
description: Parse and generate udon, inspired by zml, haml, json, and more.
|
130
130
|
email: joseph.wecker@gmail.com
|
131
131
|
executables: []
|