homeostasis 0.0.10 → 0.0.11
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/README.md +16 -10
- data/lib/homeostasis.rb +126 -34
- metadata +1 -1
data/README.md
CHANGED
@@ -56,7 +56,7 @@ In your controller:
|
|
56
56
|
|
57
57
|
Homeostasis::Blog.directory('blog') # directory of posts
|
58
58
|
|
59
|
-
Post files should be in the format `yyyy-mm-dd-permalink.html.
|
59
|
+
Post files should be in the format `yyyy-mm-dd-permalink.html.md`. Use
|
60
60
|
YAML front-matter for any metadata you want. `:date` and `:path` will be
|
61
61
|
added automatically for you.
|
62
62
|
|
@@ -115,7 +115,21 @@ Sitemap
|
|
115
115
|
A sitemap will automatically be generated in `public/sitemap.xml`. You'll need
|
116
116
|
to set the root URL for this to happen:
|
117
117
|
|
118
|
-
Homeostasis.
|
118
|
+
Homeostasis::Sitemap.url 'http://example.com'
|
119
|
+
|
120
|
+
`loc` and `lastmod` will be generated for each page. Use front-yaml to set the
|
121
|
+
`changefreq` or `priority`:
|
122
|
+
|
123
|
+
<!--
|
124
|
+
:changefreq: monthly
|
125
|
+
:priority: 0.9
|
126
|
+
-->
|
127
|
+
|
128
|
+
Use the key `private` to avoid generating an entry:
|
129
|
+
|
130
|
+
<!--
|
131
|
+
:private: true
|
132
|
+
-->
|
119
133
|
|
120
134
|
Trailing Slash
|
121
135
|
==============
|
@@ -136,14 +150,6 @@ You'll get:
|
|
136
150
|
This works well with an `htaccess` file that automatically appends trailing
|
137
151
|
slashes to URLs.
|
138
152
|
|
139
|
-
TODO
|
140
|
-
====
|
141
|
-
|
142
|
-
* use Dir.glob with relative paths
|
143
|
-
* add tests/coverage
|
144
|
-
* RSS generation
|
145
|
-
* sitemap generation
|
146
|
-
|
147
153
|
License
|
148
154
|
=======
|
149
155
|
|
data/lib/homeostasis.rb
CHANGED
@@ -1,12 +1,36 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'stasis'
|
3
3
|
require 'digest/sha1'
|
4
|
+
require 'bluecloth'
|
4
5
|
require 'yaml'
|
6
|
+
require 'cgi'
|
5
7
|
|
6
8
|
module Homeostasis
|
7
|
-
VERSION = '0.0.
|
9
|
+
VERSION = '0.0.11'
|
10
|
+
|
11
|
+
module Helpers
|
12
|
+
private
|
13
|
+
def ignore?(path)
|
14
|
+
@ignore_paths ||= @stasis.plugins.
|
15
|
+
find { |plugin| plugin.class == Stasis::Ignore }.
|
16
|
+
instance_variable_get(:@ignore)
|
17
|
+
|
18
|
+
matches = _match_key?(@ignore_paths, path)
|
19
|
+
matches.each do |group|
|
20
|
+
group.each do |group_path|
|
21
|
+
return true if _within?(group_path)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
false
|
25
|
+
end
|
26
|
+
|
27
|
+
def h(html)
|
28
|
+
CGI::escapeHTML(html)
|
29
|
+
end
|
30
|
+
end
|
8
31
|
|
9
32
|
class Asset < Stasis::Plugin
|
33
|
+
include Helpers
|
10
34
|
before_all :before_all
|
11
35
|
after_all :after_all
|
12
36
|
|
@@ -117,22 +141,10 @@ module Homeostasis
|
|
117
141
|
end
|
118
142
|
|
119
143
|
private
|
120
|
-
def ignore?(path)
|
121
|
-
@ignore_paths ||= @stasis.plugins.
|
122
|
-
find { |plugin| plugin.class == Stasis::Ignore }.
|
123
|
-
instance_variable_get(:@ignore)
|
124
|
-
|
125
|
-
matches = _match_key?(@ignore_paths, path)
|
126
|
-
matches.each do |group|
|
127
|
-
group.each do |group_path|
|
128
|
-
return true if _within?(group_path)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
false
|
132
|
-
end
|
133
144
|
end
|
134
145
|
|
135
146
|
class Front < Stasis::Plugin
|
147
|
+
include Helpers
|
136
148
|
before_all :before_all
|
137
149
|
action_method :front
|
138
150
|
action_method :front_site
|
@@ -151,28 +163,32 @@ module Homeostasis
|
|
151
163
|
def before_all
|
152
164
|
@stasis.paths.each do |path|
|
153
165
|
next if path !~ /\.(#{@@matchers.keys.join('|')})$/
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
166
|
+
if (contents = File.read(path)) !~ @@matchers[File.extname(path)[1..-1]]
|
167
|
+
yaml = {}
|
168
|
+
else
|
169
|
+
lines, data, index = contents.split("\n"), "", 1
|
170
|
+
while index < lines.size
|
171
|
+
break if lines[index] !~ /^ /
|
172
|
+
data += lines[index] + "\n"
|
173
|
+
index += 1
|
174
|
+
end
|
175
|
+
begin
|
176
|
+
yaml = YAML.load(data)
|
177
|
+
rescue Psych::SyntaxError
|
178
|
+
yaml = {}
|
179
|
+
end
|
161
180
|
end
|
162
181
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
relative)
|
168
|
-
|
169
|
-
|
170
|
-
yaml = YAML.load(data)
|
182
|
+
# add special :path key for generated files
|
183
|
+
if !ignore?(path)
|
184
|
+
relative = path[(@stasis.root.length+1)..-1]
|
185
|
+
ext = Tilt.mappings.keys.find { |ext| File.extname(path)[1..-1] == ext }
|
186
|
+
dest = trailify((ext && File.extname(relative) == ".#{ext}") ?
|
187
|
+
relative[0..-1*ext.length-2] :
|
188
|
+
relative)
|
171
189
|
yaml[:path] = dest
|
172
|
-
@@front_site[front_key(path)] = yaml if yaml.is_a?(Hash)
|
173
|
-
rescue Psych::SyntaxError => error
|
174
|
-
@@front_site[front_key(path)] = {:path => dest}
|
175
190
|
end
|
191
|
+
@@front_site[front_key(path)] = yaml
|
176
192
|
end
|
177
193
|
end
|
178
194
|
|
@@ -229,7 +245,54 @@ module Homeostasis
|
|
229
245
|
end
|
230
246
|
end
|
231
247
|
|
248
|
+
class Sitemap < Stasis::Plugin
|
249
|
+
include Helpers
|
250
|
+
after_all :after_all
|
251
|
+
|
252
|
+
def initialize(stasis)
|
253
|
+
@stasis = stasis
|
254
|
+
@@url = nil
|
255
|
+
end
|
256
|
+
|
257
|
+
def self.url(url)
|
258
|
+
@@url = url
|
259
|
+
end
|
260
|
+
|
261
|
+
def after_all
|
262
|
+
return if @@url.nil?
|
263
|
+
xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
264
|
+
xml += "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n"
|
265
|
+
front_site = Homeostasis::Front._front_site
|
266
|
+
pages = front_site.keys.sort_by do |page|
|
267
|
+
depth = page.scan('/').length
|
268
|
+
depth -= 1 if page =~ /index\.html/
|
269
|
+
"#{depth}-#{page}"
|
270
|
+
end
|
271
|
+
pages.each do |page|
|
272
|
+
front = front_site[page]
|
273
|
+
filename = File.join(@stasis.root, page)
|
274
|
+
next if page !~ /\.html/ || front[:private] || front[:path].nil?
|
275
|
+
|
276
|
+
log = `git log -n1 #{filename} 2> /dev/null | grep "Date:"`
|
277
|
+
lastmod = log.length > 0 ?
|
278
|
+
Date.parse(log.split("\n")[0].split(":",2)[1].strip).strftime('%Y-%m-%d') :
|
279
|
+
nil
|
280
|
+
xml += " <url>\n"
|
281
|
+
xml += " <loc>#{h(@@url + front[:path])}</loc>\n" if front[:path]
|
282
|
+
xml += " <lastmod>#{h lastmod}</lastmod>\n" if lastmod
|
283
|
+
xml += " <changefreq>#{h front[:changefreq]}</changefreq>\n" if front[:changefreq]
|
284
|
+
xml += " <priority>#{h front[:priority]}</priority>\n" if front[:priority]
|
285
|
+
xml += " </url>\n"
|
286
|
+
end
|
287
|
+
xml += '</urlset>'
|
288
|
+
File.open(File.join(@stasis.destination, 'sitemap.xml'), 'w') do |f|
|
289
|
+
f.puts(xml)
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
232
294
|
class Blog < Stasis::Plugin
|
295
|
+
include Helpers
|
233
296
|
DATE_REGEX = /^(\d{4}-\d{2}-\d{2})-/
|
234
297
|
before_all :before_all
|
235
298
|
after_all :after_all
|
@@ -238,11 +301,17 @@ module Homeostasis
|
|
238
301
|
def initialize(stasis)
|
239
302
|
@stasis = stasis
|
240
303
|
@@directory = nil
|
304
|
+
@@link = nil
|
305
|
+
@@title = nil
|
306
|
+
@@desc = nil
|
241
307
|
@@posts = []
|
242
308
|
end
|
243
309
|
|
244
|
-
def self.
|
310
|
+
def self.config(directory, link, title, desc)
|
245
311
|
@@directory = directory
|
312
|
+
@@link = link
|
313
|
+
@@title = title
|
314
|
+
@@desc = desc
|
246
315
|
end
|
247
316
|
|
248
317
|
def before_all
|
@@ -254,6 +323,7 @@ module Homeostasis
|
|
254
323
|
post = front_site[filename.sub(@stasis.root, '')[1..-1]] || {}
|
255
324
|
post[:date] = Date.parse(date)
|
256
325
|
post[:path] = post[:path].sub("/#{@@directory}/#{date}-", "/#{@@directory}/")
|
326
|
+
post[:body] = BlueCloth.new(File.read(filename)).to_html if filename =~ /\.md$/
|
257
327
|
@@posts << post
|
258
328
|
end
|
259
329
|
@@posts = @@posts.sort_by { |post| post[:date] }.reverse
|
@@ -267,10 +337,31 @@ module Homeostasis
|
|
267
337
|
filename,
|
268
338
|
File.join(File.dirname(filename), base.sub(DATE_REGEX, '')))
|
269
339
|
end
|
340
|
+
url = h("#{@@link}/#{@@directory}/")
|
341
|
+
rss = "<?xml version=\"1.0\"?>\n"
|
342
|
+
rss += "<rss version=\"2.0\">\n"
|
343
|
+
rss += " <channel>\n"
|
344
|
+
rss += " <title>#{h @@title}</title>\n" if @@title
|
345
|
+
rss += " <link>#{h @@link}/</link>\n" if @@link
|
346
|
+
rss += " <description>#{h @@desc}</description>\n" if @@desc
|
347
|
+
rss += " <atom:link href=\"#{url}/\" rel=\"self\" type=\"application/rss+xml\" />\n"
|
348
|
+
blog_posts[0..5].each do |post|
|
349
|
+
rss += " <item>\n"
|
350
|
+
rss += " <title>#{h post[:title]}</title>\n"
|
351
|
+
rss += " <link>#{h(@@link + post[:path])}</link>\n"
|
352
|
+
rss += " <pubDate>#{post[:date].strftime('%m-%d-%Y %H:%M')}</pubDate>\n"
|
353
|
+
rss += " <description>#{h post[:body]}</description>\n"
|
354
|
+
rss += " </item>\n"
|
355
|
+
end
|
356
|
+
rss += " </channel>\n"
|
357
|
+
rss += "</rss>"
|
358
|
+
File.open(File.join(@stasis.destination, @@directory, 'rss.xml'), 'w') do |f|
|
359
|
+
f.puts(rss)
|
360
|
+
end
|
270
361
|
end
|
271
362
|
|
272
363
|
def blog_posts
|
273
|
-
raise 'Homeostasis::Blog#
|
364
|
+
raise 'Homeostasis::Blog#config never called' if @@directory.nil?
|
274
365
|
@@posts
|
275
366
|
end
|
276
367
|
end
|
@@ -280,5 +371,6 @@ if !ENV['HOMEOSTASIS_UNREGISTER']
|
|
280
371
|
Stasis.register(Homeostasis::Asset)
|
281
372
|
Stasis.register(Homeostasis::Front)
|
282
373
|
Stasis.register(Homeostasis::Trail)
|
374
|
+
Stasis.register(Homeostasis::Sitemap)
|
283
375
|
Stasis.register(Homeostasis::Blog)
|
284
376
|
end
|