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