nanoc 1.4 → 1.5

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -3,13 +3,13 @@ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: nanoc
5
5
  version: !ruby/object:Gem::Version
6
- version: "1.4"
7
- date: 2007-07-06 00:00:00 +02:00
6
+ version: "1.5"
7
+ date: 2007-09-10 00:00:00 +02:00
8
8
  summary: a CMS that doesn't run on your server
9
9
  require_paths:
10
10
  - lib
11
11
  email: denis.defreyne@stoneship.org
12
- homepage: http://stoneship.org/software/nanoc
12
+ homepage: http://nanoc.stoneship.org/
13
13
  rubyforge_project:
14
14
  description: a CMS that doesn't run on your server
15
15
  autorequire:
@@ -34,11 +34,29 @@ files:
34
34
  - ChangeLog
35
35
  - Rakefile
36
36
  - bin/nanoc
37
- - lib/compiler.rb
38
- - lib/creator.rb
39
- - lib/enhancements.rb
37
+ - lib/nanoc
38
+ - lib/nanoc/compiler.rb
39
+ - lib/nanoc/core_ext
40
+ - lib/nanoc/core_ext/array.rb
41
+ - lib/nanoc/core_ext/hash.rb
42
+ - lib/nanoc/core_ext/string.rb
43
+ - lib/nanoc/core_ext/yaml.rb
44
+ - lib/nanoc/core_ext.rb
45
+ - lib/nanoc/creator.rb
46
+ - lib/nanoc/enhancements.rb
47
+ - lib/nanoc/filters
48
+ - lib/nanoc/filters/eruby_filter.rb
49
+ - lib/nanoc/filters/haml_filter.rb
50
+ - lib/nanoc/filters/liquid_filter.rb
51
+ - lib/nanoc/filters/markaby_filter.rb
52
+ - lib/nanoc/filters/markdown_filter.rb
53
+ - lib/nanoc/filters/rdoc_filter.rb
54
+ - lib/nanoc/filters/sass_filter.rb
55
+ - lib/nanoc/filters/smartypants_filter.rb
56
+ - lib/nanoc/filters/textile_filter.rb
57
+ - lib/nanoc/filters.rb
58
+ - lib/nanoc/page.rb
40
59
  - lib/nanoc.rb
41
- - lib/page.rb
42
60
  test_files: []
43
61
 
44
62
  rdoc_options: []
