jekyll-reloaded 0.12
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -0
- data/History.txt +321 -0
- data/LICENSE +21 -0
- data/README.textile +41 -0
- data/Rakefile +161 -0
- data/bin/jekyll +289 -0
- data/cucumber.yml +1 -0
- data/features/create_sites.feature +112 -0
- data/features/embed_filters.feature +60 -0
- data/features/markdown.feature +30 -0
- data/features/pagination.feature +27 -0
- data/features/permalinks.feature +65 -0
- data/features/post_data.feature +153 -0
- data/features/site_configuration.feature +145 -0
- data/features/site_data.feature +82 -0
- data/features/step_definitions/jekyll_steps.rb +145 -0
- data/features/support/env.rb +19 -0
- data/jekyll.gemspec +146 -0
- data/lib/guard/jekyll.rb +57 -0
- data/lib/jekyll/converter.rb +50 -0
- data/lib/jekyll/converters/identity.rb +22 -0
- data/lib/jekyll/converters/markdown.rb +125 -0
- data/lib/jekyll/converters/textile.rb +50 -0
- data/lib/jekyll/convertible.rb +116 -0
- data/lib/jekyll/core_ext.rb +52 -0
- data/lib/jekyll/errors.rb +6 -0
- data/lib/jekyll/filters.rb +118 -0
- data/lib/jekyll/generator.rb +7 -0
- data/lib/jekyll/generators/pagination.rb +113 -0
- data/lib/jekyll/layout.rb +51 -0
- data/lib/jekyll/live_site.rb +216 -0
- data/lib/jekyll/migrators/csv.rb +26 -0
- data/lib/jekyll/migrators/drupal.rb +103 -0
- data/lib/jekyll/migrators/enki.rb +49 -0
- data/lib/jekyll/migrators/joomla.rb +53 -0
- data/lib/jekyll/migrators/marley.rb +52 -0
- data/lib/jekyll/migrators/mephisto.rb +84 -0
- data/lib/jekyll/migrators/mt.rb +86 -0
- data/lib/jekyll/migrators/posterous.rb +67 -0
- data/lib/jekyll/migrators/rss.rb +47 -0
- data/lib/jekyll/migrators/textpattern.rb +58 -0
- data/lib/jekyll/migrators/tumblr.rb +195 -0
- data/lib/jekyll/migrators/typo.rb +51 -0
- data/lib/jekyll/migrators/wordpress.rb +294 -0
- data/lib/jekyll/migrators/wordpressdotcom.rb +70 -0
- data/lib/jekyll/page.rb +160 -0
- data/lib/jekyll/plugin.rb +77 -0
- data/lib/jekyll/post.rb +262 -0
- data/lib/jekyll/site.rb +339 -0
- data/lib/jekyll/static_file.rb +77 -0
- data/lib/jekyll/tags/highlight.rb +118 -0
- data/lib/jekyll/tags/include.rb +37 -0
- data/lib/jekyll/tags/post_url.rb +38 -0
- data/lib/jekyll.rb +134 -0
- data/test/helper.rb +34 -0
- data/test/source/.htaccess +8 -0
- data/test/source/_includes/sig.markdown +3 -0
- data/test/source/_layouts/default.html +27 -0
- data/test/source/_layouts/simple.html +1 -0
- data/test/source/_posts/2008-02-02-not-published.textile +8 -0
- data/test/source/_posts/2008-02-02-published.textile +8 -0
- data/test/source/_posts/2008-10-18-foo-bar.textile +8 -0
- data/test/source/_posts/2008-11-21-complex.textile +8 -0
- data/test/source/_posts/2008-12-03-permalinked-post.textile +9 -0
- data/test/source/_posts/2008-12-13-include.markdown +8 -0
- data/test/source/_posts/2009-01-27-array-categories.textile +10 -0
- data/test/source/_posts/2009-01-27-categories.textile +7 -0
- data/test/source/_posts/2009-01-27-category.textile +7 -0
- data/test/source/_posts/2009-01-27-empty-categories.textile +7 -0
- data/test/source/_posts/2009-01-27-empty-category.textile +7 -0
- data/test/source/_posts/2009-03-12-hash-#1.markdown +6 -0
- data/test/source/_posts/2009-05-18-empty-tag.textile +6 -0
- data/test/source/_posts/2009-05-18-empty-tags.textile +6 -0
- data/test/source/_posts/2009-05-18-tag.textile +6 -0
- data/test/source/_posts/2009-05-18-tags.textile +9 -0
- data/test/source/_posts/2009-06-22-empty-yaml.textile +3 -0
- data/test/source/_posts/2009-06-22-no-yaml.textile +1 -0
- data/test/source/_posts/2010-01-08-triple-dash.markdown +5 -0
- data/test/source/_posts/2010-01-09-date-override.textile +7 -0
- data/test/source/_posts/2010-01-09-time-override.textile +7 -0
- data/test/source/_posts/2010-01-09-timezone-override.textile +7 -0
- data/test/source/_posts/2010-01-16-override-data.textile +4 -0
- data/test/source/_posts/2011-04-12-md-extension.md +7 -0
- data/test/source/_posts/2011-04-12-text-extension.text +0 -0
- data/test/source/about.html +6 -0
- data/test/source/category/_posts/2008-9-23-categories.textile +6 -0
- data/test/source/contacts.html +5 -0
- data/test/source/css/screen.css +76 -0
- data/test/source/deal.with.dots.html +7 -0
- data/test/source/foo/_posts/bar/2008-12-12-topical-post.textile +8 -0
- data/test/source/index.html +22 -0
- data/test/source/sitemap.xml +32 -0
- data/test/source/win/_posts/2009-05-24-yaml-linebreak.markdown +7 -0
- data/test/source/z_category/_posts/2008-9-23-categories.textile +6 -0
- data/test/suite.rb +11 -0
- data/test/test_configuration.rb +29 -0
- data/test/test_core_ext.rb +66 -0
- data/test/test_filters.rb +62 -0
- data/test/test_generated_site.rb +72 -0
- data/test/test_kramdown.rb +23 -0
- data/test/test_page.rb +117 -0
- data/test/test_pager.rb +113 -0
- data/test/test_post.rb +450 -0
- data/test/test_rdiscount.rb +18 -0
- data/test/test_redcarpet.rb +21 -0
- data/test/test_redcloth.rb +86 -0
- data/test/test_site.rb +220 -0
- data/test/test_tags.rb +201 -0
- metadata +332 -0
data/bin/jekyll
ADDED
@@ -0,0 +1,289 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
|
4
|
+
|
5
|
+
help = <<HELP
|
6
|
+
Jekyll is a blog-aware, static site generator.
|
7
|
+
|
8
|
+
Basic Command Line Usage:
|
9
|
+
jekyll # . -> ./_site
|
10
|
+
jekyll <path to write generated site> # . -> <path>
|
11
|
+
jekyll <path to source> <path to write generated site> # <path> -> <path>
|
12
|
+
jekyll import <importer name> <options> # imports posts using named import script
|
13
|
+
|
14
|
+
Configuration is read from '<source>/_config.yml' but can be overriden
|
15
|
+
using the following options:
|
16
|
+
|
17
|
+
HELP
|
18
|
+
|
19
|
+
require 'optparse'
|
20
|
+
require 'jekyll'
|
21
|
+
|
22
|
+
|
23
|
+
exec = {}
|
24
|
+
options = {}
|
25
|
+
opts = OptionParser.new do |opts|
|
26
|
+
opts.banner = help
|
27
|
+
|
28
|
+
opts.on("--file [PATH]", "File to import from") do |import_file|
|
29
|
+
options['file'] = import_file
|
30
|
+
end
|
31
|
+
|
32
|
+
opts.on("--dbname [TEXT]", "DB to import from") do |import_dbname|
|
33
|
+
options['dbname'] = import_dbname
|
34
|
+
end
|
35
|
+
|
36
|
+
opts.on("--user [TEXT]", "Username to use when importing") do |import_user|
|
37
|
+
options['user'] = import_user
|
38
|
+
end
|
39
|
+
|
40
|
+
opts.on("--pass [TEXT]", "Password to use when importing") do |import_pass|
|
41
|
+
options['pass'] = import_pass
|
42
|
+
end
|
43
|
+
|
44
|
+
opts.on("--host [HOST ADDRESS]", "Host to import from") do |import_host|
|
45
|
+
options['host'] = import_host
|
46
|
+
end
|
47
|
+
|
48
|
+
opts.on("--site [SITE NAME]", "Site to import from") do |import_site|
|
49
|
+
options['site'] = import_site
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
opts.on("--[no-]safe", "Safe mode (default unsafe)") do |safe|
|
54
|
+
options['safe'] = safe
|
55
|
+
end
|
56
|
+
|
57
|
+
opts.on("--[no-]auto", "Auto-regenerate") do |auto|
|
58
|
+
options['auto'] = auto
|
59
|
+
end
|
60
|
+
|
61
|
+
opts.on("--server [PORT]", "Start web server (default port 4000)") do |port|
|
62
|
+
options['server'] = true
|
63
|
+
options['server_port'] = port unless port.nil?
|
64
|
+
end
|
65
|
+
|
66
|
+
opts.on("--no-server", "Do not start a web server") do |part|
|
67
|
+
options['server'] = false
|
68
|
+
end
|
69
|
+
|
70
|
+
opts.on("--base-url [BASE_URL]", "Serve website from a given base URL (default '/'") do |baseurl|
|
71
|
+
options['baseurl'] = baseurl
|
72
|
+
end
|
73
|
+
|
74
|
+
opts.on("--default-mimetype [MT]", "Mimetype to use when no file extension (if --server)") do |mt|
|
75
|
+
options['default-mimetype'] = mt
|
76
|
+
end
|
77
|
+
|
78
|
+
opts.on("--[no-]lsi", "Use LSI for better related posts") do |lsi|
|
79
|
+
options['lsi'] = lsi
|
80
|
+
end
|
81
|
+
|
82
|
+
opts.on("--[no-]pygments", "Use pygments to highlight code") do |pygments|
|
83
|
+
options['pygments'] = pygments
|
84
|
+
end
|
85
|
+
|
86
|
+
opts.on("--rdiscount", "Use rdiscount gem for Markdown") do
|
87
|
+
options['markdown'] = 'rdiscount'
|
88
|
+
end
|
89
|
+
|
90
|
+
opts.on("--redcarpet", "Use redcarpet gem for Markdown") do
|
91
|
+
options['markdown'] = 'redcarpet'
|
92
|
+
end
|
93
|
+
|
94
|
+
opts.on("--kramdown", "Use kramdown gem for Markdown") do
|
95
|
+
options['markdown'] = 'kramdown'
|
96
|
+
end
|
97
|
+
|
98
|
+
opts.on("--time [TIME]", "Time to generate the site for") do |time|
|
99
|
+
options['time'] = Time.parse(time)
|
100
|
+
end
|
101
|
+
|
102
|
+
opts.on("--[no-]future", "Render future dated posts") do |future|
|
103
|
+
options['future'] = future
|
104
|
+
end
|
105
|
+
|
106
|
+
opts.on("--permalink [TYPE]", "Use 'date' (default) for YYYY/MM/DD") do |style|
|
107
|
+
options['permalink'] = style unless style.nil?
|
108
|
+
end
|
109
|
+
|
110
|
+
opts.on("--paginate [POSTS_PER_PAGE]", "Paginate a blog's posts") do |per_page|
|
111
|
+
begin
|
112
|
+
options['paginate'] = per_page.to_i
|
113
|
+
raise ArgumentError if options['paginate'] == 0
|
114
|
+
rescue
|
115
|
+
puts 'you must specify a number of posts by page bigger than 0'
|
116
|
+
exit 0
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
opts.on("--limit_posts [MAX_POSTS]", "Limit the number of posts to publish") do |limit_posts|
|
121
|
+
begin
|
122
|
+
options['limit_posts'] = limit_posts.to_i
|
123
|
+
raise ArgumentError if options['limit_posts'] < 1
|
124
|
+
rescue
|
125
|
+
puts 'you must specify a number of posts by page bigger than 0'
|
126
|
+
exit 0
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
opts.on("--url [URL]", "Set custom site.url") do |url|
|
131
|
+
options['url'] = url
|
132
|
+
end
|
133
|
+
|
134
|
+
opts.on("--version", "Display current version") do
|
135
|
+
puts "Jekyll " + Jekyll::VERSION
|
136
|
+
exit 0
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# Read command line options into `options` hash
|
141
|
+
opts.parse!
|
142
|
+
|
143
|
+
|
144
|
+
# Check for import stuff
|
145
|
+
if ARGV.size > 0
|
146
|
+
if ARGV[0] == 'import'
|
147
|
+
migrator = ARGV[1]
|
148
|
+
|
149
|
+
if migrator.nil?
|
150
|
+
puts "Invalid options. Run `jekyll --help` for assistance."
|
151
|
+
exit(1)
|
152
|
+
else
|
153
|
+
migrator = migrator.downcase
|
154
|
+
end
|
155
|
+
|
156
|
+
cmd_options = []
|
157
|
+
['file', 'dbname', 'user', 'pass', 'host', 'site'].each do |p|
|
158
|
+
cmd_options << "\"#{options[p]}\"" unless options[p].nil?
|
159
|
+
end
|
160
|
+
|
161
|
+
# It's import time
|
162
|
+
puts "Importing..."
|
163
|
+
|
164
|
+
# Ideally, this shouldn't be necessary. Maybe parse the actual
|
165
|
+
# src files for the migrator name?
|
166
|
+
migrators = {
|
167
|
+
:posterous => 'Posterous',
|
168
|
+
:wordpressdotcom => 'WordpressDotCom',
|
169
|
+
:wordpress => 'WordPress',
|
170
|
+
:csv => 'CSV',
|
171
|
+
:drupal => 'Drupal',
|
172
|
+
:enki => 'Enki',
|
173
|
+
:mephisto => 'Mephisto',
|
174
|
+
:mt => 'MT',
|
175
|
+
:textpattern => 'TextPattern',
|
176
|
+
:tumblr => 'Tumblr',
|
177
|
+
:typo => 'Typo'
|
178
|
+
}
|
179
|
+
|
180
|
+
app_root = File.join(File.dirname(__FILE__), '..')
|
181
|
+
|
182
|
+
require "#{app_root}/lib/jekyll/migrators/#{migrator}"
|
183
|
+
|
184
|
+
if Jekyll.const_defined?(migrators[migrator.to_sym])
|
185
|
+
migrator_class = Jekyll.const_get(migrators[migrator.to_sym])
|
186
|
+
migrator_class.process(*cmd_options)
|
187
|
+
else
|
188
|
+
puts "Invalid migrator. Run `jekyll --help` for assistance."
|
189
|
+
exit(1)
|
190
|
+
end
|
191
|
+
|
192
|
+
exit(0)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
|
197
|
+
|
198
|
+
# Get source and destination from command line
|
199
|
+
case ARGV.size
|
200
|
+
when 0
|
201
|
+
when 1
|
202
|
+
options['destination'] = ARGV[0]
|
203
|
+
when 2
|
204
|
+
options['source'] = ARGV[0]
|
205
|
+
options['destination'] = ARGV[1]
|
206
|
+
else
|
207
|
+
puts "Invalid options. Run `jekyll --help` for assistance."
|
208
|
+
exit(1)
|
209
|
+
end
|
210
|
+
|
211
|
+
options = Jekyll.configuration(options)
|
212
|
+
|
213
|
+
# Get source and destination directories (possibly set by config file)
|
214
|
+
source = options['source']
|
215
|
+
destination = options['destination']
|
216
|
+
|
217
|
+
# Files to watch
|
218
|
+
def globs(source)
|
219
|
+
Dir.chdir(source) do
|
220
|
+
dirs = Dir['*'].select { |x| File.directory?(x) }
|
221
|
+
dirs -= ['_site']
|
222
|
+
dirs = dirs.map { |x| "#{x}/**/*" }
|
223
|
+
dirs += ['*']
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
# Create the Site
|
228
|
+
site = Jekyll::Site.new(options)
|
229
|
+
|
230
|
+
# Run the directory watcher for auto-generation, if required
|
231
|
+
if options['auto']
|
232
|
+
require 'directory_watcher'
|
233
|
+
|
234
|
+
puts "Auto-regenerating enabled: #{source} -> #{destination}"
|
235
|
+
|
236
|
+
dw = DirectoryWatcher.new(source)
|
237
|
+
dw.interval = 1
|
238
|
+
dw.glob = globs(source)
|
239
|
+
|
240
|
+
dw.add_observer do |*args|
|
241
|
+
t = Time.now.strftime("%Y-%m-%d %H:%M:%S")
|
242
|
+
puts "[#{t}] regeneration: #{args.size} files changed"
|
243
|
+
site.process
|
244
|
+
end
|
245
|
+
|
246
|
+
dw.start
|
247
|
+
|
248
|
+
unless options['server']
|
249
|
+
loop { sleep 1000 }
|
250
|
+
end
|
251
|
+
else
|
252
|
+
puts "Building site: #{source} -> #{destination}"
|
253
|
+
begin
|
254
|
+
site.process
|
255
|
+
rescue Jekyll::FatalException => e
|
256
|
+
puts
|
257
|
+
puts "ERROR: YOUR SITE COULD NOT BE BUILT:"
|
258
|
+
puts "------------------------------------"
|
259
|
+
puts e.message
|
260
|
+
exit(1)
|
261
|
+
end
|
262
|
+
puts "Successfully generated site: #{source} -> #{destination}"
|
263
|
+
end
|
264
|
+
|
265
|
+
# Run the server on the specified port, if required
|
266
|
+
if options['server']
|
267
|
+
require 'webrick'
|
268
|
+
include WEBrick
|
269
|
+
|
270
|
+
FileUtils.mkdir_p(destination)
|
271
|
+
|
272
|
+
mime_types = WEBrick::HTTPUtils::DefaultMimeTypes
|
273
|
+
mime_types.store 'js', 'application/javascript'
|
274
|
+
if options['default-mimetype']
|
275
|
+
mime_types.store(nil, options['default-mimetype'])
|
276
|
+
end
|
277
|
+
|
278
|
+
s = HTTPServer.new(
|
279
|
+
:Port => options['server_port'],
|
280
|
+
:MimeTypes => mime_types
|
281
|
+
)
|
282
|
+
s.mount(options['baseurl'], HTTPServlet::FileHandler, destination)
|
283
|
+
t = Thread.new {
|
284
|
+
s.start
|
285
|
+
}
|
286
|
+
|
287
|
+
trap("INT") { s.shutdown }
|
288
|
+
t.join()
|
289
|
+
end
|
data/cucumber.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
default: --format progress
|
@@ -0,0 +1,112 @@
|
|
1
|
+
Feature: Create sites
|
2
|
+
As a hacker who likes to blog
|
3
|
+
I want to be able to make a static site
|
4
|
+
In order to share my awesome ideas with the interwebs
|
5
|
+
|
6
|
+
Scenario: Basic site
|
7
|
+
Given I have an "index.html" file that contains "Basic Site"
|
8
|
+
When I run jekyll
|
9
|
+
Then the _site directory should exist
|
10
|
+
And I should see "Basic Site" in "_site/index.html"
|
11
|
+
|
12
|
+
Scenario: Basic site with a post
|
13
|
+
Given I have a _posts directory
|
14
|
+
And I have the following post:
|
15
|
+
| title | date | content |
|
16
|
+
| Hackers | 3/27/2009 | My First Exploit |
|
17
|
+
When I run jekyll
|
18
|
+
Then the _site directory should exist
|
19
|
+
And I should see "My First Exploit" in "_site/2009/03/27/hackers.html"
|
20
|
+
|
21
|
+
Scenario: Basic site with layout and a page
|
22
|
+
Given I have a _layouts directory
|
23
|
+
And I have an "index.html" page with layout "default" that contains "Basic Site with Layout"
|
24
|
+
And I have a default layout that contains "Page Layout: {{ content }}"
|
25
|
+
When I run jekyll
|
26
|
+
Then the _site directory should exist
|
27
|
+
And I should see "Page Layout: Basic Site with Layout" in "_site/index.html"
|
28
|
+
|
29
|
+
Scenario: Basic site with layout and a post
|
30
|
+
Given I have a _layouts directory
|
31
|
+
And I have a _posts directory
|
32
|
+
And I have the following posts:
|
33
|
+
| title | date | layout | content |
|
34
|
+
| Wargames | 3/27/2009 | default | The only winning move is not to play. |
|
35
|
+
And I have a default layout that contains "Post Layout: {{ content }}"
|
36
|
+
When I run jekyll
|
37
|
+
Then the _site directory should exist
|
38
|
+
And I should see "Post Layout: <p>The only winning move is not to play.</p>" in "_site/2009/03/27/wargames.html"
|
39
|
+
|
40
|
+
Scenario: Basic site with layouts, pages, posts and files
|
41
|
+
Given I have a _layouts directory
|
42
|
+
And I have a page layout that contains "Page {{ page.title }}: {{ content }}"
|
43
|
+
And I have a post layout that contains "Post {{ page.title }}: {{ content }}"
|
44
|
+
And I have an "index.html" page with layout "page" that contains "Site contains {{ site.pages.size }} pages and {{ site.posts.size }} posts"
|
45
|
+
And I have a blog directory
|
46
|
+
And I have a "blog/index.html" page with layout "page" that contains "blog category index page"
|
47
|
+
And I have an "about.html" file that contains "No replacement {{ site.posts.size }}"
|
48
|
+
And I have an "another_file" file that contains ""
|
49
|
+
And I have a _posts directory
|
50
|
+
And I have the following posts:
|
51
|
+
| title | date | layout | content |
|
52
|
+
| entry1 | 3/27/2009 | post | content for entry1. |
|
53
|
+
| entry2 | 4/27/2009 | post | content for entry2. |
|
54
|
+
And I have a category/_posts directory
|
55
|
+
And I have the following posts in "category":
|
56
|
+
| title | date | layout | content |
|
57
|
+
| entry3 | 5/27/2009 | post | content for entry3. |
|
58
|
+
| entry4 | 6/27/2009 | post | content for entry4. |
|
59
|
+
When I run jekyll
|
60
|
+
Then the _site directory should exist
|
61
|
+
And I should see "Page : Site contains 2 pages and 4 posts" in "_site/index.html"
|
62
|
+
And I should see "No replacement \{\{ site.posts.size \}\}" in "_site/about.html"
|
63
|
+
And I should see "" in "_site/another_file"
|
64
|
+
And I should see "Page : blog category index page" in "_site/blog/index.html"
|
65
|
+
And I should see "Post entry1: <p>content for entry1.</p>" in "_site/2009/03/27/entry1.html"
|
66
|
+
And I should see "Post entry2: <p>content for entry2.</p>" in "_site/2009/04/27/entry2.html"
|
67
|
+
And I should see "Post entry3: <p>content for entry3.</p>" in "_site/category/2009/05/27/entry3.html"
|
68
|
+
And I should see "Post entry4: <p>content for entry4.</p>" in "_site/category/2009/06/27/entry4.html"
|
69
|
+
|
70
|
+
Scenario: Basic site with include tag
|
71
|
+
Given I have a _includes directory
|
72
|
+
And I have an "index.html" page that contains "Basic Site with include tag: {% include about.textile %}"
|
73
|
+
And I have an "_includes/about.textile" file that contains "Generated by Jekyll"
|
74
|
+
When I run jekyll
|
75
|
+
Then the _site directory should exist
|
76
|
+
And I should see "Basic Site with include tag: Generated by Jekyll" in "_site/index.html"
|
77
|
+
|
78
|
+
Scenario: Basic site with subdir include tag
|
79
|
+
Given I have a _includes directory
|
80
|
+
And I have an "_includes/about.textile" file that contains "Generated by Jekyll"
|
81
|
+
And I have an info directory
|
82
|
+
And I have an "info/index.html" page that contains "Basic Site with subdir include tag: {% include about.textile %}"
|
83
|
+
When I run jekyll
|
84
|
+
Then the _site directory should exist
|
85
|
+
And I should see "Basic Site with subdir include tag: Generated by Jekyll" in "_site/info/index.html"
|
86
|
+
|
87
|
+
Scenario: Basic site with nested include tag
|
88
|
+
Given I have a _includes directory
|
89
|
+
And I have an "_includes/about.textile" file that contains "Generated by {% include jekyll.textile %}"
|
90
|
+
And I have an "_includes/jekyll.textile" file that contains "Jekyll"
|
91
|
+
And I have an "index.html" page that contains "Basic Site with include tag: {% include about.textile %}"
|
92
|
+
When I debug jekyll
|
93
|
+
Then the _site directory should exist
|
94
|
+
And I should see "Basic Site with include tag: Generated by Jekyll" in "_site/index.html"
|
95
|
+
|
96
|
+
Scenario: Basic site with internal post linking
|
97
|
+
Given I have an "index.html" page that contains "URL: {% post_url 2020-01-31-entry2 %}"
|
98
|
+
And I have a configuration file with "permalink" set to "pretty"
|
99
|
+
And I have a _posts directory
|
100
|
+
And I have the following posts:
|
101
|
+
| title | date | layout | content |
|
102
|
+
| entry1 | 12/31/2007 | post | content for entry1. |
|
103
|
+
| entry2 | 01/31/2020 | post | content for entry2. |
|
104
|
+
When I run jekyll
|
105
|
+
Then the _site directory should exist
|
106
|
+
And I should see "URL: /2020/01/31/entry2/" in "_site/index.html"
|
107
|
+
|
108
|
+
Scenario: Basic site with whitelisted dotfile
|
109
|
+
Given I have an ".htaccess" file that contains "SomeDirective"
|
110
|
+
When I run jekyll
|
111
|
+
Then the _site directory should exist
|
112
|
+
And I should see "SomeDirective" in "_site/.htaccess"
|
@@ -0,0 +1,60 @@
|
|
1
|
+
Feature: Embed filters
|
2
|
+
As a hacker who likes to blog
|
3
|
+
I want to be able to transform text inside a post or page
|
4
|
+
In order to perform cool stuff in my posts
|
5
|
+
|
6
|
+
Scenario: Convert date to XML schema
|
7
|
+
Given I have a _posts directory
|
8
|
+
And I have a _layouts directory
|
9
|
+
And I have the following post:
|
10
|
+
| title | date | layout | content |
|
11
|
+
| Star Wars | 3/27/2009 | default | These aren't the droids you're looking for. |
|
12
|
+
And I have a default layout that contains "{{ site.time | date_to_xmlschema }}"
|
13
|
+
When I run jekyll
|
14
|
+
Then the _site directory should exist
|
15
|
+
And I should see today's date in "_site/2009/03/27/star-wars.html"
|
16
|
+
|
17
|
+
Scenario: Escape text for XML
|
18
|
+
Given I have a _posts directory
|
19
|
+
And I have a _layouts directory
|
20
|
+
And I have the following post:
|
21
|
+
| title | date | layout | content |
|
22
|
+
| Star & Wars | 3/27/2009 | default | These aren't the droids you're looking for. |
|
23
|
+
And I have a default layout that contains "{{ page.title | xml_escape }}"
|
24
|
+
When I run jekyll
|
25
|
+
Then the _site directory should exist
|
26
|
+
And I should see "Star & Wars" in "_site/2009/03/27/star-wars.html"
|
27
|
+
|
28
|
+
Scenario: Calculate number of words
|
29
|
+
Given I have a _posts directory
|
30
|
+
And I have a _layouts directory
|
31
|
+
And I have the following post:
|
32
|
+
| title | date | layout | content |
|
33
|
+
| Star Wars | 3/27/2009 | default | These aren't the droids you're looking for. |
|
34
|
+
And I have a default layout that contains "{{ content | xml_escape }}"
|
35
|
+
When I run jekyll
|
36
|
+
Then the _site directory should exist
|
37
|
+
And I should see "7" in "_site/2009/03/27/star-wars.html"
|
38
|
+
|
39
|
+
Scenario: Convert an array into a sentence
|
40
|
+
Given I have a _posts directory
|
41
|
+
And I have a _layouts directory
|
42
|
+
And I have the following post:
|
43
|
+
| title | date | layout | tags | content |
|
44
|
+
| Star Wars | 3/27/2009 | default | [scifi, movies, force] | These aren't the droids you're looking for. |
|
45
|
+
And I have a default layout that contains "{{ page.tags | array_to_sentence_string }}"
|
46
|
+
When I run jekyll
|
47
|
+
Then the _site directory should exist
|
48
|
+
And I should see "scifi, movies, and force" in "_site/2009/03/27/star-wars.html"
|
49
|
+
|
50
|
+
Scenario: Textilize a given string
|
51
|
+
Given I have a _posts directory
|
52
|
+
And I have a _layouts directory
|
53
|
+
And I have the following post:
|
54
|
+
| title | date | layout | content |
|
55
|
+
| Star Wars | 3/27/2009 | default | These aren't the droids you're looking for. |
|
56
|
+
And I have a default layout that contains "By {{ '_Obi-wan_' | textilize }}"
|
57
|
+
When I run jekyll
|
58
|
+
Then the _site directory should exist
|
59
|
+
And I should see "By <p><em>Obi-wan</em></p>" in "_site/2009/03/27/star-wars.html"
|
60
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Feature: Markdown
|
2
|
+
As a hacker who likes to blog
|
3
|
+
I want to be able to make a static site
|
4
|
+
In order to share my awesome ideas with the interwebs
|
5
|
+
|
6
|
+
Scenario: Markdown in list on index
|
7
|
+
Given I have a configuration file with "paginate" set to "5"
|
8
|
+
And I have an "index.html" page that contains "Index - {% for post in site.posts %} {{ post.content }} {% endfor %}"
|
9
|
+
And I have a _posts directory
|
10
|
+
And I have the following post:
|
11
|
+
| title | date | content | type |
|
12
|
+
| Hackers | 3/27/2009 | # My Title | markdown |
|
13
|
+
When I run jekyll
|
14
|
+
Then the _site directory should exist
|
15
|
+
And I should see "Index" in "_site/index.html"
|
16
|
+
And I should see "<h1 id='my_title'>My Title</h1>" in "_site/2009/03/27/hackers.html"
|
17
|
+
And I should see "<h1 id='my_title'>My Title</h1>" in "_site/index.html"
|
18
|
+
|
19
|
+
Scenario: Markdown in pagination on index
|
20
|
+
Given I have a configuration file with "paginate" set to "5"
|
21
|
+
And I have an "index.html" page that contains "Index - {% for post in paginator.posts %} {{ post.content }} {% endfor %}"
|
22
|
+
And I have a _posts directory
|
23
|
+
And I have the following post:
|
24
|
+
| title | date | content | type |
|
25
|
+
| Hackers | 3/27/2009 | # My Title | markdown |
|
26
|
+
When I run jekyll
|
27
|
+
Then the _site directory should exist
|
28
|
+
And I should see "Index" in "_site/index.html"
|
29
|
+
And I should see "<h1 id='my_title'>My Title</h1>" in "_site/index.html"
|
30
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
Feature: Site pagination
|
2
|
+
In order to paginate my blog
|
3
|
+
As a blog's user
|
4
|
+
I want divide the posts in several pages
|
5
|
+
|
6
|
+
Scenario Outline: Paginate with N posts per page
|
7
|
+
Given I have a configuration file with "paginate" set to "<num>"
|
8
|
+
And I have a _layouts directory
|
9
|
+
And I have an "index.html" page that contains "{{ paginator.posts.size }}"
|
10
|
+
And I have a _posts directory
|
11
|
+
And I have the following post:
|
12
|
+
| title | date | layout | content |
|
13
|
+
| Wargames | 3/27/2009 | default | The only winning move is not to play. |
|
14
|
+
| Wargames2 | 4/27/2009 | default | The only winning move is not to play2. |
|
15
|
+
| Wargames3 | 5/27/2009 | default | The only winning move is not to play3. |
|
16
|
+
| Wargames4 | 6/27/2009 | default | The only winning move is not to play4. |
|
17
|
+
When I run jekyll
|
18
|
+
Then the _site/page<exist> directory should exist
|
19
|
+
And the "_site/page<exist>/index.html" file should exist
|
20
|
+
And I should see "<posts>" in "_site/page<exist>/index.html"
|
21
|
+
And the "_site/page<not_exist>/index.html" file should not exist
|
22
|
+
|
23
|
+
Examples:
|
24
|
+
| num | exist | posts | not_exist |
|
25
|
+
| 1 | 4 | 1 | 5 |
|
26
|
+
| 2 | 2 | 2 | 3 |
|
27
|
+
| 3 | 2 | 1 | 3 |
|
@@ -0,0 +1,65 @@
|
|
1
|
+
Feature: Fancy permalinks
|
2
|
+
As a hacker who likes to blog
|
3
|
+
I want to be able to set permalinks
|
4
|
+
In order to make my blog URLs awesome
|
5
|
+
|
6
|
+
Scenario: Use none permalink schema
|
7
|
+
Given I have a _posts directory
|
8
|
+
And I have the following post:
|
9
|
+
| title | date | content |
|
10
|
+
| None Permalink Schema | 3/27/2009 | Totally nothing. |
|
11
|
+
And I have a configuration file with "permalink" set to "none"
|
12
|
+
When I run jekyll
|
13
|
+
Then the _site directory should exist
|
14
|
+
And I should see "Totally nothing." in "_site/none-permalink-schema.html"
|
15
|
+
|
16
|
+
Scenario: Use pretty permalink schema
|
17
|
+
Given I have a _posts directory
|
18
|
+
And I have the following post:
|
19
|
+
| title | date | content |
|
20
|
+
| Pretty Permalink Schema | 3/27/2009 | Totally wordpress. |
|
21
|
+
And I have a configuration file with "permalink" set to "pretty"
|
22
|
+
When I run jekyll
|
23
|
+
Then the _site directory should exist
|
24
|
+
And I should see "Totally wordpress." in "_site/2009/03/27/pretty-permalink-schema/index.html"
|
25
|
+
|
26
|
+
Scenario: Use pretty permalink schema for pages
|
27
|
+
Given I have an "index.html" page that contains "Totally index"
|
28
|
+
And I have an "awesome.html" page that contains "Totally awesome"
|
29
|
+
And I have an "sitemap.xml" page that contains "Totally uhm, sitemap"
|
30
|
+
And I have a configuration file with "permalink" set to "pretty"
|
31
|
+
When I run jekyll
|
32
|
+
Then the _site directory should exist
|
33
|
+
And I should see "Totally index" in "_site/index.html"
|
34
|
+
And I should see "Totally awesome" in "_site/awesome/index.html"
|
35
|
+
And I should see "Totally uhm, sitemap" in "_site/sitemap.xml"
|
36
|
+
|
37
|
+
Scenario: Use custom permalink schema with prefix
|
38
|
+
Given I have a _posts directory
|
39
|
+
And I have the following post:
|
40
|
+
| title | category | date | content |
|
41
|
+
| Custom Permalink Schema | stuff | 3/27/2009 | Totally custom. |
|
42
|
+
And I have a configuration file with "permalink" set to "/blog/:year/:month/:day/:title"
|
43
|
+
When I run jekyll
|
44
|
+
Then the _site directory should exist
|
45
|
+
And I should see "Totally custom." in "_site/blog/2009/03/27/custom-permalink-schema/index.html"
|
46
|
+
|
47
|
+
Scenario: Use custom permalink schema with category
|
48
|
+
Given I have a _posts directory
|
49
|
+
And I have the following post:
|
50
|
+
| title | category | date | content |
|
51
|
+
| Custom Permalink Schema | stuff | 3/27/2009 | Totally custom. |
|
52
|
+
And I have a configuration file with "permalink" set to "/:categories/:title.html"
|
53
|
+
When I run jekyll
|
54
|
+
Then the _site directory should exist
|
55
|
+
And I should see "Totally custom." in "_site/stuff/custom-permalink-schema.html"
|
56
|
+
|
57
|
+
Scenario: Use custom permalink schema with squished date
|
58
|
+
Given I have a _posts directory
|
59
|
+
And I have the following post:
|
60
|
+
| title | category | date | content |
|
61
|
+
| Custom Permalink Schema | stuff | 3/27/2009 | Totally custom. |
|
62
|
+
And I have a configuration file with "permalink" set to "/:month-:day-:year/:title.html"
|
63
|
+
When I run jekyll
|
64
|
+
Then the _site directory should exist
|
65
|
+
And I should see "Totally custom." in "_site/03-27-2009/custom-permalink-schema.html"
|