From 1ad8a6759f51718fb3d0242eb1742ecf7dec04bc Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Sun, 21 May 2017 15:20:11 -0700 Subject: [PATCH] add a JSON feed --- bin/compile.sh | 9 +- bin/{rss.rb => feeds.rb} | 91 ++++++++++++++++---- public/_layout.ejs | 3 +- public/images/apple-touch-icon-300.png | Bin 0 -> 7948 bytes public/images/apple-touch-icon-80.png | Bin 0 -> 4657 bytes public/images/me.jpg | Bin 0 -> 22722 bytes templates/{link.rss.html => link.feed.html} | 0 templates/{post.rss.html => post.feed.html} | 0 8 files changed, 81 insertions(+), 22 deletions(-) rename bin/{rss.rb => feeds.rb} (59%) create mode 100644 public/images/apple-touch-icon-300.png create mode 100644 public/images/apple-touch-icon-80.png create mode 100644 public/images/me.jpg rename templates/{link.rss.html => link.feed.html} (100%) rename templates/{post.rss.html => post.feed.html} (100%) diff --git a/bin/compile.sh b/bin/compile.sh index f76cce6..f7e9899 100755 --- a/bin/compile.sh +++ b/bin/compile.sh @@ -27,14 +27,15 @@ lock function main() { echo "* compile rss feed" - compile_rss + compile_feeds echo "* harp compile $BLOG_DIR $TARGET" rm -rf "$TARGET/*" "$TARGET/.*" "$HARP" compile "$BLOG_DIR" "$TARGET" - # clean up temporary feed + # clean up temporary feeds rm $BLOG_DIR/public/feed.xml + rm $BLOG_DIR/public/feed.json echo "* munge html files to make them available without an extension" munge_html @@ -48,8 +49,8 @@ function main() { delete_lock_file } -function compile_rss() { - ruby -w $DIR/rss.rb $BLOG_DIR/public +function compile_feeds() { + ruby -w $DIR/feeds.rb $BLOG_DIR/public } function munge_html() { diff --git a/bin/rss.rb b/bin/feeds.rb similarity index 59% rename from bin/rss.rb rename to bin/feeds.rb index 2afd936..f4ebe3e 100755 --- a/bin/rss.rb +++ b/bin/feeds.rb @@ -9,10 +9,20 @@ require 'json' require 'rdiscount' require 'mustache' +class Hash + def compact + h = {} + each_pair do |k, v| + h[k] = v unless v.nil? + end + h + end +end + def main dir = ARGV.shift.to_s unless File.directory? dir - puts 'usage: rss.rb ' + puts 'usage: feeds.rb ' exit 1 end b = Blag.new dir @@ -25,18 +35,20 @@ class Blag self.new(dir).generate! end - def initialize dir, num_posts = 10 + def initialize dir, index_posts = 10, feed_posts = 30 @dir = dir - @num_posts = num_posts + @index_posts = index_posts + @feed_posts = feed_posts end def generate! generate_latest_posts_json generate_rss + generate_json_feed end def generate_latest_posts_json - data['posts'] = latest_posts.map do |post| + data['posts'] = latest_posts(@index_posts).map do |post| { title: post['title'], date: post['date'], @@ -56,7 +68,11 @@ class Blag File.write(rss_file, feed_xml.target!) end - def latest_posts(n = @num_posts) + def generate_json_feed + File.write(json_feed_file, feed_json) + end + + def latest_posts(n) posts.first(n) end @@ -81,12 +97,13 @@ class Blag post['title'] = "→ #{post['title']}" if post['type'] == :link post['relative_url'] = relative_url post['url'] = root_url + post['relative_url'] + post['external_url'] post['content'] = content - post['body'] = RDiscount.new(post['content'], :smart).to_html - post['rfc822'] = Time.at(post['timestamp']).rfc822 + post['body'] = RDiscount.new(content, :smart).to_html + post['time'] = Time.at(post['timestamp']) post end - end.flatten.compact.sort_by { |p| -p['timestamp'] }.first(@num_posts) + end.flatten.compact.sort_by { |p| -p['timestamp'] } end end @@ -113,11 +130,11 @@ private @data ||= JSON.parse File.read(data_file) end - def rss_template(type) + def feed_template(type) if type == :post - @post_rss_template ||= File.read(File.join('templates', 'post.rss.html')) + @post_rss_template ||= File.read(File.join('templates', 'post.feed.html')) elsif type == :link - @link_rss_template ||= File.read(File.join('templates', 'link.rss.html')) + @link_rss_template ||= File.read(File.join('templates', 'link.feed.html')) else raise 'unknown post type: ' + type end @@ -127,8 +144,10 @@ private File.join @dir, 'feed.xml' end - def rss_html post - Mustache.render rss_template(post['type']), post: post + def feed_html post + html = Mustache.render feed_template(post['type']), post: post + # this is pretty disgusting + html.gsub 'src="/', "src=\"#{root_url}/" end def feed_xml @@ -142,13 +161,13 @@ private xml.title title xml.description subtitle xml.link root_url - xml.pubDate posts.first['rfc822'] + xml.pubDate posts.first['time'].rfc822 - posts.each do |post| + latest_posts(@feed_posts).each do |post| xml.item do xml.title post['title'] - xml.description rss_html(post) - xml.pubDate post['rfc822'] + xml.description feed_html(post) + xml.pubDate post['time'].rfc822 xml.author post['author'] xml.link post['link'] || post['url'] xml.guid post['url'] @@ -159,6 +178,44 @@ private xml end + def json_feed_file + File.join @dir, 'feed.json' + end + + def feed_json + JSON.pretty_generate(build_json_feed) + end + + def build_json_feed + { + version: "https://jsonfeed.org/version/1", + title: title, + home_page_url: root_url, + feed_url: "#{root_url}/feed.json", + author: { + url: "https://samhuri.net", + name: "Sami J. Samhuri", + avatar: "#{root_url}/images/me.jpg" + }, + icon: "#{root_url}/images/apple-touch-icon-300.png", + favicon: "#{root_url}/images/apple-touch-icon-80.png", + items: latest_posts(@feed_posts).map do |post| + { + title: post['title'], + date_published: post['time'].to_datetime.rfc3339, + id: post['url'], + url: post['url'], + external_url: post['link'], + author: { + name: post['author'] + }, + content_html: feed_html(post), + tags: post['tags'] + }.compact + end + } + end + end main if $0 == __FILE__ diff --git a/public/_layout.ejs b/public/_layout.ejs index 9df8205..4ad9b56 100644 --- a/public/_layout.ejs +++ b/public/_layout.ejs @@ -48,7 +48,8 @@ <% } -%> - + + diff --git a/public/images/apple-touch-icon-300.png b/public/images/apple-touch-icon-300.png new file mode 100644 index 0000000000000000000000000000000000000000..e943b8e8ec8a637fccbe02971407a2289c0d8dcf GIT binary patch literal 7948 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 literal 0 HcmV?d00001 diff --git a/public/images/me.jpg b/public/images/me.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ddd4c027eb1a652d5d0add4ebf12867e803522ad GIT binary patch literal 22722 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 JeCInq|Jec7-qrvB literal 0 HcmV?d00001 diff --git a/templates/link.rss.html b/templates/link.feed.html similarity index 100% rename from templates/link.rss.html rename to templates/link.feed.html diff --git a/templates/post.rss.html b/templates/post.feed.html similarity index 100% rename from templates/post.rss.html rename to templates/post.feed.html