lib/hyde/renderer.rb in hydeweb-0.0.1.pre3 vs lib/hyde/renderer.rb in hydeweb-0.0.1.pre4
- old
+ new
@@ -12,19 +12,60 @@
def initialize(page, filename)
@page = page
@filename = filename
end
- def render( data = {} )
+ def render(data, &block)
+ scope = build_scope(page, data)
+ evaluate scope, data, &block
+ end
+
+ def markup
+ File.open(filename) { |f| @markup = f.read } unless @markup
+ @markup
+ end
+
+ protected
+ def require_lib(lib, gem=lib)
+ begin
+ require lib
+ rescue LoadError
+ class_name = self.class.to_s.downcase
+ ext = /[^:]*$/.match(class_name)
+ raise NoGemError.new("To use .#{ext} files, type: `gem install #{gem}`")
+ end
+ end
+
+ def build_scope(page, data)
+ # Page is the scope
+ scope = page.get_binding
+ scope_object = eval("self", scope)
+
+ # Inherit local vars
+ scope_object.send(:instance_variable_set, '@_locals', data)
+ f_set_locals = data.keys.map { |k| "#{k} = @_locals[#{k.inspect}];" }.join("\n")
+ eval(f_set_locals, scope)
+
+ scope_object.instance_eval do
+ def eval_block(src, &block)
+ # This will let you eval something, and `yield` within that block.
+ eval src
+ end
+ extend Hyde::TemplateHelpers
+ end
+
+ scope
+ end
+
+ # Override me
+ def evaluate(scope, data, &block)
""
end
end
# Any filetype that is split with the -- separator
class Parsable < Base
- @markup = ""
-
def initialize(page, filename)
super page, filename
# Parse out the file's metadata and markup contents
parts = get_file_parts filename, :max_parts => 2
@@ -35,10 +76,14 @@
@markup = parts[1]
page.set_meta YAML::load("--- " + parts[0])
end
end
+ def markup
+ @markup
+ end
+
protected
def get_file_parts(filename, *args)
options = { :max_parts => -1 }
args.each_pair { |k, v| options[k] = v } if args.is_a? Hash
@@ -55,13 +100,13 @@
data
end
end
class Passthru < Base
- def render( data = {} )
- data = ""
- File.open(@page.filename, "r").each_line { |line| data << line }
- data
+ def render(data = 0, &block)
+ output = ''
+ File.open(@page.filename, "r") { |f| output = f.read }
+ output
end
end
end
end