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.
@@ -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
@@ -20,7 +20,7 @@ require 'wlang/intelligent_buffer'
20
20
  module WLang
21
21
 
22
22
  # Current version of WLang
23
- VERSION = "0.9.1".freeze
23
+ VERSION = "0.9.2".freeze
24
24
 
25
25
  ######################################################################## About files and extensions
26
26
 
@@ -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
@@ -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
@@ -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 = {"java" => :coderay, "ruby" => :coderay, "html" => :coderay,
16
- "yaml" => :coderay, "sql" => :coderay, "css" => :coderay,
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
 
@@ -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
@@ -33,13 +33,20 @@ module WLang
33
33
 
34
34
  # Resolved a relative uri
35
35
  def file_resolve(uri, exists=false)
36
- raise("Unable to resolve #{uri}, this template is not attached to a file")\
37
- unless @source_file
38
- target = File.join(File.dirname(@source_file), uri)
39
- if exists and not(File.exists?(target))
40
- raise "File '#{uri}' does not exists"
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
@@ -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,8 @@
1
+ require "wlang"
2
+ describe("WLang should support coderay encoder") do
3
+
4
+ it("should support basic coderay encoding") {
5
+ WLang::encode("<h1>This is a title</h1>", "xhtml/coderay/html").should_not be_nil
6
+ }
7
+
8
+ end
@@ -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
@@ -1,4 +1,5 @@
1
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
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
- # 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
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: 57
4
+ hash: 63
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 1
10
- version: 0.9.1
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-05-20 00:00:00 +02:00
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