pivotal-erector 0.6.3 → 0.6.4

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/README.txt CHANGED
@@ -25,20 +25,25 @@ project site at http://erector.rubyforge.org for more documentation.
25
25
  end
26
26
  body do
27
27
  text "Hello, "
28
- b "#{target}!", :class => 'big'
28
+ b target, :class => 'big'
29
+ text "!"
29
30
  end
30
31
  end
31
32
  end
32
33
  end
33
34
 
34
35
  Hello.new(:target => 'world').to_s
35
- => "<html><head><title>Hello</title></head><body>Hello, <b class=\"big\">world!</b></body></html>"
36
+ => "<html><head><title>Hello</title></head><body>Hello, <b class=\"big\">world</b>!</body></html>"
37
+
38
+ include Erector::Mixin
39
+ erector { div "love", :class => "big" }
40
+ => "<div class=\"big\">love</div>"
36
41
 
37
42
  == REQUIREMENTS
38
43
 
39
- The gem depends on rake and treetop, although this is just for using the "erect" tool,
40
- so deployed applications won't need these. Currently it also requires rails, although
41
- we plan to separate the rails-dependent code so you can use Erector cleanly in a non-Rails app.
44
+ The gem depends on rake and treetop, although this is just for using the command-line tool,
45
+ so deployed applications won't need these. The Rails-dependent code is now separated so
46
+ you can use Erector cleanly in a non-Rails app.
42
47
 
43
48
  == INSTALL
44
49
 
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 6
4
- :patch: 3
4
+ :patch: 4
5
5
 
data/bin/erector CHANGED
@@ -4,4 +4,6 @@ $LOAD_PATH.unshift("#{dir}/../lib")
4
4
  require "erector"
5
5
  require "erector/erect"
6
6
 
7
- Erector::Erect.new(ARGV).run
7
+ unless Erector::Erect.new(ARGV).run
8
+ exit 1
9
+ end
data/lib/erector/erect.rb CHANGED
@@ -78,7 +78,9 @@ module Erector
78
78
  end
79
79
 
80
80
  def run
81
+ @success = true
81
82
  self.send(mode)
83
+ @success
82
84
  end
83
85
 
84
86
  def to_erector
@@ -91,7 +93,7 @@ module Erector
91
93
  rescue => e
92
94
  puts e
93
95
  puts e.backtrace.join("\n\t")
94
- puts
96
+ @success = false
95
97
  end
96
98
  end
97
99
  end
@@ -103,7 +105,6 @@ module Erector
103
105
  begin
104
106
  #todo: fail if file isn't a .rb file
105
107
  require file
106
- #todo: understand modulized widgets (e.g. class Foo::Bar::Baz < Erector::Widget in baz.rb)
107
108
  filename = file.split('/').last.gsub(/\.rb$/, '')
108
109
  widget_name = camelize(filename)
109
110
  widget_class = constantize(widget_name)
@@ -124,6 +125,7 @@ module Erector
124
125
  rescue => e
125
126
  puts e
126
127
  puts e.backtrace.join("\n\t")
128
+ @success = false
127
129
  end
128
130
  end
129
131
  end
@@ -6,6 +6,7 @@ Treetop.load("#{dir}/rhtml.treetop")
6
6
 
7
7
  module Erector
8
8
  class Erected
9
+
9
10
  def initialize(in_file)
10
11
  @in_file = in_file
11
12
  end
@@ -14,14 +15,23 @@ module Erector
14
15
  dir + basename + ".rb"
15
16
  end
16
17
 
17
- def classname
18
+ def classnames
18
19
  base = classize(basename)
19
20
  parent = File.dirname(@in_file)
20
21
  grandparent = File.dirname(parent)
21
22
  if File.basename(grandparent) == "views"
22
- base = "Views::" + classize(File.basename(parent)) + "::" + base
23
+ ["Views::" + classize(File.basename(parent)) + "::" + base, "Erector::RailsWidget"]
24
+ else
25
+ [base, "Erector::Widget"]
23
26
  end
24
- base
27
+ end
28
+
29
+ def classname
30
+ classnames[0]
31
+ end
32
+
33
+ def parent_class
34
+ classnames[1]
25
35
  end
26
36
 
27
37
  def text
@@ -36,7 +46,7 @@ module Erector
36
46
  parser.failure_reason
37
47
  else
38
48
  File.open(filename, "w") do |f|
39
- f.puts("class #{classname} < Erector::Widget")
49
+ f.puts("class #{classname} < #{parent_class}")
40
50
  f.puts(" def content")
41
51
  f.puts(parsed.set_indent(2).convert)
42
52
  f.puts(" end")
@@ -0,0 +1,7 @@
1
+ module Erector
2
+ module Mixin
3
+ def erector(options = {}, &block)
4
+ Erector::Widget.new(&block).to_s(options)
5
+ end
6
+ end
7
+ end
@@ -13,7 +13,35 @@ grammar Rhtml
13
13
  end
