henrik-jekyll 0.5.0 → 0.5.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/README.textile +96 -3
- data/bin/jekyll +16 -0
- data/lib/jekyll.rb +2 -1
- data/lib/jekyll/albino.rb +1 -1
- data/lib/jekyll/convertible.rb +19 -3
- data/lib/jekyll/filters.rb +30 -1
- data/lib/jekyll/haml_helpers.rb +15 -0
- data/lib/jekyll/post.rb +51 -4
- data/lib/jekyll/site.rb +67 -4
- data/lib/jekyll/tags/highlight.rb +15 -3
- metadata +4 -2
data/README.textile
CHANGED
@@ -53,6 +53,12 @@ filename is used to construct the URL in the generated site. The example post,
|
|
53
53
|
for instance, ends up at
|
54
54
|
<code>http://tom.preston-werner.com/2008/11/17/blogging-like-a-hacker.html</code>.
|
55
55
|
|
56
|
+
Jekyll also supports specifying the post time in the filename. The format is e.g.
|
57
|
+
'2009-04-13_23-45-my-post.html'. Note that the time is prefixed by an underscore,
|
58
|
+
not a dash, so post slugs starting with numbers won't be parsed incorrectly.
|
59
|
+
Times in the filename must be on a 24-hour clock. Times and dates are treated by
|
60
|
+
Jekyll as local time.
|
61
|
+
|
56
62
|
Categories for posts are derived from the directory structure the posts were
|
57
63
|
found within. A post that appears in the directory foo/bar/_posts is placed in
|
58
64
|
the categories 'foo' and 'bar'. By selecting posts from particular categories
|
@@ -135,6 +141,12 @@ use that to make your code blocks look pretty. To activate Pygments support
|
|
135
141
|
during the conversion:
|
136
142
|
|
137
143
|
$ jekyll --pygments
|
144
|
+
|
145
|
+
Highlighting a blog post can take a second or two, and with a lot of posts,
|
146
|
+
it adds up. You can tell Jekyll to cache pygments output in a directory for
|
147
|
+
faster re-rendering:
|
148
|
+
|
149
|
+
$ jekyll --pygments-cache [PATH]
|
138
150
|
|
139
151
|
h3. Markdown Processor
|
140
152
|
|
@@ -144,6 +156,26 @@ compilation), you must install it (gem install rdiscount) and then you can
|
|
144
156
|
have it used instead:
|
145
157
|
|
146
158
|
$ jekyll --rdiscount
|
159
|
+
|
160
|
+
h3. Sass
|
161
|
+
|
162
|
+
To transform all ".sass":http://github.com/nex3/haml/tree/master
|
163
|
+
files anywhere in your file tree to CSS (e.g. '/css/site.sass' will
|
164
|
+
generate '/css/site.css'):
|
165
|
+
|
166
|
+
$ jekyll --sass
|
167
|
+
|
168
|
+
h3. Haml
|
169
|
+
|
170
|
+
To transform ".haml":http://github.com/nex3/haml/tree/master files to HTML
|
171
|
+
(e.g. '/about.haml' will generate '/about.html'):
|
172
|
+
|
173
|
+
$ jekyll --haml
|
174
|
+
|
175
|
+
Note that files must have a YAML metadata block at the top to be converted,
|
176
|
+
and that Haml cannot currently be used for layouts -- only posts and pages.
|
177
|
+
|
178
|
+
Haml content is intentionally not filtered, so you can use any Ruby code.
|
147
179
|
|
148
180
|
h3. Local Server
|
149
181
|
|
@@ -173,6 +205,19 @@ date parts and post name will be made and an index.html will be placed in the
|
|
173
205
|
leaf directory resulting in URLs like 2008/11/17/blogging-like-a-hacker/.
|
174
206
|
|
175
207
|
$ jekyll --permalink [date|none|pretty]
|
208
|
+
|
209
|
+
h3. Permalink Date Format
|
210
|
+
|
211
|
+
By default, unless you set the --permalink option to 'none', permalinks begin
|
212
|
+
with the date in a 'YYYY/MM/DD' format.
|
213
|
+
|
214
|
+
To customize this format, pass --permalink-date a strftime type format string.
|
215
|
+
|
216
|
+
$ jekyll --permalink-date [format string]
|
217
|
+
|
218
|
+
For example, to use only the year and month in the slug:
|
219
|
+
|
220
|
+
$ jekyll --permalink-date %Y/%m
|
176
221
|
|
177
222
|
h2. Configuration File
|
178
223
|
|
@@ -211,12 +256,22 @@ Parameters set in a configuration file override the default values. Parameters
|
|
211
256
|
set using command line options override both the default values and those set
|
212
257
|
in a configuration file.
|
213
258
|
|
259
|
+
Additionally, you can set defaults for the post data blocks. For example, you
|
260
|
+
can set the default layout for posts, so you don't have to specify it in every
|
261
|
+
post:
|
262
|
+
|
263
|
+
post_defaults:
|
264
|
+
layout: post
|
265
|
+
|
266
|
+
Any values set in the actual post will override these defaults.
|
267
|
+
|
214
268
|
h2. Data
|
215
269
|
|
216
270
|
Jekyll traverses your site looking for files to process. Any files with YAML
|
217
271
|
front matter (see below) are subject to processing. For each of these files,
|
218
|
-
Jekyll makes a variety of data available to the pages via
|
219
|
-
templating system. The following is a reference of the
|
272
|
+
Jekyll makes a variety of data available to the pages via Haml (regular pages
|
273
|
+
only) or the Liquid templating system. The following is a reference of the
|
274
|
+
available data.
|
220
275
|
|
221
276
|
h3. Global
|
222
277
|
|
@@ -239,6 +294,21 @@ h3. Site
|
|
239
294
|
|
240
295
|
site.posts
|
241
296
|
A reverse chronological list of all Posts.
|
297
|
+
|
298
|
+
site.collated_posts
|
299
|
+
A nested hash by year, then month number, then day, then a list of Posts.
|
300
|
+
Suitable for post archives. You probably need to show these with Haml
|
301
|
+
since Liquid is too limited. For example:
|
302
|
+
- site.collated_posts.sort.reverse.each do |year,months|
|
303
|
+
%h2= year
|
304
|
+
- months.sort.reverse.each do |month,days|
|
305
|
+
%h3= Date::MONTHNAMES[month]
|
306
|
+
- days.sort.reverse.each do |day,posts|
|
307
|
+
%ol
|
308
|
+
- posts.each do |post|
|
309
|
+
%li
|
310
|
+
%strong= "#{day}:"
|
311
|
+
= link_to(h(post.title), post.url)
|
242
312
|
|
243
313
|
site.related_posts
|
244
314
|
If the page being processed is a Post, this contains a list of up to ten
|
@@ -249,6 +319,9 @@ h3. Site
|
|
249
319
|
site.categories.CATEGORY
|
250
320
|
The list of all Posts in category CATEGORY.
|
251
321
|
|
322
|
+
site.tags.TAG
|
323
|
+
The list of all Posts tagged TAG.
|
324
|
+
|
252
325
|
h3. Post
|
253
326
|
|
254
327
|
post.title
|
@@ -259,7 +332,7 @@ h3. Post
|
|
259
332
|
e.g. /2008/12/14/my-post.html
|
260
333
|
|
261
334
|
post.date
|
262
|
-
The Date assigned to the Post.
|
335
|
+
The Date (actually a Time object) assigned to the Post.
|
263
336
|
|
264
337
|
post.id
|
265
338
|
An identifier unique to the Post (useful in RSS feeds).
|
@@ -277,6 +350,10 @@ h3. Post
|
|
277
350
|
/_posts/music/metal/2008-12-24-metalocalypse.textile would have this field
|
278
351
|
set to ['music', 'metal'].
|
279
352
|
|
353
|
+
post.tags
|
354
|
+
The list of tags on this post. Tags are much like topics, but can only be
|
355
|
+
specified in the YAML part of a post, and are not reflected in the URL.
|
356
|
+
|
280
357
|
post.content
|
281
358
|
The content of the Post.
|
282
359
|
|
@@ -302,6 +379,9 @@ h3. Predefined Global Variables
|
|
302
379
|
If set, this specifies the layout file to use. Use the layout file
|
303
380
|
name without file extension. Layout files must be placed in the
|
304
381
|
<code>_layouts</code> directory.
|
382
|
+
|
383
|
+
A default layout for posts can be set in the configuration file.
|
384
|
+
See above.
|
305
385
|
|
306
386
|
h3. Predefined Post Variables
|
307
387
|
|
@@ -313,12 +393,21 @@ h3. Predefined Post Variables
|
|
313
393
|
published
|
314
394
|
Set to false if you don't want a post to show up when the site is
|
315
395
|
generated.
|
396
|
+
|
397
|
+
time
|
398
|
+
If you want posts to have a time, you can set this to e.g. '23:45' or
|
399
|
+
'11:45 pm'. This overrides any time specified in the filename like
|
400
|
+
'2009-04-12_23-44-my-post.html'. Note that you must quote the time:
|
401
|
+
time: "23:45"
|
316
402
|
|
317
403
|
category/categories
|
318
404
|
Instead of placing posts inside of folders, you can specify one or more
|
319
405
|
categories that the post belongs to. When the site is generated the post
|
320
406
|
will act as though it had been set with these categories normally.
|
321
407
|
|
408
|
+
tags
|
409
|
+
Similar to categories and topics but not reflected in the URL.
|
410
|
+
|
322
411
|
h3. Custom Variables
|
323
412
|
|
324
413
|
Any variables in the front matter that are not predefined are mixed into the
|
@@ -450,6 +539,10 @@ This would list all the posts in the category 'foo' by date and title.
|
|
450
539
|
|
451
540
|
The posts within each category are sorted in reverse chronological order.
|
452
541
|
|
542
|
+
h2. Tags
|
543
|
+
|
544
|
+
Tags are like categories or topics but not reflected in the URL.
|
545
|
+
|
453
546
|
h2. Blog migrations
|
454
547
|
|
455
548
|
h3. Movable Type
|
data/bin/jekyll
CHANGED
@@ -43,6 +43,10 @@ opts = OptionParser.new do |opts|
|
|
43
43
|
opts.on("--pygments", "Use pygments to highlight code") do
|
44
44
|
options['pygments'] = true
|
45
45
|
end
|
46
|
+
|
47
|
+
opts.on("--pygments-cache", "Path to cache pygments output in, for faster re-rendering") do |path|
|
48
|
+
options['pygments_cache'] = path
|
49
|
+
end
|
46
50
|
|
47
51
|
opts.on("--rdiscount", "Use rdiscount gem for Markdown") do
|
48
52
|
options['markdown'] = 'rdiscount'
|
@@ -51,7 +55,19 @@ opts = OptionParser.new do |opts|
|
|
51
55
|
opts.on("--permalink [TYPE]", "Use 'date' (default) for YYYY/MM/DD") do |style|
|
52
56
|
options['permalink'] = style unless style.nil?
|
53
57
|
end
|
58
|
+
|
59
|
+
opts.on("--permalink-date [FORMAT]", 'A strftime type format string. No times. (default format %Y/%m/%d)') do |format|
|
60
|
+
options['permalink_date'] = format unless format.nil?
|
61
|
+
end
|
54
62
|
|
63
|
+
opts.on("--sass", "Use Sass from haml gem for CSS generation") do
|
64
|
+
options['sass'] = true
|
65
|
+
end
|
66
|
+
|
67
|
+
opts.on("--haml", "Enable using Haml for posts and pages") do
|
68
|
+
options['haml'] = true
|
69
|
+
end
|
70
|
+
|
55
71
|
opts.on("--version", "Display current version") do
|
56
72
|
puts "Jekyll " + Jekyll.version
|
57
73
|
exit 0
|
data/lib/jekyll.rb
CHANGED
@@ -28,7 +28,7 @@ require 'jekyll/albino'
|
|
28
28
|
|
29
29
|
module Jekyll
|
30
30
|
# Default options. Overriden by values in _config.yaml or command-line opts.
|
31
|
-
#
|
31
|
+
# Strings are used instead of symbols for YAML compatibility.
|
32
32
|
DEFAULTS = {
|
33
33
|
'auto' => false,
|
34
34
|
'server' => false,
|
@@ -39,6 +39,7 @@ module Jekyll
|
|
39
39
|
|
40
40
|
'lsi' => false,
|
41
41
|
'pygments' => false,
|
42
|
+
'sass' => false,
|
42
43
|
'markdown' => 'maruku',
|
43
44
|
'permalink' => 'date',
|
44
45
|
|
data/lib/jekyll/albino.rb
CHANGED
@@ -56,7 +56,7 @@ class Albino
|
|
56
56
|
|
57
57
|
def initialize(target, lexer = :text, format = :html)
|
58
58
|
@target = File.exists?(target) ? File.read(target) : target rescue target
|
59
|
-
@options = { :l => lexer, :f => format }
|
59
|
+
@options = { :l => lexer, :f => format, :O => 'encoding=utf-8' }
|
60
60
|
end
|
61
61
|
|
62
62
|
def execute(command)
|
data/lib/jekyll/convertible.rb
CHANGED
@@ -21,7 +21,8 @@ module Jekyll
|
|
21
21
|
if self.content =~ /^(---\s*\n.*?)\n---\s*\n/m
|
22
22
|
self.content = self.content[($1.size + 5)..-1]
|
23
23
|
|
24
|
-
self.data
|
24
|
+
self.data ||= {}
|
25
|
+
self.data = self.data.merge(YAML.load($1))
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
@@ -36,6 +37,10 @@ module Jekyll
|
|
36
37
|
when 'markdown'
|
37
38
|
self.ext = ".html"
|
38
39
|
self.content = self.site.markdown(self.content)
|
40
|
+
when 'haml'
|
41
|
+
self.ext = ".html"
|
42
|
+
# Actually rendered in do_layout.
|
43
|
+
self.content = Haml::Engine.new(self.content, :attr_wrapper => %{"})
|
39
44
|
end
|
40
45
|
end
|
41
46
|
|
@@ -49,6 +54,8 @@ module Jekyll
|
|
49
54
|
return 'textile'
|
50
55
|
when /markdown/i, /mkdn/i, /md/i
|
51
56
|
return 'markdown'
|
57
|
+
when /haml/i
|
58
|
+
return 'haml'
|
52
59
|
end
|
53
60
|
return 'unknown'
|
54
61
|
end
|
@@ -63,8 +70,17 @@ module Jekyll
|
|
63
70
|
|
64
71
|
# render and transform content (this becomes the final content of the object)
|
65
72
|
payload["content_type"] = self.content_type
|
66
|
-
|
67
|
-
self.
|
73
|
+
|
74
|
+
if self.content_type == "haml"
|
75
|
+
context = OpenStruct.new(:site => self.site, :page => OpenStruct.new(payload["page"]))
|
76
|
+
context.extend(HamlHelpers)
|
77
|
+
|
78
|
+
self.transform
|
79
|
+
self.content = self.content.render(context)
|
80
|
+
else
|
81
|
+
self.content = Liquid::Template.parse(self.content).render(payload, info)
|
82
|
+
self.transform
|
83
|
+
end
|
68
84
|
|
69
85
|
# output keeps track of what will finally be written
|
70
86
|
self.output = self.content
|
data/lib/jekyll/filters.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
|
3
5
|
module Filters
|
@@ -17,14 +19,41 @@ module Jekyll
|
|
17
19
|
date.xmlschema
|
18
20
|
end
|
19
21
|
|
22
|
+
def time_to_string(date)
|
23
|
+
date.strftime("%d %b %Y, %H:%M")
|
24
|
+
end
|
25
|
+
|
26
|
+
def date_to_utc(date)
|
27
|
+
date.utc
|
28
|
+
end
|
29
|
+
|
30
|
+
def url_escape(input)
|
31
|
+
CGI.escape(input)
|
32
|
+
end
|
33
|
+
|
20
34
|
def xml_escape(input)
|
21
|
-
|
35
|
+
CGI.escapeHTML(input)
|
22
36
|
end
|
23
37
|
|
24
38
|
def number_of_words(input)
|
25
39
|
input.split.length
|
26
40
|
end
|
27
41
|
|
42
|
+
# Example:
|
43
|
+
#
|
44
|
+
# Posted in <span class="tags">{{ page.tags | tag_links: "example.com" }}</span>.
|
45
|
+
#
|
46
|
+
# Then style '.tags span { display: none; }' so the "tag:" bits don't show.
|
47
|
+
# You can provide 'tags' as a YAML array in the post's front matter.
|
48
|
+
def tag_links(array, domain)
|
49
|
+
links = array.map { |tag|
|
50
|
+
qs = %{site:#{domain} "tag: #{tag}"}
|
51
|
+
url = "http://www.google.com/search?q=#{url_escape qs}"
|
52
|
+
%{<a href="#{xml_escape url}"><span>tag:</span> #{xml_escape tag}</a>}
|
53
|
+
}
|
54
|
+
array_to_sentence_string(links)
|
55
|
+
end
|
56
|
+
|
28
57
|
def array_to_sentence_string(array)
|
29
58
|
connector = "and"
|
30
59
|
case array.length
|
data/lib/jekyll/post.rb
CHANGED
@@ -8,10 +8,12 @@ module Jekyll
|
|
8
8
|
attr_accessor :lsi
|
9
9
|
end
|
10
10
|
|
11
|
-
MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/
|
11
|
+
MATCHER = /^(.+\/)*(\d+-\d+-\d+(?:_\d+-\d+)?)-(.*)(\.[^.]+)$/
|
12
12
|
|
13
13
|
# Post name validator. Post filenames must be like:
|
14
14
|
# 2008-11-05-my-awesome-post.textile
|
15
|
+
# or:
|
16
|
+
# 2008-11-05_12-45-my-awesome-post.textile
|
15
17
|
#
|
16
18
|
# Returns <Bool>
|
17
19
|
def self.valid?(name)
|
@@ -19,7 +21,7 @@ module Jekyll
|
|
19
21
|
end
|
20
22
|
|
21
23
|
attr_accessor :site
|
22
|
-
attr_accessor :date, :slug, :ext, :categories, :topics, :published
|
24
|
+
attr_accessor :date, :slug, :ext, :categories, :tags, :topics, :published
|
23
25
|
attr_accessor :data, :content, :output
|
24
26
|
|
25
27
|
# Initialize this Post instance.
|
@@ -27,6 +29,7 @@ module Jekyll
|
|
27
29
|
# +base+ is the String path to the dir containing the post file
|
28
30
|
# +name+ is the String filename of the post file
|
29
31
|
# +categories+ is an Array of Strings for the categories for this post
|
32
|
+
# +tags+ is an Array of Strings for the tags for this post
|
30
33
|
#
|
31
34
|
# Returns <Post>
|
32
35
|
def initialize(site, source, dir, name)
|
@@ -40,8 +43,11 @@ module Jekyll
|
|
40
43
|
self.topics = parts.size > 1 ? parts[0..-2] : []
|
41
44
|
|
42
45
|
self.process(name)
|
46
|
+
self.data = self.site.post_defaults.dup
|
43
47
|
self.read_yaml(@base, name)
|
44
48
|
|
49
|
+
extract_title_from_first_header_or_slug
|
50
|
+
|
45
51
|
if self.data.has_key?('published') && self.data['published'] == false
|
46
52
|
self.published = false
|
47
53
|
else
|
@@ -61,6 +67,8 @@ module Jekyll
|
|
61
67
|
end
|
62
68
|
end
|
63
69
|
end
|
70
|
+
|
71
|
+
self.tags = self.data['tags'] || []
|
64
72
|
end
|
65
73
|
|
66
74
|
# Spaceship is based on Post#date
|
@@ -76,6 +84,7 @@ module Jekyll
|
|
76
84
|
# Returns nothing
|
77
85
|
def process(name)
|
78
86
|
m, cats, date, slug, ext = *name.match(MATCHER)
|
87
|
+
date = date.sub(/_(\d+)-(\d+)\Z/, ' \1:\2') # Make optional time part parsable.
|
79
88
|
self.date = Time.parse(date)
|
80
89
|
self.slug = slug
|
81
90
|
self.ext = ext
|
@@ -93,7 +102,7 @@ module Jekyll
|
|
93
102
|
else
|
94
103
|
prefix = self.categories.empty? ? '' : '/' + self.categories.join('/')
|
95
104
|
if [:date, :pretty].include?(self.site.permalink_style)
|
96
|
-
prefix + date.strftime("/%Y/%m/%d/")
|
105
|
+
prefix + date.strftime(self.site.permalink_date || "/%Y/%m/%d/")
|
97
106
|
else
|
98
107
|
prefix + '/'
|
99
108
|
end
|
@@ -125,6 +134,27 @@ module Jekyll
|
|
125
134
|
def id
|
126
135
|
self.dir + self.slug
|
127
136
|
end
|
137
|
+
|
138
|
+
# The post title
|
139
|
+
#
|
140
|
+
# Returns <String>
|
141
|
+
def title
|
142
|
+
self.data && self.data["title"]
|
143
|
+
end
|
144
|
+
|
145
|
+
# The post date and time
|
146
|
+
#
|
147
|
+
# Returns <Time>
|
148
|
+
def date
|
149
|
+
@date_with_time ||= begin
|
150
|
+
if self.data && self.data.key?("time")
|
151
|
+
time = Time.parse(self.data["time"])
|
152
|
+
Time.mktime(@date.year, @date.month, @date.day, time.hour, time.min)
|
153
|
+
else
|
154
|
+
@date
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
128
158
|
|
129
159
|
# Calculate related posts.
|
130
160
|
#
|
@@ -183,17 +213,34 @@ module Jekyll
|
|
183
213
|
f.write(self.output)
|
184
214
|
end
|
185
215
|
end
|
216
|
+
|
217
|
+
# Attempt to extract title from topmost header or slug.
|
218
|
+
#
|
219
|
+
# Returns <String>
|
220
|
+
def extract_title_from_first_header_or_slug
|
221
|
+
# Done before the transformation to HTML, or it won't go into <title>s.
|
222
|
+
self.data["title"] ||=
|
223
|
+
case content_type
|
224
|
+
when 'textile'
|
225
|
+
self.content[/\A\s*h\d\.\s*(.+)/, 1] # h1. Header
|
226
|
+
when 'markdown'
|
227
|
+
self.content[/\A\s*#+\s*(.+)\s*#*$/, 1] || # "# Header"
|
228
|
+
self.content[/\A\s*(\S.*)\r?\n\s*(-+|=+)\s*$/, 1] # "Header\n====="
|
229
|
+
end
|
230
|
+
self.data["title"] ||= self.slug.split('-').select {|w| w.capitalize! || w }.join(' ')
|
231
|
+
end
|
186
232
|
|
187
233
|
# Convert this post into a Hash for use in Liquid templates.
|
188
234
|
#
|
189
235
|
# Returns <Hash>
|
190
236
|
def to_liquid
|
191
|
-
{ "title" => self.
|
237
|
+
{ "title" => self.title,
|
192
238
|
"url" => self.url,
|
193
239
|
"date" => self.date,
|
194
240
|
"id" => self.id,
|
195
241
|
"topics" => self.topics,
|
196
242
|
"categories" => self.categories,
|
243
|
+
"tags" => self.tags,
|
197
244
|
"content" => self.content }.deep_merge(self.data)
|
198
245
|
end
|
199
246
|
|
data/lib/jekyll/site.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module Jekyll
|
2
2
|
|
3
3
|
class Site
|
4
|
-
attr_accessor :config, :layouts, :posts, :categories
|
5
|
-
attr_accessor :source, :dest, :lsi, :pygments, :permalink_style
|
4
|
+
attr_accessor :config, :layouts, :posts, :collated_posts, :categories, :tags
|
5
|
+
attr_accessor :source, :dest, :lsi, :pygments, :pygments_cache, :permalink_style, :permalink_date,
|
6
|
+
:sass, :post_defaults
|
6
7
|
|
7
8
|
# Initialize the site
|
8
9
|
# +config+ is a Hash containing site configurations details
|
@@ -15,7 +16,10 @@ module Jekyll
|
|
15
16
|
self.dest = config['destination']
|
16
17
|
self.lsi = config['lsi']
|
17
18
|
self.pygments = config['pygments']
|
19
|
+
self.pygments_cache = config['pygments_cache']
|
18
20
|
self.permalink_style = config['permalink'].to_sym
|
21
|
+
self.permalink_date = config['permalink_date'] && config['permalink_date'].sub(%r{\A/?(.*)/?\Z}, '/\1/')
|
22
|
+
self.post_defaults = config['post_defaults'] || {}
|
19
23
|
|
20
24
|
self.reset
|
21
25
|
self.setup
|
@@ -24,12 +28,41 @@ module Jekyll
|
|
24
28
|
def reset
|
25
29
|
self.layouts = {}
|
26
30
|
self.posts = []
|
27
|
-
self.
|
31
|
+
self.collated_posts = Hash.new {|h,k| h[k] = Hash.new {|h,k| h[k] = Hash.new {|h,k| h[k] = [] } } }
|
32
|
+
self.categories = Hash.new { |hash, key| hash[key] = [] }
|
33
|
+
self.tags = Hash.new { |hash, key| hash[key] = [] }
|
28
34
|
end
|
29
35
|
|
30
36
|
def setup
|
31
37
|
# Check to see if LSI is enabled.
|
32
38
|
require 'classifier' if self.lsi
|
39
|
+
|
40
|
+
if self.config['sass']
|
41
|
+
begin
|
42
|
+
require 'sass'
|
43
|
+
self.sass = true
|
44
|
+
puts 'Using Sass for CSS generation'
|
45
|
+
rescue LoadError
|
46
|
+
puts 'You must have the haml gem installed first'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
if self.config['haml']
|
51
|
+
begin
|
52
|
+
require 'haml'
|
53
|
+
require 'ostruct'
|
54
|
+
require 'jekyll/haml_helpers'
|
55
|
+
puts 'Enabled Haml'
|
56
|
+
rescue LoadError
|
57
|
+
puts 'You must have the haml gem installed first'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
if self.pygments_cache
|
62
|
+
require 'fileutils'
|
63
|
+
FileUtils.mkdir_p(pygments_cache)
|
64
|
+
require 'digest/md5'
|
65
|
+
end
|
33
66
|
|
34
67
|
# Set the Markdown interpreter (and Maruku self.config, if necessary)
|
35
68
|
case self.config['markdown']
|
@@ -91,6 +124,7 @@ module Jekyll
|
|
91
124
|
self.reset
|
92
125
|
self.read_layouts
|
93
126
|
self.transform_pages
|
127
|
+
self.transform_sass if self.sass
|
94
128
|
self.write_posts
|
95
129
|
end
|
96
130
|
|
@@ -126,6 +160,7 @@ module Jekyll
|
|
126
160
|
if post.published
|
127
161
|
self.posts << post
|
128
162
|
post.categories.each { |c| self.categories[c] << post }
|
163
|
+
post.tags.each { |c| self.tags[c] << post }
|
129
164
|
end
|
130
165
|
end
|
131
166
|
end
|
@@ -136,7 +171,11 @@ module Jekyll
|
|
136
171
|
end
|
137
172
|
|
138
173
|
self.posts.sort!
|
139
|
-
self.
|
174
|
+
self.posts.each do |post|
|
175
|
+
self.collated_posts[post.date.year][post.date.month][post.date.day].unshift(post)
|
176
|
+
end
|
177
|
+
self.categories.values.map { |ps| ps.sort! { |a, b| b <=> a} }
|
178
|
+
self.tags.values.map { |ps| ps.sort! { |a, b| b <=> a} }
|
140
179
|
rescue Errno::ENOENT => e
|
141
180
|
# ignore missing layout dir
|
142
181
|
end
|
@@ -194,6 +233,28 @@ module Jekyll
|
|
194
233
|
end
|
195
234
|
end
|
196
235
|
|
236
|
+
# Transform all *.sass files from <dest> to css with the same name
|
237
|
+
# and delete source sass files.
|
238
|
+
# Returns nothing
|
239
|
+
def transform_sass(dir = '')
|
240
|
+
base = File.join(self.source, dir)
|
241
|
+
entries = Dir.entries(base)
|
242
|
+
entries = entries.reject { |e| ['.', '_'].include?(e[0..0]) }
|
243
|
+
directories = entries.select { |e| File.directory?(File.join(base, e)) }
|
244
|
+
directories.each { |d| transform_sass(File.join(dir, d)) }
|
245
|
+
files = entries.reject { |e| File.directory?(File.join(base, e)) }
|
246
|
+
files = files.select { |f| File.extname(File.join(base, f)) == ".sass" }
|
247
|
+
files.each do |f|
|
248
|
+
input = File.open(File.join(base, f), "r")
|
249
|
+
result = Sass::Engine.new(input.read, :style => :compact, :load_paths => base).render
|
250
|
+
FileUtils.mkdir_p(File.join(self.dest, dir))
|
251
|
+
output = File.open(File.join(self.dest, dir, f).gsub(/.sass\Z/, ".css"), "w") do |o|
|
252
|
+
o.write(result)
|
253
|
+
end
|
254
|
+
FileUtils.rm(File.join(self.dest, dir, f))
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
197
258
|
# Constructs a hash map of Posts indexed by the specified Post attribute
|
198
259
|
#
|
199
260
|
# Returns {post_attr => [<Post>]}
|
@@ -211,12 +272,14 @@ module Jekyll
|
|
211
272
|
# Returns {"site" => {"time" => <Time>,
|
212
273
|
# "posts" => [<Post>],
|
213
274
|
# "categories" => [<Post>],
|
275
|
+
# "tags" => [<Post>],
|
214
276
|
# "topics" => [<Post>] }}
|
215
277
|
def site_payload
|
216
278
|
{"site" => {
|
217
279
|
"time" => Time.now,
|
218
280
|
"posts" => self.posts.sort { |a,b| b <=> a },
|
219
281
|
"categories" => post_attr_hash('categories'),
|
282
|
+
"tags" => post_attr_hash('tags'),
|
220
283
|
"topics" => post_attr_hash('topics')
|
221
284
|
}}
|
222
285
|
end
|
@@ -30,12 +30,24 @@ module Jekyll
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def render_pygments(context, code)
|
33
|
+
if cache_dir = context.registers[:site].pygments_cache
|
34
|
+
path = File.join(cache_dir, "#{@lang}-#{Digest::MD5.hexdigest(code)}.html")
|
35
|
+
if File.exist?(path)
|
36
|
+
highlighted_code = File.read(path)
|
37
|
+
else
|
38
|
+
highlighted_code = Albino.new(code, @lang).to_s(@options)
|
39
|
+
File.open(path, 'w') {|f| f.print(highlighted_code) }
|
40
|
+
end
|
41
|
+
else
|
42
|
+
highlighted_code = Albino.new(code, @lang).to_s(@options)
|
43
|
+
end
|
44
|
+
|
33
45
|
if context["content_type"] == :markdown
|
34
|
-
return "\n" +
|
46
|
+
return "\n" + highlighted_code + "\n"
|
35
47
|
elsif context["content_type"] == :textile
|
36
|
-
return "<notextile>" +
|
48
|
+
return "<notextile>" + highlighted_code + "</notextile>"
|
37
49
|
else
|
38
|
-
return
|
50
|
+
return highlighted_code
|
39
51
|
end
|
40
52
|
end
|
41
53
|
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: henrik-jekyll
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Preston-Werner
|
8
|
+
- Henrik Nyh
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
12
|
|
12
|
-
date: 2009-04-
|
13
|
+
date: 2009-04-15 00:00:00 -07:00
|
13
14
|
default_executable: jekyll
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
@@ -97,6 +98,7 @@ files:
|
|
97
98
|
- lib/jekyll/convertible.rb
|
98
99
|
- lib/jekyll/core_ext.rb
|
99
100
|
- lib/jekyll/filters.rb
|
101
|
+
- lib/jekyll/haml_helpers.rb
|
100
102
|
- lib/jekyll/layout.rb
|
101
103
|
- lib/jekyll/page.rb
|
102
104
|
- lib/jekyll/post.rb
|