Created
October 27, 2017 12:05
-
-
Save danivovich/ed74593ad0a7c77f01a757ec85f8399f to your computer and use it in GitHub Desktop.
Migrate from Ghost JSON into Jekyll Markdown Files
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
require 'fileutils' | |
require 'json' | |
require 'date' | |
require 'yaml' | |
FileUtils.mkdir_p("_posts") | |
FileUtils.mkdir_p("_drafts") | |
FileUtils.mkdir_p("_data") | |
$json = JSON.parse File.read(ARGV.pop), symbolize_names: true | |
unless $json[:data].nil? | |
posts = $json[:data][:posts] | |
else | |
posts = $json[:db].first[:data][:posts] | |
end | |
def there_are_tags? | |
@tags ||= | |
$json[:db] && | |
$json[:db].first[:data][:posts_tags] && | |
$json[:db].first[:data][:tags] | |
end | |
@imported = Hash.new(0) | |
class Post | |
# the source of the post | |
attr_reader :post | |
def initialize post | |
@post = post | |
end | |
def import | |
puts "Importing #{ filename }" | |
File.write filename, full_body | |
end | |
def draft? | |
post[:status] == 'draft' | |
end | |
private | |
def folder | |
draft? ? '_drafts' : '_posts' | |
end | |
def filename | |
File.join folder, basename | |
end | |
def date | |
case post[:published_at] | |
when String | |
DateTime.parse(post[:published_at]) | |
when Integer | |
Time.at(post[:published_at] / 1000).utc.to_datetime | |
end | |
end | |
def front_matter | |
front_matter_hash = { | |
'layout' => 'single', | |
'title' => post[:title], | |
'header' => { | |
'image' => post[:image], | |
'caption' => "Photo credit: [**Unsplash**](https://unsplash.com)" | |
}, | |
'meta_title' => post[:meta_title], | |
'meta_description' => post[:meta_description] | |
} | |
unless draft? | |
front_matter_hash['date'] = date.strftime('%Y-%m-%d %H:%M:%S') if date | |
end | |
front_matter_hash['tags'] = tags if tags && !tags.empty? | |
front_matter_hash | |
end | |
def slug | |
post[:slug] | |
end | |
def tags | |
if there_are_tags? | |
post_tags = $json[:db].first[:data][:posts_tags].select do |pt| | |
pt[:post_id] == post[:id] | |
end | |
tags_ids = post_tags.map { |pt| pt[:tag_id] } | |
tags = $json[:db].first[:data][:tags].select do |t| | |
tags_ids.include? t[:id] | |
end | |
tags.map { |t| t[:slug] } | |
end | |
end | |
def full_body | |
front_matter.to_yaml + "---\n\n" + post[:markdown] | |
end | |
def basename | |
if draft? | |
"#{ slug }.markdown" | |
else | |
"#{ date.strftime('%Y-%m-%d') }-#{ slug }.markdown" | |
end | |
end | |
end | |
posts.each do |post| | |
post = Post.new post | |
post.import | |
@imported[:posts] += 1 | |
@imported[:drafts] += 1 if post.draft? | |
end | |
tags = $json[:db].first[:data][:tags].map do |tg| | |
{ | |
'name': tg[:name], | |
'slug': tg[:slug], | |
'description': tg[:description], | |
'meta_title': tg[:meta_title], | |
'meta_description': tg[:meta_description], | |
'image': tg[:image] | |
} | |
end | |
puts "Importing tags" | |
File.write "_data/tags.yml", tags.to_yaml | |
puts "#{ @imported[:posts] } posts imported ( #{ @imported[:drafts] } draft )" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment