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 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: []