jekyll-import 0.12.0 → 0.13.0
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.
- checksums.yaml +4 -4
- data/lib/jekyll-import.rb +10 -8
- data/lib/jekyll-import/importer.rb +1 -1
- data/lib/jekyll-import/importers.rb +1 -1
- data/lib/jekyll-import/importers/behance.rb +20 -20
- data/lib/jekyll-import/importers/blogger.rb +108 -118
- data/lib/jekyll-import/importers/csv.rb +7 -7
- data/lib/jekyll-import/importers/drupal6.rb +5 -6
- data/lib/jekyll-import/importers/drupal7.rb +7 -13
- data/lib/jekyll-import/importers/drupal_common.rb +57 -59
- data/lib/jekyll-import/importers/easyblog.rb +30 -30
- data/lib/jekyll-import/importers/enki.rb +28 -29
- data/lib/jekyll-import/importers/ghost.rb +46 -33
- data/lib/jekyll-import/importers/google_reader.rb +9 -9
- data/lib/jekyll-import/importers/joomla.rb +32 -32
- data/lib/jekyll-import/importers/joomla3.rb +41 -39
- data/lib/jekyll-import/importers/jrnl.rb +16 -17
- data/lib/jekyll-import/importers/marley.rb +25 -26
- data/lib/jekyll-import/importers/mephisto.rb +26 -26
- data/lib/jekyll-import/importers/mt.rb +76 -75
- data/lib/jekyll-import/importers/posterous.rb +30 -29
- data/lib/jekyll-import/importers/rss.rb +13 -10
- data/lib/jekyll-import/importers/s9y.rb +16 -17
- data/lib/jekyll-import/importers/s9y_database.rb +98 -89
- data/lib/jekyll-import/importers/textpattern.rb +18 -17
- data/lib/jekyll-import/importers/tmp.rb +0 -0
- data/lib/jekyll-import/importers/tumblr.rb +146 -143
- data/lib/jekyll-import/importers/typo.rb +31 -31
- data/lib/jekyll-import/importers/wordpress.rb +100 -100
- data/lib/jekyll-import/importers/wordpressdotcom.rb +70 -60
- data/lib/jekyll-import/util.rb +24 -24
- data/lib/jekyll-import/version.rb +1 -1
- data/lib/jekyll/commands/import.rb +32 -35
- metadata +14 -13
@@ -1,23 +1,23 @@
|
|
1
1
|
module JekyllImport
|
2
2
|
module Importers
|
3
3
|
class Ghost < Importer
|
4
|
-
|
5
4
|
def self.specify_options(c)
|
6
|
-
c.option
|
5
|
+
c.option "dbfile", "--dbfile", "Database file (default: ghost.db)"
|
7
6
|
end
|
8
7
|
|
9
8
|
def self.require_deps
|
10
|
-
JekyllImport.require_with_fallback(%w
|
9
|
+
JekyllImport.require_with_fallback(%w(
|
11
10
|
rubygems
|
12
11
|
sequel
|
12
|
+
sqlite3
|
13
13
|
fileutils
|
14
14
|
safe_yaml
|
15
|
-
|
15
|
+
))
|
16
16
|
end
|
17
17
|
|
18
18
|
def self.process(options)
|
19
|
-
posts = fetch_posts(options.fetch(
|
20
|
-
|
19
|
+
posts = fetch_posts(options.fetch("dbfile", "ghost.db"))
|
20
|
+
unless posts.empty?
|
21
21
|
FileUtils.mkdir_p("_posts")
|
22
22
|
FileUtils.mkdir_p("_drafts")
|
23
23
|
posts.each do |post|
|
@@ -27,40 +27,53 @@ module JekyllImport
|
|
27
27
|
end
|
28
28
|
|
29
29
|
private
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
30
|
+
class << self
|
31
|
+
def fetch_posts(dbfile)
|
32
|
+
db = Sequel.sqlite(dbfile)
|
33
|
+
query = "SELECT `title`, `slug`, `markdown`, `created_at`, `published_at`, `status`, `page` FROM posts"
|
34
|
+
db[query]
|
35
|
+
end
|
36
|
+
|
37
|
+
def write_post_to_file(post)
|
38
|
+
# detect if the post is a draft
|
39
|
+
draft = post[:status].eql?("draft")
|
35
40
|
|
36
|
-
|
37
|
-
|
38
|
-
draft = post[:status].eql?('draft')
|
41
|
+
# detect if the post is considered a static page
|
42
|
+
page = post[:page]
|
39
43
|
|
40
|
-
|
41
|
-
|
42
|
-
date = Time.at(post[:created_at].to_i.to_s[0..-4].to_i)
|
44
|
+
# the publish date if the post has been published, creation date otherwise
|
45
|
+
date = Time.at(post[draft ? :created_at : :published_at].to_i)
|
43
46
|
|
44
|
-
|
45
|
-
|
47
|
+
if page
|
48
|
+
# the filename under which the page is stored
|
49
|
+
filename = "#{post[:slug]}.markdown"
|
50
|
+
else
|
51
|
+
# the directory where the file will be saved to. either _drafts or _posts
|
52
|
+
directory = draft ? "_drafts" : "_posts"
|
46
53
|
|
47
|
-
|
48
|
-
|
54
|
+
# the filename under which the post is stored
|
55
|
+
filename = File.join(directory, "#{date.strftime("%Y-%m-%d")}-#{post[:slug]}.markdown")
|
56
|
+
end
|
49
57
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
58
|
+
# the YAML FrontMatter
|
59
|
+
frontmatter = {
|
60
|
+
"layout" => page ? "page" : "post",
|
61
|
+
"title" => post[:title],
|
62
|
+
}
|
63
|
+
frontmatter["date"] = date if !page && !draft # only add the date to the frontmatter when the post is published
|
64
|
+
frontmatter["published"] = false if page && draft # set published to false for draft pages
|
65
|
+
frontmatter.delete_if { |_k, v| v.nil? || v == "" } # removes empty fields
|
54
66
|
|
55
|
-
|
56
|
-
|
57
|
-
|
67
|
+
# write the posts to disk
|
68
|
+
write_file(filename, frontmatter.to_yaml, post[:markdown])
|
69
|
+
end
|
58
70
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
71
|
+
def write_file(filename, frontmatter, content)
|
72
|
+
File.open(filename, "w") do |f|
|
73
|
+
f.puts frontmatter
|
74
|
+
f.puts "---"
|
75
|
+
f.puts content
|
76
|
+
end
|
64
77
|
end
|
65
78
|
end
|
66
79
|
end
|
@@ -2,17 +2,17 @@ module JekyllImport
|
|
2
2
|
module Importers
|
3
3
|
class GoogleReader < Importer
|
4
4
|
def self.validate(options)
|
5
|
-
if options[
|
5
|
+
if options["source"].nil?
|
6
6
|
abort "Missing mandatory option --source."
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.specify_options(c)
|
11
|
-
c.option
|
11
|
+
c.option "source", "--source", "Source XML file of Google Reader export"
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.require_deps
|
15
|
-
JekyllImport.require_with_fallback(%w
|
15
|
+
JekyllImport.require_with_fallback(%w(
|
16
16
|
rubygems
|
17
17
|
rss
|
18
18
|
fileutils
|
@@ -20,7 +20,7 @@ module JekyllImport
|
|
20
20
|
open-uri
|
21
21
|
rexml/document
|
22
22
|
date
|
23
|
-
|
23
|
+
))
|
24
24
|
end
|
25
25
|
|
26
26
|
# Process the import.
|
@@ -29,7 +29,7 @@ module JekyllImport
|
|
29
29
|
#
|
30
30
|
# Returns nothing.
|
31
31
|
def self.process(options)
|
32
|
-
source = options.fetch(
|
32
|
+
source = options.fetch("source")
|
33
33
|
|
34
34
|
open(source) do |content|
|
35
35
|
feed = RSS::Parser.parse(content)
|
@@ -40,13 +40,13 @@ module JekyllImport
|
|
40
40
|
title = item.title.content.to_s
|
41
41
|
formatted_date = Date.parse(item.published.to_s)
|
42
42
|
post_name = title.split(%r{ |!|/|:|&|-|$|,}).map do |i|
|
43
|
-
i.downcase if i !=
|
44
|
-
end.compact.join(
|
43
|
+
i.downcase if i != ""
|
44
|
+
end.compact.join("-")
|
45
45
|
name = "#{formatted_date}-#{post_name}"
|
46
46
|
|
47
47
|
header = {
|
48
|
-
|
49
|
-
|
48
|
+
"layout" => "post",
|
49
|
+
"title" => title,
|
50
50
|
}
|
51
51
|
|
52
52
|
FileUtils.mkdir_p("_posts")
|
@@ -2,7 +2,7 @@ module JekyllImport
|
|
2
2
|
module Importers
|
3
3
|
class Joomla < Importer
|
4
4
|
def self.validate(options)
|
5
|
-
%w
|
5
|
+
%w(dbname user).each do |option|
|
6
6
|
if options[option].nil?
|
7
7
|
abort "Missing mandatory option --#{option}."
|
8
8
|
end
|
@@ -10,34 +10,35 @@ module JekyllImport
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.specify_options(c)
|
13
|
-
c.option
|
14
|
-
c.option
|
15
|
-
c.option
|
16
|
-
c.option
|
17
|
-
c.option
|
18
|
-
c.option
|
13
|
+
c.option "dbname", "--dbname", "Database name"
|
14
|
+
c.option "user", "--user", "Database user name"
|
15
|
+
c.option "password", "--password", "Database user's password (default: '')"
|
16
|
+
c.option "host", "--host", "Database host name"
|
17
|
+
c.option "port", "--port", "Database port"
|
18
|
+
c.option "section", "--section", "Table prefix name"
|
19
|
+
c.option "prefix", "--prefix", "Table prefix name"
|
19
20
|
end
|
20
21
|
|
21
22
|
def self.require_deps
|
22
|
-
JekyllImport.require_with_fallback(%w
|
23
|
+
JekyllImport.require_with_fallback(%w(
|
23
24
|
rubygems
|
24
25
|
sequel
|
25
26
|
mysql2
|
26
27
|
fileutils
|
27
28
|
safe_yaml
|
28
|
-
|
29
|
-
])
|
29
|
+
))
|
30
30
|
end
|
31
31
|
|
32
32
|
def self.process(options)
|
33
|
-
dbname = options.fetch(
|
34
|
-
user = options.fetch(
|
35
|
-
pass = options.fetch(
|
36
|
-
host = options.fetch(
|
37
|
-
|
38
|
-
|
33
|
+
dbname = options.fetch("dbname")
|
34
|
+
user = options.fetch("user")
|
35
|
+
pass = options.fetch("password", "")
|
36
|
+
host = options.fetch("host", "localhost")
|
37
|
+
port = options.fetch("port", 3306).to_i
|
38
|
+
section = options.fetch("section", "1")
|
39
|
+
table_prefix = options.fetch("prefix", "jos_")
|
39
40
|
|
40
|
-
db = Sequel.mysql2(dbname, :user => user, :password => pass, :host => host, :encoding =>
|
41
|
+
db = Sequel.mysql2(dbname, :user => user, :password => pass, :host => host, :port => port, :encoding => "utf8")
|
41
42
|
|
42
43
|
FileUtils.mkdir_p("_posts")
|
43
44
|
|
@@ -55,24 +56,23 @@ module JekyllImport
|
|
55
56
|
|
56
57
|
# Construct a slug from the title if alias field empty.
|
57
58
|
# Remove illegal filename characters.
|
58
|
-
if !post[:alias]
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
59
|
+
slug = if !post[:alias] || post[:alias].empty?
|
60
|
+
sluggify(post[:title])
|
61
|
+
else
|
62
|
+
sluggify(post[:alias])
|
63
|
+
end
|
63
64
|
|
64
|
-
name = "%02d-%02d-%02d-%03d-%s.markdown"
|
65
|
-
id,slug]
|
65
|
+
name = format("%02d-%02d-%02d-%03d-%s.markdown", date.year, date.month, date.day, id, slug)
|
66
66
|
|
67
67
|
# Get the relevant fields as a hash, delete empty fields and convert
|
68
68
|
# to YAML for the header.
|
69
69
|
data = {
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
70
|
+
"layout" => "post",
|
71
|
+
"title" => title.to_s,
|
72
|
+
"joomla_id" => post[:id],
|
73
|
+
"joomla_url" => post[:alias],
|
74
|
+
"date" => date,
|
75
|
+
}.delete_if { |_k, v| v.nil? || v == "" }.to_yaml
|
76
76
|
|
77
77
|
# Write out the data and content to file
|
78
78
|
File.open("_posts/#{name}", "w") do |f|
|
@@ -84,8 +84,8 @@ module JekyllImport
|
|
84
84
|
end
|
85
85
|
|
86
86
|
# Borrowed from the Wordpress importer
|
87
|
-
def self.sluggify(
|
88
|
-
title
|
87
|
+
def self.sluggify(title)
|
88
|
+
title.downcase.gsub(%r![^0-9A-Za-z]+!, " ").strip.tr(" ", "-")
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
@@ -2,7 +2,7 @@ module JekyllImport
|
|
2
2
|
module Importers
|
3
3
|
class Joomla3 < Importer
|
4
4
|
def self.validate(options)
|
5
|
-
%w
|
5
|
+
%w(dbname user prefix).each do |option|
|
6
6
|
if options[option].nil?
|
7
7
|
abort "Missing mandatory option --#{option}."
|
8
8
|
end
|
@@ -10,73 +10,75 @@ module JekyllImport
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.specify_options(c)
|
13
|
-
c.option
|
14
|
-
c.option
|
15
|
-
c.option
|
16
|
-
c.option
|
17
|
-
c.option
|
18
|
-
c.option
|
13
|
+
c.option "dbname", "--dbname", "Database name"
|
14
|
+
c.option "user", "--user", "Database user name"
|
15
|
+
c.option "password", "--password", "Database user's password (default: '')"
|
16
|
+
c.option "host", "--host", "Database host name"
|
17
|
+
c.option "port", "--port", "Database port"
|
18
|
+
c.option "category", "--category", "ID of the category"
|
19
|
+
c.option "prefix", "--prefix", "Table prefix name"
|
19
20
|
end
|
20
21
|
|
21
22
|
def self.require_deps
|
22
|
-
JekyllImport.require_with_fallback(%w
|
23
|
+
JekyllImport.require_with_fallback(%w(
|
23
24
|
rubygems
|
24
25
|
sequel
|
26
|
+
mysql2
|
25
27
|
fileutils
|
26
28
|
safe_yaml
|
27
|
-
|
29
|
+
))
|
28
30
|
end
|
29
31
|
|
30
32
|
def self.process(options)
|
31
|
-
dbname = options.fetch(
|
32
|
-
user = options.fetch(
|
33
|
-
pass = options.fetch(
|
34
|
-
host = options.fetch(
|
35
|
-
|
36
|
-
|
33
|
+
dbname = options.fetch("dbname")
|
34
|
+
user = options.fetch("user")
|
35
|
+
pass = options.fetch("password", "")
|
36
|
+
host = options.fetch("host", "localhost")
|
37
|
+
port = options.fetch("port", 3306).to_i
|
38
|
+
cid = options.fetch("category", 0)
|
39
|
+
table_prefix = options.fetch("prefix", "jos_")
|
37
40
|
|
38
|
-
db = Sequel.
|
41
|
+
db = Sequel.mysql2(dbname, :user => user, :password => pass, :host => host, :port => port, :encoding => "utf8")
|
39
42
|
|
40
43
|
FileUtils.mkdir_p("_posts")
|
41
44
|
|
42
45
|
# Reads a MySQL database via Sequel and creates a post file for each
|
43
46
|
# post in #__content that is published.
|
44
47
|
query = "SELECT `cn`.`title`, `cn`.`alias`, `cn`.`introtext`, CONCAT(`cn`.`introtext`,`cn`.`fulltext`) AS `content`, "
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
48
|
+
query << "`cn`.`created`, `cn`.`id`, `ct`.`title` AS `category`, `u`.`name` AS `author` "
|
49
|
+
query << "FROM `#{table_prefix}content` AS `cn` JOIN `#{table_prefix}categories` AS `ct` ON `cn`.`catid` = `ct`.`id` "
|
50
|
+
query << "JOIN `#{table_prefix}users` AS `u` ON `cn`.`created_by` = `u`.`id` "
|
51
|
+
query << "WHERE (`cn`.`state` = '1' OR `cn`.`state` = '2') " # Only published and archived content items to be imported
|
49
52
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
53
|
+
query << if cid > 0
|
54
|
+
" AND `cn`.`catid` = '#{cid}' "
|
55
|
+
else
|
56
|
+
" AND `cn`.`catid` != '2' " # Filter out uncategorized content
|
57
|
+
end
|
55
58
|
|
56
59
|
db[query].each do |post|
|
57
60
|
# Get required fields and construct Jekyll compatible name.
|
58
61
|
title = post[:title]
|
59
62
|
slug = post[:alias]
|
60
63
|
date = post[:created]
|
61
|
-
|
62
|
-
|
64
|
+
author = post[:author]
|
65
|
+
category = post[:category]
|
63
66
|
content = post[:content]
|
64
|
-
|
65
|
-
name = "%02d-%02d-%02d-%s.markdown"
|
66
|
-
slug]
|
67
|
+
excerpt = post[:introtext]
|
68
|
+
name = format("%02d-%02d-%02d-%s.markdown", date.year, date.month, date.day, slug)
|
67
69
|
|
68
70
|
# Get the relevant fields as a hash, delete empty fields and convert
|
69
71
|
# to YAML for the header.
|
70
72
|
data = {
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
73
|
+
"layout" => "post",
|
74
|
+
"title" => title.to_s,
|
75
|
+
"joomla_id" => post[:id],
|
76
|
+
"joomla_url" => slug,
|
77
|
+
"date" => date,
|
78
|
+
"author" => author,
|
79
|
+
"excerpt" => excerpt.strip.to_s,
|
80
|
+
"category" => category,
|
81
|
+
}.delete_if { |_k, v| v.nil? || v == "" }.to_yaml
|
80
82
|
|
81
83
|
# Write out the data and content to file
|
82
84
|
File.open("_posts/#{name}", "w") do |f|
|
@@ -1,20 +1,19 @@
|
|
1
1
|
module JekyllImport
|
2
2
|
module Importers
|
3
3
|
class Jrnl < Importer
|
4
|
-
|
5
4
|
def self.require_deps
|
6
|
-
JekyllImport.require_with_fallback(%w
|
5
|
+
JekyllImport.require_with_fallback(%w(
|
7
6
|
time
|
8
7
|
rubygems
|
9
8
|
safe_yaml
|
10
|
-
|
9
|
+
))
|
11
10
|
end
|
12
11
|
|
13
12
|
def self.specify_options(c)
|
14
|
-
c.option
|
15
|
-
c.option
|
16
|
-
c.option
|
17
|
-
c.option
|
13
|
+
c.option "file", "--file FILENAME", 'Journal file (default: "~/journal.txt")'
|
14
|
+
c.option "time_format", "--time_format FORMAT", 'Time format of your journal (default: "%Y-%m-%d %H:%M")'
|
15
|
+
c.option "extension", "--extension EXT", 'Output extension (default: "md")'
|
16
|
+
c.option "layout", "--layout NAME", 'Output post layout (default: "post")'
|
18
17
|
end
|
19
18
|
|
20
19
|
# Reads a jrnl file and creates a new post for each entry
|
@@ -24,10 +23,10 @@ module JekyllImport
|
|
24
23
|
# :extension the extension format of the output files
|
25
24
|
# :layout explicitly set the layout of the output
|
26
25
|
def self.process(options)
|
27
|
-
file = options.fetch(
|
28
|
-
time_format = options.fetch(
|
29
|
-
extension = options.fetch(
|
30
|
-
layout = options.fetch(
|
26
|
+
file = options.fetch("file", "~/journal.txt")
|
27
|
+
time_format = options.fetch("time_format", "%Y-%m-%d %H:%M")
|
28
|
+
extension = options.fetch("extension", "md")
|
29
|
+
layout = options.fetch("layout", "post")
|
31
30
|
|
32
31
|
date_length = Time.now.strftime(time_format).length
|
33
32
|
|
@@ -37,7 +36,7 @@ module JekyllImport
|
|
37
36
|
abort "The jrnl file was not found. Please make sure '#{file}' exists. You can specify a different file using the --file switch." unless File.file?(file)
|
38
37
|
|
39
38
|
input = File.read(file)
|
40
|
-
entries = input.split("\n\n")
|
39
|
+
entries = input.split("\n\n")
|
41
40
|
|
42
41
|
entries.each do |entry|
|
43
42
|
# split dateline and body
|
@@ -73,7 +72,7 @@ module JekyllImport
|
|
73
72
|
|
74
73
|
# generate slug
|
75
74
|
def self.create_slug(title)
|
76
|
-
return title.downcase.strip.
|
75
|
+
return title.downcase.strip.tr(" ", "-").gsub(%r![^\w-]!, "")
|
77
76
|
end
|
78
77
|
|
79
78
|
# generate filename
|
@@ -95,11 +94,11 @@ module JekyllImport
|
|
95
94
|
# Returns array converted to YAML
|
96
95
|
def self.create_meta(layout, title, date)
|
97
96
|
data = {
|
98
|
-
|
99
|
-
|
100
|
-
|
97
|
+
"layout" => layout,
|
98
|
+
"title" => title,
|
99
|
+
"date" => Time.parse(date).strftime("%Y-%m-%d %H:%M %z"),
|
101
100
|
}.to_yaml
|
102
|
-
return data
|
101
|
+
return data
|
103
102
|
end
|
104
103
|
|
105
104
|
# Writes given data to file
|