lib/nanoc3/base/compiler_dsl.rb in nanoc3-3.0.9 vs lib/nanoc3/base/compiler_dsl.rb in nanoc3-3.1.0a1
- old
+ new
@@ -1,43 +1,59 @@
# encoding: utf-8
module Nanoc3
- # Nanoc3::CompilerDSL contains methods that will be executed by the site's
- # rules file.
+ # Contains methods that will be executed by the site’s `Rules` file.
class CompilerDSL
# Creates a new compiler DSL for the given compiler.
+ #
+ # @param [Nanoc3::Site] site The site this DSL belongs to
def initialize(site)
@site = site
end
# Creates a preprocessor block that will be executed after all data is
# loaded, but before the site is compiled.
+ #
+ # @yield The block that will be executed before site compilation starts
+ #
+ # @return [void]
def preprocess(&block)
@site.preprocessor = block
end
# Creates a compilation rule for all items whose identifier match the
# given identifier, which may either be a string containing the *
# wildcard, or a regular expression.
#
- # This rule will be applicable to reps with a name equal to "default"
- # unless an explicit :rep parameter is given.
+ # This rule will be applicable to reps with a name equal to `:default`;
+ # this can be changed by giving an explicit `:rep` parameter.
#
# An item rep will be compiled by calling the given block and passing the
# rep as a block argument.
#
- # Example:
+ # @param [String] identifier A pattern matching identifiers of items that
+ # should be compiled using this rule
#
- # compile '/foo/*' do
- # rep.filter :erb
- # end
- #
- # compile '/bar/*', :rep => 'raw' do
- # # do nothing
- # end
+ # @option params [Symbol] :rep (:default) The name of the representation
+ # that should be compiled using this rule
+ #
+ # @yield The block that will be executed when an item matching this
+ # compilation rule needs to be compiled
+ #
+ # @return [void]
+ #
+ # @example Compiling the default rep of the `/foo/` item
+ # compile '/foo/' do
+ # rep.filter :erb
+ # end
+ #
+ # @example Compiling the `:raw` rep of the `/bar/` item
+ # compile '/bar/', :rep => :raw do
+ # # do nothing
+ # end
def compile(identifier, params={}, &block)
# Require block
raise ArgumentError.new("#compile requires a block") unless block_given?
# Get rep name
@@ -47,28 +63,39 @@
rule = Rule.new(identifier_to_regex(identifier), rep_name, block)
@site.compiler.item_compilation_rules << rule
end
# Creates a routing rule for all items whose identifier match the
- # given identifier, which may either be a string containing the *
+ # given identifier, which may either be a string containing the `*`
# wildcard, or a regular expression.
#
- # This rule will be applicable to reps with a name equal to "default";
- # this can be changed by givign an explicit :rep parameter.
+ # This rule will be applicable to reps with a name equal to `:default`;
+ # this can be changed by giving an explicit `:rep` parameter.
#
# The path of an item rep will be determined by calling the given block
# and passing the rep as a block argument.
#
- # Example:
+ # @param [String] identifier A pattern matching identifiers of items that
+ # should be routed using this rule
#
- # route '/foo/*' do
- # '/blahblah' + rep.item.identifier + 'index.html'
- # end
- #
- # route '/bar/*', :rep => 'raw' do
- # '/blahblah' + rep.item.identifier + 'index.txt'
- # end
+ # @option params [Symbol] :rep (:default) The name of the representation
+ # that should be routed using this rule
+ #
+ # @yield The block that will be executed when an item matching this
+ # compilation rule needs to be routed
+ #
+ # @return [void]
+ #
+ # @example Routing the default rep of the `/foo/` item
+ # route '/foo/' do
+ # item.identifier + 'index.html'
+ # end
+ #
+ # @example Routing the `:raw` rep of the `/bar/` item
+ # route '/bar/', :rep => :raw do
+ # '/raw' + item.identifier + 'index.txt'
+ # end
def route(identifier, params={}, &block)
# Require block
raise ArgumentError.new("#route requires a block") unless block_given?
# Get rep name
@@ -83,29 +110,43 @@
# identifier, which may either be a string containing the * wildcard, or a
# regular expression. The layouts matching the identifier will be filtered
# using the filter specified in the second argument. The params hash
# contains filter arguments that will be passed to the filter.
#
- # Example:
+ # @param [String] identifier A pattern matching identifiers of layouts
+ # that should be filtered using this rule
#
- # layout '/default/', :erb
- # layout '/custom/', :haml, :format => :html5
+ # @param [Symbol] filter_name The name of the filter that should be run
+ # when processing the layout
+ #
+ # @param [Hash] params Extra filter arguments that should be passed to the
+ # filter when processing the layout (see {Nanoc3::Filter#run})
+ #
+ # @return [void]
+ #
+ # @example Specifying the filter to use for a layout
+ # layout '/default/', :erb
+ #
+ # @example Using custom filter arguments for a layout
+ # layout '/custom/', :haml, :format => :html5
def layout(identifier, filter_name, params={})
@site.compiler.layout_filter_mapping[identifier_to_regex(identifier)] = [ filter_name, params ]
end
private
- # Converts the given identifier, which can contain the '*' wildcard, to a regex.
- # For example, 'foo/*/bar' is transformed into /^foo\/(.*?)\/bar$/.
+ # Converts the given identifier, which can contain the '*' or '+'
+ # wildcard characters, matching zero or more resp. one or more
+ # characters, to a regex. For example, 'foo/*/bar' is transformed
+ # into /^foo\/(.*?)\/bar$/ and 'foo+' is transformed into /^foo(.+?)/.
def identifier_to_regex(identifier)
if identifier.is_a? String
# Add leading/trailing slashes if necessary
new_identifier = identifier.dup
new_identifier[/^/] = '/' if identifier[0,1] != '/'
new_identifier[/$/] = '/' unless [ '*', '/' ].include?(identifier[-1,1])
- /^#{new_identifier.gsub('*', '(.*?)')}$/
+ /^#{new_identifier.gsub('*', '(.*?)').gsub('+', '(.+?)')}$/
else
identifier
end
end