14
14
 
15
15
  rule node
16
- hprintlet / printlet / scriptlet / doctype / self_closing_tag / imgtag / closetag / opentag / text
16
+ yield_with_name / yield / hprintlet / printlet / scriptlet / doctype / directive / self_closing_tag / imgtag / closetag / opentag / text
17
+ end
18
+
19
+ # Argh. For some reason I can't get this to work, so I split it into two rules
20
+ # rule yield
21
+ # '<%=' space 'yield' space (':' varname space)? '%>' <Erector::Indenting> {
22
+ # def convert
23
+ # var = "@content_for_" + varname.nil? ? "layout" : varname.text_value
24
+ # line "rawtext #{var} # Note: you must define #{var} elsewhere"
25
+ # end
26
+ # }
27
+ # end
28
+
29
+ rule yield_with_name
30
+ '<%=' space 'yield' space ':' varname space '%>' <Erector::Indenting> {
31
+ def convert
32
+ var = "@content_for_" + varname.text_value
33
+ line "rawtext #{var} # Note: you must define #{var} elsewhere"
34
+ end
35
+ }
36
+ end
37
+
38
+ rule yield
39
+ '<%=' space 'yield' space '%>' <Erector::Indenting> {
40
+ def convert
41
+ var = "@content_for_layout"
42
+ line "rawtext #{var} # Note: you must define #{var} elsewhere"
43
+ end
44
+ }
17
45
  end
18
46
 
19
47
  rule scriptlet
@@ -53,10 +81,6 @@ grammar Rhtml
53
81
  code = text_value.strip
54
82
  # matches a word, followed by either a word, a string, or a symbol
55
83
  result = code.gsub(/^(\w+) ([\w:"'].*)$/, '\1(\2)')
56
-
57
- # Convert yield, for layouts
58
- #result.gsub!(/^yield$/, '@content')
59
-
60
84
  result
61
85
  end
62
86
  }
@@ -69,15 +93,27 @@ grammar Rhtml
69
93
  end
70
94
  }
71
95
  end
96
+
97
+ rule directive
98
+ '<!' [^>]* '>' <Erector::Indenting> {
99
+ def convert
100
+ line "rawtext '#{text_value}'"
101
+ end
102
+ }
103
+ end
72
104
 
73
105
  rule tagname
74
106
  [A-Za-z0-9_:-]+
75
107
  end
108
+
109
+ rule varname
110
+ [A-Za-z0-9_]+
111
+ end
76
112
 
77
113
  rule self_closing_tag
78
114
  '<' tag_name:tagname attrs:attributes? space '/>' <Erector::Indenting> {
79
115
  def convert
80
- line "#{tag_name.text_value}#{attrs.blank? ? "" : attrs.convert}"
116
+ line "#{tag_name.text_value}#{attrs.empty? ? "" : attrs.convert}"
81
117
  end
82
118
  }
83
119
  end
@@ -85,7 +121,7 @@ grammar Rhtml
85
121
  rule opentag
86
122
  '<' tag_name:tagname attrs:attributes? space '>' <Erector::Indenting> {
87
123
  def convert
88
- line_in "#{tag_name.text_value}#{attrs.blank? ? "" : attrs.convert} do"
124
+ line_in "#{tag_name.text_value}#{attrs.empty? ? "" : attrs.convert} do"
89
125
  end
90
126
  }
91
127
  end
@@ -93,7 +129,7 @@ grammar Rhtml
93
129
  rule imgtag
94
130
  '<' tag_name:'img' attrs:attributes? space '>' <Erector::Indenting> {
95
131
  def convert
96
- line "#{tag_name.text_value}#{attrs.blank? ? "" : attrs.convert}"
132
+ line "#{tag_name.text_value}#{attrs.empty? ? "" : attrs.convert}"
97
133
  end
98
134
  }
99
135
  end
@@ -110,10 +146,11 @@ grammar Rhtml
110
146
  (([<>] !(tagname / [/%!])) / [^<>])+ <Erector::Indenting> {
111
147
  def convert
112
148
  stripped = text_value.strip
113
- if stripped.blank?
149
+ if stripped.empty?
114
150
  ""
115
151
  else
116
- line "text '#{text_value.strip.html_unescape}'"
152
+ line "text '#{stripped.html_unescape.gsub(/\'/, "\\\\'")
153
+ }'"
117
154
  end
118
155
  end
119
156
  }
@@ -123,7 +160,7 @@ grammar Rhtml
123
160
  first:attribute rest:attributes* {
124
161
  def convert
125
162
  " " + first.convert +
126
- if rest.blank?
163
+ if rest.empty?
127
164
  ""
128
165
  else
129
166
  ",#{rest.elements.first.convert}" # this is hacky -- is there a better way?