summaryrefslogtreecommitdiff
path: root/app/helpers/haml_helper.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/helpers/haml_helper.rb')
-rw-r--r--app/helpers/haml_helper.rb54
1 files changed, 54 insertions, 0 deletions
diff --git a/app/helpers/haml_helper.rb b/app/helpers/haml_helper.rb
new file mode 100644
index 0000000..dae0149
--- /dev/null
+++ b/app/helpers/haml_helper.rb
@@ -0,0 +1,54 @@
+require 'pathname'
+
+module HamlHelper
+
+ #
+ # acts like haml_tag, capture_haml, or haml_concat, depending on how it is called.
+ #
+ # two or more args --> like haml_tag
+ # one arg and a block --> like haml_tag
+ # zero args and a block --> like capture_haml
+ # one arg and no block --> like haml_concat
+ #
+ # additionally, we allow the use of more than one class.
+ #
+ # some examples of these usages:
+ #
+ # def display_robot(robot)
+ # haml do # like capture_haml
+ # haml '.head', robot.head_html # like haml_tag
+ # haml '.head' do # same
+ # haml robot.head_html
+ # end
+ # haml '.body.metal', robot.body_html # like haml_tag, but with multiple classes
+ # haml '<a href="/x">link</a>' # like haml_concat
+ # end
+ # end
+ #
+ # wrapping the helper in a capture_haml call is very useful, because then
+ # the helper can be used wherever a normal helper would be.
+ #
+ def haml(name=nil, *args, &block)
+ if name
+ if args.empty? and block.nil?
+ haml_concat name
+ else
+ if name =~ /^(.*?\.[^\.]*)(\..*)$/
+ # allow chaining of classes if there are multiple '.' in the first arg
+ name = $1
+ classes = $2.gsub('.',' ')
+ hsh = args.detect{|i| i.is_a?(Hash)}
+ unless hsh
+ hsh = {}
+ args << hsh
+ end
+ hsh[:class] = classes
+ end
+ haml_tag(name, *args, &block)
+ end
+ else
+ capture_haml(&block)
+ end
+ end
+
+end \ No newline at end of file