Class: Stasis::Layout

Inherits:
Plugin
  • Object
show all
Defined in:
lib/stasis/plugins/layout.rb

Instance Method Summary collapse

Methods inherited from Plugin

#_match_key?, _priority, #_within?, inherited, plugins, priority

Constructor Details

#initialize(stasis) ⇒ Layout

Returns a new instance of Layout.



9
10
11
12
# File 'lib/stasis/plugins/layout.rb', line 9

def initialize(stasis)
  @stasis = stasis
  reset
end

Instance Method Details

#before_renderObject

This event triggers before each file renders through Stasis. It sets the ‘action` layout from the matching layout for `path`.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/stasis/plugins/layout.rb', line 16

def before_render
  return unless @stasis.path
  @stasis.action._layout = nil
  matches = _match_key?(@layouts, @stasis.path)
  # Non-HTML extensions.
  non_html = %w(sass scss less builder coffee yajl)
  # Find matching layout.
  [ :same, :similar ].each do |type|
    matches.each do |(within, layout, non_specific)|
      layout_ext = File.extname(layout)[1..-1]
      path_ext = File.extname(@stasis.path)[1..-1]

      match =
        case type
        # Same extension?
        when :same then
          layout_ext == path_ext
        # Similar extension?
        when :similar then
          non_html.include?(layout_ext) == non_html.include?(path_ext)
        end

      # Set layout
      if _within?(within) && match
        @stasis.action._layout = layout
      end
    end
    break if @stasis.action._layout
  end
  # If layout not found, try again without extension requirement for specific layout
  # definitions only.
  unless @stasis.action._layout
    matches.each do |(within, layout, non_specific)|
      if _within?(within) && !non_specific
        @stasis.action._layout = layout
      end
    end
  end
end

#layout_action(path) ⇒ Object

This method is bound to all actions. Set the ‘action` layout.



57
58
59
60
61
# File 'lib/stasis/plugins/layout.rb', line 57

def layout_action(path)
  if path = @stasis.controller._resolve(path)
    @stasis.action._layout = path
  end
end

#layout_controller(hash_or_string) ⇒ Object

This method is bound to all controllers. If it receives a ‘String` as a parameter, use that layout for all paths. Otherwise, it receives a `Hash` with the key being the `path` and the value being the layout to use for that `path`.



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/stasis/plugins/layout.rb', line 66

def layout_controller(hash_or_string)
  if hash_or_string.is_a?(::String)
    hash = {}
    hash[/.*/] = hash_or_string
  else
    hash = hash_or_string
  end
  @layouts.merge! hash.inject({}) { |hash, (path, layout)|
    path = @stasis.controller._resolve(path)
    layout = @stasis.controller._resolve(layout)
    if layout
      hash[path] = [ @stasis.path, layout, path == /.*/ ]
      @stasis.controller.ignore(layout)
    end
    hash
  }
end

#resetObject

This event resets all instance variables.



85
86
87
# File 'lib/stasis/plugins/layout.rb', line 85

def reset
  @layouts = {}
end