gettalong-webgen 0.5.8.20090507 → 0.5.9.20090620
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +5 -6
- data/data/webgen/passive_sources/images/generated_by_webgen.png +0 -0
- data/data/webgen/passive_sources/images/webgen_logo.png +0 -0
- data/data/webgen/passive_sources/templates/atom_feed.template +38 -0
- data/data/webgen/passive_sources/templates/rss_feed.template +28 -0
- data/data/webgen/resources.yaml +2 -1
- data/doc/contentprocessor/builder.page +1 -1
- data/doc/contentprocessor/erb.page +5 -2
- data/doc/contentprocessor/erubis.page +2 -2
- data/doc/extensions.page +1 -1
- data/doc/manual.page +56 -26
- data/doc/reference_configuration.page +36 -1
- data/doc/reference_website_styles.page +1 -1
- data/doc/sourcehandler/feed.page +6 -11
- data/doc/tag/includefile.page +1 -1
- data/lib/webgen/cli/apply_command.rb +1 -1
- data/lib/webgen/cli/utils.rb +2 -2
- data/lib/webgen/common.rb +0 -9
- data/lib/webgen/contentprocessor/blocks.rb +60 -36
- data/lib/webgen/contentprocessor/builder.rb +2 -2
- data/lib/webgen/contentprocessor/erb.rb +3 -2
- data/lib/webgen/contentprocessor/erubis.rb +2 -2
- data/lib/webgen/contentprocessor/haml.rb +2 -2
- data/lib/webgen/contentprocessor/maruku.rb +1 -1
- data/lib/webgen/contentprocessor/sass.rb +2 -2
- data/lib/webgen/contentprocessor/tags.rb +25 -11
- data/lib/webgen/context.rb +4 -1
- data/lib/webgen/context/render.rb +32 -0
- data/lib/webgen/context/tags.rb +20 -0
- data/lib/webgen/default_config.rb +4 -1
- data/lib/webgen/deprecated.rb +37 -4
- data/lib/webgen/node.rb +37 -38
- data/lib/webgen/path.rb +151 -54
- data/lib/webgen/source.rb +6 -6
- data/lib/webgen/source/stacked.rb +13 -5
- data/lib/webgen/sourcehandler.rb +71 -45
- data/lib/webgen/sourcehandler/base.rb +51 -21
- data/lib/webgen/sourcehandler/copy.rb +4 -4
- data/lib/webgen/sourcehandler/directory.rb +3 -9
- data/lib/webgen/sourcehandler/feed.rb +23 -49
- data/lib/webgen/sourcehandler/fragment.rb +10 -8
- data/lib/webgen/sourcehandler/memory.rb +9 -10
- data/lib/webgen/sourcehandler/metainfo.rb +9 -9
- data/lib/webgen/sourcehandler/page.rb +5 -5
- data/lib/webgen/sourcehandler/sitemap.rb +3 -3
- data/lib/webgen/sourcehandler/template.rb +6 -6
- data/lib/webgen/sourcehandler/virtual.rb +19 -17
- data/lib/webgen/tag/base.rb +34 -26
- data/lib/webgen/tag/breadcrumbtrail.rb +3 -3
- data/lib/webgen/tag/executecommand.rb +3 -3
- data/lib/webgen/tag/langbar.rb +2 -2
- data/lib/webgen/tag/link.rb +3 -3
- data/lib/webgen/tag/menu.rb +2 -2
- data/lib/webgen/tag/metainfo.rb +1 -1
- data/lib/webgen/tag/relocatable.rb +17 -21
- data/lib/webgen/tag/tikz.rb +5 -6
- data/lib/webgen/tree.rb +7 -7
- data/lib/webgen/version.rb +1 -1
- data/lib/webgen/website.rb +4 -2
- data/misc/default.css +8 -2
- data/misc/default.template +2 -2
- data/misc/logo.svg +313 -0
- data/misc/style.page +1 -1
- data/test/helper.rb +2 -2
- data/test/test_common_sitemap.rb +1 -1
- data/test/test_contentprocessor_blocks.rb +12 -4
- data/test/test_contentprocessor_builder.rb +2 -1
- data/test/test_contentprocessor_erb.rb +2 -1
- data/test/test_contentprocessor_erubis.rb +1 -1
- data/test/test_contentprocessor_fragments.rb +12 -11
- data/test/test_contentprocessor_haml.rb +2 -1
- data/test/test_contentprocessor_maruku.rb +1 -0
- data/test/test_contentprocessor_rdiscount.rb +1 -0
- data/test/test_contentprocessor_rdoc.rb +1 -0
- data/test/test_contentprocessor_sass.rb +1 -0
- data/test/test_contentprocessor_tags.rb +13 -0
- data/test/test_context.rb +28 -0
- data/test/test_node.rb +40 -20
- data/test/test_path.rb +106 -65
- data/test/test_source_filesystem.rb +1 -1
- data/test/test_source_stacked.rb +19 -6
- data/test/test_sourcehandler_base.rb +53 -47
- data/test/test_sourcehandler_copy.rb +6 -6
- data/test/test_sourcehandler_directory.rb +8 -12
- data/test/test_sourcehandler_feed.rb +10 -6
- data/test/test_sourcehandler_fragment.rb +6 -5
- data/test/test_sourcehandler_main.rb +39 -0
- data/test/test_sourcehandler_memory.rb +4 -4
- data/test/test_sourcehandler_metainfo.rb +10 -10
- data/test/test_sourcehandler_page.rb +9 -9
- data/test/test_sourcehandler_sitemap.rb +4 -4
- data/test/test_sourcehandler_template.rb +14 -14
- data/test/test_sourcehandler_virtual.rb +9 -5
- data/test/test_tag_base.rb +2 -2
- data/test/test_tag_executecommand.rb +1 -1
- data/test/test_tag_link.rb +4 -3
- data/test/test_tag_menu.rb +15 -15
- data/test/test_tag_metainfo.rb +1 -0
- data/test/test_tag_relocatable.rb +2 -1
- data/test/test_tag_tikz.rb +3 -3
- data/test/test_tree.rb +8 -8
- data/test/test_website.rb +15 -0
- metadata +14 -14
- data/test/test_common.rb +0 -18
@@ -19,7 +19,7 @@ module Webgen::SourceHandler
|
|
19
19
|
#
|
20
20
|
# The paths that are handled by a source handler are specified via path patterns (see
|
21
21
|
# below). During a webgen run the #create_node method for each source paths that matches a
|
22
|
-
# specified path pattern is called. And when it is time to write out the node, the
|
22
|
+
# specified path pattern is called. And when it is time to write out the node, the #content
|
23
23
|
# method is called to retrieve the rendered content.
|
24
24
|
#
|
25
25
|
# A source handler must not take any parameters on initialization and when this module is not
|
@@ -35,6 +35,7 @@ module Webgen::SourceHandler
|
|
35
35
|
# It also provides other utility methods:
|
36
36
|
# * #page_from_path
|
37
37
|
# * #content
|
38
|
+
# * #parent_node
|
38
39
|
#
|
39
40
|
# == Nodes Created for Paths
|
40
41
|
#
|
@@ -109,10 +110,11 @@ module Webgen::SourceHandler
|
|
109
110
|
# class SimpleCopy
|
110
111
|
#
|
111
112
|
# include Webgen::SourceHandler::Base
|
113
|
+
# include Webgen::WebsiteAccess
|
112
114
|
#
|
113
|
-
# def create_node(
|
115
|
+
# def create_node(path)
|
114
116
|
# path.ext += '.copied'
|
115
|
-
# super(
|
117
|
+
# super(path)
|
116
118
|
# end
|
117
119
|
#
|
118
120
|
# def content(node)
|
@@ -181,9 +183,7 @@ module Webgen::SourceHandler
|
|
181
183
|
if OutputPathHelpers.public_instance_methods(false).map(&:to_s).include?(method)
|
182
184
|
name = send(method, parent, path, use_lang_part)
|
183
185
|
name += '/' if path.path =~ /\/$/ && name !~ /\/$/
|
184
|
-
if (node = node_exists?(
|
185
|
-
name = node.path
|
186
|
-
elsif node
|
186
|
+
if (node = node_exists?(path, name)) && node.lang != path.meta_info['lang']
|
187
187
|
name = send(method, parent, path, (path.meta_info['lang'].nil? ? false : true))
|
188
188
|
name += '/' if path.path =~ /\/$/ && name !~ /\/$/
|
189
189
|
end
|
@@ -193,24 +193,38 @@ module Webgen::SourceHandler
|
|
193
193
|
end
|
194
194
|
end
|
195
195
|
|
196
|
-
# Check if the node alcn and output path which would be created by #create_node
|
196
|
+
# Check if the node alcn and output path which would be created by #create_node exist. The
|
197
197
|
# +output_path+ to check for can individually be set.
|
198
|
-
def node_exists?(
|
199
|
-
|
198
|
+
def node_exists?(path, output_path = self.output_path(parent_node(path), path))
|
199
|
+
Webgen::WebsiteAccess.website.tree[path.alcn] || (!path.meta_info['no_output'] && Webgen::WebsiteAccess.website.tree[output_path, :path])
|
200
200
|
end
|
201
201
|
|
202
|
-
# Create a node
|
203
|
-
#
|
204
|
-
#
|
205
|
-
#
|
206
|
-
#
|
207
|
-
#
|
208
|
-
|
202
|
+
# Create a node from +path+ if it does not already exists or re-initalize an already existing
|
203
|
+
# node. The found node or the newly created node is returned afterwards. +nil+ is returned if no
|
204
|
+
# node can be created (e.g. when <tt>path.meta_info['draft']</tt> is set).
|
205
|
+
#
|
206
|
+
# The +options+ parameter can be used for providing the optional parameters:
|
207
|
+
#
|
208
|
+
# [<tt>:parent</tt>] The parent node under which the new node should be created. If this is not
|
209
|
+
# specified (the usual case), the parent node is determined by the
|
210
|
+
# #parent_node method.
|
211
|
+
#
|
212
|
+
# [<tt>:output_path</tt>] The output path that should be used for the node. If this is not
|
213
|
+
# specified (the usual case), the output path is determined via the
|
214
|
+
# #output_path method.
|
215
|
+
#
|
216
|
+
# Some additional node information like <tt>:src</tt> and <tt>:processor</tt> is set and the
|
217
|
+
# meta information is checked for validness. The created/re-initialized node is yielded if a
|
218
|
+
# block is given.
|
219
|
+
def create_node(path, options = {})
|
209
220
|
return nil if path.meta_info['draft']
|
210
|
-
|
221
|
+
parent = options[:parent] || parent_node(path)
|
222
|
+
output_path = options[:output_path] || self.output_path(parent, path)
|
223
|
+
node = node_exists?(path, output_path)
|
224
|
+
|
211
225
|
if node && (node.node_info[:src] != path.source_path || node.node_info[:processor] != self.class.name)
|
212
|
-
log(:warn) { "Node already exists: source = #{path.source_path} | path = #{node.path} | alcn = #{node.
|
213
|
-
return node
|
226
|
+
log(:warn) { "Node already exists: source = #{path.source_path} | path = #{node.path} | alcn = #{node.alcn}"}
|
227
|
+
return node #TODO: think! should nil be returned?
|
214
228
|
elsif !node
|
215
229
|
node = Webgen::Node.new(parent, output_path, path.cn, path.meta_info)
|
216
230
|
elsif node.flagged?(:reinit)
|
@@ -218,7 +232,11 @@ module Webgen::SourceHandler
|
|
218
232
|
else
|
219
233
|
return node
|
220
234
|
end
|
221
|
-
|
235
|
+
|
236
|
+
if !node['modified_at'].kind_of?(Time)
|
237
|
+
log(:warn) { "Meta information 'modified_at' set to current time in <#{node.alcn}> since its value '#{node['modified_at']}' was of type #{node['modified_at'].class}" } unless node['modified_at'].nil?
|
238
|
+
node['modified_at'] = Time.now
|
239
|
+
end
|
222
240
|
node.node_info[:src] = path.source_path
|
223
241
|
node.node_info[:creation_path] = path.path
|
224
242
|
node.node_info[:processor] = self.class.name
|
@@ -226,7 +244,10 @@ module Webgen::SourceHandler
|
|
226
244
|
node
|
227
245
|
end
|
228
246
|
|
229
|
-
# Return the content of the given +node+.
|
247
|
+
# Return the content of the given +node+. If the return value is not +nil+ then the node gets
|
248
|
+
# written, otherwise it is ignored.
|
249
|
+
#
|
250
|
+
# This default +content+ method just returns +nil+.
|
230
251
|
def content(node)
|
231
252
|
nil
|
232
253
|
end
|
@@ -243,6 +264,15 @@ module Webgen::SourceHandler
|
|
243
264
|
page
|
244
265
|
end
|
245
266
|
|
267
|
+
# Return the parent node for the given +path+.
|
268
|
+
def parent_node(path)
|
269
|
+
parent_dir = (path.parent_path == '' ? '' : Webgen::Path.new(path.parent_path).alcn)
|
270
|
+
if !(parent = Webgen::WebsiteAccess.website.tree[parent_dir])
|
271
|
+
raise "The needed parent path <#{parent_dir}> for <#{path.path}> does not exist"
|
272
|
+
end
|
273
|
+
parent
|
274
|
+
end
|
275
|
+
|
246
276
|
end
|
247
277
|
|
248
278
|
end
|
@@ -9,9 +9,9 @@ module Webgen::SourceHandler
|
|
9
9
|
include Webgen::WebsiteAccess
|
10
10
|
include Base
|
11
11
|
|
12
|
-
# Create the node for +
|
13
|
-
#
|
14
|
-
def create_node(
|
12
|
+
# Create the node for +path+. If the +path+ has the name of a content processor as the first
|
13
|
+
# part in the extension, it is preprocessed.
|
14
|
+
def create_node(path)
|
15
15
|
if path.ext.index('.')
|
16
16
|
processor, *rest = path.ext.split('.')
|
17
17
|
if website.blackboard.invoke(:content_processor_names).include?(processor)
|
@@ -20,7 +20,7 @@ module Webgen::SourceHandler
|
|
20
20
|
processor = nil
|
21
21
|
end
|
22
22
|
end
|
23
|
-
super(
|
23
|
+
super(path) do |node|
|
24
24
|
node.node_info[:preprocessor] = processor
|
25
25
|
end
|
26
26
|
end
|
@@ -16,21 +16,15 @@ module Webgen::SourceHandler
|
|
16
16
|
# ignored). The path +path+ is the path that lead to the creation of these directories.
|
17
17
|
def create_directories(parent, dirname, path)
|
18
18
|
dirname.sub(/^\//, '').split('/').each do |dir|
|
19
|
-
dir_path = Webgen::Path.new(File.join(parent.
|
20
|
-
nodes = website.blackboard.invoke(:create_nodes,
|
21
|
-
|
22
|
-
node_exists?(dir_parent, dir_path) || create_node(dir_parent, dir_path)
|
19
|
+
dir_path = Webgen::Path.new(File.join(parent.alcn, dir, '/'), path)
|
20
|
+
nodes = website.blackboard.invoke(:create_nodes, dir_path, self) do |dir_path|
|
21
|
+
node_exists?(dir_path) || create_node(dir_path)
|
23
22
|
end
|
24
23
|
parent = nodes.first
|
25
24
|
end
|
26
25
|
parent
|
27
26
|
end
|
28
27
|
|
29
|
-
# Return an empty string to signal that the directory should be written to the output.
|
30
|
-
def content(node)
|
31
|
-
''
|
32
|
-
end
|
33
|
-
|
34
28
|
end
|
35
29
|
|
36
30
|
end
|
@@ -15,10 +15,10 @@ module Webgen::SourceHandler
|
|
15
15
|
website.blackboard.add_listener(:node_changed?, method(:node_changed?))
|
16
16
|
end
|
17
17
|
|
18
|
-
# Create atom and/or rss feed files from +
|
19
|
-
def create_node(
|
18
|
+
# Create atom and/or rss feed files from +path+.
|
19
|
+
def create_node(path)
|
20
20
|
page = page_from_path(path)
|
21
|
-
path.meta_info['link'] ||=
|
21
|
+
path.meta_info['link'] ||= path.parent_path
|
22
22
|
|
23
23
|
if MANDATORY_INFOS.any? {|t| path.meta_info[t].nil?}
|
24
24
|
raise "One of #{MANDATORY_INFOS.join('/')} information missing for feed <#{path}>"
|
@@ -26,7 +26,7 @@ module Webgen::SourceHandler
|
|
26
26
|
|
27
27
|
create_feed_node = lambda do |type|
|
28
28
|
path.ext = type
|
29
|
-
super(
|
29
|
+
super(path) do |node|
|
30
30
|
node.node_info[:feed] = page
|
31
31
|
node.node_info[:feed_type] = type
|
32
32
|
end
|
@@ -41,74 +41,48 @@ module Webgen::SourceHandler
|
|
41
41
|
|
42
42
|
# Return the rendered feed represented by +node+.
|
43
43
|
def content(node)
|
44
|
-
website.cache[[:sourcehandler_feed, node.node_info[:src]]] = feed_entries(node).map {|n| n.
|
44
|
+
website.cache[[:sourcehandler_feed, node.node_info[:src]]] = feed_entries(node).map {|n| n.alcn}
|
45
|
+
|
45
46
|
block_name = node.node_info[:feed_type] + '_template'
|
46
47
|
if node.node_info[:feed].blocks.has_key?(block_name)
|
47
|
-
node.node_info[:feed].blocks[block_name].
|
48
|
-
render(Webgen::Context.new(:chain => [node])).content
|
48
|
+
node.node_info[:feed].blocks[block_name].render(Webgen::Context.new(:chain => [node])).content
|
49
49
|
else
|
50
|
-
|
51
|
-
|
50
|
+
chain = [node.resolve("/templates/#{node.node_info[:feed_type]}_feed.template"), node]
|
51
|
+
node.node_info[:used_nodes] << chain.first.alcn
|
52
|
+
chain.first.node_info[:page].blocks['content'].render(Webgen::Context.new(:chain => chain)).content
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
55
|
-
#
|
56
|
+
# Return the entries for the feed +node+.
|
56
57
|
def feed_entries(node)
|
57
58
|
nr_items = (node['number_of_entries'].to_i == 0 ? 10 : node['number_of_entries'].to_i)
|
58
|
-
patterns = [node['entries']].flatten.map {|pat| Webgen::
|
59
|
+
patterns = [node['entries']].flatten.map {|pat| Webgen::Path.make_absolute(node.parent.alcn, pat)}
|
59
60
|
|
60
61
|
node.tree.node_access[:alcn].values.
|
61
62
|
select {|node| patterns.any? {|pat| node =~ pat} && node.node_info[:page]}.
|
62
63
|
sort {|a,b| a['modified_at'] <=> b['modified_at']}[0, nr_items]
|
63
64
|
end
|
64
65
|
|
66
|
+
# Return the feed link URL for the feed +node+.
|
67
|
+
def feed_link(node)
|
68
|
+
Webgen::Node.url(File.join(node['site_url'], node.tree[node['link']].path), false)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Return the content of an +entry+ of the feed +node+.
|
72
|
+
def entry_content(node, entry)
|
73
|
+
entry.node_info[:page].blocks[node['content_block_name'] || 'content'].render(Webgen::Context.new(:chain => [entry])).content
|
74
|
+
end
|
75
|
+
|
65
76
|
#######
|
66
77
|
private
|
67
78
|
#######
|
68
79
|
|
69
|
-
# Return the populated FeedTools::Feed object for +node+.
|
70
|
-
def build_feed_for(node)
|
71
|
-
require 'feed_tools'
|
72
|
-
require 'time'
|
73
|
-
|
74
|
-
site_url = node['site_url']
|
75
|
-
|
76
|
-
feed = FeedTools::Feed.new
|
77
|
-
feed.title = node['title']
|
78
|
-
feed.description = node['description']
|
79
|
-
feed.author = node['author']
|
80
|
-
feed.author.url = node['author_url']
|
81
|
-
feed.base_uri = site_url
|
82
|
-
feed.link = File.join(site_url, node.tree[node['link']].path)
|
83
|
-
feed.id = feed.link
|
84
|
-
|
85
|
-
feed.published = (node['created_at'].kind_of?(Time) ? node['created_at'] : Time.now)
|
86
|
-
feed.updated = Time.now
|
87
|
-
feed.generator = 'webgen - Webgen::SourceHandler::Feed'
|
88
|
-
|
89
|
-
node.feed_entries.each do |entry|
|
90
|
-
item = FeedTools::FeedItem.new
|
91
|
-
item.title = entry['title']
|
92
|
-
item.link = File.join(site_url, entry.path)
|
93
|
-
item.content = entry.node_info[:page].blocks[node['content_block_name'] || 'content'].render(Webgen::Context.new(:chain => [entry])).content
|
94
|
-
item.updated = entry['modified_at']
|
95
|
-
item.published = entry['created_at'] if entry['created_at'].kind_of?(Time)
|
96
|
-
if entry['author']
|
97
|
-
item.author = entry['author']
|
98
|
-
item.author.url = entry['author_url']
|
99
|
-
end
|
100
|
-
item.id = item.link
|
101
|
-
feed << item
|
102
|
-
end
|
103
|
-
feed
|
104
|
-
end
|
105
|
-
|
106
80
|
# Check if the any of the nodes used by this feed +node+ have changed and then mark the node as
|
107
81
|
# dirty.
|
108
82
|
def node_changed?(node)
|
109
83
|
return if node.node_info[:processor] != self.class.name
|
110
84
|
entries = node.feed_entries
|
111
|
-
node.flag(:dirty) if entries.map {|n| n.
|
85
|
+
node.flag(:dirty) if entries.map {|n| n.alcn } != website.cache[[:sourcehandler_feed, node.node_info[:src]]] ||
|
112
86
|
entries.any? {|n| n.changed?}
|
113
87
|
end
|
114
88
|
|
@@ -46,18 +46,20 @@ module Webgen::SourceHandler
|
|
46
46
|
end
|
47
47
|
|
48
48
|
# Create nested fragment nodes under +parent+ from +sections+ (which can be created using
|
49
|
-
# +parse_html_headers+). +path+ is the source path that defines the fragments
|
50
|
-
#
|
51
|
-
# info +sort_info+ is calculated from the base
|
52
|
-
|
49
|
+
# +parse_html_headers+). +path+ is the source path that defines the fragments (which is not the
|
50
|
+
# same as the creation path for +parent+). The meta information +in_menu+ of the fragment nodes
|
51
|
+
# is set to the parameter +in_menu+ and the meta info +sort_info+ is calculated from the base
|
52
|
+
# +si+ value.
|
53
|
+
def create_fragment_nodes(sections, parent, path, in_menu, si = 1000)
|
53
54
|
sections.each do |level, id, title, sub_sections|
|
54
|
-
|
55
|
-
|
56
|
-
|
55
|
+
fragment_path = parent.alcn.sub(/#.*$/, '') + '#' + id
|
56
|
+
node = website.blackboard.invoke(:create_nodes,
|
57
|
+
Webgen::Path.new(fragment_path, path.source_path),
|
58
|
+
self) do |cn_path|
|
57
59
|
cn_path.meta_info['title'] = title
|
58
60
|
cn_path.meta_info['in_menu'] = in_menu
|
59
61
|
cn_path.meta_info['sort_info'] = si = si.succ
|
60
|
-
create_node(
|
62
|
+
create_node(cn_path, :parent => parent)
|
61
63
|
end.first
|
62
64
|
create_fragment_nodes(sub_sections, node, path, in_menu, si.succ)
|
63
65
|
end
|
@@ -15,23 +15,22 @@ module Webgen::SourceHandler
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
# Create a node
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
|
23
|
-
|
24
|
-
super(parent, path) do |node|
|
18
|
+
# Create a node for the +path+. The +source_alcn+ specifies the node that creates this memory
|
19
|
+
# node when written. You have two options for providing the content for this node: either you
|
20
|
+
# set +data+ to a string (or a Webgen::Path::SourceIO object) or you provide a block which takes
|
21
|
+
# the created node as argument and returns a string (or a Webgen::Path::SourceIO object).
|
22
|
+
def create_node(path, source_alcn, data = nil)
|
23
|
+
super(path) do |node|
|
25
24
|
node.node_info[:memory_source_alcn] = source_alcn
|
26
|
-
(@data ||= {})[node.
|
25
|
+
(@data ||= {})[node.alcn] = lambda { data || yield(node) }
|
27
26
|
end
|
28
27
|
end
|
29
28
|
|
30
29
|
# Return the content of the memory +node+. If the memory node was not created in this webgen
|
31
30
|
# run, it will be flagged for reinitialization (and therefore recreation).
|
32
31
|
def content(node)
|
33
|
-
if @data && @data[node.
|
34
|
-
@data[node.
|
32
|
+
if @data && @data[node.alcn]
|
33
|
+
@data[node.alcn].call
|
35
34
|
else
|
36
35
|
node.flag(:reinit)
|
37
36
|
nil
|
@@ -22,15 +22,15 @@ module Webgen::SourceHandler
|
|
22
22
|
self.nodes ||= []
|
23
23
|
end
|
24
24
|
|
25
|
-
# Create a meta info node from +
|
26
|
-
def create_node(
|
25
|
+
# Create a meta info node from +path+.
|
26
|
+
def create_node(path)
|
27
27
|
page = page_from_path(path)
|
28
|
-
super(
|
28
|
+
super(path) do |node|
|
29
29
|
[[:mi_paths, 'paths'], [:mi_alcn, 'alcn']].each do |mi_key, block_name|
|
30
30
|
node.node_info[mi_key] = {}
|
31
31
|
if page.blocks.has_key?(block_name) && (data = YAML::load(page.blocks[block_name].content))
|
32
32
|
data.each do |key, value|
|
33
|
-
key = Webgen::
|
33
|
+
key = Webgen::Path.make_absolute(path.parent_path, key)
|
34
34
|
node.node_info[mi_key][key] = value
|
35
35
|
end
|
36
36
|
end
|
@@ -38,13 +38,13 @@ module Webgen::SourceHandler
|
|
38
38
|
|
39
39
|
mark_all_matched_dirty(node, :no_old_data)
|
40
40
|
|
41
|
-
website.cache.permanent[[:sh_metainfo_node_mi, node.
|
41
|
+
website.cache.permanent[[:sh_metainfo_node_mi, node.alcn]] = {
|
42
42
|
:mi_paths => node.node_info[:mi_paths],
|
43
43
|
:mi_alcn => node.node_info[:mi_alcn]
|
44
44
|
}
|
45
45
|
|
46
46
|
self.nodes << node unless self.nodes.include?(node)
|
47
|
-
self.nodes = self.nodes.sort_by {|n| n.
|
47
|
+
self.nodes = self.nodes.sort_by {|n| n.alcn}
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -62,7 +62,7 @@ module Webgen::SourceHandler
|
|
62
62
|
|
63
63
|
# Return +true+ if any meta information for +node+ provided by +mi_node+ has changed.
|
64
64
|
def meta_info_changed?(mi_node, node, option = nil)
|
65
|
-
cached = website.cache.permanent[[:sh_metainfo_node_mi, mi_node.
|
65
|
+
cached = website.cache.permanent[[:sh_metainfo_node_mi, mi_node.alcn]]
|
66
66
|
(mi_node.node_info[:mi_paths].any? do |pattern, mi|
|
67
67
|
Webgen::Path.match(node.node_info[:creation_path], pattern) &&
|
68
68
|
(option == :force || (!cached && option == :no_old_data) || mi != cached[:mi_paths][pattern])
|
@@ -87,7 +87,7 @@ module Webgen::SourceHandler
|
|
87
87
|
end
|
88
88
|
|
89
89
|
# Update the meta info of matched path before a node is created.
|
90
|
-
def before_node_created(
|
90
|
+
def before_node_created(path)
|
91
91
|
self.nodes.each do |node|
|
92
92
|
node.node_info[:mi_paths].each do |pattern, mi|
|
93
93
|
path.meta_info.update(mi) if Webgen::Path.match(path, pattern)
|
@@ -119,7 +119,7 @@ module Webgen::SourceHandler
|
|
119
119
|
def before_node_deleted(node)
|
120
120
|
return unless node.node_info[:processor] == self.class.name
|
121
121
|
mark_all_matched_dirty(node, :force)
|
122
|
-
website.cache.permanent.delete([:sh_metainfo_node_mi, node.
|
122
|
+
website.cache.permanent.delete([:sh_metainfo_node_mi, node.alcn])
|
123
123
|
self.nodes.delete(node)
|
124
124
|
end
|
125
125
|
|
@@ -12,13 +12,13 @@ module Webgen::SourceHandler
|
|
12
12
|
website.blackboard.add_listener(:node_meta_info_changed?, method(:meta_info_changed?))
|
13
13
|
end
|
14
14
|
|
15
|
-
# Create a page file from +
|
16
|
-
def create_node(
|
15
|
+
# Create a page file from +path+.
|
16
|
+
def create_node(path)
|
17
17
|
page = page_from_path(path)
|
18
18
|
path.meta_info['lang'] ||= website.config['website.lang']
|
19
19
|
path.ext = 'html' if path.ext == 'page'
|
20
20
|
|
21
|
-
super(
|
21
|
+
super(path) do |node|
|
22
22
|
node.node_info[:sh_page_node_mi] = Webgen::Page.meta_info_from_data(path.io.data)
|
23
23
|
node.node_info[:page] = page
|
24
24
|
end
|
@@ -31,11 +31,11 @@ module Webgen::SourceHandler
|
|
31
31
|
chain = [templates, node].flatten
|
32
32
|
|
33
33
|
if chain.first.node_info[:page].blocks.has_key?(block_name)
|
34
|
-
node.node_info[:used_nodes] << chain.first.
|
34
|
+
node.node_info[:used_nodes] << chain.first.alcn
|
35
35
|
context = chain.first.node_info[:page].blocks[block_name].render(Webgen::Context.new(:chain => chain))
|
36
36
|
context.content
|
37
37
|
else
|
38
|
-
raise "Error rendering <#{node.
|
38
|
+
raise "Error rendering <#{node.alcn}>: no block named '#{block_name}' in <#{chain.first.alcn}>"
|
39
39
|
end
|
40
40
|
end
|
41
41
|
alias_method :content, :render_node
|