links (1387B)
1 #!/usr/bin/env ruby 2 3 require "json" 4 require "open-uri" 5 6 FEED_URL = "https://bookmarks.davideisinger.com/u:dce.json" 7 8 # Mutable state 9 index = (ARGV.pop || 1).to_i 10 content = [] 11 links = [] 12 refs = [] 13 14 # Helpers 15 archive_url = ->(url) { `bin/archive "#{url}"`.sub("references:\n", "") } 16 17 link_def = ->(i, url) { "[#{i}]: #{url}" } 18 19 item_content = ->(item, i) do 20 title = "[#{item["title"]}][#{i}]" 21 title += " ([via][#{i + 1}])" if item["referrer"] 22 23 desc = (item["description"] || "").to_s.tr("\n", " ").squeeze(" ") 24 25 <<~OUT 26 * #{title} 27 28 > #{desc} 29 OUT 30 end 31 32 add_url = ->(url) do 33 links << link_def[index, url] 34 refs << archive_url[url] 35 index += 1 36 end 37 38 add_item = ->(item) do 39 content << item_content[item, index] 40 add_url[item["url"]] 41 add_url[item["referrer"]] if item["referrer"] 42 end 43 44 result = -> do 45 <<~OUT 46 --- 47 #{content.join("\n")} 48 #{links.join("\n")} 49 --- 50 references: 51 #{refs.join} 52 OUT 53 end 54 55 process_item = ->(item) do 56 puts <<~OUT 57 58 #{item_content[item, index]} 59 #{link_def[index, item["url"]]} 60 61 OUT 62 63 print "Include? (y/n/a): " 64 65 case gets.chomp 66 when "y" 67 add_item[item] 68 when "n" 69 nil 70 when "a" 71 puts result.call 72 abort 73 else 74 process_item[item] 75 end 76 end 77 78 URI.parse(FEED_URL).open do |json| 79 feed = JSON.parse(json.read) 80 81 feed.each do |item| 82 process_item[item] 83 end 84 85 puts result.call 86 end