nanoc 2.0.4 → 2.1
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/ChangeLog +31 -1
- data/LICENSE +1 -1
- data/README +63 -3
- data/Rakefile +59 -12
- data/bin/nanoc +7 -199
- data/lib/nanoc.rb +83 -12
- data/lib/nanoc/base/asset.rb +113 -0
- data/lib/nanoc/base/asset_defaults.rb +21 -0
- data/lib/nanoc/base/asset_rep.rb +277 -0
- data/lib/nanoc/base/binary_filter.rb +44 -0
- data/lib/nanoc/base/code.rb +41 -0
- data/lib/nanoc/base/compiler.rb +46 -34
- data/lib/nanoc/base/core_ext/hash.rb +51 -7
- data/lib/nanoc/base/core_ext/string.rb +8 -0
- data/lib/nanoc/base/data_source.rb +253 -20
- data/lib/nanoc/base/defaults.rb +30 -0
- data/lib/nanoc/base/enhancements.rb +9 -84
- data/lib/nanoc/base/filter.rb +109 -6
- data/lib/nanoc/base/layout.rb +91 -0
- data/lib/nanoc/base/notification_center.rb +66 -0
- data/lib/nanoc/base/page.rb +94 -126
- data/lib/nanoc/base/page_defaults.rb +20 -0
- data/lib/nanoc/base/page_rep.rb +318 -0
- data/lib/nanoc/base/plugin.rb +57 -9
- data/lib/nanoc/base/proxies/asset_proxy.rb +29 -0
- data/lib/nanoc/base/proxies/asset_rep_proxy.rb +26 -0
- data/lib/nanoc/base/proxies/layout_proxy.rb +25 -0
- data/lib/nanoc/base/proxies/page_proxy.rb +35 -0
- data/lib/nanoc/base/proxies/page_rep_proxy.rb +28 -0
- data/lib/nanoc/base/proxy.rb +37 -0
- data/lib/nanoc/base/router.rb +72 -0
- data/lib/nanoc/base/site.rb +219 -88
- data/lib/nanoc/base/template.rb +64 -0
- data/lib/nanoc/binary_filters/image_science_thumbnail.rb +28 -0
- data/lib/nanoc/cli.rb +1 -0
- data/lib/nanoc/cli/base.rb +219 -0
- data/lib/nanoc/cli/cli.rb +16 -0
- data/lib/nanoc/cli/command.rb +105 -0
- data/lib/nanoc/cli/commands/autocompile.rb +80 -0
- data/lib/nanoc/cli/commands/compile.rb +273 -0
- data/lib/nanoc/cli/commands/create_layout.rb +85 -0
- data/lib/nanoc/cli/commands/create_page.rb +85 -0
- data/lib/nanoc/cli/commands/create_site.rb +327 -0
- data/lib/nanoc/cli/commands/create_template.rb +76 -0
- data/lib/nanoc/cli/commands/help.rb +69 -0
- data/lib/nanoc/cli/commands/info.rb +114 -0
- data/lib/nanoc/cli/commands/switch.rb +141 -0
- data/lib/nanoc/cli/commands/update.rb +91 -0
- data/lib/nanoc/cli/ext.rb +37 -0
- data/lib/nanoc/cli/logger.rb +66 -0
- data/lib/nanoc/cli/option_parser.rb +168 -0
- data/lib/nanoc/data_sources/filesystem.rb +645 -224
- data/lib/nanoc/data_sources/filesystem_combined.rb +495 -0
- data/lib/nanoc/extra/auto_compiler.rb +265 -0
- data/lib/nanoc/extra/context.rb +22 -0
- data/lib/nanoc/extra/core_ext/hash.rb +54 -0
- data/lib/nanoc/extra/core_ext/time.rb +13 -0
- data/lib/nanoc/extra/file_proxy.rb +29 -0
- data/lib/nanoc/extra/vcs.rb +48 -0
- data/lib/nanoc/extra/vcses/bazaar.rb +21 -0
- data/lib/nanoc/extra/vcses/dummy.rb +20 -0
- data/lib/nanoc/extra/vcses/git.rb +21 -0
- data/lib/nanoc/extra/vcses/mercurial.rb +21 -0
- data/lib/nanoc/extra/vcses/subversion.rb +21 -0
- data/lib/nanoc/filters/bluecloth.rb +13 -0
- data/lib/nanoc/filters/erb.rb +6 -22
- data/lib/nanoc/filters/erubis.rb +14 -0
- data/lib/nanoc/filters/haml.rb +7 -23
- data/lib/nanoc/filters/markaby.rb +5 -5
- data/lib/nanoc/filters/maruku.rb +14 -0
- data/lib/nanoc/filters/old.rb +19 -0
- data/lib/nanoc/filters/rdiscount.rb +13 -0
- data/lib/nanoc/filters/rdoc.rb +5 -4
- data/lib/nanoc/filters/redcloth.rb +14 -0
- data/lib/nanoc/filters/rubypants.rb +14 -0
- data/lib/nanoc/filters/sass.rb +13 -0
- data/lib/nanoc/helpers/blogging.rb +170 -0
- data/lib/nanoc/helpers/capturing.rb +59 -0
- data/lib/nanoc/helpers/html_escape.rb +23 -0
- data/lib/nanoc/helpers/link_to.rb +69 -0
- data/lib/nanoc/helpers/render.rb +47 -0
- data/lib/nanoc/helpers/tagging.rb +52 -0
- data/lib/nanoc/helpers/xml_sitemap.rb +58 -0
- data/lib/nanoc/routers/default.rb +54 -0
- data/lib/nanoc/routers/no_dirs.rb +66 -0
- data/lib/nanoc/routers/versioned.rb +79 -0
- metadata +112 -22
- data/lib/nanoc/base/auto_compiler.rb +0 -132
- data/lib/nanoc/base/layout_processor.rb +0 -33
- data/lib/nanoc/base/page_proxy.rb +0 -31
- data/lib/nanoc/base/plugin_manager.rb +0 -33
- data/lib/nanoc/data_sources/database.rb +0 -259
- data/lib/nanoc/data_sources/trivial.rb +0 -145
- data/lib/nanoc/filters/markdown.rb +0 -13
- data/lib/nanoc/filters/smartypants.rb +0 -13
- data/lib/nanoc/filters/textile.rb +0 -13
- data/lib/nanoc/layout_processors/erb.rb +0 -35
- data/lib/nanoc/layout_processors/haml.rb +0 -38
- data/lib/nanoc/layout_processors/markaby.rb +0 -16
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: nanoc
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: "2.1"
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Denis Defreyne
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2008-
|
|
12
|
+
date: 2008-08-17 00:00:00 +02:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies: []
|
|
15
15
|
|
|
@@ -19,8 +19,8 @@ executables:
|
|
|
19
19
|
- nanoc
|
|
20
20
|
extensions: []
|
|
21
21
|
|
|
22
|
-
extra_rdoc_files:
|
|
23
|
-
|
|
22
|
+
extra_rdoc_files:
|
|
23
|
+
- README
|
|
24
24
|
files:
|
|
25
25
|
- README
|
|
26
26
|
- LICENSE
|
|
@@ -29,41 +29,131 @@ files:
|
|
|
29
29
|
- bin/nanoc
|
|
30
30
|
- lib/nanoc
|
|
31
31
|
- lib/nanoc/base
|
|
32
|
-
- lib/nanoc/base/
|
|
32
|
+
- lib/nanoc/base/asset.rb
|
|
33
|
+
- lib/nanoc/base/asset_defaults.rb
|
|
34
|
+
- lib/nanoc/base/asset_rep.rb
|
|
35
|
+
- lib/nanoc/base/binary_filter.rb
|
|
36
|
+
- lib/nanoc/base/code.rb
|
|
33
37
|
- lib/nanoc/base/compiler.rb
|
|
34
38
|
- lib/nanoc/base/core_ext
|
|
35
39
|
- lib/nanoc/base/core_ext/hash.rb
|
|
40
|
+
- lib/nanoc/base/core_ext/string.rb
|
|
36
41
|
- lib/nanoc/base/data_source.rb
|
|
42
|
+
- lib/nanoc/base/defaults.rb
|
|
37
43
|
- lib/nanoc/base/enhancements.rb
|
|
38
44
|
- lib/nanoc/base/filter.rb
|
|
39
|
-
- lib/nanoc/base/
|
|
45
|
+
- lib/nanoc/base/layout.rb
|
|
46
|
+
- lib/nanoc/base/notification_center.rb
|
|
40
47
|
- lib/nanoc/base/page.rb
|
|
41
|
-
- lib/nanoc/base/
|
|
48
|
+
- lib/nanoc/base/page_defaults.rb
|
|
49
|
+
- lib/nanoc/base/page_rep.rb
|
|
42
50
|
- lib/nanoc/base/plugin.rb
|
|
43
|
-
- lib/nanoc/base/
|
|
51
|
+
- lib/nanoc/base/proxies
|
|
52
|
+
- lib/nanoc/base/proxies/asset_proxy.rb
|
|
53
|
+
- lib/nanoc/base/proxies/asset_rep_proxy.rb
|
|
54
|
+
- lib/nanoc/base/proxies/layout_proxy.rb
|
|
55
|
+
- lib/nanoc/base/proxies/page_proxy.rb
|
|
56
|
+
- lib/nanoc/base/proxies/page_rep_proxy.rb
|
|
57
|
+
- lib/nanoc/base/proxy.rb
|
|
58
|
+
- lib/nanoc/base/router.rb
|
|
44
59
|
- lib/nanoc/base/site.rb
|
|
60
|
+
- lib/nanoc/base/template.rb
|
|
61
|
+
- lib/nanoc/binary_filters
|
|
62
|
+
- lib/nanoc/binary_filters/image_science_thumbnail.rb
|
|
63
|
+
- lib/nanoc/cli
|
|
64
|
+
- lib/nanoc/cli/base.rb
|
|
65
|
+
- lib/nanoc/cli/cli.rb
|
|
66
|
+
- lib/nanoc/cli/command.rb
|
|
67
|
+
- lib/nanoc/cli/commands
|
|
68
|
+
- lib/nanoc/cli/commands/autocompile.rb
|
|
69
|
+
- lib/nanoc/cli/commands/compile.rb
|
|
70
|
+
- lib/nanoc/cli/commands/create_layout.rb
|
|
71
|
+
- lib/nanoc/cli/commands/create_page.rb
|
|
72
|
+
- lib/nanoc/cli/commands/create_site.rb
|
|
73
|
+
- lib/nanoc/cli/commands/create_template.rb
|
|
74
|
+
- lib/nanoc/cli/commands/help.rb
|
|
75
|
+
- lib/nanoc/cli/commands/info.rb
|
|
76
|
+
- lib/nanoc/cli/commands/switch.rb
|
|
77
|
+
- lib/nanoc/cli/commands/update.rb
|
|
78
|
+
- lib/nanoc/cli/ext.rb
|
|
79
|
+
- lib/nanoc/cli/logger.rb
|
|
80
|
+
- lib/nanoc/cli/option_parser.rb
|
|
81
|
+
- lib/nanoc/cli.rb
|
|
45
82
|
- lib/nanoc/data_sources
|
|
46
|
-
- lib/nanoc/data_sources/database.rb
|
|
47
83
|
- lib/nanoc/data_sources/filesystem.rb
|
|
48
|
-
- lib/nanoc/data_sources/
|
|
84
|
+
- lib/nanoc/data_sources/filesystem_combined.rb
|
|
85
|
+
- lib/nanoc/extra
|
|
86
|
+
- lib/nanoc/extra/auto_compiler.rb
|
|
87
|
+
- lib/nanoc/extra/context.rb
|
|
88
|
+
- lib/nanoc/extra/core_ext
|
|
89
|
+
- lib/nanoc/extra/core_ext/hash.rb
|
|
90
|
+
- lib/nanoc/extra/core_ext/time.rb
|
|
91
|
+
- lib/nanoc/extra/file_proxy.rb
|
|
92
|
+
- lib/nanoc/extra/vcs.rb
|
|
93
|
+
- lib/nanoc/extra/vcses
|
|
94
|
+
- lib/nanoc/extra/vcses/bazaar.rb
|
|
95
|
+
- lib/nanoc/extra/vcses/dummy.rb
|
|
96
|
+
- lib/nanoc/extra/vcses/git.rb
|
|
97
|
+
- lib/nanoc/extra/vcses/mercurial.rb
|
|
98
|
+
- lib/nanoc/extra/vcses/subversion.rb
|
|
49
99
|
- lib/nanoc/filters
|
|
100
|
+
- lib/nanoc/filters/bluecloth.rb
|
|
50
101
|
- lib/nanoc/filters/erb.rb
|
|
102
|
+
- lib/nanoc/filters/erubis.rb
|
|
51
103
|
- lib/nanoc/filters/haml.rb
|
|
52
104
|
- lib/nanoc/filters/markaby.rb
|
|
53
|
-
- lib/nanoc/filters/
|
|
105
|
+
- lib/nanoc/filters/maruku.rb
|
|
106
|
+
- lib/nanoc/filters/old.rb
|
|
107
|
+
- lib/nanoc/filters/rdiscount.rb
|
|
54
108
|
- lib/nanoc/filters/rdoc.rb
|
|
55
|
-
- lib/nanoc/filters/
|
|
56
|
-
- lib/nanoc/filters/
|
|
57
|
-
- lib/nanoc/
|
|
58
|
-
- lib/nanoc/
|
|
59
|
-
- lib/nanoc/
|
|
60
|
-
- lib/nanoc/
|
|
109
|
+
- lib/nanoc/filters/redcloth.rb
|
|
110
|
+
- lib/nanoc/filters/rubypants.rb
|
|
111
|
+
- lib/nanoc/filters/sass.rb
|
|
112
|
+
- lib/nanoc/helpers
|
|
113
|
+
- lib/nanoc/helpers/blogging.rb
|
|
114
|
+
- lib/nanoc/helpers/capturing.rb
|
|
115
|
+
- lib/nanoc/helpers/html_escape.rb
|
|
116
|
+
- lib/nanoc/helpers/link_to.rb
|
|
117
|
+
- lib/nanoc/helpers/render.rb
|
|
118
|
+
- lib/nanoc/helpers/tagging.rb
|
|
119
|
+
- lib/nanoc/helpers/xml_sitemap.rb
|
|
120
|
+
- lib/nanoc/routers
|
|
121
|
+
- lib/nanoc/routers/default.rb
|
|
122
|
+
- lib/nanoc/routers/no_dirs.rb
|
|
123
|
+
- lib/nanoc/routers/versioned.rb
|
|
61
124
|
- lib/nanoc.rb
|
|
62
|
-
has_rdoc:
|
|
125
|
+
has_rdoc: true
|
|
63
126
|
homepage: http://nanoc.stoneship.org/
|
|
64
|
-
post_install_message:
|
|
65
|
-
|
|
66
|
-
|
|
127
|
+
post_install_message: |-
|
|
128
|
+
------------------------------------------------------------------------------
|
|
129
|
+
Thanks for installing nanoc 2.1! Here are some resources to help you get started:
|
|
130
|
+
|
|
131
|
+
* The tutorial at <http://nanoc.stoneship.org/help/tutorial/>
|
|
132
|
+
* The manual at <http://nanoc.stoneship.org/help/manual/>
|
|
133
|
+
* The discussion group at <http://groups.google.com/group/nanoc>
|
|
134
|
+
|
|
135
|
+
Because nanoc 2.1 has a lot of new features, be sure to check out the nanoc blog at <http://nanoc.stoneship.org/blog/> for details about this release.
|
|
136
|
+
|
|
137
|
+
Enjoy!
|
|
138
|
+
------------------------------------------------------------------------------
|
|
139
|
+
rdoc_options:
|
|
140
|
+
- --title
|
|
141
|
+
- nanoc
|
|
142
|
+
- --main
|
|
143
|
+
- README
|
|
144
|
+
- --charset
|
|
145
|
+
- utf-8
|
|
146
|
+
- --exclude
|
|
147
|
+
- lib/nanoc/cli/commands
|
|
148
|
+
- --exclude
|
|
149
|
+
- lib/nanoc/binary_filters
|
|
150
|
+
- --exclude
|
|
151
|
+
- lib/nanoc/extra/vcses
|
|
152
|
+
- --exclude
|
|
153
|
+
- lib/nanoc/filters
|
|
154
|
+
- --exclude
|
|
155
|
+
- test
|
|
156
|
+
- --line-numbers
|
|
67
157
|
require_paths:
|
|
68
158
|
- lib
|
|
69
159
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
@@ -81,7 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
81
171
|
requirements: []
|
|
82
172
|
|
|
83
173
|
rubyforge_project: nanoc
|
|
84
|
-
rubygems_version: 1.
|
|
174
|
+
rubygems_version: 1.2.0
|
|
85
175
|
signing_key:
|
|
86
176
|
specification_version: 2
|
|
87
177
|
summary: a tool that runs on your local computer and compiles Markdown, Textile, Haml, ... documents into static web pages
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
require 'webrick'
|
|
2
|
-
|
|
3
|
-
module Nanoc
|
|
4
|
-
|
|
5
|
-
class AutoCompiler
|
|
6
|
-
|
|
7
|
-
ERROR_404 = <<END
|
|
8
|
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
|
9
|
-
<html>
|
|
10
|
-
<head>
|
|
11
|
-
<title>404 File Not Found</title>
|
|
12
|
-
<style type="text/css">
|
|
13
|
-
body { padding: 10px; border: 10px solid #f00; margin: 10px; font-family: Helvetica, Arial, sans-serif; }
|
|
14
|
-
</style>
|
|
15
|
-
</head>
|
|
16
|
-
<body>
|
|
17
|
-
<h1>404 File Not Found</h1>
|
|
18
|
-
<p>The file you requested, <i><%=h path %></i>, was not found on this server.</p>
|
|
19
|
-
</body>
|
|
20
|
-
</html>
|
|
21
|
-
END
|
|
22
|
-
|
|
23
|
-
ERROR_500 = <<END
|
|
24
|
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
|
25
|
-
<html>
|
|
26
|
-
<head>
|
|
27
|
-
<title>500 Server Error</title>
|
|
28
|
-
<style type="text/css">
|
|
29
|
-
body { padding: 10px; border: 10px solid #f00; margin: 10px; font-family: Helvetica, Arial, sans-serif; }
|
|
30
|
-
</style>
|
|
31
|
-
</head>
|
|
32
|
-
<body>
|
|
33
|
-
<h1>500 Server Error</h1>
|
|
34
|
-
<p>An error occurred while compiling the page you requested, <i><%=h path %></i>.</p>
|
|
35
|
-
<p>If you think this is a bug in nanoc, please do <a href="http://nanoc.stoneship.org/trac/newticket">report it</a>—thanks!</p>
|
|
36
|
-
<p>Message:</p>
|
|
37
|
-
<blockquote><p><%=h exception.message %></p></blockquote>
|
|
38
|
-
<p>Backtrace:</p>
|
|
39
|
-
<ol>
|
|
40
|
-
<% exception.backtrace.each do |line| %>
|
|
41
|
-
<li><%= line %></li>
|
|
42
|
-
<% end %>
|
|
43
|
-
</ol>
|
|
44
|
-
</body>
|
|
45
|
-
</html>
|
|
46
|
-
END
|
|
47
|
-
|
|
48
|
-
def initialize(site)
|
|
49
|
-
# Set site
|
|
50
|
-
@site = site
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def start(port)
|
|
54
|
-
nanoc_require(
|
|
55
|
-
'mime/types',
|
|
56
|
-
"'mime/types' is required to autocompile sites. You may want to " +
|
|
57
|
-
"install the mime-types gem by running 'gem install mime-types'."
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
# Create server
|
|
61
|
-
@server = WEBrick::HTTPServer.new(:Port => port || 3000)
|
|
62
|
-
@server.mount_proc("/") { |request, response| handle_request(request, response) }
|
|
63
|
-
|
|
64
|
-
# Start server
|
|
65
|
-
trap('INT') { @server.shutdown }
|
|
66
|
-
@server.start
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def handle_request(request, response)
|
|
70
|
-
# Reload site data
|
|
71
|
-
@site.load_data(true)
|
|
72
|
-
|
|
73
|
-
# Get page or file
|
|
74
|
-
page = @site.pages.find { |page| page.path == request.path }
|
|
75
|
-
file_path = @site.config[:output_dir] + request.path
|
|
76
|
-
|
|
77
|
-
if page.nil?
|
|
78
|
-
# Serve file
|
|
79
|
-
if File.file?(file_path)
|
|
80
|
-
serve_file(file_path, response)
|
|
81
|
-
else
|
|
82
|
-
serve_404(request.path, response)
|
|
83
|
-
end
|
|
84
|
-
else
|
|
85
|
-
# Serve page
|
|
86
|
-
serve_page(page, response)
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def h(s)
|
|
91
|
-
ERB::Util.html_escape(s)
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def serve_404(path, response)
|
|
95
|
-
response.status = 404
|
|
96
|
-
response['Content-Type'] = 'text/html'
|
|
97
|
-
response.body = ERB.new(ERROR_404).result(binding)
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
def serve_500(path, exception, response)
|
|
101
|
-
response.status = 500
|
|
102
|
-
response['Content-Type'] = 'text/html'
|
|
103
|
-
response.body = ERB.new(ERROR_500).result(binding)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def serve_file(path, response)
|
|
107
|
-
response.status = 200
|
|
108
|
-
response['Content-Type'] = MIME::Types.of(path).first || 'application/octet-stream'
|
|
109
|
-
response.body = File.read(path)
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
def serve_page(page, response)
|
|
113
|
-
# Recompile page
|
|
114
|
-
begin
|
|
115
|
-
@site.compiler.run(page)
|
|
116
|
-
rescue => exception
|
|
117
|
-
serve_500(page.path, exception, response)
|
|
118
|
-
return
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
# Determine most likely MIME type
|
|
122
|
-
mime_type = MIME::Types.of(page.path).first
|
|
123
|
-
mime_type = mime_type.nil? ? 'text/html' : mime_type.simplified
|
|
124
|
-
|
|
125
|
-
response.status = 200
|
|
126
|
-
response['Content-Type'] = mime_type
|
|
127
|
-
response.body = page.layouted_content
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
end
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
module Nanoc
|
|
2
|
-
class LayoutProcessor < Plugin
|
|
3
|
-
|
|
4
|
-
def initialize(page, pages, config, site, other_assigns={})
|
|
5
|
-
@page = page
|
|
6
|
-
@pages = pages
|
|
7
|
-
@config = config
|
|
8
|
-
@site = site
|
|
9
|
-
@other_assigns = other_assigns
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def run(layout)
|
|
13
|
-
error 'LayoutProcessor#run must be overridden'
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
# Extensions
|
|
17
|
-
|
|
18
|
-
class << self
|
|
19
|
-
attr_accessor :_extensions
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def self.extensions(*extensions)
|
|
23
|
-
self._extensions = [] unless instance_variables.include?('@_extensions')
|
|
24
|
-
extensions.empty? ? self._extensions || [] : self._extensions = (self._extensions || []) + extensions
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def self.extension(extension=nil)
|
|
28
|
-
self._extensions = [] unless instance_variables.include?('@_extensions')
|
|
29
|
-
extension.nil? ? self.extensions.first : self.extensions(extension)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
end
|
|
33
|
-
end
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
module Nanoc
|
|
2
|
-
class PageProxy
|
|
3
|
-
|
|
4
|
-
def initialize(page)
|
|
5
|
-
@page = page
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def [](key)
|
|
9
|
-
real_key = key.to_s.sub(/\?$/, '').to_sym
|
|
10
|
-
|
|
11
|
-
if real_key == :content
|
|
12
|
-
@page.content
|
|
13
|
-
elsif real_key == :parent
|
|
14
|
-
@page.parent.nil? ? nil : @page.parent.to_proxy
|
|
15
|
-
elsif real_key == :children
|
|
16
|
-
@page.children.map { |page| page.to_proxy }
|
|
17
|
-
else
|
|
18
|
-
@page.attribute_named(real_key)
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def []=(key, value)
|
|
23
|
-
@page.attributes[key.to_sym] = value
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def method_missing(method, *args)
|
|
27
|
-
self[method]
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
end
|
|
31
|
-
end
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
module Nanoc
|
|
2
|
-
class PluginManager
|
|
3
|
-
|
|
4
|
-
@@data_sources = {}
|
|
5
|
-
@@filters = {}
|
|
6
|
-
@@layout_processors = {}
|
|
7
|
-
|
|
8
|
-
def self.subclasses_of(superclass)
|
|
9
|
-
subclasses = []
|
|
10
|
-
ObjectSpace.each_object(Class) { |subclass| subclasses << subclass if subclass < superclass }
|
|
11
|
-
subclasses
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def self.data_source_named(name)
|
|
15
|
-
@@data_sources[name.to_sym] ||= subclasses_of(DataSource).find do |klass|
|
|
16
|
-
klass.identifiers.include?(name.to_sym)
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def self.filter_named(name)
|
|
21
|
-
@@filters[name.to_sym] ||= subclasses_of(Filter).find do |klass|
|
|
22
|
-
klass.identifiers.include?(name.to_sym)
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def self.layout_processor_for_extension(ext)
|
|
27
|
-
@@filters[ext.to_sym] ||= subclasses_of(LayoutProcessor).find do |klass|
|
|
28
|
-
klass.extensions.include?(ext)
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
end
|
|
33
|
-
end
|
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
begin ; require 'active_record' ; rescue LoadError ; end
|
|
2
|
-
|
|
3
|
-
module Nanoc::DataSource::Database
|
|
4
|
-
|
|
5
|
-
########## Helper classes ##########
|
|
6
|
-
|
|
7
|
-
begin
|
|
8
|
-
|
|
9
|
-
class DatabasePage < ActiveRecord::Base
|
|
10
|
-
set_table_name 'pages'
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
class DatabasePageDefault < ActiveRecord::Base
|
|
14
|
-
set_table_name 'page_defaults'
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
class DatabaseTemplate < ActiveRecord::Base
|
|
18
|
-
set_table_name 'templates'
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
class DatabaseLayout < ActiveRecord::Base
|
|
22
|
-
set_table_name 'layouts'
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
class DatabaseCodePiece < ActiveRecord::Base
|
|
26
|
-
set_table_name 'code_pieces'
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
rescue NameError
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
class DatabaseDataSource < Nanoc::DataSource
|
|
33
|
-
|
|
34
|
-
########## Attributes ##########
|
|
35
|
-
|
|
36
|
-
identifier :database
|
|
37
|
-
|
|
38
|
-
########## Preparation ##########
|
|
39
|
-
|
|
40
|
-
def up
|
|
41
|
-
nanoc_require 'active_record'
|
|
42
|
-
|
|
43
|
-
# Connect to the database
|
|
44
|
-
ActiveRecord::Base.establish_connection(@site.config[:database])
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def down
|
|
48
|
-
# Disconnect from the database
|
|
49
|
-
ActiveRecord::Base.remove_connection
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def setup
|
|
53
|
-
# Create tables
|
|
54
|
-
schema = ActiveRecord::Schema
|
|
55
|
-
schema.verbose = false
|
|
56
|
-
schema.define do
|
|
57
|
-
|
|
58
|
-
create_table :pages, :force => true do |t|
|
|
59
|
-
t.column :content, :text
|
|
60
|
-
t.column :path, :string
|
|
61
|
-
t.column :meta, :text
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
create_table :page_defaults, :force => true do |t|
|
|
65
|
-
t.column :meta, :text
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
create_table :layouts, :force => true do |t|
|
|
69
|
-
t.column :name, :string
|
|
70
|
-
t.column :content, :text
|
|
71
|
-
t.column :extension, :string
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
create_table :templates, :force => true do |t|
|
|
75
|
-
t.column :content, :text
|
|
76
|
-
t.column :name, :string
|
|
77
|
-
t.column :meta, :text
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
create_table :code_pieces, :force => true do |t|
|
|
81
|
-
t.column :name, :string
|
|
82
|
-
t.column :code, :text
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# Create first page
|
|
88
|
-
DatabasePage.create(
|
|
89
|
-
:path => '/',
|
|
90
|
-
:content => "I'm a brand new root page. Please edit me!\n",
|
|
91
|
-
:meta => "# Built-in\n" +
|
|
92
|
-
"\n" +
|
|
93
|
-
"# Custom\n" +
|
|
94
|
-
"title: \"A New Root Page\"\n"
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
# Create page defaults
|
|
98
|
-
DatabasePageDefault.create(
|
|
99
|
-
:meta => "# Built-in\n" +
|
|
100
|
-
"custom_path: none\n" +
|
|
101
|
-
"extension: \"html\"\n" +
|
|
102
|
-
"filename: \"index\"\n" +
|
|
103
|
-
"filters_post: []\n" +
|
|
104
|
-
"filters_pre: []\n" +
|
|
105
|
-
"is_draft: false\n" +
|
|
106
|
-
"layout: \"default\"\n" +
|
|
107
|
-
"skip_output: false\n" +
|
|
108
|
-
"\n" +
|
|
109
|
-
"# Custom\n"
|
|
110
|
-
)
|
|
111
|
-
|
|
112
|
-
# Create default layout
|
|
113
|
-
DatabaseLayout.create(
|
|
114
|
-
:name => 'default',
|
|
115
|
-
:content => "<html>\n" +
|
|
116
|
-
" <head>\n" +
|
|
117
|
-
" <title><%= @page.title %></title>\n" +
|
|
118
|
-
" </head>\n" +
|
|
119
|
-
" <body>\n" +
|
|
120
|
-
"<%= @page.content %>\n" +
|
|
121
|
-
" </body>\n" +
|
|
122
|
-
"</html>",
|
|
123
|
-
:extension => '.erb'
|
|
124
|
-
)
|
|
125
|
-
|
|
126
|
-
# Create default template
|
|
127
|
-
DatabaseTemplate.create(
|
|
128
|
-
:name => 'default',
|
|
129
|
-
:content => 'Hi, I\'m a new page!',
|
|
130
|
-
:meta => "# Built-in\n" +
|
|
131
|
-
"\n" +
|
|
132
|
-
"# Custom\n" +
|
|
133
|
-
"title: \"A New Page\"\n"
|
|
134
|
-
)
|
|
135
|
-
|
|
136
|
-
# Create default code piece
|
|
137
|
-
DatabaseCodePiece.create(
|
|
138
|
-
:name => 'default',
|
|
139
|
-
:code => "def html_escape(str)\n" +
|
|
140
|
-
" str.gsub('&', '&').str('<', '<').str('>', '>').str('\"', '"')\n" +
|
|
141
|
-
"end\n" +
|
|
142
|
-
"alias h html_escape\n"
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
log(:high, "Set up database schema.")
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
########## Loading data ##########
|
|
149
|
-
|
|
150
|
-
def pages
|
|
151
|
-
# Create Pages for each database object
|
|
152
|
-
DatabasePage.find(:all).inject([]) do |pages, page|
|
|
153
|
-
# Read metadata
|
|
154
|
-
hash = (YAML.load(page.meta || '') || {}).clean
|
|
155
|
-
|
|
156
|
-
if hash[:is_draft]
|
|
157
|
-
# Skip drafts
|
|
158
|
-
pages
|
|
159
|
-
else
|
|
160
|
-
# Get extra info
|
|
161
|
-
extras = { :path => page.path, :uncompiled_content => page.content }
|
|
162
|
-
|
|
163
|
-
# Add to list of pages
|
|
164
|
-
pages + [ hash.merge(extras) ]
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
def page_defaults
|
|
170
|
-
YAML.load(DatabasePageDefault.find(:first).meta) || {}
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
def layouts
|
|
174
|
-
DatabaseLayout.find(:all).map do |layout|
|
|
175
|
-
{
|
|
176
|
-
:name => layout.name,
|
|
177
|
-
:content => layout.content,
|
|
178
|
-
:extension => layout.extension
|
|
179
|
-
}
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
def templates
|
|
184
|
-
DatabaseTemplate.find(:all).map do |template|
|
|
185
|
-
{
|
|
186
|
-
:name => template.name,
|
|
187
|
-
:content => template.content,
|
|
188
|
-
:meta => template.meta
|
|
189
|
-
}
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
def code
|
|
194
|
-
DatabaseCodePiece.find(:all).map { |p| p.code }.join("\n")
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
########## Creating data ##########
|
|
198
|
-
|
|
199
|
-
def create_page(path, template)
|
|
200
|
-
# Make sure path does not start or end with a slash
|
|
201
|
-
sanitized_path = ('/' + path + '/').gsub(/^\/+|\/+$/, '/')
|
|
202
|
-
|
|
203
|
-
# Make sure the page doesn't exist yet
|
|
204
|
-
unless DatabasePage.find_all_by_path(sanitized_path).empty?
|
|
205
|
-
error "A page named '#{sanitized_path}' already exists."
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
# Create page
|
|
209
|
-
DatabasePage.create(
|
|
210
|
-
:path => sanitized_path,
|
|
211
|
-
:content => "I'm a brand new page. Please edit me!\n",
|
|
212
|
-
:meta => "# Built-in\n\n# Custom\ntitle: A New Page\n"
|
|
213
|
-
)
|
|
214
|
-
|
|
215
|
-
log(:high, "Created page '#{sanitized_path}'.")
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
def create_layout(name)
|
|
219
|
-
# Make sure the layout doesn't exist yet
|
|
220
|
-
unless DatabaseLayout.find_all_by_name(name).empty?
|
|
221
|
-
error "A layout named '#{name}' already exists."
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
# Create layout
|
|
225
|
-
DatabaseLayout.create(
|
|
226
|
-
:name => name,
|
|
227
|
-
:content => "<html>\n" +
|
|
228
|
-
" <head>\n" +
|
|
229
|
-
" <title><%= @page.title %></title>\n" +
|
|
230
|
-
" </head>\n" +
|
|
231
|
-
" <body>\n" +
|
|
232
|
-
"<%= @page.content %>\n" +
|
|
233
|
-
" </body>\n" +
|
|
234
|
-
"</html>",
|
|
235
|
-
:extension => '.erb'
|
|
236
|
-
)
|
|
237
|
-
|
|
238
|
-
log(:high, "Created layout '#{name}'.")
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
def create_template(name)
|
|
242
|
-
# Make sure the layout doesn't exist yet
|
|
243
|
-
unless DatabaseTemplate.find_all_by_name(name).empty?
|
|
244
|
-
error "A template named '#{name}' already exists."
|
|
245
|
-
end
|
|
246
|
-
|
|
247
|
-
# Create template
|
|
248
|
-
DatabaseTemplate.create(
|
|
249
|
-
:name => name,
|
|
250
|
-
:content => "Hi, I'm a brand new page!\n",
|
|
251
|
-
:meta => "# Built-in\n\n# Custom\ntitle: A New Page\n"
|
|
252
|
-
)
|
|
253
|
-
|
|
254
|
-
log(:high,"Created template '#{name}'.")
|
|
255
|
-
end
|
|
256
|
-
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
end
|