#!/usr/bin/env ruby166 =begin = w3m-localcgi: 今の画面のハードコピーからURLを拾う == 概要 (())の強力版。 画面のハードコピーからURLを拾いだすlocal CGI。 さらに、URLをディレクトリごとにsplitしたもののリンクを作る。 当然GNU screenが必要。 queryに「hardcopy」とつけたときはハードコピーを撮る。 そうでないときは撮らない。(起動前にすでに撮っているから) なお、((<2ch|URL:http://www.2ch.net/>))では ttp://〜 とリンクされていることが多いので、これについてもURLとみなして取得してくれる。 == 準備 === .screenrcの設定 ~/.screenrcに以下の記述を加える。 ここではscreenのprefixを"^]"にしている場合とする。 他のprefixならば1行目の文字列の"^]"をprefixに置き換えよう。 register W "^]:hardcopy^M^]:screen w3m /cgi-bin/spliturl.cgi^M" bind ^w process W hardcopydir ホームディレクトリ/screen === .w3m/keymapの設定 .w3m/keymapでどこかのキーに GOTO file:/cgi-bin/spliturl.cgi?hardcopy を割り当てる。 例: keymap W GOTO file:/cgi-bin/spliturl.cgi?hardcopy == 使い方 === 画面上のURLを拾う * w3m以外の画面にURLを表示しているときにおもむろに((*"^]^w"*))と叩け! * w3mが起動しているときは別窓でw3mが起動する。 * w3mでは「W(↑の例においては)」と叩こう。 =end class SplitURLW3m def initialize @w3m = "w3m" @hardcopydir = File::expand_path "~/screen" @hardcopytmp = "#{@hardcopydir}/hardcopy.w3m" end attr_reader :hardcopytmp, :w3m SCHEME_REGEXP="(h?ttps?|ftp)" def hardcopyfile Dir[ "#{@hardcopydir}/hardcopy.*" ].first end def url_collect( file ) str = open( file ).read.gsub(/\\\n/,'') urls = [] str.gsub( /(#{SCHEME_REGEXP}:\/\/[A-Za-z0-9!#%&\(\)~=~^@`{;\+:\*}\]<,\.\/\?_\-]+)/ ) do # ` url = $1 if $2 == 'ttp' # 2ch hack url = 'h' + url end urls << url end urls.uniq end def split_url( url ) a = [] urlorg = url.dup while ( (url = File::dirname(url)) =~ /^#{SCHEME_REGEXP}:\// ) a << "#{url}/" end a.reverse! a << urlorg end def http_header crlf = "\r\n" print "Content-Type: text/html" + crlf + crlf end def output_html( urls ) puts "" puts "" puts "" end def start require 'ftools' if ENV['QUERY_STRING'] =~ /hardcopy/ system "screen -X hardcopy" end File::mv hardcopyfile, hardcopytmp urls = url_collect hardcopytmp # File::unlink hardcopytmp http_header output_html( urls ) end end if __FILE__ == $0 SplitURLW3m.new.start end