codeslinger-jekyll 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,4 +1,22 @@
1
- ==
1
+ == 0.5.0 / 2009-04-07
2
+ * Minor Enhancements
3
+ * Ability to set post categories via YAML [github.com/qrush]
4
+ * Ability to set prevent a post from publishing via YAML [github.com/qrush]
5
+ * Add textilize filter [github.com/willcodeforfoo]
6
+ * Add 'pretty' permalink style for wordpress-like urls [github.com/dysinger]
7
+ * Made it possible to enter categories from YAML as an array [github.com/Chrononaut]
8
+ * Ignore Emacs autosave files [github.com/Chrononaut]
9
+ * Bug Fixes
10
+ * Use block syntax of popen4 to ensure that subprocesses are properly disposed [github.com/jqr]
11
+ * Close open4 streams to prevent zombies [github.com/rtomayko]
12
+ * Only query required fields from the WP Database [github.com/ariejan]
13
+ * Prevent _posts from being copied to the destination directory [github.com/bdimcheff]
14
+ * Refactors
15
+ * Factored the filtering code into a method [github.com/Chrononaut]
16
+ * Fix tests and convert to Shoulda [github.com/qrush, github.com/technicalpickles]
17
+ * Add Cucumber acceptance test suite [github.com/qrush, github.com/technicalpickles]
18
+
19
+ == 0.4.1
2
20
  * Minor Enhancements
3
21
  * Changed date format on wordpress converter (zeropadding) [github.com/dysinger]
4
22
  * Bug Fixes
data/README.textile CHANGED
@@ -113,30 +113,40 @@ And if you don't want to be in the proto site root to run Jekyll:
113
113
 
114
114
  h2. Run Options
115
115
 
116
+ h3. Autobuild
117
+
116
118
  There is an autobuild feature that will regenerate your site if any of the
117
119
  files change. The autobuild feature can be used on any of the invocations:
118
120
 
119
121
  $ jekyll --auto
120
122
 
123
+ h3. Related Posts
124
+
121
125
  By default, the "related posts" functionality will produce crappy results.
122
126
  In order to get high quality results with a true LSI algorithm, you must
123
127
  enable it (it may take some time to run if you have many posts):
124
128
 
125
129
  $ jekyll --lsi
126
130
 
131
+ h3. Code Highlighting
132
+
127
133
  For static code highlighting, you can install Pygments (see below) and then
128
134
  use that to make your code blocks look pretty. To activate Pygments support
129
135
  during the conversion:
130
136
 
131
137
  $ jekyll --pygments
132
138
 
139
+ h3. Markdown Processor
140
+
133
141
  By default, Jekyll uses "Maruku":http://maruku.rubyforge.org (pure Ruby) for
134
142
  Markdown support. If you'd like to use RDiscount (faster, but requires
135
143
  compilation), you must install it (gem install rdiscount) and then you can
136
144
  have it used instead:
137
145
 
138
146
  $ jekyll --rdiscount
139
-
147
+
148
+ h3. Local Server
149
+
140
150
  When previewing complex sites locally, simply opening the site in a web
