matflores-jekyll 0.4.3 → 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,4 @@
1
- ==
1
+ == 0.5.0 / 2009-04-07
2
2
  * Minor Enhancements
3
3
  * Ability to set post categories via YAML [github.com/qrush]
4
4
  * Ability to set prevent a post from publishing via YAML [github.com/qrush]
@@ -13,6 +13,8 @@
13
13
  * Prevent _posts from being copied to the destination directory [github.com/bdimcheff]
14
14
  * Refactors
15
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]
16
18
 
17
19
  == 0.4.1
18
20
  * Minor Enhancements
data/README.textile CHANGED
@@ -174,6 +174,43 @@ leaf directory resulting in URLs like 2008/11/17/blogging-like-a-hacker/.
174
174
 
175
175
  $ jekyll --permalink [date|none|pretty]
176
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.
213
+
177
214
  h2. Data
178
215
 
179
216
  Jekyll traverses your site looking for files to process. Any files with YAML
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
data/lib/jekyll.rb CHANGED
@@ -13,22 +13,6 @@ require 'yaml'
13
13
  # 3rd party
14
14
  require 'liquid'
15
15
  require 'redcloth'
16
- begin
17
- require 'maruku'
18
- require 'maruku/ext/math'
19
- # Switch off MathML output
20
- MaRuKu::Globals[:html_math_output_mathml] = false
21
- MaRuKu::Globals[:html_math_engine] = 'none'
22
-
23
- # Turn on math to PNG support with blahtex
24
- # Resulting PNGs stored in `images/latex`
25
- MaRuKu::Globals[:html_math_output_png] = true
26
- MaRuKu::Globals[:html_png_engine] = 'blahtex'
27
- MaRuKu::Globals[:html_png_dir] = 'images/latex'
28
- MaRuKu::Globals[:html_png_url] = '/images/latex/'
29
- rescue LoadError
30
- puts "The maruku gem is required for markdown support!"
31
- end
32
16
 
33
17
  # internal requires
34
18
  require 'jekyll/core_ext'
@@ -45,23 +29,55 @@ require 'jekyll/tags/include'
45
29
  require 'jekyll/albino'
46
30
 
47
31
  module Jekyll
48
- class << self
49
- attr_accessor :source, :dest, :lsi, :pygments, :markdown_proc, :content_type, :permalink_style
50
- end
51
-
52
- Jekyll.lsi = false
53
- Jekyll.pygments = false
54
- Jekyll.markdown_proc = Proc.new { |x| Maruku.new(x).to_html }
55
- Jekyll.permalink_style = :date
56
-
57
- def self.process(source, dest)
58
- require 'classifier' if Jekyll.lsi
59
-
60
- Jekyll.source = source
61
- Jekyll.dest = dest
62
- Jekyll::Site.new(source, dest).process
32
+ # Default options. Overriden by values in _config.yaml or command-line opts.
33
+ # (Strings rather symbols used for compatability with YAML)
34
+ DEFAULTS = {
35
+ 'auto' => false,
36
+ 'server' => false,
37
+ 'server_port' => 4000,
38
+
39
+ 'source' => '.',
40
+ 'destination' => File.join('.', '_site'),
41
+
42
+ 'lsi' => false,
43
+ 'pygments' => false,
44
+ 'markdown' => 'maruku',
45
+ 'permalink' => 'date',
46
+
47
+ 'maruku' => {
48
+ 'use_tex' => false,
49
+ 'use_divs' => false,
50
+ 'png_engine' => 'blahtex',
51
+ 'png_dir' => 'images/latex',
52
+ 'png_url' => '/images/latex'
53
+ }
54
+ }
55
+
56
+ # Generate a Jekyll configuration Hash by merging the default options
57
+ # with anything in _config.yml, and adding the given options on top
58
+ # +override+ is a Hash of config directives
59
+ #
60
+ # Returns Hash
61
+ def self.configuration(override)
62
+ # _config.yml may override default source location, but until
63
+ # then, we need to know where to look for _config.yml
64
+ source = override['source'] || Jekyll::DEFAULTS['source']
65
+
66
+ # Get configuration from <source>/_config.yaml
67
+ config = {}
68
+ config_file = File.join(source, '_config.yml')
69
+ begin
70
+ config = YAML.load_file(config_file)
71
+ puts "Configuration from #{config_file}"
72
+ rescue => err
73
+ puts "WARNING: Could not read configuration. Using defaults (and options)."
74
+ puts "\t" + err
75
+ end
76
+
77
+ # Merge DEFAULTS < _config.yml < override
78
+ Jekyll::DEFAULTS.deep_merge(config).deep_merge(override)
63
79
  end
64
-
80
+
65
81
  def self.version
66
82
  yml = YAML.load(File.read(File.join(File.dirname(__FILE__), *%w[.. VERSION.yml])))
67
83
  "#{yml[:major]}.#{yml[:minor]}.#{yml[:patch]}"
data/lib/jekyll/albino.rb CHANGED
@@ -38,7 +38,7 @@
38
38
  #
39
39
  # To see all lexers and formatters available, run `pygmentize -L`.
40
40
  #
41
- # Chris Wanstrath // chris@ozmm.org
41
+ # Chris Wanstrath // chris@ozmm.org
42
42
  # GitHub // http://github.com
43
43
  #
44
44
  require 'open4'