nanoc 1.1.3 → 1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +34 -0
- data/Rakefile +3 -2
- data/bin/nanoc +18 -15
- data/lib/compiler.rb +115 -9
- data/lib/creator.rb +1 -0
- data/lib/enhancements.rb +125 -41
- data/lib/nanoc.rb +4 -3
- data/lib/page.rb +30 -0
- metadata +4 -2
data/ChangeLog
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
== 1.2
|
2
|
+
|
3
|
+
* Sites now have an 'assets' directory, whose contents are copied to the 'output' directory when compiling
|
4
|
+
* Added support for non-eRuby layouts (Markaby, Haml, Liquid, ...)
|
5
|
+
* Added many more filters
|
6
|
+
* Improved error reporting
|
7
|
+
* Accessing page attributes using instance variables, and not through @page, is no longer possible
|
8
|
+
* Page attributes can now be accessed using dot notation, i.e. @page.title as well as @page[:title]
|
9
|
+
|
10
|
+
== 1.1.3
|
11
|
+
|
12
|
+
* Fixed bug which would cause pages without layouts to be outputed incorrectly
|
13
|
+
|
14
|
+
== 1.1.2
|
15
|
+
|
16
|
+
* Backup files (files ending with a “~”) are now ignored
|
17
|
+
* Fixed bug which would cause subpages not to be generated correctly
|
18
|
+
|
19
|
+
== 1.1
|
20
|
+
|
21
|
+
* Added support for nested layouts
|
22
|
+
* Added coloured logging
|
23
|
+
* @page now hold the page that is currently being processed
|
24
|
+
* Index files are now called “content” files and are now named after the directory they are in [Colin Barrett]
|
25
|
+
* It is now possible to access @page in the page’s content file
|
26
|
+
|
27
|
+
== 1.0.1
|
28
|
+
|
29
|
+
* Fixed a bug which would cause a “no such template” error to be displayed when the template existed but compiling it would raise an exception
|
30
|
+
* Fixed bug which would cause pages not to be sorted by order before compiling
|
31
|
+
|
32
|
+
== 1.0
|
33
|
+
|
34
|
+
* Initial release
|
data/Rakefile
CHANGED
@@ -17,7 +17,8 @@ EMAIL = 'denis.defreyne@stoneship.org'
|
|
17
17
|
|
18
18
|
#####
|
19
19
|
|
20
|
-
CLEAN.include [ '
|
20
|
+
CLEAN.include [ 'tmp', 'test/fixtures/*/output/*', 'test/fixtures/*/tmp' ]
|
21
|
+
CLOBBER.include [ 'pkg' ]
|
21
22
|
|
22
23
|
spec = Gem::Specification.new do |s|
|
23
24
|
s.name = NAME
|
@@ -32,7 +33,7 @@ spec = Gem::Specification.new do |s|
|
|
32
33
|
s.required_ruby_version = '>= 1.8.2'
|
33
34
|
|
34
35
|
s.has_rdoc = false
|
35
|
-
s.files = %w( README LICENSE Rakefile ) + Dir['{bin,lib}/**/*']
|
36
|
+
s.files = %w( README LICENSE ChangeLog Rakefile ) + Dir['{bin,lib}/**/*']
|
36
37
|
s.executables = [ 'nanoc' ]
|
37
38
|
s.require_path = 'lib'
|
38
39
|
s.bindir = 'bin'
|
data/bin/nanoc
CHANGED
@@ -1,29 +1,32 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
#
|
5
|
-
# -h, --help:
|
6
|
-
# prints the help
|
7
|
-
#
|
8
|
-
# -t <template>, --template <template>
|
9
|
-
# Uses the specified template when creating a page
|
10
|
-
#
|
11
|
-
# -v, --version:
|
12
|
-
# prints the version information
|
3
|
+
require File.dirname(__FILE__) + '/../lib/nanoc.rb'
|
13
4
|
|
14
|
-
require 'rubygems' rescue nil
|
15
5
|
require 'getoptlong'
|
16
6
|
|
17
|
-
|
7
|
+
try_require 'rubygems'
|
18
8
|
|
19
9
|
# Define some texts
|
20
10
|
version_text = "nanoc #{Nanoc::VERSION} (c) 2007 Denis Defreyne."
|
11
|
+
usage_text = "Usage: nanoc [options] [command] [parameters]"
|
21
12
|
help_text = <<EOT
|
22
|
-
|
13
|
+
Usage: nanoc [-chv]
|
23
14
|
nanoc create_site <name>
|
24
15
|
nanoc create_page <name> [-t template]
|
25
16
|
nanoc create_template <name>
|
26
17
|
nanoc compile
|
18
|
+
|
19
|
+
Options:
|
20
|
+
-h, --help Show this help message and quit.
|
21
|
+
-v, --version Show the nanoc version number and quit.
|
22
|
+
-t, --template Template that should be used when creating a page.
|
23
|
+
(can only be used with create_page)
|
24
|
+
|
25
|
+
Description:
|
26
|
+
The 'nanoc' command is used for creating nanoc-powered sites, as well as
|
27
|
+
managing them: creating pages and templates and compiling the site.
|
28
|
+
|
29
|
+
Read more about nanoc on the site: <http://stoneship.org/software/nanoc/>
|
27
30
|
EOT
|
28
31
|
|
29
32
|
# Parse options
|
@@ -47,13 +50,13 @@ begin
|
|
47
50
|
end
|
48
51
|
end
|
49
52
|
rescue GetoptLong::InvalidOption
|
50
|
-
$stderr.puts
|
53
|
+
$stderr.puts usage_text
|
51
54
|
exit
|
52
55
|
end
|
53
56
|
|
54
57
|
# Make sure we have at least one argument
|
55
58
|
if ARGV.size == 0
|
56
|
-
$stderr.puts
|
59
|
+
$stderr.puts usage_text
|
57
60
|
exit
|
58
61
|
end
|
59
62
|
|
data/lib/compiler.rb
CHANGED
@@ -2,51 +2,157 @@ module Nanoc
|
|
2
2
|
class Compiler
|
3
3
|
|
4
4
|
DEFAULT_CONFIG = { :output_dir => 'output' }
|
5
|
-
|
5
|
+
|
6
|
+
FILE_TYPES = {
|
7
|
+
'.erb' => :eruby,
|
8
|
+
'.rhtml' => :eruby,
|
9
|
+
'.haml' => :haml,
|
10
|
+
'.mab' => :markaby,
|
11
|
+
'.liquid' => :liquid
|
12
|
+
}
|
13
|
+
|
14
|
+
PAGE_DEFAULTS = {
|
15
|
+
:custom_path => nil,
|
16
|
+
:extension => 'html',
|
17
|
+
:filters => [],
|
18
|
+
:is_draft => false,
|
19
|
+
:layout => 'default',
|
20
|
+
:order => 0
|
21
|
+
}
|
6
22
|
|
7
23
|
def initialize
|
8
24
|
Nanoc.ensure_in_site
|
9
25
|
|
10
26
|
@config = DEFAULT_CONFIG.merge(YAML.load_file_and_clean('config.yaml'))
|
11
|
-
@global_page =
|
27
|
+
@global_page = PAGE_DEFAULTS.merge(YAML.load_file_and_clean('meta.yaml'))
|
12
28
|
end
|
13
29
|
|
14
30
|
def run
|
31
|
+
# Require all Ruby source files in lib/
|
15
32
|
Dir['lib/*.rb'].each { |f| require f }
|
16
33
|
|
34
|
+
# Copy assets to output directory
|
35
|
+
copy_assets
|
36
|
+
|
37
|
+
# Compile all pages
|
17
38
|
pages = compile_pages(uncompiled_pages)
|
39
|
+
|
40
|
+
# Put pages in their layouts
|
18
41
|
pages.each do |page|
|
19
|
-
|
42
|
+
# Prepare layout content
|
43
|
+
content = nil
|
44
|
+
context = { :page => page.merge(:_content_filename => nil), :pages => pages }
|
45
|
+
layout = layout_for_page(page)
|
46
|
+
begin
|
47
|
+
case layout[:type]
|
48
|
+
when :eruby
|
49
|
+
content = layout[:content].eruby(context)
|
50
|
+
when :haml
|
51
|
+
content = layout[:content].haml(context)
|
52
|
+
when :markaby
|
53
|
+
content = layout[:content].markaby(context)
|
54
|
+
when :liquid
|
55
|
+
content = layout[:content].liquid(context)
|
56
|
+
end
|
57
|
+
rescue => exception
|
58
|
+
$stderr.puts "Exception occured while layouting page" +
|
59
|
+
"'#{page[:_content_filename]}' in layout '#{page[:layout]}':" unless $quiet
|
60
|
+
$stderr.puts exception unless $quiet
|
61
|
+
$stderr.puts exception.backtrace.join("\n") unless $quiet
|
62
|
+
exit
|
63
|
+
end
|
64
|
+
|
65
|
+
# Write page with layout
|
20
66
|
FileManager.create_file(path_for_page(page)) { content }
|
21
67
|
end
|
22
68
|
end
|
23
69
|
|
24
70
|
private
|
25
71
|
|
72
|
+
# Copies the contents of the assets directory into the output directory
|
73
|
+
def copy_assets
|
74
|
+
Dir['assets/*'].each { |f| FileUtils.remove_entry_secure(f.sub('assets/', 'output/'), true) }
|
75
|
+
FileUtils.cp_r(Dir['assets/*'], 'output') if File.directory?('assets') and !Dir['assets/*'].empty?
|
76
|
+
end
|
77
|
+
|
78
|
+
# Returns a list of uncompiled pages
|
26
79
|
def uncompiled_pages
|
27
|
-
|
80
|
+
# Read all meta files
|
81
|
+
pages = Dir['content/**/meta.yaml'].collect do |filename|
|
82
|
+
# Read the meta file
|
28
83
|
page = @global_page.merge(YAML.load_file_and_clean(filename))
|
84
|
+
|
85
|
+
# Fix the path
|
29
86
|
page[:path] = filename.sub(/^content/, '').sub('meta.yaml', '')
|
30
87
|
|
88
|
+
# Get the content filename
|
31
89
|
content_filenames = Dir[filename.sub('meta.yaml', File.basename(File.dirname(filename)) + '.*')].reject { |f| f =~ /~$/ }
|
32
90
|
content_filenames += Dir["#{File.dirname(filename)}/index.*"] # fallback for nanoc 1.0
|
33
91
|
content_filenames.ensure_single('content files', File.dirname(filename))
|
34
92
|
page[:_content_filename] = content_filenames[0]
|
35
93
|
|
36
94
|
page
|
37
|
-
end
|
38
|
-
|
95
|
+
end
|
96
|
+
|
97
|
+
# Ignore drafts
|
98
|
+
pages.reject! { |page| page[:is_draft] }
|
99
|
+
|
100
|
+
# Sort pages by order and by path
|
101
|
+
pages.sort! do |x,y|
|
102
|
+
if x[:order].to_i == y[:order].to_i
|
103
|
+
x[:path] <=> y[:path]
|
104
|
+
else
|
105
|
+
x[:order].to_i <=> y[:order].to_i
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
pages
|
110
|
+
end
|
111
|
+
|
112
|
+
# Returns the layout for the given page
|
113
|
+
def layout_for_page(a_page)
|
114
|
+
if a_page[:layout].nil?
|
115
|
+
{ :type => :eruby, :content => "<%= @page[:content] %>" }
|
116
|
+
else
|
117
|
+
filenames = Dir["layouts/#{a_page[:layout]}.*"]
|
118
|
+
filenames.ensure_single('layout files', a_page[:layout])
|
119
|
+
filename = filenames[0]
|
120
|
+
|
121
|
+
{ :type => FILE_TYPES[File.extname(filename)], :content => File.read(filename) }
|
39
122
|
end
|
40
123
|
end
|
41
124
|
|
125
|
+
# Returns the path for the given page
|
42
126
|
def path_for_page(a_page)
|
43
|
-
|
127
|
+
if a_page[:custom_path].nil?
|
128
|
+
@config[:output_dir] + a_page[:path] + 'index.' + a_page[:extension]
|
129
|
+
else
|
130
|
+
@config[:output_dir] + a_page[:custom_path]
|
131
|
+
end
|
44
132
|
end
|
45
133
|
|
134
|
+
# Compiles the given pages and returns the compiled pages
|
46
135
|
def compile_pages(a_pages)
|
47
136
|
a_pages.inject([]) do |pages, page|
|
48
|
-
|
49
|
-
|
137
|
+
# Read page
|
138
|
+
content = File.read(page[:_content_filename])
|
139
|
+
|
140
|
+
# Filter page
|
141
|
+
begin
|
142
|
+
content = content.filter(page[:filters], :assigns => { :page => Page.new(page), :pages => pages })
|
143
|
+
rescue Exception => exception
|
144
|
+
$stderr.puts "Exception occured while compiling page" +
|
145
|
+
"'#{page[:_content_filename]}':" unless $quiet
|
146
|
+
$stderr.puts exception unless $quiet
|
147
|
+
$stderr.puts exception.backtrace.join("\n") unless $quiet
|
148
|
+
exit
|
149
|
+
end
|
150
|
+
|
151
|
+
# Create compiled page
|
152
|
+
compiled_page = page.merge( :content => content )
|
153
|
+
|
154
|
+
# Remember page
|
155
|
+
pages + [ Page.new(compiled_page) ]
|
50
156
|
end
|
51
157
|
end
|
52
158
|
|
data/lib/creator.rb
CHANGED
data/lib/enhancements.rb
CHANGED
@@ -1,18 +1,24 @@
|
|
1
1
|
def try_require(s) ; begin ; require s ; rescue LoadError ; end ; end
|
2
2
|
|
3
3
|
try_require 'rubygems'
|
4
|
-
try_require 'bluecloth'
|
5
|
-
try_require 'rubypants'
|
6
4
|
|
7
5
|
require 'erubis'
|
8
6
|
require 'fileutils'
|
9
7
|
require 'yaml'
|
10
8
|
|
9
|
+
try_require 'bluecloth'
|
10
|
+
try_require 'rubypants'
|
11
|
+
try_require 'markaby'
|
12
|
+
try_require 'liquid'
|
13
|
+
try_require 'haml'
|
14
|
+
try_require 'rdoc/markup/simple_markup'
|
15
|
+
try_require 'rdoc/markup/simple_markup/to_html'
|
16
|
+
|
11
17
|
class Array
|
12
18
|
# Ensures that the array contains only one element
|
13
19
|
def ensure_single(a_noun, a_context)
|
14
20
|
if self.size != 1
|
15
|
-
$stderr.puts "ERROR: expected 1 #{a_noun}, found #{self.size} (#{a_context})" unless $quiet
|
21
|
+
$stderr.puts "ERROR: expected 1 #{a_noun}, found #{self.size} (#{a_context})" unless $quiet
|
16
22
|
exit
|
17
23
|
end
|
18
24
|
end
|
@@ -46,6 +52,13 @@ class Hash
|
|
46
52
|
hash
|
47
53
|
end
|
48
54
|
end
|
55
|
+
|
56
|
+
def stringify_keys
|
57
|
+
inject({}) do |hash, (key, value)|
|
58
|
+
hash[key.to_s] = value
|
59
|
+
hash
|
60
|
+
end
|
61
|
+
end
|
49
62
|
end
|
50
63
|
|
51
64
|
class String
|
@@ -54,47 +67,134 @@ class String
|
|
54
67
|
def filter(a_filters, a_params={})
|
55
68
|
a_filters.inject(self) do |result, filter|
|
56
69
|
case filter
|
70
|
+
when 'eruby'
|
71
|
+
result.replace(result.eruby(a_params[:assigns]))
|
72
|
+
when 'haml'
|
73
|
+
result.replace(result.haml(a_params[:assigns]))
|
74
|
+
when 'liquid'
|
75
|
+
result.replace(result.liquid(a_params[:assigns]))
|
76
|
+
when 'markaby'
|
77
|
+
result.replace(result.markaby(a_params[:assigns]))
|
57
78
|
when 'markdown'
|
58
79
|
result.replace(result.markdown)
|
80
|
+
when 'rdoc'
|
81
|
+
result.replace(result.rdoc)
|
59
82
|
when 'smartypants'
|
60
83
|
result.replace(result.smartypants)
|
61
|
-
when 'eruby'
|
62
|
-
result.replace(result.eruby(a_params[:eruby_context]))
|
63
84
|
end
|
64
85
|
end
|
65
86
|
end
|
66
87
|
|
67
|
-
# Converts the string
|
88
|
+
# Converts the string using eRuby.
|
89
|
+
def eruby(a_assigns={})
|
90
|
+
Erubis::Eruby.new(self).evaluate(a_assigns)
|
91
|
+
end
|
92
|
+
|
93
|
+
# Converts the string using Haml
|
94
|
+
def haml(a_assigns={})
|
95
|
+
Haml::Engine.new(self, :locals => a_assigns).to_html
|
96
|
+
rescue NameError
|
97
|
+
$stderr.puts 'ERROR: String#haml failed (Haml not installed?)' unless $quiet
|
98
|
+
exit
|
99
|
+
end
|
100
|
+
|
101
|
+
# Converts the string using Liquid
|
102
|
+
def liquid(a_assigns={})
|
103
|
+
Liquid::Template.parse(self).render(a_assigns.stringify_keys)
|
104
|
+
rescue NameError
|
105
|
+
$stderr.puts 'ERROR: String#liquid failed (Liquid not installed?)' unless $quiet
|
106
|
+
exit
|
107
|
+
end
|
108
|
+
|
109
|
+
# Converts the string using Markaby
|
110
|
+
# TODO perhaps add support for helpers
|
111
|
+
def markaby(a_assigns={})
|
112
|
+
Markaby::Builder.new(a_assigns).instance_eval(self).to_s
|
113
|
+
rescue NameError
|
114
|
+
$stderr.puts 'ERROR: String#markaby failed (Markaby not installed?)' unless $quiet
|
115
|
+
exit
|
116
|
+
end
|
117
|
+
|
118
|
+
# Converts the string to HTML using BlueCloth/Markdown.
|
68
119
|
def markdown
|
69
|
-
BlueCloth
|
120
|
+
BlueCloth.new(self).to_html
|
70
121
|
rescue NameError
|
71
|
-
$stderr.puts 'ERROR: String#markdown failed: BlueCloth not installed' unless $quiet
|
122
|
+
$stderr.puts 'ERROR: String#markdown failed: BlueCloth not installed' unless $quiet
|
72
123
|
exit
|
73
124
|
end
|
74
125
|
|
75
|
-
#
|
126
|
+
# Converts the string using RDoc
|
127
|
+
def rdoc
|
128
|
+
SM::SimpleMarkup.new.convert(self, SM::ToHtml.new)
|
129
|
+
end
|
130
|
+
|
131
|
+
# Converts the string using RedCloth/Textile
|
132
|
+
def textile
|
133
|
+
RedCloth.new(self).to_html
|
134
|
+
rescue NameError
|
135
|
+
$stderr.puts 'ERROR: String#textile failed (RedCloth not installed?)' unless $quiet
|
136
|
+
exit
|
137
|
+
end
|
138
|
+
|
139
|
+
# Converts the string using RubyPants/SmartyPants
|
76
140
|
def smartypants
|
77
|
-
RubyPants
|
141
|
+
RubyPants.new(self).to_html
|
78
142
|
rescue NameError
|
79
|
-
$stderr.puts 'ERROR: String#smartypants failed
|
143
|
+
$stderr.puts 'ERROR: String#smartypants failed (RubyPants not installed?)' unless $quiet
|
80
144
|
exit
|
81
145
|
end
|
146
|
+
end
|
147
|
+
|
148
|
+
class FileLogger
|
149
|
+
COLORS = {
|
150
|
+
:reset => "\e[0m",
|
151
|
+
|
152
|
+
:bold => "\e[1m",
|
153
|
+
|
154
|
+
:black => "\e[30m",
|
155
|
+
:red => "\e[31m",
|
156
|
+
:green => "\e[32m",
|
157
|
+
:yellow => "\e[33m",
|
158
|
+
:blue => "\e[34m",
|
159
|
+
:magenta => "\e[35m",
|
160
|
+
:cyan => "\e[36m",
|
161
|
+
:white => "\e[37m"
|
162
|
+
}
|
163
|
+
|
164
|
+
ACTION_COLORS = {
|
165
|
+
:create => COLORS[:bold] + COLORS[:green],
|
166
|
+
:update => COLORS[:bold] + COLORS[:yellow],
|
167
|
+
:move => COLORS[:bold] + COLORS[:blue],
|
168
|
+
:identical => COLORS[:bold]
|
169
|
+
}
|
170
|
+
|
171
|
+
attr_reader :out
|
172
|
+
|
173
|
+
def initialize(a_out = $stdout)
|
174
|
+
@out = a_out
|
175
|
+
end
|
82
176
|
|
83
|
-
|
84
|
-
|
85
|
-
|
177
|
+
def log(a_action, a_path)
|
178
|
+
@out.puts('%s%12s%s %s' % [ACTION_COLORS[a_action.to_sym], a_action, COLORS[:reset], a_path]) unless $quiet
|
179
|
+
end
|
180
|
+
|
181
|
+
private
|
182
|
+
|
183
|
+
def method_missing(a_method, *a_args)
|
184
|
+
log(a_method.to_s, a_args.first)
|
86
185
|
end
|
87
186
|
end
|
88
187
|
|
89
188
|
class FileManager
|
90
189
|
@@stack = []
|
190
|
+
@@logger = FileLogger.new
|
91
191
|
|
92
192
|
def self.create_dir(a_name)
|
93
193
|
@@stack.push(a_name)
|
94
194
|
path = File.join(@@stack)
|
95
195
|
unless File.directory?(path)
|
96
196
|
FileUtils.mkdir_p(path)
|
97
|
-
|
197
|
+
@@logger.create(path)
|
98
198
|
end
|
99
199
|
yield if block_given?
|
100
200
|
@@stack.pop
|
@@ -104,35 +204,19 @@ class FileManager
|
|
104
204
|
path = File.join(@@stack + [ a_name ])
|
105
205
|
FileManager.create_dir(path.sub(/\/[^\/]+$/, '')) if @@stack.empty?
|
106
206
|
content = block_given? ? yield : nil
|
107
|
-
File.exist?(path)
|
207
|
+
if File.exist?(path)
|
208
|
+
if block_given? and File.read(path) == content
|
209
|
+
@@logger.identical(path)
|
210
|
+
else
|
211
|
+
@@logger.update(path)
|
212
|
+
end
|
213
|
+
else
|
214
|
+
@@logger.create(path)
|
215
|
+
end
|
108
216
|
open(path, 'w') { |io| io.write(content) unless content.nil? }
|
109
217
|
end
|
110
218
|
end
|
111
219
|
|
112
|
-
COLORS = {
|
113
|
-
:reset => "\e[0m",
|
114
|
-
|
115
|
-
:bold => "\e[1m",
|
116
|
-
|
117
|
-
:black => "\e[30m",
|
118
|
-
:red => "\e[31m",
|
119
|
-
:green => "\e[32m",
|
120
|
-
:yellow => "\e[33m",
|
121
|
-
:blue => "\e[34m",
|
122
|
-
:magenta => "\e[35m",
|
123
|
-
:cyan => "\e[36m",
|
124
|
-
:white => "\e[37m"
|
125
|
-
}
|
126
|
-
ACTION_COLORS = {
|
127
|
-
:create => COLORS[:bold] + COLORS[:green],
|
128
|
-
:update => COLORS[:bold] + COLORS[:yellow],
|
129
|
-
:identical => COLORS[:bold]
|
130
|
-
}
|
131
|
-
|
132
|
-
def log(a_action, a_path)
|
133
|
-
puts format('%s%12s%s %s', ACTION_COLORS[a_action.to_sym], a_action, COLORS[:reset], a_path) unless $quiet == true
|
134
|
-
end
|
135
|
-
|
136
220
|
def render(a_name, a_context={})
|
137
|
-
File.read('layouts/' + a_name + '.erb').eruby(a_context.merge({ :page => @page, :pages => @pages }))
|
221
|
+
File.read('layouts/' + a_name.to_s + '.erb').eruby(a_context.merge({ :page => @page, :pages => @pages }))
|
138
222
|
end
|
data/lib/nanoc.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
module Nanoc
|
2
|
-
VERSION = '1.
|
2
|
+
VERSION = '1.2'
|
3
3
|
|
4
4
|
def self.ensure_in_site
|
5
5
|
unless in_site?
|
6
|
-
$stderr.puts 'ERROR: The current working directory does not seem to
|
6
|
+
$stderr.puts 'ERROR: The current working directory does not seem to ' +
|
7
|
+
'be a valid/complete nanoc site directory; aborting.' unless $quiet
|
7
8
|
exit
|
8
9
|
end
|
9
10
|
end
|
@@ -17,7 +18,6 @@ module Nanoc
|
|
17
18
|
return false unless File.directory?('output')
|
18
19
|
return false unless File.directory?('tasks')
|
19
20
|
return false unless File.directory?('templates')
|
20
|
-
|
21
21
|
return false unless File.exist?('config.yaml')
|
22
22
|
return false unless File.exist?('meta.yaml')
|
23
23
|
return false unless File.exist?('Rakefile')
|
@@ -26,6 +26,7 @@ module Nanoc
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
require File.dirname(__FILE__) + '/page.rb'
|
29
30
|
require File.dirname(__FILE__) + '/creator.rb'
|
30
31
|
require File.dirname(__FILE__) + '/compiler.rb'
|
31
32
|
require File.dirname(__FILE__) + '/enhancements.rb'
|
data/lib/page.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Nanoc
|
2
|
+
class Page
|
3
|
+
|
4
|
+
def initialize(a_hash={})
|
5
|
+
@attributes = a_hash
|
6
|
+
end
|
7
|
+
|
8
|
+
def [](a_key)
|
9
|
+
@attributes[a_key]
|
10
|
+
end
|
11
|
+
|
12
|
+
def []=(a_key, a_value)
|
13
|
+
@attributes[a_key] = a_value
|
14
|
+
end
|
15
|
+
|
16
|
+
def merge(a_other)
|
17
|
+
@attributes.merge(a_other.to_hash)
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_hash
|
22
|
+
@attributes
|
23
|
+
end
|
24
|
+
|
25
|
+
def method_missing(a_method, *a_args)
|
26
|
+
@attributes[a_method.to_sym]
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: nanoc
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.
|
7
|
-
date: 2007-05
|
6
|
+
version: "1.2"
|
7
|
+
date: 2007-06-05 00:00:00 +02:00
|
8
8
|
summary: a CMS that doesn't run on your server
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -31,12 +31,14 @@ authors: []
|
|
31
31
|
files:
|
32
32
|
- README
|
33
33
|
- LICENSE
|
34
|
+
- ChangeLog
|
34
35
|
- Rakefile
|
35
36
|
- bin/nanoc
|
36
37
|
- lib/compiler.rb
|
37
38
|
- lib/creator.rb
|
38
39
|
- lib/enhancements.rb
|
39
40
|
- lib/nanoc.rb
|
41
|
+
- lib/page.rb
|
40
42
|
test_files: []
|
41
43
|
|
42
44
|
rdoc_options: []
|