Class: JekyllImport::Importers::RSS

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

Class Method Summary collapse

Methods inherited from JekyllImport::Importer

inherited, run, stringify_keys, subclasses

Class Method Details

.process(options) ⇒ Object

Process the import.

source - a URL or a local file String.

Returns nothing.



35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/jekyll-import/importers/rss.rb', line 35

def self.process(options)
  source = options.fetch("source")

  content = ""
  URI.open(source) { |s| content = s.read }
  rss = ::RSS::Parser.parse(content, false)

  raise "There doesn't appear to be any RSS items at the source (#{source}) provided." unless rss

  rss.items.each do |item|
    write_rss_item(item, options)
  end
end

.require_depsObject



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

def self.require_deps
  JekyllImport.require_with_fallback(%w(
    rss
    rss/1.0
    rss/2.0
    open-uri
    fileutils
    safe_yaml
  ))
end

.specify_options(c) ⇒ Object



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

def self.specify_options(c)
  c.option "source",         "--source NAME",      "The RSS file or URL to import."
  c.option "tag",            "--tag NAME",         "Add a specific tag to all posts."
  c.option "extract_tags",   "--extract_tags KEY", "Copies tags from the given subfield on the RSS `<item>` to front matter. (default: null)"
  c.option "render_audio",   "--render_audio",     "Render `<audio>` element in posts for the enclosure URLs. (default: false)"
  c.option "canonical_link", "--canonical_link",   "Add original link as `canonical_url` to post front matter. (default: false)"
end

.validate(options) ⇒ Object



14
15
16
17
# File 'lib/jekyll-import/importers/rss.rb', line 14

def self.validate(options)
  abort "Missing mandatory option --source." if options["source"].nil?
  abort "Provide either --tag or --extract_tags option." if options["extract_tags"] && options["tag"]
end

.write_rss_item(item, options) ⇒ Object



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
96
97
# File 'lib/jekyll-import/importers/rss.rb', line 49

def self.write_rss_item(item, options)
  frontmatter = options.fetch("frontmatter", [])
  body = options.fetch("body", ["description"])
  render_audio = options.fetch("render_audio", false)

  formatted_date = item.date.strftime("%Y-%m-%d")
  post_name = Jekyll::Utils.slugify(item.title, :mode => "latin")
  name = "#{formatted_date}-#{post_name}"
  audio = render_audio && item.enclosure.url
  canonical_link = options.fetch("canonical_link", false)

  header = {
    "layout"        => "post",
    "title"         => item.title,
    "canonical_url" => (canonical_link ? item.link : nil),
    "tag"           => get_tags(item, options),
  }.compact

  frontmatter.each do |value|
    header[value] = item.send(value)
  end

  output = +""

  body.each do |row|
    output << item.send(row).to_s
  end

  output.strip!
  output = item.content_encoded if output.empty?

  FileUtils.mkdir_p("_posts")

  File.open("_posts/#{name}.html", "w") do |f|
    f.puts header.to_yaml
    f.puts "---\n\n"

    if audio
      f.puts <<~HTML
        <audio controls="">
          <source src="#{audio}" type="audio/mpeg">
          Your browser does not support the audio element.
        </audio>
      HTML
    end

    f.puts output
  end
end