Module: Card::Set::Format::HamlViews

Included in:
AbstractFormat
Defined in:
lib/card/set/format/haml_views.rb

Overview

Examples:

# mod/core/set/type/basic.rb
view :my_view, template: :haml  # renders mod/core/view/type/basic/my_view.haml

view :with_instance_variables, template: :haml do
  @actor = "Mark Haml"
end

# mod/core/view/type/basic/with_instance_variables.haml
Luke is played by
  = actor

> render :with_instance_variables  # => "Luke is played by Mark Haml"

Instance Method Summary collapse

Instance Method Details

#each_template_path(source) ⇒ Object



55
56
57
58
59
60
61
62
# File 'lib/card/set/format/haml_views.rb', line 55

def each_template_path source
  source ||= source_location
  basename = ::File.basename source, ".rb"
  source_dir = ::File.dirname source
  ["./#{basename}", "."].each do |template_dir|
    yield template_dir, source_dir
  end
end

#haml_block_locals(view_args, &block) ⇒ Object



40
41
42
43
44
45
# File 'lib/card/set/format/haml_views.rb', line 40

def haml_block_locals view_args, &block
  instance_exec view_args, &block
  instance_variables.each_with_object({}) do |var, h|
    h[var.to_s.tr("@", "").to_sym] = instance_variable_get var
  end
end

#haml_template_path(view, source = nil) ⇒ Object

Raises:



47
48
49
50
51
52
53
# File 'lib/card/set/format/haml_views.rb', line 47

def haml_template_path view, source=nil
  each_template_path(source) do |template_dir, source_dir|
    path = try_haml_template_path template_dir, view, source_dir
    return path if path
  end
  raise Card::Error, "can't find haml template for #{view}"
end

#haml_template_proc(template, path, &block) ⇒ Object



30
31
32
33
34
35
36
37
38
# File 'lib/card/set/format/haml_views.rb', line 30

def haml_template_proc template, path, &block
  block_locals = block_given?
  proc do |view_args|
    with_template_path path do
      locals = block_locals ? haml_block_locals(view_args, &block) : view_args
      haml_to_html template, locals, nil, path: path
    end
  end
end

#haml_to_html(haml, locals = {}, a_binding = nil, debug_info = {}) ⇒ Object



70
71
72
73
74
75
76
# File 'lib/card/set/format/haml_views.rb', line 70

def haml_to_html haml, locals={}, a_binding=nil, debug_info={}
  a_binding ||= binding
  ::Haml::Engine.new(haml).render a_binding, locals || {}
rescue Haml::SyntaxError => e
  raise Card::Error,
        "haml syntax error #{template_location(debug_info)}: #{e.message}"
end

#haml_view_block(view, &block) ⇒ Object



25
26
27
28
# File 'lib/card/set/format/haml_views.rb', line 25

def haml_view_block view, &block
  path = haml_template_path view
  haml_template_proc ::File.read(path), path, &block
end

#template_location(debug_info) ⇒ Object



78
79
80
81
82
# File 'lib/card/set/format/haml_views.rb', line 78

def template_location debug_info
  return "" unless debug_info[:path]
  Pathname.new(debug_info[:path])
          .relative_path_from(Pathname.new(Dir.pwd))
end

#try_haml_template_path(template_path, view, source_dir, ext = "haml") ⇒ Object



64
65
66
67
68
# File 'lib/card/set/format/haml_views.rb', line 64

def try_haml_template_path template_path, view, source_dir, ext="haml"
  path = ::File.expand_path("#{template_path}/#{view}.#{ext}", source_dir)
               .sub(%r{(/mod/[^/]+)/set/}, "\\1/#{TEMPLATE_DIR}/")
  ::File.exist?(path) && path
end

#with_template_path(path) ⇒ Object



84
85
86
87
88
89
90
# File 'lib/card/set/format/haml_views.rb', line 84

def with_template_path path
  old_path = @template_path
  @template_path = path
  yield
ensure
  @template_path = old_path
end