wlang 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +8 -0
- data/lib/wlang.rb +1 -1
- data/lib/wlang/dialect.rb +18 -2
- data/lib/wlang/dialect_dsl.rb +5 -0
- data/lib/wlang/dialect_loader.rb +5 -0
- data/lib/wlang/dialects/coderay_dialect.rb +14 -5
- data/lib/wlang/parser.rb +1 -2
- data/lib/wlang/template.rb +13 -6
- data/test/blackbox/postblock/hello.exp +1 -0
- data/test/blackbox/postblock/hello.pre +1 -0
- data/test/blackbox/postblock/hello.tpl +1 -0
- data/test/blackbox/postblock/hello_input_inclusion.exp +1 -0
- data/test/blackbox/postblock/hello_input_inclusion.tpl +1 -0
- data/test/blackbox/poststring/hello.exp +1 -0
- data/test/blackbox/poststring/hello.tpl +1 -0
- data/test/blackbox/test_all.rb +9 -0
- data/test/spec/coderay_dialect.spec +8 -0
- data/test/spec/dialect/apply_post_transform.spec +16 -0
- data/test/unit/test_all.rb +2 -1
- data/test/unit/wlang/anagram_bugs_test.rb +111 -111
- metadata +13 -4
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
== Changelog
|
2
2
|
|
3
|
+
=== Version 0.9.2
|
4
|
+
|
5
|
+
==== New features (by order of importance)
|
6
|
+
|
7
|
+
- Implements main transformer on dialects
|
8
|
+
- Makes coderay encoders available without options using a bit of meta programming
|
9
|
+
- System-local absolute paths (i.e. starting with '/') are recognized by buffer rulesets
|
10
|
+
|
3
11
|
=== Version 0.9.1
|
4
12
|
|
5
13
|
==== Bug fixes
|
data/lib/wlang.rb
CHANGED
data/lib/wlang/dialect.rb
CHANGED
@@ -51,6 +51,9 @@ module WLang
|
|
51
51
|
# Sub dialects by name
|
52
52
|
attr_reader :dialects
|
53
53
|
|
54
|
+
# Post transformer
|
55
|
+
attr_accessor :post_transformer
|
56
|
+
|
54
57
|
#
|
55
58
|
# Creates a dialect instance. _builder_ block is a chunk of code of the DSL
|
56
59
|
# that will be executed twice: once at construction time to create sub dialects
|
@@ -123,7 +126,7 @@ module WLang
|
|
123
126
|
@ruleset = RuleSet.new if @ruleset.nil?
|
124
127
|
@ruleset.add_rules(mod, pairs)
|
125
128
|
end
|
126
|
-
|
129
|
+
|
127
130
|
### Query API ################################################################
|
128
131
|
|
129
132
|
# Returns qualified name of this dialect
|
@@ -167,6 +170,18 @@ module WLang
|
|
167
170
|
return child_dialect.dialect(name[1..-1])
|
168
171
|
end
|
169
172
|
end
|
173
|
+
|
174
|
+
# Applies post transformation
|
175
|
+
def apply_post_transform(text)
|
176
|
+
case self.post_transformer
|
177
|
+
when String
|
178
|
+
WLang::encode(text, self.post_transformer, {})
|
179
|
+
when Proc
|
180
|
+
self.post_transformer.call(text)
|
181
|
+
else
|
182
|
+
text
|
183
|
+
end
|
184
|
+
end
|
170
185
|
|
171
186
|
#
|
172
187
|
# Finds an encoder by name.
|
@@ -221,7 +236,8 @@ module WLang
|
|
221
236
|
|
222
237
|
# Factors a spacing friendly buffer for instantiation in this dialect
|
223
238
|
def factor_buffer
|
224
|
-
IntelligentBuffer.new
|
239
|
+
#IntelligentBuffer.new
|
240
|
+
""
|
225
241
|
end
|
226
242
|
|
227
243
|
# Returns a string representation
|
data/lib/wlang/dialect_dsl.rb
CHANGED
@@ -85,6 +85,11 @@ module WLang
|
|
85
85
|
@dialect.add_child_dialect(name, child)
|
86
86
|
end
|
87
87
|
|
88
|
+
#
|
89
|
+
# Sets a transformer to use at end of generation time.
|
90
|
+
#
|
91
|
+
def post_transform(transformer = nil, &block) end
|
92
|
+
|
88
93
|
#
|
89
94
|
# Adds a dialect encoder under _name_. Encoder's code is provided by the block.
|
90
95
|
# This block should always take <tt>|src, options|</tt> arguments: _src_ is
|
data/lib/wlang/dialect_loader.rb
CHANGED
@@ -39,6 +39,11 @@ module WLang
|
|
39
39
|
# See WLang::Dialect::DSL#dialect
|
40
40
|
def dialect(name, *extensions, &block) end
|
41
41
|
|
42
|
+
# See WLang::Dialect::DSL::post_transformer
|
43
|
+
def post_transform(transformer = nil, &block)
|
44
|
+
@dialect.post_transformer = (transformer || block)
|
45
|
+
end
|
46
|
+
|
42
47
|
# See WLang::Dialect::DSL#encoder
|
43
48
|
def encoder(name, &block)
|
44
49
|
@dialect.add_encoder(name, &block)
|
@@ -11,14 +11,15 @@ module WLang
|
|
11
11
|
#
|
12
12
|
module CodeRayEncoderSet
|
13
13
|
|
14
|
+
# Coderay recognized formats
|
15
|
+
RECOGNIZED = ["java", "ruby", "html", "yaml", "sql", "css", "javascript", "json", "php", "xml"]
|
16
|
+
|
14
17
|
# Default encoders
|
15
|
-
DEFAULT_ENCODERS = {
|
16
|
-
|
17
|
-
"javascript" => :coderay, "json" => :coderay, "php" => :coderay,
|
18
|
-
"xml" => :coderay}
|
18
|
+
DEFAULT_ENCODERS = {}
|
19
|
+
RECOGNIZED.each{|f| DEFAULT_ENCODERS[f] = f.to_sym}
|
19
20
|
|
20
21
|
# Upcase encoding
|
21
|
-
def self.coderay(src, options)
|
22
|
+
def self.coderay(src, options)
|
22
23
|
/([a-z]+)$/ =~ options['_encoder_']
|
23
24
|
encoder = $1.to_sym
|
24
25
|
tokens = CodeRay.scan src, encoder
|
@@ -28,6 +29,14 @@ module WLang
|
|
28
29
|
)
|
29
30
|
return highlighted
|
30
31
|
end
|
32
|
+
|
33
|
+
RECOGNIZED.each{|f|
|
34
|
+
module_eval <<-EOF
|
35
|
+
def self.#{f}(src, options)
|
36
|
+
WLang::EncoderSet::CodeRayEncoderSet.coderay(src, options.merge('_encoder_' => #{f.inspect}))
|
37
|
+
end
|
38
|
+
EOF
|
39
|
+
}
|
31
40
|
|
32
41
|
end # module CodeRay
|
33
42
|
|
data/lib/wlang/parser.rb
CHANGED
@@ -69,7 +69,6 @@ module WLang
|
|
69
69
|
|
70
70
|
# Resolves an URI throught the current template
|
71
71
|
def file_resolve(uri)
|
72
|
-
# TODO: refactor me to handle absolute URIs
|
73
72
|
template.file_resolve(uri)
|
74
73
|
end
|
75
74
|
|
@@ -185,7 +184,7 @@ module WLang
|
|
185
184
|
self.<<(source_text[self.offset, 1+source_text.length-self.offset], false)
|
186
185
|
self.offset = source_text.length
|
187
186
|
end
|
188
|
-
[buffer, self.offset-1]
|
187
|
+
[dialect.apply_post_transform(buffer), self.offset-1]
|
189
188
|
end
|
190
189
|
|
191
190
|
###################################################################### Callbacks for rule sets
|
data/lib/wlang/template.rb
CHANGED
@@ -33,13 +33,20 @@ module WLang
|
|
33
33
|
|
34
34
|
# Resolved a relative uri
|
35
35
|
def file_resolve(uri, exists=false)
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
36
|
+
require 'uri'
|
37
|
+
real_uri = URI::parse(uri)
|
38
|
+
if real_uri.absolute?
|
39
|
+
raise WLang::Error, "Unable to resolve #{uri}, absolute uri are not supported"
|
40
|
+
elsif real_uri.path[0, 1] == '/'
|
41
|
+
real_uri.path
|
42
|
+
else
|
43
|
+
raise WLang::Error, "Unable to resolve #{uri}, this template is not attached to a file" unless @source_file
|
44
|
+
target = File.join(File.dirname(@source_file), uri)
|
45
|
+
if exists and not(File.exists?(target))
|
46
|
+
raise WLang::Error, "File '#{uri}' does not exists"
|
47
|
+
end
|
48
|
+
target
|
41
49
|
end
|
42
|
-
target
|
43
50
|
end
|
44
51
|
|
45
52
|
# Returns template's source text
|
@@ -0,0 +1 @@
|
|
1
|
+
<pre>hello</pre>
|
@@ -0,0 +1 @@
|
|
1
|
+
puts "Hello world"
|
@@ -0,0 +1 @@
|
|
1
|
+
hello
|
@@ -0,0 +1 @@
|
|
1
|
+
<pre><pre>puts "Hello world"</pre></pre>
|
@@ -0,0 +1 @@
|
|
1
|
+
<<+{hello.pre}
|
@@ -0,0 +1 @@
|
|
1
|
+
HELLO
|
@@ -0,0 +1 @@
|
|
1
|
+
hello
|
data/test/blackbox/test_all.rb
CHANGED
@@ -24,6 +24,15 @@ module WLang
|
|
24
24
|
rules WLang::RuleSet::Basic
|
25
25
|
rules WLang::RuleSet::Buffering
|
26
26
|
}
|
27
|
+
dialect("postblock", ".pre") {
|
28
|
+
post_transform{|txt| "<pre>#{txt}</pre>"}
|
29
|
+
rules WLang::RuleSet::Basic
|
30
|
+
rules WLang::RuleSet::Buffering
|
31
|
+
}
|
32
|
+
dialect("poststring") {
|
33
|
+
post_transform "plain-text/upcase"
|
34
|
+
rules WLang::RuleSet::Basic
|
35
|
+
}
|
27
36
|
end
|
28
37
|
hosted = ::WLang::HostedLanguage.new
|
29
38
|
def hosted.variable_missing(name)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
describe "WLang::Dialect#post_transform" do
|
2
|
+
|
3
|
+
let(:dialect){ WLang::Dialect.new("test", nil) }
|
4
|
+
subject{ dialect.apply_post_transform("hello") }
|
5
|
+
|
6
|
+
context "when a string has been installed" do
|
7
|
+
before{ dialect.post_transformer = "plain-text/upcase" }
|
8
|
+
it{ should == "HELLO" }
|
9
|
+
end
|
10
|
+
|
11
|
+
context "when a a has been installed" do
|
12
|
+
before{ dialect.post_transformer = lambda{|txt| "yes!#{txt}"} }
|
13
|
+
it{ should == "yes!hello" }
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/test/unit/test_all.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
$LOAD_PATH.unshift(File.
|
1
|
+
$LOAD_PATH.unshift(File.expand_path('../../../', __FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.expand_path('../../../lib', __FILE__))
|
2
3
|
require 'wlang'
|
3
4
|
require 'test/unit'
|
4
5
|
test_files = Dir[File.join(File.dirname(__FILE__), '**/*_test.rb')]
|
@@ -1,111 +1,111 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'wlang'
|
3
|
-
module WLang
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
# assert_equal("this is an anagram template", result)
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
end
|
1
|
+
# require 'test/unit'
|
2
|
+
# require 'wlang'
|
3
|
+
# module WLang
|
4
|
+
#
|
5
|
+
# # Tests the IntelligentBuffer class
|
6
|
+
# class AnagramBugsTest < Test::Unit::TestCase
|
7
|
+
# include IntelligentBuffer::Methods
|
8
|
+
#
|
9
|
+
# def test_on_anagram_spacing_policy
|
10
|
+
# WLang::dialect("anagram") do
|
11
|
+
# rule '=~' do |parser,offset|
|
12
|
+
# match, reached = parser.parse(offset, "wlang/dummy")
|
13
|
+
# block, reached = parser.parse_block(reached, "wlang/dummy")
|
14
|
+
#
|
15
|
+
# # puts "Here is the block ==="
|
16
|
+
# # puts "#{block.gsub(/ /, '.').gsub(/\n/, "\\n\n")}"
|
17
|
+
# # puts "=== Here is the block"
|
18
|
+
#
|
19
|
+
# [block, reached]
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
# template = %q{
|
23
|
+
# =~{String}{
|
24
|
+
# this is an anagram template
|
25
|
+
# }
|
26
|
+
# }.gsub(/^ {8}/, '').strip
|
27
|
+
# result = template.wlang_instantiate({}, "anagram")
|
28
|
+
# #assert IntelligentBuffer===result
|
29
|
+
# # assert_equal("this is an anagram template", result)
|
30
|
+
#
|
31
|
+
# template = %q{
|
32
|
+
# =~{String}{
|
33
|
+
# module MyModule
|
34
|
+
# end
|
35
|
+
# }
|
36
|
+
# }.gsub(/^ {8}/, '').strip
|
37
|
+
# result = template.wlang_instantiate({}, "anagram")
|
38
|
+
# #assert IntelligentBuffer===result
|
39
|
+
# assert_equal("module MyModule\nend\n", result)
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# def test_missing_end_bug
|
43
|
+
# WLang::dialect("anagram") do
|
44
|
+
# rules WLang::RuleSet::Basic
|
45
|
+
# rules WLang::RuleSet::Imperative
|
46
|
+
# rule '=~' do |parser,offset|
|
47
|
+
# match, reached = parser.parse(offset, "wlang/dummy")
|
48
|
+
# match = parser.evaluate(match)
|
49
|
+
# block, reached = parser.parse_block(reached, "wlang/dummy")
|
50
|
+
# block = block.strip_block(block)
|
51
|
+
# block = block.tabto(block,0)
|
52
|
+
# parser.evaluate("matching_rules") << [match, block]
|
53
|
+
#
|
54
|
+
# # puts "Here is the block ==="
|
55
|
+
# # puts "#{block.gsub(/ /, '.').gsub(/\n/, "\\n\n")}"
|
56
|
+
# # puts "=== Here is the block"
|
57
|
+
#
|
58
|
+
# ["", reached]
|
59
|
+
# end
|
60
|
+
# rule '+~' do |parser,offset|
|
61
|
+
# what, reached = parser.parse(offset, "wlang/dummy")
|
62
|
+
# evaluated = parser.evaluate(what)
|
63
|
+
# raise "Unexpected case, #{what} leads to nil" unless evaluated
|
64
|
+
#
|
65
|
+
# rules = parser.evaluate("matching_rules")
|
66
|
+
# found = rules.find {|r| r[0]===evaluated}
|
67
|
+
# raise "Unexpected case: no match for #{what.class}" unless found
|
68
|
+
#
|
69
|
+
# context = {"n" => evaluated, "matching_rules" => rules}
|
70
|
+
# inst = found[1].wlang_instantiate(context, "anagram")
|
71
|
+
#
|
72
|
+
# inst2 = inst.gsub(/ /, '.').gsub(/\n/, "\\n\n")
|
73
|
+
# # puts "Here is the inst ==="
|
74
|
+
# # puts "#{inst2}"
|
75
|
+
# # puts "=== Here is the inst"
|
76
|
+
#
|
77
|
+
# found = [inst, reached]
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
# template = %Q{
|
81
|
+
# =~{Array}{
|
82
|
+
# module MyModule
|
83
|
+
# *{n as c}{
|
84
|
+
# +~{c}
|
85
|
+
# }
|
86
|
+
# end
|
87
|
+
# }
|
88
|
+
# =~{Integer}{
|
89
|
+
# +{n}
|
90
|
+
# }
|
91
|
+
# +~{n}
|
92
|
+
# }.gsub(/ {8}/,'').strip
|
93
|
+
# context = {'n' => [10, 20, 30], 'matching_rules' => []}
|
94
|
+
# result = template.wlang_instantiate(context, "anagram")
|
95
|
+
#
|
96
|
+
# # template = template.gsub(/ /, '.').gsub(/\n/, "\\n\n")
|
97
|
+
# # puts "Here is the template ==="
|
98
|
+
# # puts "#{template}"
|
99
|
+
# # puts "=== Here is the template"
|
100
|
+
#
|
101
|
+
# # result = result.gsub(/ /, '.').gsub(/\n/, "\\n\n")
|
102
|
+
# # puts "Here is the result ==="
|
103
|
+
# # puts "#{result}"
|
104
|
+
# # puts "=== Here is the result"
|
105
|
+
# result = result.strip
|
106
|
+
# expected = "module MyModule\n 10\n \n 20\n \n 30\n\nend"
|
107
|
+
# assert_equal expected, result
|
108
|
+
# end
|
109
|
+
#
|
110
|
+
# end
|
111
|
+
# end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wlang
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 2
|
10
|
+
version: 0.9.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Bernard Lambeau
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-07-21 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -137,8 +137,17 @@ files:
|
|
137
137
|
- test/blackbox/context/modulo_assignment_2.exp
|
138
138
|
- test/blackbox/context/modulo_assignment_2.tpl
|
139
139
|
- test/blackbox/data_1.rb
|
140
|
+
- test/blackbox/postblock/hello.exp
|
141
|
+
- test/blackbox/postblock/hello.pre
|
142
|
+
- test/blackbox/postblock/hello.tpl
|
143
|
+
- test/blackbox/postblock/hello_input_inclusion.exp
|
144
|
+
- test/blackbox/postblock/hello_input_inclusion.tpl
|
145
|
+
- test/blackbox/poststring/hello.exp
|
146
|
+
- test/blackbox/poststring/hello.tpl
|
140
147
|
- test/blackbox/test_all.rb
|
141
148
|
- test/spec/basic_object.spec
|
149
|
+
- test/spec/coderay_dialect.spec
|
150
|
+
- test/spec/dialect/apply_post_transform.spec
|
142
151
|
- test/spec/global_extensions.rb
|
143
152
|
- test/spec/hash_scope.spec
|
144
153
|
- test/spec/redcloth_dialect.spec
|