webby 0.5.1 → 0.6.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 +6 -0
- data/Manifest.txt +3 -1
- data/data/Rakefile +0 -1
- data/data/tasks/create.rake +1 -10
- data/data/tasks/setup.rb +9 -2
- data/lib/webby.rb +21 -23
- data/lib/webby/auto_builder.rb +3 -3
- data/lib/webby/builder.rb +2 -2
- data/lib/webby/{coderay_filter.rb → filters/coderay.rb} +20 -8
- data/lib/webby/filters/graphviz.rb +175 -0
- data/lib/webby/filters/tidy.rb +71 -0
- data/lib/webby/renderer.rb +50 -7
- data/lib/webby/resource.rb +10 -10
- data/lib/webby/webby_task.rb +4 -22
- data/website/Rakefile +0 -1
- data/website/content/index.txt +3 -1
- data/website/content/manual.txt +29 -2
- data/website/content/tips_and_tricks.txt +3 -7
- data/website/layouts/default.rhtml +1 -1
- data/website/tasks/create.rake +1 -10
- data/website/tasks/setup.rb +9 -2
- metadata +5 -3
data/History.txt
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
== 0.6.0 /
|
2
|
+
|
3
|
+
* Added support for embedded graphviz images and image maps
|
4
|
+
* Tidy can be used as a filter to format HTML and check for errors
|
5
|
+
* Simplified coderay when used with textile
|
6
|
+
|
1
7
|
== 0.5.1 / 2007-11-29
|
2
8
|
|
3
9
|
* Growl notifications now work on Leopard / Tiger
|
data/Manifest.txt
CHANGED
@@ -30,8 +30,10 @@ data/templates/page.erb
|
|
30
30
|
lib/webby.rb
|
31
31
|
lib/webby/auto_builder.rb
|
32
32
|
lib/webby/builder.rb
|
33
|
-
lib/webby/coderay_filter.rb
|
34
33
|
lib/webby/file.rb
|
34
|
+
lib/webby/filters/coderay.rb
|
35
|
+
lib/webby/filters/graphviz.rb
|
36
|
+
lib/webby/filters/tidy.rb
|
35
37
|
lib/webby/main.rb
|
36
38
|
lib/webby/pages_db.rb
|
37
39
|
lib/webby/renderer.rb
|
data/data/Rakefile
CHANGED
data/data/tasks/create.rake
CHANGED
@@ -1,13 +1,4 @@
|
|
1
1
|
|
2
|
-
|
3
|
-
|
4
|
-
Rake::WebbyTask.new do |webby|
|
5
|
-
webby.content_dir = SITE.content_dir
|
6
|
-
webby.output_dir = SITE.output_dir
|
7
|
-
webby.layout_dir = SITE.layout_dir
|
8
|
-
webby.template_dir = SITE.template_dir
|
9
|
-
webby.exclude = SITE.exclude
|
10
|
-
webby.page_defaults = SITE.page_defaults
|
11
|
-
end
|
2
|
+
Rake::WebbyTask.new
|
12
3
|
|
13
4
|
# EOF
|
data/data/tasks/setup.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
|
2
|
-
require '
|
2
|
+
require 'webby'
|
3
3
|
|
4
|
-
SITE =
|
4
|
+
SITE = Webby.site
|
5
5
|
|
6
|
+
# Webby defaults
|
6
7
|
SITE.content_dir = 'content'
|
7
8
|
SITE.output_dir = 'output'
|
8
9
|
SITE.layout_dir = 'layouts'
|
@@ -14,12 +15,18 @@ SITE.page_defaults = {
|
|
14
15
|
'layout' => 'default'
|
15
16
|
}
|
16
17
|
|
18
|
+
# Items used to deploy the webiste
|
17
19
|
SITE.host = 'user@hostname.tld'
|
18
20
|
SITE.remote_dir = '/not/a/valid/dir'
|
19
21
|
SITE.rsync_args = %w(-av --delete)
|
20
22
|
|
23
|
+
# Options passed to the 'tidy' program when the tidy filter is used
|
24
|
+
SITE.tidy_options = '-indent -wrap 80'
|
25
|
+
|
26
|
+
# Load up the other rake tasks
|
21
27
|
FileList['tasks/*.rake'].each {|task| import task}
|
22
28
|
|
29
|
+
# Conditional dependencies
|
23
30
|
%w(heel).each do |lib|
|
24
31
|
Object.instance_eval {const_set "HAVE_#{lib.upcase}", try_require(lib)}
|
25
32
|
end
|
data/lib/webby.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
# $Id: webby.rb
|
1
|
+
# $Id: webby.rb 60 2007-12-04 05:05:50Z tim_pease $
|
2
2
|
|
3
3
|
require 'logging'
|
4
|
+
require 'ostruct'
|
4
5
|
|
5
6
|
# Configure Webby to log to STDOUT at the 'info' level
|
6
7
|
Logging::Appender.stdout.layout = Logging::Layouts::Pattern.new(
|
@@ -13,7 +14,7 @@ Logging::Logger['Webby'].level = :info
|
|
13
14
|
|
14
15
|
module Webby
|
15
16
|
|
16
|
-
VERSION = '0.
|
17
|
+
VERSION = '0.6.0' # :nodoc:
|
17
18
|
|
18
19
|
# Path to the Webby package
|
19
20
|
PATH = ::File.expand_path(::File.join(::File.dirname(__FILE__), '..'))
|
@@ -37,30 +38,27 @@ module Webby
|
|
37
38
|
end
|
38
39
|
|
39
40
|
# call-seq:
|
40
|
-
# Webby.
|
41
|
+
# Webby.site => struct
|
41
42
|
#
|
42
|
-
# Returns the configuration
|
43
|
+
# Returns a struct containing the configuration parameters for the
|
44
|
+
# Webby site. These defaults should be overridden as needed in the
|
45
|
+
# site specific Rakefile.
|
43
46
|
#
|
44
|
-
def self.
|
45
|
-
@
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
# call-seq:
|
55
|
-
# Webby.page_defaults => hash
|
56
|
-
#
|
57
|
-
# Returns the page defaults hash used for page resource objects.
|
58
|
-
#
|
59
|
-
def self.page_defaults
|
60
|
-
@page_defaults ||= {
|
47
|
+
def self.site
|
48
|
+
return @site if defined? @site
|
49
|
+
|
50
|
+
@site = OpenStruct.new
|
51
|
+
@site.output_dir = 'output'
|
52
|
+
@site.content_dir = 'content'
|
53
|
+
@site.layout_dir = 'layouts'
|
54
|
+
@site.template_dir = 'templates'
|
55
|
+
@site.exclude = %w(tmp$ bak$ ~$ CVS \.svn)
|
56
|
+
@site.page_defaults = {
|
61
57
|
'extension' => 'html',
|
62
58
|
'layout' => 'default'
|
63
59
|
}
|
60
|
+
|
61
|
+
@site
|
64
62
|
end
|
65
63
|
|
66
64
|
# call-seq
|
@@ -71,7 +69,7 @@ module Webby
|
|
71
69
|
# also used to exclude layouts.
|
72
70
|
#
|
73
71
|
def self.exclude
|
74
|
-
@exclude ||= Regexp.new(
|
72
|
+
@exclude ||= Regexp.new(site.exclude.join('|'))
|
75
73
|
end
|
76
74
|
|
77
75
|
# call-seq:
|
@@ -82,7 +80,7 @@ module Webby
|
|
82
80
|
# modification time of the file is important.
|
83
81
|
#
|
84
82
|
def self.cairn
|
85
|
-
@cairn ||= File.join(
|
83
|
+
@cairn ||= File.join(site.output_dir, '.cairn')
|
86
84
|
end
|
87
85
|
|
88
86
|
end # module Webby
|
data/lib/webby/auto_builder.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: auto_builder.rb
|
1
|
+
# $Id: auto_builder.rb 60 2007-12-04 05:05:50Z tim_pease $
|
2
2
|
|
3
3
|
require 'directory_watcher'
|
4
4
|
|
@@ -34,8 +34,8 @@ class AutoBuilder
|
|
34
34
|
@watcher.add_observer self
|
35
35
|
|
36
36
|
glob = []
|
37
|
-
glob << File.join(::Webby.
|
38
|
-
glob << File.join(::Webby.
|
37
|
+
glob << File.join(::Webby.site.layout_dir, '**', '*')
|
38
|
+
glob << File.join(::Webby.site.content_dir, '**', '*')
|
39
39
|
@watcher.glob = glob
|
40
40
|
end
|
41
41
|
|
data/lib/webby/builder.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: builder.rb
|
1
|
+
# $Id: builder.rb 60 2007-12-04 05:05:50Z tim_pease $
|
2
2
|
|
3
3
|
require 'find'
|
4
4
|
require 'fileutils'
|
@@ -150,7 +150,7 @@ class Builder
|
|
150
150
|
|
151
151
|
%w(output_dir layout_dir content_dir).each do |key|
|
152
152
|
self.class_eval <<-CODE
|
153
|
-
def #{key}( ) ::Webby.
|
153
|
+
def #{key}( ) ::Webby.site.#{key} end
|
154
154
|
CODE
|
155
155
|
end
|
156
156
|
|
@@ -1,12 +1,13 @@
|
|
1
|
-
# $Id:
|
1
|
+
# $Id: coderay.rb 58 2007-12-02 23:59:27Z tim_pease $
|
2
2
|
|
3
3
|
require 'enumerator'
|
4
4
|
require 'hpricot'
|
5
5
|
try_require 'coderay'
|
6
6
|
|
7
7
|
module Webby
|
8
|
+
module Filters
|
8
9
|
|
9
|
-
# The
|
10
|
+
# The CodeRay applies syntax highlighting to source code embedded in a
|
10
11
|
# webpage. The CodeRay highlighting engine is used for the HTML markup of
|
11
12
|
# the source code. A set of <coderay>...</coderay> tags is used to denote
|
12
13
|
# which sections of the page should be highlighted.
|
@@ -21,7 +22,7 @@ module Webby
|
|
21
22
|
# end
|
22
23
|
# </coderay>
|
23
24
|
#
|
24
|
-
#
|
25
|
+
# The supported CodeRay options are the following:
|
25
26
|
#
|
26
27
|
# lang : the language to highlight (ruby, c, html, ...)
|
27
28
|
# line_numbers : include line nubers in 'table', 'inline',
|
@@ -30,15 +31,16 @@ module Webby
|
|
30
31
|
# bold_every : make every n-th number appear bold
|
31
32
|
# tab_width : convert tab characters to n spaces
|
32
33
|
#
|
33
|
-
class
|
34
|
+
class CodeRay
|
34
35
|
|
35
36
|
# call-seq:
|
36
|
-
#
|
37
|
+
# CodeRay.new( string, filters = nil )
|
37
38
|
#
|
38
39
|
# Creates a new CodeRay filter that will operate on the given _string_.
|
39
40
|
#
|
40
|
-
def initialize( str )
|
41
|
+
def initialize( str, filters = nil )
|
41
42
|
@str = str
|
43
|
+
@filters = filters
|
42
44
|
end
|
43
45
|
|
44
46
|
# call-seq:
|
@@ -66,15 +68,25 @@ class CodeRayFilter
|
|
66
68
|
|
67
69
|
#cr.swap(CodeRay.scan(text, lang).html(opts).div)
|
68
70
|
out = "<div class=\"CodeRay\"><pre>\n"
|
69
|
-
out << CodeRay.scan(text, lang).html(opts)
|
71
|
+
out << ::CodeRay.scan(text, lang).html(opts)
|
70
72
|
out << "\n</pre></div>"
|
73
|
+
|
74
|
+
@filters.each do |f|
|
75
|
+
case f
|
76
|
+
when 'textile'
|
77
|
+
out.insert 0, "<notextile>\n"
|
78
|
+
out << "\n</notextile>"
|
79
|
+
end
|
80
|
+
end unless @filters.nil?
|
81
|
+
|
71
82
|
cr.swap out
|
72
83
|
end
|
73
84
|
|
74
85
|
doc.to_html
|
75
86
|
end
|
76
87
|
|
77
|
-
end # class
|
88
|
+
end # class CodeRay
|
89
|
+
end # module Filters
|
78
90
|
end # module Webby
|
79
91
|
|
80
92
|
# EOF
|
@@ -0,0 +1,175 @@
|
|
1
|
+
# $Id: graphviz.rb 61 2007-12-04 05:48:23Z tim_pease $
|
2
|
+
|
3
|
+
require 'hpricot'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'tempfile'
|
6
|
+
|
7
|
+
module Webby
|
8
|
+
module Filters
|
9
|
+
|
10
|
+
# The Graphviz filter processes DOT scripts in a webpage and replaces them
|
11
|
+
# with generated image files. A set of <graphviz>...</graphviz> tags is
|
12
|
+
# used to denote which section(s) of the page contains DOT scripts.
|
13
|
+
#
|
14
|
+
# Options can be passed to the Graphviz filter using attributes in the
|
15
|
+
# <graphviz> tag.
|
16
|
+
#
|
17
|
+
# <graphviz path="images" type="gif" cmd="dot">
|
18
|
+
# digraph graph_1 {
|
19
|
+
# graph [URL="default.html"]
|
20
|
+
# a [URL="a.html"]
|
21
|
+
# b [URL="b.html"]
|
22
|
+
# c [URL="c.html"]
|
23
|
+
# a -> b -> c
|
24
|
+
# a -> c
|
25
|
+
# }
|
26
|
+
# </graphviz>
|
27
|
+
#
|
28
|
+
# If the DOT script contains *URL* or *href* statements on any of the nodes
|
29
|
+
# or edges, then an image map will be generated and the image will be
|
30
|
+
# "clikcable" in the webpage. If *URL* or *href* statements do not appear in
|
31
|
+
# the DOT script, then a regular image will be inserted into the webpage.
|
32
|
+
#
|
33
|
+
# The image is inserted into the page using an HTML <img /> tag. A
|
34
|
+
# corresponding <map>...</map> element will be inserted if needed.
|
35
|
+
#
|
36
|
+
# The supported Graphviz options are the following:
|
37
|
+
#
|
38
|
+
# path : where generated images will be stored
|
39
|
+
# [default is "/"]
|
40
|
+
# type : the type of image to generate (png, jpeg, gif)
|
41
|
+
# [default is png]
|
42
|
+
# cmd : the Graphviz command to use when generating images
|
43
|
+
# (dot, neato, twopi, circo, fdp) [default is dot]
|
44
|
+
#
|
45
|
+
# the following options are passed as-is to the generated <img /> tag
|
46
|
+
# style : CSS styles to apply to the <img />
|
47
|
+
# class : CSS class to apply to the <img />
|
48
|
+
# id : HTML identifier
|
49
|
+
# alt : alternate text for the <img />
|
50
|
+
#
|
51
|
+
class Graphviz
|
52
|
+
|
53
|
+
class Error < StandardError; end # :nodoc:
|
54
|
+
|
55
|
+
# call-seq:
|
56
|
+
# Graphviz.new( string, filters = nil )
|
57
|
+
#
|
58
|
+
# Creates a new Graphviz filter that will operate on the given _string_.
|
59
|
+
# The optional _filters_ describe filters that will be applied to the
|
60
|
+
# output string returned by the Graphviz filter.
|
61
|
+
#
|
62
|
+
def initialize( str, filters = nil )
|
63
|
+
@log = ::Logging::Logger[self]
|
64
|
+
@str = str
|
65
|
+
@filters = filters
|
66
|
+
|
67
|
+
# create a temporary file for holding any error messages
|
68
|
+
# from the graphviz program
|
69
|
+
@err = Tempfile.new('graphviz_err')
|
70
|
+
@err.close
|
71
|
+
end
|
72
|
+
|
73
|
+
# call-seq:
|
74
|
+
# to_html => string
|
75
|
+
#
|
76
|
+
# Process the original text string passed to the filter when it was
|
77
|
+
# created and output HTML formatted text. Any text between
|
78
|
+
# <graphviz>...</graphviz> tags will have the contained DOT syntax
|
79
|
+
# converted into an image and then included into the resulting HTML text.
|
80
|
+
#
|
81
|
+
def to_html
|
82
|
+
doc = Hpricot(@str)
|
83
|
+
doc.search('//graphviz') do |gviz|
|
84
|
+
|
85
|
+
text = gviz.inner_html.strip # the DOT script to process
|
86
|
+
path = gviz['path']
|
87
|
+
cmd = gviz['cmd'] || 'dot'
|
88
|
+
type = gviz['type'] || 'png'
|
89
|
+
|
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 << '.' << type
|
106
|
+
|
107
|
+
# create the HTML img tag
|
108
|
+
out = "<img src=\"#{image_fn}\""
|
109
|
+
|
110
|
+
%w[class style id alt].each do |attr|
|
111
|
+
next if gviz[attr].nil?
|
112
|
+
out << " %s=\"%s\"" % [attr, gviz[attr]]
|
113
|
+
end
|
114
|
+
|
115
|
+
out << " usemap=\"#{name}\"" if usemap
|
116
|
+
out << " />\n"
|
117
|
+
|
118
|
+
# generate the image map if needed
|
119
|
+
if usemap
|
120
|
+
IO.popen("#{cmd} -Tcmapx 2> #{@err.path}", 'r+') do |io|
|
121
|
+
io.write text
|
122
|
+
io.close_write
|
123
|
+
out << io.read
|
124
|
+
end
|
125
|
+
error_check
|
126
|
+
end
|
127
|
+
|
128
|
+
# generate the image using graphviz -- but first ensure that the
|
129
|
+
# path exists
|
130
|
+
out_dir = ::Webby.site.output_dir
|
131
|
+
out_file = File.join(out_dir, image_fn)
|
132
|
+
FileUtils.mkpath(File.join(out_dir, path)) unless path.nil?
|
133
|
+
cmd = "#{cmd} -T#{type} -o #{out_file} 2> #{@err.path}"
|
134
|
+
|
135
|
+
IO.popen(cmd, 'w') {|io| io.write text}
|
136
|
+
error_check
|
137
|
+
|
138
|
+
# see if we need to put some guards around the output
|
139
|
+
# (specifically for textile)
|
140
|
+
@filters.each do |f|
|
141
|
+
case f
|
142
|
+
when 'textile'
|
143
|
+
out.insert 0, "<notextile>\n"
|
144
|
+
out << "\n</notextile>"
|
145
|
+
end
|
146
|
+
end unless @filters.nil?
|
147
|
+
|
148
|
+
gviz.swap out
|
149
|
+
end
|
150
|
+
|
151
|
+
doc.to_html
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
private
|
156
|
+
|
157
|
+
# call-seq:
|
158
|
+
# error_check
|
159
|
+
#
|
160
|
+
# Check the temporary error file to see if it contains any error messages
|
161
|
+
# from the graphviz program. If it is not empty, then read the contents
|
162
|
+
# and log an error message and raise an exception.
|
163
|
+
#
|
164
|
+
def error_check
|
165
|
+
if File.size(@err.path) != 0
|
166
|
+
@log.error File.read(@err.path).strip
|
167
|
+
raise Error
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
end # class Graphviz
|
172
|
+
end # module Filters
|
173
|
+
end # module Webby
|
174
|
+
|
175
|
+
# EOF
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# $Id: tidy.rb 61 2007-12-04 05:48:23Z tim_pease $
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'tempfile'
|
5
|
+
|
6
|
+
module Webby
|
7
|
+
module Filters
|
8
|
+
|
9
|
+
# The Tidy filter is used to process HTML (or XHTML) through the _tidy_
|
10
|
+
# program and outpu nicely formatted and correct HTML (or XHTML).
|
11
|
+
#
|
12
|
+
# Options can be passed to the _tidy_ program via the
|
13
|
+
# <code>Webby.site</code> struct. Setting the +tidy_options+ to the string
|
14
|
+
# of desired options will do the trick.
|
15
|
+
#
|
16
|
+
# From a project's Rakefile, include the following line (or one that's more
|
17
|
+
# to your liking):
|
18
|
+
#
|
19
|
+
# SITE.tidy_options = "-indent -wrap 80 -utf8"
|
20
|
+
#
|
21
|
+
class Tidy
|
22
|
+
|
23
|
+
class Error < StandardError; end # :nodoc:
|
24
|
+
|
25
|
+
# call-seq:
|
26
|
+
# Tidy.new( html )
|
27
|
+
#
|
28
|
+
# Create a new filter that will process the given _html_ through the tidy
|
29
|
+
# program.
|
30
|
+
#
|
31
|
+
def initialize( str )
|
32
|
+
@log = ::Logging::Logger[self]
|
33
|
+
@str = str
|
34
|
+
|
35
|
+
# create a temporary file for holding any error messages
|
36
|
+
# from the tidy program
|
37
|
+
@err = Tempfile.new('tidy_err')
|
38
|
+
@err.close
|
39
|
+
end
|
40
|
+
|
41
|
+
# call-seq:
|
42
|
+
# process => formatted html
|
43
|
+
#
|
44
|
+
# Process the original HTML text string passed to the filter when it was
|
45
|
+
# created and output Tidy formatted HTML or XHTML.
|
46
|
+
#
|
47
|
+
def process
|
48
|
+
%x[tidy -v 2>&1]
|
49
|
+
unless 0 == $?.exitstatus
|
50
|
+
raise NameError, "'tidy' not found on the path"
|
51
|
+
end
|
52
|
+
|
53
|
+
cmd = "tidy %s -q -f #{@err.path}" % ::Webby.site.tidy_options
|
54
|
+
out = IO.popen(cmd, 'r+') do |tidy|
|
55
|
+
tidy.write @str
|
56
|
+
tidy.close_write
|
57
|
+
tidy.read
|
58
|
+
end
|
59
|
+
|
60
|
+
if File.size(@err.path) != 0
|
61
|
+
@log.warn File.read(@err.path).strip
|
62
|
+
end
|
63
|
+
|
64
|
+
return out
|
65
|
+
end
|
66
|
+
|
67
|
+
end # class Tidy
|
68
|
+
end # module Filters
|
69
|
+
end # module Webby
|
70
|
+
|
71
|
+
# EOF
|
data/lib/webby/renderer.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: renderer.rb
|
1
|
+
# $Id: renderer.rb 61 2007-12-04 05:48:23Z tim_pease $
|
2
2
|
|
3
3
|
require 'erb'
|
4
4
|
try_require 'bluecloth'
|
@@ -160,8 +160,9 @@ class Renderer
|
|
160
160
|
#
|
161
161
|
def markdown_filter( str )
|
162
162
|
BlueCloth.new(str).to_html
|
163
|
-
rescue NameError
|
163
|
+
rescue NameError => err
|
164
164
|
@log.error 'markdown filter failed (BlueCloth not installed?)'
|
165
|
+
@log.debug err
|
165
166
|
exit
|
166
167
|
end
|
167
168
|
|
@@ -169,17 +170,57 @@ class Renderer
|
|
169
170
|
#
|
170
171
|
def textile_filter( str )
|
171
172
|
RedCloth.new(str).to_html
|
172
|
-
rescue NameError
|
173
|
+
rescue NameError => err
|
173
174
|
@log.error 'textile filter failed (RedCloth not installed?)'
|
175
|
+
@log.debug err
|
174
176
|
exit
|
175
177
|
end
|
176
178
|
|
177
179
|
# Render text via the CodeRay syntax highlighter library.
|
178
180
|
#
|
179
181
|
def coderay_filter( str )
|
180
|
-
|
181
|
-
|
182
|
+
filters = nil
|
183
|
+
|
184
|
+
if Array === @page.filter
|
185
|
+
idx = @page.filter.index('coderay') + 1
|
186
|
+
filters = @page.filter.slice(idx..-1)
|
187
|
+
end
|
188
|
+
|
189
|
+
Filters::CodeRay.new(str, filters).to_html
|
190
|
+
rescue NameError => err
|
182
191
|
@log.error 'coderay filter failed (CodeRay not installed?)'
|
192
|
+
@log.debug err
|
193
|
+
exit
|
194
|
+
end
|
195
|
+
|
196
|
+
# Render text into iamges via the Graphviz programs.
|
197
|
+
#
|
198
|
+
def graphviz_filter( str )
|
199
|
+
filters = nil
|
200
|
+
|
201
|
+
if Array === @page.filter
|
202
|
+
idx = @page.filter.index('graphviz') + 1
|
203
|
+
filters = @page.filter.slice(idx..-1)
|
204
|
+
end
|
205
|
+
|
206
|
+
Filters::Graphviz.new(str, filters).to_html
|
207
|
+
rescue NameError => err
|
208
|
+
@log.error 'graphviz filter failed (Graphviz not installed?)'
|
209
|
+
@log.debug err
|
210
|
+
exit
|
211
|
+
rescue Filters::Graphviz::Error
|
212
|
+
exit
|
213
|
+
end
|
214
|
+
|
215
|
+
# Render html into html/xhtml via the Tidy program
|
216
|
+
#
|
217
|
+
def tidy_filter( str )
|
218
|
+
Filters::Tidy.new(str).process
|
219
|
+
rescue NameError => err
|
220
|
+
@log.error 'tidy filter failed (Tidy not installed?)'
|
221
|
+
@log.debug err
|
222
|
+
exit
|
223
|
+
rescue Filters::Tidy::Error
|
183
224
|
exit
|
184
225
|
end
|
185
226
|
|
@@ -190,8 +231,9 @@ class Renderer
|
|
190
231
|
opts[:locals] ||= {}
|
191
232
|
opts[:locals].merge!({:page => @page, :pages => @pages})
|
192
233
|
Haml::Engine.new(str, opts).to_html
|
193
|
-
rescue NameError
|
234
|
+
rescue NameError => err
|
194
235
|
@log.error 'haml filter failed (Haml not installed?)'
|
236
|
+
@log.debug err
|
195
237
|
exit
|
196
238
|
end
|
197
239
|
|
@@ -200,8 +242,9 @@ class Renderer
|
|
200
242
|
def sass_filter( str )
|
201
243
|
opts = @page.sass_options || {}
|
202
244
|
Sass::Engine.new(str, opts).render
|
203
|
-
rescue NameError
|
245
|
+
rescue NameError => err
|
204
246
|
@log.error 'sass filter failed (Haml not installed?)'
|
247
|
+
@log.debug err
|
205
248
|
exit
|
206
249
|
end
|
207
250
|
|
data/lib/webby/resource.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: resource.rb
|
1
|
+
# $Id: resource.rb 61 2007-12-04 05:48:23Z tim_pease $
|
2
2
|
|
3
3
|
module Webby
|
4
4
|
|
@@ -77,7 +77,7 @@ class Resource
|
|
77
77
|
@have_mdata = !@mdata.nil?
|
78
78
|
|
79
79
|
@mdata ||= {}
|
80
|
-
@mdata = ::Webby.page_defaults.merge(@mdata) if is_page?
|
80
|
+
@mdata = ::Webby.site.page_defaults.merge(@mdata) if is_page?
|
81
81
|
@mdata.sanitize!
|
82
82
|
|
83
83
|
self.class.pages << self if is_page? or is_static?
|
@@ -147,7 +147,7 @@ class Resource
|
|
147
147
|
@dest = if @mdata.has_key? 'destination' then @mdata['destination']
|
148
148
|
else File.join(dir, filename) end
|
149
149
|
|
150
|
-
@dest = File.join(::Webby.
|
150
|
+
@dest = File.join(::Webby.site.output_dir, @dest)
|
151
151
|
@dest << @number.to_s if @number
|
152
152
|
@dest << '.'
|
153
153
|
@dest << extension
|
@@ -155,17 +155,17 @@ class Resource
|
|
155
155
|
end
|
156
156
|
|
157
157
|
# call-seq
|
158
|
-
#
|
158
|
+
# url => string or nil
|
159
159
|
#
|
160
|
-
# Returns a string suitable for use as
|
160
|
+
# Returns a string suitable for use as a URL linking to this page. Nil
|
161
161
|
# is returned for layouts.
|
162
162
|
#
|
163
|
-
def
|
163
|
+
def url
|
164
164
|
return nil if is_layout?
|
165
|
-
return @
|
165
|
+
return @url if defined? @url and @url
|
166
166
|
|
167
|
-
@
|
168
|
-
@
|
167
|
+
@url = destination.sub(::Webby.site.output_dir, '')
|
168
|
+
@url
|
169
169
|
end
|
170
170
|
|
171
171
|
# call-seq:
|
@@ -212,7 +212,7 @@ class Resource
|
|
212
212
|
#
|
213
213
|
def is_layout?
|
214
214
|
@is_layout ||=
|
215
|
-
!(%r/\A(?:\.\/|\/)?#{::Webby.
|
215
|
+
!(%r/\A(?:\.\/|\/)?#{::Webby.site.layout_dir}\//o =~ @path).nil?
|
216
216
|
end
|
217
217
|
|
218
218
|
# call-seq:
|
data/lib/webby/webby_task.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: webby_task.rb
|
1
|
+
# $Id: webby_task.rb 60 2007-12-04 05:05:50Z tim_pease $
|
2
2
|
|
3
3
|
begin
|
4
4
|
require 'rake'
|
@@ -33,24 +33,6 @@ module Rake
|
|
33
33
|
#
|
34
34
|
class WebbyTask < TaskLib
|
35
35
|
|
36
|
-
# Define a setter and getter for each key in the Webby configuration hash
|
37
|
-
::Webby.config.keys.each do |key|
|
38
|
-
self.class_eval do
|
39
|
-
define_method(key) {::Webby.config[key]}
|
40
|
-
define_method(key+'=') {|val| ::Webby.config[key] = val}
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Global page attributes
|
45
|
-
def page_defaults
|
46
|
-
::Webby.page_defaults
|
47
|
-
end
|
48
|
-
|
49
|
-
# Merge the given _hash_ with the page defaults hash
|
50
|
-
def page_defaults=( hash )
|
51
|
-
::Webby.page_defaults.merge! hash
|
52
|
-
end
|
53
|
-
|
54
36
|
# call-seq:
|
55
37
|
# WebbyTask.new {|self| block}
|
56
38
|
#
|
@@ -92,15 +74,15 @@ class WebbyTask < TaskLib
|
|
92
74
|
# task for creating a new page based on that template.
|
93
75
|
#
|
94
76
|
def define_create_tasks
|
95
|
-
FileList["#{template_dir}/*"].each do |template|
|
77
|
+
FileList["#{::Webby.site.template_dir}/*"].each do |template|
|
96
78
|
name = template.pathmap '%n'
|
97
79
|
|
98
|
-
desc "create a new #{name}
|
80
|
+
desc "create a new #{name}"
|
99
81
|
task name do |t|
|
100
82
|
raise "Usage: rake #{t.name} path" unless ARGV.length == 2
|
101
83
|
|
102
84
|
page = t.application.top_level_tasks.pop
|
103
|
-
page = File.join(content_dir, page)
|
85
|
+
page = File.join(::Webby.site.content_dir, page)
|
104
86
|
page << '.txt' if File.extname(page).empty?
|
105
87
|
|
106
88
|
::Webby::Builder.create page, :from => template
|
data/website/Rakefile
CHANGED
data/website/content/index.txt
CHANGED
@@ -15,8 +15,10 @@ gem install webby
|
|
15
15
|
|
16
16
|
h2. Features
|
17
17
|
|
18
|
-
* choose your templating language: *eRuby*, *Textile*, *Markdown*, *HAML*
|
18
|
+
* choose your templating language: *eRuby*, *Textile*, *Markdown*, *HAML*, *SASS*
|
19
19
|
* support for "CodeRay":http://coderay.rubychan.de/ syntax highlighting
|
20
|
+
* embeddable DOT scripts for "Graphviz":http://www.graphviz.org/ graphs
|
21
|
+
* automatically clean up generated content using "Tidy":http://tidy.sourceforge.net/
|
20
22
|
* quick and speedy - only builds pages that have changed
|
21
23
|
* deploy anywhere - it's just HTML, no special server stuff required
|
22
24
|
* happy "rake":http://docs.rubyrake.org/ tasks for deploying your website to a server
|
data/website/content/manual.txt
CHANGED
@@ -3,19 +3,46 @@ title: Manual
|
|
3
3
|
created_at: Wed Aug 29 08:57:00 -0600 2007
|
4
4
|
filter:
|
5
5
|
- coderay
|
6
|
+
- graphviz
|
6
7
|
- textile
|
7
8
|
---
|
9
|
+
<graphviz path="images" alt="test image">
|
10
|
+
digraph my_graph {
|
11
|
+
// order all the nodes from Left to Right
|
12
|
+
rankdir=LR;
|
13
|
+
|
14
|
+
// defaults for each node in the graph
|
15
|
+
node [shape=rect,
|
16
|
+
style=filled,
|
17
|
+
fillcolor="#99CCCC",
|
18
|
+
fontname="Verdana",
|
19
|
+
fontsize=10];
|
20
|
+
|
21
|
+
// defaults for each edge in the graph
|
22
|
+
edge [fontname="Verdana", fontsize=8];
|
23
|
+
|
24
|
+
// the graph
|
25
|
+
a [URL="/index.html", label="Home"];
|
26
|
+
b [URL="/download.html", label="Download"];
|
27
|
+
c [URL="/tutorial.html", label="Tutorial"];
|
28
|
+
d [label="Manual", fillcolor="#6699CC"];
|
29
|
+
e [URL="/tips_and_tricks.html", label="Tips &\nTricks"];
|
30
|
+
|
31
|
+
a -> b -> c;
|
32
|
+
c -> d -> e;
|
33
|
+
a -> c [URL="http://www.google.com" label="skipping\ndownload"];
|
34
|
+
}
|
35
|
+
</graphviz>
|
36
|
+
|
8
37
|
h2. To-Do
|
9
38
|
|
10
39
|
The Webby user's manual goes here.
|
11
40
|
|
12
|
-
<notextile>
|
13
41
|
<coderay lang="ruby">
|
14
42
|
def method( blah )
|
15
43
|
blah.upcase
|
16
44
|
end
|
17
45
|
</coderay>
|
18
|
-
</notextile>
|
19
46
|
|
20
47
|
directory structure
|
21
48
|
* content
|
@@ -15,8 +15,6 @@ h2(#toc_cr){clear:none}. CodeRay
|
|
15
15
|
|
16
16
|
To include "CodeRay":http://coderay.rubychan.de/ syntax highlighting support in a page you need to have the @coderay@ gem installed, and you need to include the CodeRay stylesheet in your layout. The following example shows a page that uses CodeRay syntax highlighting combined with Textile markup.
|
17
17
|
|
18
|
-
Note how the @coderay@ block is enclosed by a @notextile@ block. This ensures that the Textile filter does not clobber the generated syntax highlighting.
|
19
|
-
|
20
18
|
<pre class="code">
|
21
19
|
---
|
22
20
|
title: CodeRay Example
|
@@ -30,8 +28,7 @@ h2. <%= h(@page.title) %>
|
|
30
28
|
This is the @render_page@ function from the Webby static website generation
|
31
29
|
system. It is used to render a page by applying the specified filters in
|
32
30
|
succession to the page contents.
|
33
|
-
|
34
|
-
<notextile><notextile>
|
31
|
+
<notextile>
|
35
32
|
<coderay lang="ruby" line_numbers="inline">
|
36
33
|
# call-seq:
|
37
34
|
# render_page => string
|
@@ -50,7 +47,6 @@ def render_page
|
|
50
47
|
str
|
51
48
|
end
|
52
49
|
</coderay>
|
53
|
-
|
54
|
-
</pre>
|
50
|
+
</notextile></pre>
|
55
51
|
|
56
|
-
There are more options that can be passed to the CodeRay syntax highlighter than those shown in the example above. Take a look at the RDoc documentation for the "
|
52
|
+
There are more options that can be passed to the CodeRay syntax highlighter than those shown in the example above. Take a look at the RDoc documentation for the "CodeRay Filter":http://webby.rubyforge.org/rdoc/classes/Webby/CodeRayFilter.html class for more information.
|
data/website/tasks/create.rake
CHANGED
@@ -1,13 +1,4 @@
|
|
1
1
|
|
2
|
-
|
3
|
-
|
4
|
-
Rake::WebbyTask.new do |webby|
|
5
|
-
webby.content_dir = SITE.content_dir
|
6
|
-
webby.output_dir = SITE.output_dir
|
7
|
-
webby.layout_dir = SITE.layout_dir
|
8
|
-
webby.template_dir = SITE.template_dir
|
9
|
-
webby.exclude = SITE.exclude
|
10
|
-
webby.page_defaults = SITE.page_defaults
|
11
|
-
end
|
2
|
+
Rake::WebbyTask.new
|
12
3
|
|
13
4
|
# EOF
|
data/website/tasks/setup.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
|
2
|
-
require '
|
2
|
+
require 'webby'
|
3
3
|
|
4
|
-
SITE =
|
4
|
+
SITE = Webby.site
|
5
5
|
|
6
|
+
# Webby defaults
|
6
7
|
SITE.content_dir = 'content'
|
7
8
|
SITE.output_dir = 'output'
|
8
9
|
SITE.layout_dir = 'layouts'
|
@@ -14,12 +15,18 @@ SITE.page_defaults = {
|
|
14
15
|
'layout' => 'default'
|
15
16
|
}
|
16
17
|
|
18
|
+
# Items used to deploy the webiste
|
17
19
|
SITE.host = 'user@hostname.tld'
|
18
20
|
SITE.remote_dir = '/not/a/valid/dir'
|
19
21
|
SITE.rsync_args = %w(-av --delete)
|
20
22
|
|
23
|
+
# Options passed to the 'tidy' program when the tidy filter is used
|
24
|
+
SITE.tidy_options = '-indent -wrap 80'
|
25
|
+
|
26
|
+
# Load up the other rake tasks
|
21
27
|
FileList['tasks/*.rake'].each {|task| import task}
|
22
28
|
|
29
|
+
# Conditional dependencies
|
23
30
|
%w(heel).each do |lib|
|
24
31
|
Object.instance_eval {const_set "HAVE_#{lib.upcase}", try_require(lib)}
|
25
32
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: webby
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.6.0
|
7
|
+
date: 2007-12-04 00:00:00 -07:00
|
8
8
|
summary: static website creation and management
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -61,8 +61,10 @@ files:
|
|
61
61
|
- lib/webby.rb
|
62
62
|
- lib/webby/auto_builder.rb
|
63
63
|
- lib/webby/builder.rb
|
64
|
-
- lib/webby/coderay_filter.rb
|
65
64
|
- lib/webby/file.rb
|
65
|
+
- lib/webby/filters/coderay.rb
|
66
|
+
- lib/webby/filters/graphviz.rb
|
67
|
+
- lib/webby/filters/tidy.rb
|
66
68
|
- lib/webby/main.rb
|
67
69
|
- lib/webby/pages_db.rb
|
68
70
|
- lib/webby/renderer.rb
|