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
@@ -1,18 +1,18 @@
|
|
1
|
-
# $Id:
|
1
|
+
# $Id: db.rb 169 2008-02-24 03:59:37Z tim_pease $
|
2
2
|
|
3
|
-
module Webby
|
3
|
+
module Webby::Resources
|
4
4
|
|
5
5
|
# A rudimentary "database" for holding resource objects and finding them.
|
6
6
|
# The database is held in a Ruby hash keyed by the directories in the
|
7
7
|
# content folder.
|
8
8
|
#
|
9
|
-
class
|
9
|
+
class DB
|
10
10
|
|
11
11
|
# call-seq:
|
12
|
-
#
|
12
|
+
# DB.new
|
13
13
|
#
|
14
|
-
# Create a new
|
15
|
-
# to find them by their attributes.
|
14
|
+
# Create a new resources database object. This is used to store resources
|
15
|
+
# and to find them by their attributes.
|
16
16
|
#
|
17
17
|
def initialize
|
18
18
|
@db = Hash.new {|h,k| h[k] = []}
|
@@ -63,40 +63,43 @@ class PagesDB
|
|
63
63
|
# find( opts = {} ) => resource or nil
|
64
64
|
# find( opts = {} ) {|resource| block} => resource or nil
|
65
65
|
#
|
66
|
-
# Find a specific resource
|
67
|
-
# any combination of attributes by passing them
|
68
|
-
# +find+ method. This will used simple equality
|
69
|
-
# resource.
|
66
|
+
# Find a specific resource or collection of resources in the pages database.
|
67
|
+
# Resources can be found using any combination of attributes by passing them
|
68
|
+
# in as options to the +find+ method. This will used simple equality
|
69
|
+
# comparison to find the resource or resources.
|
70
70
|
#
|
71
|
-
#
|
72
|
-
#
|
73
|
-
#
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
71
|
+
# If the :include option is given as :all then all resources that match
|
72
|
+
# the finder criteria will be returned in an array. If none are found, an
|
73
|
+
# empty array will be returned. If the :include option is given as an
|
74
|
+
# integer then the first n resources found will be returned. Otherwise, or
|
75
|
+
# if the :include option is not given, the first resource found will be
|
76
|
+
# returned
|
77
|
+
#
|
78
|
+
# For more complex finders, a block should be supplied. The usage follows
|
79
|
+
# that of of the Enumerable#find or Enumerable#find_all methods, depending
|
80
|
+
# on the limit. The method will return the first resource or all
|
81
|
+
# resources, respectively, for which the block returns true.
|
82
|
+
#
|
83
|
+
# Options:
|
84
|
+
# :limit => :all, integer or nil
|
85
|
+
# :in_directory => directory
|
82
86
|
# :recursive => true or false
|
83
|
-
#
|
84
|
-
# :
|
85
|
-
# :sorty_by => 'attribute'
|
87
|
+
# :sort_by => attribute
|
88
|
+
# :reverse => true or false
|
86
89
|
#
|
87
90
|
# Examples:
|
88
91
|
#
|
89
92
|
# # find the "index" resource in the "foo/bar" directory
|
90
|
-
#
|
93
|
+
# @pages.find( :filename => 'index', :in_directory => 'foo/bar' )
|
91
94
|
#
|
92
|
-
# # find
|
93
|
-
#
|
95
|
+
# # find all resources under the "foo/bar" directory recursively
|
96
|
+
# @pages.find( :limit => :all, :in_directory => 'foo/bar', :recursive => true )
|
94
97
|
#
|
95
|
-
# # find
|
96
|
-
#
|
98
|
+
# # find the resource named "widgets" whose color is "blue"
|
99
|
+
# @pages.find( :name => 'widgets', :color => 'blue' )
|
97
100
|
#
|
98
101
|
# # find all resources created in the past week
|
99
|
-
#
|
102
|
+
# @pages.find( :limit => :all ) do |resource|
|
100
103
|
# resource.created_at > Time.now - (7 * 24 * 3600)
|
101
104
|
# end
|
102
105
|
#
|
@@ -105,12 +108,13 @@ class PagesDB
|
|
105
108
|
|
106
109
|
limit = opts.delete(:limit)
|
107
110
|
sort_by = opts.delete(:sort_by)
|
111
|
+
reverse = opts.delete(:reverse)
|
108
112
|
|
109
113
|
# figure out which directories to search through and whether to recurse
|
110
114
|
# into directories or not
|
111
115
|
search = if (dir = opts.delete(:in_directory))
|
112
116
|
strategy = if opts.delete(:recursive)
|
113
|
-
lambda { |key| key =~ /^#{Regexp.escape(dir)}(?:\/|$)/ }
|
117
|
+
lambda { |key| key =~ %r/^#{Regexp.escape(dir)}(?:\/|$)/ }
|
114
118
|
else
|
115
119
|
lambda { |key| key == dir }
|
116
120
|
end
|
@@ -141,7 +145,9 @@ class PagesDB
|
|
141
145
|
if sort_by
|
142
146
|
m = sort_by.to_sym
|
143
147
|
ary.delete_if {|p| p.__send__(m).nil?}
|
144
|
-
|
148
|
+
reverse ?
|
149
|
+
ary.sort! {|a,b| b.__send__(m) <=> a.__send__(m)} :
|
150
|
+
ary.sort! {|a,b| a.__send__(m) <=> b.__send__(m)}
|
145
151
|
end
|
146
152
|
|
147
153
|
# limit the search results
|
@@ -205,7 +211,31 @@ class PagesDB
|
|
205
211
|
ary
|
206
212
|
end
|
207
213
|
|
208
|
-
|
214
|
+
# call-seq:
|
215
|
+
# parent_of( resource ) => resource or nil
|
216
|
+
#
|
217
|
+
# Returns the parent page of the given resource or nil if the resource is
|
218
|
+
# at the root of the directory structure. The parent is the "index" page
|
219
|
+
# of the current directory or the next directory up the chain.
|
220
|
+
#
|
221
|
+
def parent_of( page )
|
222
|
+
dir = page.dir
|
223
|
+
|
224
|
+
loop do
|
225
|
+
if @db.has_key? dir
|
226
|
+
parent = @db[dir].find {|p| p.filename == 'index'}
|
227
|
+
return parent unless parent.nil? or parent == page
|
228
|
+
end
|
229
|
+
|
230
|
+
break if dir.empty?
|
231
|
+
dir = ::File.dirname(dir)
|
232
|
+
dir = '' if dir == '.'
|
233
|
+
end
|
234
|
+
|
235
|
+
return
|
236
|
+
end
|
237
|
+
|
238
|
+
end # class DB
|
209
239
|
end # module Webby
|
210
240
|
|
211
241
|
# EOF
|
@@ -1,13 +1,13 @@
|
|
1
|
-
# $Id: file.rb
|
1
|
+
# $Id: file.rb 167 2008-02-24 00:59:54Z tim_pease $
|
2
2
|
|
3
3
|
require 'yaml'
|
4
4
|
|
5
|
-
module Webby
|
5
|
+
module Webby::Resources
|
6
6
|
|
7
|
-
# The Webby::File class is identical to the core Ruby file class
|
8
|
-
# YAML meta-data stored at the top of the file. This meta-data
|
9
|
-
# available through the <code>meta_data</code> and
|
10
|
-
# functions.
|
7
|
+
# The Webby::Resources::File class is identical to the core Ruby file class
|
8
|
+
# except for YAML meta-data stored at the top of the file. This meta-data
|
9
|
+
# is made available through the <code>meta_data</code> and
|
10
|
+
# <code>meta_data=</code> functions.
|
11
11
|
#
|
12
12
|
# The meta-data data must be found between two YAML block separators "---",
|
13
13
|
# each on their own line.
|
@@ -30,7 +30,7 @@ class File < ::File
|
|
30
30
|
|
31
31
|
class << self
|
32
32
|
# call-seq:
|
33
|
-
#
|
33
|
+
# File.read( name [, length [, offset]]) => string
|
34
34
|
#
|
35
35
|
# Opens the file, optionally seeks to the given _offset_, then returns
|
36
36
|
# _length_ bytes (defaulting to the rest of the file). +read+ ensures
|
@@ -38,13 +38,13 @@ class File < ::File
|
|
38
38
|
#
|
39
39
|
def read( name, *args )
|
40
40
|
fd = new name, 'r'
|
41
|
-
fd.read
|
41
|
+
fd.read(*args)
|
42
42
|
ensure
|
43
43
|
fd.close unless fd.nil?
|
44
44
|
end
|
45
45
|
|
46
46
|
# call-seq:
|
47
|
-
#
|
47
|
+
# File.readlines( name, sep_string = $/ ) => array
|
48
48
|
#
|
49
49
|
# Reads the entire file specified by _name_ as individual lines, and
|
50
50
|
# returns those lines in an array. Lines are separated by _sep_string_.
|
@@ -58,7 +58,7 @@ class File < ::File
|
|
58
58
|
end
|
59
59
|
|
60
60
|
# call-seq:
|
61
|
-
#
|
61
|
+
# File.meta_data( name ) => object or nil
|
62
62
|
#
|
63
63
|
# Reads the meta-data from the file specified by _name_. +meta_data+
|
64
64
|
# ensures the files is closed before returning.
|
@@ -71,7 +71,7 @@ class File < ::File
|
|
71
71
|
end
|
72
72
|
|
73
73
|
# call-seq:
|
74
|
-
#
|
74
|
+
# File.dirname( filename ) => dir_name
|
75
75
|
#
|
76
76
|
# Returns all components of the _filename_ except the last one. The
|
77
77
|
# filename must be formed using forward slashes ("/") regardless of the
|
@@ -82,7 +82,7 @@ class File < ::File
|
|
82
82
|
end
|
83
83
|
|
84
84
|
# call-seq:
|
85
|
-
#
|
85
|
+
# File.basename( filename ) => base_name
|
86
86
|
#
|
87
87
|
# Returns the last component of the _filename_, which must be formed
|
88
88
|
# using forward slashes ("/"regardless of the separator used on the
|
@@ -93,7 +93,7 @@ class File < ::File
|
|
93
93
|
end
|
94
94
|
|
95
95
|
# call-seq:
|
96
|
-
#
|
96
|
+
# File.extname( filename ) => ext_name
|
97
97
|
#
|
98
98
|
# Returns the extension (the portion of file name in path after the
|
99
99
|
# period). This method excludes the period from the extension name.
|
@@ -104,16 +104,16 @@ class File < ::File
|
|
104
104
|
end
|
105
105
|
|
106
106
|
# call-seq:
|
107
|
-
#
|
108
|
-
#
|
107
|
+
# File.new( filename, mode = "r" ) => file
|
108
|
+
# File.new( filename [, mode [, perm]] ) => file
|
109
109
|
#
|
110
110
|
# Opens the file named by _filename_ according to _mode_ (default is 'r')
|
111
|
-
# and returns a new +Webby::File+ object. See the description
|
112
|
-
# +IO+ for a description of _mode_. The file _mode_ may
|
113
|
-
# specified as a +Fixnum+ by or-ing together the flags
|
114
|
-
# again described under +IO+). Optional permission bits
|
115
|
-
# _perm_. These _mode_ and permission bits are platform
|
116
|
-
# systems, see +open(2)+ for details.
|
111
|
+
# and returns a new +Webby::Resources::File+ object. See the description
|
112
|
+
# of class +IO+ for a description of _mode_. The file _mode_ may
|
113
|
+
# optionally be specified as a +Fixnum+ by or-ing together the flags
|
114
|
+
# (+O_RDONLY+ etc, again described under +IO+). Optional permission bits
|
115
|
+
# may be given in _perm_. These _mode_ and permission bits are platform
|
116
|
+
# dependent; on Unix systems, see +open(2)+ for details.
|
117
117
|
#
|
118
118
|
# f = File.new("testfile", "r")
|
119
119
|
# f = File.new("newfile", "w+")
|
@@ -172,6 +172,9 @@ class File < ::File
|
|
172
172
|
seek 0, IO::SEEK_END
|
173
173
|
end
|
174
174
|
|
175
|
+
alias :_gets :gets
|
176
|
+
private :_gets
|
177
|
+
|
175
178
|
%w(getc gets read read_nonblock readbytes readchar readline readlines readpartial scanf).each do |m|
|
176
179
|
self.class_eval <<-CODE
|
177
180
|
def #{m}(*a)
|
@@ -201,10 +204,10 @@ class File < ::File
|
|
201
204
|
cur = tell
|
202
205
|
|
203
206
|
seek 0
|
204
|
-
line =
|
207
|
+
line = _gets
|
205
208
|
return unless META_SEP =~ line
|
206
209
|
|
207
|
-
while line =
|
210
|
+
while line = _gets
|
208
211
|
break if META_SEP =~ line
|
209
212
|
end
|
210
213
|
return if line.nil?
|
@@ -215,6 +218,6 @@ class File < ::File
|
|
215
218
|
end
|
216
219
|
|
217
220
|
end # class File
|
218
|
-
end # module Webby
|
221
|
+
end # module Webby::Resources
|
219
222
|
|
220
223
|
# EOF
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# $Id: layout.rb 167 2008-02-24 00:59:54Z tim_pease $
|
2
|
+
|
3
|
+
require Webby.libpath(*%w[webby resources resource])
|
4
|
+
|
5
|
+
module Webby::Resources
|
6
|
+
|
7
|
+
# A Layout is any file that is found in the layout folder of the webiste
|
8
|
+
# directory. Layouts container the common elements of all the pages in a
|
9
|
+
# website, and pages from the content folder are rendered into the layout.
|
10
|
+
#
|
11
|
+
class Layout < Resource
|
12
|
+
|
13
|
+
# call-seq:
|
14
|
+
# Layout.new( path )
|
15
|
+
#
|
16
|
+
# Creates a new Layout object given the full path to the layout file.
|
17
|
+
#
|
18
|
+
def initialize( fn )
|
19
|
+
super
|
20
|
+
|
21
|
+
@mdata = ::Webby::Resources::File.meta_data(@path)
|
22
|
+
@mdata ||= {}
|
23
|
+
@mdata.sanitize!
|
24
|
+
end
|
25
|
+
|
26
|
+
# call-seq:
|
27
|
+
# destination => string
|
28
|
+
#
|
29
|
+
# The output file destination for the layout. This is the ".cairn" file in
|
30
|
+
# the output folder. It is used to determine if the layout is newer than
|
31
|
+
# the build products.
|
32
|
+
#
|
33
|
+
def destination
|
34
|
+
::Webby.cairn
|
35
|
+
end
|
36
|
+
|
37
|
+
# call-seq:
|
38
|
+
# extension => string or nil
|
39
|
+
#
|
40
|
+
# Returns the extension to be applied to output files rendered by the
|
41
|
+
# layotut. This will either be a string or +nil+ if the layout does not
|
42
|
+
# specify an extension to use.
|
43
|
+
#
|
44
|
+
def extension
|
45
|
+
return @mdata['extension'] if @mdata.has_key? 'extension'
|
46
|
+
|
47
|
+
if @mdata.has_key? 'layout'
|
48
|
+
lyt = ::Webby::Resources.layouts.find :filename => @mdata['layout']
|
49
|
+
ext = lyt ? lyt.extension : nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# call-seq:
|
54
|
+
# url => nil
|
55
|
+
#
|
56
|
+
# Layouts do not have a URL. This method will alwasy return +nil+.
|
57
|
+
#
|
58
|
+
def url
|
59
|
+
nil
|
60
|
+
end
|
61
|
+
|
62
|
+
end # class Layout
|
63
|
+
end # module Webby::Resources
|
64
|
+
|
65
|
+
# EOF
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# $Id: page.rb 167 2008-02-24 00:59:54Z tim_pease $
|
2
|
+
|
3
|
+
require Webby.libpath(*%w[webby resources resource])
|
4
|
+
|
5
|
+
module Webby::Resources
|
6
|
+
|
7
|
+
# A Page is a file in the content folder that contains YAML meta-data at
|
8
|
+
# the top of the file. Pages are processed by the Webby rendering engine
|
9
|
+
# and then inserted into the desired layout. The string resulting from
|
10
|
+
# processing and layout is then written to the output directory.
|
11
|
+
#
|
12
|
+
class Page < Resource
|
13
|
+
|
14
|
+
# Resource page number (if needed)
|
15
|
+
attr_reader :number
|
16
|
+
|
17
|
+
# call-seq:
|
18
|
+
# Resource.new( path )
|
19
|
+
#
|
20
|
+
# Creates a new page object from the full path to the page file.
|
21
|
+
#
|
22
|
+
def initialize( fn )
|
23
|
+
super
|
24
|
+
@number = nil
|
25
|
+
|
26
|
+
@mdata = ::Webby::Resources::File.meta_data(@path)
|
27
|
+
@mdata ||= {}
|
28
|
+
@mdata = ::Webby.site.page_defaults.merge(@mdata)
|
29
|
+
@mdata.sanitize!
|
30
|
+
end
|
31
|
+
|
32
|
+
# call-seq:
|
33
|
+
# render => string
|
34
|
+
#
|
35
|
+
# Creates a new Webby::Renderer instance and uses that instance to render
|
36
|
+
# the page contents using the configured filter(s). The filter(s) to
|
37
|
+
# use is defined in the page's meta-data as the 'filter' key.
|
38
|
+
#
|
39
|
+
# Note, this only renders this page. The returned string does not include
|
40
|
+
# any layout rendering.
|
41
|
+
#
|
42
|
+
def render( renderer = nil )
|
43
|
+
renderer ||= ::Webby::Renderer.new(self)
|
44
|
+
renderer.render_page
|
45
|
+
end
|
46
|
+
|
47
|
+
# call-seq:
|
48
|
+
# page.number = Integer
|
49
|
+
#
|
50
|
+
# Sets the page number for the current resource to the given integer. This
|
51
|
+
# number is used to modify the output destination for resources that
|
52
|
+
# require pagination.
|
53
|
+
#
|
54
|
+
def number=( num )
|
55
|
+
@number = num
|
56
|
+
@dest = nil
|
57
|
+
end
|
58
|
+
|
59
|
+
# call-seq:
|
60
|
+
# destination => string
|
61
|
+
#
|
62
|
+
# Returns the path in the output directory where the rendered page should
|
63
|
+
# be stored. This path is used to determine if the page is dirty and in
|
64
|
+
# need of rendering.
|
65
|
+
#
|
66
|
+
# The destination for a page can be overridden by explicitly setting
|
67
|
+
# the 'destination' property in the page's meta-data.
|
68
|
+
#
|
69
|
+
def destination
|
70
|
+
return @dest if defined? @dest and @dest
|
71
|
+
|
72
|
+
@dest = if @mdata.has_key? 'destination' then @mdata['destination']
|
73
|
+
else ::File.join(dir, filename) end
|
74
|
+
|
75
|
+
@dest = ::File.join(::Webby.site.output_dir, @dest)
|
76
|
+
@dest << @number.to_s if @number
|
77
|
+
|
78
|
+
ext = extension
|
79
|
+
unless ext.nil? or ext.empty?
|
80
|
+
@dest << '.' << ext
|
81
|
+
end
|
82
|
+
@dest
|
83
|
+
end
|
84
|
+
|
85
|
+
# call-seq:
|
86
|
+
# extension => string
|
87
|
+
#
|
88
|
+
# Returns the extension that will be appended to the output destination
|
89
|
+
# filename. The extension is determined by looking at the following:
|
90
|
+
#
|
91
|
+
# * this page's meta-data for an 'extension' property
|
92
|
+
# * the meta-data of this page's layout for an 'extension' property
|
93
|
+
# * the extension of this page file
|
94
|
+
#
|
95
|
+
def extension
|
96
|
+
return @mdata['extension'] if @mdata.has_key? 'extension'
|
97
|
+
|
98
|
+
if @mdata.has_key? 'layout'
|
99
|
+
lyt = ::Webby::Resources.layouts.find :filename => @mdata['layout']
|
100
|
+
ext = lyt ? lyt.extension : nil
|
101
|
+
return ext if ext
|
102
|
+
end
|
103
|
+
@ext
|
104
|
+
end
|
105
|
+
|
106
|
+
end # class Page
|
107
|
+
end # module Webby::Resources
|
108
|
+
|
109
|
+
# EOF
|