webgen 0.5.5 → 0.5.6
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/ChangeLog +3662 -0
- data/Rakefile +8 -1
- data/VERSION +1 -1
- data/data/webgen/website_styles/1024px/src/default.template +1 -1
- data/data/webgen/website_styles/andreas00/src/default.template +1 -1
- data/data/webgen/website_styles/andreas01/src/default.template +2 -1
- data/data/webgen/website_styles/andreas03/src/default.template +1 -1
- data/data/webgen/website_styles/andreas04/src/default.template +1 -1
- data/data/webgen/website_styles/andreas05/src/default.template +1 -1
- data/data/webgen/website_styles/andreas06/src/default.template +1 -1
- data/data/webgen/website_styles/andreas07/src/default.template +1 -1
- data/data/webgen/website_styles/andreas08/src/default.template +1 -1
- data/data/webgen/website_styles/andreas09/src/default.template +1 -1
- data/data/webgen/website_styles/simple/src/default.template +1 -1
- data/doc/contentprocessor/fragments.page +25 -0
- data/doc/extensions.page +1 -1
- data/doc/manual.page +33 -15
- data/doc/reference_configuration.page +339 -62
- data/doc/reference_metainfo.page +11 -2
- data/doc/sourcehandler/feed.page +19 -4
- data/doc/sourcehandler/page.page +0 -16
- data/doc/tag/langbar.page +8 -1
- data/doc/tag/link.page +44 -0
- data/doc/tag/tikz.page +158 -0
- data/lib/webgen/cli.rb +4 -4
- data/lib/webgen/common/sitemap.rb +2 -3
- data/lib/webgen/configuration.rb +3 -1
- data/lib/webgen/contentprocessor.rb +1 -0
- data/lib/webgen/contentprocessor/blocks.rb +0 -2
- data/lib/webgen/contentprocessor/context.rb +0 -3
- data/lib/webgen/contentprocessor/erubis.rb +0 -2
- data/lib/webgen/contentprocessor/fragments.rb +23 -0
- data/lib/webgen/default_config.rb +15 -2
- data/lib/webgen/languages.rb +9 -0
- data/lib/webgen/logger.rb +18 -1
- data/lib/webgen/node.rb +50 -25
- data/lib/webgen/page.rb +26 -16
- data/lib/webgen/path.rb +20 -10
- data/lib/webgen/sourcehandler.rb +85 -69
- data/lib/webgen/sourcehandler/base.rb +38 -15
- data/lib/webgen/sourcehandler/copy.rb +2 -2
- data/lib/webgen/sourcehandler/directory.rb +16 -13
- data/lib/webgen/sourcehandler/feed.rb +6 -12
- data/lib/webgen/sourcehandler/fragment.rb +6 -11
- data/lib/webgen/sourcehandler/memory.rb +41 -0
- data/lib/webgen/sourcehandler/metainfo.rb +21 -21
- data/lib/webgen/sourcehandler/page.rb +7 -27
- data/lib/webgen/sourcehandler/sitemap.rb +0 -2
- data/lib/webgen/sourcehandler/template.rb +0 -4
- data/lib/webgen/sourcehandler/virtual.rb +18 -18
- data/lib/webgen/tag.rb +2 -0
- data/lib/webgen/tag/breadcrumbtrail.rb +1 -4
- data/lib/webgen/tag/coderay.rb +0 -3
- data/lib/webgen/tag/date.rb +0 -2
- data/lib/webgen/tag/executecommand.rb +1 -2
- data/lib/webgen/tag/includefile.rb +1 -3
- data/lib/webgen/tag/langbar.rb +2 -5
- data/lib/webgen/tag/link.rb +23 -0
- data/lib/webgen/tag/menu.rb +1 -4
- data/lib/webgen/tag/metainfo.rb +0 -2
- data/lib/webgen/tag/relocatable.rb +2 -3
- data/lib/webgen/tag/sitemap.rb +0 -3
- data/lib/webgen/tag/tikz.rb +117 -0
- data/lib/webgen/tree.rb +11 -6
- data/lib/webgen/version.rb +1 -1
- data/lib/webgen/website.rb +2 -1
- data/test/test_cli.rb +14 -0
- data/test/test_common_sitemap.rb +4 -4
- data/test/test_contentprocessor_context.rb +1 -1
- data/test/test_contentprocessor_fragments.rb +40 -0
- data/test/test_contentprocessor_redcloth.rb +1 -0
- data/test/test_contentprocessor_tags.rb +1 -1
- data/test/test_languages.rb +12 -0
- data/test/test_logger.rb +19 -0
- data/test/test_node.rb +35 -15
- data/test/test_output_filesystem.rb +1 -1
- data/test/test_page.rb +15 -6
- data/test/test_path.rb +37 -5
- data/test/test_source_filesystem.rb +1 -1
- data/test/test_source_stacked.rb +1 -1
- data/test/test_sourcehandler_base.rb +30 -1
- data/test/test_sourcehandler_copy.rb +1 -1
- data/test/test_sourcehandler_directory.rb +16 -1
- data/test/test_sourcehandler_feed.rb +9 -8
- data/test/test_sourcehandler_fragment.rb +1 -1
- data/test/test_sourcehandler_memory.rb +42 -0
- data/test/test_sourcehandler_metainfo.rb +23 -21
- data/test/test_sourcehandler_page.rb +5 -12
- data/test/test_sourcehandler_template.rb +1 -1
- data/test/test_sourcehandler_virtual.rb +2 -2
- data/test/test_tag_base.rb +0 -1
- data/test/test_tag_breadcrumbtrail.rb +4 -4
- data/test/test_tag_includefile.rb +3 -3
- data/test/test_tag_langbar.rb +12 -7
- data/test/test_tag_link.rb +61 -0
- data/test/test_tag_menu.rb +7 -7
- data/test/test_tag_metainfo.rb +1 -1
- data/test/test_tag_relocatable.rb +1 -1
- data/test/test_tag_tikz.rb +66 -0
- data/test/test_tree.rb +8 -9
- metadata +15 -2
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
require 'facets/symbol/to_proc'
|
|
1
2
|
require 'webgen/websiteaccess'
|
|
2
3
|
require 'webgen/loggable'
|
|
3
4
|
require 'webgen/page'
|
|
@@ -42,9 +43,18 @@ module Webgen::SourceHandler
|
|
|
42
43
|
# <tt>node_info[:processor]</tt>:: Has to be set to the class name of the source handler. This is
|
|
43
44
|
# used by the Node class: all unknown method calls are forwarded
|
|
44
45
|
# to the node processor.
|
|
45
|
-
# <tt>node_info[:src]</tt>:: Has to be set to the string version of the
|
|
46
|
+
# <tt>node_info[:src]</tt>:: Has to be set to the string version of the path that lead to the
|
|
47
|
+
# creation of the node.
|
|
48
|
+
# <tt>node_info[:creation_path]</tt>:: Has to be set to the string version of the path that is
|
|
49
|
+
# used to create the path.
|
|
46
50
|
# <tt>meta_info['no_output']</tt>:: Has to be set to +true+ on nodes that are used during a
|
|
47
51
|
# webgen run but do not produce an output file.
|
|
52
|
+
# <tt>meta_info['modified_at']</tt>:: Is automatically set to the current time if not already set
|
|
53
|
+
# correctly (ie. if not a Time object).
|
|
54
|
+
#
|
|
55
|
+
# Note: The difference between +:src+ and +:creation_path+ is that a creation path need not have
|
|
56
|
+
# an existing source path representation. For example, fragments created from a page source path
|
|
57
|
+
# have a different +:creation_path+ which includes the fragment part.
|
|
48
58
|
#
|
|
49
59
|
# Additional information that is used only for processing purposes should be stored in the
|
|
50
60
|
# #node_info hash of a node as the #meta_info hash is reserved for real node meta information and
|
|
@@ -55,7 +65,8 @@ module Webgen::SourceHandler
|
|
|
55
65
|
# Path patterns define which paths are handled by a specific source handler. These patterns are
|
|
56
66
|
# specified in the <tt>sourcehandler.patterns</tt> configuration hash as a mapping from the source
|
|
57
67
|
# handler class name to an array of path patterns. The patterns need to have a format that
|
|
58
|
-
# <tt>Dir.glob</tt> can handle.
|
|
68
|
+
# <tt>Dir.glob</tt> can handle. You can use the configuration helper +patterns+ to set this (is
|
|
69
|
+
# shown in the example below).
|
|
59
70
|
#
|
|
60
71
|
# Specifying a path pattern does not mean that webgen uses the source handler. One also needs to
|
|
61
72
|
# provide an entry in the configuration value <tt>sourcehandler.invoke</tt>. This is a hash that
|
|
@@ -97,7 +108,7 @@ module Webgen::SourceHandler
|
|
|
97
108
|
#
|
|
98
109
|
# end
|
|
99
110
|
#
|
|
100
|
-
# WebsiteAccess.website.config.
|
|
111
|
+
# WebsiteAccess.website.config.patterns('SimpleCopy' => ['**/*.jpg', '**/*.png'])
|
|
101
112
|
# WebsiteAccess.website.config.sourcehandler.invoke[5] << 'SimpleCopy'
|
|
102
113
|
#
|
|
103
114
|
module Base
|
|
@@ -153,10 +164,12 @@ module Webgen::SourceHandler
|
|
|
153
164
|
Webgen::WebsiteAccess.website.config['sourcehandler.default_lang_in_output_path'] ||
|
|
154
165
|
Webgen::WebsiteAccess.website.config['website.lang'] != path.meta_info['lang']
|
|
155
166
|
end
|
|
156
|
-
if OutputPathHelpers.public_instance_methods(false).include?(method)
|
|
167
|
+
if OutputPathHelpers.public_instance_methods(false).map(&:to_s).include?(method)
|
|
157
168
|
name = send(method, parent, path, use_lang_part)
|
|
158
169
|
name += '/' if path.path =~ /\/$/ && name !~ /\/$/
|
|
159
|
-
if node_exists?(parent, path, name)
|
|
170
|
+
if (node = node_exists?(parent, path, name)) && node.lang == path.meta_info['lang']
|
|
171
|
+
name = node.path
|
|
172
|
+
elsif node
|
|
160
173
|
name = send(method, parent, path, (path.meta_info['lang'].nil? ? false : true))
|
|
161
174
|
name += '/' if path.path =~ /\/$/ && name !~ /\/$/
|
|
162
175
|
end
|
|
@@ -172,21 +185,31 @@ module Webgen::SourceHandler
|
|
|
172
185
|
parent.tree[Webgen::Node.absolute_name(parent, path.lcn, :alcn)] || (!path.meta_info['no_output'] && parent.tree[output_path, :path])
|
|
173
186
|
end
|
|
174
187
|
|
|
175
|
-
# Create
|
|
188
|
+
# Create a node under +parent+ from +path+ if it does not already exists or needs to be
|
|
189
|
+
# re-initialized. The found node or the newly created node is returned afterwards. +nil+ is
|
|
190
|
+
# returned if no node can be created (e.g. when <tt>path.meta_info['draft']</tt> is set). Some
|
|
176
191
|
# additional node information like <tt>:src</tt> and <tt>:processor</tt> is set and the meta
|
|
177
|
-
# information is checked for validness. The created node is yielded if a block is
|
|
192
|
+
# information is checked for validness. The created/re-initialized node is yielded if a block is
|
|
193
|
+
# given.
|
|
178
194
|
def create_node(parent, path, output_path = self.output_path(parent, path))
|
|
179
|
-
return if path.meta_info['draft']
|
|
180
|
-
|
|
195
|
+
return nil if path.meta_info['draft']
|
|
196
|
+
node = node_exists?(parent, path, output_path)
|
|
197
|
+
if node && (node.node_info[:src] != path.source_path || node.node_info[:processor] != self.class.name)
|
|
198
|
+
log(:warn) { "Node already exists: source = #{path.source_path} | path = #{node.path} | alcn = #{node.absolute_lcn}"}
|
|
199
|
+
return node
|
|
200
|
+
elsif !node
|
|
181
201
|
node = Webgen::Node.new(parent, output_path, path.cn, path.meta_info)
|
|
182
|
-
|
|
183
|
-
node.
|
|
184
|
-
node.node_info[:processor] = self.class.name
|
|
185
|
-
yield(node) if block_given?
|
|
186
|
-
node
|
|
202
|
+
elsif node.flagged(:reinit)
|
|
203
|
+
node.reinit(output_path, path.meta_info)
|
|
187
204
|
else
|
|
188
|
-
|
|
205
|
+
return node
|
|
189
206
|
end
|
|
207
|
+
node['modified_at'] = Time.now unless node['modified_at'].kind_of?(Time)
|
|
208
|
+
node.node_info[:src] = path.source_path
|
|
209
|
+
node.node_info[:creation_path] = path.path
|
|
210
|
+
node.node_info[:processor] = self.class.name
|
|
211
|
+
yield(node) if block_given?
|
|
212
|
+
node
|
|
190
213
|
end
|
|
191
214
|
|
|
192
215
|
# Return the content of the given +node+. This default +content+ method just returns +nil+.
|
|
@@ -7,8 +7,8 @@ module Webgen::SourceHandler
|
|
|
7
7
|
include Webgen::WebsiteAccess
|
|
8
8
|
include Base
|
|
9
9
|
|
|
10
|
-
# Create the node for +parent+ and +path+. If the +path+ has the name of a content processor
|
|
11
|
-
# the extension, it is preprocessed.
|
|
10
|
+
# Create the node for +parent+ and +path+. If the +path+ has the name of a content processor as
|
|
11
|
+
# the first part in the extension, it is preprocessed.
|
|
12
12
|
def create_node(parent, path)
|
|
13
13
|
if path.ext.index('.')
|
|
14
14
|
processor, *rest = path.ext.split('.')
|
|
@@ -1,24 +1,27 @@
|
|
|
1
|
-
require 'webgen/sourcehandler/base'
|
|
2
|
-
|
|
3
1
|
module Webgen::SourceHandler
|
|
4
2
|
|
|
5
3
|
# Handles directory source paths.
|
|
6
4
|
class Directory
|
|
7
5
|
|
|
8
6
|
include Base
|
|
7
|
+
include Webgen::WebsiteAccess
|
|
8
|
+
|
|
9
|
+
def initialize # :nodoc:
|
|
10
|
+
website.blackboard.add_service(:create_directories, method(:create_directories))
|
|
11
|
+
end
|
|
9
12
|
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
super(parent, path)
|
|
13
|
+
# Recursively create the directories specified in +dirname+ under +parent+ (a leading slash is
|
|
14
|
+
# ignored). The path +path+ is the path that lead to the creation of these directories.
|
|
15
|
+
def create_directories(parent, dirname, path)
|
|
16
|
+
dirname.sub(/^\//, '').split('/').each do |dir|
|
|
17
|
+
dir_path = Webgen::Path.new(File.join(parent.absolute_lcn, dir, '/'), path)
|
|
18
|
+
nodes = website.blackboard.invoke(:create_nodes, parent.tree, parent.absolute_lcn,
|
|
19
|
+
dir_path, self) do |dir_parent, dir_path|
|
|
20
|
+
node_exists?(dir_parent, dir_path) || create_node(dir_parent, dir_path)
|
|
21
|
+
end
|
|
22
|
+
parent = nodes.first
|
|
21
23
|
end
|
|
24
|
+
parent
|
|
22
25
|
end
|
|
23
26
|
|
|
24
27
|
# Return an empty string to signal that the directory should be written to the output.
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
require 'webgen/websiteaccess'
|
|
2
|
-
require 'webgen/sourcehandler/base'
|
|
3
|
-
|
|
4
1
|
module Webgen::SourceHandler
|
|
5
2
|
|
|
6
3
|
# Source handler for creating atom and/or rss feeds.
|
|
@@ -49,8 +46,7 @@ module Webgen::SourceHandler
|
|
|
49
46
|
render(Webgen::ContentProcessor::Context.new(:chain => [node])).content
|
|
50
47
|
else
|
|
51
48
|
feed = (website.cache.volatile[:sourcehandler_feed] ||= {})[node.node_info[:src]] ||= build_feed_for(node)
|
|
52
|
-
feed.feed_type
|
|
53
|
-
feed.build_xml
|
|
49
|
+
feed.build_xml(node.node_info[:feed_type], (node.node_info[:feed_type] == 'rss' ? node['rss_version'] || 2.0 : nil))
|
|
54
50
|
end
|
|
55
51
|
end
|
|
56
52
|
|
|
@@ -61,8 +57,7 @@ module Webgen::SourceHandler
|
|
|
61
57
|
|
|
62
58
|
node.tree.node_access[:alcn].values.
|
|
63
59
|
select {|node| patterns.any? {|pat| node =~ pat} && node.node_info[:page]}.
|
|
64
|
-
sort {|a,b| a['modified_at'] <=> b['modified_at']}
|
|
65
|
-
reverse[0, nr_items]
|
|
60
|
+
sort {|a,b| a['modified_at'] <=> b['modified_at']}[0, nr_items]
|
|
66
61
|
end
|
|
67
62
|
|
|
68
63
|
#######
|
|
@@ -88,13 +83,12 @@ module Webgen::SourceHandler
|
|
|
88
83
|
feed.published = (node['created_at'].kind_of?(Time) ? node['created_at'] : Time.now)
|
|
89
84
|
feed.updated = Time.now
|
|
90
85
|
feed.generator = 'webgen - Webgen::SourceHandler::Feed'
|
|
91
|
-
feed.icon = File.join(site_url, node.tree[node['icon']].path) if node['icon']
|
|
92
86
|
|
|
93
87
|
node.feed_entries.each do |entry|
|
|
94
88
|
item = FeedTools::FeedItem.new
|
|
95
89
|
item.title = entry['title']
|
|
96
90
|
item.link = File.join(site_url, entry.path)
|
|
97
|
-
item.content = entry.node_info[:page].blocks['content'].render(Webgen::ContentProcessor::Context.new(:chain => [entry])).content
|
|
91
|
+
item.content = entry.node_info[:page].blocks[node['content_block_name'] || 'content'].render(Webgen::ContentProcessor::Context.new(:chain => [entry])).content
|
|
98
92
|
item.updated = entry['modified_at']
|
|
99
93
|
item.published = entry['created_at'] if entry['created_at'].kind_of?(Time)
|
|
100
94
|
if entry['author']
|
|
@@ -107,12 +101,12 @@ module Webgen::SourceHandler
|
|
|
107
101
|
feed
|
|
108
102
|
end
|
|
109
103
|
|
|
110
|
-
# Check if the
|
|
111
|
-
#
|
|
104
|
+
# Check if the any of the nodes used by this feed +node+ have changed and then mark the node as
|
|
105
|
+
# dirty.
|
|
112
106
|
def node_changed?(node)
|
|
113
107
|
return if node.node_info[:processor] != self.class.name
|
|
114
108
|
entries = node.feed_entries
|
|
115
|
-
node.dirty
|
|
109
|
+
node.flag(:dirty) if entries.map {|n| n.absolute_lcn } != website.cache[[:sourcehandler_feed, node.node_info[:src]]] ||
|
|
116
110
|
entries.any? {|n| n.changed?}
|
|
117
111
|
end
|
|
118
112
|
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
require 'webgen/sourcehandler/base'
|
|
2
|
-
require 'webgen/websiteaccess'
|
|
3
|
-
|
|
4
1
|
module Webgen::SourceHandler
|
|
5
2
|
|
|
6
3
|
# Handles page fragment nodes and provides utility methods for parsing HTML headers and generating
|
|
@@ -53,15 +50,13 @@ module Webgen::SourceHandler
|
|
|
53
50
|
def create_fragment_nodes(sections, parent, path, in_menu, si = 1000 )
|
|
54
51
|
sections.each do |level, id, title, sub_sections|
|
|
55
52
|
node = website.blackboard.invoke(:create_nodes, parent.tree, parent.absolute_lcn,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
53
|
+
Webgen::Path.new('#' + id, path.source_path),
|
|
54
|
+
self) do |cn_parent, cn_path|
|
|
55
|
+
cn_path.meta_info['title'] = title
|
|
56
|
+
cn_path.meta_info['in_menu'] = in_menu
|
|
57
|
+
cn_path.meta_info['sort_info'] = si = si.succ
|
|
58
|
+
create_node(cn_parent, cn_path)
|
|
60
59
|
end.first
|
|
61
|
-
node['title'] = title
|
|
62
|
-
node['in_menu'] = in_menu
|
|
63
|
-
node['sort_info'] = si = si.succ
|
|
64
|
-
node.node_info[:src] = path.path
|
|
65
60
|
create_fragment_nodes(sub_sections, node, path, in_menu, si.succ)
|
|
66
61
|
end
|
|
67
62
|
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Webgen::SourceHandler
|
|
2
|
+
|
|
3
|
+
# This source handler should be used for handling nodes that are created during the write
|
|
4
|
+
# phase.
|
|
5
|
+
class Memory
|
|
6
|
+
|
|
7
|
+
include Webgen::WebsiteAccess
|
|
8
|
+
include Base
|
|
9
|
+
|
|
10
|
+
def initialize #:nodoc:
|
|
11
|
+
website.blackboard.add_listener(:node_flagged) do |node, *flags|
|
|
12
|
+
node.tree[node.node_info[:memory_source_alcn]].flag(:dirty) if node.node_info[:memory_source_alcn]
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Create a node under +parent+ for the +path+. The +source_alcn+ specified the node that creates
|
|
17
|
+
# this memory node when written. You have two options for providing the content for this node:
|
|
18
|
+
# either you set +data+ to a string (or a Webgen::Path::SourceIO object) or you provide a block
|
|
19
|
+
# which takes the created node as argument and return a string (or a Webgen::Path::SourceIO
|
|
20
|
+
# object).
|
|
21
|
+
def create_node(parent, path, source_alcn, data = nil)
|
|
22
|
+
super(parent, path) do |node|
|
|
23
|
+
node.node_info[:memory_source_alcn] = source_alcn
|
|
24
|
+
(@data ||= {})[node.absolute_lcn] = lambda { data || yield(node) }
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Return the content of the memory +node+. If the memory node was not created in this webgen
|
|
29
|
+
# run, it will be flagged for reinitialization (and therefore recreation).
|
|
30
|
+
def content(node)
|
|
31
|
+
if @data && @data[node.absolute_lcn]
|
|
32
|
+
@data[node.absolute_lcn].call
|
|
33
|
+
else
|
|
34
|
+
node.flag(:reinit)
|
|
35
|
+
nil
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
require 'pathname'
|
|
2
2
|
require 'yaml'
|
|
3
|
-
require 'webgen/sourcehandler/base'
|
|
4
|
-
require 'webgen/websiteaccess'
|
|
5
3
|
|
|
6
4
|
module Webgen::SourceHandler
|
|
7
5
|
|
|
@@ -19,7 +17,7 @@ module Webgen::SourceHandler
|
|
|
19
17
|
website.blackboard.add_listener(:before_node_created, method(:before_node_created))
|
|
20
18
|
website.blackboard.add_listener(:before_node_deleted, method(:before_node_deleted))
|
|
21
19
|
website.blackboard.add_listener(:after_node_created, method(:after_node_created))
|
|
22
|
-
self.nodes ||=
|
|
20
|
+
self.nodes ||= []
|
|
23
21
|
end
|
|
24
22
|
|
|
25
23
|
# Create a meta info node from +parent+ and +path+.
|
|
@@ -30,18 +28,18 @@ module Webgen::SourceHandler
|
|
|
30
28
|
node.node_info[mi_key] = {}
|
|
31
29
|
YAML::load(page.blocks[block_name].content).each do |key, value|
|
|
32
30
|
key = Pathname.new(key =~ /^\// ? key : File.join(parent.absolute_lcn, key)).cleanpath.to_s
|
|
33
|
-
key.chomp('/') unless key == '/'
|
|
34
31
|
node.node_info[mi_key][key] = value
|
|
35
32
|
end if page.blocks.has_key?(block_name)
|
|
36
33
|
end
|
|
37
|
-
|
|
34
|
+
|
|
35
|
+
mark_all_matched_dirty(node, :no_old_data)
|
|
36
|
+
|
|
37
|
+
website.cache.permanent[[:sh_metainfo_node_mi, node.absolute_lcn]] = {
|
|
38
38
|
:mi_paths => node.node_info[:mi_paths],
|
|
39
39
|
:mi_alcn => node.node_info[:mi_alcn]
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
self.nodes << node
|
|
42
|
+
self.nodes << node unless self.nodes.include?(node)
|
|
45
43
|
self.nodes = self.nodes.sort_by {|n| n.absolute_lcn}
|
|
46
44
|
end
|
|
47
45
|
end
|
|
@@ -59,19 +57,21 @@ module Webgen::SourceHandler
|
|
|
59
57
|
#######
|
|
60
58
|
|
|
61
59
|
# Return +true+ if any meta information for +node+ provided by +mi_node+ has changed.
|
|
62
|
-
def meta_info_changed?(mi_node, node,
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
mi_node.node_info[:mi_alcn].any?
|
|
60
|
+
def meta_info_changed?(mi_node, node, option = nil)
|
|
61
|
+
cached = website.cache.permanent[[:sh_metainfo_node_mi, mi_node.absolute_lcn]]
|
|
62
|
+
(mi_node.node_info[:mi_paths].any? do |pattern, mi|
|
|
63
|
+
Webgen::Path.match(node.node_info[:creation_path], pattern) &&
|
|
64
|
+
(option == :force || (!cached && option == :no_old_data) || mi != cached[:mi_paths][pattern])
|
|
65
|
+
end || mi_node.node_info[:mi_alcn].any? do |pattern, mi|
|
|
66
|
+
node =~ pattern && (option == :force || (!cached && option == :no_old_data) || mi != cached[:mi_alcn][pattern])
|
|
67
|
+
end)
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
# Mark all nodes that are matched by a path or an alcn specifcation in the meta info node +node+
|
|
71
71
|
# as dirty.
|
|
72
|
-
def mark_all_matched_dirty(node,
|
|
72
|
+
def mark_all_matched_dirty(node, option = nil)
|
|
73
73
|
node.tree.node_access[:alcn].each do |path, n|
|
|
74
|
-
n.dirty_meta_info
|
|
74
|
+
n.flag(:dirty_meta_info) if meta_info_changed?(node, n, option)
|
|
75
75
|
end
|
|
76
76
|
end
|
|
77
77
|
|
|
@@ -79,7 +79,7 @@ module Webgen::SourceHandler
|
|
|
79
79
|
def before_node_created(parent, path)
|
|
80
80
|
self.nodes.each do |node|
|
|
81
81
|
node.node_info[:mi_paths].each do |pattern, mi|
|
|
82
|
-
path.meta_info.update(mi) if path
|
|
82
|
+
path.meta_info.update(mi) if Webgen::Path.match(path, pattern)
|
|
83
83
|
end
|
|
84
84
|
end
|
|
85
85
|
end
|
|
@@ -96,10 +96,9 @@ module Webgen::SourceHandler
|
|
|
96
96
|
# Check if the +node+ has meta information from any meta info node and if so, if the meta info
|
|
97
97
|
# node in question has changed.
|
|
98
98
|
def node_meta_info_changed?(node)
|
|
99
|
-
return if self.nodes.include?(node)
|
|
100
99
|
self.nodes.each do |n|
|
|
101
|
-
if n.created && meta_info_changed?(n, node)
|
|
102
|
-
node.dirty_meta_info
|
|
100
|
+
if n.flagged(:created) && meta_info_changed?(n, node)
|
|
101
|
+
node.flag(:dirty_meta_info)
|
|
103
102
|
return
|
|
104
103
|
end
|
|
105
104
|
end
|
|
@@ -108,7 +107,8 @@ module Webgen::SourceHandler
|
|
|
108
107
|
# Delete the meta info node +node+ from the internal array.
|
|
109
108
|
def before_node_deleted(node)
|
|
110
109
|
return unless node.node_info[:processor] == self.class.name
|
|
111
|
-
mark_all_matched_dirty(node,
|
|
110
|
+
mark_all_matched_dirty(node, :force)
|
|
111
|
+
website.cache.permanent.delete([:sh_metainfo_node_mi, node.absolute_lcn])
|
|
112
112
|
self.nodes.delete(node)
|
|
113
113
|
end
|
|
114
114
|
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
require 'webgen/websiteaccess'
|
|
2
|
-
require 'webgen/sourcehandler/base'
|
|
3
|
-
|
|
4
1
|
module Webgen::SourceHandler
|
|
5
2
|
|
|
6
3
|
# Source handler for handling content files in Webgen Page Format.
|
|
@@ -20,24 +17,8 @@ module Webgen::SourceHandler
|
|
|
20
17
|
path.ext = 'html' if path.ext == 'page'
|
|
21
18
|
|
|
22
19
|
super(parent, path) do |node|
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
node.node_info[:sh_page_node_mi] = Webgen::Page.meta_info_from_data(path.io.data)
|
|
25
21
|
node.node_info[:page] = page
|
|
26
|
-
tmp_logger = website.logger
|
|
27
|
-
website.logger = nil # disabling logging whiling creating fragment nodes
|
|
28
|
-
|
|
29
|
-
website.cache.permanent[:page_sections] ||= {}
|
|
30
|
-
sections = if path.changed? || !website.cache.permanent[:page_sections][node.absolute_lcn]
|
|
31
|
-
website.blackboard.invoke(:parse_html_headers, render_node(node, 'content', []))
|
|
32
|
-
else
|
|
33
|
-
website.cache.permanent[:page_sections][node.absolute_lcn]
|
|
34
|
-
end
|
|
35
|
-
website.cache.permanent[:page_sections][node.absolute_lcn] = sections
|
|
36
|
-
website.blackboard.invoke(:create_fragment_nodes,
|
|
37
|
-
sections,
|
|
38
|
-
node, website.blackboard.invoke(:source_paths)[path.path],
|
|
39
|
-
node.meta_info['fragments_in_menu'])
|
|
40
|
-
website.logger = tmp_logger
|
|
41
22
|
end
|
|
42
23
|
end
|
|
43
24
|
|
|
@@ -63,13 +44,12 @@ module Webgen::SourceHandler
|
|
|
63
44
|
|
|
64
45
|
# Checks if the meta information provided by the file in Webgen Page Format changed.
|
|
65
46
|
def meta_info_changed?(node)
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
old_mi
|
|
70
|
-
new_mi =
|
|
71
|
-
|
|
72
|
-
node.dirty_meta_info = true if old_mi != new_mi
|
|
47
|
+
path = website.blackboard.invoke(:source_paths)[node.node_info[:src]]
|
|
48
|
+
return if node.node_info[:processor] != self.class.name || !path.changed?
|
|
49
|
+
|
|
50
|
+
old_mi = node.node_info[:sh_page_node_mi]
|
|
51
|
+
new_mi = Webgen::Page.meta_info_from_data(path.io.data)
|
|
52
|
+
node.flag(:dirty_meta_info) if old_mi && old_mi != new_mi
|
|
73
53
|
end
|
|
74
54
|
|
|
75
55
|
end
|