Skip to content

Instantly share code, notes, and snippets.

@vinodkd
Forked from ngauthier/import.rb
Last active December 17, 2015 11:19
Show Gist options
  • Save vinodkd/5601358 to your computer and use it in GitHub Desktop.
Save vinodkd/5601358 to your computer and use it in GitHub Desktop.
Since my posts had single and double quotes AND colons in the title, the original import.rb would fail when jekyll tried to read the yaml frontmatter. So instead of using an array and a string template, I changed the code to use a map and .to_yaml'd it. to_yaml produces the leading --- by default, so I appended the trailing one :)
require 'rubygems'
require 'nokogiri'
require 'fileutils'
require 'date'
require 'yaml'
# usage: ruby import.rb my-blog.xml
# my-blog.xml is a file from Settings -> Basic -> Export in blogger.
data = File.read ARGV[0]
doc = Nokogiri::XML(data)
@posts = {}
def add(node)
id = node.search('id').first.content
type = node.search('category').first.attr('term').split('#').last
case type
when 'post'
@posts[id] = Post.new(node)
when 'comment'
reply_to = node.children.find {|c| c.name == 'in-reply-to' }
post_id = reply_to.attr('ref')
#post_id = node.search('thr').first.attr('ref')
@posts[post_id].add_comment(Comment.new(node))
when 'template', 'settings'
else
raise 'dunno '+type
end
end
def write(post)
puts "Post [#{post.title}] has #{post.comments.count} comments"
puts "writing #{post.file_name}"
File.open(File.join('_posts', post.file_name), 'w') do |file|
file.write post.header
file.write "\n\n"
file.write "<h1>{{ page.title }}</h1>\n"
file.write "<div class='post'>\n"
file.write post.content
file.write "</div>\n"
file.write "<h2>Comments</h2>\n"
file.write "<div class='comments'>\n"
post.comments.each do |comment|
file.write "<div class='comment'>\n"
file.write "<div class='author'>"
file.write comment.author
file.write "</div>\n"
file.write "<div class='content'>\n"
file.write comment.content
file.write "</div>\n"
file.write "</div>\n"
end
file.write "</div>\n"
end
end
class Post
attr_reader :comments
def initialize(node)
@node = node
@comments = []
end
def add_comment(comment)
@comments.unshift comment
end
def title
@node.search('title').first.content
end
def content
@node.search('content').first.content
end
def creation_date
creation_datetime.strftime("%Y-%m-%d")
end
def creation_datetime
Date.parse(@node.search('published').first.content)
end
def file_name
param_name = title.split(/[^a-zA-Z0-9]+/).join('-').downcase
%{#{creation_date}-#{param_name}.html}
end
def header
{
'layout' => 'post',
'title' => title,
'date' => creation_datetime,
'Comments' => false,
}.to_yaml + '---'
end
end
class Comment
def initialize(node)
@node = node
end
def author
@node.search('author name').first.content
end
def content
@node.search('content').first.content
end
end
entries = {}
doc.search('entry').each do |entry|
add entry
end
FileUtils.rm_rf('_posts')
Dir.mkdir("_posts") unless File.directory?("_posts")
@posts.each do |id, post|
write post
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment