wlang 0.9.1 → 0.9.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/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
|