Skip to content

Instantly share code, notes, and snippets.

@pezholio
Forked from dnagir/import.rb
Last active January 15, 2020 14:03
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pezholio/5299018 to your computer and use it in GitHub Desktop.
Save pezholio/5299018 to your computer and use it in GitHub Desktop.
Regenerate the source of an Octopress blog (if you're an idiot and forgot to commit the source like me)
require 'rubygems'
require 'nokogiri'
require 'fileutils'
require 'date'
require 'uri'
require 'find'
@posts = {}
@drafts = {}
# usage: ruby import.rb {path}
# {path} is the full path to your cloned github pages master branch
blog_path = ARGV[0]
def add(node)
id = node.search('id').first.content
type = node.search('category').first.attr('term').split('#').last
@posts[id] = Post.new(node)
end
def write(post, path='_posts')
puts "writing #{post.file_name}"
File.open(File.join(path, 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"
end
end
class Post
def initialize(node)
@node = node
end
def title
@title ||= @node.at_css('.entry-title').content
end
def content
@content ||= @node.search('.entry-content').inner_html
end
def creation_date
@creation_date ||= creation_datetime.strftime("%Y-%m-%d")
end
def creation_datetime
@creation_datetime ||= DateTime.parse(@node.search('time').first.attr('datetime'))
end
def permalink
return @permalink unless @permalink.nil?
link_node = @node.search('link[rel="canonical"]')
@permalink = link_node.attr('href')
end
def param_name
if permalink.nil?
title.split(/[^a-zA-Z0-9]+/).join('-').downcase
else
File.basename(URI(permalink).path, '.*')
end
end
def file_name
%{#{creation_date}-#{param_name}.html}
end
def header
[
'---',
%{layout: post},
%{title: "#{escaped title}"},
%{date: #{creation_datetime}},
'comments: true',
categories,
'---'
].compact.join("\n")
end
def escaped(str)
str.gsub('"') { '\"' }
end
def categories
terms = @node.search('.categories a')
unless Array(terms).empty?
[
'categories:',
terms.map{ |t| t.content && " - #{t.content}" }.compact.join("\n"),
].join("\n")
end
end
end
Dir.foreach(blog_path) do |item|
if item.to_i.to_s != "0"
path = File.join(blog_path, item)
Find.find(path) do |f|
if f.match(/\index.html\Z/)
data = File.read f
doc = Nokogiri::XML(data)
@posts[f] = Post.new(doc)
end
end
end
end
puts "** Writing posts"
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