jekyll-import 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jekyll-import.rb +2 -0
  3. data/lib/jekyll-import/importer.rb +5 -3
  4. data/lib/jekyll-import/importers.rb +3 -0
  5. data/lib/jekyll-import/importers/behance.rb +7 -6
  6. data/lib/jekyll-import/importers/blogger.rb +23 -38
  7. data/lib/jekyll-import/importers/csv.rb +6 -5
  8. data/lib/jekyll-import/importers/drupal6.rb +7 -5
  9. data/lib/jekyll-import/importers/drupal7.rb +15 -13
  10. data/lib/jekyll-import/importers/drupal_common.rb +55 -31
  11. data/lib/jekyll-import/importers/easyblog.rb +8 -8
  12. data/lib/jekyll-import/importers/enki.rb +14 -12
  13. data/lib/jekyll-import/importers/ghost.rb +4 -1
  14. data/lib/jekyll-import/importers/google_reader.rb +4 -4
  15. data/lib/jekyll-import/importers/joomla.rb +9 -9
  16. data/lib/jekyll-import/importers/joomla3.rb +15 -15
  17. data/lib/jekyll-import/importers/jrnl.rb +11 -9
  18. data/lib/jekyll-import/importers/marley.rb +12 -10
  19. data/lib/jekyll-import/importers/mephisto.rb +15 -15
  20. data/lib/jekyll-import/importers/mt.rb +16 -13
  21. data/lib/jekyll-import/importers/posterous.rb +12 -9
  22. data/lib/jekyll-import/importers/roller.rb +277 -0
  23. data/lib/jekyll-import/importers/rss.rb +18 -6
  24. data/lib/jekyll-import/importers/s9y.rb +3 -1
  25. data/lib/jekyll-import/importers/s9y_database.rb +38 -53
  26. data/lib/jekyll-import/importers/textpattern.rb +6 -4
  27. data/lib/jekyll-import/importers/tumblr.rb +101 -107
  28. data/lib/jekyll-import/importers/typo.rb +29 -27
  29. data/lib/jekyll-import/importers/wordpress.rb +47 -59
  30. data/lib/jekyll-import/importers/wordpressdotcom.rb +27 -32
  31. data/lib/jekyll-import/util.rb +2 -1
  32. data/lib/jekyll-import/version.rb +3 -1
  33. data/lib/jekyll/commands/import.rb +4 -7
  34. metadata +40 -40
  35. data/lib/jekyll-import/importers/tmp.rb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9a826b9d776a9cefe30d3b508c1c43b2df20f547747347dc19977bf874d78990
4
- data.tar.gz: d71199a3e140201b618fc50dafea0c9e88c1017cc8bc1c641ea0fe74a6df764a
3
+ metadata.gz: 5dc36b6cb2508c37bc5af40022d3a56f75c5ccaf1ae60ab631db9986f4d0a799
4
+ data.tar.gz: c0ab3fd214f121e75e5388143344a2c5501d2e81e1205db004c8510c01e2ae1c
5
5
  SHA512:
6
- metadata.gz: 24ca8cf7716b0affb0e5f33298728c1c66d3767a18d7997c96c70ee7c36fac23aedc4545277a0f74e3d26478c460a5d28d39a8cc331499cfa6d633871f5124b6
7
- data.tar.gz: 7817b54acf9f131dfe7ed1896ea616e89d8b0818be7db9a39f42e73be9bb822fc4ce16d68bf0c0d8ffc00700d1e7e271b14db8d5a061567fa53379fcd757fa30
6
+ metadata.gz: c0701c36d3cf270e612e1d8292447b870e3c6a3db0904d57b8f3c5a4fedb195fa6586aa840e666b325fc291f15fca95d1a17fe05e6556a95ef59c7128784e732
7
+ data.tar.gz: 5355d89fbe103c753cc9b48ac6d3f398e6a980a1a86a0e19e69ba0e8cc3967a188db6ba45eb515e3a711a2e55b23f768c3b3583534b6ec8760010828bc855c8b
data/lib/jekyll-import.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # For use/testing when no gem is installed
2
4
  $LOAD_PATH.unshift __dir__
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module JekyllImport
2
4
  class Importer
