Uproar gets its own page

Code Projects, uproar — Tags: , , — Ardekantur @ 8:06 pm

Here we go: http://www.ardekantur.com/misc/uproar/ - the perfect spot for a tiny lil piece of code like Uproar. Updates will come frequently, as I’m now using it daily. The output of search results has changed a little bit to make it more digestable.

Uproar Improved

Code Projects, uproar — Tags: , , , — Ardekantur @ 1:07 am

Rather than sleep, I’ve decided to improve (read: radically bloat) uproar.rb.

uproar.rb

# uproar.rb - search a YAML-encoded list of links for matching tags 
# ardekantur.com  
 
%w[ rubygems yaml open-uri hpricot ].each { |x| require x }  
 
def set_option hash, name, default 
  i = ARGV.index(name) 
  hash[name] = i ? ARGV[i + 1] : default 
end  
 
def search_tags file, tag 
  links = File.open( file ) 
  db = [] 
  YAML::load_documents( links ) { |doc| db << doc }  
 
  matches = [] 
  db.each { |l| matches << l if l['tags'].include? tag } 
  matches.each { |l| printf "%30s... - %s\n", l['title'][0..30], l['link'] } 
end  
 
def add_link file, address, tags 
  doc = Hpricot(open(address)) 
  title = doc.at("title").inner_html.strip 
  puts "Adding '#{title}' to #{file}..."  
 
  links = File.new( file, "a" ) 
  links.puts "\n---" 
  links.puts "title: '#{title.gsub(/'/, '\'\'')}'" 
  links.puts "link: #{address}" 
  tags = tags ? tags.strip.gsub(/ /, ', ') : '' 
  links.puts "tags: [#{tags}]" 
  links.close  
 
end  
 
o = {} 
set_option o, '-s', nil 
set_option o, '-f', 'Links.yaml' 
set_option o, '-t', '' 
set_option o, '-a', nil  
 
raise "please specify either a tag to search for or a link to add." if (!o['-s'] and !o['-a']) or (o['-s'] and o['-a'])  
 
search_tags o['-f'], o['-s'] if o['-s'] 
add_link o['-f'], o['-a'], o['-t'] if o['-a']

New functionality! Specify your links file with -f filename.yaml. Searching with tags now uses -s tag instead of -t tag. Adding a link works like this: ruby Uproar.rb -a http://webaddress.com/ -t "space separated list of tags". The title is grabbed automagically for you :)

Uproar.rb: Using Ruby and YAML to keep bookmarks

Code Projects, uproar — Tags: , , , — Ardekantur @ 6:48 pm

I use del.icio.us, but I don’t like the idea that I don’t have control of the server, so if something happens to my bookmarks, I’m screwed. I also want more universal integration of my bookmarks with all the browsers I used - from Lynx to Opera. So I wrote some Ruby.

delicious-to-yaml.rb

require 'rubygems' 
require 'hpricot' 
doc = open("links.html") { |f| Hpricot(f) } 
(doc/"a").each do |link| 
    puts "---" 
    puts "title: '#{link.inner_html.gsub(/'/, '\'\'')}'" 
    puts "link: #{link.attributes['href']}" 
    tags = link.attributes['tags'] ? link.attributes['tags'].gsub(/,/, ', ') : '' 
    puts "tags: [#{tags}]" 
end

Go to https://secure.del.icio.us/settings/<your delicious username>/bookmarks/export - uncheck ‘include my notes’, but keep ‘include my tags’ checked. Save the result to links.html, then run the code above in the same directory as links.html. Pipe the output to another file, like Links.yaml. This is your new bookmark repository. Each link is a separate document, like the following:

--- 
title: 'I speak dog » Using GnuPG encyption with Mac OS X Mail' 
link: http://www.wasuvi.com/?page_id=2368 
tags: [apple, howto, osx, gpg, security, email, toread] 
--- 
title: 'All recipes – complete resource for recipes and cooking tips' 
link: http://allrecipes.com/ 
tags: [recipes, howto, health, toread]

So on, so forth. This is obviously very human readable - you can simply add new links to the file by typing them in yourself. The next step is a file which asks for a tag and gives you the links that are tagged with it:

uproar.rb

require 'yaml' 
 
def set_option hash, name, default 
  i = ARGV.index(name) 
  raise "no argument specified" unless i 
  hash[name] = default and return unless i 
  raise "no argument specified: #{name}" if(ARGV.length &lt;= i) 
  hash[name] = ARGV[i + 1] 
end 
 
o = {} 
set_option o, '-t', nil 
 
raise "please specify a tag." if o['-t'] == nil 
 
links = File.open( 'Links.yaml' ) 
db = [] 
YAML::load_documents( links ) { |doc| db &lt;&lt; doc } 
 
matches = [] 
db.each { |l| matches &lt;&lt; l if l['tags'].include? o['-t'] } 
matches.each { |l| printf "%30s... - %s\n", l['title'][0..30], l['link'] }

It’s a little ugly right now, but it does what it’s supposed to do. That is Uproar.

Possible Improvements

  • Open random link containing tag in web browser
  • Add links to yaml file by command line
  • Use the del.icio.us API to get links
  • Use the del.icio.us API to sync links
  • Use the Yaml API instead of just formatting strings
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
(c) 2008 Ardekantur | powered by WordPress with Barecity