Module: Card::Set::Format
- Included in:
- Card::Set
- Defined in:
- card/lib/card/set/format.rb,
card/lib/card/set/format/haml_paths.rb,
card/lib/card/set/format/abstract_format.rb,
card/lib/card/set/format/abstract_format/wrapper.rb,
card/lib/card/set/format/abstract_format/view_opts.rb,
card/lib/card/set/format/abstract_format/haml_views.rb,
card/lib/card/set/format/abstract_format/view_definition.rb
Overview
Card::Set::Format is responsible for handling format
blocks within the set module
DSL, which is used in Set module files found in mods’
set directories. Monkeys use the DSL to define views that apply to specific sets of
cards in specific formats. The views can then be
used by Monkeys in code and by Sharks via the UI.
For example, imagine you have a set module file in mod/mymod/type/my_type.rb
.
There you can define a view like this:
format :html do
view :hello do
greeting
end
end
Learn more about defining views
This view will now be available to MyType cards in HTML – but not in other formats. Similarly, you can define other methods in format blocks:
format :html do
def greeting
:rocks
end
end
The magic that happens here is that the method #greeting is now applicable (and available) only to the cards in the set specified by the mod, and only when rendering a view of the card in the HTML format. Learn more about formats.
So if, for example, I had a card “MyCard” with the type “MyType”, the following should use the method above:
"MyCard".card.format(:html).greeting
…but if the card had a different type, or if I tried to use the method in, say, the JSON format, this #beethoven method wouldn’t be available.
Under the hood, the DSL creates a ruby module that looks something like
Card::Set::Type::MyType::HtmlFormat
. This module will then be dynamically included
in HTML format objects for MyCard.
As monkeys, we don’t usually think about all that much, because we work in the set module space, which lets us focus on the card patterns.
Speaking of which, there are a few key patterns to be aware of:
- Just as in sets, format methods for narrower sets will override format methods for more general sets. So if a #greeting method is defined for all cards and again for a specific card type, then the type method will override the all method when both apply.
-
Similarly, specific formats inherit from more general formats, and all formats inherit from the base format. If a format is not specified, the format block will define methods on the base format class.
format do def farewell "goodbye" end end
-
It is possible to use super to refer to overridden methods. For example
format :html do def goodbye "<em>#{super}</em>" end end
Note: Set precedence has a higher priority than Format precedence.
-
Some very powerful API calls (including view and before) are defined in AbstractFormat. These methods are always available in format blocks.
- #view and #before, however, can ALSO both be called outside of a format block. They will be defined on the base format.
Defined Under Namespace
Modules: AbstractFormat, HamlPaths
Class Method Summary collapse
-
.layout_method_name(layout) ⇒ Object
name of method for layout used by wrapper.
-
.view_method_name(view) ⇒ Object
name of method for view used by #render.
-
.view_setting_method_name(view, setting_name) ⇒ Object
name of method for setting for a given view.
-
.wrapper_method_name(wrapper) ⇒ Object
name of method for wrapper used by wrapped views.
Instance Method Summary collapse
-
#before(view, &block) ⇒ Object
shortcut for AbstractFormat#before for when #before is called outside of a format block.
-
#format(*format_names, &block) ⇒ Object
define format behavior within a set module.
-
#view(*args, &block) ⇒ Object
shortcut for AbstractFormat#view for when #view is called outside of a format block.
Class Method Details
.layout_method_name(layout) ⇒ Object
name of method for layout used by wrapper
160 161 162 |
# File 'card/lib/card/set/format.rb', line 160 def layout_method_name layout "_layout_#{layout.to_name.key}" end |
.view_method_name(view) ⇒ Object
name of method for view used by #render
172 173 174 |
# File 'card/lib/card/set/format.rb', line 172 def view_method_name view "_view_#{view}" end |
.view_setting_method_name(view, setting_name) ⇒ Object
name of method for setting for a given view. used by #view_setting
178 179 180 |
# File 'card/lib/card/set/format.rb', line 178 def view_setting_method_name view, setting_name "_view_#{view}__#{setting_name}" end |
.wrapper_method_name(wrapper) ⇒ Object
name of method for wrapper used by wrapped views
166 167 168 |
# File 'card/lib/card/set/format.rb', line 166 def wrapper_method_name wrapper "_wrapper_#{wrapper}" end |
Instance Method Details
#before(view, &block) ⇒ Object
shortcut for Card::Set::Format::AbstractFormat#before for when #before is called outside of a format block
112 113 114 |
# File 'card/lib/card/set/format.rb', line 112 def before view, &block format { before view, &block } end |
#format(*format_names, &block) ⇒ Object
define format behavior within a set module
91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'card/lib/card/set/format.rb', line 91 def format *format_names, &block format_names.compact! if format_names.empty? format_names = [:base] elsif format_names.first == :all format_names = Card::Format.registered.reject { |f| Card::Format.aliases[f] } end format_names.each do |f| define_on_format f, &block end end |
#view(*args, &block) ⇒ Object
shortcut for Card::Set::Format::AbstractFormat#view for when #view is called outside of a format block
106 107 108 |
# File 'card/lib/card/set/format.rb', line 106 def view *args, &block format { view(*args, &block) } end |