3
5
  def self.inherited(base)
@@ -18,9 +20,9 @@ module JekyllImport
18
20
 
19
21
  def self.run(options = {})
20
22
  opts = stringify_keys(options)
21
- self.require_deps
22
- self.validate(opts) if self.respond_to?(:validate)
23
- self.process(opts)
23
+ require_deps
24
+ validate(opts) if respond_to?(:validate)
25
+ process(opts)
24
26
  end
25
27
  end
26
28
  end
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module JekyllImport
2
4
  module Importers
3
5
  Dir.chdir(File.expand_path(File.join("importers"), __dir__)) do
4
6
  Dir.entries(".").each do |f|
5
7
  next if f[0..0].eql?(".")
8
+
6
9
  require "jekyll-import/importers/#{f}"
7
10
  end
8
11
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module JekyllImport
2
4
  module Importers
3
5
  class Behance < Importer
@@ -12,15 +14,13 @@ module JekyllImport
12
14
  end
13
15
 
14
16
  def self.specify_options(c)
15
- c.option "user", "--user NAME", "The username of the account"
17
+ c.option "user", "--user NAME", "The username of the account"
16
18
  c.option "api_token", "--api_token TOKEN", "The API access token for the account"
17
19
  end
18
20
 
19
21
  def self.validate(options)
20
22
  %w(user api_token).each do |option|
21
- if options[option].nil?
22
- abort "Missing mandatory option --#{option}."
23
- end
23
+ abort "Missing mandatory option --#{option}." if options[option].nil?
24
24
  end
25
25
  end
26
26
 
@@ -38,7 +38,7 @@ module JekyllImport
38
38
 
39
39
  user_projects = client.user_projects(user)
40
40
 
41
- puts "#{user_projects.length} project(s) found. Importing now..."
41
+ Jekyll.logger.info "#{user_projects.length} project(s) found. Importing now..."
42
42
 
43
43
  user_projects.each do |project|
44
44
  details = client.project(project["id"])
@@ -66,11 +66,12 @@ module JekyllImport
66
66
  end
67
67
  end
68
68
 
69
- puts "Finished importing."
69
+ Jekyll.logger.info "Finished importing."
70
70
  end
71
71
 
72
72
  class << self
73
73
  private
74
+
74
75
  def fetch_behance(token)
75
76
  ::Behance::Client.new(:access_token => token)
76
77
  end
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module JekyllImport
2
4
  module Importers
3
5
  class Blogger < Importer
4
6
  def self.specify_options(c)
5
- c.option "source", "--source NAME", "The XML file (blog-MM-DD-YYYY.xml) path to import"
6
- c.option "no-blogger-info", "--no-blogger-info", "not to leave blogger-URL info (id and old URL) in the front matter (default: false)"
7
- c.option "replace-internal-link", "--replace-internal-link", "replace internal links using the post_url liquid tag. (default: false)"
8
- c.option "comments", "--comments", "import comments to _comments collection"
7
+ c.option "source", "--source NAME", "The XML file (blog-MM-DD-YYYY.xml) path to import"
8
+ c.option "no-blogger-info", "--no-blogger-info", "not to leave blogger-URL info (id and old URL) in the front matter (default: false)"
9
+ c.option "replace-internal-link", "--replace-internal-link", "replace internal links using the post_url liquid tag. (default: false)"
10
+ c.option "comments", "--comments", "import comments to _comments collection"
9
11
  end
10
12
 
11
13
  def self.validate(options)
@@ -41,8 +43,8 @@ module JekyllImport
41
43
 
42
44
  listener = BloggerAtomStreamListener.new