141
151
  browser (using file://) can cause problems with links that are relative to
142
152
  the site root (e.g., "/stylesheets/style.css"). To get around this, Jekyll
@@ -145,16 +155,61 @@ Default port is 4000:
145
155
 
146
156
  $ jekyll --server [PORT]
147
157
 
158
+ h3. Permalink Style
159
+
148
160
  By default, the permalink for each post begins with its date in 'YYYY/MM/DD'
149
- format. If you do not wish to have the date appear in the URL of each post,
161
+ format.
162
+
163
+ If you do not wish to have the date appear in the URL of each post,
150
164
  you can change the permalink style to 'none' so that only the 'slug' part of
151
165
  the filename is used. For example, with the permalink style set to 'none' the
152
166
  file '2009-01-01-happy-new-year.markdown' will have a permalink like
153
167
  'http://yoursite.com/happy-new-year.html'. The date of the post will still be
154
168
  read from the filename (and is required!) to be used elsewhere in Jekyll.
155
- Example usage:
156
169
 
157
- $ jekyll --permalink none
170
+ If you want WordPress-style pretty URLs that leave off the .html, you can
171
+ change the permalink style to 'pretty' and directories corresponding to the
172
+ date parts and post name will be made and an index.html will be placed in the
173
+ leaf directory resulting in URLs like 2008/11/17/blogging-like-a-hacker/.
174
+
175
+ $ jekyll --permalink [date|none|pretty]
176
+
177
+ h2. Configuration File
178
+
179
+ All of the options listed above can be specified on a site-by-site basis in
180
+ a '_config.yml' file at the root of the site's source. As the filename
181
+ suggests, the configuration is given in "YAML":http://www.yaml.org/. As
182
+ well as all of the options discussed in the last section, there are a few
183
+ additional options:
184
+
185
+ destination: [PATH] # Specify where the site should be rendered
186
+ markdown: [maruku|rdiscount] # Which markdown renderer to use?
187
+
188
+ maruku: # This is a YAML hash for Maruku settings
189
+ use_divs: [BOOLEAN] # Use the div element Maruku extension
190
+ use_tex: [BOOLEAN] # Use the LaTeX extension to Maruku
191
+ png_dir: [PATH] # Where should the math PNGs be stored?
192
+ png_url: [URL] # A relative URL for the PNGs
193
+
194
+ The default configuration is shown below as in YAML format:
195
+
196
+ destination: ./_site
197
+ auto: false
198
+ lsi: false
199
+ server_port: 4000
200
+ pygments: false
201
+ markdown: maruku
202
+ permalink: date
203
+
204
+ maruku:
205
+ use_tex: false
206
+ use_divs: false
207
+ png_dir: images/latex
208
+ png_url: /images/latex
209
+
210
+ Parameters set in a configuration file override the default values. Parameters
211
+ set using command line options override both the default values and those set
212
+ in a configuration file.
158
213
 
159
214
  h2. Data
160
215
 
@@ -255,6 +310,15 @@ h3. Predefined Post Variables
255
310
  /year/month/day/title.html then you can set this variable and it will
256
311
  be used as the final URL.
257
312
 
313
+ published
314
+ Set to false if you don't want a post to show up when the site is
315
+ generated.
316
+
317
+ category/categories
318
+ Instead of placing posts inside of folders, you can specify one or more
319
+ categories that the post belongs to. When the site is generated the post
320
+ will act as though it had been set with these categories normally.
321
+
258
322
  h3. Custom Variables
259
323
 
260
324
  Any variables in the front matter that are not predefined are mixed into the
@@ -306,6 +370,12 @@ Convert an array into a sentence.
306
370
  becomes
307
371
 
308
372
  foo, bar, and baz
373
+
374
+ h3. Textilize
375
+
376
+ Convert a Textile-formatted string into HTML, formatted via RedCloth
377
+
378
+ {{ page.excerpt | textilize }}
309
379
 
310
380
  h3. Include (Tag)
311
381
 
@@ -372,7 +442,7 @@ within a Liquid template as follows:
372
442
 
373
443
  <pre>
374
444
  {% for post in site.categories.foo %}
375
- <li><span>{{ post.date | date_to_string }}</span> - {{ post.title }}</li>
445
+ <li><span>{{ post.date | date_to_string }}</span> - {{ post.title }}</li>
376
446
  {% endfor %}
377
447
  </pre>
378
448
 
data/Rakefile ADDED
@@ -0,0 +1,91 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ begin
6
+ gem 'jeweler', '>= 0.11.0'
7
+ require 'jeweler'
8
+ Jeweler::Tasks.new do |s|
9
+ s.name = "jekyll"
10
+ s.summary = %Q{Jekyll is a simple, blog aware, static site generator.}
11
+ s.email = "tom@mojombo.com"
12
+ s.homepage = "http://github.com/mojombo/jekyll"
13
+ s.description = "Jekyll is a simple, blog aware, static site generator."
14
+ s.authors = ["Tom Preston-Werner"]
15
+ s.rubyforge_project = "jekyll"
16
+ s.files.exclude 'test/dest'
17
+ s.test_files.exclude 'test/dest'
18
+ s.add_dependency('RedCloth', '>= 4.0.4')
19
+ s.add_dependency('liquid', '>= 1.9.0')
20
+ s.add_dependency('classifier', '>= 1.3.1')
21
+ s.add_dependency('maruku', '>= 0.5.9')
22
+ s.add_dependency('directory_watcher', '>= 1.1.1')
23
+ s.add_dependency('open4', '>= 0.9.6')
24
+ end
25
+ rescue LoadError
26
+ puts "Jeweler not available. Install it with: sudo gem install jeweler --version '>= 0.11.0'"
27
+ exit(1)
28
+ end
29
+
30
+ Rake::TestTask.new do |t|
31
+ t.libs << 'lib'
32
+ t.pattern = 'test/**/test_*.rb'
33
+ t.verbose = false
34
+ end
35
+
36
+ Rake::RDocTask.new do |rdoc|
37
+ rdoc.rdoc_dir = 'rdoc'
38
+ rdoc.title = 'jekyll'
39
+ rdoc.options << '--line-numbers' << '--inline-source'
40
+ rdoc.rdoc_files.include('README*')
41
+ rdoc.rdoc_files.include('lib/**/*.rb')
42
+ end
43
+
44
+ begin
45
+ require 'rcov/rcovtask'
46
+ Rcov::RcovTask.new do |t|
47
+ t.libs << 'test'
48
+ t.test_files = FileList['test/**/test_*.rb']
49
+ t.verbose = true
50
+ end
51
+ rescue LoadError
52
+ end
53
+
54
+ task :default => [:test, :features]
55
+
56
+ # console
57
+
58
+ desc "Open an irb session preloaded with this library"
59
+ task :console do
60
+ sh "irb -rubygems -I lib -r jekyll.rb"
61
+ end
62
+
63
+ # converters
64
+
65
+ namespace :convert do
66
+ desc "Migrate from mephisto in the current directory"
67
+ task :mephisto do
68
+ sh %q(ruby -r './lib/jekyll/converters/mephisto' -e 'Jekyll::Mephisto.postgres(:database => "#{ENV["DB"]}")')
69
+ end
70
+ desc "Migrate from Movable Type in the current directory"
71
+ task :mt do
72
+ sh %q(ruby -r './lib/jekyll/converters/mt' -e 'Jekyll::MT.process("#{ENV["DB"]}", "#{ENV["USER"]}", "#{ENV["PASS"]}")')
73
+ end
74
+ desc "Migrate from Typo in the current directory"
75
+ task :typo do
76
+ sh %q(ruby -r './lib/jekyll/converters/typo' -e 'Jekyll::Typo.process("#{ENV["DB"]}", "#{ENV["USER"]}", "#{ENV["PASS"]}")')
77
+ end
78
+ end
79
+
80
+ begin
81
+ require 'cucumber/rake/task'
82
+
83
+ Cucumber::Rake::Task.new(:features) do |t|
84
+ t.cucumber_opts = "--format pretty"
85
+ end
86
+ rescue LoadError
87
+ desc 'Cucumber rake task not available'
88
+ task :features do
89
+ abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
90
+ end
91
+ end
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :minor: 4
3
- :patch: 1
4
2
  :major: 0
3
+ :minor: 5
4
+ :patch: 0
data/bin/jekyll CHANGED
@@ -9,62 +9,78 @@ Basic Command Line Usage:
9
9
  jekyll # . -> ./_site
10
10
  jekyll <path to write generated site> # . -> <path>
11
11
  jekyll <path to source> <path to write generated site> # <path> -> <path>
12
-
13
- Options:
12
+
13
+ Configuration is read from '<source>/_config.yaml' but can be overriden
14
+ using the following options:
15
+
14
16
  HELP
15
17
 
16
18
  require 'optparse'
17
19
  require 'jekyll'
18
20
 
21
+ exec = {}
19
22
  options = {}
20
-
21
23
  opts = OptionParser.new do |opts|
22
24
  opts.banner = help
23
25
 
24
26
  opts.on("--auto", "Auto-regenerate") do
25
- options[:auto] = true
27
+ options['auto'] = true
28
+ end
29
+
30
+ opts.on("--no-auto", "No auto-regenerate") do
31
+ options['auto'] = false
26
32
  end
27
-
33
+
28
34
  opts.on("--server [PORT]", "Start web server (default port 4000)") do |port|
29
- options[:server] = true
30
- options[:server_port] = port || 4000
35
+ options['server'] = true
36
+ options['server_port'] = port unless port.nil?
31
37
  end
32
-
38
+
33
39
  opts.on("--lsi", "Use LSI for better related posts") do
34
- Jekyll.lsi = true
40
+ options['lsi'] = true
35
41
  end
36
-
42
+
37
43
  opts.on("--pygments", "Use pygments to highlight code") do
38
- Jekyll.pygments = true
44
+ options['pygments'] = true
39
45
  end
40
-
46
+
41
47
  opts.on("--rdiscount", "Use rdiscount gem for Markdown") do
42
- begin
43
- require 'rdiscount'
44
- Jekyll.markdown_proc = Proc.new { |x| RDiscount.new(x).to_html }
45
- puts 'Using rdiscount for Markdown'
46
- rescue LoadError
47
- puts 'You must have the rdiscount gem installed first'
48
- end
48
+ options['markdown'] = 'rdiscount'
49
49
  end
50
-
51
- opts.on("--permalink [TYPE]", "Use 'date' (default) for YYYY/MM/DD") do |style|
52
- Jekyll.permalink_style = (style || 'date').to_sym
50
+
51
+ opts.on("--permalink [TYPE]", "Use 'date' (default) for YYYY/MM/DD") do |style|
52
+ options['permalink'] = style unless style.nil?
53
53
  end
54
-
54
+
55
55
  opts.on("--version", "Display current version") do
56
56
  puts "Jekyll " + Jekyll.version
57
57
  exit 0
58
58
  end
59
59
  end
60
60
 
61
+ # Read command line options into `options` hash
61
62
  opts.parse!
62
63
 
63
- def clean(dest)
64
- FileUtils.rm_rf(dest)
65
- FileUtils.mkdir_p(dest)
64
+ # Get source and destintation from command line
65
+ case ARGV.size
66
+ when 0
67
+ when 1
68
+ options['destination'] = ARGV[0]
69
+ when 2
70
+ options['source'] = ARGV[0]
71
+ options['destination'] = ARGV[1]
72
+ else
73
+ puts "Invalid options. Run `jekyll --help` for assistance."
74
+ exit(1)
66
75
  end
67
76
 
77
+ options = Jekyll.configuration(options)
78
+
79
+ # Get source and destination directories (possibly set by config file)
80
+ source = options['source']
81
+ destination = options['destination']
82
+
83
+ # Files to watch
68
84
  def globs(source)
69
85
  Dir.chdir(source) do
70
86
  dirs = Dir['*'].select { |x| File.directory?(x) }
@@ -74,63 +90,51 @@ def globs(source)
74
90
  end
75
91
  end
76
92
 
77
- source = nil
78
- destination = nil
93
+ # Create the Site
94
+ site = Jekyll::Site.new(options)
79
95
 
80
- case ARGV.size
81
- when 0
82
- source = '.'
83
- destination = File.join('.', '_site')
84
- when 1
85
- source = '.'
86
- destination = ARGV[0]
87
- when 2
88
- source = ARGV[0]
89
- destination = ARGV[1]
90
- else
91
- puts "Invalid options. Run `jekyll --help` for assistance."
92
- exit(1)
93
- end
94
-
95
- if options[:auto]
96
+ # Run the directory watcher for auto-generation, if required
97
+ if options['auto']
96
98
  require 'directory_watcher'
97
99
 
98
100
  puts "Auto-regenerating enabled: #{source} -> #{destination}"
99
-
101
+
100
102
  dw = DirectoryWatcher.new(source)
101
103
  dw.interval = 1
102
104
  dw.glob = globs(source)
103
-
105
+
104
106
  dw.add_observer do |*args|
105
107
  t = Time.now.strftime("%Y-%m-%d %H:%M:%S")
106
108
  puts "[#{t}] regeneration: #{args.size} files changed"
107
- Jekyll.process(source, destination)
109
+ site.process
108
110
  end
109
-
111
+
110
112
  dw.start
111
-
112
- unless options[:server]
113
+
114
+ unless options['server']
113
115
  loop { sleep 1000 }
114
116
  end
115
117
  else
116
- Jekyll.process(source, destination)
117
- puts "Successfully generated site in #{destination}"
118
+ puts "Building site: #{source} -> #{destination}"
119
+ site.process
120
+ puts "Successfully generated site: #{source} -> #{destination}"
118
121
  end
119
122
 
120
- if options[:server]
123
+ # Run the server on the specified port, if required
124
+ if options['server']
121
125
  require 'webrick'
122
126
  include WEBrick
123
-
127
+
124
128
  FileUtils.mkdir_p(destination)
125
129
 
126
130
  s = HTTPServer.new(
127
- :Port => options[:server_port],
131
+ :Port => options['server_port'],
128
132
  :DocumentRoot => destination
129
133
  )
130
134
  t = Thread.new {
131
135
  s.start
132
136
  }
133
-
137
+
134
138
  trap("INT") { s.shutdown }
135
139
  t.join()
136
140
  end