nanoc3 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +3 -0
- data/LICENSE +19 -0
- data/NEWS.rdoc +262 -0
- data/README.rdoc +80 -0
- data/Rakefile +11 -0
- data/bin/nanoc3 +16 -0
- data/lib/nanoc3/base/code_snippet.rb +42 -0
- data/lib/nanoc3/base/compiler.rb +225 -0
- data/lib/nanoc3/base/compiler_dsl.rb +110 -0
- data/lib/nanoc3/base/core_ext/array.rb +21 -0
- data/lib/nanoc3/base/core_ext/hash.rb +23 -0
- data/lib/nanoc3/base/core_ext/string.rb +14 -0
- data/lib/nanoc3/base/core_ext.rb +5 -0
- data/lib/nanoc3/base/data_source.rb +197 -0
- data/lib/nanoc3/base/dependency_tracker.rb +291 -0
- data/lib/nanoc3/base/errors.rb +95 -0
- data/lib/nanoc3/base/filter.rb +60 -0
- data/lib/nanoc3/base/item.rb +87 -0
- data/lib/nanoc3/base/item_rep.rb +236 -0
- data/lib/nanoc3/base/layout.rb +53 -0
- data/lib/nanoc3/base/notification_center.rb +68 -0
- data/lib/nanoc3/base/plugin.rb +88 -0
- data/lib/nanoc3/base/preprocessor_context.rb +37 -0
- data/lib/nanoc3/base/rule.rb +37 -0
- data/lib/nanoc3/base/rule_context.rb +68 -0
- data/lib/nanoc3/base/site.rb +334 -0
- data/lib/nanoc3/base.rb +25 -0
- data/lib/nanoc3/cli/base.rb +151 -0
- data/lib/nanoc3/cli/commands/autocompile.rb +89 -0
- data/lib/nanoc3/cli/commands/compile.rb +279 -0
- data/lib/nanoc3/cli/commands/create_item.rb +79 -0
- data/lib/nanoc3/cli/commands/create_layout.rb +94 -0
- data/lib/nanoc3/cli/commands/create_site.rb +320 -0
- data/lib/nanoc3/cli/commands/help.rb +71 -0
- data/lib/nanoc3/cli/commands/info.rb +114 -0
- data/lib/nanoc3/cli/commands/update.rb +96 -0
- data/lib/nanoc3/cli/commands.rb +13 -0
- data/lib/nanoc3/cli/logger.rb +73 -0
- data/lib/nanoc3/cli.rb +16 -0
- data/lib/nanoc3/data_sources/delicious.rb +66 -0
- data/lib/nanoc3/data_sources/filesystem.rb +231 -0
- data/lib/nanoc3/data_sources/filesystem_combined.rb +202 -0
- data/lib/nanoc3/data_sources/filesystem_common.rb +22 -0
- data/lib/nanoc3/data_sources/filesystem_compact.rb +232 -0
- data/lib/nanoc3/data_sources/last_fm.rb +103 -0
- data/lib/nanoc3/data_sources/twitter.rb +53 -0
- data/lib/nanoc3/data_sources.rb +20 -0
- data/lib/nanoc3/extra/auto_compiler.rb +97 -0
- data/lib/nanoc3/extra/chick.rb +119 -0
- data/lib/nanoc3/extra/context.rb +24 -0
- data/lib/nanoc3/extra/core_ext/time.rb +19 -0
- data/lib/nanoc3/extra/core_ext.rb +3 -0
- data/lib/nanoc3/extra/deployers/rsync.rb +64 -0
- data/lib/nanoc3/extra/deployers.rb +12 -0
- data/lib/nanoc3/extra/file_proxy.rb +31 -0
- data/lib/nanoc3/extra/validators/links.rb +0 -0
- data/lib/nanoc3/extra/validators/w3c.rb +71 -0
- data/lib/nanoc3/extra/validators.rb +12 -0
- data/lib/nanoc3/extra/vcs.rb +65 -0
- data/lib/nanoc3/extra/vcses/bazaar.rb +21 -0
- data/lib/nanoc3/extra/vcses/dummy.rb +20 -0
- data/lib/nanoc3/extra/vcses/git.rb +21 -0
- data/lib/nanoc3/extra/vcses/mercurial.rb +21 -0
- data/lib/nanoc3/extra/vcses/subversion.rb +21 -0
- data/lib/nanoc3/extra/vcses.rb +17 -0
- data/lib/nanoc3/extra.rb +16 -0
- data/lib/nanoc3/filters/bluecloth.rb +13 -0
- data/lib/nanoc3/filters/coderay.rb +17 -0
- data/lib/nanoc3/filters/erb.rb +19 -0
- data/lib/nanoc3/filters/erubis.rb +17 -0
- data/lib/nanoc3/filters/haml.rb +20 -0
- data/lib/nanoc3/filters/less.rb +13 -0
- data/lib/nanoc3/filters/markaby.rb +14 -0
- data/lib/nanoc3/filters/maruku.rb +14 -0
- data/lib/nanoc3/filters/rainpress.rb +13 -0
- data/lib/nanoc3/filters/rdiscount.rb +13 -0
- data/lib/nanoc3/filters/rdoc.rb +23 -0
- data/lib/nanoc3/filters/redcloth.rb +14 -0
- data/lib/nanoc3/filters/relativize_paths.rb +32 -0
- data/lib/nanoc3/filters/rubypants.rb +14 -0
- data/lib/nanoc3/filters/sass.rb +17 -0
- data/lib/nanoc3/filters.rb +37 -0
- data/lib/nanoc3/helpers/blogging.rb +226 -0
- data/lib/nanoc3/helpers/breadcrumbs.rb +25 -0
- data/lib/nanoc3/helpers/capturing.rb +71 -0
- data/lib/nanoc3/helpers/filtering.rb +46 -0
- data/lib/nanoc3/helpers/html_escape.rb +22 -0
- data/lib/nanoc3/helpers/link_to.rb +120 -0
- data/lib/nanoc3/helpers/rendering.rb +76 -0
- data/lib/nanoc3/helpers/tagging.rb +58 -0
- data/lib/nanoc3/helpers/text.rb +40 -0
- data/lib/nanoc3/helpers/xml_sitemap.rb +69 -0
- data/lib/nanoc3/helpers.rb +16 -0
- data/lib/nanoc3/package.rb +106 -0
- data/lib/nanoc3/tasks/clean.rake +16 -0
- data/lib/nanoc3/tasks/clean.rb +33 -0
- data/lib/nanoc3/tasks/deploy/rsync.rake +11 -0
- data/lib/nanoc3/tasks/validate.rake +35 -0
- data/lib/nanoc3/tasks.rb +9 -0
- data/lib/nanoc3.rb +19 -0
- data/vendor/cri/ChangeLog +0 -0
- data/vendor/cri/LICENSE +19 -0
- data/vendor/cri/NEWS +0 -0
- data/vendor/cri/README +4 -0
- data/vendor/cri/Rakefile +25 -0
- data/vendor/cri/lib/cri/base.rb +153 -0
- data/vendor/cri/lib/cri/command.rb +105 -0
- data/vendor/cri/lib/cri/core_ext/string.rb +41 -0
- data/vendor/cri/lib/cri/core_ext.rb +8 -0
- data/vendor/cri/lib/cri/option_parser.rb +186 -0
- data/vendor/cri/lib/cri.rb +12 -0
- data/vendor/cri/test/test_base.rb +6 -0
- data/vendor/cri/test/test_command.rb +6 -0
- data/vendor/cri/test/test_core_ext.rb +21 -0
- data/vendor/cri/test/test_option_parser.rb +279 -0
- metadata +225 -0
data/ChangeLog
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2007-2009 Denis Defreyne and contributors
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
11
|
+
copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
SOFTWARE.
|
data/NEWS.rdoc
ADDED
@@ -0,0 +1,262 @@
|
|
1
|
+
= nanoc News
|
2
|
+
|
3
|
+
== 3.0
|
4
|
+
|
5
|
+
New:
|
6
|
+
|
7
|
+
* Multiple data sources
|
8
|
+
* Dependency tracking between items
|
9
|
+
* Filters can now optionally take arguments
|
10
|
+
* create_page and create_layout methods in data sources
|
11
|
+
* A new way to specify compilation/routing rules using a Rules file
|
12
|
+
* Coderay filter
|
13
|
+
* A filesystem_compact data source which uses less directories
|
14
|
+
|
15
|
+
Changed:
|
16
|
+
|
17
|
+
* Pages and textual assets are now known as "items"
|
18
|
+
|
19
|
+
Removed:
|
20
|
+
|
21
|
+
* Support for drafts
|
22
|
+
* Support for binary assets
|
23
|
+
* Support for templates
|
24
|
+
* Everything that was deprecated in nanoc 2.x
|
25
|
+
* save_*, move_* and delete_* methods in data sources
|
26
|
+
* Processing instructions in metadata
|
27
|
+
|
28
|
+
== 2.2.2
|
29
|
+
|
30
|
+
* Removed relativize_paths filter; use relativize_paths_in_html or
|
31
|
+
relativize_paths_in_css instead
|
32
|
+
* Fixed bug which could cause nanoc to eat massive amounts of memory when an
|
33
|
+
exception occurs
|
34
|
+
* Fixed bug which would cause nanoc to complain about the open file limit
|
35
|
+
being reached when using a large amount of assets
|
36
|
+
|
37
|
+
== 2.2.1
|
38
|
+
|
39
|
+
* Fixed bug which prevented relative_path_to from working
|
40
|
+
* Split relativize_paths filter into two filter: relativize_paths_in_html
|
41
|
+
and relativize_paths_in_css
|
42
|
+
* Removed bundled mime-types library
|
43
|
+
|
44
|
+
== 2.2
|
45
|
+
|
46
|
+
New:
|
47
|
+
|
48
|
+
* --pages and --assets compiler options
|
49
|
+
* --no-color commandline option
|
50
|
+
* Filtering helper
|
51
|
+
* relative_path_to function in LinkTo helper
|
52
|
+
* Rainpress filter
|
53
|
+
* RelativizePaths filter
|
54
|
+
* The current layout is now accessible through the @layout variable
|
55
|
+
* Much more informative stack traces when something goes wrong
|
56
|
+
|
57
|
+
Changed:
|
58
|
+
|
59
|
+
* The commandline option parser is now a lot more reliable
|
60
|
+
* atom_feed now takes optional :content_proc, :excerpt_proc and :articles
|
61
|
+
parameters
|
62
|
+
* The compile command show non-written items (those with skip_output: true)
|
63
|
+
* The compile command compiles everything by default
|
64
|
+
* Added --only-outdated option to compile only outdated pages
|
65
|
+
|
66
|
+
Removed:
|
67
|
+
|
68
|
+
* deprecated extension-based code
|
69
|
+
|
70
|
+
== 2.1.6
|
71
|
+
|
72
|
+
* The FilesystemCombined data source now supports empty metadata sections
|
73
|
+
* The RDoc filter now works for both RDoc 1.x and 2.x
|
74
|
+
* The autocompiler now serves a 500 when an exception occurs outside
|
75
|
+
compilation
|
76
|
+
* The autocompiler no longer serves index files when the request path does not
|
77
|
+
end with a slash
|
78
|
+
* The autocompiler now always serves asset content correctly
|
79
|
+
|
80
|
+
== 2.1.5
|
81
|
+
|
82
|
+
* Added Ruby 1.9 compatibility
|
83
|
+
* The Filesystem and FilesystemCombined data sources now preserve custom
|
84
|
+
extensions
|
85
|
+
|
86
|
+
== 2.1.4
|
87
|
+
|
88
|
+
* Fixed an issue where the autocompiler in Windows would serve broken assets
|
89
|
+
|
90
|
+
== 2.1.3
|
91
|
+
|
92
|
+
* The Haml and Sass filters now correctly take their options from assets
|
93
|
+
* Autocompiler now serves index files instead of 404s
|
94
|
+
* Layouts named "index" are now handled correctly
|
95
|
+
* filesystem_combined now properly handles assets
|
96
|
+
|
97
|
+
== 2.1.2
|
98
|
+
|
99
|
+
* Autocompiler now compiles assets as well
|
100
|
+
* Sass filter now takes options (just like the Haml filter)
|
101
|
+
* Haml/Sass options are now taken from the page *rep* instead of the page
|
102
|
+
|
103
|
+
== 2.1.1
|
104
|
+
|
105
|
+
* Fixed issue which would cause files not to be required in the right order
|
106
|
+
|
107
|
+
== 2.1
|
108
|
+
|
109
|
+
This is only a short summary of all changes in 2.1. For details, see the nanoc
|
110
|
+
web site at <http://nanoc.stoneship.org/> -- especially the blog and the
|
111
|
+
updated manual will be useful.
|
112
|
+
|
113
|
+
New:
|
114
|
+
|
115
|
+
* New filters: RDiscount, Maruku, Erubis
|
116
|
+
* A better commandline frontend
|
117
|
+
* A new filesystem data source named "filesystem_combined"
|
118
|
+
* Routers, which decide where compiled pages should be written to
|
119
|
+
* Page/layout mtimes can now be retrieved through page.mtime/layout.mtime
|
120
|
+
|
121
|
+
Changed:
|
122
|
+
|
123
|
+
* Already compiled pages will no longer be re-compiled unless outdated
|
124
|
+
* Layout processors and filters have been merged
|
125
|
+
* Layouts no longer rely on file extensions to determine the layout processor
|
126
|
+
* Greatly improved source code documentation
|
127
|
+
* Greatly improved unit test suite
|
128
|
+
|
129
|
+
Removed:
|
130
|
+
|
131
|
+
* Several filters have been removed and replaced by newer filters:
|
132
|
+
* `eruby`: use `erb` or `erubis` instead
|
133
|
+
* `markdown`: use `bluecloth`, `rdiscount` or `maruku` instead
|
134
|
+
* `textile`: use `redcloth` instead
|
135
|
+
|
136
|
+
== 2.0.4
|
137
|
+
|
138
|
+
* Fixed default.rb's `html_escape`
|
139
|
+
* Updated Haml filter and layout processor so that @page, @pages and @config
|
140
|
+
are now available as instance variables instead of local variables
|
141
|
+
|
142
|
+
== 2.0.3
|
143
|
+
|
144
|
+
* The autocompiler now honors custom paths
|
145
|
+
* The autocompiler now attempts to serve pages with the most appropriate MIME
|
146
|
+
type, instead of always serving everything as "text/html"
|
147
|
+
|
148
|
+
== 2.0.2
|
149
|
+
|
150
|
+
* nanoc now requires Ruby 1.8.5 instead of 1.8.6
|
151
|
+
|
152
|
+
== 2.0.1
|
153
|
+
|
154
|
+
* Fixed a "too many open files" error that could appear during (auto)compiling
|
155
|
+
|
156
|
+
== 2.0
|
157
|
+
|
158
|
+
New:
|
159
|
+
|
160
|
+
* Support for custom layout processors
|
161
|
+
* Support for custom data sources
|
162
|
+
* Database data source
|
163
|
+
* Auto-compiler
|
164
|
+
* Pages have `parent` and `children`
|
165
|
+
|
166
|
+
Changed:
|
167
|
+
|
168
|
+
* The source has been restructured and cleaned up a great deal
|
169
|
+
* Filters are defined in a different way now
|
170
|
+
* The 'eruby' filter now uses ERB instead of Erubis
|
171
|
+
|
172
|
+
Removed:
|
173
|
+
|
174
|
+
* The `filters` property; use `filters_pre` instead
|
175
|
+
* Support for Liquid
|
176
|
+
|
177
|
+
== 1.6.2
|
178
|
+
|
179
|
+
* Fixed an issue which prevented the content capturing plugin from working
|
180
|
+
|
181
|
+
== 1.6.1
|
182
|
+
|
183
|
+
* Removed a stray debug message
|
184
|
+
|
185
|
+
== 1.6
|
186
|
+
|
187
|
+
* Added support for post-layout filters
|
188
|
+
* Added support for getting a File object for the page, so you can now e.g.
|
189
|
+
easily get the modification time for a given page (`@page.file.mtime`)
|
190
|
+
* Cleaned up the source code a lot
|
191
|
+
* Removed deprecated asset-copying functionality
|
192
|
+
|
193
|
+
== 1.5
|
194
|
+
|
195
|
+
* Added support for custom filters
|
196
|
+
* Improved Liquid support -- Liquid is now a first-class nanoc citizen
|
197
|
+
* Deprecated assets -- use something like rsync instead
|
198
|
+
* Added eruby_engine option, which can be 'erb' or 'erubis'
|
199
|
+
|
200
|
+
== 1.4
|
201
|
+
|
202
|
+
* nanoc now supports ERB (as well as Erubis); Erubis no longer is a dependency
|
203
|
+
* meta.yaml can now have haml_options property, which is passed to Haml
|
204
|
+
* Pages can now have a 'filename' property, which defaults to 'index' [Dennis
|
205
|
+
Sutch]
|
206
|
+
* Pages now know in what order they should be compiled, eliminating the need
|
207
|
+
for custom page ordering [Dennis Sutch]
|
208
|
+
|
209
|
+
== 1.3.1
|
210
|
+
|
211
|
+
* The contents of the 'assets' directory are now copied into the output
|
212
|
+
directory specified in 'config.yaml'
|
213
|
+
|
214
|
+
== 1.3
|
215
|
+
|
216
|
+
* The @pages array now also contains uncompiled pages
|
217
|
+
* Pages with 'skip_output' set to true will not be outputted
|
218
|
+
* Added new filters
|
219
|
+
* Textile/RedCloth
|
220
|
+
* Sass
|
221
|
+
* nanoc now warns before overwriting in create_site, create_page and
|
222
|
+
create_template (but not in compile)
|
223
|
+
|
224
|
+
== 1.2
|
225
|
+
|
226
|
+
* Sites now have an 'assets' directory, whose contents are copied to the
|
227
|
+
'output' directory when compiling [Soryu]
|
228
|
+
* Added support for non-eRuby layouts (Markaby, Haml, Liquid, ...)
|
229
|
+
* Added more filters (Markaby, Haml, Liquid, RDoc [Dmitry Bilunov])
|
230
|
+
* Improved error reporting
|
231
|
+
* Accessing page attributes using instance variables, and not through @page,
|
232
|
+
is no longer possible
|
233
|
+
* Page attributes can now be accessed using dot notation, i.e. @page.title as
|
234
|
+
well as @page[:title]
|
235
|
+
|
236
|
+
== 1.1.3
|
237
|
+
|
238
|
+
* Fixed bug which would cause layoutless pages to be outputted incorrectly
|
239
|
+
|
240
|
+
== 1.1.2
|
241
|
+
|
242
|
+
* Backup files (files ending with a “~”) are now ignored
|
243
|
+
* Fixed bug which would cause subpages not to be generated correctly
|
244
|
+
|
245
|
+
== 1.1
|
246
|
+
|
247
|
+
* Added support for nested layouts
|
248
|
+
* Added coloured logging
|
249
|
+
* @page now hold the page that is currently being processed
|
250
|
+
* Index files are now called “content” files and are now named after the
|
251
|
+
directory they are in [Colin Barrett]
|
252
|
+
* It is now possible to access @page in the page’s content file
|
253
|
+
|
254
|
+
== 1.0.1
|
255
|
+
|
256
|
+
* Fixed a bug which would cause a “no such template” error to be displayed
|
257
|
+
when the template existed but compiling it would raise an exception
|
258
|
+
* Fixed bug which would cause pages not to be sorted by order before compiling
|
259
|
+
|
260
|
+
== 1.0
|
261
|
+
|
262
|
+
* Initial release
|
data/README.rdoc
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
= nanoc 3
|
2
|
+
|
3
|
+
nanoc is a simple but very flexible static site generator written in Ruby.
|
4
|
+
It operates on local files, and therefore does not run on the server. nanoc
|
5
|
+
"compiles" the local source files into HTML (usually), by evaluating eRuby,
|
6
|
+
Markdown, etc.
|
7
|
+
|
8
|
+
== Documentation
|
9
|
+
|
10
|
+
nanoc3's web site, which can be found at http://nanoc.stoneship.org, contains a
|
11
|
+
few useful resources to help you get started with nanoc:
|
12
|
+
|
13
|
+
* The tutorial at http://nanoc.stoneship.org/help/tutorial
|
14
|
+
* The manual at http://nanoc.stoneship.org/help/manual
|
15
|
+
|
16
|
+
It is probably also worth checking out and perhaps subscribing to the
|
17
|
+
discussion groups:
|
18
|
+
|
19
|
+
* The discussion group in English at http://groups.google.com/group/nanoc
|
20
|
+
* The discussion group in Spanish at http://groups.google.com/group/nanoc-es
|
21
|
+
|
22
|
+
=== Source Code Documentation
|
23
|
+
|
24
|
+
The source code is structured in a few directories:
|
25
|
+
|
26
|
+
* *bin* contains the commandline tool aptly named +nanoc+
|
27
|
+
* *lib*
|
28
|
+
* *nanoc*
|
29
|
+
* *base* contains the bare essentials necessary for nanoc to function
|
30
|
+
* *cli* contains the commandline interface
|
31
|
+
* *data_sources* contains the standard data sources (Nanoc3::DataSource
|
32
|
+
subclasses), such as the filesystem data source
|
33
|
+
* *helpers* contains helpers, which provide functionality some sites
|
34
|
+
may find useful, such as the blogging and tagging helpers
|
35
|
+
* *extra* contains stuff that is not needed by nanoc itself, but which may
|
36
|
+
be used by helpers, data sources, filters or VCSes.
|
37
|
+
* *filters* contains the standard filters (Nanoc3::Filter subclasses) such
|
38
|
+
as ERB, Markdown, Haml, ...
|
39
|
+
* *test* contains testing code, structured in the same way as lib/nanoc
|
40
|
+
|
41
|
+
The namespaces (modules) are organised like this:
|
42
|
+
|
43
|
+
* *Nanoc* is the namespace for everything nanoc-related (obviously). The
|
44
|
+
classes in 'lib/nanoc3/base' are part of this module (not Nanoc3::Base which
|
45
|
+
does not exist)
|
46
|
+
* *CLI* containing everything related to the commandline tool.
|
47
|
+
* *DataSources* contains the data sources
|
48
|
+
* *Helpers* contains the helpers
|
49
|
+
* *Extra* contains useful stuff not needed by nanoc itself
|
50
|
+
* *Filters* contains the (textual) filters
|
51
|
+
|
52
|
+
The central class in nanoc is Nanoc3::Site, so you should start there if you
|
53
|
+
want to explore nanoc from a technical perspective.
|
54
|
+
|
55
|
+
== Dependencies
|
56
|
+
|
57
|
+
nanoc itself can be used without installing any dependencies. Some components, however, do have dependencies:
|
58
|
+
|
59
|
+
autocompiler:: +mime-types+, +rack+
|
60
|
+
documentation generation:: +rdoc+ (2.4 or newer), +yardoc+
|
61
|
+
packaging:: +rubygems+ (1.3 or newer)
|
62
|
+
|
63
|
+
You may need to manually install the rdoc gem and update the rubygems installation.
|
64
|
+
|
65
|
+
== Contributors
|
66
|
+
|
67
|
+
(In alphabetical order)
|
68
|
+
|
69
|
+
* Christian Plessl
|
70
|
+
* Colin Barrett
|
71
|
+
* Dmitry Bilunov
|
72
|
+
* Šime Ramov
|
73
|
+
* "Soryu"
|
74
|
+
* Dennis Sutch
|
75
|
+
|
76
|
+
Special thanks to Ale Muñoz.
|
77
|
+
|
78
|
+
== Contact
|
79
|
+
|
80
|
+
You can reach me at <denis.defreyne@stoneship.org>.
|
data/Rakefile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# Load nanoc
|
4
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/lib'))
|
5
|
+
require 'nanoc3'
|
6
|
+
|
7
|
+
# Load tasks
|
8
|
+
Dir.glob('tasks/**/*.rake').each { |r| Rake.application.add_import r }
|
9
|
+
|
10
|
+
# Set default talk
|
11
|
+
task :default => [ :fetch_dependencies, :test ]
|
data/bin/nanoc3
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
# Add lib to load path
|
5
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
|
6
|
+
|
7
|
+
# Load nanoc
|
8
|
+
require 'nanoc3'
|
9
|
+
require 'nanoc3/cli'
|
10
|
+
|
11
|
+
# Load custom code that can't be load later
|
12
|
+
Dir['lib/commands/*.rb'].sort.each { |f| require f }
|
13
|
+
Dir['lib/data_sources/*.rb'].sort.each { |f| require f }
|
14
|
+
|
15
|
+
# Run base
|
16
|
+
Nanoc3::CLI::Base.shared_base.run(ARGV)
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Nanoc3
|
4
|
+
|
5
|
+
# Nanoc3::CodeSnippet represent a piece of custom code of a nanoc site. It
|
6
|
+
# contains the textual source code as well as a mtime, which is used to
|
7
|
+
# speed up site compilation.
|
8
|
+
class CodeSnippet
|
9
|
+
|
10
|
+
# The Nanoc3::Site this code snippet belongs to.
|
11
|
+
attr_accessor :site
|
12
|
+
|
13
|
+
# A string containing the actual code in this code snippet.
|
14
|
+
attr_reader :data
|
15
|
+
|
16
|
+
# The filename corresponding to this code snippet.
|
17
|
+
attr_reader :filename
|
18
|
+
|
19
|
+
# The time where this code snippet was last modified.
|
20
|
+
attr_reader :mtime
|
21
|
+
|
22
|
+
# Creates a new code snippet.
|
23
|
+
#
|
24
|
+
# +data+:: The raw source code which will be executed before compilation.
|
25
|
+
#
|
26
|
+
# +filename+:: The filename corresponding to this code snippet.
|
27
|
+
#
|
28
|
+
# +mtime+:: The time when the code was last modified (can be nil).
|
29
|
+
def initialize(data, filename, mtime=nil)
|
30
|
+
@data = data
|
31
|
+
@filename = filename
|
32
|
+
@mtime = mtime
|
33
|
+
end
|
34
|
+
|
35
|
+
# Loads the code by executing it.
|
36
|
+
def load
|
37
|
+
eval(@data, TOPLEVEL_BINDING, @filename)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,225 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Nanoc3
|
4
|
+
|
5
|
+
# Nanoc3::Compiler is responsible for compiling a site's item
|
6
|
+
# representations.
|
7
|
+
class Compiler
|
8
|
+
|
9
|
+
# The compilation stack. When the compiler begins compiling a rep or a
|
10
|
+
# layout, it will be placed on the stack; when it is done compiling the
|
11
|
+
# rep or layout, it will be removed from the stack.
|
12
|
+
attr_reader :stack
|
13
|
+
|
14
|
+
# The list of compilation rules that will be used to compile items. This
|
15
|
+
# array will be filled by Nanoc3::Site#load_data.
|
16
|
+
attr_reader :item_compilation_rules
|
17
|
+
|
18
|
+
# The list of routing rules that will be used to give all items a path.
|
19
|
+
# This array will be filled by Nanoc3::Site#load_data.
|
20
|
+
attr_reader :item_routing_rules
|
21
|
+
|
22
|
+
# The hash containing layout-to-filter mapping rules.
|
23
|
+
attr_reader :layout_filter_mapping
|
24
|
+
|
25
|
+
# Creates a new compiler for the given site.
|
26
|
+
def initialize(site)
|
27
|
+
@site = site
|
28
|
+
|
29
|
+
@stack = []
|
30
|
+
|
31
|
+
@item_compilation_rules = []
|
32
|
+
@item_routing_rules = []
|
33
|
+
@layout_filter_mapping = {}
|
34
|
+
end
|
35
|
+
|
36
|
+
# Compiles (part of) the site and writes out the compiled item
|
37
|
+
# representations.
|
38
|
+
#
|
39
|
+
# +items+:: The items that should be compiled, along with their
|
40
|
+
# dependencies. Pass +nil+ if the entire site should be
|
41
|
+
# compiled.
|
42
|
+
#
|
43
|
+
# This method also accepts a few optional parameters:
|
44
|
+
#
|
45
|
+
# +:force+:: true if the rep should be compiled even if it is not
|
46
|
+
# outdated, false if not. Defaults to false.
|
47
|
+
def run(item=nil, params={})
|
48
|
+
# Create output directory if necessary
|
49
|
+
FileUtils.mkdir_p(@site.config[:output_dir])
|
50
|
+
|
51
|
+
# Load dependencies
|
52
|
+
dependency_tracker.load_graph
|
53
|
+
print_dependency_graph if $DEBUG
|
54
|
+
|
55
|
+
# Get items and reps to compile
|
56
|
+
if item
|
57
|
+
items = [ item ] + dependency_tracker.all_inverse_dependencies_for(item)
|
58
|
+
items.uniq!
|
59
|
+
else
|
60
|
+
items = @site.items
|
61
|
+
end
|
62
|
+
reps = items.map { |i| i.reps }.flatten
|
63
|
+
|
64
|
+
# Prepare dependencies
|
65
|
+
mark_outdated_items(reps, params.has_key?(:force) && params[:force])
|
66
|
+
forget_dependencies_if_outdated(items)
|
67
|
+
|
68
|
+
# Compile reps
|
69
|
+
dependency_tracker.start
|
70
|
+
compile_reps(reps)
|
71
|
+
dependency_tracker.stop
|
72
|
+
|
73
|
+
# Store dependencies
|
74
|
+
dependency_tracker.store_graph
|
75
|
+
end
|
76
|
+
|
77
|
+
# Returns the first matching compilation rule for the given rep.
|
78
|
+
def compilation_rule_for(rep)
|
79
|
+
@item_compilation_rules.find do |rule|
|
80
|
+
rule.applicable_to?(rep.item) && rule.rep_name == rep.name
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Returns the first matching routing rule for the given rep.
|
85
|
+
def routing_rule_for(rep)
|
86
|
+
@item_routing_rules.find do |rule|
|
87
|
+
rule.applicable_to?(rep.item) && rule.rep_name == rep.name
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Returns a tuple containing the filter name and the filter arguments for
|
92
|
+
# the given layout.
|
93
|
+
def filter_for_layout(layout)
|
94
|
+
@layout_filter_mapping.each_pair do |layout_identifier, filter_name_and_args|
|
95
|
+
return filter_name_and_args if layout.identifier =~ layout_identifier
|
96
|
+
end
|
97
|
+
nil
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
# Compiles all item representations in the site.
|
103
|
+
def compile_reps(reps)
|
104
|
+
active_reps, skipped_reps = reps.partition { |rep| rep.outdated? || rep.item.dependencies_outdated? }
|
105
|
+
inactive_reps = []
|
106
|
+
compiled_reps = []
|
107
|
+
|
108
|
+
# Repeat as long as something is successfully compiled...
|
109
|
+
changed = true
|
110
|
+
until !changed
|
111
|
+
changed = false
|
112
|
+
|
113
|
+
# Attempt to compile all active reps
|
114
|
+
until active_reps.empty?
|
115
|
+
@stack.clear
|
116
|
+
begin
|
117
|
+
rep = active_reps.shift
|
118
|
+
puts "*** Attempting to compile #{rep.inspect}" if $DEBUG
|
119
|
+
|
120
|
+
@stack.push(rep)
|
121
|
+
compile_rep(rep)
|
122
|
+
rescue Nanoc3::Errors::UnmetDependency => e
|
123
|
+
puts "*** Attempt failed due to unmet dependency on #{e.rep.inspect}" if $DEBUG
|
124
|
+
|
125
|
+
# Save rep to compile it later
|
126
|
+
inactive_reps << rep
|
127
|
+
|
128
|
+
# Add dependency to list of items to compile
|
129
|
+
unless active_reps.include?(e.rep) || inactive_reps.include?(e.rep)
|
130
|
+
changed = true
|
131
|
+
skipped_reps.delete(e.rep)
|
132
|
+
inactive_reps.unshift(e.rep)
|
133
|
+
end
|
134
|
+
else
|
135
|
+
puts "*** Attempt succeeded" if $DEBUG
|
136
|
+
|
137
|
+
changed = true
|
138
|
+
compiled_reps << rep
|
139
|
+
end
|
140
|
+
puts if $DEBUG
|
141
|
+
end
|
142
|
+
|
143
|
+
# Retry
|
144
|
+
puts "*** No active reps left; activating all (#{inactive_reps.size}) inactive reps" if $DEBUG
|
145
|
+
puts if $DEBUG
|
146
|
+
active_reps = inactive_reps
|
147
|
+
inactive_reps = []
|
148
|
+
end
|
149
|
+
|
150
|
+
# Notify skipped reps
|
151
|
+
skipped_reps.each do |rep|
|
152
|
+
Nanoc3::NotificationCenter.post(:compilation_started, rep)
|
153
|
+
Nanoc3::NotificationCenter.post(:compilation_ended, rep)
|
154
|
+
end
|
155
|
+
|
156
|
+
# Raise error if some active but non-compileable reps are left
|
157
|
+
if !active_reps.empty?
|
158
|
+
raise Nanoc3::Errors::RecursiveCompilation.new(active_reps)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
# Compiles the given item representation.
|
163
|
+
#
|
164
|
+
# This method should not be called directly; please use
|
165
|
+
# Nanoc3::Compiler#run instead, and pass this item representation's item as
|
166
|
+
# its first argument.
|
167
|
+
#
|
168
|
+
# +rep+:: The rep that is to be compiled.
|
169
|
+
def compile_rep(rep)
|
170
|
+
# Start
|
171
|
+
Nanoc3::NotificationCenter.post(:compilation_started, rep)
|
172
|
+
Nanoc3::NotificationCenter.post(:visit_started, rep.item)
|
173
|
+
|
174
|
+
# Apply matching rule
|
175
|
+
compilation_rule_for(rep).apply_to(rep)
|
176
|
+
rep.compiled = true
|
177
|
+
|
178
|
+
# Write if rep is routed
|
179
|
+
rep.write unless rep.raw_path.nil?
|
180
|
+
|
181
|
+
# Stop
|
182
|
+
Nanoc3::NotificationCenter.post(:visit_ended, rep.item)
|
183
|
+
Nanoc3::NotificationCenter.post(:compilation_ended, rep)
|
184
|
+
end
|
185
|
+
|
186
|
+
# Returns the dependency tracker for this site.
|
187
|
+
def dependency_tracker
|
188
|
+
@dependency_tracker ||= Nanoc3::DependencyTracker.new(@site.items)
|
189
|
+
end
|
190
|
+
|
191
|
+
# Marks the necessary items as outdated.
|
192
|
+
def mark_outdated_items(reps, force)
|
193
|
+
if force
|
194
|
+
reps.each { |r| r.force_outdated = true }
|
195
|
+
else
|
196
|
+
dependency_tracker.mark_outdated_items
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# Clears the list of dependencies for items that will be recompiled.
|
201
|
+
def forget_dependencies_if_outdated(items)
|
202
|
+
items.each do |i|
|
203
|
+
if i.outdated? || i.dependencies_outdated?
|
204
|
+
dependency_tracker.forget_dependencies_for(i)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
# Prints the dependency graph.
|
210
|
+
def print_dependency_graph
|
211
|
+
graph = dependency_tracker.instance_eval { @graph }
|
212
|
+
puts "DEPENDENCY GRAPH:"
|
213
|
+
graph.each_pair do |key, values|
|
214
|
+
puts "#{key.inspect} depends on:"
|
215
|
+
values.each do |value|
|
216
|
+
puts " #{value.inspect}"
|
217
|
+
end
|
218
|
+
puts " (nothing!)" if values.empty?
|
219
|
+
puts
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|