webby 0.4.0 → 0.5.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 +7 -0
- data/Manifest.txt +6 -0
- data/README.txt +10 -9
- data/Rakefile +2 -0
- data/bin/webby +1 -0
- data/data/content/css/site.css +59 -0
- data/data/layouts/default.rhtml +9 -9
- data/data/tasks/create.rake +1 -0
- data/data/tasks/growl.rake +12 -0
- data/data/tasks/heel.rake +12 -6
- data/lib/webby.rb +35 -2
- data/lib/webby/auto_builder.rb +14 -6
- data/lib/webby/builder.rb +31 -23
- data/lib/webby/file.rb +9 -12
- data/lib/webby/main.rb +13 -7
- data/lib/webby/pages_db.rb +101 -12
- data/lib/webby/renderer.rb +94 -7
- data/lib/webby/resource.rb +46 -13
- data/lib/webby/stelan/paginator.rb +149 -0
- data/lib/webby/stelan/spawner.rb +337 -0
- data/spec/webby/file_spec.rb +1 -2
- data/website/Rakefile +2 -0
- data/website/content/css/coderay.css +111 -0
- data/website/content/css/site.css +121 -25
- data/website/content/download.txt +7 -1
- data/website/content/index.txt +7 -9
- data/website/content/manual.txt +23 -0
- data/website/content/robots.txt +6 -0
- data/website/content/tips_and_tricks.txt +2 -2
- data/website/content/tutorial.txt +8 -8
- data/website/layouts/default.rhtml +16 -13
- data/website/tasks/create.rake +2 -0
- data/website/tasks/growl.rake +12 -0
- data/website/tasks/heel.rake +12 -6
- metadata +19 -4
data/History.txt
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
== 0.5.0 / 2007-11-26
|
2
|
+
|
3
|
+
* Launching heel now works on Windows boxen
|
4
|
+
* Now using "logging" gem to output build status
|
5
|
+
* Updated find routine for the pages DB
|
6
|
+
* First whack at pagination support
|
7
|
+
|
1
8
|
== 0.4.0 / 2007-09-18
|
2
9
|
|
3
10
|
* Updated the Blueprint CSS stylesheets to version 0.5
|
data/Manifest.txt
CHANGED
@@ -23,6 +23,7 @@ data/content/index.txt
|
|
23
23
|
data/layouts/default.rhtml
|
24
24
|
data/tasks/create.rake
|
25
25
|
data/tasks/deploy.rake
|
26
|
+
data/tasks/growl.rake
|
26
27
|
data/tasks/heel.rake
|
27
28
|
data/tasks/setup.rb
|
28
29
|
data/templates/page.erb
|
@@ -35,6 +36,8 @@ lib/webby/main.rb
|
|
35
36
|
lib/webby/pages_db.rb
|
36
37
|
lib/webby/renderer.rb
|
37
38
|
lib/webby/resource.rb
|
39
|
+
lib/webby/stelan/paginator.rb
|
40
|
+
lib/webby/stelan/spawner.rb
|
38
41
|
lib/webby/utils.rb
|
39
42
|
lib/webby/webby_task.rb
|
40
43
|
spec/spec.opts
|
@@ -59,15 +62,18 @@ website/content/css/blueprint/lib/reset.css
|
|
59
62
|
website/content/css/blueprint/lib/typography.css
|
60
63
|
website/content/css/blueprint/print.css
|
61
64
|
website/content/css/blueprint/screen.css
|
65
|
+
website/content/css/coderay.css
|
62
66
|
website/content/css/site.css
|
63
67
|
website/content/download.txt
|
64
68
|
website/content/index.txt
|
65
69
|
website/content/manual.txt
|
70
|
+
website/content/robots.txt
|
66
71
|
website/content/tips_and_tricks.txt
|
67
72
|
website/content/tutorial.txt
|
68
73
|
website/layouts/default.rhtml
|
69
74
|
website/tasks/create.rake
|
70
75
|
website/tasks/deploy.rake
|
76
|
+
website/tasks/growl.rake
|
71
77
|
website/tasks/heel.rake
|
72
78
|
website/tasks/setup.rb
|
73
79
|
website/templates/page.erb
|
data/README.txt
CHANGED
@@ -8,7 +8,7 @@ Webby
|
|
8
8
|
|
9
9
|
Webby is a super fantastic little website management system. It would be called a _content management system_ if it were a bigger kid. But, it's just a runt with a special knack for transforming text. And that's really all it does - manages the legwork of turning text into something else, an *ASCII Alchemist* if you will.
|
10
10
|
|
11
|
-
Webby works by combining the contents of a *page* with a *layout* to produce HTML. The layout contains
|
11
|
+
Webby works by combining the contents of a *page* with a *layout* to produce HTML. The layout contains everything common to all the pages - HTML headers, navigation menu, footer, etc. - and the page contains just the information for that page. You can use your favorite markup language to write your pages; Webby supports quite a few.
|
12
12
|
|
13
13
|
Install Webby and try it out!
|
14
14
|
|
@@ -23,7 +23,7 @@ Install Webby and try it out!
|
|
23
23
|
|
24
24
|
But Wait! There's More!
|
25
25
|
|
26
|
-
Webby has a great _autobuild_ feature that
|
26
|
+
Webby has a great _autobuild_ feature that continuously generates HTML whenever the *pages* or *layouts* change. The HTML is served up via {heel}[http://copiousfreetime.rubyforge.org/heel/], a static file webserver based on mongrel. Whenever you change a page, you can immediately see those changes without having to run any commands.
|
27
27
|
|
28
28
|
$ rake autobuild
|
29
29
|
heel --root output --daemonize
|
@@ -46,11 +46,11 @@ Webby is not limited to producing HTML. By no means! Do you ever get tired of re
|
|
46
46
|
|
47
47
|
$ cd my_site
|
48
48
|
|
49
|
-
$ rake create:page new_page.
|
50
|
-
creating content/new_page.
|
49
|
+
$ rake create:page new_page.txt
|
50
|
+
creating content/new_page.txt
|
51
51
|
|
52
|
-
$ rake create:page another/new_page.
|
53
|
-
creating content/another/new_page.
|
52
|
+
$ rake create:page another/new_page.txt
|
53
|
+
creating content/another/new_page.txt
|
54
54
|
|
55
55
|
$ rake autobuild
|
56
56
|
heel --root output --daemonize
|
@@ -62,11 +62,12 @@ Webby is not limited to producing HTML. By no means! Do you ever get tired of re
|
|
62
62
|
|
63
63
|
== REQUIREMENTS:
|
64
64
|
|
65
|
-
* rake
|
66
|
-
* rspec
|
67
65
|
* directory_watcher
|
68
|
-
* hpricot
|
69
66
|
* heel
|
67
|
+
* hpricot
|
68
|
+
* logging
|
69
|
+
* rake
|
70
|
+
* rspec
|
70
71
|
|
71
72
|
== LICENSE:
|
72
73
|
|
data/Rakefile
CHANGED
@@ -18,6 +18,7 @@ PROJ.rdoc_remote_dir = 'rdoc'
|
|
18
18
|
PROJ.version = Webby::VERSION
|
19
19
|
|
20
20
|
PROJ.exclude << '^(\.\/|\/)?website/output'
|
21
|
+
PROJ.exclude << '^(\.\/|\/)?doc'
|
21
22
|
PROJ.rdoc_exclude << '^(\.\/|\/)?data'
|
22
23
|
PROJ.rdoc_exclude << '^(\.\/|\/)?website'
|
23
24
|
|
@@ -26,6 +27,7 @@ PROJ.spec_opts << '--color'
|
|
26
27
|
depend_on 'directory_watcher', '1.0.0'
|
27
28
|
depend_on 'heel'
|
28
29
|
depend_on 'hpricot'
|
30
|
+
depend_on 'logging', '0.5.1'
|
29
31
|
depend_on 'rspec'
|
30
32
|
|
31
33
|
# EOF
|
data/bin/webby
CHANGED
data/data/content/css/site.css
CHANGED
@@ -0,0 +1,59 @@
|
|
1
|
+
---
|
2
|
+
extension: css
|
3
|
+
filter: erb
|
4
|
+
layout: nil # no layout
|
5
|
+
|
6
|
+
color:
|
7
|
+
border: "#ddd"
|
8
|
+
header: "#111"
|
9
|
+
link: "#125AA7"
|
10
|
+
link-hover: "#000"
|
11
|
+
blockquote: "#666"
|
12
|
+
box-bg: "#eee"
|
13
|
+
highlight: "#B2CCFF"
|
14
|
+
quiet: "#666"
|
15
|
+
alt: "#666"
|
16
|
+
---
|
17
|
+
|
18
|
+
body {
|
19
|
+
font-family: Verdana, "Bitstream Vera Sans", sans-serif;
|
20
|
+
}
|
21
|
+
|
22
|
+
/* Headings
|
23
|
+
* --------------------------------------------------------------------- */
|
24
|
+
h1,h2,h3,h4,h5,h6 { color: <%= @page.color['header'] %>; }
|
25
|
+
|
26
|
+
/* Text Elements
|
27
|
+
* --------------------------------------------------------------------- */
|
28
|
+
a { color: <%= @page.color['link'] %>; }
|
29
|
+
a:hover { color: <%= @page.color['link-hover'] %>; }
|
30
|
+
blockquote { color: <%= @page.color['blockquote'] %>; }
|
31
|
+
|
32
|
+
pre {
|
33
|
+
background: <%= @page.color['box-bg'] %>;
|
34
|
+
border: 1px solid <%= @page.color['border'] %>;
|
35
|
+
}
|
36
|
+
|
37
|
+
hr {
|
38
|
+
background: <%= @page.color['highlight'] %>;
|
39
|
+
color: <%= @page.color['highlight'] %>;
|
40
|
+
}
|
41
|
+
|
42
|
+
/* Tables
|
43
|
+
* --------------------------------------------------------------------- */
|
44
|
+
table {
|
45
|
+
border-top: 1px solid <%= @page.color['border'] %>;
|
46
|
+
border-left: 1px solid <%= @page.color['border'] %>;
|
47
|
+
}
|
48
|
+
th,td {
|
49
|
+
border-bottom: 1px solid <%= @page.color['border'] %>;
|
50
|
+
border-right: 1px solid <%= @page.color['border'] %>;
|
51
|
+
}
|
52
|
+
|
53
|
+
/* Default Classes
|
54
|
+
* --------------------------------------------------------------------- */
|
55
|
+
p.quiet { color: <%= @page.color['quiet'] %>; }
|
56
|
+
.alt { color: <%= @page.color['alt'] %>; }
|
57
|
+
|
58
|
+
|
59
|
+
/* EOF */
|
data/data/layouts/default.rhtml
CHANGED
@@ -7,34 +7,34 @@ filter: erb
|
|
7
7
|
|
8
8
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us">
|
9
9
|
<head>
|
10
|
-
<meta http-equiv="content-type" content="text/html; charset=
|
10
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
11
11
|
<title><%= @page.title %></title>
|
12
12
|
<meta name="author" content="<%= @page.author %>" />
|
13
13
|
|
14
14
|
<!--- Blueprint CSS Framework -->
|
15
|
-
<link rel="stylesheet" href="css/blueprint/screen.css" type="text/css" media="screen, projection" />
|
16
|
-
<link rel="stylesheet" href="css/blueprint/print.css" type="text/css" media="print" />
|
15
|
+
<link rel="stylesheet" href="/css/blueprint/screen.css" type="text/css" media="screen, projection" />
|
16
|
+
<link rel="stylesheet" href="/css/blueprint/print.css" type="text/css" media="print" />
|
17
17
|
|
18
18
|
<!-- CodeRay syntax highlighting CSS -->
|
19
|
-
<link rel="stylesheet" href="css/coderay.css" type="text/css" />
|
19
|
+
<link rel="stylesheet" href="/css/coderay.css" type="text/css" />
|
20
20
|
|
21
21
|
<!-- Homepage CSS -->
|
22
|
-
<link rel="stylesheet" href="css/site.css" type="text/css" media="screen, projection" />
|
22
|
+
<link rel="stylesheet" href="/css/site.css" type="text/css" media="screen, projection" />
|
23
23
|
</head>
|
24
24
|
<body>
|
25
25
|
|
26
26
|
<div class="container">
|
27
27
|
|
28
|
-
<div class="column span-
|
28
|
+
<div class="column span-18 prepend-2 append-4 first last" id="header">
|
29
29
|
<h2>A New Website</h2>
|
30
30
|
<hr>
|
31
31
|
</div>
|
32
32
|
|
33
|
-
<div class="column span-
|
33
|
+
<div class="column span-15 prepend-2 first">
|
34
34
|
<%= @content %>
|
35
35
|
</div>
|
36
36
|
|
37
|
-
<div class="column span-3 last">
|
37
|
+
<div class="column span-3 append-4 last">
|
38
38
|
<h4>Sidebar</h4>
|
39
39
|
<p>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. </p>
|
40
40
|
|
@@ -48,7 +48,7 @@ filter: erb
|
|
48
48
|
<p class="incr">Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus.</p>
|
49
49
|
</div>
|
50
50
|
|
51
|
-
<div class="column span-
|
51
|
+
<div class="column span-18 prepend-2 append-4 first last" id="footer">
|
52
52
|
<hr />
|
53
53
|
<p>This website was created with <a href="http://webby.rubyforge.org">Webby</a></p>
|
54
54
|
</div>
|
data/data/tasks/create.rake
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
|
2
|
+
desc 'send log events to Growl (Mac OS X only)'
|
3
|
+
task :growl do
|
4
|
+
Logging::Logger['Webby'].add(Logging::Appenders::Growl.new(
|
5
|
+
"Webby",
|
6
|
+
:layout => Logging::Layouts::Pattern.new(:pattern => "%5l - Webby\000%m"),
|
7
|
+
:coalesce => true,
|
8
|
+
:separator => "\000"
|
9
|
+
))
|
10
|
+
end
|
11
|
+
|
12
|
+
# EOF
|
data/data/tasks/heel.rake
CHANGED
@@ -3,18 +3,24 @@ if HAVE_HEEL
|
|
3
3
|
|
4
4
|
namespace :heel do
|
5
5
|
|
6
|
-
desc 'start the heel server to view website'
|
7
|
-
task :
|
6
|
+
desc 'start the heel server to view website (not for Windows)'
|
7
|
+
task :start do
|
8
8
|
sh "heel --root #{SITE.output_dir} --daemonize"
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
desc 'stop the heel server'
|
12
|
-
task :
|
12
|
+
task :stop do
|
13
13
|
sh "heel --kill"
|
14
14
|
end
|
15
15
|
|
16
|
-
task :
|
17
|
-
|
16
|
+
task :autorun do
|
17
|
+
heel_exe = File.join(Gem.bindir, 'heel')
|
18
|
+
@heel_spawner = Spawner.new(Spawner.ruby, heel_exe, '--root', SITE.output_dir, :pause => 86_400)
|
19
|
+
@heel_spawner.start
|
20
|
+
end
|
21
|
+
|
22
|
+
task :autobuild => :autorun do
|
23
|
+
at_exit {@heel_spawner.stop if defined? @heel_spawner and not @heel_spawner.nil?}
|
18
24
|
end
|
19
25
|
|
20
26
|
end
|
data/lib/webby.rb
CHANGED
@@ -1,8 +1,19 @@
|
|
1
|
-
# $Id: webby.rb
|
1
|
+
# $Id: webby.rb 41 2007-10-15 20:44:21Z tim_pease $
|
2
|
+
|
3
|
+
require 'logging'
|
4
|
+
|
5
|
+
# Configure Webby to log to STDOUT at the 'info' level
|
6
|
+
Logging::Appender.stdout.layout = Logging::Layouts::Pattern.new(
|
7
|
+
:pattern => "[%d] %5l: %m\n", # [date] LEVEL: message
|
8
|
+
:date_pattern => "%H:%M:%S" # date == HH:MM:SS
|
9
|
+
)
|
10
|
+
Logging::Logger['Webby'].add(Logging::Appender.stdout)
|
11
|
+
Logging::Logger['Webby'].level = :info
|
12
|
+
|
2
13
|
|
3
14
|
module Webby
|
4
15
|
|
5
|
-
VERSION = '0.
|
16
|
+
VERSION = '0.5.0' # :nodoc:
|
6
17
|
|
7
18
|
# Path to the Webby package
|
8
19
|
PATH = ::File.expand_path(::File.join(::File.dirname(__FILE__), '..'))
|
@@ -52,6 +63,28 @@ module Webby
|
|
52
63
|
}
|
53
64
|
end
|
54
65
|
|
66
|
+
# call-seq
|
67
|
+
# Webby.exclude => regexp
|
68
|
+
#
|
69
|
+
# Returns a regular expression used to exclude resources from the content
|
70
|
+
# directory from being processed by Webby. This same regular expression is
|
71
|
+
# also used to exclude layouts.
|
72
|
+
#
|
73
|
+
def self.exclude
|
74
|
+
@exclude ||= Regexp.new(config['exclude'].join('|'))
|
75
|
+
end
|
76
|
+
|
77
|
+
# call-seq:
|
78
|
+
# cairn => filename
|
79
|
+
#
|
80
|
+
# The Webby _cairn_ file is used to mark the last time the content was
|
81
|
+
# built into the output directory. It is an empty file; only the
|
82
|
+
# modification time of the file is important.
|
83
|
+
#
|
84
|
+
def self.cairn
|
85
|
+
@cairn ||= File.join(config['output_dir'], '.cairn')
|
86
|
+
end
|
87
|
+
|
55
88
|
end # module Webby
|
56
89
|
|
57
90
|
|
data/lib/webby/auto_builder.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: auto_builder.rb
|
1
|
+
# $Id: auto_builder.rb 40 2007-10-14 03:54:36Z tim_pease $
|
2
2
|
|
3
3
|
require 'directory_watcher'
|
4
4
|
|
@@ -27,6 +27,9 @@ class AutoBuilder
|
|
27
27
|
# Create a new AutoBuilder class.
|
28
28
|
#
|
29
29
|
def initialize
|
30
|
+
@log = Logging::Logger[self]
|
31
|
+
|
32
|
+
@builder = Builder.new
|
30
33
|
@watcher = DirectoryWatcher.new '.', :interval => 2
|
31
34
|
@watcher.add_observer self
|
32
35
|
|
@@ -47,11 +50,16 @@ class AutoBuilder
|
|
47
50
|
ary = events.find_all {|evt| evt.type != :removed}
|
48
51
|
return if ary.empty?
|
49
52
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
+
ary.each do |evt|
|
54
|
+
@log.debug "changed #{evt.path}"
|
55
|
+
next unless test ?f, evt.path
|
56
|
+
next if evt.path =~ ::Webby.exclude
|
57
|
+
Resource.new evt.path
|
58
|
+
end
|
59
|
+
|
60
|
+
@builder.run :load_files => false
|
53
61
|
rescue => err
|
54
|
-
|
62
|
+
@log.error err
|
55
63
|
end
|
56
64
|
|
57
65
|
# call-seq:
|
@@ -61,7 +69,7 @@ class AutoBuilder
|
|
61
69
|
# Ctrl-C to stop the watcher thread.
|
62
70
|
#
|
63
71
|
def run
|
64
|
-
|
72
|
+
@log.info 'starting autobuild (Ctrl-C to stop)'
|
65
73
|
|
66
74
|
Signal.trap('INT') {@watcher.stop}
|
67
75
|
|
data/lib/webby/builder.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: builder.rb
|
1
|
+
# $Id: builder.rb 46 2007-11-27 03:31:29Z tim_pease $
|
2
2
|
|
3
3
|
require 'find'
|
4
4
|
require 'fileutils'
|
@@ -38,7 +38,7 @@ class Builder
|
|
38
38
|
raise Error, "template not given" unless tmpl
|
39
39
|
raise Error, "#{page} already exists" if test ?e, page
|
40
40
|
|
41
|
-
|
41
|
+
Logging::Logger[self].info "creating #{page}"
|
42
42
|
FileUtils.mkdir_p File.dirname(page)
|
43
43
|
str = ERB.new(::File.read(tmpl), nil, '-').result
|
44
44
|
::File.open(page, 'w') {|fd| fd.write str}
|
@@ -48,7 +48,17 @@ class Builder
|
|
48
48
|
end # class << self
|
49
49
|
|
50
50
|
# call-seq:
|
51
|
-
#
|
51
|
+
# Builder.new
|
52
|
+
#
|
53
|
+
# Creates a new Builder object for creating pages from the content and
|
54
|
+
# layout directories.
|
55
|
+
#
|
56
|
+
def initialize
|
57
|
+
@log = Logging::Logger[self]
|
58
|
+
end
|
59
|
+
|
60
|
+
# call-seq:
|
61
|
+
# run( :rebuild => false, :load_files => true )
|
52
62
|
#
|
53
63
|
# Runs the Webby builder by loading in the layout files from the
|
54
64
|
# <code>layouts/</code> folder and the content from the
|
@@ -70,19 +80,20 @@ class Builder
|
|
70
80
|
# more recently than the output file.
|
71
81
|
#
|
72
82
|
def run( opts = {} )
|
73
|
-
|
83
|
+
opts[:load_files] = true unless opts.has_key?(:load_files)
|
74
84
|
|
75
85
|
unless test(?d, output_dir)
|
76
|
-
|
86
|
+
@log.info "creating #{output_dir}"
|
77
87
|
FileUtils.mkdir output_dir
|
78
88
|
end
|
79
89
|
|
80
|
-
load_files
|
90
|
+
load_files if opts[:load_files]
|
91
|
+
loop_check
|
81
92
|
|
82
93
|
Resource.pages.each do |page|
|
83
94
|
next unless page.dirty? or opts[:rebuild]
|
84
95
|
|
85
|
-
|
96
|
+
@log.info "creating #{page.destination}"
|
86
97
|
|
87
98
|
# make sure the directory exists
|
88
99
|
FileUtils.mkdir_p ::File.dirname(page.destination)
|
@@ -93,18 +104,13 @@ class Builder
|
|
93
104
|
|
94
105
|
# otherwise, layout the resource and write the results to
|
95
106
|
# the output directory
|
96
|
-
else
|
97
|
-
::File.open(page.destination, 'w') do |fd|
|
98
|
-
fd.write Renderer.new(page).layout_page
|
99
|
-
end
|
100
|
-
end
|
107
|
+
else Renderer.write(page) end
|
101
108
|
end
|
102
109
|
|
103
|
-
# touch the
|
104
|
-
|
105
|
-
FileUtils.touch output_dir
|
110
|
+
# touch the cairn so we know when the website was last generated
|
111
|
+
FileUtils.touch ::Webby.cairn
|
106
112
|
|
107
|
-
|
113
|
+
nil
|
108
114
|
end
|
109
115
|
|
110
116
|
|
@@ -114,18 +120,20 @@ class Builder
|
|
114
120
|
# folder and create a new Resource object for each file found there.
|
115
121
|
#
|
116
122
|
def load_files
|
117
|
-
excl = Regexp.new exclude.join('|')
|
118
|
-
|
119
123
|
::Find.find(layout_dir, content_dir) do |path|
|
120
124
|
next unless test ?f, path
|
121
|
-
next if path =~
|
125
|
+
next if path =~ ::Webby.exclude
|
122
126
|
Resource.new path
|
123
127
|
end
|
128
|
+
end
|
124
129
|
|
130
|
+
# Loop over all the layout resources looking for circular reference -- a
|
131
|
+
# layout that eventually refers back to itself. These are bad. Raise an
|
132
|
+
# error if one is detected.
|
133
|
+
#
|
134
|
+
def loop_check
|
125
135
|
layouts = Resource.layouts
|
126
136
|
|
127
|
-
# look for loops in the layout references -- i.e. a layout
|
128
|
-
# eventually refers back to itself
|
129
137
|
layouts.each do |lyt|
|
130
138
|
stack = []
|
131
139
|
while lyt
|
@@ -135,12 +143,12 @@ class Builder
|
|
135
143
|
"loop detected in layout references: #{stack.join(' > ')}"
|
136
144
|
end
|
137
145
|
stack << lyt.filename
|
138
|
-
lyt = layouts.
|
146
|
+
lyt = layouts.find :filename => lyt.layout
|
139
147
|
end # while
|
140
148
|
end # each
|
141
149
|
end
|
142
150
|
|
143
|
-
%w(output_dir layout_dir content_dir
|
151
|
+
%w(output_dir layout_dir content_dir).each do |key|
|
144
152
|
self.class_eval <<-CODE
|
145
153
|
def #{key}( ) ::Webby.config['#{key}'] end
|
146
154
|
CODE
|