jekyll-import 0.1.0.beta3 → 0.1.0.beta4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +6 -14
  2. data/History.markdown +18 -0
  3. data/README.markdown +12 -1
  4. data/jekyll-import.gemspec +31 -25
  5. data/lib/jekyll-import.rb +50 -1
  6. data/lib/jekyll-import/importer.rb +11 -0
  7. data/lib/jekyll-import/importers.rb +10 -0
  8. data/lib/jekyll-import/importers/csv.rb +50 -0
  9. data/lib/jekyll-import/importers/drupal6.rb +139 -0
  10. data/lib/jekyll-import/importers/drupal7.rb +102 -0
  11. data/lib/jekyll-import/importers/enki.rb +76 -0
  12. data/lib/jekyll-import/importers/google_reader.rb +68 -0
  13. data/lib/jekyll-import/importers/joomla.rb +83 -0
  14. data/lib/jekyll-import/importers/jrnl.rb +127 -0
  15. data/lib/jekyll-import/importers/marley.rb +72 -0
  16. data/lib/jekyll-import/importers/mephisto.rb +109 -0
  17. data/lib/jekyll-import/importers/mt.rb +169 -0
  18. data/lib/jekyll-import/importers/posterous.rb +139 -0
  19. data/lib/jekyll-import/importers/rss.rb +71 -0
  20. data/lib/jekyll-import/importers/s9y.rb +67 -0
  21. data/lib/jekyll-import/importers/textpattern.rb +76 -0
  22. data/lib/jekyll-import/importers/tumblr.rb +265 -0
  23. data/lib/jekyll-import/importers/typo.rb +89 -0
  24. data/lib/jekyll-import/importers/wordpress.rb +323 -0
  25. data/lib/jekyll-import/importers/wordpressdotcom.rb +97 -0
  26. data/lib/jekyll/commands/import.rb +1 -0
  27. data/test/helper.rb +3 -1
  28. data/test/test_jrnl_importer.rb +39 -0
  29. data/test/test_mt_importer.rb +16 -16
  30. data/test/test_tumblr_importer.rb +61 -0
  31. data/test/test_wordpress_importer.rb +1 -1
  32. data/test/test_wordpressdotcom_importer.rb +1 -1
  33. metadata +53 -32
  34. data/lib/jekyll/jekyll-import/csv.rb +0 -30
  35. data/lib/jekyll/jekyll-import/drupal6.rb +0 -112
  36. data/lib/jekyll/jekyll-import/drupal7.rb +0 -74
  37. data/lib/jekyll/jekyll-import/enki.rb +0 -49
  38. data/lib/jekyll/jekyll-import/google_reader.rb +0 -61
  39. data/lib/jekyll/jekyll-import/joomla.rb +0 -53
  40. data/lib/jekyll/jekyll-import/marley.rb +0 -52
  41. data/lib/jekyll/jekyll-import/mephisto.rb +0 -84
  42. data/lib/jekyll/jekyll-import/mt.rb +0 -142
  43. data/lib/jekyll/jekyll-import/posterous.rb +0 -122
  44. data/lib/jekyll/jekyll-import/rss.rb +0 -63
  45. data/lib/jekyll/jekyll-import/s9y.rb +0 -59
  46. data/lib/jekyll/jekyll-import/textpattern.rb +0 -58
  47. data/lib/jekyll/jekyll-import/tumblr.rb +0 -242
  48. data/lib/jekyll/jekyll-import/typo.rb +0 -69
  49. data/lib/jekyll/jekyll-import/wordpress.rb +0 -299
  50. data/lib/jekyll/jekyll-import/wordpressdotcom.rb +0 -84
