-
Notifications
You must be signed in to change notification settings - Fork 332
Expand file tree
/
Copy pathpebble.rb
More file actions
95 lines (78 loc) · 2.71 KB
/
Copy pathpebble.rb
File metadata and controls
95 lines (78 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# frozen_string_literal: false
module JekyllImport
module Importers
class Pebble < Importer
def self.require_deps
JekyllImport.require_with_fallback(%w(
nokogiri
safe_yaml
))
end
def self.specify_options(c)
c.option "directory", "--directory PATH", "Pebble source directory"
end
def self.process(opts)
options = { :directory => opts.fetch("directory", "") }
FileUtils.mkdir_p("_posts")
FileUtils.mkdir_p("_drafts")
traverse_posts_within(options[:directory]) do |file|
next if file.end_with?("categories.xml")
process_file(file)
end
end
def self.traverse_posts_within(directory, &block)
Dir.each_child(directory) do |fd|
path = File.join(directory, fd)
if File.directory?(path)
traverse_posts_within(path, &block)
elsif path.end_with?("xml")
yield(path) if block_given?
end
end
end
def self.process_file(file)
xml = File.open(file) { |f| Nokogiri::XML(f) }
raise "There doesn't appear to be any XML items at the source (#{file}) provided." unless xml
doc = xml.xpath("blogEntry")
title = kebabize(doc.xpath("title").text).tr("_", "-")
date = Date.parse(doc.xpath("date").text)
directory = "_posts"
name = "#{date.strftime("%Y-%m-%d")}-#{title}"
header = {
"layout" => "post",
"title" => doc.xpath("title").text,
"tags" => doc.xpath("tags").text.split(", "),
"categories" => doc.xpath("category").text.split(", "),
}
header["render_with_liquid"] = false
path = File.join(directory, "#{name}.html")
File.open(path, "w") do |f|
f.puts header.to_yaml
f.puts "---\n\n"
f.puts doc.xpath("body").text
end
Jekyll.logger.info "Wrote file #{path} successfully!"
end
def self.kebabize(string)
kebab = "-".freeze
string.gsub!(%r![^\w\-_]+!, kebab)
unless kebab.nil? || kebab.empty?
if kebab == "-".freeze
re_duplicate_kebab = %r!-{2,}!
re_leading_trailing_kebab = %r!^-|-$!
else
re_sep = Regexp.escape(kebab)
re_duplicate_kebab = %r!#{re_sep}{2,}!
re_leading_trailing_kebab = %r!^#{re_sep}|#{re_sep}$!
end
# No more than one of the kebab in a row.
string.gsub!(re_duplicate_kebab, kebab)
# Remove leading/trailing kebab.
string.gsub!(re_leading_trailing_kebab, "".freeze)
end
string.downcase!
string
end
end
end
end