webgen 1.0.0.beta2 → 1.0.0.beta3
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/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
|
@@ -44,7 +44,11 @@
|
|
|
44
44
|
<title><%= h(context.node['title']) %></title>
|
|
45
45
|
<link><%= context.node.feed_link %>"</link>
|
|
46
46
|
<description><%= h(context.node['description']) %></description>
|
|
47
|
+
<% if context.node['created_at'].kind_of?(Time) %>
|
|
48
|
+
<pubdate><%= context.node['created_at'].rfc822 %></pubdate>
|
|
49
|
+
<% else %>
|
|
47
50
|
<pubDate><%= Time.now.rfc822 %></pubDate>
|
|
51
|
+
<% end %>
|
|
48
52
|
<lastBuildDate><%= Time.now.rfc822 %></lastBuildDate>
|
|
49
53
|
<generator>webgen - Webgen::PathHandler::Feed</generator>
|
|
50
54
|
|
|
@@ -153,8 +153,8 @@ item_tracker.register('NodeContent')
|
|
|
153
153
|
|
|
154
154
|
item_tracker.register('NodeMetaInfo')
|
|
155
155
|
website.blackboard.add_listener(:after_node_created) do |node|
|
|
156
|
-
item_tracker.add(node, :node_meta_info, node
|
|
157
|
-
item_tracker.add(node, :node_meta_info, node
|
|
156
|
+
item_tracker.add(node, :node_meta_info, node)
|
|
157
|
+
item_tracker.add(node, :node_meta_info, node, Webgen::ItemTracker::NodeMetaInfo::CONTENT_MODIFICATION_KEY)
|
|
158
158
|
end
|
|
159
159
|
|
|
160
160
|
item_tracker.register('Nodes')
|
|
@@ -169,11 +169,18 @@ website.blackboard.add_listener(:node_resolution_failed) do |path, lang|
|
|
|
169
169
|
end
|
|
170
170
|
end
|
|
171
171
|
|
|
172
|
+
########################################################################
|
|
173
|
+
# The link definitions extension
|
|
174
|
+
website.ext.link_definitions = {}
|
|
175
|
+
|
|
176
|
+
|
|
172
177
|
########################################################################
|
|
173
178
|
# Everything related to the node finder extension
|
|
174
179
|
require 'webgen/node_finder'
|
|
175
180
|
|
|
176
181
|
website.ext.node_finder = Webgen::NodeFinder.new(website)
|
|
182
|
+
option('node_finder.option_sets', {},
|
|
183
|
+
'Node finder option sets that can be referenced by name')
|
|
177
184
|
|
|
178
185
|
|
|
179
186
|
########################################################################
|
|
@@ -206,7 +213,6 @@ option('path_handler.default_template', 'default.template',
|
|
|
206
213
|
website.ext.path_handler = path_handler = Webgen::PathHandler.new(website)
|
|
207
214
|
|
|
208
215
|
# handlers are registered in invocation order
|
|
209
|
-
|
|
210
216
|
path_handler.register('Directory')
|
|
211
217
|
path_handler.register('MetaInfo', :patterns => ['/**/metainfo', '/**/*.metainfo'])
|
|
212
218
|
path_handler.register('Template')
|
|
@@ -215,6 +221,7 @@ path_handler.register('Copy')
|
|
|
215
221
|
path_handler.register('Feed')
|
|
216
222
|
path_handler.register('Sitemap')
|
|
217
223
|
path_handler.register('Virtual')
|
|
224
|
+
path_handler.register('Api')
|
|
218
225
|
|
|
219
226
|
|
|
220
227
|
########################################################################
|
|
@@ -260,6 +267,8 @@ option('tag.date.format', '%Y-%m-%d %H:%M:%S',
|
|
|
260
267
|
tag.register('MetaInfo', :names => ['meta_info', :default])
|
|
261
268
|
option('tag.meta_info.escape_html', true,
|
|
262
269
|
'Special HTML characters in the output will be escaped if true', &true_or_false)
|
|
270
|
+
option('tag.meta_info.mi', nil,
|
|
271
|
+
'The name of the meta information that should be output', &is_string)
|
|
263
272
|
|
|
264
273
|
tag.register('Relocatable', :names => ['relocatable', 'r'], :mandatory => ['path'])
|
|
265
274
|
option('tag.relocatable.path', nil,
|
data/lib/webgen/bundle_loader.rb
CHANGED
|
@@ -44,11 +44,17 @@ module Webgen
|
|
|
44
44
|
|
|
45
45
|
# Loads all bundles that are marked for auto-loading.
|
|
46
46
|
def load_autoload_bundles
|
|
47
|
-
Gem::Specification.map {|s| s.name }.uniq.
|
|
47
|
+
bundles = Gem::Specification.map {|s| s.name }.uniq.map do |gem_name|
|
|
48
48
|
md = /^webgen-(.*)-bundle$/.match(gem_name)
|
|
49
49
|
next unless md
|
|
50
|
+
md[1]
|
|
51
|
+
end.compact
|
|
50
52
|
|
|
51
|
-
|
|
53
|
+
bundles += $LOAD_PATH.map do |path|
|
|
54
|
+
Dir[File.join(path, 'webgen/bundle', '*')].map {|d| File.basename(d)}
|
|
55
|
+
end.flatten.compact
|
|
56
|
+
|
|
57
|
+
bundles.each do |bundle_name|
|
|
52
58
|
file = resolve_init_file(bundle_name)
|
|
53
59
|
next unless file
|
|
54
60
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
2
|
|
|
3
3
|
require 'webgen/cli/utils'
|
|
4
|
+
require 'tmpdir'
|
|
4
5
|
|
|
5
6
|
module Webgen
|
|
6
7
|
module CLI
|
|
@@ -48,8 +49,9 @@ DESC
|
|
|
48
49
|
raise OptionParser::MissingArgument.new('DIR') if args.length == 0
|
|
49
50
|
Webgen::Website.new(args[0], Webgen::CLI::Logger.new) do |website|
|
|
50
51
|
website.logger.verbose = commandparser.verbose
|
|
52
|
+
website.config['website.tmpdir'] = Dir.tmpdir
|
|
51
53
|
end.execute_task(:create_website, @template)
|
|
52
|
-
puts "Created a new webgen website in <#{args[0]}>" + (@template ? "using the '#{template}' template" : '')
|
|
54
|
+
puts "Created a new webgen website in <#{args[0]}>" + (@template ? " using the '#{@template}' template" : '')
|
|
53
55
|
rescue Webgen::Task::CreateWebsite::Error => e
|
|
54
56
|
puts "An error occured while creating the website: #{e.message}"
|
|
55
57
|
end
|
|
@@ -56,10 +56,11 @@ DESC
|
|
|
56
56
|
children.sort {|a,b| a.alcn <=> b.alcn}.map do |node|
|
|
57
57
|
sub = collect_data(node.children, selector)
|
|
58
58
|
if sub.length > 0 ||
|
|
59
|
-
((selector.nil? || node.
|
|
59
|
+
((selector.nil? || node.alcn.include?(selector)) &&
|
|
60
60
|
((!node.is_fragment? || @show_fragments) &&
|
|
61
61
|
(!node['passive'] || commandparser.website.ext.item_tracker.node_referenced?(node))))
|
|
62
62
|
data = [@use_alcn ? node.alcn : node.lcn]
|
|
63
|
+
data << node.alcn
|
|
63
64
|
data << (@meta_info ? node.meta_info.map {|k,v| "#{k}: #{v.inspect}"} : [])
|
|
64
65
|
data << sub
|
|
65
66
|
data
|
|
@@ -71,9 +72,9 @@ DESC
|
|
|
71
72
|
private :collect_data
|
|
72
73
|
|
|
73
74
|
def print_tree(data, indent = '', selector)
|
|
74
|
-
data.each do |name, info, children|
|
|
75
|
+
data.each do |name, alcn, info, children|
|
|
75
76
|
puts("#{indent}#{Utils.light(Utils.blue(name))}")
|
|
76
|
-
info.each {|i| puts("#{indent} #{i}")} if info.length > 0 && (selector.nil? ||
|
|
77
|
+
info.each {|i| puts("#{indent} #{i}")} if info.length > 0 && (selector.nil? || alcn.include?(selector))
|
|
77
78
|
print_tree(children, indent + ' ', selector)
|
|
78
79
|
end
|
|
79
80
|
end
|
|
@@ -104,10 +104,10 @@ module Webgen
|
|
|
104
104
|
extension(name).call(context)
|
|
105
105
|
rescue Webgen::Error => e
|
|
106
106
|
e.path = context.dest_node if e.path.to_s.empty?
|
|
107
|
+
e.location = "content_processor.#{name}" unless e.location
|
|
107
108
|
raise
|
|
108
109
|
rescue Exception => e
|
|
109
|
-
|
|
110
|
-
raise Webgen::RenderError.new(e, (ext.respond_to?(:name) ? ext.name : nil), context.dest_node)
|
|
110
|
+
raise Webgen::RenderError.new(e, "content_processor.#{name}", context.dest_node)
|
|
111
111
|
end
|
|
112
112
|
|
|
113
113
|
# Normalize the content processor pipeline.
|
|
@@ -77,11 +77,11 @@ module Webgen
|
|
|
77
77
|
return ''
|
|
78
78
|
elsif block_node
|
|
79
79
|
raise Webgen::RenderError.new("No block named '#{options[:name]}' found in <#{block_node}>",
|
|
80
|
-
|
|
80
|
+
'content_processor.blocks', context.dest_node,
|
|
81
81
|
context.ref_node, (options[:line_nr_proc].call if options[:line_nr_proc]))
|
|
82
82
|
else
|
|
83
83
|
raise Webgen::RenderError.new("No node in the render chain has a block named '#{options[:name]}'",
|
|
84
|
-
|
|
84
|
+
'content_processor.blocks', context.dest_node,
|
|
85
85
|
context.ref_node, (options[:line_nr_proc].call if options[:line_nr_proc]))
|
|
86
86
|
end
|
|
87
87
|
end
|
|
@@ -16,7 +16,7 @@ module Webgen
|
|
|
16
16
|
context
|
|
17
17
|
rescue ::Haml::Error => e
|
|
18
18
|
line = (e.line ? e.line + 1 : Webgen::Error.error_line(e))
|
|
19
|
-
raise Webgen::RenderError.new(e,
|
|
19
|
+
raise Webgen::RenderError.new(e, 'content_processor.haml', context.dest_node, nil, line)
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
end
|
|
@@ -14,11 +14,12 @@ module Webgen
|
|
|
14
14
|
# processor should be the last in the processing pipeline so that all other processors have been
|
|
15
15
|
# able to set the data.
|
|
16
16
|
#
|
|
17
|
-
# Use the methods defined on the special Context
|
|
17
|
+
# Use the methods defined on the special Webgen::Context::HtmlHead::Proxy object which can be
|
|
18
|
+
# accessed via Webgen::Context#html_head to provide values.
|
|
18
19
|
#
|
|
19
20
|
# == Internal details
|
|
20
21
|
#
|
|
21
|
-
# The key
|
|
22
|
+
# The key +:cp_html_head+ of +context.persistent+ is used (the normal +context.options+ won't do
|
|
22
23
|
# because the data needs to be shared 'backwards' during the rendering) and it has to be a Hash
|
|
23
24
|
# with the following values:
|
|
24
25
|
#
|
|
@@ -85,7 +86,7 @@ module Webgen
|
|
|
85
86
|
def self.links_to_translations(context)
|
|
86
87
|
context.website.tree.translations(context.dest_node).map do |node|
|
|
87
88
|
next '' if node.alcn == context.dest_node.alcn
|
|
88
|
-
context.website.ext.item_tracker.add(context.dest_node, :node_meta_info, node
|
|
89
|
+
context.website.ext.item_tracker.add(context.dest_node, :node_meta_info, node)
|
|
89
90
|
|
|
90
91
|
result = "\n<link type=\"text/html\" rel=\"alternate\" hreflang=\"#{node.lang}\" "
|
|
91
92
|
result << "href=\"#{context.dest_node.route_to(node)}\" "
|
|
@@ -103,7 +104,7 @@ module Webgen
|
|
|
103
104
|
next path if Webgen::Path.url(path, false).absolute?
|
|
104
105
|
node = context.content_node.resolve(path, context.dest_node.lang, true)
|
|
105
106
|
if node
|
|
106
|
-
context.website.ext.item_tracker.add(context.dest_node, :node_meta_info, node
|
|
107
|
+
context.website.ext.item_tracker.add(context.dest_node, :node_meta_info, node)
|
|
107
108
|
context.dest_node.route_to(node)
|
|
108
109
|
else
|
|
109
110
|
nil
|
|
@@ -35,7 +35,9 @@ module Webgen
|
|
|
35
35
|
|
|
36
36
|
# Convert the content in +context+ to HTML.
|
|
37
37
|
def self.call(context)
|
|
38
|
-
|
|
38
|
+
options = context.website.config['content_processor.kramdown.options'].dup
|
|
39
|
+
options[:link_defs] = context.website.ext.link_definitions.merge(options[:link_defs] || {})
|
|
40
|
+
doc = ::Kramdown::Document.new(context.content, options)
|
|
39
41
|
context.content = CustomHtmlConverter.new(doc.root, doc.options, context).convert(doc.root)
|
|
40
42
|
doc.warnings.each do |warn|
|
|
41
43
|
context.website.logger.warn { "kramdown warning while parsing <#{context.ref_node}>: #{warn}" }
|
|
@@ -1,18 +1,31 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
2
|
|
|
3
3
|
require 'webgen/content_processor'
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
### Hack...
|
|
6
|
+
# Workaround to load the correct version of rdoc. Unusable versions don't have a rdoc/store file and
|
|
7
|
+
# so we can use this to our advantage.
|
|
8
|
+
begin
|
|
9
|
+
# If a useable version is available, this won't fail with a LoadError (but probably a NameError)
|
|
10
|
+
# and will activate the correct version, even if installed via Rubygems.
|
|
11
|
+
require 'rdoc/store'
|
|
12
|
+
rescue LoadError
|
|
13
|
+
webgen_require('rdoc/rdoc', 'rdoc')
|
|
14
|
+
rescue Exception
|
|
15
|
+
end
|
|
16
|
+
require 'rdoc/rdoc'
|
|
17
|
+
|
|
5
18
|
|
|
6
19
|
module Webgen
|
|
7
20
|
class ContentProcessor
|
|
8
21
|
|
|
9
22
|
# Converts content in RDoc markup (the native Ruby documentation format) to HTML. Needs the newer
|
|
10
|
-
# RDoc implementation (version >=
|
|
23
|
+
# RDoc implementation (version >= 4.0.0).
|
|
11
24
|
module RDoc
|
|
12
25
|
|
|
13
26
|
# Convert the content in RDoc markup to HTML.
|
|
14
27
|
def self.call(context)
|
|
15
|
-
context.content = ::RDoc::Markup::ToHtml.new.convert(context.content)
|
|
28
|
+
context.content = ::RDoc::Markup::ToHtml.new(::RDoc::Options.new).convert(context.content)
|
|
16
29
|
context
|
|
17
30
|
end
|
|
18
31
|
|
|
@@ -110,7 +110,7 @@ module Webgen
|
|
|
110
110
|
|
|
111
111
|
if ref_node
|
|
112
112
|
if dest_node = ref_node.resolve(path, context.dest_node.lang, true)
|
|
113
|
-
context.website.ext.item_tracker.add(context.dest_node, :node_meta_info, dest_node
|
|
113
|
+
context.website.ext.item_tracker.add(context.dest_node, :node_meta_info, dest_node)
|
|
114
114
|
path = context.dest_node.route_to(dest_node)
|
|
115
115
|
end
|
|
116
116
|
else
|
|
@@ -127,7 +127,7 @@ module Webgen
|
|
|
127
127
|
context.content = ::Sass::Engine.new(context.content, default_options(context)).render
|
|
128
128
|
context
|
|
129
129
|
rescue ::Sass::SyntaxError => e
|
|
130
|
-
raise Webgen::RenderError.new(e,
|
|
130
|
+
raise Webgen::RenderError.new(e, 'content_processor.sass', context.dest_node, nil, (e.sass_line if e.sass_line))
|
|
131
131
|
end
|
|
132
132
|
|
|
133
133
|
def self.default_options(context) # :nodoc:
|
|
@@ -136,7 +136,7 @@ module Webgen
|
|
|
136
136
|
opts.merge({
|
|
137
137
|
:filename => context.ref_node.alcn,
|
|
138
138
|
:syntax => :sass,
|
|
139
|
-
:cache_store => ::Sass::CacheStores::Filesystem.new(context.website.tmpdir('sass')),
|
|
139
|
+
:cache_store => ::Sass::CacheStores::Filesystem.new(context.website.tmpdir('content_processor.sass')),
|
|
140
140
|
:filesystem_importer => FileSystemImporter,
|
|
141
141
|
:load_paths => load_paths,
|
|
142
142
|
:webgen_context => context
|
|
@@ -14,7 +14,7 @@ module Webgen
|
|
|
14
14
|
context.content = ::Sass::Engine.new(context.content, options).render
|
|
15
15
|
context
|
|
16
16
|
rescue ::Sass::SyntaxError => e
|
|
17
|
-
raise Webgen::RenderError.new(e,
|
|
17
|
+
raise Webgen::RenderError.new(e, 'content_processor.scss', context.dest_node, nil, (e.sass_line if e.sass_line))
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
end
|
|
@@ -56,7 +56,7 @@ module Webgen
|
|
|
56
56
|
execute("pdflatex -shell-escape -interaction=nonstopmode -halt-on-error #{file}.tex", cwd, context) do |status, stdout, stderr|
|
|
57
57
|
errors = (stdout+stderr).scan(/^!(.*\n.*)/).join("\n")
|
|
58
58
|
raise Webgen::RenderError.new("Error while parsing TikZ picture commands with PDFLaTeX: #{errors}",
|
|
59
|
-
|
|
59
|
+
'content_processor.tikz', context.dest_node, context.ref_node)
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
execute("pdfcrop #{file}.pdf #{file}.pdf", cwd, context)
|
|
@@ -93,7 +93,7 @@ module Webgen
|
|
|
93
93
|
yield(status, stdout, stderr)
|
|
94
94
|
else
|
|
95
95
|
raise Webgen::RenderError.new("Error while running a command for a TikZ picture: #{stdout + "\n" + stderr}",
|
|
96
|
-
|
|
96
|
+
'content_processor.tikz', context.dest_node, context.ref_node)
|
|
97
97
|
end
|
|
98
98
|
end
|
|
99
99
|
[status, stdout, stderr]
|
|
@@ -43,7 +43,7 @@ module Webgen
|
|
|
43
43
|
def type_check!(type) #:nodoc:
|
|
44
44
|
if ![:css, :js].include?(type)
|
|
45
45
|
raise Webgen::RenderError.new("Type must either be :css or :js, not #{type}",
|
|
46
|
-
|
|
46
|
+
"context.html_head", @context.dest_node, @context.ref_node)
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
private :type_check!
|
|
@@ -37,7 +37,8 @@ module Webgen
|
|
|
37
37
|
# Write the +data+ to the given +path+.
|
|
38
38
|
def write(path, data)
|
|
39
39
|
dest = File.join(@root, path)
|
|
40
|
-
|
|
40
|
+
parent_dir = File.dirname(dest)
|
|
41
|
+
FileUtils.makedirs(parent_dir) unless File.directory?(parent_dir)
|
|
41
42
|
if path[-1] == ?/
|
|
42
43
|
FileUtils.makedirs(dest)
|
|
43
44
|
else
|
|
@@ -8,9 +8,9 @@ module Webgen
|
|
|
8
8
|
# This class is used to track changes to the content of a node. The content of a node is changed
|
|
9
9
|
# if any of its dependencies are changed.
|
|
10
10
|
#
|
|
11
|
-
# The item for this tracker is the
|
|
11
|
+
# The item for this tracker is the node:
|
|
12
12
|
#
|
|
13
|
-
# website.ext.item_tracker.add(some_node, :node_content, my_node
|
|
13
|
+
# website.ext.item_tracker.add(some_node, :node_content, my_node)
|
|
14
14
|
#
|
|
15
15
|
class NodeContent
|
|
16
16
|
|
|
@@ -18,8 +18,8 @@ module Webgen
|
|
|
18
18
|
@website = website
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
def item_id(
|
|
22
|
-
alcn
|
|
21
|
+
def item_id(node) #:nodoc:
|
|
22
|
+
node.alcn
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
def item_data(alcn) #:nodoc:
|
|
@@ -9,17 +9,17 @@ module Webgen
|
|
|
9
9
|
#
|
|
10
10
|
# Depending on what should be tracked, one needs to provide the following item:
|
|
11
11
|
#
|
|
12
|
-
# [
|
|
12
|
+
# [node, nil]
|
|
13
13
|
# Tracks changes to the whole meta information of the node, i.e. if any meta information value
|
|
14
14
|
# changes, a change is detected.
|
|
15
15
|
#
|
|
16
|
-
# [
|
|
16
|
+
# [node, key]
|
|
17
17
|
# Tracks changes to a specific meta information key of the node.
|
|
18
18
|
#
|
|
19
19
|
# Here are some examples:
|
|
20
20
|
#
|
|
21
|
-
# website.ext.item_tracker.add(some_node, :node_meta_info, my_node
|
|
22
|
-
# website.ext.item_tracker.add(some_node, :node_meta_info, my_node
|
|
21
|
+
# website.ext.item_tracker.add(some_node, :node_meta_info, my_node) # first case
|
|
22
|
+
# website.ext.item_tracker.add(some_node, :node_meta_info, my_node, 'title') # second case
|
|
23
23
|
#
|
|
24
24
|
class NodeMetaInfo
|
|
25
25
|
|
|
@@ -29,8 +29,8 @@ module Webgen
|
|
|
29
29
|
@website = website
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
def item_id(
|
|
33
|
-
[alcn, key]
|
|
32
|
+
def item_id(node, key = nil) #:nodoc:
|
|
33
|
+
[node.alcn, key]
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def item_data(alcn, key = nil) #:nodoc:
|
|
@@ -51,7 +51,7 @@ module Webgen
|
|
|
51
51
|
method_name, options, type = *iid
|
|
52
52
|
nodes = node_list(method_name, options)
|
|
53
53
|
old_data != nodes_to_alcn(nodes) ||
|
|
54
|
-
nodes.flatten.any? {|n| type == :content ? @website.ext.item_tracker.node_changed?(n) : @website.ext.item_tracker.item_changed?(:node_meta_info, n
|
|
54
|
+
nodes.flatten.any? {|n| type == :content ? @website.ext.item_tracker.node_changed?(n) : @website.ext.item_tracker.item_changed?(:node_meta_info, n)}
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
def referenced_nodes(iid, alcn_list) #:nodoc:
|
data/lib/webgen/node.rb
CHANGED
|
@@ -12,6 +12,8 @@ module Webgen
|
|
|
12
12
|
# information is available through the #[] and #meta_info accessors, the internal processing
|
|
13
13
|
# information through the #node_info accessor.
|
|
14
14
|
#
|
|
15
|
+
# This class is not directly used. Instead path handlers define sub-classes that provide handler
|
|
16
|
+
# specific methods. See the basic sub-class Webgen::PathHandler::Base::Node.
|
|
15
17
|
class Node
|
|
16
18
|
|
|
17
19
|
# The parent node. This is in all but one case a Node object. The one exception is that the
|
|
@@ -167,7 +169,8 @@ module Webgen
|
|
|
167
169
|
# If the +lang+ parameter is not used, it defaults to the language of the current node.
|
|
168
170
|
def route_to(node, lang = @lang)
|
|
169
171
|
my_url = Webgen::Path.url(@dest_path)
|
|
170
|
-
|
|
172
|
+
pnode = node.proxy_node(lang)
|
|
173
|
+
other_url = Webgen::Path.url(pnode['routing_path'] || pnode.dest_path)
|
|
171
174
|
|
|
172
175
|
# resolve any '.' and '..' paths in the target url
|
|
173
176
|
if other_url.path =~ /\/\.\.?\// && other_url.scheme == 'webgen'
|
|
@@ -185,12 +188,7 @@ module Webgen
|
|
|
185
188
|
#
|
|
186
189
|
# If the +lang+ parameter is not used, it defaults to the language of the current node.
|
|
187
190
|
def proxy_node(lang = @lang)
|
|
188
|
-
proxy_path
|
|
189
|
-
if proxy_path.nil?
|
|
190
|
-
self
|
|
191
|
-
else
|
|
192
|
-
resolve(proxy_path, lang, true) || self
|
|
193
|
-
end
|
|
191
|
+
self['proxy_path'] && resolve(self['proxy_path'], lang, true) || self
|
|
194
192
|
end
|
|
195
193
|
|
|
196
194
|
# Return a HTML link from this node to the given node.
|
data/lib/webgen/node_finder.rb
CHANGED
|
@@ -61,6 +61,9 @@ module Webgen
|
|
|
61
61
|
# the value of this meta information is used for comparison of nodes (again, if both compared
|
|
62
62
|
# values are integers, a numeric comparison is done, else a string comparison).
|
|
63
63
|
#
|
|
64
|
+
# [:reverse]
|
|
65
|
+
# Value: +true+ of +false+/+nil+. If this option is set to +true+, the sort order is reversed.
|
|
66
|
+
#
|
|
64
67
|
# === Filter options
|
|
65
68
|
#
|
|
66
69
|
# These options are used for filtering the nodes. All nodes are used by default if no filter
|
|
@@ -71,9 +74,9 @@ module Webgen
|
|
|
71
74
|
# used.
|
|
72
75
|
#
|
|
73
76
|
# [:lang]
|
|
74
|
-
# Value: a language code/+nil+/the special value
|
|
77
|
+
# Value: a language code/+nil+/the special value +node+ or an array of these values. Nodes that
|
|
75
78
|
# have one of the specified language codes, are language independent (in case of the value
|
|
76
|
-
# +nil+) or have the same language as the reference node (in case of the value
|
|
79
|
+
# +nil+) or have the same language as the reference node (in case of the value +node+) are
|
|
77
80
|
# used.
|
|
78
81
|
#
|
|
79
82
|
# [:mi]
|
|
@@ -97,6 +100,9 @@ module Webgen
|
|
|
97
100
|
# and end levels). All nodes whose hierarchy level in the node tree are greater than or equal to
|
|
98
101
|
# the start level and lower than or equal to the end level are used.
|
|
99
102
|
#
|
|
103
|
+
# Negative numbers, where -1 stands for the reference node, -2 for its parent node and so on,
|
|
104
|
+
# can also be used.
|
|
105
|
+
#
|
|
100
106
|
# [:ancestors]
|
|
101
107
|
# Value: +true+ or +false+/+nil+. If this filter option is set to +true+, only nodes that are
|
|
102
108
|
# ancestors of the reference node are used. The reference node itself is used as well.
|
|
@@ -106,8 +112,17 @@ module Webgen
|
|
|
106
112
|
# descendants of the reference node are used. The reference node itself is used as well.
|
|
107
113
|
#
|
|
108
114
|
# [:siblings]
|
|
109
|
-
# Value: +true
|
|
110
|
-
#
|
|
115
|
+
# Value: +true+, +false+/+nil+, or an array with two integers. If this filter option is set to
|
|
116
|
+
# +true+, only nodes that are sibling node of the reference node are used. The reference node
|
|
117
|
+
# itself is used as well. If set to +false+ or +nil+, this filter is ignored.
|
|
118
|
+
#
|
|
119
|
+
# If an array with two numbers is specified, all sibling nodes of the reference node or its
|
|
120
|
+
# parent nodes the hierarchy level of which lies between these numbers are used. The parent
|
|
121
|
+
# nodes and the reference node are used as well if their level lies between the numbers.
|
|
122
|
+
# Counting starts at zero (the root node).
|
|
123
|
+
#
|
|
124
|
+
# Negative numbers, where -1 stands for the reference node, -2 for its parent node and so on,
|
|
125
|
+
# can also be used.
|
|
111
126
|
#
|
|
112
127
|
# == Implementing a filter module
|
|
113
128
|
#
|
|
@@ -177,14 +192,14 @@ module Webgen
|
|
|
177
192
|
end
|
|
178
193
|
opts = prepare_options_hash(opts_or_name)
|
|
179
194
|
|
|
180
|
-
limit, offset, flatten, sort, levels = remove_non_filter_options(opts)
|
|
195
|
+
limit, offset, flatten, sort, levels, reverse = remove_non_filter_options(opts)
|
|
181
196
|
flatten = true if limit || offset
|
|
182
197
|
levels = [levels || [1, 1_000_000]].flatten.map {|i| i.to_i}
|
|
183
198
|
|
|
184
199
|
nodes = filter_nodes(opts, ref_node)
|
|
185
200
|
|
|
186
201
|
if flatten
|
|
187
|
-
sort_nodes(nodes, sort)
|
|
202
|
+
sort_nodes(nodes, sort, reverse)
|
|
188
203
|
nodes = nodes[(offset.to_s.to_i)..(limit ? offset.to_s.to_i + limit.to_s.to_i - 1 : -1)] if limit || offset
|
|
189
204
|
else
|
|
190
205
|
result = {}
|
|
@@ -208,7 +223,7 @@ module Webgen
|
|
|
208
223
|
end
|
|
209
224
|
end
|
|
210
225
|
nodes = reducer.call(result, 1)
|
|
211
|
-
sort_nodes(nodes, sort, false)
|
|
226
|
+
sort_nodes(nodes, sort, reverse, false)
|
|
212
227
|
end
|
|
213
228
|
|
|
214
229
|
cache_result(opts_or_name, ref_node, nodes)
|
|
@@ -237,7 +252,8 @@ module Webgen
|
|
|
237
252
|
end
|
|
238
253
|
|
|
239
254
|
def remove_non_filter_options(opts)
|
|
240
|
-
[opts.delete(:limit), opts.delete(:offset), opts.delete(:flatten),
|
|
255
|
+
[opts.delete(:limit), opts.delete(:offset), opts.delete(:flatten),
|
|
256
|
+
opts.delete(:sort), opts.delete(:levels), opts.delete(:reverse)]
|
|
241
257
|
end
|
|
242
258
|
|
|
243
259
|
def filter_nodes(opts, ref_node)
|
|
@@ -255,23 +271,23 @@ module Webgen
|
|
|
255
271
|
nodes
|
|
256
272
|
end
|
|
257
273
|
|
|
258
|
-
def sort_nodes(nodes, sort, flat_mode = true)
|
|
274
|
+
def sort_nodes(nodes, sort, reverse, flat_mode = true)
|
|
259
275
|
return unless sort
|
|
260
276
|
if sort == true
|
|
261
277
|
nodes.sort! do |(a,_),(b,_)|
|
|
262
278
|
a = (a['sort_info'] && a['sort_info'].to_s) || a['title'].to_s || ''
|
|
263
279
|
b = (b['sort_info'] && b['sort_info'].to_s) || b['title'].to_s || ''
|
|
264
280
|
(a = a.to_i; b = b.to_i) if a !~ /\D/ && b !~ /\D/
|
|
265
|
-
a <=> b
|
|
281
|
+
(reverse ? b <=> a : a <=> b)
|
|
266
282
|
end
|
|
267
283
|
else
|
|
268
284
|
nodes.sort! do |(a,_),(b,_)|
|
|
269
285
|
a, b = a[sort].to_s, b[sort].to_s
|
|
270
286
|
a, b = a.to_i, b.to_i if a !~ /\D/ && b !~ /\D/
|
|
271
|
-
a <=> b
|
|
287
|
+
(reverse ? b <=> a : a <=> b)
|
|
272
288
|
end
|
|
273
289
|
end
|
|
274
|
-
nodes.each {|n, children| sort_nodes(children, sort, flat_mode) if children } unless flat_mode
|
|
290
|
+
nodes.each {|n, children| sort_nodes(children, sort, reverse, flat_mode) if children } unless flat_mode
|
|
275
291
|
end
|
|
276
292
|
|
|
277
293
|
# :section: Filter methods
|
|
@@ -313,12 +329,12 @@ module Webgen
|
|
|
313
329
|
end
|
|
314
330
|
|
|
315
331
|
def filter_absolute_levels(nodes, ref_node, range)
|
|
316
|
-
range = [range].flatten.map {|i| i.to_i}
|
|
332
|
+
range = [range].flatten.map {|i| (i = i.to_i) < 0 ? ref_node.level + 1 + i : i}
|
|
317
333
|
nodes.keep_if {|n| n.level >= range.first && n.level <= range.last}
|
|
318
334
|
end
|
|
319
335
|
|
|
320
336
|
def filter_lang(nodes, ref_node, langs)
|
|
321
|
-
langs = [langs].flatten.map {|l| l ==
|
|
337
|
+
langs = [langs].flatten.map {|l| l == 'node' ? ref_node.lang : l}.uniq
|
|
322
338
|
nodes.keep_if {|n| langs.any? {|l| n.lang == l}}
|
|
323
339
|
end
|
|
324
340
|
|
|
@@ -341,9 +357,16 @@ module Webgen
|
|
|
341
357
|
end
|
|
342
358
|
end
|
|
343
359
|
|
|
344
|
-
def filter_siblings(nodes, ref_node,
|
|
345
|
-
return nodes unless
|
|
346
|
-
|
|
360
|
+
def filter_siblings(nodes, ref_node, value)
|
|
361
|
+
return nodes unless value
|
|
362
|
+
if value == true
|
|
363
|
+
nodes.keep_if {|n| n.parent == ref_node.parent}
|
|
364
|
+
else
|
|
365
|
+
value = [value].flatten.map {|i| (i = i.to_i) < 0 ? ref_node.level + 1 + i : i}
|
|
366
|
+
nodes.keep_if do |n|
|
|
367
|
+
n.level >= value.first && n.level <= value.last && (n.parent.is_ancestor_of?(ref_node) || n.is_root?)
|
|
368
|
+
end
|
|
369
|
+
end
|
|
347
370
|
end
|
|
348
371
|
|
|
349
372
|
end
|