#!/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 ""
urls.each do |url|
puts %Q[- #{url}
]
puts ""
split_url( url ).each do |sub|
puts %Q[ - #{sub}
]
end
puts "
"
end
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