webgen 1.0.0.beta2 → 1.0.0.beta3
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +34 -1
- data/Rakefile +1 -8
- data/data/webgen/passive_sources/default.metainfo +5 -0
- data/data/webgen/passive_sources/stylesheets/api.css +284 -0
- data/data/webgen/passive_sources/templates/api.template +151 -0
- data/data/webgen/passive_sources/templates/feed.template +4 -0
- data/lib/webgen/bundle/built-in/init.rb +12 -3
- data/lib/webgen/bundle_loader.rb +8 -2
- data/lib/webgen/cli/create_command.rb +3 -1
- data/lib/webgen/cli/show_tree_command.rb +4 -3
- data/lib/webgen/content_processor.rb +2 -2
- data/lib/webgen/content_processor/blocks.rb +2 -2
- data/lib/webgen/content_processor/haml.rb +1 -1
- data/lib/webgen/content_processor/html_head.rb +5 -4
- data/lib/webgen/content_processor/kramdown.rb +3 -1
- data/lib/webgen/content_processor/r_doc.rb +16 -3
- data/lib/webgen/content_processor/sass.rb +3 -3
- data/lib/webgen/content_processor/scss.rb +1 -1
- data/lib/webgen/content_processor/tikz.rb +2 -2
- data/lib/webgen/context/html_head.rb +1 -1
- data/lib/webgen/destination/file_system.rb +2 -1
- data/lib/webgen/item_tracker/node_content.rb +4 -4
- data/lib/webgen/item_tracker/node_meta_info.rb +6 -6
- data/lib/webgen/item_tracker/nodes.rb +1 -1
- data/lib/webgen/node.rb +5 -7
- data/lib/webgen/node_finder.rb +40 -17
- data/lib/webgen/page.rb +10 -0
- data/lib/webgen/path.rb +14 -14
- data/lib/webgen/path_handler.rb +19 -13
- data/lib/webgen/path_handler/api.rb +173 -0
- data/lib/webgen/path_handler/base.rb +33 -11
- data/lib/webgen/path_handler/copy.rb +2 -27
- data/lib/webgen/path_handler/feed.rb +4 -3
- data/lib/webgen/path_handler/meta_info.rb +1 -1
- data/lib/webgen/path_handler/page_utils.rb +4 -3
- data/lib/webgen/path_handler/sitemap.rb +3 -2
- data/lib/webgen/path_handler/virtual.rb +7 -2
- data/lib/webgen/tag.rb +5 -5
- data/lib/webgen/tag/execute_command.rb +1 -1
- data/lib/webgen/tag/include_file.rb +1 -1
- data/lib/webgen/tag/link.rb +2 -2
- data/lib/webgen/tag/menu.rb +1 -1
- data/lib/webgen/tag/meta_info.rb +1 -0
- data/lib/webgen/tag/relocatable.rb +1 -1
- data/lib/webgen/tag/tikz.rb +2 -2
- data/lib/webgen/task/create_website.rb +1 -1
- data/lib/webgen/test_helper.rb +20 -16
- data/lib/webgen/tree.rb +5 -1
- data/lib/webgen/version.rb +1 -1
- data/lib/webgen/website.rb +8 -8
- data/test/webgen/content_processor/test_kramdown.rb +7 -5
- data/test/webgen/content_processor/test_sass.rb +4 -0
- data/test/webgen/content_processor/test_scss.rb +4 -0
- data/test/webgen/content_processor/test_tikz.rb +6 -2
- data/test/webgen/destination/test_file_system.rb +3 -4
- data/test/webgen/item_tracker/test_missing_node.rb +3 -3
- data/test/webgen/item_tracker/test_node_content.rb +9 -12
- data/test/webgen/item_tracker/test_node_meta_info.rb +7 -11
- data/test/webgen/item_tracker/test_nodes.rb +11 -5
- data/test/webgen/path_handler/test_api.rb +111 -0
- data/test/webgen/path_handler/test_page_utils.rb +1 -1
- data/test/webgen/source/test_file_system.rb +3 -3
- data/test/webgen/tag/test_coderay.rb +3 -4
- data/test/webgen/tag/test_meta_info.rb +3 -0
- data/test/webgen/task/test_create_website.rb +2 -2
- data/test/webgen/test_item_tracker.rb +11 -16
- data/test/webgen/test_node.rb +2 -0
- data/test/webgen/test_node_finder.rb +30 -2
- data/test/webgen/test_page.rb +8 -0
- data/test/webgen/test_source.rb +11 -18
- data/test/webgen/test_tag.rb +1 -1
- data/test/webgen/test_tree.rb +8 -8
- metadata +8 -88
- data/ChangeLog +0 -23710
- data/data/webgen/website_bundles/default/README +0 -6
- data/data/webgen/website_bundles/default/src/index.page +0 -15
- data/data/webgen/website_bundles/style/1024px/README +0 -13
- data/data/webgen/website_bundles/style/1024px/src/default.css +0 -188
- data/data/webgen/website_bundles/style/1024px/src/default.template +0 -60
- data/data/webgen/website_bundles/style/1024px/src/images/background.gif +0 -0
- data/data/webgen/website_bundles/style/andreas00/README +0 -13
- data/data/webgen/website_bundles/style/andreas00/src/default.css +0 -290
- data/data/webgen/website_bundles/style/andreas00/src/default.template +0 -60
- data/data/webgen/website_bundles/style/andreas00/src/images/bg.gif +0 -0
- data/data/webgen/website_bundles/style/andreas00/src/images/front.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas00/src/images/menubg.gif +0 -0
- data/data/webgen/website_bundles/style/andreas00/src/images/menubg2.gif +0 -0
- data/data/webgen/website_bundles/style/andreas01/README +0 -14
- data/data/webgen/website_bundles/style/andreas01/src/default.css +0 -310
- data/data/webgen/website_bundles/style/andreas01/src/default.template +0 -62
- data/data/webgen/website_bundles/style/andreas01/src/images/bg.gif +0 -0
- data/data/webgen/website_bundles/style/andreas01/src/images/front.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas01/src/print.css +0 -35
- data/data/webgen/website_bundles/style/andreas03/README +0 -14
- data/data/webgen/website_bundles/style/andreas03/src/default.css +0 -223
- data/data/webgen/website_bundles/style/andreas03/src/default.template +0 -58
- data/data/webgen/website_bundles/style/andreas03/src/images/bodybg.png +0 -0
- data/data/webgen/website_bundles/style/andreas03/src/images/contbg.png +0 -0
- data/data/webgen/website_bundles/style/andreas03/src/images/footerbg.png +0 -0
- data/data/webgen/website_bundles/style/andreas03/src/images/gradient1.png +0 -0
- data/data/webgen/website_bundles/style/andreas03/src/images/gradient2.png +0 -0
- data/data/webgen/website_bundles/style/andreas04/README +0 -15
- data/data/webgen/website_bundles/style/andreas04/src/default.css +0 -290
- data/data/webgen/website_bundles/style/andreas04/src/default.template +0 -81
- data/data/webgen/website_bundles/style/andreas04/src/images/blinkarrow.gif +0 -0
- data/data/webgen/website_bundles/style/andreas04/src/images/bodybg.png +0 -0
- data/data/webgen/website_bundles/style/andreas04/src/images/contentbg.png +0 -0
- data/data/webgen/website_bundles/style/andreas04/src/images/entrybg.png +0 -0
- data/data/webgen/website_bundles/style/andreas04/src/images/flash.gif +0 -0
- data/data/webgen/website_bundles/style/andreas04/src/images/flash2.gif +0 -0
- data/data/webgen/website_bundles/style/andreas04/src/images/globe.gif +0 -0
- data/data/webgen/website_bundles/style/andreas04/src/images/globebottom.gif +0 -0
- data/data/webgen/website_bundles/style/andreas04/src/images/linkarrow.gif +0 -0
- data/data/webgen/website_bundles/style/andreas04/src/images/menuhover.png +0 -0
- data/data/webgen/website_bundles/style/andreas05/README +0 -14
- data/data/webgen/website_bundles/style/andreas05/src/default.css +0 -33
- data/data/webgen/website_bundles/style/andreas05/src/default.template +0 -40
- data/data/webgen/website_bundles/style/andreas05/src/images/bodybg.gif +0 -0
- data/data/webgen/website_bundles/style/andreas05/src/images/front.png +0 -0
- data/data/webgen/website_bundles/style/andreas06/README +0 -14
- data/data/webgen/website_bundles/style/andreas06/src/default.css +0 -356
- data/data/webgen/website_bundles/style/andreas06/src/default.template +0 -70
- data/data/webgen/website_bundles/style/andreas06/src/images/bodybg.gif +0 -0
- data/data/webgen/website_bundles/style/andreas06/src/images/boxbg.gif +0 -0
- data/data/webgen/website_bundles/style/andreas06/src/images/greypx.gif +0 -0
- data/data/webgen/website_bundles/style/andreas06/src/images/header.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas06/src/images/innerbg.gif +0 -0
- data/data/webgen/website_bundles/style/andreas06/src/images/leaves.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas06/src/images/tabs.gif +0 -0
- data/data/webgen/website_bundles/style/andreas07/README +0 -15
- data/data/webgen/website_bundles/style/andreas07/src/browserfix.css +0 -7
- data/data/webgen/website_bundles/style/andreas07/src/default.css +0 -92
- data/data/webgen/website_bundles/style/andreas07/src/default.template +0 -42
- data/data/webgen/website_bundles/style/andreas07/src/images/bodybg.gif +0 -0
- data/data/webgen/website_bundles/style/andreas07/src/images/sidebarbg.gif +0 -0
- data/data/webgen/website_bundles/style/andreas08/README +0 -14
- data/data/webgen/website_bundles/style/andreas08/src/default.css +0 -224
- data/data/webgen/website_bundles/style/andreas08/src/default.template +0 -51
- data/data/webgen/website_bundles/style/andreas09/README +0 -14
- data/data/webgen/website_bundles/style/andreas09/src/default.css +0 -308
- data/data/webgen/website_bundles/style/andreas09/src/default.template +0 -68
- data/data/webgen/website_bundles/style/andreas09/src/images/bodybg-black.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas09/src/images/bodybg-green.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas09/src/images/bodybg-orange.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas09/src/images/bodybg-purple.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas09/src/images/bodybg-red.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas09/src/images/bodybg.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas09/src/images/footerbg.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas09/src/images/menuhover-black.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas09/src/images/menuhover-green.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas09/src/images/menuhover-orange.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas09/src/images/menuhover-purple.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas09/src/images/menuhover-red.jpg +0 -0
- data/data/webgen/website_bundles/style/andreas09/src/images/menuhover.jpg +0 -0
- data/data/webgen/website_bundles/style/simple/README +0 -6
- data/data/webgen/website_bundles/style/simple/src/default.css +0 -84
- data/data/webgen/website_bundles/style/simple/src/default.template +0 -36
@@ -14,33 +14,8 @@ module Webgen
|
|
14
14
|
|
15
15
|
# Create the node for +path+.
|
16
16
|
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
# * If the pipeline meta info key is specified, it is used.
|
20
|
-
#
|
21
|
-
# * If the +path+ has the names of content processors as parts in the file extension, all
|
22
|
-
# extension parts until the first non-content processor part will be used for the pipeline
|
23
|
-
# and removed from the extension.
|
24
|
-
#
|
25
|
-
# If the last extension part is a file extension registered with a content processor (using
|
26
|
-
# the :ext_map facility), the corresponding content processor is appended to the pipeline
|
27
|
-
# and the post-process file extension name is used.
|
28
|
-
#
|
29
|
-
# Here are some examples:
|
30
|
-
#
|
31
|
-
# * pipeline = ['erb'] → only erb is used, extension is not modified
|
32
|
-
#
|
33
|
-
# * path = 'test.erb.kramdown.html', no pipeline → pipeline is set to ['erb', 'kramdown'] and
|
34
|
-
# path extension is changed to '.html', ie. path = 'test.html'
|
35
|
-
#
|
36
|
-
# * path = 'test.erb.kramdown.unknown.html', no pipeline → pipeline is set ['erb', 'kramdown']
|
37
|
-
# and path extension is changed to 'unknown.html', ie. path = 'test.unknown.html'
|
38
|
-
#
|
39
|
-
# * path = 'test.erb.sass', no pipeline → pipeline is set to ['erb', 'sass'] and path
|
40
|
-
# extension is changed to '.css', ie. path = 'test.css'
|
41
|
-
#
|
42
|
-
# * path = 'test.sass', no pipeline → pipeline is set to ['sass'] and path extension is
|
43
|
-
# changed to '.css', ie. path = 'test.css'
|
17
|
+
# See the user documentation for detailed information about how the content processor pipeline
|
18
|
+
# can be specified.
|
44
19
|
def create_nodes(path)
|
45
20
|
if !path.meta_info.has_key?('pipeline')
|
46
21
|
pipeline = []
|
@@ -58,17 +58,18 @@ module Webgen
|
|
58
58
|
def create_nodes(path, blocks)
|
59
59
|
if MANDATORY_INFOS.any? {|t| path.meta_info[t].nil?}
|
60
60
|
raise Webgen::NodeCreationError.new("At least one of #{MANDATORY_INFOS.join('/')} is missing",
|
61
|
-
|
61
|
+
"path_handler.feed", path)
|
62
62
|
end
|
63
63
|
if !['atom', 'rss'].include?(path['version'])
|
64
64
|
raise Webgen::NodeCreationError.new("Invalid version '#{path['version']}' for feed path specified, only atom and rss allowed",
|
65
|
-
|
65
|
+
"path_handler.feed", path)
|
66
66
|
end
|
67
67
|
|
68
68
|
path.ext = path['version']
|
69
69
|
path['dest_path'] = '<parent><basename>(.<lang>)<ext>'
|
70
70
|
path['cn'] = '<basename><ext>'
|
71
|
-
|
71
|
+
path['node_class'] = Node.to_s
|
72
|
+
create_node(path) do |node|
|
72
73
|
set_blocks(node, blocks)
|
73
74
|
node.meta_info['link'] ||= node.parent.alcn
|
74
75
|
@website.ext.item_tracker.add(node, :nodes, :node_finder_option_set,
|
@@ -50,7 +50,7 @@ module Webgen
|
|
50
50
|
end
|
51
51
|
entries
|
52
52
|
rescue Exception => e
|
53
|
-
raise Webgen::NodeCreationError.new("Could not parse block '#{block_name}': #{e.message}",
|
53
|
+
raise Webgen::NodeCreationError.new("Could not parse block '#{block_name}': #{e.message}", "path_handler.meta_info")
|
54
54
|
end
|
55
55
|
|
56
56
|
# Update already existing nodes with meta information from the given meta info node.
|
@@ -35,7 +35,7 @@ module Webgen
|
|
35
35
|
end
|
36
36
|
|
37
37
|
content_processor = context.website.ext.content_processor
|
38
|
-
context.website.ext.item_tracker.add(context.dest_node, :node_content,
|
38
|
+
context.website.ext.item_tracker.add(context.dest_node, :node_content, self)
|
39
39
|
|
40
40
|
context.content = blocks[name].dup
|
41
41
|
context[:block_name] = name
|
@@ -123,7 +123,8 @@ module Webgen
|
|
123
123
|
end
|
124
124
|
|
125
125
|
|
126
|
-
def create_node(path
|
126
|
+
def create_node(path) #:nodoc:
|
127
|
+
path['node_class'] ||= Node.to_s
|
127
128
|
super
|
128
129
|
end
|
129
130
|
|
@@ -139,7 +140,7 @@ module Webgen
|
|
139
140
|
begin
|
140
141
|
page = Webgen::Page.from_data(path.data)
|
141
142
|
rescue Webgen::Page::FormatError => e
|
142
|
-
raise Webgen::Error.new("Error reading source path: #{e.message}",
|
143
|
+
raise Webgen::Error.new("Error reading source path: #{e.message}", nil, path)
|
143
144
|
end
|
144
145
|
blocks = page.meta_info.delete('blocks') || {}
|
145
146
|
path.meta_info.merge!(page.meta_info)
|
@@ -34,11 +34,12 @@ module Webgen
|
|
34
34
|
def create_nodes(path, blocks)
|
35
35
|
if MANDATORY_INFOS.any? {|t| path.meta_info[t].nil?}
|
36
36
|
raise Webgen::NodeCreationError.new("At least one of #{MANDATORY_INFOS.join('/')} is missing",
|
37
|
-
|
37
|
+
"path_handler.sitemap", path)
|
38
38
|
end
|
39
39
|
|
40
40
|
path.ext = 'xml'
|
41
|
-
|
41
|
+
path['node_class'] = Node.to_s
|
42
|
+
create_node(path) do |node|
|
42
43
|
set_blocks(node, blocks)
|
43
44
|
node.node_info[:entries] = {:flatten => true, :and => node['entries']}
|
44
45
|
@website.ext.item_tracker.add(node, :nodes, :node_finder_option_set,
|
@@ -32,8 +32,13 @@ module Webgen
|
|
32
32
|
parent_path = create_directories(File.dirname(key), 'modified_at' => meta_info['modified_at'])
|
33
33
|
|
34
34
|
dest_path = meta_info.delete('dest_path') || key
|
35
|
-
dest_path =
|
36
|
-
|
35
|
+
dest_path = if URI::parse(dest_path).absolute?
|
36
|
+
dest_path
|
37
|
+
elsif dest_path =~ /^\//
|
38
|
+
"webgen:#{dest_path}"
|
39
|
+
else
|
40
|
+
"webgen:#{File.join(parent_path, dest_path)}"
|
41
|
+
end
|
37
42
|
meta_info['dest_path'] = dest_path
|
38
43
|
entry_path = Webgen::Path.new(key, meta_info)
|
39
44
|
|
data/lib/webgen/tag.rb
CHANGED
@@ -160,16 +160,16 @@ module Webgen
|
|
160
160
|
result, process_output = tdata.object.call(tag, body, context)
|
161
161
|
result = context.website.ext.content_processor.call('tags', context.clone(:content => result)).content if process_output
|
162
162
|
else
|
163
|
-
raise Webgen::RenderError.new("No tag processor for '#{tag}' found",
|
163
|
+
raise Webgen::RenderError.new("No tag processor for '#{tag}' found", 'tag',
|
164
164
|
context.dest_node, context.ref_node)
|
165
165
|
end
|
166
166
|
result
|
167
167
|
rescue Webgen::Error => e
|
168
168
|
e.path = context.dest_node if e.path.to_s.empty?
|
169
|
+
e.location = "tag.#{tag}" unless e.location
|
169
170
|
raise
|
170
171
|
rescue Exception => e
|
171
|
-
raise Webgen::RenderError.new(e,
|
172
|
-
context.dest_node, context.ref_node)
|
172
|
+
raise Webgen::RenderError.new(e, "tag.#{tag}", context.dest_node, context.ref_node)
|
173
173
|
end
|
174
174
|
|
175
175
|
# See Webgen::Utils::TagParser#replace_tags.
|
@@ -190,11 +190,11 @@ module Webgen
|
|
190
190
|
when NilClass then {}
|
191
191
|
else
|
192
192
|
raise Webgen::RenderError.new("Invalid parameter type (#{params.class})",
|
193
|
-
|
193
|
+
"tag", context.dest_node, context.ref_node)
|
194
194
|
end
|
195
195
|
|
196
196
|
if !tdata.mandatory.all? {|k| values.has_key?(k)}
|
197
|
-
raise Webgen::RenderError.new("Not all mandatory parameters set",
|
197
|
+
raise Webgen::RenderError.new("Not all mandatory parameters set", "tag", context.dest_node, context.ref_node)
|
198
198
|
end
|
199
199
|
config = context.website.config.dup
|
200
200
|
config.set_values(values)
|
@@ -19,7 +19,7 @@ module Webgen
|
|
19
19
|
output = `#{command} 2> #{BIT_BUCKET}`
|
20
20
|
if $?.exitstatus != 0
|
21
21
|
raise Webgen::RenderError.new("Command '#{command}' has return value != 0: #{output}",
|
22
|
-
|
22
|
+
"tag.#{tag}", context.dest_node, context.ref_node)
|
23
23
|
end
|
24
24
|
output = CGI::escapeHTML(output) if context[:config]['tag.execute_command.escape_html']
|
25
25
|
[output, context[:config]['tag.execute_command.process_output']]
|
@@ -16,7 +16,7 @@ module Webgen
|
|
16
16
|
filename = File.join(context.website.directory, filename) unless filename =~ /^(\/|\w:)/
|
17
17
|
if !File.exists?(filename)
|
18
18
|
raise Webgen::RenderError.new("File '#{filename}' cannot be included because it does not exist",
|
19
|
-
|
19
|
+
"tag.#{tag}", context.dest_node, context.ref_node)
|
20
20
|
end
|
21
21
|
|
22
22
|
content = File.read(filename)
|
data/lib/webgen/tag/link.rb
CHANGED
@@ -10,14 +10,14 @@ module Webgen
|
|
10
10
|
def self.call(tag, body, context)
|
11
11
|
path = context[:config]['tag.link.path'].to_s
|
12
12
|
if (dest_node = context.ref_node.resolve(path, context.dest_node.lang, true))
|
13
|
-
context.website.ext.item_tracker.add(context.dest_node, :node_meta_info, dest_node
|
13
|
+
context.website.ext.item_tracker.add(context.dest_node, :node_meta_info, dest_node)
|
14
14
|
context.dest_node.link_to(dest_node, context.content_node.lang, context[:config]['tag.link.attr'])
|
15
15
|
else
|
16
16
|
''
|
17
17
|
end
|
18
18
|
rescue URI::InvalidURIError => e
|
19
19
|
raise Webgen::RenderError.new("Error while parsing path '#{path}': #{e.message}",
|
20
|
-
|
20
|
+
"tag.#{tag}", context.dest_node, context.ref_node)
|
21
21
|
end
|
22
22
|
|
23
23
|
end
|
data/lib/webgen/tag/menu.rb
CHANGED
@@ -30,7 +30,7 @@ module Webgen
|
|
30
30
|
def self.menu_item_details(dest_node, node, lang, level, has_submenu)
|
31
31
|
styles = ['webgen-menu-level' + level.to_s]
|
32
32
|
styles << 'webgen-menu-submenu' if has_submenu
|
33
|
-
styles << 'webgen-menu-submenu-inhierarchy' if
|
33
|
+
styles << 'webgen-menu-submenu-inhierarchy' if node.is_ancestor_of?(dest_node)
|
34
34
|
styles << 'webgen-menu-item-selected' if node == dest_node
|
35
35
|
style = "class=\"#{styles.join(' ')}\"" if styles.length > 0
|
36
36
|
|
data/lib/webgen/tag/meta_info.rb
CHANGED
@@ -9,6 +9,7 @@ module Webgen
|
|
9
9
|
|
10
10
|
# Treat +tag+ as a meta information key and return its value from the content node.
|
11
11
|
def self.call(tag, body, context)
|
12
|
+
tag = context[:config]['tag.meta_info.mi'] if tag == 'meta_info'
|
12
13
|
output = ''
|
13
14
|
if tag == 'lang'
|
14
15
|
output = context.content_node.lang
|
@@ -46,7 +46,7 @@ module Webgen
|
|
46
46
|
end
|
47
47
|
|
48
48
|
if dest_node
|
49
|
-
context.website.ext.item_tracker.add(context.dest_node, :node_meta_info, dest_node
|
49
|
+
context.website.ext.item_tracker.add(context.dest_node, :node_meta_info, dest_node)
|
50
50
|
context.dest_node.route_to(dest_node) + fragment
|
51
51
|
else
|
52
52
|
''
|
data/lib/webgen/tag/tikz.rb
CHANGED
@@ -15,7 +15,6 @@ module Webgen
|
|
15
15
|
path = Webgen::Path.new(path)
|
16
16
|
|
17
17
|
add_tikz_options!(path, context)
|
18
|
-
|
19
18
|
node = context.website.ext.path_handler.create_secondary_nodes(path, body, context.ref_node.alcn).first
|
20
19
|
|
21
20
|
attrs = {'alt' => ''}.merge(context[:config]['tag.tikz.img_attr']).collect do |name, value|
|
@@ -27,7 +26,8 @@ module Webgen
|
|
27
26
|
# Add all needed options for Webgen::ContentProcessor::Tikz to the given path.
|
28
27
|
def self.add_tikz_options!(path, context)
|
29
28
|
%w[content_processor.tikz.resolution content_processor.tikz.transparent
|
30
|
-
content_processor.tikz.libraries content_processor.tikz.opts
|
29
|
+
content_processor.tikz.libraries content_processor.tikz.opts
|
30
|
+
content_processor.tikz.template].each do |opt|
|
31
31
|
path.meta_info[opt] = context[:config][opt]
|
32
32
|
end
|
33
33
|
path.meta_info['pipeline'] = 'tikz'
|
@@ -67,7 +67,7 @@ module Webgen
|
|
67
67
|
ws = Webgen::Website.new(tmpdir) do |ws|
|
68
68
|
ws.config['sources'] = [['/', :file_system, File.join(Webgen::Utils.data_dir, 'basic_website_template')]]
|
69
69
|
if template
|
70
|
-
ws.config['sources']
|
70
|
+
ws.config['sources'].unshift(['/', :file_system, website.ext.task.data(:create_website)[:templates][template]])
|
71
71
|
end
|
72
72
|
ws.config['destination'] = [:file_system, File.expand_path(website.directory)]
|
73
73
|
ws.ext.path_handler.registered_extensions.each do |name, data|
|
data/lib/webgen/test_helper.rb
CHANGED
@@ -4,6 +4,7 @@ require 'minitest/autorun'
|
|
4
4
|
require 'ostruct'
|
5
5
|
require 'tmpdir'
|
6
6
|
require 'stringio'
|
7
|
+
require 'fileutils'
|
7
8
|
require 'webgen/logger'
|
8
9
|
|
9
10
|
require 'webgen/blackboard'
|
@@ -66,7 +67,7 @@ module Webgen
|
|
66
67
|
@logio.string = ''
|
67
68
|
end
|
68
69
|
|
69
|
-
# Creates a basic
|
70
|
+
# Creates a basic stub website that is accessible via @website with the following methods:
|
70
71
|
#
|
71
72
|
# [@website.config]
|
72
73
|
# The given config object or {} if none specified
|
@@ -90,19 +91,22 @@ module Webgen
|
|
90
91
|
# [@website.tree]
|
91
92
|
# Webgen::Tree instance
|
92
93
|
def setup_website(config = {})
|
93
|
-
@website =
|
94
|
-
@website.
|
95
|
-
directory = Dir::Tmpname.create("test-webgen-website") {|path| raise Errno::EEXIST if File.directory?(path)}
|
96
|
-
@website.
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
94
|
+
@website = OpenStruct.new
|
95
|
+
@website.config = config
|
96
|
+
@website.directory = Dir::Tmpname.create("test-webgen-website") {|path| raise Errno::EEXIST if File.directory?(path)}
|
97
|
+
@website.define_singleton_method(:tmpdir) do |path='', create=false|
|
98
|
+
tmp = File.join(self.directory, 'tmp')
|
99
|
+
FileUtils.mkdir_p(tmp) if create
|
100
|
+
File.join(tmp, path)
|
101
|
+
end
|
102
|
+
@website.ext = OpenStruct.new
|
103
|
+
@website.blackboard = Webgen::Blackboard.new
|
104
|
+
@website.cache = Webgen::Cache.new
|
101
105
|
@logio = StringIO.new
|
102
|
-
@website.
|
103
|
-
@website.
|
106
|
+
@website.logger = Webgen::Logger.new(@logio)
|
107
|
+
@website.tree = Webgen::Tree.new(@website)
|
104
108
|
@website.ext.item_tracker = Object.new
|
105
|
-
|
109
|
+
@website.ext.item_tracker.define_singleton_method(:add) {|*args|}
|
106
110
|
end
|
107
111
|
|
108
112
|
# Adds the following nodes (showing alcn=dest_path, title, other meta info) to the tree which
|
@@ -111,7 +115,7 @@ module Webgen
|
|
111
115
|
# /
|
112
116
|
# /file.en.html 'file en' sort_info=3
|
113
117
|
# /file.en.html#frag 'frag'
|
114
|
-
# /file.en.html#nested 'fragnested'
|
118
|
+
# /file.en.html#nested 'fragnested' routing_path="/routed.html"
|
115
119
|
# /file.de.html 'file de' sort_info=5
|
116
120
|
# /file.de.html#frag 'frag'
|
117
121
|
# /other.html 'other'
|
@@ -130,7 +134,7 @@ module Webgen
|
|
130
134
|
|
131
135
|
file_en = Webgen::Node.new(root, 'file.html', '/file.en.html', {'lang' => 'en', 'title' => 'file en', 'sort_info' => 3})
|
132
136
|
frag_en = Webgen::Node.new(file_en, '#frag', '/file.en.html#frag', {'title' => 'frag'})
|
133
|
-
Webgen::Node.new(frag_en, '#nested', '/file.en.html#nested', {'title' => 'fragnested'})
|
137
|
+
Webgen::Node.new(frag_en, '#nested', '/file.en.html#nested', {'title' => 'fragnested', 'routing_path' => '/routed.html'})
|
134
138
|
file_de = Webgen::Node.new(root, 'file.html', '/file.de.html', {'lang' => 'de', 'title' => 'file de', 'sort_info' => 5})
|
135
139
|
Webgen::Node.new(file_de, '#frag', '/file.de.html#frag', {'title' => 'frag'})
|
136
140
|
|
@@ -158,8 +162,8 @@ module Webgen
|
|
158
162
|
# node that responds to :alcn with '/test'.
|
159
163
|
def setup_context
|
160
164
|
setup_website
|
161
|
-
node =
|
162
|
-
node.
|
165
|
+
node = Object.new
|
166
|
+
node.define_singleton_method(:alcn) { '/test' }
|
163
167
|
@context = Webgen::Context.new(@website, :chain => [node], :doit => 'hallo')
|
164
168
|
end
|
165
169
|
|
data/lib/webgen/tree.rb
CHANGED
@@ -35,6 +35,11 @@ module Webgen
|
|
35
35
|
@dummy_root.children.first
|
36
36
|
end
|
37
37
|
|
38
|
+
# Access a node via its +:alcn+.
|
39
|
+
def [](path)
|
40
|
+
@node_access[:alcn][path]
|
41
|
+
end
|
42
|
+
|
38
43
|
# Access a node via a +path+ of a specific +type+.
|
39
44
|
#
|
40
45
|
# If type is +:alcn+ (default) then +path+ has to be an absolute localized canonical name, if
|
@@ -51,7 +56,6 @@ module Webgen
|
|
51
56
|
raise ArgumentError, "Unknown type '#{type}' for resolving path <#{path}>"
|
52
57
|
end
|
53
58
|
end
|
54
|
-
alias_method :[], :node
|
55
59
|
|
56
60
|
# Return the node representing the given +path+ which can be an alcn/acn/destination path (name
|
57
61
|
# resolution is done in the specified order). The path has to be absolute, i.e. starting with a
|
data/lib/webgen/version.rb
CHANGED
data/lib/webgen/website.rb
CHANGED
@@ -181,24 +181,24 @@ module Webgen
|
|
181
181
|
return if config['website.dry_run']
|
182
182
|
cache_data = [@cache.dump, Webgen::VERSION]
|
183
183
|
if config['website.cache'].first == :file
|
184
|
-
File.open(cache_file, 'wb') {|f| Marshal.dump(cache_data, f)}
|
184
|
+
File.open(cache_file(true), 'wb') {|f| Marshal.dump(cache_data, f)}
|
185
185
|
else
|
186
186
|
config['website.cache'][1] = Marshal.dump(cache_data)
|
187
187
|
end
|
188
188
|
end
|
189
189
|
|
190
190
|
# The full path of the cache filename.
|
191
|
-
def cache_file
|
192
|
-
tmpdir(config['website.cache'].last)
|
191
|
+
def cache_file(create_dir = false)
|
192
|
+
tmpdir(config['website.cache'].last, create_dir)
|
193
193
|
end
|
194
194
|
private :cache_file
|
195
195
|
|
196
196
|
# Append the path to the website's temporary directory and return the full path to it.
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
197
|
+
#
|
198
|
+
# Note that the temporary directory is only created if the +create+ parameter is set to true.
|
199
|
+
def tmpdir(path = '', create = false)
|
200
|
+
@_tmpdir = File.absolute_path(config['website.tmpdir'], @directory) unless defined?(@_tmpdir)
|
201
|
+
FileUtils.mkdir_p(@_tmpdir) if create
|
202
202
|
File.join(@_tmpdir, path)
|
203
203
|
end
|
204
204
|
|
@@ -16,14 +16,18 @@ class TestContentProcessorKramdown < MiniTest::Unit::TestCase
|
|
16
16
|
@website.config['content_processor.kramdown.handle_links'] = true
|
17
17
|
@website.config['content_processor.kramdown.ignore_unknown_fragments'] = false
|
18
18
|
|
19
|
-
@website.ext.
|
20
|
-
@website.ext.tag
|
21
|
-
|
19
|
+
@website.ext.link_definitions = {'hallo' => ['/hello.html', 'Hello you']}
|
20
|
+
@website.ext.tag = Object.new
|
21
|
+
@website.ext.tag.define_singleton_method(:call) {|*args| 'hello.en.html'}
|
22
22
|
|
23
23
|
# test normal invocation
|
24
24
|
@context.content = '# header'
|
25
25
|
assert_equal("<h1 id=\"header\">header</h1>\n", cp.call(@context).content)
|
26
26
|
|
27
|
+
# test usage of link definitions
|
28
|
+
@context.content = 'Link [hallo]'
|
29
|
+
assert_equal("<p>Link <a href=\"hello.en.html\" title=\"Hello you\">hallo</a></p>\n", cp.call(@context).content)
|
30
|
+
|
27
31
|
# test automatic handling of links
|
28
32
|
@website.config['content_processor.kramdown.handle_links'] = true
|
29
33
|
@context.content = 'Link [test](hello.html)'
|
@@ -42,8 +46,6 @@ class TestContentProcessorKramdown < MiniTest::Unit::TestCase
|
|
42
46
|
cp.call(@context)
|
43
47
|
assert_equal("<p>{::comment}</p>\n", @context.content)
|
44
48
|
assert_log_match(/No stop tag for extension 'comment' found/)
|
45
|
-
|
46
|
-
@website.ext.tag.verify
|
47
49
|
end
|
48
50
|
|
49
51
|
end
|