gettalong-webgen 0.5.5.20081001 → 0.5.5.20081010
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/doc/extensions.page +1 -1
- data/doc/reference_configuration.page +85 -0
- data/doc/tag/tikz.page +158 -0
- data/lib/webgen/common/sitemap.rb +2 -3
- 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/default_config.rb +8 -1
- data/lib/webgen/node.rb +49 -24
- data/lib/webgen/page.rb +25 -15
- data/lib/webgen/path.rb +20 -10
- data/lib/webgen/sourcehandler/base.rb +36 -14
- data/lib/webgen/sourcehandler/copy.rb +2 -2
- data/lib/webgen/sourcehandler/directory.rb +16 -13
- data/lib/webgen/sourcehandler/feed.rb +3 -6
- 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 +8 -12
- 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/sourcehandler.rb +83 -70
- 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 +1 -4
- 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/tag.rb +1 -0
- data/lib/webgen/tree.rb +9 -5
- data/test/test_common_sitemap.rb +4 -4
- data/test/test_contentprocessor_context.rb +1 -1
- data/test/test_contentprocessor_redcloth.rb +1 -0
- data/test/test_contentprocessor_tags.rb +1 -1
- data/test/test_node.rb +33 -13
- data/test/test_output_filesystem.rb +1 -1
- data/test/test_page.rb +13 -4
- 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 +6 -7
- 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 -7
- 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 +5 -6
- 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 +2 -7
- metadata +7 -2
@@ -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.
|
@@ -107,12 +104,12 @@ module Webgen::SourceHandler
|
|
107
104
|
feed
|
108
105
|
end
|
109
106
|
|
110
|
-
# Check if the
|
111
|
-
#
|
107
|
+
# Check if the any of the nodes used by this feed +node+ have changed and then mark the node as
|
108
|
+
# dirty.
|
112
109
|
def node_changed?(node)
|
113
110
|
return if node.node_info[:processor] != self.class.name
|
114
111
|
entries = node.feed_entries
|
115
|
-
node.dirty
|
112
|
+
node.flag(:dirty) if entries.map {|n| n.absolute_lcn } != website.cache[[:sourcehandler_feed, node.node_info[:src]]] ||
|
116
113
|
entries.any? {|n| n.changed?}
|
117
114
|
end
|
118
115
|
|
@@ -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,7 +17,7 @@ module Webgen::SourceHandler
|
|
20
17
|
path.ext = 'html' if path.ext == 'page'
|
21
18
|
|
22
19
|
super(parent, path) do |node|
|
23
|
-
|
20
|
+
node.node_info[:sh_page_node_mi] = Webgen::Page.meta_info_from_data(path.io.data)
|
24
21
|
|
25
22
|
node.node_info[:page] = page
|
26
23
|
tmp_logger = website.logger
|
@@ -35,7 +32,7 @@ module Webgen::SourceHandler
|
|
35
32
|
website.cache.permanent[:page_sections][node.absolute_lcn] = sections
|
36
33
|
website.blackboard.invoke(:create_fragment_nodes,
|
37
34
|
sections,
|
38
|
-
node, website.blackboard.invoke(:source_paths)[path.
|
35
|
+
node, website.blackboard.invoke(:source_paths)[path.source_path],
|
39
36
|
node.meta_info['fragments_in_menu'])
|
40
37
|
website.logger = tmp_logger
|
41
38
|
end
|
@@ -63,13 +60,12 @@ module Webgen::SourceHandler
|
|
63
60
|
|
64
61
|
# Checks if the meta information provided by the file in Webgen Page Format changed.
|
65
62
|
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
|
63
|
+
path = website.blackboard.invoke(:source_paths)[node.node_info[:src]]
|
64
|
+
return if node.node_info[:processor] != self.class.name || !path.changed?
|
65
|
+
|
66
|
+
old_mi = node.node_info[:sh_page_node_mi]
|
67
|
+
new_mi = Webgen::Page.meta_info_from_data(path.io.data)
|
68
|
+
node.flag(:dirty_meta_info) if old_mi && old_mi != new_mi
|
73
69
|
end
|
74
70
|
|
75
71
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
require 'uri'
|
2
2
|
require 'yaml'
|
3
|
-
require 'webgen/sourcehandler/base'
|
4
|
-
require 'webgen/websiteaccess'
|
5
3
|
|
6
4
|
module Webgen::SourceHandler
|
7
5
|
|
@@ -18,22 +16,25 @@ module Webgen::SourceHandler
|
|
18
16
|
def create_node(parent, path)
|
19
17
|
page = page_from_path(path)
|
20
18
|
nodes = []
|
21
|
-
YAML::load(page.blocks['content'].content).each do |key,
|
19
|
+
YAML::load(page.blocks['content'].content).each do |key, meta_info|
|
22
20
|
key = (key =~ /^\// ? key : File.join(parent.absolute_lcn, key))
|
23
21
|
temp_parent = create_directories(parent.tree.root, File.dirname(key), path)
|
24
22
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
output_path = temp_path.meta_info.delete('url') || key
|
23
|
+
meta_info ||= {}
|
24
|
+
meta_info['modified_at'] = path.meta_info['modified_at']
|
25
|
+
meta_info['no_output'] = true
|
26
|
+
output_path = meta_info.delete('url') || key
|
30
27
|
output_path = (URI::parse(output_path).absolute? || output_path =~ /^\// ?
|
31
28
|
output_path : File.join(temp_parent.absolute_lcn, output_path))
|
32
29
|
|
33
30
|
if key =~ /\/$/
|
34
|
-
nodes << create_directory(temp_parent, key, path,
|
31
|
+
nodes << create_directory(temp_parent, key, path, meta_info)
|
35
32
|
else
|
36
|
-
nodes
|
33
|
+
nodes += website.blackboard.invoke(:create_nodes, parent.tree, temp_parent.absolute_lcn,
|
34
|
+
Webgen::Path.new(key, path.source_path), self) do |cn_parent, cn_path|
|
35
|
+
cn_path.meta_info.update(meta_info)
|
36
|
+
super(cn_parent, cn_path, output_path)
|
37
|
+
end
|
37
38
|
end
|
38
39
|
end if page.blocks.has_key?('content')
|
39
40
|
nodes.compact
|
@@ -55,17 +56,16 @@ module Webgen::SourceHandler
|
|
55
56
|
def create_directory(parent, dir, path, meta_info = nil)
|
56
57
|
dir_handler = website.cache.instance('Webgen::SourceHandler::Directory')
|
57
58
|
website.blackboard.invoke(:create_nodes, parent.tree, parent.absolute_lcn,
|
58
|
-
Webgen::Path.new(File.join(dir, '/')),
|
59
|
+
Webgen::Path.new(File.join(dir, '/'), path.source_path),
|
59
60
|
dir_handler) do |par, temp_path|
|
60
|
-
|
61
|
-
if (
|
62
|
-
|
63
|
-
else
|
61
|
+
parent = dir_handler.node_exists?(par, temp_path)
|
62
|
+
if (parent && (parent.node_info[:src] == path.source_path) && !meta_info.nil?) ||
|
63
|
+
!parent
|
64
64
|
temp_path.meta_info.update(meta_info) if meta_info
|
65
|
-
parent
|
66
|
-
parent
|
65
|
+
parent.flag(:reinit) if parent
|
66
|
+
parent = dir_handler.create_node(par, temp_path)
|
67
67
|
end
|
68
|
-
|
68
|
+
parent
|
69
69
|
end
|
70
70
|
parent
|
71
71
|
end
|
data/lib/webgen/sourcehandler.rb
CHANGED
@@ -19,6 +19,7 @@ module Webgen
|
|
19
19
|
autoload :Virtual, 'webgen/sourcehandler/virtual'
|
20
20
|
autoload :Feed, 'webgen/sourcehandler/feed'
|
21
21
|
autoload :Sitemap, 'webgen/sourcehandler/sitemap'
|
22
|
+
autoload :Memory, 'webgen/sourcehandler/memory'
|
22
23
|
|
23
24
|
# This class is used by Website to do the actual rendering of the website. It
|
24
25
|
#
|
@@ -39,52 +40,87 @@ module Webgen
|
|
39
40
|
# Render the nodes provided in the +tree+. Before the actual rendering is done, the sources
|
40
41
|
# are checked (nodes for deleted sources are deleted, nodes for new and changed sources).
|
41
42
|
def render(tree)
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
paths = Set.new([nil])
|
47
|
-
while paths.length > 0
|
48
|
-
used_paths += (paths = Set.new(find_all_source_paths.keys) - used_paths - clean(tree))
|
49
|
-
create_nodes_from_paths(tree, paths)
|
50
|
-
website.cache.reset_volatile_cache
|
43
|
+
begin
|
44
|
+
puts "Updating tree..."
|
45
|
+
time = Benchmark.measure do
|
46
|
+
update_tree(tree)
|
51
47
|
end
|
52
|
-
|
53
|
-
puts "...done in " + ('%2.4f' % time.real) + ' seconds'
|
54
|
-
|
55
|
-
output = website.blackboard.invoke(:output_instance)
|
48
|
+
puts "...done in " + ('%2.4f' % time.real) + ' seconds'
|
56
49
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
node.dirty_meta_info = node.created = false
|
61
|
-
next if node == tree.dummy_root || !node.dirty
|
62
|
-
node.dirty = false
|
63
|
-
|
64
|
-
begin
|
65
|
-
if !node['no_output'] && (content = node.content)
|
66
|
-
puts " "*4 + name, :verbose
|
67
|
-
type = if node.is_directory?
|
68
|
-
:directory
|
69
|
-
elsif node.is_fragment?
|
70
|
-
:fragment
|
71
|
-
else
|
72
|
-
:file
|
73
|
-
end
|
74
|
-
output.write(node.path, content, type)
|
75
|
-
end
|
76
|
-
rescue
|
77
|
-
raise RuntimeError, "Error while processing <#{node.absolute_lcn}>: #{$!.message}", $!.backtrace
|
78
|
-
end
|
50
|
+
puts "Writing changed nodes..."
|
51
|
+
time = Benchmark.measure do
|
52
|
+
write_tree(tree)
|
79
53
|
end
|
80
|
-
|
81
|
-
|
54
|
+
puts "...done in " + ('%2.4f' % time.real) + ' seconds'
|
55
|
+
end while tree.node_access[:alcn].any? {|name,node| node.flagged(:created) || node.flagged(:reinit)}
|
82
56
|
end
|
83
57
|
|
84
58
|
#######
|
85
59
|
private
|
86
60
|
#######
|
87
61
|
|
62
|
+
# Update the +tree+ by creating/reinitializing all needed nodes.
|
63
|
+
def update_tree(tree)
|
64
|
+
unused_paths = Set.new
|
65
|
+
begin
|
66
|
+
used_paths = Set.new(find_all_source_paths.keys) - unused_paths
|
67
|
+
paths_to_use = Set.new
|
68
|
+
nodes_to_delete = Set.new
|
69
|
+
|
70
|
+
tree.node_access[:alcn].each do |alcn, node|
|
71
|
+
next if node == tree.dummy_root
|
72
|
+
used_paths.delete(node.node_info[:src])
|
73
|
+
|
74
|
+
deleted = !find_all_source_paths.include?(node.node_info[:src])
|
75
|
+
if deleted
|
76
|
+
nodes_to_delete << node
|
77
|
+
#TODO: delete output path
|
78
|
+
elsif (!node.flagged(:created) && find_all_source_paths[node.node_info[:src]].changed?) || node.meta_info_changed?
|
79
|
+
node.flag(:reinit)
|
80
|
+
paths_to_use << node.node_info[:src]
|
81
|
+
elsif node.changed?
|
82
|
+
# nothing to be done here
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
nodes_to_delete.each {|node| tree.delete_node(node)}
|
87
|
+
used_paths.merge(paths_to_use)
|
88
|
+
paths = create_nodes_from_paths(tree, used_paths.to_a.sort)
|
89
|
+
unused_paths.merge(used_paths - paths)
|
90
|
+
tree.node_access[:alcn].each {|name, node| tree.delete_node(node) if node.flagged(:reinit)}
|
91
|
+
website.cache.reset_volatile_cache
|
92
|
+
end until used_paths.empty?
|
93
|
+
end
|
94
|
+
|
95
|
+
# Write out all changed nodes of the +tree+.
|
96
|
+
def write_tree(tree)
|
97
|
+
output = website.blackboard.invoke(:output_instance)
|
98
|
+
|
99
|
+
tree.node_access[:alcn].select do |name, node|
|
100
|
+
use_node = (node != tree.dummy_root && node.flagged(:dirty))
|
101
|
+
node.unflag(:dirty_meta_info)
|
102
|
+
node.unflag(:created)
|
103
|
+
node.unflag(:dirty)
|
104
|
+
use_node
|
105
|
+
end.sort.each do |name, node|
|
106
|
+
next if node['no_output'] || !(content = node.content)
|
107
|
+
|
108
|
+
begin
|
109
|
+
puts " "*4 + name, :verbose
|
110
|
+
type = if node.is_directory?
|
111
|
+
:directory
|
112
|
+
elsif node.is_fragment?
|
113
|
+
:fragment
|
114
|
+
else
|
115
|
+
:file
|
116
|
+
end
|
117
|
+
output.write(node.path, content, type)
|
118
|
+
rescue
|
119
|
+
raise RuntimeError, "Error while processing <#{node.absolute_lcn}>: #{$!.message}", $!.backtrace
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
88
124
|
# Return a hash with all source paths.
|
89
125
|
def find_all_source_paths
|
90
126
|
if !defined?(@paths)
|
@@ -94,7 +130,7 @@ module Webgen
|
|
94
130
|
@paths = {}
|
95
131
|
source.paths.each do |path|
|
96
132
|
if !(website.config['sourcehandler.ignore'].any? {|pat| File.fnmatch(pat, path, File::FNM_CASEFOLD|File::FNM_DOTMATCH)})
|
97
|
-
@paths[path.
|
133
|
+
@paths[path.source_path] = path
|
98
134
|
end
|
99
135
|
end
|
100
136
|
end
|
@@ -115,16 +151,20 @@ module Webgen
|
|
115
151
|
|
116
152
|
# Use the source handlers to create nodes for the +paths+ in the +tree+.
|
117
153
|
def create_nodes_from_paths(tree, paths)
|
154
|
+
used_paths = Set.new
|
118
155
|
website.config['sourcehandler.invoke'].sort.each do |priority, shns|
|
119
156
|
shns.each do |shn|
|
120
157
|
sh = website.cache.instance(shn)
|
121
|
-
paths_for_handler(shn, paths)
|
158
|
+
handler_paths = paths_for_handler(shn, paths)
|
159
|
+
used_paths.merge(handler_paths)
|
160
|
+
handler_paths.sort {|a,b| a.path.length <=> b.path.length}.each do |path|
|
122
161
|
parent_dir = path.directory.split('/').collect {|p| Path.new(p).cn}.join('/')
|
123
162
|
parent_dir += '/' if path != '/' && parent_dir == ''
|
124
163
|
create_nodes(tree, parent_dir, path, sh)
|
125
164
|
end
|
126
165
|
end
|
127
166
|
end
|
167
|
+
used_paths
|
128
168
|
end
|
129
169
|
|
130
170
|
# Prepare everything to create nodes under the absolute lcn path +parent_path_name+ in the
|
@@ -142,7 +182,7 @@ module Webgen
|
|
142
182
|
*nodes = if block_given?
|
143
183
|
yield(parent, path)
|
144
184
|
else
|
145
|
-
source_handler.create_node(parent, path
|
185
|
+
source_handler.create_node(parent, path)
|
146
186
|
end
|
147
187
|
nodes.flatten.compact.each do |node|
|
148
188
|
website.blackboard.dispatch_msg(:after_node_created, node)
|
@@ -160,39 +200,12 @@ module Webgen
|
|
160
200
|
# take the node's path's +modified_at+ meta information into account since that changes on
|
161
201
|
# every path change.
|
162
202
|
def meta_info_changed?(node)
|
163
|
-
path = node.node_info[:
|
203
|
+
path = node.node_info[:creation_path]
|
164
204
|
old_mi = website.cache[:sourcehandler_path_mi][[path, node.node_info[:processor]]]
|
165
205
|
old_mi.delete('modified_at')
|
166
|
-
new_mi = default_meta_info(@paths[path], node.node_info[:processor])
|
206
|
+
new_mi = default_meta_info(@paths[path] || Webgen::Path.new(path), node.node_info[:processor])
|
167
207
|
new_mi.delete('modified_at')
|
168
|
-
node.dirty_meta_info
|
169
|
-
end
|
170
|
-
|
171
|
-
# Clean the +tree+ by deleting nodes which have changed or which don't have an associated
|
172
|
-
# source anymore. Return all paths for which nodes need to be created.
|
173
|
-
def clean(tree)
|
174
|
-
paths_to_delete = Set.new
|
175
|
-
paths_not_to_delete = Set.new
|
176
|
-
nodes_to_be_deleted = Set.new
|
177
|
-
tree.node_access[:alcn].each do |alcn, node|
|
178
|
-
next if node == tree.dummy_root || tree[alcn].nil?
|
179
|
-
|
180
|
-
deleted = !find_all_source_paths.include?(node.node_info[:src])
|
181
|
-
if !node.created && (deleted ||
|
182
|
-
find_all_source_paths[node.node_info[:src]].changed? ||
|
183
|
-
node.changed?)
|
184
|
-
paths_not_to_delete << node.node_info[:src]
|
185
|
-
nodes_to_be_deleted << [node, deleted]
|
186
|
-
else
|
187
|
-
paths_to_delete << node.node_info[:src]
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
nodes_to_be_deleted.each {|node, deleted| tree.delete_node(node, deleted)}
|
192
|
-
#TODO: delete output path
|
193
|
-
|
194
|
-
# source paths that should be used
|
195
|
-
paths_to_delete - paths_not_to_delete
|
208
|
+
node.flag(:dirty_meta_info) if !old_mi || old_mi != new_mi
|
196
209
|
end
|
197
210
|
|
198
211
|
end
|
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'webgen/websiteaccess'
|
2
|
-
require 'webgen/tag'
|
3
|
-
|
4
1
|
module Webgen::Tag
|
5
2
|
|
6
3
|
# Generates a breadcrumb trail for the page. This is especially useful when pages are in deep
|
@@ -60,7 +57,7 @@ module Webgen::Tag
|
|
60
57
|
|
61
58
|
if (list.map {|n| n.absolute_lcn} != cached_list) ||
|
62
59
|
list.any? {|n| (r = n.routing_node(cn.lang)) && r != node && r.meta_info_changed?}
|
63
|
-
node.dirty
|
60
|
+
node.flag(:dirty)
|
64
61
|
break
|
65
62
|
end
|
66
63
|
end
|
data/lib/webgen/tag/coderay.rb
CHANGED
data/lib/webgen/tag/date.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'webgen/websiteaccess'
|
2
|
-
require 'webgen/tag'
|
3
1
|
require 'cgi'
|
4
2
|
|
5
3
|
module Webgen::Tag
|
@@ -33,7 +31,7 @@ module Webgen::Tag
|
|
33
31
|
|
34
32
|
def node_changed?(node)
|
35
33
|
if filenames = node.node_info[:tag_includefile_filenames]
|
36
|
-
node.dirty
|
34
|
+
node.flag(:dirty) if filenames.any? {|f, mtime| File.mtime(f) > mtime}
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|