linguify 0.5.2 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -168,6 +168,33 @@ end
168
168
  # "
169
169
  ```
170
170
 
171
+ There is also the inline keyword:
172
+
173
+ ``` ruby
174
+ require 'linguify'
175
+
176
+ reduce /inlined code/ => 'code' do
177
+ something.each do |foobar| # life is not worth living without psedo foobars
178
+ pp foobar
179
+ end
180
+ end
181
+
182
+ reduce /execute ({code:[^}]*})/ do |code|
183
+ pp "hey mum"
184
+ inline code
185
+ code
186
+ pp "you will never know what I just did"
187
+ end
188
+
189
+ "execute inlined code".linguify.to_ruby
190
+ # => "code = lambda do
191
+ # (pp(\"hey mum\")
192
+ # (something.each { |foobar| pp(foobar) })
193
+ # pp(\"you will never know what I just did\"))
194
+ # end
195
+ # "
196
+ ```
197
+
171
198
  ## License
172
199
 
173
200
  (The MIT License)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.2
1
+ 0.6.0
@@ -42,6 +42,7 @@ module Linguify
42
42
  #
43
43
  @sentence = str.dup
44
44
  @bind = bind
45
+ @stack = [ str ]
45
46
  loop do
46
47
  rule = find_rule(str)
47
48
 
@@ -52,6 +53,8 @@ module Linguify
52
53
  :args => rule[:match].match(str).to_a
53
54
 
54
55
  str = Linguified.reduce_string(str,rule[:match],reduction.to_rexp)
56
+ @stack << str
57
+
55
58
  break if /^{:[0-9]*}$/ =~ str
56
59
  end
57
60
 
@@ -63,6 +66,8 @@ module Linguify
63
66
 
64
67
  code = Reduction::parse(str).compile
65
68
 
69
+ Sexp.inline_keyword_inlined!(code)
70
+
66
71
  #if @dispatch_exceptions
67
72
  # @sexy = Sexp.debug_envelope(code)
68
73
  #else
@@ -142,13 +147,20 @@ module Linguify
142
147
  def self.has_needle_on_word_boundary? splitted
143
148
  return true if splitted.size == 1 and splitted.first == :needle
144
149
 
150
+ prev_ends_with_space = true
151
+ following_needle = true
152
+
145
153
  splitted.each_with_index do |split,i|
146
154
  if split.kind_of? String
147
- word_bound = i == 0 ? split[-1] == ' ' : split[0] == ' ' || split[-1] == ' '
148
- return true if word_bound
155
+ return true if following_needle and prev_ends_with_space and split[0] == ' '
156
+
157
+ prev_ends_with_space = (split[-1] == ' ')
158
+ following_needle = false
159
+ else # :needle
160
+ following_needle = true
149
161
  end
150
162
  end
151
- false
163
+ following_needle && prev_ends_with_space
152
164
  end
153
165
 
154
166
  # Find a reduction rule for the string
@@ -166,7 +178,10 @@ module Linguify
166
178
  false
167
179
  end
168
180
  end
169
- raise "no step definition for #{str}" if found.size == 0
181
+ if found.size == 0
182
+ pp @stack
183
+ raise "no step definition for #{str}"
184
+ end
170
185
  found[0]
171
186
  end
172
187
 
@@ -145,6 +145,54 @@ class Sexp < Array
145
145
  # Sexp.new(:call, Sexp.new(:const, :Linguify), :exception, Sexp.new(:arglist, Sexp.new(:lvar, :e))))))))
146
146
  #end
147
147
 
148
+ def find needle
149
+ res = []
150
+ res << self if sexp_type == needle
151
+ case sexp_type
152
+ when :lasgn
153
+ self[1] == needle
154
+ when :lvar
155
+ self[1] == needle
156
+ when :call
157
+ self[2] == needle
158
+ when :lvar
159
+ self[1] == needle
160
+ else
161
+ self[1..-1].each do |h|
162
+ if h && h.kind_of?(Sexp)
163
+ res += h.find(needle)
164
+ end
165
+ end
166
+ end
167
+ res
168
+ end
169
+
170
+ def self.inline_keyword_inlined! code
171
+ inlines = Sexp.from_array(code).find(:call).select{ |call| call[1] == nil && call[2] == :inline }
172
+ inlines.each do |inline|
173
+ raise "Im lost, dont know what this is (yet)" unless inline[3].sexp_type == :arglist
174
+ raise "Im lost, dont know what this is (yet)" unless inline[3].size == 2
175
+ raise "Im lost, dont know what this is (yet)" unless inline[3][1].sexp_type == :lvar
176
+ var = inline[3][1][1]
177
+
178
+ assignments = []
179
+ code.each_with_index do |expression,n|
180
+ if expression.sexp_type == :lasgn and expression[1] == var
181
+ assignments << n
182
+ end
183
+ end
184
+ raise "this should never happen (yes, really!)" unless assignments.size == 1
185
+
186
+ code_block = code[assignments.first]
187
+ code.delete_at(assignments.first)
188
+
189
+ # now inject code
190
+ inline.clear
191
+ inline[0] = code_block[0]
192
+ inline[1] = code_block[1]
193
+ inline[2] = code_block[2]
194
+ end
195
+ end
148
196
 
149
197
  end
150
198
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "linguify"
8
- s.version = "0.5.2"
8
+ s.version = "0.6.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Patrick Hanevold"]
12
- s.date = "2012-01-15"
12
+ s.date = "2012-01-29"
13
13
  s.description = "Linguify is a linguistic compiler allowing you to compile and execute plain english."
14
14
  s.email = "patrick.hanevold@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -35,7 +35,7 @@ Gem::Specification.new do |s|
35
35
  s.homepage = "http://github.com/patrickhno/linguify"
36
36
  s.licenses = ["MIT"]
37
37
  s.require_paths = ["lib"]
38
- s.rubygems_version = "1.8.11"
38
+ s.rubygems_version = "1.8.15"
39
39
  s.summary = "Linguify, the linguistic compiler."
40
40
 
41
41
  if s.respond_to? :specification_version then
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: linguify
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.5.2
5
+ version: 0.6.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Patrick Hanevold
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-01-15 00:00:00 Z
13
+ date: 2012-01-29 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: sourcify
@@ -115,7 +115,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
115
  requirements:
116
116
  - - ">="
117
117
  - !ruby/object:Gem::Version
118
- hash: 914071381584343177
118
+ hash: 4095864458397770704
119
119
  segments:
120
120
  - 0
121
121
  version: "0"
@@ -128,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
128
  requirements: []
129
129
 
130
130
  rubyforge_project:
131
- rubygems_version: 1.8.11
131
+ rubygems_version: 1.8.15
132
132
  signing_key:
133
133
  specification_version: 3
134
134
  summary: Linguify, the linguistic compiler.