webby 0.7.4 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|