43
45
 
44
- listener.leave_blogger_info = !options.fetch("no-blogger-info", false),
45
- listener.comments = options.fetch("comments", false),
46
+ listener.leave_blogger_info = !options.fetch("no-blogger-info", false)
47
+ listener.comments = options.fetch("comments", false)
46
48
 
47
49
  File.open(source, "r") do |f|
48
50
  f.flock(File::LOCK_SH)
@@ -78,6 +80,7 @@ module JekyllImport
78
80
  quote = Regexp.last_match(1)
79
81
  post_file = Dir.glob("_posts/#{Regexp.last_match(2)}-#{Regexp.last_match(3)}-*-#{Regexp.last_match(4).to_s.tr("/", "-")}").first
80
82
  raise "Could not found: _posts/#{Regexp.last_match(2)}-#{Regexp.last_match(3)}-*-#{Regexp.last_match(4).to_s.tr("/", "-")}" if post_file.nil?
83
+
81
84
  " href=#{quote}{{ site.baseurl }}{% post_url #{File.basename(post_file, ".html")} %}#{quote}"
82
85
  end
83
86
 
@@ -106,12 +109,13 @@ module JekyllImport
106
109
  attr_reader :original_url_base
107
110
 
108
111
  def tag_start(tag, attrs)
109
- @tag_bread = [] unless @tag_bread
112
+ @tag_bread ||= []
110
113
  @tag_bread.push(tag)
111
114
 
112
115
  case tag
113
116
  when "entry"
114
117
  raise "nest entry element" if @in_entry_elem
118
+
115
119
  @in_entry_elem = { :meta => {}, :body => nil }
116
120
  when "title"
117
121
  if @in_entry_elem
@@ -129,9 +133,7 @@ module JekyllImport
129
133
  end
130
134
  end
131
135
  when "content"
132
- if @in_entry_elem
133
- @in_entry_elem[:meta][:content_type] = attrs["type"]
134
- end
136
+ @in_entry_elem[:meta][:content_type] = attrs["type"] if @in_entry_elem
135
137
  when "link"
136
138
  if @in_entry_elem
137
139
  if attrs["rel"] == "alternate" && attrs["type"] == "text/html"
@@ -143,13 +145,9 @@ module JekyllImport
143
145
  end
144
146
  end
145
147
  when "media:thumbnail"
146
- if @in_entry_elem
147
- @in_entry_elem[:meta][:thumbnail] = attrs["url"]
148
- end
148
+ @in_entry_elem[:meta][:thumbnail] = attrs["url"] if @in_entry_elem
149
149
  when "thr:in-reply-to"
150
- if @in_entry_elem
151
- @in_entry_elem[:meta][:post_id] = attrs["ref"]
152
- end
150
+ @in_entry_elem[:meta][:post_id] = attrs["ref"] if @in_entry_elem
153
151
  end
154
152
  end
155
153
 
@@ -167,9 +165,7 @@ module JekyllImport
167
165
  when "content"
168
166
  @in_entry_elem[:body] = text
169
167
  when "name"
170
- if @tag_bread[-2..-1] == %w(author name)
171
- @in_entry_elem[:meta][:author] = text
172
- end
168
+ @in_entry_elem[:meta][:author] = text if @tag_bread[-2..-1] == %w(author name)
173
169
  when "app:draft"
174
170
  if @tag_bread[-2..-1] == %w(app:control app:draft)
175
171
  @in_entry_elem[:meta][:draft] = true if text == "yes"
@@ -184,7 +180,7 @@ module JekyllImport
184
180
  raise "nest entry element" unless @in_entry_elem
185
181
 
186
182
  if @in_entry_elem[:meta][:kind] == "post"
187
- post_data = get_post_data_from_in_entry_elem_info
183
+ post_data = post_data_from_in_entry_elem_info
188
184
 
189
185
  if post_data
