davideisinger.com

My personal website
Log | Files | Refs | README

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