Files
davideisinger.com/bin/links
2025-11-06 11:21:16 -05:00

87 lines
1.4 KiB
Ruby
Executable File

#!/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