190
186
  target_dir = "_posts"
@@ -202,7 +198,7 @@ module JekyllImport
202
198
  end
203
199
  end
204
200
  elsif @in_entry_elem[:meta][:kind] == "comment" && @comments
205
- post_data = get_post_data_from_in_entry_elem_info
201
+ post_data = post_data_from_in_entry_elem_info
206
202
 
207
203
  if post_data
208
204
  target_dir = "_comments"
@@ -226,7 +222,7 @@ module JekyllImport
226
222
  @tag_bread.pop
227
223
  end
228
224
 
229
- def get_post_data_from_in_entry_elem_info
225
+ def post_data_from_in_entry_elem_info
230
226
  if @in_entry_elem.nil? || !@in_entry_elem.key?(:meta) || !@in_entry_elem[:meta].key?(:kind)
231
227
  nil
232
228
  elsif @in_entry_elem[:meta][:kind] == "post"
@@ -264,20 +260,14 @@ module JekyllImport
264
260
  body = @in_entry_elem[:body]
265
261
 
266
262
  # body escaping associated with liquid
267
- if body =~ %r!{{!
268
- body.gsub!(%r!{{!, '{{ "{{" }}')
269
- end
270
- if body =~ %r!{%!
271
- body.gsub!(%r!{%!, '{{ "{%" }}')
272
- end
263
+ body.gsub!(%r!{{!, '{{ "{{" }}') if body =~ %r!{{!
264
+ body.gsub!(%r!{%!, '{{ "{%" }}') if body =~ %r!{%!
273
265
 
274
266
  { :filename => filename, :header => header, :body => body }
275
267
  elsif @in_entry_elem[:meta][:kind] == "comment"
276
268
  timestamp = Time.parse(@in_entry_elem[:meta][:published]).strftime("%Y-%m-%d")
277
269
  if @in_entry_elem[:meta][:original_url]
278
- unless @comment_seq
279
- @comment_seq = 1
280
- end
270
+ @comment_seq ||= 1
281
271
 
282
272
  original_uri = URI.parse(@in_entry_elem[:meta][:original_url])
283
273
  original_path = original_uri.path.to_s
@@ -303,17 +293,12 @@ module JekyllImport
303
293
  body = @in_entry_elem[:body]
304
294
 
305
295
  # body escaping associated with liquid
306
- if body =~ %r!{{!
307
- body.gsub!(%r!{{!, '{{ "{{" }}')
308
- end
309
- if body =~ %r!{%!
310
- body.gsub!(%r!{%!, '{{ "{%" }}')
311
- end
296
+ body.gsub!(%r!{{!, '{{ "{{" }}') if body =~ %r!{{!
297
+ body.gsub!(%r!{%!, '{{ "{%" }}') if body =~ %r!{%!
312
298
 
313
299
  { :filename => filename, :header => header, :body => body }
314
300
  end
315
301
  end
316
-
317
302
  end
318
303
  end
319
304
  end
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module JekyllImport
4
4
  module Importers
@@ -12,7 +12,7 @@ module JekyllImport
12
12
  end
13
13
 
14
14
  def self.specify_options(c)
15
- c.option "file", "--file NAME", 'The CSV file to import (default: "posts.csv")'
15
+ c.option "file", "--file NAME", 'The CSV file to import (default: "posts.csv")'
16
16
  c.option "no-front-matter", "--no-front-matter", "Do not add the default front matter to the post body"
17
17
  end
18
18
 
@@ -27,6 +27,7 @@ module JekyllImport
27
27
 
28
28
  ::CSV.foreach(file) do |row|
29
29
  next if row[0] == "title" # header
30
+
30
31
  posts += 1
31
32
  write_post(CSVPost.new(row), options)
32
33
  end
@@ -82,12 +83,12 @@ module JekyllImport
82
83
  def self.write_frontmatter(f, post, options)
83
84
  no_frontmatter = options.fetch("no-front-matter", false)
84
85
  unless no_frontmatter
85
- f.puts YAML.dump({
86
+ f.puts YAML.dump(
86
87
  "layout" => "post",
87
88
  "title" => post.title,
88
89
  "date" => post.published_at.to_s,
89
- "permalink" => post.permalink,
90
- })
90
+ "permalink" => post.permalink
91
+ )
91
92
  f.puts "---"
92
93
  end
93
94
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "jekyll-import/importers/drupal_common"
2
4
 
3
5
  module JekyllImport
@@ -6,11 +8,11 @@ module JekyllImport
6
8
  include DrupalCommon
7
9
  extend DrupalCommon::ClassMethods
8
10
 
9
- def self.build_query(prefix, types, engine)
11
+ def self.build_query(prefix, types, _engine)
10
12
  types = types.join("' OR n.type = '")
11
13
  types = "n.type = '#{types}'"
12
14
 
13
- query = <<EOS
15
+ query = <<SQL
14
16
  SELECT n.nid,
15
17
  n.title,
16
18
  nr.body,
@@ -26,9 +28,9 @@ module JekyllImport
26
28
  WHERE (#{types})
27
29
  AND n.vid = nr.vid
28
30
  GROUP BY n.nid
29
- EOS
31
+ SQL
30
32
 
31
- return query
33
+ query
32
34
  end
33
35
 
34
36
  def self.aliases_query(prefix)
@@ -45,7 +47,7 @@ EOS
45
47
  "categories" => tags.split("|"),
46
48
  }
47
49
 
48
- return data, content
50
+ [data, content]
49
51
  end
50
52
  end
51
53
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "jekyll-import/importers/drupal_common"
2
4
 
3
5
  module JekyllImport
@@ -10,21 +12,21 @@ module JekyllImport
10
12
  types = types.join("' OR n.type = '")
11
13
  types = "n.type = '#{types}'"
12
14
 
13
- if engine == "postgresql"
14
- tag_group = <<EOS
15
+ tag_group = if engine == "postgresql"
16
+ <<POSTGRESQL
15
17
  (SELECT STRING_AGG(td.name, '|')
16
- FROM taxonomy_term_data td, taxonomy_index ti
18
+ FROM #{prefix}taxonomy_term_data td, #{prefix}taxonomy_index ti
17
19
  WHERE ti.tid = td.tid AND ti.nid = n.nid) AS tags
18
- EOS
19
- else
20
- tag_group = <<EOS
20
+ POSTGRESQL
21
+ else
22
+ <<SQL
21
23
  (SELECT GROUP_CONCAT(td.name SEPARATOR '|')
22
- FROM taxonomy_term_data td, taxonomy_index ti
24
+ FROM #{prefix}taxonomy_term_data td, #{prefix}taxonomy_index ti
23
25
  WHERE ti.tid = td.tid AND ti.nid = n.nid) AS 'tags'
24
- EOS
25
- end
26
+ SQL
27
+ end
26
28
 
27
- query = <<EOS
29
+ query = <<QUERY
28
30
  SELECT n.nid,
29
31
  n.title,
30
32
  fdb.body_value,
@@ -37,9 +39,9 @@ EOS
37
39
  LEFT JOIN #{prefix}field_data_body AS fdb
38
40
  ON fdb.entity_id = n.nid AND fdb.entity_type = 'node'
39
41
  WHERE (#{types})
40
- EOS
42
+ QUERY
41
43
 
42
- return query
44
+ query
43
45
  end
44
46
 
45
47
  def self.aliases_query(prefix)
@@ -56,7 +58,7 @@ EOS
56
58
  "categories" => tags.split("|"),
57
59
  }
58
60
 
59
- return data, content
61
+ [data, content]
60
62
  end
61
63
  end
62
64
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "date"
2
4
 
3
5
  module JekyllImport
@@ -16,18 +18,21 @@ module JekyllImport
16
18
  "password" => "",
17
19
  "host" => "localhost",
18
20
  "prefix" => "",
21
+ "port" => "3306",
19
22
  "types" => %w(blog story article),
20
23
  }.freeze
21
24
 
22
25
  def specify_options(c)
23
- c.option "engine", "--engine [mysql|postgresql]", "Database engine (default: #{DEFAULTS["engine"].inspect})"
24
- c.option "dbname", "--dbname DB", "Database name"
25
- c.option "user", "--user USER", "Database user name"
26
- c.option "password", "--password PW", "Database user's password (default: #{DEFAULTS["password"].inspect})"
27
- c.option "host", "--host HOST", "Database host name (default: #{DEFAULTS["host"].inspect})"
28
- c.option "prefix", "--prefix PREFIX", "Table prefix name (default: #{DEFAULTS["prefix"].inspect})"
29
- c.option "types", "--types TYPE1[,TYPE2[,TYPE3...]]", Array,
30
- "The Drupal content types to be imported (default: #{DEFAULTS["types"].join(",")})"
26
+ c.option "engine", "--engine [mysql|postgresql]", "Database engine (default: #{DEFAULTS["engine"].inspect})"
27
+ c.option "dbname", "--dbname DB", "Database name"
28
+ c.option "user", "--user USER", "Database user name"
29
+ c.option "password", "--password PW", "Database user's password (default: #{DEFAULTS["password"].inspect})"
30
+ c.option "host", "--host HOST", "Database host name (default: #{DEFAULTS["host"].inspect})"
31
+ c.option "port", "--port PORT", "Database port name (default: #{DEFAULTS["port"].inspect})"
32
+ c.option "prefix", "--prefix PREFIX", "Table prefix name (default: #{DEFAULTS["prefix"].inspect})"
33
+
34
+ c.option "types", "--types TYPE1[,TYPE2[,TYPE3...]]", Array,
35
+ "The Drupal content types to be imported (default: #{DEFAULTS["types"].join(",")})"
31
36
  end
32
37
 
33
38
  def require_deps
@@ -42,21 +47,22 @@ module JekyllImport
42
47
  end
43
48
 
44
49
  def process(options)
45
- engine = options.fetch("engine")
50
+ engine = options.fetch("engine", DEFAULTS["engine"])
46
51
  dbname = options.fetch("dbname")
47
52
  user = options.fetch("user")
48
53
  pass = options.fetch("password", DEFAULTS["password"])
49
54
  host = options.fetch("host", DEFAULTS["host"])
55
+ port = options.fetch("port", DEFAULTS["port"])
50
56
  prefix = options.fetch("prefix", DEFAULTS["prefix"])
51
57
  types = options.fetch("types", DEFAULTS["types"])
52
58
 
53
59
  if engine == "postgresql"
54
60
  db = Sequel.postgres(dbname, :user => user, :password => pass, :host => host, :encoding => "utf8")
55
61
  else
56
- db = Sequel.mysql2(dbname, :user => user, :password => pass, :host => host, :encoding => "utf8")
62
+ db = Sequel.mysql2(dbname, :user => user, :password => pass, :host => host, :port => port, :encoding => "utf8")
57
63
  end
58
64
 
59
- query = self.build_query(prefix, types, engine)
65
+ query = build_query(prefix, types, engine)
60
66
 
61
67
  conf = Jekyll.configuration({})
62
68
  src_dir = conf["source"]
@@ -74,20 +80,21 @@ module JekyllImport
74
80
  # Create the refresh layout
75
81
  # Change the refresh url if you customized your permalink config
76
82
  File.open(File.join(dirs[:_layouts], "refresh.html"), "w") do |f|
77
- f.puts <<-HTML
78
- <!DOCTYPE html>
79
- <html>
80
- <head>
81
- <meta http-equiv="content-type" content="text/html; charset=utf-8" />
82
- <meta http-equiv="refresh" content="0;url={{ page.refresh_to_post_id }}.html" />
83
- </head>
84
- </html>
85
- HTML
83
+ f.puts <<~HTML
84
+ <!DOCTYPE html>
85
+ <html>
86
+ <head>
87
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
88
+ <meta http-equiv="refresh" content="0;url={{ page.refresh_to_post_id }}.html" />
89
+ <link rel="canonical" href="{{ page.refresh_to_post_id }}.html" />
90
+ </head>
91
+ </html>
92
+ HTML
86
93
  end
87
94
 
88
95
  db[query].each do |post|
89
96
  # Get required fields
90
- data, content = self.post_data(post)
97
+ data, content = post_data(post)
91
98
 
92
99
  data["layout"] = post[:type]
93
100
  title = data["title"] = post[:title].strip.force_encoding("UTF-8")
@@ -95,7 +102,7 @@ HTML
95
102
 
96
103
  # Get the relevant fields as a hash and delete empty fields
97
104
  data = data.delete_if { |_k, v| v.nil? || v == "" }.each_pair do |_k, v|
98
- ((v.is_a? String) ? v.force_encoding("UTF-8") : v)
105
+ v.is_a?(String) ? v.force_encoding("UTF-8") : v
99
106
  end
100
107
 
101
108
  # Construct a Jekyll compatible file name
@@ -114,19 +121,39 @@ HTML
114
121
 
115
122
  # Make a file to redirect from the old Drupal URL
116
123
  next unless is_published
117
- alias_query = self.aliases_query(prefix)
124
+
125
+ alias_query = aliases_query(prefix)
118
126
  type = post[:type]
119
127
 
120
- aliases = db[alias_query, "#{type}/#{node_id}"].all
128
+ aliases_type = db[alias_query, "#{type}/#{node_id}"].all
129
+ aliases_node = db[alias_query, "node/#{node_id}"].all
130
+ aliases = aliases_type.concat aliases_node
121
131
 
122
132
  aliases.push(:alias => "#{type}/#{node_id}")
133
+ aliases.push(:alias => "node/#{node_id}")
123
134
 
124
135
  aliases.each do |url_alias|
125
- FileUtils.mkdir_p url_alias[:alias]
126
- File.open("#{url_alias[:alias]}/index.md", "w") do |f|
136
+ redirect_prefix = ""
137
+ categories = data["categories"]
138
+ unless categories.nil? || categories.length.zero?
139
+ first_category = categories[0]
140
+ redirect_prefix = "#{first_category}/"
141
+ end
142
+
143
+ partition = url_alias[:alias].rpartition("/")
144
+ dir = ""
145
+ file = partition.last
146
+
147
+ if partition.first.length.positive?
148
+ dir = "#{partition.first}/"
149
+ FileUtils.mkdir_p partition.first
150
+ end
151
+
152
+ File.open("#{dir}#{file}.md", "w") do |f|
127
153
  f.puts "---"
128
154
  f.puts "layout: refresh"
129
- f.puts "refresh_to_post_id: /#{Time.at(time).to_datetime.strftime("%Y/%m/%d/") + slug}"
155
+ f.puts "permalink: #{dir}#{file}/"
156
+ f.puts "refresh_to_post_id: /#{redirect_prefix}#{Time.at(time).to_datetime.strftime("%Y/%m/%d/") + slug}"
130
157
  f.puts "---"
131
158
  end
132
159
  end
@@ -152,12 +179,9 @@ HTML
152
179
 
153
180
  def validate(options)
154
181
  %w(dbname user).each do |option|
155
- if options[option].nil?
156
- abort "Missing mandatory option --#{option}."
157
- end
182
+ abort "Missing mandatory option --#{option}." unless options.key?(option)
158
183
  end
159
184
  end
160
-
161
185
  end
162
186
  end
163
187
  end