@@ -1,112 +0,0 @@
1
- require 'rubygems'
2
- require 'sequel'
3
- require 'fileutils'
4
- require 'safe_yaml'
5
-
6
- # NOTE: This converter requires Sequel and the MySQL gems.
7
- # The MySQL gem can be difficult to install on OS X. Once you have MySQL
8
- # installed, running the following commands should work:
9
- # $ sudo gem install sequel
10
- # $ sudo gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
11
-
12
- module JekyllImport
13
- module Drupal6
14
- # Reads a MySQL database via Sequel and creates a post file for each story
15
- # and blog node in table node.
16
- QUERY = "SELECT n.nid, \
17
- n.title, \
18
- nr.body, \
19
- n.created, \
20
- n.status, \
21
- GROUP_CONCAT( td.name SEPARATOR ' ' ) AS 'tags' \
22
- FROM node_revisions AS nr, \
23
- node AS n \
24
- JOIN term_node AS tn ON tn.nid = n.nid \
25
- JOIN term_data AS td ON tn.tid = td.tid \
26
- WHERE (n.type = 'blog' OR n.type = 'story') \
27
- AND n.vid = nr.vid \
28
- GROUP BY n.nid"
29
-
30
- def self.process(dbname, user, pass, host = 'localhost', prefix = '')
31
- db = Sequel.mysql(dbname, :user => user, :password => pass, :host => host, :encoding => 'utf8')
32
-
33
- if prefix != ''
34
- QUERY[" node "] = " " + prefix + "node "
35
- QUERY[" node_revisions "] = " " + prefix + "node_revisions "
36
- QUERY[" term_node "] = " " + prefix + "term_node "
37
- QUERY[" term_data "] = " " + prefix + "term_data "
38
- end
39
-
40
- FileUtils.mkdir_p "_posts"
41
- FileUtils.mkdir_p "_drafts"
42
-
43
- # Create the refresh layout
44
- # Change the refresh url if you customized your permalink config
45
- File.open("_layouts/refresh.html", "w") do |f|
46
- f.puts <<EOF
47
- <!DOCTYPE html>
48
- <html>
49
- <head>
50
- <meta http-equiv="content-type" content="text/html; charset=utf-8" />
51
- <meta http-equiv="refresh" content="0;url={{ page.refresh_to_post_id }}.html" />
52
- </head>
53
- </html>
54
- EOF
55
- end
56
-
57
- db[QUERY].each do |post|
58
- # Get required fields and construct Jekyll compatible name
59
- node_id = post[:nid]
60
- title = post[:title]
61
- content = post[:body]
62
- tags = post[:tags].downcase.strip
63
- created = post[:created]
64
- time = Time.at(created)
65
- is_published = post[:status] == 1
66
- dir = is_published ? "_posts" : "_drafts"
67
- slug = title.strip.downcase.gsub(/(&|&amp;)/, ' and ').gsub(/[\s\.\/\\]/, '-').gsub(/[^\w-]/, '').gsub(/[-_]{2,}/, '-').gsub(/^[-_]/, '').gsub(/[-_]$/, '')
68
- name = time.strftime("%Y-%m-%d-") + slug + '.md'
69
-
70
- # Get the relevant fields as a hash, delete empty fields and convert
71
- # to YAML for the header
72
- data = {
73
- 'layout' => 'post',
74
- 'title' => title.to_s,
75
- 'created' => created,
76
- 'categories' => tags
77
- }.delete_if { |k,v| v.nil? || v == ''}.each_pair {
78
- |k,v| ((v.is_a? String) ? v.force_encoding("UTF-8") : v)
79
- }.to_yaml
80
-
81
- # Write out the data and content to file
82
- File.open("#{dir}/#{name}", "w") do |f|
83
- f.puts data
84
- f.puts "---"
85
- f.puts content
86
- end
87
-
88
- # Make a file to redirect from the old Drupal URL
89
- if is_published
90
- aliases = db["SELECT dst FROM #{prefix}url_alias WHERE src = ?", "node/#{node_id}"].all
91
-
92
- aliases.push(:dst => "node/#{node_id}")
93
-
94
- aliases.each do |url_alias|
95
- FileUtils.mkdir_p url_alias[:dst]
96
- File.open("#{url_alias[:dst]}/index.md", "w") do |f|
97
- f.puts "---"
98
- f.puts "layout: refresh"
99
- f.puts "refresh_to_post_id: /#{time.strftime("%Y/%m/%d/") + slug}"
100
- f.puts "---"
101
- end
102
- end
103
- end
104
- end
105
-
106
- # TODO: Make dirs & files for nodes of type 'page'
107
- # Make refresh pages for these as well
108
-
109
- # TODO: Make refresh dirs & files according to entries in url_alias table
110
- end
111
- end
112
- end
@@ -1,74 +0,0 @@
1
- require 'rubygems'
2
- require 'sequel'
3
- require 'fileutils'
4
- require 'yaml'
5
-
6
- # NOTE: This converter requires Sequel and the MySQL gems.
7
- # The MySQL gem can be difficult to install on OS X. Once you have MySQL
8
- # installed, running the following commands should work:
9
- # $ sudo gem install sequel
10
- # $ sudo gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
11
-
12
- module JekyllImport
13
- module Drupal7
14
- # Reads a MySQL database via Sequel and creates a post file for each post
15
- # in wp_posts that has post_status = 'publish'. This restriction is made
16
- # because 'draft' posts are not guaranteed to have valid dates.
17
- QUERY = "SELECT n.nid, \
18
- n.title, \
19
- fdb.body_value, \
20
- n.created, \
21
- n.status \
22
- FROM node AS n, \
23
- field_data_body AS fdb \
24
- WHERE (n.type = 'blog' OR n.type = 'story') \
25
- AND n.nid = fdb.entity_id \
26
- AND n.vid = fdb.revision_id"
27
-
28
- def self.process(dbname, user, pass, host = 'localhost', prefix = '')
29
- db = Sequel.mysql(dbname, :user => user, :password => pass, :host => host, :encoding => 'utf8')
30
-
31
- if prefix != ''
32
- QUERY[" node "] = " " + prefix + "node "
33
- QUERY[" field_data_body "] = " " + prefix + "field_data_body "
34
- end
35
-
36
- FileUtils.mkdir_p "_posts"
37
- FileUtils.mkdir_p "_drafts"
38
-
39
- db[QUERY].each do |post|
40
- # Get required fields and construct Jekyll compatible name
41
- node_id = post[:nid]
42
- title = post[:title]
43
- content = post[:body_value]
44
- created = post[:created]
45
- time = Time.at(created)
46
- is_published = post[:status] == 1
47
- dir = is_published ? "_posts" : "_drafts"
48
- slug = title.strip.downcase.gsub(/(&|&amp;)/, ' and ').gsub(/[\s\.\/\\]/, '-').gsub(/[^\w-]/, '').gsub(/[-_]{2,}/, '-').gsub(/^[-_]/, '').gsub(/[-_]$/, '')
49
- name = time.strftime("%Y-%m-%d-") + slug + '.md'
50
-
51
- # Get the relevant fields as a hash, delete empty fields and convert
52
- # to YAML for the header
53
- data = {
54
- 'layout' => 'default',
55
- 'title' => title.to_s,
56
- 'created' => created,
57
- }.delete_if { |k,v| v.nil? || v == ''}.to_yaml
58
-
59
- # Write out the data and content to file
60
- File.open("#{dir}/#{name}", "w") do |f|
61
- f.puts data
62
- f.puts "---"
63
- f.puts content
64
- end
65
-
66
- end
67
-
68
- # TODO: Make dirs & files for nodes of type 'page'
69
- # Make refresh pages for these as well
70
-
71
- # TODO: Make refresh dirs & files according to entries in url_alias table
72
- end
73
- end
74
- end
@@ -1,49 +0,0 @@
1
- # Adapted by Rodrigo Pinto <rodrigopqn@gmail.com>
2
- # Based on typo.rb by Toby DiPasquale
3
-
4
- require 'fileutils'
5
- require 'rubygems'
6
- require 'sequel'
7
-
8
- module JekyllImport
9
- module Enki
10
- SQL = <<-EOS
11
- SELECT p.id,
12
- p.title,
13
- p.slug,
14
- p.body,
15
- p.published_at as date,
16
- p.cached_tag_list as tags
17
- FROM posts p
18
- EOS
19
-
20
- # Just working with postgres, but can be easily adapted
21
- # to work with both mysql and postgres.
22
- def self.process(dbname, user, pass, host = 'localhost')
23
- FileUtils.mkdir_p('_posts')
24
- db = Sequel.postgres(:database => dbname,
25
- :user => user,
26
- :password => pass,
27
- :host => host,
28
- :encoding => 'utf8')
29
-
30
- db[SQL].each do |post|
31
- name = [ sprintf("%.04d", post[:date].year),
32
- sprintf("%.02d", post[:date].month),
33
- sprintf("%.02d", post[:date].day),
34
- post[:slug].strip ].join('-')
35
- name += '.textile'
36
-
37
- File.open("_posts/#{name}", 'w') do |f|
38
- f.puts({ 'layout' => 'post',
39
- 'title' => post[:title].to_s,
40
- 'enki_id' => post[:id],
41
- 'categories' => post[:tags]
42
- }.delete_if { |k, v| v.nil? || v == '' }.to_yaml)
43
- f.puts '---'
44
- f.puts post[:body].delete("\r")
45
- end
46
- end
47
- end
48
- end
49
- end
@@ -1,61 +0,0 @@
1
- # Usage:
2
- # (Local file)
3
- # ruby -r 'jekyll/jekyll-import/rss' -e "JekyllImport::GoogleReader.process(:source => './somefile/on/your/computer.xml')"
4
-
5
- require 'rss'
6
- require 'open-uri'
7
- require 'fileutils'
8
- require 'safe_yaml'
9
-
10
- require 'rexml/document'
11
- require 'date'
12
-
13
- module JekyllImport
14
- module GoogleReader
15
- def self.validate(options)
16
- if !options[:source]
17
- abort "Missing mandatory option --source."
18
- end
19
- end
20
-
21
- # Process the import.
22
- #
23
- # source - a URL or a local file String.
24
- #
25
- # Returns nothing.
26
- def self.process(options)
27
- validate(options)
28
-
29
- source = options[:source]
30
-
31
- open(source) do |content|
32
- feed = RSS::Parser.parse(content)
33
-
34
- raise "There doesn't appear to be any RSS items at the source (#{source}) provided." unless feed
35
-
36
- feed.items.each do |item|
37
- title = item.title.content.to_s
38
- formatted_date = Date.parse(item.published.to_s)
39
- post_name = title.split(%r{ |!|/|:|&|-|$|,}).map do |i|
40
- i.downcase if i != ''
41
- end.compact.join('-')
42
- name = "#{formatted_date}-#{post_name}"
43
-
44
- header = {
45
- 'layout' => 'post',
46
- 'title' => title
47
- }
48
-
49
- FileUtils.mkdir_p("_posts")
50
-
51
- File.open("_posts/#{name}.html", "w") do |f|
52
- f.puts header.to_yaml
53
- f.puts "---\n\n"
54
- f.puts item.content.content.to_s
55
- end
56
- end
57
- end
58
- end
59
- end
60
- end
61
-
@@ -1,53 +0,0 @@
1
- require 'rubygems'
2
- require 'sequel'
3
- require 'fileutils'
4
- require 'safe_yaml'
5
-
6
- # NOTE: This migrator is made for Joomla 1.5 databases.
7
- # NOTE: This converter requires Sequel and the MySQL gems.
8
- # The MySQL gem can be difficult to install on OS X. Once you have MySQL
9
- # installed, running the following commands should work:
10
- # $ sudo gem install sequel
11
- # $ sudo gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
12
-
13
- module JekyllImport
14
- module Joomla
15
- def self.process(dbname, user, pass, host = 'localhost', table_prefix = 'jos_', section = '1')
16
- db = Sequel.mysql(dbname, :user => user, :password => pass, :host => host, :encoding => 'utf8')
17
-
18
- FileUtils.mkdir_p("_posts")
19
-
20
- # Reads a MySQL database via Sequel and creates a post file for each
21
- # post in wp_posts that has post_status = 'publish'. This restriction is
22
- # made because 'draft' posts are not guaranteed to have valid dates.
23
- query = "SELECT `title`, `alias`, CONCAT(`introtext`,`fulltext`) as content, `created`, `id` FROM #{table_prefix}content WHERE state = '0' OR state = '1' AND sectionid = '#{section}'"
24
-
25
- db[query].each do |post|
26
- # Get required fields and construct Jekyll compatible name.
27
- title = post[:title]
28
- slug = post[:alias]
29
- date = post[:created]
30
- content = post[:content]
31
- name = "%02d-%02d-%02d-%s.markdown" % [date.year, date.month, date.day,
32
- slug]
33
-
34
- # Get the relevant fields as a hash, delete empty fields and convert
35
- # to YAML for the header.
36
- data = {
37
- 'layout' => 'post',
38
- 'title' => title.to_s,
39
- 'joomla_id' => post[:id],
40
- 'joomla_url' => post[:alias],
41
- 'date' => date
42
- }.delete_if { |k,v| v.nil? || v == '' }.to_yaml
43
-
44
- # Write out the data and content to file
45
- File.open("_posts/#{name}", "w") do |f|
46
- f.puts data
47
- f.puts "---"
48
- f.puts content
49
- end
50
- end
51
- end
52
- end
53
- end
@@ -1,52 +0,0 @@
1
- require 'safe_yaml'
2
- require 'fileutils'
3
-
4
- module JekyllImport
5
- module Marley
6
- def self.regexp
7
- { :id => /^\d{0,4}-{0,1}(.*)$/,
8
- :title => /^#\s*(.*)\s+$/,
9
- :title_with_date => /^#\s*(.*)\s+\(([0-9\/]+)\)$/,
10
- :published_on => /.*\s+\(([0-9\/]+)\)$/,
11
- :perex => /^([^\#\n]+\n)$/,
12
- :meta => /^\{\{\n(.*)\}\}\n$/mi # Multiline Regexp
13
- }
14
- end
15
-
16
- def self.process(marley_data_dir)
17
- raise ArgumentError, "marley dir #{marley_data_dir} not found" unless File.directory?(marley_data_dir)
18
-
19
- FileUtils.mkdir_p "_posts"
20
-
21
- posts = 0
22
- Dir["#{marley_data_dir}/**/*.txt"].each do |f|
23
- next unless File.exists?(f)
24
-
25
- #copied over from marley's app/lib/post.rb
26
- file_content = File.read(f)
27
- meta_content = file_content.slice!( self.regexp[:meta] )
28
- body = file_content.sub( self.regexp[:title], '').sub( self.regexp[:perex], '').strip
29
-
30
- title = file_content.scan( self.regexp[:title] ).first.to_s.strip
31
- prerex = file_content.scan( self.regexp[:perex] ).first.to_s.strip
32
- published_on = DateTime.parse( post[:published_on] ) rescue File.mtime( File.dirname(f) )
33
- meta = ( meta_content ) ? YAML::load( meta_content.scan( self.regexp[:meta]).to_s ) : {}
34
- meta['title'] = title
35
- meta['layout'] = 'post'
36
-
37
- formatted_date = published_on.strftime('%Y-%m-%d')
38
- post_name = File.dirname(f).split(%r{/}).last.gsub(/\A\d+-/, '')
39
-
40
- name = "#{formatted_date}-#{post_name}"
41
- File.open("_posts/#{name}.markdown", "w") do |f|
42
- f.puts meta.to_yaml
43
- f.puts "---\n"
44
- f.puts "\n#{prerex}\n\n" if prerex
45
- f.puts body
46
- end
47
- posts += 1
48
- end
49
- "Created #{posts} posts!"
50
- end
51
- end
52
- end
@@ -1,84 +0,0 @@
1
- # Quickly hacked together my Michael Ivey
2
- # Based on mt.rb by Nick Gerakines, open source and publically
3
- # available under the MIT license. Use this module at your own risk.
4
-
5
- require 'rubygems'
6
- require 'sequel'
7
- require 'fastercsv'
8
- require 'fileutils'
9
- require File.join(File.dirname(__FILE__),"csv.rb")
10
-
11
- # NOTE: This converter requires Sequel and the MySQL gems.
12
- # The MySQL gem can be difficult to install on OS X. Once you have MySQL
13
- # installed, running the following commands should work:
14
- # $ sudo gem install sequel
15
- # $ sudo gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
16
-
17
- module JekyllImport
18
- module Mephisto
19
- #Accepts a hash with database config variables, exports mephisto posts into a csv
20
- #export PGPASSWORD if you must
21
- def self.postgres(c)
22
- sql = <<-SQL
23
- BEGIN;
24
- CREATE TEMP TABLE jekyll AS
25
- SELECT title, permalink, body, published_at, filter FROM contents
26
- WHERE user_id = 1 AND type = 'Article' ORDER BY published_at;
27
- COPY jekyll TO STDOUT WITH CSV HEADER;
28
- ROLLBACK;
29
- SQL
30
- command = %Q(psql -h #{c[:host] || "localhost"} -c "#{sql.strip}" #{c[:database]} #{c[:username]} -o #{c[:filename] || "posts.csv"})
31
- puts command
32
- `#{command}`
33
- CSV.process
34
- end
35
-
36
- # This query will pull blog posts from all entries across all blogs. If
37
- # you've got unpublished, deleted or otherwise hidden posts please sift
38
- # through the created posts to make sure nothing is accidently published.
39
- QUERY = "SELECT id, \
40
- permalink, \
41
- body, \
42
- published_at, \
43
- title \
44
- FROM contents \
45
- WHERE user_id = 1 AND \
46
- type = 'Article' AND \
47
- published_at IS NOT NULL \
48
- ORDER BY published_at"
49
-
50
- def self.process(dbname, user, pass, host = 'localhost')
51
- db = Sequel.mysql(dbname, :user => user,
52
- :password => pass,
53
- :host => host,
54
- :encoding => 'utf8')
55
-
56
- FileUtils.mkdir_p "_posts"
57
-
58
- db[QUERY].each do |post|
59
- title = post[:title]
60
- slug = post[:permalink]
61
- date = post[:published_at]
62
- content = post[:body]
63
-
64
- # Ideally, this script would determine the post format (markdown,
65
- # html, etc) and create files with proper extensions. At this point
66
- # it just assumes that markdown will be acceptable.
67
- name = [date.year, date.month, date.day, slug].join('-') + ".markdown"
68
-
69
- data = {
70
- 'layout' => 'post',
71
- 'title' => title.to_s,
72
- 'mt_id' => post[:entry_id],
73
- }.delete_if { |k,v| v.nil? || v == ''}.to_yaml
74
-
75
- File.open("_posts/#{name}", "w") do |f|
76
- f.puts data
77
- f.puts "---"
78
- f.puts content
79
- end
80
- end
81
-
82
- end
83
- end
84
- end