udon 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -12,5 +12,5 @@ group :development do
12
12
  gem "rcov", ">= 0"
13
13
  gem "reek", "~> 1.2.8"
14
14
  gem "roodi", "~> 2.1.0"
15
- gem "genmachine", "~> 0.1.6"
15
+ gem "genmachine", "~> 0.2.1"
16
16
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
data/lib/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -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
- super([v].pack('U*'))
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
- state=':data_or_child'
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
- c = nextchar
141
- state = '{eof}' if c==:eof
142
- case state
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<<b if b.size>0); b=UString.new; state=':data'; next
146
- when space?; b<<c; next
147
- when c==35,c==124; @fwd=true; (trash<<b if b.size>0); b=UString.new; state=':child'; next
148
- else @fwd=true; (a<<b if b.size>0); b=UString.new; state=':data'; next
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 c==35
152
- @fwd=true; (s<<a if a.size>0); a=UString.new; state=comment(':data_or_child',s); next
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<<b if b.size>0); b=UString.new; (s<<a if a.size>0); a=UString.new; return(s)
179
+ @fwd=true; b.into(a); a.into(s); return(s)
156
180
  when ':data'
157
181
  case
158
- when nl?; a<<c; (s<<a if a.size>0); a=UString.new; state=':data_or_child'; next
159
- else a<<c; next
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
- ibase=ipar+100
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
- c = nextchar
173
- state = '{eof}' if c==:eof
174
- case state
175
- when ':nl'
196
+ __i = nextchar
197
+ __state = '{eof}' if __i==:eof
198
+ case __state
199
+ when ':first:ws'
176
200
  case
177
- when (@indent>ibase); @fwd=true; state=':child'; next
178
- when nl?,(c>8&&c<11),space?; next
179
- when (@indent<=ipar); @fwd=true; p<<s; return(ns)
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 ':child'
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 nl?; (s<<a if a.size>0); a=UString.new; state=':nl'; next
190
- else a<<c; next
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<<a if a.size>0); a=UString.new; p<<s; return(ns)
194
- when ':1st:ws'
214
+ @fwd=true; a.into(s); s.into(p); return(ns)
215
+ when ':data'
195
216
  case
196
- when c==9,space?; next
197
- when nl?; state=':nl'; next
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
@@ -1,42 +1,37 @@
1
1
  Main entrypoint - a complete udon document
2
-
3
- +-----------------+----------+-----+----------------+-------------------------+
4
- | document()::[] | | | | :data_or_child |
5
- | :data_or_child | [\n] | | a<<<b | :data |
6
- | :data_or_child | [ ] | b<< | | :data_or_child |
7
- | :data_or_child | [#|] | | trash<<<b | :child |
8
- | :data_or_child | . | | a<<<b | :data |
9
-
10
- | :data | [\n] | a<< | s<<<a | :data_or_child |
11
- | :data | . | a<< | | :data |
12
- | :child | [#] | | s<<<a | comment(:data_or_child) |
13
- | {eof} | | | a<<<b; s<<<a | <done> |
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 | | | ipar=$indent | :1st:ws |
27
- : : : : ibase=ipar+100 : :
28
- | :1st:ws | [ \t] | << | | :1st:ws |
29
- | :1st:ws | [\n] | << | | :nl |
30
- | :1st:ws | . | a<< | | :1st |
31
- | :1st | [\n] | << | s<<<a | :nl |
32
- | :1st | . | a<< | | :1st |
33
- | :nl | {$indent>ibase} | | | :child |
34
- | :nl | [ \t\n] | << | | :nl |
35
- | :nl | {$indent<=ipar} | | p<<s | <ns> |
36
- | :nl | . | a<< | ibase = $indent | :child |
37
- | :child | [\n] | << | s<<<a | :nl |
38
- | :child | . | a<< | | :child |
39
- | {eof} | | | s<<<a; p<<s | <ns> |
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..5).each do
7
+ (0..3).each do
8
8
  s = randstr(200," \t\n\r")
9
- assert_equal(s.udon.join(''),s)
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..5).each do
23
- s = randstr(500,chars)
24
- s.gsub! /^\s*(<\||#|\|)/u, ''
25
- assert_equal(s.udon.join(''),s)
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 test_block_comments
30
- #leading = randstr(200," \t\n\r")
31
- #comment = "# hello\na"
32
- #following = randstr(200," \t\n\r")
33
- #(leading + comment + following).udon_pp
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.1"
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-18}
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.6"])
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.6"])
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.6"])
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: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
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 00:00:00 -07:00
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: 23
119
+ hash: 21
121
120
  segments:
122
121
  - 0
122
+ - 2
123
123
  - 1
124
- - 6
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: []