data/lib/enhancements.rb DELETED
@@ -1,277 +0,0 @@
1
- def try_require(s) ; begin ; require s ; rescue LoadError ; end ; end
2
-
3
- try_require 'rubygems'
4
-
5
- require 'erb'
6
- require 'fileutils'
7
- require 'yaml'
8
-
9
- try_require 'bluecloth'
10
- try_require 'erubis'
11
- try_require 'redcloth'
12
- try_require 'rubypants'
13
- try_require 'markaby'
14
- try_require 'liquid'
15
- try_require 'haml'
16
- try_require 'rdoc/markup/simple_markup'
17
- try_require 'rdoc/markup/simple_markup/to_html'
18
-
19
- def handle_exception(exception, text)
20
- unless $quiet or exception.class == SystemExit
21
- $stderr.puts "ERROR: Exception occured while #{text}:\n"
22
- $stderr.puts exception
23
- $stderr.puts exception.backtrace.join("\n")
24
- end
25
- exit
26
- end
27
-
28
- class Array
29
- # Ensures that the array contains only one element
30
- def ensure_single(a_noun, a_context)
31
- if self.size != 1
32
- $stderr.puts "ERROR: expected 1 #{a_noun}, found #{self.size} (#{a_context})" unless $quiet
33
- exit
34
- end
35
- end
36
- end
37
-
38
- module YAML
39
- # Returns the contents of an entire file interpreted as YAML and cleaned
40
- def self.load_file_and_clean(a_filename)
41
- (YAML.load_file(a_filename) || {}).clean
42
- end
43
- end
44
-
45
- class Hash
46
- # Converts all keys to symbols, and converts *_at and *_on
47
- # keys to Times and Dates, respectively
48
- def clean
49
- inject({}) do |hash, (key, value)|
50
- if key =~ /_on$/
51
- hash[key.to_sym] = Date.parse(value)
52
- elsif key =~ /_at$/
53
- hash[key.to_sym] = Time.parse(value)
54
- elsif value == 'true'
55
- hash[key.to_sym] = true
56
- elsif value == 'false'
57
- hash[key.to_sym] = false
58
- elsif value == 'none'
59
- hash[key.to_sym] = nil
60
- else
61
- hash[key.to_sym] = value
62
- end
63
- hash
64
- end
65
- end
66
-
67
- def symbolize_keys
68
- inject({}) do |hash, (key, value)|
69
- hash[key.intern] = value
70
- hash
71
- end
72
- end
73
-
74
- def stringify_keys
75
- inject({}) do |hash, (key, value)|
76
- hash[key.to_s] = value
77
- hash
78
- end
79
- end
80
- end
81
-
82
- class ERBContext
83
- def initialize(hash)
84
- hash.each_pair do |key, value|
85
- instance_variable_set('@' + key.to_s, value)
86
- end
87
- end
88
-
89
- def get_binding
90
- binding
91
- end
92
- end
93
-
94
- class String
95
- # Runs the string through the filters as given by the array of
96
- # filter names. Available filters include 'markdown', 'smartypants' and 'eruby'.
97
- def filter(a_filters, a_params={})
98
- assigns = a_params[:assigns]
99
- a_filters.inject(self) do |result, filter|
100
- case filter
101
- when 'eruby'
102
- result.replace(result.eruby(:assigns => assigns))
103
- when 'haml'
104
- result.replace(result.haml(:assigns => assigns))
105
- when 'liquid'
106
- result.replace(result.liquid(:assigns => assigns))
107
- when 'markaby'
108
- result.replace(result.markaby(:assigns => assigns))
109
- when 'markdown', 'bluecloth'
110
- result.replace(result.markdown)
111
- when 'rdoc'
112
- result.replace(result.rdoc)
113
- when 'sass'
114
- result.replace(result.sass)
115
- when 'smartypants', 'rubypants'
116
- result.replace(result.smartypants)
117
- when 'textile', 'redcloth'
118
- result.replace(result.textile)
119
- end
120
- end
121
- end
122
-
123
- # Converts the string using eRuby
124
- def eruby(a_params={})
125
- erubis(a_params)
126
- rescue NameError
127
- erb(a_params)
128
- end
129
-
130
- # Converts the string using Erubis
131
- def erubis(a_params={})
132
- Erubis::Eruby.new(self).evaluate(a_params[:assigns] || {})
133
- end
134
-
135
- # Converts the string using ERB
136
- def erb(a_params={})
137
- ERB.new(self).result(ERBContext.new(a_params[:assigns] || {}).get_binding)
138
- end
139
-
140
- # Converts the string using Haml
141
- def haml(a_params={})
142
- options = (a_params[:haml_options] || {})
143
- options[:locals] = a_params[:assigns] unless a_params[:assigns].nil?
144
- Haml::Engine.new(self, options).to_html
145
- rescue NameError
146
- $stderr.puts 'ERROR: String#haml failed (Haml not installed?)' unless $quiet
147
- exit
148
- end
149
-
150
- # Converts the string using Liquid
151
- def liquid(a_params={})
152
- Liquid::Template.parse(self).render((a_params[:assigns] || {}).stringify_keys)
153
- rescue NameError
154
- $stderr.puts 'ERROR: String#liquid failed (Liquid not installed?)' unless $quiet
155
- exit
156
- end
157
-
158
- # Converts the string using Markaby
159
- # TODO perhaps add support for helpers
160
- def markaby(a_params={})
161
- Markaby::Builder.new((a_params[:assigns] || {})).instance_eval(self).to_s
162
- rescue NameError
163
- $stderr.puts 'ERROR: String#markaby failed (Markaby not installed?)' unless $quiet
164
- exit
165
- end
166
-
167
- # Converts the string to HTML using BlueCloth/Markdown.
168
- def markdown
169
- BlueCloth.new(self).to_html
170
- rescue NameError
171
- $stderr.puts 'ERROR: String#markdown failed: BlueCloth not installed' unless $quiet
172
- exit
173
- end
174
-
175
- # Converts the string using RDoc
176
- def rdoc
177
- SM::SimpleMarkup.new.convert(self, SM::ToHtml.new)
178
- end
179
-
180
- # Converts the string using Sass
181
- def sass
182
- Sass::Engine.new(self).render
183
- end
184
-
185
- # Converts the string using RedCloth/Textile
186
- def textile
187
- RedCloth.new(self).to_html
188
- rescue NameError
189
- $stderr.puts 'ERROR: String#textile failed (RedCloth not installed?)' unless $quiet
190
- exit
191
- end
192
-
193
- # Converts the string using RubyPants/SmartyPants
194
- def smartypants
195
- RubyPants.new(self).to_html
196
- rescue NameError
197
- $stderr.puts 'ERROR: String#smartypants failed (RubyPants not installed?)' unless $quiet
198
- exit
199
- end
200
- end
201
-
202
- class FileLogger
203
- COLORS = {
204
- :reset => "\e[0m",
205
-
206
- :bold => "\e[1m",
207
-
208
- :black => "\e[30m",
209
- :red => "\e[31m",
210
- :green => "\e[32m",
211
- :yellow => "\e[33m",
212
- :blue => "\e[34m",
213
- :magenta => "\e[35m",
214
- :cyan => "\e[36m",
215
- :white => "\e[37m"
216
- }
217
-
218
- ACTION_COLORS = {
219
- :create => COLORS[:bold] + COLORS[:green],
220
- :update => COLORS[:bold] + COLORS[:yellow],
221
- :move => COLORS[:bold] + COLORS[:blue],
222
- :identical => COLORS[:bold]
223
- }
224
-
225
- attr_reader :out
226
-
227
- def initialize(a_out = $stdout)
228
- @out = a_out
229
- end
230
-
231
- def log(a_action, a_path)
232
- @out.puts('%s%12s%s %s' % [ACTION_COLORS[a_action.to_sym], a_action, COLORS[:reset], a_path]) unless $quiet
233
- end
234
-
235
- private
236
-
237
- def method_missing(a_method, *a_args)
238
- log(a_method.to_s, a_args.first)
239
- end
240
- end
241
-
242
- class FileManager
243
- @@stack = []
244
- @@logger = FileLogger.new
245
-
246
- def self.create_dir(a_name)
247
- @@stack.push(a_name)
248
- path = File.join(@@stack)
249
- unless File.directory?(path)
250
- FileUtils.mkdir_p(path)
251
- @@logger.create(path)
252
- end
253
- yield if block_given?
254
- @@stack.pop
255
- end
256
-
257
- def self.create_file(a_name)
258
- path = File.join(@@stack + [ a_name ])
259
- FileManager.create_dir(path.sub(/\/[^\/]+$/, '')) if @@stack.empty?
260
- content = block_given? ? yield : nil
261
- if File.exist?(path)
262
- if block_given? and File.read(path) == content
263
- @@logger.identical(path)
264
- else
265
- @@logger.update(path)
266
- end
267
- else
268
- @@logger.create(path)
269
- end
270
- open(path, 'w') { |io| io.write(content) unless content.nil? }
271
- end
272
- end
273
-
274
- def render(a_name, a_context={})
275
- assigns = a_context.merge({ :page => @page, :pages => @pages })
276
- File.read('layouts/' + a_name.to_s + '.erb').eruby(:assigns => assigns)
277
- end
data/lib/page.rb DELETED
@@ -1,91 +0,0 @@
1
- module Nanoc
2
- class Page
3
-
4
- @@compilation_stack = []
5
-
6
- def initialize(hash={})
7
- @attributes = hash
8
- end
9
-
10
- def merge(other)
11
- @attributes.merge(other.to_hash)
12
- self
13
- end
14
-
15
- def to_hash
16
- @attributes
17
- end
18
-
19
- # Accessing data
20
-
21
- def [](key)
22
- @attributes[key]
23
- end
24
-
25
- def []=(key, value)
26
- @attributes[key] = value
27
- end
28
-
29
- def method_missing(method, *args)
30
- @attributes[method.to_sym]
31
- end
32
-
33
- def content
34
- compile!
35
- @attributes[:content]
36
- end
37
-
38
- # Compiling
39
-
40
- def self.compile(pages)
41
- @@pages = pages
42
-
43
- # Compile all pages
44
- pages.each do |page|
45
- page.compile!
46
- end
47
- end
48
-
49
- def compile!
50
- # Check for recursive call
51
- if @@compilation_stack.include?(self)
52
- # Print compilation stack
53
- unless $quiet
54
- $stderr.puts 'ERROR: Recursive call to page content. Page compilation stack:'
55
-
56
- # Determine relevant part of compilation stack
57
- stack_begin = @@compilation_stack.index(self)
58
- stack_end = @@compilation_stack.size
59
- relevant_stack_part = @@compilation_stack.last(stack_end - stack_begin)
60
-
61
- # Print relevant part of compilation stack
62
- relevant_stack_part.each_with_index do |page, i|
63
- $stderr.puts "#{i} #{page._content_filename}"
64
- end
65
- end
66
- exit
67
- # Compile if not yet compiled
68
- elsif self[:content].nil?
69
- # Add to stack
70
- @@compilation_stack.push(self)
71
-
72
- # Read page
73
- content = File.read(self._content_filename)
74
-
75
- # Compile page
76
- begin
77
- assigns = { :page => self, :pages => @@pages }
78
- # TODO set more custom options
79
- params = { :assigns => assigns }
80
- params[:haml_options] = (self[:haml_options] || {}).symbolize_keys
81
- content = content.filter(self.filters, params)
82
- rescue Exception => exception
83
- handle_exception(exception, "compiling page '#{self[:_content_filename]}'")
84
- end
85
- @attributes[:content] = content
86
- @@compilation_stack.pop
87
- end
88
- end
89
-
90
- end
91
- end