jekyll-import 0.20.0 → 0.22.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.markdown +2 -1
- data/lib/jekyll/commands/import.rb +1 -1
- data/lib/jekyll-import/importers/blogger.rb +54 -66
- data/lib/jekyll-import/importers/csv.rb +2 -2
- data/lib/jekyll-import/importers/dotclear.rb +147 -88
- data/lib/jekyll-import/importers/drupal6.rb +7 -3
- data/lib/jekyll-import/importers/drupal8.rb +65 -0
- data/lib/jekyll-import/importers/drupal_common.rb +6 -5
- data/lib/jekyll-import/importers/easyblog.rb +7 -7
- data/lib/jekyll-import/importers/enki.rb +4 -4
- data/lib/jekyll-import/importers/joomla.rb +8 -8
- data/lib/jekyll-import/importers/joomla3.rb +8 -8
- data/lib/jekyll-import/importers/jrnl.rb +4 -4
- data/lib/jekyll-import/importers/marley.rb +1 -1
- data/lib/jekyll-import/importers/medium.rb +36 -0
- data/lib/jekyll-import/importers/mephisto.rb +3 -3
- data/lib/jekyll-import/importers/mt.rb +10 -10
- data/lib/jekyll-import/importers/pluxml.rb +3 -3
- data/lib/jekyll-import/importers/roller.rb +12 -12
- data/lib/jekyll-import/importers/rss.rb +64 -27
- data/lib/jekyll-import/importers/s9y_database.rb +270 -56
- data/lib/jekyll-import/importers/textpattern.rb +5 -5
- data/lib/jekyll-import/importers/tumblr.rb +5 -5
- data/lib/jekyll-import/importers/typo.rb +6 -6
- data/lib/jekyll-import/importers/wordpress.rb +16 -16
- data/lib/jekyll-import/importers/wordpressdotcom.rb +3 -3
- data/lib/jekyll-import/version.rb +1 -1
- metadata +34 -46
@@ -11,25 +11,31 @@ module JekyllImport
|
|
11
11
|
fileutils
|
12
12
|
safe_yaml
|
13
13
|
unidecode
|
14
|
+
nokogiri
|
14
15
|
)
|
15
16
|
)
|
16
17
|
end
|
17
18
|
|
18
19
|
def self.specify_options(c)
|
19
|
-
c.option "dbname",
|
20
|
-
c.option "socket",
|
21
|
-
c.option "user",
|
22
|
-
c.option "password",
|
23
|
-
c.option "host",
|
24
|
-
c.option "port",
|
25
|
-
c.option "table_prefix",
|
26
|
-
c.option "clean_entities",
|
27
|
-
c.option "comments",
|
28
|
-
c.option "categories",
|
29
|
-
c.option "tags",
|
30
|
-
c.option "drafts",
|
31
|
-
c.option "markdown",
|
32
|
-
c.option "permalinks",
|
20
|
+
c.option "dbname", "--dbname DB", "Database name. (default: '')"
|
21
|
+
c.option "socket", "--socket SOCKET", "Database socket. (default: '')"
|
22
|
+
c.option "user", "--user USER", "Database user name. (default: '')"
|
23
|
+
c.option "password", "--password PW", "Database user's password. (default: '')"
|
24
|
+
c.option "host", "--host HOST", "Database host name. (default: 'localhost')"
|
25
|
+
c.option "port", "--port PORT", "Custom database port connect to. (default: 3306)"
|
26
|
+
c.option "table_prefix", "--table_prefix PREFIX", "Table prefix name. (default: 'serendipity_')"
|
27
|
+
c.option "clean_entities", "--clean_entities", "Whether to clean entities. (default: true)"
|
28
|
+
c.option "comments", "--comments", "Whether to import comments. (default: true)"
|
29
|
+
c.option "categories", "--categories", "Whether to import categories. (default: true)"
|
30
|
+
c.option "tags", "--tags", "Whether to import tags. (default: true)"
|
31
|
+
c.option "drafts", "--drafts", "Whether to export drafts as well. (default: true)"
|
32
|
+
c.option "markdown", "--markdown", "convert into markdown format. (default: false)"
|
33
|
+
c.option "permalinks", "--permalinks", "preserve S9Y permalinks. (default: false)"
|
34
|
+
c.option "excerpt_separator", "--excerpt_separator", "Demarkation for excerpts. (default: '<a id=\"extended\"></a>')"
|
35
|
+
c.option "includeentry", "--includeentry", "Replace macros from the includeentry plugin. (default: false)"
|
36
|
+
c.option "imgfig", "--imgfig", "Replace nested img and youtube divs with HTML figure tags. (default: true)"
|
37
|
+
c.option "linebreak", "--linebreak", "Line break processing: wp, nokogiri, ignore. (default: wp)"
|
38
|
+
c.option "relative", "--relative", "Convert links with this prefix to relative. (default: nil)"
|
33
39
|
end
|
34
40
|
|
35
41
|
# Main migrator function. Call this to perform the migration.
|
@@ -56,36 +62,64 @@ module JekyllImport
|
|
56
62
|
# :categories:: If true, save the post's categories in its
|
57
63
|
# YAML front matter. Default: true.
|
58
64
|
# :tags:: If true, save the post's tags in its
|
59
|
-
# YAML front matter.
|
65
|
+
# YAML front matter, in lowercase. Default: true.
|
60
66
|
# :extension:: Set the post extension. Default: "html"
|
61
67
|
# :drafts:: If true, export drafts as well
|
62
68
|
# Default: true.
|
63
69
|
# :markdown:: If true, convert the content to markdown
|
64
70
|
# Default: false
|
65
71
|
# :permalinks:: If true, save the post's original permalink in its
|
66
|
-
# YAML front matter.
|
72
|
+
# YAML front matter. If the 'entryproperties' plugin
|
73
|
+
# was used, its permalink will become the canonical
|
74
|
+
# permalink, and any other will become redirects.
|
75
|
+
# Default: false.
|
76
|
+
# :excerpt_separator:: A string to use to separate the excerpt (body
|
77
|
+
# in S9Y) from the rest of the article (extended
|
78
|
+
# body in S9Y). Default: "<a id=\"extended\"></a>".
|
79
|
+
# :includentry:: Replace macros from the includentry plugin - these are
|
80
|
+
# the [s9y-include-entry] and [s9y-include-block] macros.
|
81
|
+
# Default: false.
|
82
|
+
# :imgfig:: Replace S9Y image-comment divs with an HTML figure
|
83
|
+
# div and figcaption, if applicable. Works for img and
|
84
|
+
# iframe.
|
85
|
+
# Default: true.
|
67
86
|
#
|
87
|
+
# :linebreak:: When set to the default "wp", line breaks in entries
|
88
|
+
# will be processed WordPress style, by replacing double
|
89
|
+
# line breaks with HTML p tags, and remaining single
|
90
|
+
# line breaks with HTML br tags. When set to "nokogiri",
|
91
|
+
# entries will be loaded into Nokogiri and formatted as
|
92
|
+
# an XHTML fragment. When set to "ignore", line breaks
|
93
|
+
# will not be replaced at all.
|
94
|
+
# Default: wp
|
95
|
+
# :relative:: Replace absolute links (http://:relative:/foo)
|
96
|
+
# to relative links (/foo).
|
97
|
+
|
68
98
|
def self.process(opts)
|
69
99
|
options = {
|
70
|
-
:user
|
71
|
-
:pass
|
72
|
-
:host
|
73
|
-
:port
|
74
|
-
:socket
|
75
|
-
:dbname
|
76
|
-
:table_prefix
|
77
|
-
:clean_entities
|
78
|
-
:comments
|
79
|
-
:categories
|
80
|
-
:tags
|
81
|
-
:extension
|
82
|
-
:drafts
|
83
|
-
:markdown
|
84
|
-
:permalinks
|
100
|
+
:user => opts.fetch("user", ""),
|
101
|
+
:pass => opts.fetch("password", ""),
|
102
|
+
:host => opts.fetch("host", "127.0.0.1"),
|
103
|
+
:port => opts.fetch("port", 3306),
|
104
|
+
:socket => opts.fetch("socket", nil),
|
105
|
+
:dbname => opts.fetch("dbname", ""),
|
106
|
+
:table_prefix => opts.fetch("table_prefix", "serendipity_"),
|
107
|
+
:clean_entities => opts.fetch("clean_entities", true),
|
108
|
+
:comments => opts.fetch("comments", true),
|
109
|
+
:categories => opts.fetch("categories", true),
|
110
|
+
:tags => opts.fetch("tags", true),
|
111
|
+
:extension => opts.fetch("extension", "html"),
|
112
|
+
:drafts => opts.fetch("drafts", true),
|
113
|
+
:markdown => opts.fetch("markdown", false),
|
114
|
+
:permalinks => opts.fetch("permalinks", false),
|
115
|
+
:excerpt_separator => opts.fetch("excerpt_separator", "<a id=\"extended\"></a>"),
|
116
|
+
:includeentry => opts.fetch("includeentry", false),
|
117
|
+
:imgfig => opts.fetch("imgfig", true),
|
118
|
+
:linebreak => opts.fetch("linebreak", "wp"),
|
119
|
+
:relative => opts.fetch("relative", nil),
|
85
120
|
}
|
86
121
|
|
87
122
|
options[:clean_entities] = require_if_available("htmlentities", "clean_entities") if options[:clean_entities]
|
88
|
-
|
89
123
|
options[:markdown] = require_if_available("reverse_markdown", "markdown") if options[:markdown]
|
90
124
|
|
91
125
|
FileUtils.mkdir_p("_posts")
|
@@ -120,6 +154,7 @@ module JekyllImport
|
|
120
154
|
|
121
155
|
posts_query = "
|
122
156
|
SELECT
|
157
|
+
'post' AS `type`,
|
123
158
|
entries.ID AS `id`,
|
124
159
|
entries.isdraft AS `isdraft`,
|
125
160
|
entries.title AS `title`,
|
@@ -154,36 +189,41 @@ module JekyllImport
|
|
154
189
|
name = format("%02d-%02d-%02d-%s.%s", date.year, date.month, date.day, slug, extension)
|
155
190
|
|
156
191
|
content = post[:body].to_s
|
157
|
-
|
192
|
+
extended_content = post[:body_extended].to_s
|
193
|
+
|
194
|
+
content += options[:excerpt_separator] + extended_content unless extended_content.nil? || extended_content.strip.empty?
|
158
195
|
|
196
|
+
content = process_includeentry(content, db, options) if options[:includeentry]
|
197
|
+
content = process_img_div(content) if options[:imgfig]
|
159
198
|
content = clean_entities(content) if options[:clean_entities]
|
199
|
+
content = content.gsub(%r!href=(["'])http://#{options[:relative]}!, 'href=\1') if options[:relative]
|
160
200
|
|
161
201
|
content = ReverseMarkdown.convert(content) if options[:markdown]
|
162
202
|
|
163
203
|
categories = process_categories(db, options, post)
|
164
204
|
comments = process_comments(db, options, post)
|
165
205
|
tags = process_tags(db, options, post)
|
166
|
-
|
206
|
+
all_permalinks = process_permalink(db, options, post)
|
207
|
+
primary_permalink = all_permalinks.shift
|
208
|
+
supplemental_permalinks = all_permalinks unless all_permalinks.empty?
|
167
209
|
|
168
210
|
# Get the relevant fields as a hash, delete empty fields and
|
169
211
|
# convert to YAML for the header.
|
170
212
|
data = {
|
171
|
-
"layout"
|
172
|
-
"status"
|
173
|
-
"published"
|
174
|
-
"title"
|
175
|
-
"author"
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
"
|
181
|
-
"
|
182
|
-
"
|
183
|
-
"
|
184
|
-
"
|
185
|
-
"tags" => options[:tags] ? tags : nil,
|
186
|
-
"comments" => options[:comments] ? comments : nil,
|
213
|
+
"layout" => post[:type].to_s,
|
214
|
+
"status" => status.to_s,
|
215
|
+
"published" => status.to_s == "draft" ? nil : (status.to_s == "published"),
|
216
|
+
"title" => title.to_s,
|
217
|
+
"author" => post[:author].to_s,
|
218
|
+
"author_login" => post[:author_login].to_s,
|
219
|
+
"author_email" => post[:author_email].to_s,
|
220
|
+
"date" => date.to_s,
|
221
|
+
"permalink" => options[:permalinks] ? primary_permalink : nil,
|
222
|
+
"redirect_from" => options[:permalinks] ? supplemental_permalinks : nil,
|
223
|
+
"categories" => options[:categories] ? categories : nil,
|
224
|
+
"tags" => options[:tags] ? tags : nil,
|
225
|
+
"comments" => options[:comments] ? comments : nil,
|
226
|
+
"excerpt_separator" => extended_content.empty? ? nil : options[:excerpt_separator],
|
187
227
|
}.delete_if { |_k, v| v.nil? || v == "" }.to_yaml
|
188
228
|
|
189
229
|
if post[:type] == "page"
|
@@ -195,11 +235,21 @@ module JekyllImport
|
|
195
235
|
filename = "_posts/#{name}"
|
196
236
|
end
|
197
237
|
|
238
|
+
content = case options[:linebreak]
|
239
|
+
when "nokogiri"
|
240
|
+
Nokogiri::HTML.fragment(content).to_xhtml
|
241
|
+
when "ignore"
|
242
|
+
content
|
243
|
+
else
|
244
|
+
# "wp" is the only remaining option, and the default
|
245
|
+
Util.wpautop(content)
|
246
|
+
end
|
247
|
+
|
198
248
|
# Write out the data and content to file
|
199
249
|
File.open(filename, "w") do |f|
|
200
250
|
f.puts data
|
201
251
|
f.puts "---"
|
202
|
-
f.puts
|
252
|
+
f.puts content
|
203
253
|
end
|
204
254
|
end
|
205
255
|
|
@@ -207,10 +257,154 @@ module JekyllImport
|
|
207
257
|
require gem_name
|
208
258
|
true
|
209
259
|
rescue LoadError
|
210
|
-
warn "Could not require '#{gem_name}', so the :#{option_name} option is now disabled."
|
260
|
+
Jekyll.logger.warn "s9y database:", "Could not require '#{gem_name}', so the :#{option_name} option is now disabled."
|
211
261
|
true
|
212
262
|
end
|
213
263
|
|
264
|
+
def self.process_includeentry(text, db, options)
|
265
|
+
return text unless options[:includeentry]
|
266
|
+
|
267
|
+
result = text
|
268
|
+
|
269
|
+
px = options[:table_prefix]
|
270
|
+
|
271
|
+
props = text.scan(%r!(\[s9y-include-entry:([0-9]+):([^:]+)\])!)
|
272
|
+
blocks = text.scan(%r!(\[s9y-include-block:([0-9]+):?([^:]+)?\])!)
|
273
|
+
|
274
|
+
props.each do |match|
|
275
|
+
macro = match[0]
|
276
|
+
id = match[1]
|
277
|
+
replacement = ""
|
278
|
+
if match[2].start_with?("prop=")
|
279
|
+
prop = match[2].sub("prop=", "")
|
280
|
+
cquery = get_property_query(px, id, prop)
|
281
|
+
else
|
282
|
+
prop = match[2]
|
283
|
+
cquery = get_value_query(px, id, prop)
|
284
|
+
end
|
285
|
+
db[cquery].each do |row|
|
286
|
+
replacement << row[:txt]
|
287
|
+
end
|
288
|
+
result = result.sub(macro, replacement)
|
289
|
+
end
|
290
|
+
|
291
|
+
blocks.each do |match|
|
292
|
+
macro = match[0]
|
293
|
+
id = match[1]
|
294
|
+
replacement = ""
|
295
|
+
# match[2] *could* be 'template', but we can't run it through Smarty, so we ignore it
|
296
|
+
cquery = %(
|
297
|
+
SELECT
|
298
|
+
px.body AS `txt`
|
299
|
+
FROM
|
300
|
+
#{px}staticblocks AS px
|
301
|
+
WHERE
|
302
|
+
id = '#{id}'
|
303
|
+
)
|
304
|
+
db[cquery].each do |row|
|
305
|
+
replacement << row[:txt]
|
306
|
+
end
|
307
|
+
result = result.sub(macro, replacement)
|
308
|
+
end
|
309
|
+
|
310
|
+
result
|
311
|
+
end
|
312
|
+
|
313
|
+
def get_property_query(px, id, prop)
|
314
|
+
%(
|
315
|
+
SELECT
|
316
|
+
px.value AS `txt`
|
317
|
+
FROM
|
318
|
+
#{px}entryproperties AS px
|
319
|
+
WHERE
|
320
|
+
entryid = '#{id}' AND
|
321
|
+
property = '#{prop}'
|
322
|
+
)
|
323
|
+
end
|
324
|
+
|
325
|
+
def get_value_query(px, id, prop)
|
326
|
+
%(
|
327
|
+
SELECT
|
328
|
+
px.#{prop} AS `txt`
|
329
|
+
FROM
|
330
|
+
#{px}entries AS px
|
331
|
+
WHERE
|
332
|
+
entryid = '#{id}'
|
333
|
+
)
|
334
|
+
end
|
335
|
+
|
336
|
+
# Replace .serendipity_imageComment_* blocks
|
337
|
+
def self.process_img_div(text)
|
338
|
+
caption_classes = [
|
339
|
+
".serendipity_imageComment_left",
|
340
|
+
".serendipity_imageComment_right",
|
341
|
+
".serendipity_imageComment_center",
|
342
|
+
]
|
343
|
+
|
344
|
+
noko = Nokogiri::HTML.fragment(text)
|
345
|
+
noko.css(caption_classes.join(",")).each do |imgcaption|
|
346
|
+
block_attrs = get_block_attrs(imgcaption)
|
347
|
+
|
348
|
+
# Is this a thumbnail to a bigger/other image?
|
349
|
+
big_link = imgcaption.at_css(".serendipity_image_link")
|
350
|
+
big_link ||= imgcaption.at_xpath(".//a[.//img]")
|
351
|
+
|
352
|
+
# The caption (if any) may have raw HTML
|
353
|
+
caption_elem = imgcaption.at_css(".serendipity_imageComment_txt")
|
354
|
+
caption = ""
|
355
|
+
caption = "<figcaption>#{caption_elem.inner_html}</figcaption>" if caption_elem
|
356
|
+
|
357
|
+
image_node = imgcaption.at_css("img")
|
358
|
+
if image_node
|
359
|
+
attrs = get_media_attrs(image_node)
|
360
|
+
media = "<img #{attrs}/>"
|
361
|
+
else
|
362
|
+
iframe_node = imgcaption.at_css("iframe")
|
363
|
+
if iframe_node
|
364
|
+
attrs = get_media_attrs(iframe_node)
|
365
|
+
media = "<iframe #{attrs}'></iframe>"
|
366
|
+
else
|
367
|
+
Jekyll.logger.warn "s9y database:", "Unrecognized media block: #{imgcaption}"
|
368
|
+
return text
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
# Wrap media in link, if any
|
373
|
+
if big_link
|
374
|
+
big = big_link.attribute("href")
|
375
|
+
media = "<a href='#{big}'>#{media}</a>"
|
376
|
+
end
|
377
|
+
|
378
|
+
# Replace HTML with clean media source, wrapped in figure
|
379
|
+
imgcaption.replace("<figure #{block_attrs}#{media}#{caption}</figure>")
|
380
|
+
end
|
381
|
+
|
382
|
+
noko.to_s
|
383
|
+
end
|
384
|
+
|
385
|
+
def get_media_attrs(node)
|
386
|
+
width = node.attribute("width")
|
387
|
+
width = "width='#{width}'" if width
|
388
|
+
height = node.attribute("height")
|
389
|
+
height = "height='#{height}'" if height
|
390
|
+
alt = node.attribute("alt")
|
391
|
+
alt = "alt='#{alt}'" if alt
|
392
|
+
src = "src='" + node.attribute("src") + "'"
|
393
|
+
[src, width, height, alt].join(" ")
|
394
|
+
end
|
395
|
+
|
396
|
+
def get_block_attrs(imgcaption)
|
397
|
+
# Extract block-level attributes
|
398
|
+
float = imgcaption.attribute("class").value.sub("serendipity_imageComment_", "")
|
399
|
+
float = "class='figure-#{float}'"
|
400
|
+
style = imgcaption.attribute("style")
|
401
|
+
style = " style='#{style.value}'" if style
|
402
|
+
# Don't lose good data
|
403
|
+
mdbnum = imgcaption.search(".//comment()").text.strip.sub("s9ymdb:", "")
|
404
|
+
mdb = "<!-- mdb='#{mdbnum}' -->" if mdbnum
|
405
|
+
[float, style, mdb].join(" ")
|
406
|
+
end
|
407
|
+
|
214
408
|
def self.process_categories(db, options, post)
|
215
409
|
return [] unless options[:categories]
|
216
410
|
|
@@ -293,18 +487,36 @@ module JekyllImport
|
|
293
487
|
|
294
488
|
db[cquery].each_with_object([]) do |tag, tags|
|
295
489
|
tags << if options[:clean_entities]
|
296
|
-
clean_entities(tag[:name])
|
490
|
+
clean_entities(tag[:name]).downcase
|
297
491
|
else
|
298
|
-
tag[:name]
|
492
|
+
tag[:name].downcase
|
299
493
|
end
|
300
494
|
end
|
301
495
|
end
|
302
496
|
|
303
497
|
def self.process_permalink(db, options, post)
|
304
|
-
return unless options[:permalinks]
|
498
|
+
return [] unless options[:permalinks]
|
499
|
+
|
500
|
+
permalinks = []
|
305
501
|
|
306
502
|
px = options[:table_prefix]
|
307
503
|
|
504
|
+
if db.table_exists?("#{px}entryproperties")
|
505
|
+
pquery = %(
|
506
|
+
SELECT
|
507
|
+
props.value AS `permalink`
|
508
|
+
FROM
|
509
|
+
#{px}entryproperties AS props
|
510
|
+
WHERE
|
511
|
+
props.entryid = '#{post[:id]}' AND
|
512
|
+
props.property = 'permalink'
|
513
|
+
)
|
514
|
+
db[pquery].each do |link|
|
515
|
+
plink = link[:permalink].to_s
|
516
|
+
permalinks << plink unless plink.end_with? "/UNKNOWN.html"
|
517
|
+
end
|
518
|
+
end
|
519
|
+
|
308
520
|
cquery = %(
|
309
521
|
SELECT
|
310
522
|
permalinks.permalink AS `permalink`
|
@@ -316,8 +528,10 @@ module JekyllImport
|
|
316
528
|
)
|
317
529
|
|
318
530
|
db[cquery].each do |link|
|
319
|
-
|
531
|
+
permalinks << "/#{link[:permalink]}"
|
320
532
|
end
|
533
|
+
|
534
|
+
permalinks
|
321
535
|
end
|
322
536
|
|
323
537
|
def self.clean_entities(text)
|
@@ -27,17 +27,17 @@ module JekyllImport
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def self.specify_options(c)
|
30
|
-
c.option "dbname", "--dbname DB", "Database name"
|
31
|
-
c.option "user", "--user USER", "Database user name"
|
32
|
-
c.option "password", "--password PW", "Database user's password"
|
33
|
-
c.option "host", "--host HOST",
|
30
|
+
c.option "dbname", "--dbname DB", "Database name."
|
31
|
+
c.option "user", "--user USER", "Database user name."
|
32
|
+
c.option "password", "--password PW", "Database user's password. (default: '')"
|
33
|
+
c.option "host", "--host HOST", "Database host name. (default: 'localhost')"
|
34
34
|
end
|
35
35
|
|
36
36
|
def self.process(options)
|
37
37
|
dbname = options.fetch("dbname")
|
38
38
|
user = options.fetch("user")
|
39
39
|
pass = options.fetch("password", "")
|
40
|
-
host = options.fetch("host", "
|
40
|
+
host = options.fetch("host", "127.0.0.1")
|
41
41
|
|
42
42
|
db = Sequel.mysql2(dbname, :user => user, :password => pass, :host => host, :encoding => "utf8")
|
43
43
|
|
@@ -19,11 +19,11 @@ module JekyllImport
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def specify_options(c)
|
22
|
-
c.option "url", "--url URL", "Tumblr URL"
|
23
|
-
c.option "format", "--format FORMAT",
|
24
|
-
c.option "grab_images", "--grab_images", "Whether to grab images (default: false)"
|
25
|
-
c.option "add_highlights", "--add_highlights", "Whether to add highlights (default: false)"
|
26
|
-
c.option "rewrite_urls", "--rewrite_urls", "Whether to rewrite URLs (default: false)"
|
22
|
+
c.option "url", "--url URL", "Tumblr URL."
|
23
|
+
c.option "format", "--format FORMAT", "Output format. (default: 'html')"
|
24
|
+
c.option "grab_images", "--grab_images", "Whether to grab images. (default: false)"
|
25
|
+
c.option "add_highlights", "--add_highlights", "Whether to add highlights. (default: false)"
|
26
|
+
c.option "rewrite_urls", "--rewrite_urls", "Whether to rewrite URLs. (default: false)"
|
27
27
|
end
|
28
28
|
|
29
29
|
def process(options)
|
@@ -31,11 +31,11 @@ module JekyllImport
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def self.specify_options(c)
|
34
|
-
c.option "server", "--server TYPE",
|
35
|
-
c.option "dbname", "--dbname DB", "Database name"
|
36
|
-
c.option "user", "--user USER", "Database user name"
|
37
|
-
c.option "password", "--password PW", "Database user's password (default: '')"
|
38
|
-
c.option "host", "--host HOST", "Database host name"
|
34
|
+
c.option "server", "--server TYPE", "Server type ('mysql' or 'postgres')."
|
35
|
+
c.option "dbname", "--dbname DB", "Database name."
|
36
|
+
c.option "user", "--user USER", "Database user name."
|
37
|
+
c.option "password", "--password PW", "Database user's password. (default: '')"
|
38
|
+
c.option "host", "--host HOST", "Database host name. (default: 'localhost')"
|
39
39
|
end
|
40
40
|
|
41
41
|
def self.process(options)
|
@@ -43,7 +43,7 @@ module JekyllImport
|
|
43
43
|
dbname = options.fetch("dbname")
|
44
44
|
user = options.fetch("user")
|
45
45
|
pass = options.fetch("password", "")
|
46
|
-
host = options.fetch("host", "
|
46
|
+
host = options.fetch("host", "127.0.0.1")
|
47
47
|
|
48
48
|
FileUtils.mkdir_p "_posts"
|
49
49
|
case server.intern
|
@@ -14,23 +14,23 @@ module JekyllImport
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def self.specify_options(c)
|
17
|
-
c.option "dbname", "--dbname DB", "Database name (default: '')"
|
18
|
-
c.option "socket", "--socket SOCKET", "Database socket (default: '')"
|
19
|
-
c.option "user", "--user USER", "Database user name (default: '')"
|
20
|
-
c.option "password", "--password PW", "Database user's password (default: '')"
|
21
|
-
c.option "host", "--host HOST", "Database host name (default: 'localhost')"
|
22
|
-
c.option "port", "--port PORT", "Database port number (default: '')"
|
23
|
-
c.option "table_prefix", "--table_prefix PREFIX", "Table prefix name (default: 'wp_')"
|
24
|
-
c.option "site_prefix", "--site_prefix PREFIX", "Site prefix name (default: '')"
|
25
|
-
c.option "clean_entities", "--clean_entities", "Whether to clean entities (default: true)"
|
26
|
-
c.option "comments", "--comments", "Whether to import comments (default: true)"
|
27
|
-
c.option "categories", "--categories", "Whether to import categories (default: true)"
|
28
|
-
c.option "tags", "--tags", "Whether to import tags (default: true)"
|
29
|
-
c.option "more_excerpt", "--more_excerpt", "Whether to use more excerpt (default: true)"
|
30
|
-
c.option "more_anchor", "--more_anchor", "Whether to use more anchor (default: true)"
|
17
|
+
c.option "dbname", "--dbname DB", "Database name. (default: '')"
|
18
|
+
c.option "socket", "--socket SOCKET", "Database socket. (default: '')"
|
19
|
+
c.option "user", "--user USER", "Database user name. (default: '')"
|
20
|
+
c.option "password", "--password PW", "Database user's password. (default: '')"
|
21
|
+
c.option "host", "--host HOST", "Database host name. (default: 'localhost')"
|
22
|
+
c.option "port", "--port PORT", "Database port number. (default: '')"
|
23
|
+
c.option "table_prefix", "--table_prefix PREFIX", "Table prefix name. (default: 'wp_')"
|
24
|
+
c.option "site_prefix", "--site_prefix PREFIX", "Site prefix name. (default: '')"
|
25
|
+
c.option "clean_entities", "--clean_entities", "Whether to clean entities. (default: true)"
|
26
|
+
c.option "comments", "--comments", "Whether to import comments. (default: true)"
|
27
|
+
c.option "categories", "--categories", "Whether to import categories. (default: true)"
|
28
|
+
c.option "tags", "--tags", "Whether to import tags. (default: true)"
|
29
|
+
c.option "more_excerpt", "--more_excerpt", "Whether to use more excerpt. (default: true)"
|
30
|
+
c.option "more_anchor", "--more_anchor", "Whether to use more anchor. (default: true)"
|
31
31
|
|
32
32
|
c.option "status", "--status STATUS,STATUS2", Array,
|
33
|
-
"Array of allowed statuses (
|
33
|
+
"Array of allowed statuses ('publish', 'draft', 'private', 'revision'). (default: ['publish'])"
|
34
34
|
end
|
35
35
|
|
36
36
|
# Main migrator function. Call this to perform the migration.
|
@@ -81,7 +81,7 @@ module JekyllImport
|
|
81
81
|
options = {
|
82
82
|
:user => opts.fetch("user", ""),
|
83
83
|
:pass => opts.fetch("password", ""),
|
84
|
-
:host => opts.fetch("host", "
|
84
|
+
:host => opts.fetch("host", "127.0.0.1"),
|
85
85
|
:port => opts.fetch("port", "3306"),
|
86
86
|
:socket => opts.fetch("socket", nil),
|
87
87
|
:dbname => opts.fetch("dbname", ""),
|
@@ -16,9 +16,9 @@ module JekyllImport
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def self.specify_options(c)
|
19
|
-
c.option "source", "--source FILE",
|
20
|
-
c.option "no_fetch_images", "--no-fetch-images", "Do not fetch the images referenced in the posts"
|
21
|
-
c.option "assets_folder", "--assets_folder FOLDER", "Folder where assets such as images will be downloaded to (default: assets)"
|
19
|
+
c.option "source", "--source FILE", "WordPress export XML file (default: 'wordpress.xml')"
|
20
|
+
c.option "no_fetch_images", "--no-fetch-images", "Do not fetch the images referenced in the posts (default: false)"
|
21
|
+
c.option "assets_folder", "--assets_folder FOLDER", "Folder where assets such as images will be downloaded to (default: 'assets')"
|
22
22
|
end
|
23
23
|
|
24
24
|
# Will modify post DOM tree
|