#!/usr/bin/env ruby require "json" require "open-uri" FEED_URL = "https://bookmarks.davideisinger.com/u:dce.json" # Mutable state index = (ARGV.pop || 1).to_i content = [] links = [] refs = [] # Helpers archive_url = ->(url) { `bin/archive "#{url}"`.sub("references:\n", "") } link_def = ->(i, url) { "[#{i}]: #{url}" } item_content = ->(item, i) do title = "[#{item["title"]}][#{i}]" title += " ([via][#{i + 1}])" if item["referrer"] desc = (item["description"] || "").to_s.tr("\n", " ").squeeze(" ") <<~OUT * #{title} > #{desc} OUT end add_url = ->(url) do links << link_def[index, url] refs << archive_url[url] index += 1 end add_item = ->(item) do content << item_content[item, index] add_url[item["url"]] add_url[item["referrer"]] if item["referrer"] end result = -> do <<~OUT --- #{content.join("\n")} #{links.join("\n")} --- references: #{refs.join} OUT end process_item = ->(item) do puts <<~OUT #{item_content[item, index]} #{link_def[index, item["url"]]} OUT print "Include? (y/n/a): " case gets.chomp when "y" add_item[item] when "n" nil when "a" puts result.call abort else process_item[item] end end URI.parse(FEED_URL).open do |json| feed = JSON.parse(json.read) feed.each do |item| process_item[item] end puts result.call end