Class: JekyllImport::Importers::Pebble

Inherits:
JekyllImport::Importer show all
Defined in:
lib/jekyll-import/importers/pebble.rb

Class Method Summary collapse

Methods inherited from JekyllImport::Importer

inherited, run, stringify_keys, subclasses

Class Method Details

.kebabize(string) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/jekyll-import/importers/pebble.rb', line 71

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

.process(opts) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/jekyll-import/importers/pebble.rb', line 17

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

.process_file(file) ⇒ Object



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
# File 'lib/jekyll-import/importers/pebble.rb', line 41

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

.require_depsObject



6
7
8
9
10
11
# File 'lib/jekyll-import/importers/pebble.rb', line 6

def self.require_deps
  JekyllImport.require_with_fallback(%w(
    nokogiri
    safe_yaml
  ))
end

.specify_options(c) ⇒ Object



13
14
15
# File 'lib/jekyll-import/importers/pebble.rb', line 13

def self.specify_options(c)
  c.option "directory", "--directory PATH", "Pebble source directory"
end

.traverse_posts_within(directory, &block) ⇒ Object



30
31
32
33
34
35
36
37
38
39
# File 'lib/jekyll-import/importers/pebble.rb', line 30

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