pivotal-erector 0.6.3 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
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?