mirror of
https://github.com/haml/haml.git
synced 2022-11-09 12:33:31 -05:00
Initial upload.
git-svn-id: svn://hamptoncatlin.com/haml/trunk@1 7063305b-7217-0410-af8c-cdc13e5119b9
This commit is contained in:
commit
35f7e17de5
8 changed files with 175 additions and 0 deletions
4
README
Normal file
4
README
Normal file
|
@ -0,0 +1,4 @@
|
|||
Haml
|
||||
====
|
||||
|
||||
Description goes here
|
22
Rakefile
Normal file
22
Rakefile
Normal file
|
@ -0,0 +1,22 @@
|
|||
require 'rake'
|
||||
require 'rake/testtask'
|
||||
require 'rake/rdoctask'
|
||||
|
||||
desc 'Default: run unit tests.'
|
||||
task :default => :test
|
||||
|
||||
desc 'Test the haml plugin.'
|
||||
Rake::TestTask.new(:test) do |t|
|
||||
t.libs << 'lib'
|
||||
t.pattern = 'test/**/*_test.rb'
|
||||
t.verbose = true
|
||||
end
|
||||
|
||||
desc 'Generate documentation for the haml plugin.'
|
||||
Rake::RDocTask.new(:rdoc) do |rdoc|
|
||||
rdoc.rdoc_dir = 'rdoc'
|
||||
rdoc.title = 'Haml'
|
||||
rdoc.options << '--line-numbers' << '--inline-source'
|
||||
rdoc.rdoc_files.include('README')
|
||||
rdoc.rdoc_files.include('lib/**/*.rb')
|
||||
end
|
3
init.rb
Normal file
3
init.rb
Normal file
|
@ -0,0 +1,3 @@
|
|||
require 'haml'
|
||||
|
||||
ActionView::Base.register_template_handler("haml", HAML::TemplateEngine)
|
1
install.rb
Normal file
1
install.rb
Normal file
|
@ -0,0 +1 @@
|
|||
# No Install needed!
|
130
lib/haml.rb
Normal file
130
lib/haml.rb
Normal file
|
@ -0,0 +1,130 @@
|
|||
module HAML
|
||||
|
||||
class TemplateEngine
|
||||
|
||||
def initialize(base)
|
||||
@base = base
|
||||
@tab_index = ["", " "]
|
||||
#pre-build the tab index up to 9
|
||||
10.times do |num|
|
||||
@tab_index << @tab_index.last + " "
|
||||
end
|
||||
end
|
||||
|
||||
def render(template = "", locals = {})
|
||||
@pony_land = HappyMagicPonyLand.new(@base, locals)
|
||||
@result = ""
|
||||
@to_close_queue = []
|
||||
|
||||
#main loop handling line reading
|
||||
#and interpretation
|
||||
template.each_line do |line|
|
||||
count, line = count_levels(line)
|
||||
if count <= @to_close_queue.size
|
||||
close_tag
|
||||
end
|
||||
case line.first
|
||||
when '.', '#'
|
||||
render_div(line)
|
||||
when '<'
|
||||
render_tag_or_line(line)
|
||||
when '/'
|
||||
render_comment(line)
|
||||
when '='
|
||||
add template_eval(line[1, line.length])
|
||||
else
|
||||
add line
|
||||
end
|
||||
end
|
||||
puts "closing... " + @to_close_queue.inspect
|
||||
@to_close_queue.each { close_tag }
|
||||
@result
|
||||
end
|
||||
|
||||
def add(line)
|
||||
@result << tabify(@to_close_queue.size) + line + "\n"
|
||||
end
|
||||
|
||||
def tabify(times)
|
||||
@tab_index[times]
|
||||
end
|
||||
|
||||
def open_tag(name, attributes = {})
|
||||
attribute_array = []
|
||||
attributes.each do |attr_name, val|
|
||||
attribute_array << attr_name.to_s + "='" + val + "'"
|
||||
end
|
||||
add "<#{name.to_s}#{attribute_array.empty? ? "" : " "}#{attribute_array.join(" ")}>"
|
||||
@to_close_queue.push(name)
|
||||
end
|
||||
|
||||
def close_tag
|
||||
add "</#{@to_close_queue.pop}>"
|
||||
end
|
||||
|
||||
def render_div(line)
|
||||
open_tag("div", parse_attributes(line))
|
||||
end
|
||||
|
||||
def render_comment(line)
|
||||
add "<!-- #{line} -->"
|
||||
end
|
||||
|
||||
def render_tag_or_line(line)
|
||||
line.scan(/[<]([a-zA-Z]+)([a-zA-Z.\#]*)([=]?)([^\n]*)/).each do |tag_name, attributes, action, value|
|
||||
puts tag_name
|
||||
open_tag(tag_name, parse_attributes(attributes))
|
||||
unless value.empty?
|
||||
if(action == '=')
|
||||
add(value)
|
||||
else
|
||||
add(template_eval(value))
|
||||
end
|
||||
close_tag
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def template_eval(code)
|
||||
@pony_land.instance_eval(code) || ""
|
||||
end
|
||||
|
||||
def parse_attributes(list)
|
||||
attributes = {}
|
||||
list.scan(/([#.])([-a-zA-Z_()]+)/).each do |type, property|
|
||||
case type
|
||||
when "."
|
||||
attributes[:class] = property
|
||||
when "#"
|
||||
attributes[:id] = property
|
||||
end
|
||||
end
|
||||
attributes
|
||||
end
|
||||
|
||||
def count_levels(line)
|
||||
[line.index(/[^ ]/), line.strip]
|
||||
end
|
||||
end
|
||||
|
||||
class HappyMagicPonyLand
|
||||
|
||||
def initialize(base, attributes = {})
|
||||
@_action_view = base
|
||||
@table = attributes
|
||||
end
|
||||
|
||||
def method_missing(name, *args, &block)
|
||||
name_as_string = name.to_s
|
||||
if name_as_string.last == "="
|
||||
@table[name_as_string.scan(/[^=]+/).first.to_sym] = args.first
|
||||
elsif @table.has_key? name.to_sym
|
||||
@table[name.to_sym]
|
||||
elsif @_action_view.respond_to? name
|
||||
@_action_view.send(name, *args, &block)
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
3
lib/pony.rb
Normal file
3
lib/pony.rb
Normal file
|
@ -0,0 +1,3 @@
|
|||
module HAML
|
||||
|
||||
end
|
4
tasks/haml_tasks.rake
Normal file
4
tasks/haml_tasks.rake
Normal file
|
@ -0,0 +1,4 @@
|
|||
# desc "Explaining what the task does"
|
||||
# task :haml do
|
||||
# # Task goes here
|
||||
# end
|
8
test/haml_test.rb
Normal file
8
test/haml_test.rb
Normal file
|
@ -0,0 +1,8 @@
|
|||
require 'test/unit'
|
||||
|
||||
class HamlTest < Test::Unit::TestCase
|
||||
# Replace this with your real tests.
|
||||
def test_this_plugin
|
||||
flunk
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue