2013年1月4日金曜日

Safariのブックマークをソートする

Safariにはなぜかブックマークをソートする機能がありません。お正月休みで暇を持て余しているので、ソートツールを作ってみます(きっとどこかにすでに存在するんでしょうけど)。勉強を兼ねて初挑戦のRubyで作ってみます。

ソートするといってもどこから手を付けていいかと思い調べたところ、Safariにはブックマークの書き出しと、読み込みの機能があります。書き出されるのはNETSCAPE Bookmark formatという形式のファイルです。

<!DOCTYPE NETSCAPE-Bookmark-file-1>
<HTML>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<Title>ブックマーク</Title>
<H1>ブックマーク</H1>
<DT><H3 FOLDED>ブックマークバー</H3>
<DL><p>
<DT><A HREF="http://www.blogger.com/home">Blogger</A>
<DT><A HREF="http://www.yahoo.co.jp/">Yahoo!</A>
</DL><p>
以下省略

一旦NETSCAPE Bookmark format形式で書きだしておいて、Rubyでソート後、Safariに読みこませればソート完了という計画です。これならRuby初心者には程よい練習問題になりそうです。

まず、ファイル形式を眺めてみると、HTMLとは異なり<HEAD>タグや<BODY>タグは無く、他のタグがきちんと閉じられていなかったりします。またこれはSafari限定だとおもいますが、<H1>ブックマーク</H1>の下には、<DT><H3 FOLDED>ブックマークバー</H3>、<DT><H3 FOLDED>ブックマークメニュー</H3>、<H1>ブックマーク</H1>とそれぞれの階層にブックマークの実態が<DT>タグで記述されています。私の場合、以下の様な構造でした。
  • ブックマーク
    • ブックマークバー
      • ブックマーク1
    • ブックマークメニュー
      • フォルダ1
        • ブックマーク2
      • フォルダ2
        • ブックマーク3
      • ブックマーク4
    • ブックマーク5
一般的な構造がどうなっているのかまでは調べると大変なので、とりあえず自分のブックマークだけソートできることを目標にします。

はじめはREXMLというXML操作用ライブラリを使ってみようと思いましたが、やってみると正しいXMLフォーマットではないために色々面倒な事に。単純にタグが閉じられていないのと、親子関係が解析しづらいために、ベタに1行ずつ読み込んでいくことにしました。

完成したのはこちら。
main.rb
bookmark.rb
使用方法はこちら。標準出力にソート結果が出力されます。
ruby main.rb input.html
いつもはJava、Eclipseを使用しており、Rubyは初めてで作成に結構時間かかりましたが、感想です。

  • コード作成にはHomebrewでインストールした素のVimを使用しましたが、Eclipseを使い慣れているので機能的に物足りないです。.vimrcの設定等でどこまで機能追加できるか調べてみたいです。
  • デバッグ実行を行う際にruby -r debugを使用しました。今回はそうでもなかったですが、コード量が多くなると厳しいです。世の中一般ではどういう環境で開発しているんでしょうか。
  • 動的型付け言語で変数に型が付いていないのでなんでも代入できてしまうというのが、まったく慣れないです。
  • 他にもAPIが分からない等いろいろありますが、慣れれば少ないコーディング量で機能を実現できるんでしょう。まだまだ先は長いです。

0 件のコメント:

コメントを投稿

DockerでMQ環境を作る

DockerHubの ibmcom/mq を使う。ファイルシステムとしてtmpfsは使えないので これ を参考に/mnt/sda1に置き換える。 brew install docker docker-machine docker-machine create --drive...