#!/usr/bin/env ruby # # $Id: index.cgi,v 1.6 2005/12/12 22:43:54 Yuukis Exp $ # # $KCODE = 'e' class DayomonFilter VERSION = '1.0 (20051212)' NAME = "DayomonFilter/#{VERSION}" BASE_URI = 'http://dayomon.org' SCRIPT_URI = 'http://dayomon.org/filter/' FOOTER = %Q(このページは "#{NAME}" によってフィルタされている。) require 'nkf' require 'net/http' require 'cgi' require 'timeout' require 'uri' require 'open-uri' def initialize cgi = CGI.new url = cgi['uri'] bye if url == '' bye if cgi.user_agent =~ /(bot|slup)/i ['"', '<', '>', "'"].each {|x| bye if url.index(x) } url = "http://#{url}" if url !~ /^http:/i @uri = URI.parse(url) begin timeout(15) { contents = OpenURI.open_uri(url, 'User-Agent' => NAME, 'Referer' => BASE_URI) cgi.out('text/html') { filtering(contents.read) } } rescue TimeoutError cgi.out('text/plain') { 'Operation Timeouted!!' } end end private def bye print "Location: #{BASE_URI}\n\n" exit end def filtering(str) ret = '' if @uri.path !~ /\/$/ dir_path = File.dirname(@uri.path) + '/' else dir_path = @uri.path end parent = 'http://' + @uri.host + dir_path grandparent = 'http://' + @uri.host + File.dirname(dir_path) NKF.nkf('-ex', str).each{ |line| if line =~ /.*content\-type.*text\/html.*/i ret << line.gsub(/charset=.*\"/i,"charset=euc-jp\"") elsif line =~ /(href|src)=/i ['href', 'src'].each {|tag| line.gsub!(/#{tag}=\"\.\.\//i, "#{tag}=\"#{grandparent}") # '../' line.gsub!(/#{tag}=\"\.\//i, "#{tag}=\"#{parent}") # './' line.gsub!(/#{tag}=\"\/\//i, "#{tag}=\"http://") # '//' for slashcode. line.gsub!(/#{tag}=\"\//i, "#{tag}=\"http://#{@uri.host}/") # '/' if line =~ /#{tag}=/i line.gsub!(/#{tag}=\"(.*?)\"/i) { x = $1.dup if x !~ /^http:/i %Q(#{tag}="#{parent}#{x}") else %Q(#{tag}="#{x}") end } end } if line !~ /.*text\/css.*/i ret << line.gsub(/href=\"http:/i, "href=\"#{SCRIPT_URI}?uri=http:") else ret << line end elsif line =~ /<\/body>/i ret << line.gsub(/<\/body>/i,"
\n#{FOOTER}\n") else ret << line end } dayomonize(ret) end def dayomonize(str) ret = str.dup [\ [/./e, '。'], [/,/e, '、'], [/る。/e, 'るんだよもん.'], [/た。/e, 'たんだよもん.'], [/です。/e, 'だよもん.'], [/ね。/e, 'だよもん.'], [/だ。/e, 'だよもん.'], [/。/e, 'だよもん。'], [/?/e, 'だよもん?'], [/!/e, 'だよもん!'], [/./e, '。'] ].each {|normal, dayomon| ret.gsub!(normal, dayomon) } [\ [/(だよもん。){2,}/, 'だよもん。'], [/(だよもん?){2,}/, 'だよもん?'], [/(だよもん!){2,}/, 'だよもん!'], [/だよもん!だよもん?/, 'だよもん!?'], [/だよもん?だよもん!/, 'だよもん?!'] ].each {|double, dayomon| until ret.index(double) == nil do ret.gsub!(double, dayomon) end } ret.gsub!(/^だよもん./e, '') ret.gsub!(/^「だよもん./e, '') ret end end DayomonFilter.new