Replaces special xml tags with the rendered content of a node.
Replace the webgen:block xml tags with the rendered content of the specified node.
# File lib/webgen/contentprocessor/blocks.rb, line 14
14: def call(context)
15: context.content.gsub!(BLOCK_RE) do |match|
16: attr = {}
17: match_object = $~
18: attr[:line_nr_proc] = lambda { match_object.pre_match.scan("\n").size + 1 }
19: match.scan(BLOCK_ATTR_RE) {|name, sep, content| attr[name.to_sym] = content}
20: render_block(context, attr)
21: end
22: context
23: end
Render a block of a page node and return the result.
The Webgen::Context object context is used as the render context and the options hash needs to hold all relevant information, that is:
The name of the block that should be used.
The node chain used for rendering. If this is not specified, the node chain from the context is used. It needs to be a String in the format (A)LCN;(A)LCN;... or an array of nodes.
Defines which node in the node chain should be used. Valid values are next (= default value; the next node in the node chain), first (the first node in the node chain with a block called name) or current (the currently rendered node, ignores the chain option).
If this property is set to ignore, a missing block will not raise an error. It is unset by default, so missing blocks will raise errors.
# File lib/webgen/contentprocessor/blocks.rb, line 43
43: def render_block(context, options)
44: if options[:chain].nil?
45: used_chain = (context[:chain].length > 1 ? context[:chain][1..1] : context[:chain]).dup
46: elsif options[:chain].kind_of?(Array)
47: used_chain = options[:chain]
48: dest_node = context.content_node
49: else
50: paths = options[:chain].split(';')
51: used_chain = paths.collect do |path|
52: temp_node = context.ref_node.resolve(path.strip, context.dest_node.lang)
53: if temp_node.nil?
54: raise Webgen::RenderError.new("Could not resolve <#{path.strip}>",
55: self.class.name, context.dest_node,
56: context.ref_node, (options[:line_nr_proc].call if options[:line_nr_proc]))
57: end
58: temp_node
59: end.compact
60: return '' if used_chain.length != paths.length
61: dest_node = context.content_node
62: end
63:
64: if options[:node] == 'first'
65: used_chain.shift while used_chain.length > 0 && !used_chain.first.node_info[:page].blocks.has_key?(options[:name])
66: elsif options[:node] == 'current'
67: used_chain = context[:chain].dup
68: end
69: block_node = used_chain.first
70:
71: if !block_node || !block_node.node_info[:page].blocks.has_key?(options[:name])
72: if options[:notfound] == 'ignore'
73: return ''
74: elsif block_node
75: raise Webgen::RenderError.new("No block named '#{options[:name]}' found in <#{block_node}>",
76: self.class.name, context.dest_node,
77: context.ref_node, (options[:line_nr_proc].call if options[:line_nr_proc]))
78: else
79: raise Webgen::RenderError.new("No node in the render chain has a block named '#{options[:name]}'",
80: self.class.name, context.dest_node,
81: context.ref_node, (options[:line_nr_proc].call if options[:line_nr_proc]))
82: end
83: end
84:
85: context.dest_node.node_info[:used_nodes] << block_node.alcn
86: tmp_context = block_node.node_info[:page].blocks[options[:name]].render(context.clone(:chain => used_chain, :dest_node => dest_node))
87: tmp_context.content
88: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.