qrush-jekyll 0.3.0.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/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ require 'rubygems'
2
+ require 'hoe'
3
+ require 'lib/jekyll'
4
+
5
+ Hoe.new('jekyll', Jekyll::VERSION) do |p|
6
+ p.developer('Tom Preston-Werner', 'tom@mojombo.com')
7
+ p.summary = "Jekyll is a simple, blog aware, static site generator."
8
+ p.extra_deps = ['RedCloth', 'liquid', 'classifier', 'maruku', 'directory_watcher', 'open4']
9
+ end
10
+
11
+ desc "Open an irb session preloaded with this library"
12
+ task :console do
13
+ sh "irb -rubygems -r ./lib/jekyll.rb"
14
+ end
15
+
16
+ namespace :convert do
17
+ desc "Migrate from mephisto in the current directory"
18
+ task :mephisto do
19
+ sh %q(ruby -r './lib/jekyll/converters/mephisto' -e 'Jekyll::Mephisto.postgres(:database => "#{ENV["DB"]}")')
20
+ end
21
+ desc "Migrate from Movable Type in the current directory"
22
+ task :mt do
23
+ sh %q(ruby -r './lib/jekyll/converters/mt' -e 'Jekyll::MT.process("#{ENV["DB"]}", "#{ENV["USER"]}", "#{ENV["PASS"]}")')
24
+ end
25
+ desc "Migrate from Typo in the current directory"
26
+ task :typo do
27
+ sh %q(ruby -r './lib/jekyll/converters/typo' -e 'Jekyll::Typo.process("#{ENV["DB"]}", "#{ENV["USER"]}", "#{ENV["PASS"]}")')
28
+ end
29
+ end
data/bin/jekyll ADDED
@@ -0,0 +1,127 @@
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
+
13
+ Options:
14
+ HELP
15
+
16
+ require 'optparse'
17
+ require 'jekyll'
18
+
19
+ options = {}
20
+
21
+ opts = OptionParser.new do |opts|
22
+ opts.banner = help
23
+
24
+ opts.on("--auto", "Auto-regenerate") do
25
+ options[:auto] = true
26
+ end
27
+
28
+ opts.on("--server [PORT]", "Start web server (default port 4000)") do |port|
29
+ options[:server] = true
30
+ options[:server_port] = port || 4000
31
+ end
32
+
33
+ opts.on("--lsi", "Use LSI for better related posts") do
34
+ Jekyll.lsi = true
35
+ end
36
+
37
+ opts.on("--pygments", "Use pygments to highlight code") do
38
+ Jekyll.pygments = true
39
+ end
40
+
41
+ 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
49
+ end
50
+ end
51
+
52
+ opts.parse!
53
+
54
+ def clean(dest)
55
+ FileUtils.rm_rf(dest)
56
+ FileUtils.mkdir_p(dest)
57
+ end
58
+
59
+ def globs(source)
60
+ Dir.chdir(source) do
61
+ dirs = Dir['*'].select { |x| File.directory?(x) }
62
+ dirs -= ['_site']
63
+ dirs = dirs.map { |x| "#{x}/**/*" }
64
+ dirs += ['*']
65
+ end
66
+ end
67
+
68
+ source = nil
69
+ destination = nil
70
+
71
+ case ARGV.size
72
+ when 0
73
+ source = '.'
74
+ destination = File.join('.', '_site')
75
+ when 1
76
+ source = '.'
77
+ destination = ARGV[0]
78
+ when 2
79
+ source = ARGV[0]
80
+ destination = ARGV[1]
81
+ else
82
+ puts "Invalid options. Run `jekyll --help` for assistance."
83
+ exit(1)
84
+ end
85
+
86
+ if options[:auto]
87
+ require 'directory_watcher'
88
+
89
+ puts "Auto-regenerating enabled: #{source} -> #{destination}"
90
+
91
+ dw = DirectoryWatcher.new(source)
92
+ dw.interval = 1
93
+ dw.glob = globs(source)
94
+
95
+ dw.add_observer do |*args|
96
+ t = Time.now.strftime("%Y-%m-%d %H:%M:%S")
97
+ puts "[#{t}] regeneration: #{args.size} files changed"
98
+ Jekyll.process(source, destination)
99
+ end
100
+
101
+ dw.start
102
+
103
+ unless options[:server]
104
+ loop { sleep 1000 }
105
+ end
106
+ else
107
+ Jekyll.process(source, destination)
108
+ puts "Successfully generated site in #{destination}"
109
+ end
110
+
111
+ if options[:server]
112
+ require 'webrick'
113
+ include WEBrick
114
+
115
+ FileUtils.mkdir_p(destination)
116
+
117
+ s = HTTPServer.new(
118
+ :Port => options[:server_port],
119
+ :DocumentRoot => destination
120
+ )
121
+ t = Thread.new {
122
+ s.start
123
+ }
124
+
125
+ trap("INT") { s.shutdown }
126
+ t.join()
127
+ end
data/jekyll.gemspec ADDED
@@ -0,0 +1,51 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{jekyll}
3
+ s.version = "0.3.0.1"
4
+
5
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
+ s.authors = ["Tom Preston-Werner"]
7
+ s.date = %q{2008-12-24}
8
+ s.default_executable = %q{jekyll}
9
+ s.email = ["tom@mojombo.com"]
10
+ s.executables = ["jekyll"]
11
+ s.extra_rdoc_files = ["History.txt", "Manifest.txt"]
12
+ s.files = ["History.txt", "Manifest.txt", "README.textile", "Rakefile", "bin/jekyll", "jekyll.gemspec", "lib/jekyll.rb", "lib/jekyll/albino.rb", "lib/jekyll/converters/csv.rb", "lib/jekyll/converters/mephisto.rb", "lib/jekyll/converters/mt.rb", "lib/jekyll/converters/wordpress.rb", "lib/jekyll/convertible.rb", "lib/jekyll/core_ext.rb", "lib/jekyll/filters.rb", "lib/jekyll/layout.rb", "lib/jekyll/page.rb", "lib/jekyll/post.rb", "lib/jekyll/site.rb", "lib/jekyll/tags/highlight.rb", "lib/jekyll/tags/include.rb", "test/helper.rb", "test/source/_includes/sig.markdown", "test/source/_layouts/default.html", "test/source/_layouts/simple.html", "test/source/_posts/2008-10-18-foo-bar.textile", "test/source/_posts/2008-11-21-complex.textile", "test/source/_posts/2008-12-03-permalinked-post.textile", "test/source/_posts/2008-12-13-include.markdown", "test/source/css/screen.css", "test/source/index.html", "test/suite.rb", "test/test_generated_site.rb", "test/test_jekyll.rb", "test/test_post.rb", "test/test_site.rb"]
13
+ s.has_rdoc = true
14
+ s.rdoc_options = ["--main", "README.txt"]
15
+ s.require_paths = ["lib"]
16
+ s.rubyforge_project = %q{jekyll}
17
+ s.rubygems_version = %q{1.3.0}
18
+ s.summary = %q{Jekyll is a simple, blog aware, static site generator.}
19
+ s.test_files = ["test/test_generated_site.rb", "test/test_jekyll.rb", "test/test_post.rb", "test/test_site.rb"]
20
+
21
+ if s.respond_to? :specification_version then
22
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
+ s.specification_version = 2
24
+
25
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
26
+ s.add_runtime_dependency(%q<RedCloth>, [">= 0"])
27
+ s.add_runtime_dependency(%q<liquid>, [">= 0"])
28
+ s.add_runtime_dependency(%q<classifier>, [">= 0"])
29
+ s.add_runtime_dependency(%q<maruku>, [">= 0"])
30
+ s.add_runtime_dependency(%q<directory_watcher>, [">= 0"])
31
+ s.add_runtime_dependency(%q<open4>, [">= 0"])
32
+ s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
33
+ else
34
+ s.add_dependency(%q<RedCloth>, [">= 0"])
35
+ s.add_dependency(%q<liquid>, [">= 0"])
36
+ s.add_dependency(%q<classifier>, [">= 0"])
37
+ s.add_dependency(%q<maruku>, [">= 0"])
38
+ s.add_dependency(%q<directory_watcher>, [">= 0"])
39
+ s.add_dependency(%q<open4>, [">= 0"])
40
+ s.add_dependency(%q<hoe>, [">= 1.8.0"])
41
+ end
42
+ else
43
+ s.add_dependency(%q<RedCloth>, [">= 0"])
44
+ s.add_dependency(%q<liquid>, [">= 0"])
45
+ s.add_dependency(%q<classifier>, [">= 0"])
46
+ s.add_dependency(%q<maruku>, [">= 0"])
47
+ s.add_dependency(%q<directory_watcher>, [">= 0"])
48
+ s.add_dependency(%q<open4>, [">= 0"])
49
+ s.add_dependency(%q<hoe>, [">= 1.8.0"])
50
+ end
51
+ end
data/lib/jekyll.rb ADDED
@@ -0,0 +1,63 @@
1
+ $:.unshift File.dirname(__FILE__) # For use/testing when no gem is installed
2
+
3
+ # rubygems
4
+ require 'rubygems'
5
+
6
+ # core
7
+ require 'fileutils'
8
+ require 'time'
9
+ require 'yaml'
10
+
11
+ # stdlib
12
+
13
+ # 3rd party
14
+ require 'liquid'
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
+
33
+ # internal requires
34
+ require 'jekyll/core_ext'
35
+ require 'jekyll/site'
36
+ require 'jekyll/convertible'
37
+ require 'jekyll/layout'
38
+ require 'jekyll/page'
39
+ require 'jekyll/post'
40
+ require 'jekyll/filters'
41
+ require 'jekyll/tags/highlight'
42
+ require 'jekyll/tags/include'
43
+ require 'jekyll/albino'
44
+
45
+ module Jekyll
46
+ VERSION = '0.3.0'
47
+
48
+ class << self
49
+ attr_accessor :source, :dest, :lsi, :pygments, :markdown_proc
50
+ end
51
+
52
+ Jekyll.lsi = false
53
+ Jekyll.pygments = false
54
+ Jekyll.markdown_proc = Proc.new { |x| Maruku.new(x).to_html }
55
+
56
+ def self.process(source, dest)
57
+ require 'classifier' if Jekyll.lsi
58
+
59
+ Jekyll.source = source
60
+ Jekyll.dest = dest
61
+ Jekyll::Site.new(source, dest).process
62
+ end
63
+ end
@@ -0,0 +1,116 @@
1
+ ##
2
+ # Wrapper for the Pygments command line tool, pygmentize.
3
+ #
4
+ # Pygments: http://pygments.org/
5
+ #
6
+ # Assumes pygmentize is in the path. If not, set its location
7
+ # with Albino.bin = '/path/to/pygmentize'
8
+ #
9
+ # Use like so:
10
+ #
11
+ # @syntaxer = Albino.new('/some/file.rb', :ruby)
12
+ # puts @syntaxer.colorize
13
+ #
14
+ # This'll print out an HTMLized, Ruby-highlighted version
15
+ # of '/some/file.rb'.
16
+ #
17
+ # To use another formatter, pass it as the third argument:
18
+ #
19
+ # @syntaxer = Albino.new('/some/file.rb', :ruby, :bbcode)
20
+ # puts @syntaxer.colorize
21
+ #
22
+ # You can also use the #colorize class method:
23
+ #
24
+ # puts Albino.colorize('/some/file.rb', :ruby)
25
+ #
26
+ # Another also: you get a #to_s, for somewhat nicer use in Rails views.
27
+ #
28
+ # ... helper file ...
29
+ # def highlight(text)
30
+ # Albino.new(text, :ruby)
31
+ # end
32
+ #
33
+ # ... view file ...
34
+ # <%= highlight text %>
35
+ #
36
+ # The default lexer is 'text'. You need to specify a lexer yourself;
37
+ # because we are using STDIN there is no auto-detect.
38
+ #
39
+ # To see all lexers and formatters available, run `pygmentize -L`.
40
+ #
41
+ # Chris Wanstrath // chris@ozmm.org
42
+ # GitHub // http://github.com
43
+ #
44
+ require 'open4'
45
+
46
+ class Albino
47
+ @@bin = Rails.development? ? 'pygmentize' : '/usr/bin/pygmentize' rescue 'pygmentize'
48
+
49
+ def self.bin=(path)
50
+ @@bin = path
51
+ end
52
+
53
+ def self.colorize(*args)
54
+ new(*args).colorize
55
+ end
56
+
57
+ def initialize(target, lexer = :text, format = :html)
58
+ @target = File.exists?(target) ? File.read(target) : target rescue target
59
+ @options = { :l => lexer, :f => format }
60
+ end
61
+
62
+ def execute(command)
63
+ pid, stdin, stdout, stderr = Open4.popen4(command)
64
+ stdin.puts @target
65
+ stdin.close
66
+ stdout.read.strip
67
+ end
68
+
69
+ def colorize(options = {})
70
+ execute @@bin + convert_options(options)
71
+ end
72
+ alias_method :to_s, :colorize
73
+
74
+ def convert_options(options = {})
75
+ @options.merge(options).inject('') do |string, (flag, value)|
76
+ string + " -#{flag} #{value}"
77
+ end
78
+ end
79
+ end
80
+
81
+ if $0 == __FILE__
82
+ require 'rubygems'
83
+ require 'test/spec'
84
+ require 'mocha'
85
+ begin require 'redgreen'; rescue LoadError; end
86
+
87
+ context "Albino" do
88
+ setup do
89
+ @syntaxer = Albino.new(__FILE__, :ruby)
90
+ end
91
+
92
+ specify "defaults to text" do
93
+ syntaxer = Albino.new(__FILE__)
94
+ syntaxer.expects(:execute).with('pygmentize -f html -l text').returns(true)
95
+ syntaxer.colorize
96
+ end
97
+
98
+ specify "accepts options" do
99
+ @syntaxer.expects(:execute).with('pygmentize -f html -l ruby').returns(true)
100
+ @syntaxer.colorize
101
+ end
102
+
103
+ specify "works with strings" do
104
+ syntaxer = Albino.new('class New; end', :ruby)
105
+ assert_match %r(highlight), syntaxer.colorize
106
+ end
107
+
108
+ specify "aliases to_s" do
109
+ assert_equal @syntaxer.colorize, @syntaxer.to_s
110
+ end
111
+
112
+ specify "class method colorize" do
113
+ assert_equal @syntaxer.colorize, Albino.colorize(__FILE__, :ruby)
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,26 @@
1
+ module Jekyll
2
+ module CSV
3
+ #Reads a csv with title, permalink, body, published_at, and filter.
4
+ #It creates a post file for each row in the csv
5
+ def self.process(file = "posts.csv")
6
+ FileUtils.mkdir_p "_posts"
7
+ posts = 0
8
+ FasterCSV.foreach(file) do |row|
9
+ next if row[0] == "title"
10
+ posts += 1
11
+ name = row[3].split(" ")[0]+"-"+row[1]+(row[4] =~ /markdown/ ? ".markdown" : ".textile")
12
+ File.open("_posts/#{name}", "w") do |f|
13
+ f.puts <<-HEADER
14
+ ---
15
+ layout: post
16
+ title: #{row[0]}
17
+ ---
18
+
19
+ HEADER
20
+ f.puts row[2]
21
+ end
22
+ end
23
+ "Created #{posts} posts!"
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ require 'rubygems'
2
+ require 'fastercsv'
3
+ require 'fileutils'
4
+ require File.join(File.dirname(__FILE__),"csv.rb")
5
+ module Jekyll
6
+ module Mephisto
7
+ #Accepts a hash with database config variables, exports mephisto posts into a csv
8
+ #export PGPASSWORD if you must
9
+ def self.postgres(c)
10
+ sql = <<-SQL
11
+ BEGIN;
12
+ CREATE TEMP TABLE jekyll AS
13
+ SELECT title, permalink, body, published_at, filter FROM contents
14
+ WHERE user_id = 1 AND type = 'Article' ORDER BY published_at;
15
+ COPY jekyll TO STDOUT WITH CSV HEADER;
16
+ ROLLBACK;
17
+ SQL
18
+ command = %Q(psql -h #{c[:host] || "localhost"} -c "#{sql.strip}" #{c[:database]} #{c[:username]} -o #{c[:filename] || "posts.csv"})
19
+ puts command
20
+ `#{command}`
21
+ CSV.process
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,59 @@
1
+ # Created by Nick Gerakines, open source and publically available under the
2
+ # MIT license. Use this module at your own risk.
3
+ # I'm an Erlang/Perl/C++ guy so please forgive my dirty ruby.
4
+
5
+ require 'rubygems'
6
+ require 'sequel'
7
+ require 'fileutils'
8
+
9
+ # NOTE: This converter requires Sequel and the MySQL gems.
10
+ # The MySQL gem can be difficult to install on OS X. Once you have MySQL
11
+ # installed, running the following commands should work:
12
+ # $ sudo gem install sequel
13
+ # $ sudo gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
14
+
15
+ module Jekyll
16
+ module MT
17
+ # This query will pull blog posts from all entries across all blogs. If
18
+ # you've got unpublished, deleted or otherwise hidden posts please sift
19
+ # through the created posts to make sure nothing is accidently published.
20
+ QUERY = "SELECT entry_id, entry_basename, entry_text, entry_text_more, entry_created_on, entry_title FROM mt_entry"
21
+
22
+ def self.process(dbname, user, pass, host = 'localhost')
23
+ db = Sequel.mysql(dbname, :user => user, :password => pass, :host => host)
24
+
25
+ FileUtils.mkdir_p "_posts"
26
+
27
+ db[QUERY].each do |post|
28
+ title = post[:entry_title]
29
+ slug = post[:entry_basename]
30
+ date = post[:entry_created_on]
31
+ content = post[:entry_text]
32
+ more_content = post[:entry_text_more]
33
+
34
+ # Be sure to include the body and extended body.
35
+ if more_content != nil
36
+ content = content + " \n" + more_content
37
+ end
38
+
39
+ # Ideally, this script would determine the post format (markdown, html
40
+ # , etc) and create files with proper extensions. At this point it
41
+ # just assumes that markdown will be acceptable.
42
+ name = [date.year, date.month, date.day, slug].join('-') + ".markdown"
43
+
44
+ data = {
45
+ 'layout' => 'post',
46
+ 'title' => title.to_s,
47
+ 'mt_id' => post[:entry_id],
48
+ }.delete_if { |k,v| v.nil? || v == ''}.to_yaml
49
+
50
+ File.open("_posts/#{name}", "w") do |f|
51
+ f.puts data
52
+ f.puts "---"
53
+ f.puts content
54
+ end
55
+ end
56
+
57
+ end
58
+ end
59
+ end