forked from jekyll/jekyll-import
/
rss.rb
91 lines (74 loc) · 2.48 KB
/
rss.rb
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
# frozen_string_literal: true
module JekyllImport
module Importers
class RSS < Importer
def self.specify_options(c)
c.option "source", "--source NAME", "The RSS file or URL to import"
c.option "tag", "--tag NAME", "Add a tag to posts"
c.option "render_audio", "--render_audio", "Render <audio> element as necessary"
end
def self.validate(options)
abort "Missing mandatory option --source." if options["source"].nil?
end
def self.require_deps
JekyllImport.require_with_fallback(%w(
rss
rss/1.0
rss/2.0
open-uri
fileutils
safe_yaml
))
end
# Process the import.
#
# source - a URL or a local file String.
#
# Returns nothing.
def self.process(options)
source = options.fetch("source")
frontmatter = options.fetch("frontmatter", [])
body = options.fetch("body", ["description"])
render_audio = options.fetch("render_audio", false)
content = ""
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|
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
header = {
"layout" => "post",
"title" => item.title,
}
header["tag"] = options["tag"] unless options["tag"].nil? || options["tag"].empty?
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
end
end
end
end