jekyll-import 0.14.0 → 0.15.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.
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