webby 0.7.4 → 0.8.0
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/History.txt +19 -0
- data/Manifest.txt +19 -6
- data/README.txt +21 -5
- data/Rakefile +2 -3
- data/data/Rakefile +1 -1
- data/data/lib/breadcrumbs.rb +28 -0
- data/data/tasks/create.rake +0 -1
- data/data/tasks/deploy.rake +0 -1
- data/data/tasks/growl.rake +0 -1
- data/data/tasks/heel.rake +2 -3
- data/data/tasks/setup.rb +0 -1
- data/data/templates/_partial.erb +10 -0
- data/data/templates/atom_feed.erb +34 -0
- data/examples/webby/content/manual/index.txt +11 -13
- data/examples/webby/content/tutorial/index.txt +1 -1
- data/examples/webby/tasks/heel.rake +2 -2
- data/examples/webby/tasks/setup.rb +6 -1
- data/lib/webby.rb +50 -23
- data/lib/webby/auto_builder.rb +4 -2
- data/lib/webby/builder.rb +6 -5
- data/lib/webby/filters.rb +6 -7
- data/lib/webby/filters/outline.rb +4 -2
- data/lib/webby/filters/tidy.rb +4 -2
- data/lib/webby/helpers.rb +32 -0
- data/lib/webby/helpers/coderay_helper.rb +78 -0
- data/lib/webby/helpers/graphviz_helper.rb +158 -0
- data/lib/webby/helpers/tag_helper.rb +9 -4
- data/lib/webby/helpers/tex_img_helper.rb +181 -0
- data/lib/webby/helpers/url_helper.rb +12 -11
- data/lib/webby/renderer.rb +97 -18
- data/lib/webby/resources.rb +82 -0
- data/lib/webby/{pages_db.rb → resources/db.rb} +63 -33
- data/lib/webby/{file.rb → resources/file.rb} +27 -24
- data/lib/webby/resources/layout.rb +65 -0
- data/lib/webby/resources/page.rb +109 -0
- data/lib/webby/resources/partial.rb +81 -0
- data/lib/webby/resources/resource.rb +145 -0
- data/lib/webby/resources/static.rb +54 -0
- data/lib/webby/stelan/mktemp.rb +137 -0
- data/lib/webby/stelan/spawner.rb +5 -1
- data/lib/webby/utils.rb +3 -1
- data/lib/webby/webby_task.rb +43 -24
- data/spec/spec_helper.rb +12 -1
- data/spec/webby/{file_spec.rb → resources/file_spec.rb} +21 -22
- data/tasks/ann.rake +76 -0
- data/tasks/annotations.rake +6 -14
- data/tasks/bones.rake +40 -0
- data/tasks/doc.rake +1 -2
- data/tasks/gem.rake +29 -2
- data/tasks/manifest.rake +15 -21
- data/tasks/post_load.rake +22 -8
- data/tasks/setup.rb +53 -15
- data/tasks/spec.rake +13 -0
- metadata +22 -9
- data/lib/webby/filters/coderay.rb +0 -98
- data/lib/webby/filters/graphviz.rb +0 -189
- data/lib/webby/resource.rb +0 -293
data/lib/webby/auto_builder.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: auto_builder.rb
|
1
|
+
# $Id: auto_builder.rb 167 2008-02-24 00:59:54Z tim_pease $
|
2
2
|
|
3
3
|
require 'directory_watcher'
|
4
4
|
|
@@ -11,6 +11,8 @@ module Webby
|
|
11
11
|
#
|
12
12
|
class AutoBuilder
|
13
13
|
|
14
|
+
# TODO: hit Ctrl-C once to rebuild everything, and hit it twice to stop the autobuild loop
|
15
|
+
|
14
16
|
# call-seq:
|
15
17
|
# AutoBuilder.run
|
16
18
|
#
|
@@ -54,7 +56,7 @@ class AutoBuilder
|
|
54
56
|
@log.debug "changed #{evt.path}"
|
55
57
|
next unless test ?f, evt.path
|
56
58
|
next if evt.path =~ ::Webby.exclude
|
57
|
-
|
59
|
+
Resources.new evt.path
|
58
60
|
end
|
59
61
|
|
60
62
|
@builder.run :load_files => false
|
data/lib/webby/builder.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: builder.rb
|
1
|
+
# $Id: builder.rb 167 2008-02-24 00:59:54Z tim_pease $
|
2
2
|
|
3
3
|
require 'find'
|
4
4
|
require 'fileutils'
|
@@ -90,7 +90,7 @@ class Builder
|
|
90
90
|
load_files if opts[:load_files]
|
91
91
|
loop_check
|
92
92
|
|
93
|
-
|
93
|
+
Resources.pages.each do |page|
|
94
94
|
next unless page.dirty? or opts[:rebuild]
|
95
95
|
|
96
96
|
@log.info "creating #{page.destination}"
|
@@ -99,8 +99,9 @@ class Builder
|
|
99
99
|
FileUtils.mkdir_p ::File.dirname(page.destination)
|
100
100
|
|
101
101
|
# copy the resource to the output directory if it is static
|
102
|
-
if page.
|
102
|
+
if page.instance_of? Resources::Static
|
103
103
|
FileUtils.cp page.path, page.destination
|
104
|
+
FileUtils.chmod 0644, page.destination
|
104
105
|
|
105
106
|
# otherwise, layout the resource and write the results to
|
106
107
|
# the output directory
|
@@ -123,7 +124,7 @@ class Builder
|
|
123
124
|
::Find.find(layout_dir, content_dir) do |path|
|
124
125
|
next unless test ?f, path
|
125
126
|
next if path =~ ::Webby.exclude
|
126
|
-
|
127
|
+
Resources.new path
|
127
128
|
end
|
128
129
|
end
|
129
130
|
|
@@ -132,7 +133,7 @@ class Builder
|
|
132
133
|
# error if one is detected.
|
133
134
|
#
|
134
135
|
def loop_check
|
135
|
-
layouts =
|
136
|
+
layouts = Resources.layouts
|
136
137
|
|
137
138
|
layouts.each do |lyt|
|
138
139
|
stack = []
|
data/lib/webby/filters.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: filters.rb
|
1
|
+
# $Id: filters.rb 179 2008-02-29 04:47:19Z tim_pease $
|
2
2
|
|
3
3
|
module Webby
|
4
4
|
module Filters
|
@@ -47,11 +47,14 @@ module Filters
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def start_for(input)
|
50
|
+
@renderer.instance_variable_set(:@_cursor, self)
|
50
51
|
filters.inject(input) do |result, filter|
|
51
52
|
handler = Filters[filter]
|
52
53
|
args = [result, self][0, handler.arity]
|
53
54
|
handle(filter, handler, *args)
|
54
55
|
end
|
56
|
+
ensure
|
57
|
+
@renderer.instance_variable_set(:@_cursor, nil)
|
55
58
|
end
|
56
59
|
|
57
60
|
# The list of filters yet to be processed
|
@@ -73,12 +76,6 @@ module Filters
|
|
73
76
|
result = handler.call(*args)
|
74
77
|
@processed += 1
|
75
78
|
result
|
76
|
-
rescue NameError => e
|
77
|
-
@log.fatal "Name error in filter `#{filter}' (missing dependency?): #{e.message}"
|
78
|
-
exit 1
|
79
|
-
rescue => e
|
80
|
-
@log.fatal "Error in filter `#{filter}': #{e.message}"
|
81
|
-
exit 1
|
82
79
|
end
|
83
80
|
|
84
81
|
end # class Cursor
|
@@ -87,4 +84,6 @@ module Filters
|
|
87
84
|
end # module Filters
|
88
85
|
end # module Webby
|
89
86
|
|
87
|
+
Webby.require_all_libs_relative_to(__FILE__)
|
88
|
+
|
90
89
|
# EOF
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: outline.rb
|
1
|
+
# $Id: outline.rb 181 2008-02-29 05:09:49Z tim_pease $
|
2
2
|
|
3
3
|
require 'hpricot'
|
4
4
|
|
@@ -27,7 +27,9 @@ module Filters
|
|
27
27
|
class Outline
|
28
28
|
include ERB::Util
|
29
29
|
|
30
|
-
|
30
|
+
# :stopdoc:
|
31
|
+
class Error < StandardError; end
|
32
|
+
# :startdoc:
|
31
33
|
|
32
34
|
# call-seq:
|
33
35
|
# Outline.new( html )
|
data/lib/webby/filters/tidy.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: tidy.rb
|
1
|
+
# $Id: tidy.rb 181 2008-02-29 05:09:49Z tim_pease $
|
2
2
|
|
3
3
|
require 'fileutils'
|
4
4
|
require 'tempfile'
|
@@ -20,7 +20,9 @@ module Filters
|
|
20
20
|
#
|
21
21
|
class Tidy
|
22
22
|
|
23
|
-
|
23
|
+
# :stopdoc:
|
24
|
+
class Error < StandardError; end
|
25
|
+
# :startdoc:
|
24
26
|
|
25
27
|
# call-seq:
|
26
28
|
# Tidy.new( html )
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# $Id: helpers.rb 167 2008-02-24 00:59:54Z tim_pease $
|
2
|
+
|
3
|
+
require Webby.libpath(*%w[webby renderer])
|
4
|
+
|
5
|
+
module Webby
|
6
|
+
|
7
|
+
# The Helpers module is used to register helper modules that provide extra
|
8
|
+
# functionality to the Webby renderer. The most notable example is the
|
9
|
+
# UrlHelpers module that provides methods to link to another page in a
|
10
|
+
# Webby webiste.
|
11
|
+
#
|
12
|
+
# Helpers are registered with the Webby framework by calling:
|
13
|
+
#
|
14
|
+
# Webby::Helpers.register( MyHelper )
|
15
|
+
#
|
16
|
+
module Helpers
|
17
|
+
|
18
|
+
# call-seq:
|
19
|
+
# Helpers.register( module )
|
20
|
+
#
|
21
|
+
# Register the given _module_ as a helper module for the Webby framework.
|
22
|
+
#
|
23
|
+
def self.register( helper )
|
24
|
+
::Webby::Renderer.__send__( :include, helper )
|
25
|
+
end
|
26
|
+
|
27
|
+
end # module Helper
|
28
|
+
end # module Webby
|
29
|
+
|
30
|
+
Webby.require_all_libs_relative_to(__FILE__)
|
31
|
+
|
32
|
+
# EOF
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# $Id: coderay_helper.rb 155 2008-02-17 00:48:30Z tim_pease $
|
2
|
+
|
3
|
+
if try_require 'coderay'
|
4
|
+
require 'enumerator'
|
5
|
+
|
6
|
+
module Webby::Helpers
|
7
|
+
module CodeRayHelper
|
8
|
+
|
9
|
+
# The +coderay+ method applies syntax highlighting to source code embedded
|
10
|
+
# in a webpage. The CodeRay highlighting engine is used for the HTML
|
11
|
+
# markup of the source code. The page sections to be highlighted are given
|
12
|
+
# as blocks of text to the +coderay+ method.
|
13
|
+
#
|
14
|
+
# Options can be passed to the CodeRay engine via attributes in the
|
15
|
+
# +coderay+ method.
|
16
|
+
#
|
17
|
+
# <% coderay( :lang => "ruby", :line_numbers => "inline" ) do -%>
|
18
|
+
# # Initializer for the class.
|
19
|
+
# def initialize( string )
|
20
|
+
# @str = stirng
|
21
|
+
# end
|
22
|
+
# <% end -%>
|
23
|
+
#
|
24
|
+
# The supported CodeRay options are the following:
|
25
|
+
#
|
26
|
+
# :lang : the language to highlight (ruby, c, html, ...)
|
27
|
+
# :line_numbers : include line numbers in 'table', 'inline',
|
28
|
+
# or 'list'
|
29
|
+
# :line_number_start : where to start with line number counting
|
30
|
+
# :bold_every : make every n-th number appear bold
|
31
|
+
# :tab_width : convert tab characters to n spaces
|
32
|
+
#
|
33
|
+
def coderay( *args, &block )
|
34
|
+
opts = args.last.instance_of?(Hash) ? args.pop : {}
|
35
|
+
|
36
|
+
buffer = eval('_erbout', block.binding)
|
37
|
+
pos = buffer.length
|
38
|
+
block.call(*args)
|
39
|
+
|
40
|
+
text = buffer[pos..-1].strip
|
41
|
+
if text.empty?
|
42
|
+
buffer[pos..-1] = ''
|
43
|
+
return
|
44
|
+
end
|
45
|
+
|
46
|
+
lang = opts.getopt(:lang, :ruby).to_sym
|
47
|
+
|
48
|
+
cr_opts = {}
|
49
|
+
%w(line_numbers to_sym
|
50
|
+
line_number_start to_i
|
51
|
+
bold_every to_i
|
52
|
+
tab_width to_i).each_slice(2) do |key,convert|
|
53
|
+
val = opts.getopt(key)
|
54
|
+
next if val.nil?
|
55
|
+
cr_opts[key.to_sym] = val.send(convert)
|
56
|
+
end
|
57
|
+
|
58
|
+
#cr.swap(CodeRay.scan(text, lang).html(opts).div)
|
59
|
+
out = '<div class="CodeRay"><pre>'
|
60
|
+
out << ::CodeRay.scan(text, lang).html(cr_opts)
|
61
|
+
out << '</pre></div>'
|
62
|
+
|
63
|
+
if @_cursor.remaining_filters.include? 'textile'
|
64
|
+
out.insert 0, "<notextile>\n"
|
65
|
+
out << "\n</notextile>"
|
66
|
+
end
|
67
|
+
|
68
|
+
buffer[pos..-1] = out
|
69
|
+
return
|
70
|
+
end
|
71
|
+
end # module CodeRayHelper
|
72
|
+
|
73
|
+
register(CodeRayHelper)
|
74
|
+
|
75
|
+
end # module Webby::Helpers
|
76
|
+
end # try_require
|
77
|
+
|
78
|
+
# EOF
|
@@ -0,0 +1,158 @@
|
|
1
|
+
# $Id: graphviz_helper.rb 181 2008-02-29 05:09:49Z tim_pease $
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'tempfile'
|
5
|
+
|
6
|
+
module Webby::Helpers
|
7
|
+
module GraphvizHelper
|
8
|
+
|
9
|
+
# :stopdoc:
|
10
|
+
class Error < StandardError; end
|
11
|
+
# :startdoc:
|
12
|
+
|
13
|
+
# call-seq:
|
14
|
+
# GraphvizHelper.error_check( file )
|
15
|
+
#
|
16
|
+
# Check the temporary error file to see if it contains any error messages
|
17
|
+
# from the graphviz program. If it is not empty, then read the contents
|
18
|
+
# and log an error message and raise an exception.
|
19
|
+
#
|
20
|
+
def self.error_check( file )
|
21
|
+
if ::File.size(file.path) != 0
|
22
|
+
msg = "\n" << ::File.read(file.path).strip
|
23
|
+
raise Error, msg
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# The +graphviz+ method processes DOT scripts in a webpage and replaces them
|
28
|
+
# with generated image files. The page sections to be processed are given
|
29
|
+
# as blocks of text to the +graphviz+ method.
|
30
|
+
#
|
31
|
+
# Options can be passed to the Graphviz program using attributes in the
|
32
|
+
# +graphviz+ method.
|
33
|
+
#
|
34
|
+
# <% graphviz( :path => "images", :type => "gif", cmd => "dot" ) do %>
|
35
|
+
# digraph graph_1 {
|
36
|
+
# graph [URL="default.html"]
|
37
|
+
# a [URL="a.html"]
|
38
|
+
# b [URL="b.html"]
|
39
|
+
# c [URL="c.html"]
|
40
|
+
# a -> b -> c
|
41
|
+
# a -> c
|
42
|
+
# }
|
43
|
+
# <% end %>
|
44
|
+
#
|
45
|
+
# If the DOT script contains *URL* or *href* attributes on any of the nodes
|
46
|
+
# or edges, then an image map will be generated and the image will be
|
47
|
+
# "clikcable" in the webpage. If *URL* or *href* attributes do not appear in
|
48
|
+
# the DOT script, then a regular image will be inserted into the webpage.
|
49
|
+
#
|
50
|
+
# The image is inserted into the page using an HTML <img /> tag. A
|
51
|
+
# corresponding <map>...</map> element will be inserted if needed.
|
52
|
+
#
|
53
|
+
# The supported Graphviz options are the following:
|
54
|
+
#
|
55
|
+
# :path : where generated images will be stored
|
56
|
+
# [default is "/"]
|
57
|
+
# :type : the type of image to generate (png, jpeg, gif)
|
58
|
+
# [default is png]
|
59
|
+
# :cmd : the Graphviz command to use when generating images
|
60
|
+
# (dot, neato, twopi, circo, fdp) [default is dot]
|
61
|
+
#
|
62
|
+
# the following options are passed as-is to the generated <img /> tag
|
63
|
+
# :style : CSS styles to apply to the <img />
|
64
|
+
# :class : CSS class to apply to the <img />
|
65
|
+
# :id : HTML identifier
|
66
|
+
# :alt : alternate text for the <img />
|
67
|
+
#
|
68
|
+
def graphviz( *args, &block )
|
69
|
+
opts = args.last.instance_of?(Hash) ? args.pop : {}
|
70
|
+
|
71
|
+
# create a temporary file for holding any error messages
|
72
|
+
# from the graphviz program
|
73
|
+
err = Tempfile.new('graphviz_err')
|
74
|
+
err.close
|
75
|
+
|
76
|
+
buffer = eval('_erbout', block.binding)
|
77
|
+
pos = buffer.length
|
78
|
+
block.call(*args)
|
79
|
+
|
80
|
+
path = opts.getopt(:path)
|
81
|
+
cmd = opts.getopt(:cmd, 'dot')
|
82
|
+
type = opts.getopt(:type, 'png')
|
83
|
+
text = buffer[pos..-1].strip
|
84
|
+
if text.empty?
|
85
|
+
buffer[pos..-1] = ''
|
86
|
+
return
|
87
|
+
end
|
88
|
+
|
89
|
+
# ensure the requested graphviz command actually exists
|
90
|
+
%x[#{cmd} -V 2>&1]
|
91
|
+
unless 0 == $?.exitstatus
|
92
|
+
raise NameError, "'#{cmd}' not found on the path"
|
93
|
+
end
|
94
|
+
|
95
|
+
# pull the name of the graph|digraph out of the DOT script
|
96
|
+
name = text.match(%r/\A\s*(?:strict\s+)?(?:di)?graph\s+([A-Za-z_][A-Za-z0-9_]*)\s+\{/o)[1]
|
97
|
+
|
98
|
+
# see if the user includes any URL or href attributes
|
99
|
+
# if so, then we need to create an imagemap
|
100
|
+
usemap = text.match(%r/(?:URL|href)\s*=/o) != nil
|
101
|
+
|
102
|
+
# generate the image filename based on the path, graph name, and type
|
103
|
+
# of image to generate
|
104
|
+
image_fn = path.nil? ? name.dup : ::File.join(path, name)
|
105
|
+
image_fn = ::File.join('', image_fn) << '.' << type
|
106
|
+
|
107
|
+
# create the HTML img tag
|
108
|
+
out = "<img src=\"#{image_fn}\""
|
109
|
+
|
110
|
+
%w[class style id alt].each do |atr|
|
111
|
+
val = opts.getopt(atr)
|
112
|
+
next if val.nil?
|
113
|
+
out << " %s=\"%s\"" % [atr, val]
|
114
|
+
end
|
115
|
+
|
116
|
+
out << " usemap=\"\##{name}\"" if usemap
|
117
|
+
out << " />\n"
|
118
|
+
|
119
|
+
# generate the image map if needed
|
120
|
+
if usemap
|
121
|
+
IO.popen("#{cmd} -Tcmapx 2> #{err.path}", 'r+') do |io|
|
122
|
+
io.write text
|
123
|
+
io.close_write
|
124
|
+
out << io.read
|
125
|
+
end
|
126
|
+
GraphvizHelper.error_check(err)
|
127
|
+
end
|
128
|
+
|
129
|
+
# generate the image using graphviz -- but first ensure that the
|
130
|
+
# path exists
|
131
|
+
out_dir = ::Webby.site.output_dir
|
132
|
+
out_file = ::File.join(out_dir, image_fn)
|
133
|
+
FileUtils.mkpath(::File.join(out_dir, path)) unless path.nil?
|
134
|
+
cmd = "#{cmd} -T#{type} -o #{out_file} 2> #{err.path}"
|
135
|
+
|
136
|
+
IO.popen(cmd, 'w') {|io| io.write text}
|
137
|
+
GraphvizHelper.error_check(err)
|
138
|
+
|
139
|
+
# see if we need to put some guards around the output
|
140
|
+
# (specifically for textile)
|
141
|
+
if @_cursor.remaining_filters.include? 'textile'
|
142
|
+
out.insert 0, "<notextile>\n"
|
143
|
+
out << "\n</notextile>"
|
144
|
+
end
|
145
|
+
|
146
|
+
buffer[pos..-1] = out
|
147
|
+
return
|
148
|
+
end
|
149
|
+
end # module GraphvizHelper
|
150
|
+
|
151
|
+
%x[dot -V 2>&1]
|
152
|
+
if 0 == $?.exitstatus
|
153
|
+
register(GraphvizHelper)
|
154
|
+
end
|
155
|
+
|
156
|
+
end # module Webby::Helpers
|
157
|
+
|
158
|
+
# EOF
|
@@ -1,6 +1,9 @@
|
|
1
|
+
# $Id: tag_helper.rb 157 2008-02-20 17:41:00Z tim_pease $
|
2
|
+
|
1
3
|
require 'erb'
|
2
4
|
require 'set'
|
3
5
|
|
6
|
+
# :stopdoc:
|
4
7
|
class ERB
|
5
8
|
module Util
|
6
9
|
HTML_ESCAPE = { '&' => '&', '"' => '"', '>' => '>', '<' => '<' }
|
@@ -10,9 +13,9 @@ class ERB
|
|
10
13
|
end
|
11
14
|
end
|
12
15
|
end
|
16
|
+
# :startdoc:
|
13
17
|
|
14
|
-
module Webby
|
15
|
-
module Helpers #:nodoc:
|
18
|
+
module Webby::Helpers
|
16
19
|
|
17
20
|
# Provides methods to generate HTML tags programmatically.
|
18
21
|
# By default, they output XHTML compliant tags.
|
@@ -56,7 +59,9 @@ module TagHelper
|
|
56
59
|
end
|
57
60
|
|
58
61
|
end # module TagHelper
|
59
|
-
|
60
|
-
|
62
|
+
|
63
|
+
register(TagHelper)
|
64
|
+
|
65
|
+
end # module Webby::Helpers
|
61
66
|
|
62
67
|
# EOF
|