diff options
| author | Tatsuya Kinoshita <tats@vega.ocn.ne.jp> | 2011-05-04 07:05:14 +0000 | 
|---|---|---|
| committer | Tatsuya Kinoshita <tats@vega.ocn.ne.jp> | 2011-05-04 07:05:14 +0000 | 
| commit | 72f72d64a422d6628c4796f5c0bf2e508f134214 (patch) | |
| tree | 0c9ea90cc53310832c977265521fb44db24a515e /Bonus | |
| parent | Adding upstream version 0.3 (diff) | |
| download | w3m-72f72d64a422d6628c4796f5c0bf2e508f134214.tar.gz w3m-72f72d64a422d6628c4796f5c0bf2e508f134214.zip | |
Adding upstream version 0.5.1upstream/0.5.1
Diffstat (limited to '')
| -rwxr-xr-x | Bonus/2ch.cgi | 204 | ||||
| -rw-r--r-- | Bonus/README | 80 | ||||
| -rw-r--r-- | Bonus/README.eng | 77 | ||||
| -rwxr-xr-x | Bonus/backslash_to_slash.cgi | 9 | ||||
| -rwxr-xr-x | Bonus/goodict.cgi | 38 | ||||
| -rwxr-xr-x | Bonus/google.cgi | 25 | ||||
| -rwxr-xr-x | Bonus/html2latex | 517 | ||||
| -rwxr-xr-x | Bonus/htmldump | 12 | ||||
| -rwxr-xr-x | Bonus/makeref | 266 | ||||
| -rwxr-xr-x | Bonus/oldconfigure.sh | 183 | ||||
| -rw-r--r-- | Bonus/scanhist.rb | 88 | ||||
| -rwxr-xr-x | Bonus/smb.cgi | 462 | ||||
| -rw-r--r-- | Bonus/utf8.cgi | 21 | ||||
| -rwxr-xr-x | Bonus/wrap3m | 33 | 
14 files changed, 2015 insertions, 0 deletions
| diff --git a/Bonus/2ch.cgi b/Bonus/2ch.cgi new file mode 100755 index 0000000..998c202 --- /dev/null +++ b/Bonus/2ch.cgi @@ -0,0 +1,204 @@ +#!/usr/bin/perl + +$WGET = "wget"; +$SCRIPT_NAME = $ENV{'SCRIPT_NAME'} || $0; +$CGI = "file://$SCRIPT_NAME"; +$_ = $QUERY_STRING = $ENV{"QUERY_STRING"}; +$UserAgent = "Monazilla/1.00 (w3m/2ch.cgi)"; + +if (/subback.html$/) { +	&subback(); +	exit; +} + +s@/(\d+)(/([^/]*))?$@/$1@ || exit; +my $datnum = $1; +$label = $3; +$cgi = "$CGI?$_"; + +s@^http://([^/]+)/test/read.cgi/([^/]+)/@$1/$2/dat/@ || exit; +$subback = "$CGI?http://$1/$2/subback.html"; +$bbs = $2; +if ($ENV{REQUEST_METHOD} eq "POST") { +	&post(); +	exit; +} + +$_ .= ".dat"; +$dat = "http://$_"; +$tmp = $ENV{"HOME"} . "/.w3m2ch/$_"; +$dat =~ s/([^\w\/.\:\-])/\\$1/g; +$tmp =~ s/([^\w\/.\:\-])/\\$1/g; +($dir = $tmp) =~ s@/[^/]+$@@; +$cmd = "mkdir -p $dir; $WGET -c -U \"$UserAgent\" -O $tmp $dat >/dev/null 2>&1"; +system $cmd; +$lines = (split(" ", `wc $tmp`))[0]; +$lines || exit; + +@ARGV = ($tmp); +if ($label =~ /^l(\d+)/) { +	$start = $lines - $1 + 1; +	if ($start < 1) { +		$start = 1; +	} +	$end = $lines; +} elsif ($label =~ /^(\d+)-(\d+)/) { +	$start = $1; +	$end = $2; +} elsif ($label =~ /^(\d+)-/) { +	$start = $1; +	$end = $start + 100 - 1; +} elsif ($label =~ /^(\d+)/) { +	$start = $1; +	$end = $1; +} else { +	$start = 1; +	$end = $lines; +} +$head = "<a href=\"$subback\">■掲示板に戻る■</a>\n"; +$head .= "<a href=\"$cgi/\">全部</a>\n"; +for (0 .. ($lines - 1) / 100) { +	$n = $_ * 100 + 1; +	$head .= "<a href=\"$cgi/$n-\">$n-</a>\n"; +} +$head .= "<a href=\"$cgi/l50\">最新50</a>\n"; +print <<EOF; +Content-Type: text/html + +EOF +$i = 1; +while (<>) { +	s/\r?\n$//; +	($name, $mail, $date, $_, $title) = split(/\<\>/); +	if ($i == 1) { +		if (!$title) { +			print <<EOF; +このスレッドは過去ログ倉庫に格納されています。 +<p> +<a href="$QUERY_STRING">$QUERY_STRING</a> +EOF +			unlink($tmp); +			exit +		} +		print <<EOF; +<title>$title</title> +$head +<p>$title</p> +<dl> +EOF +	} +	if ($mail) { +		$name = "<a href=\"mailto:$mail\">$name</a>"; +	} +	s@http://ime.nu/@http://@g; +	s@(h?ttp:)([#-~]+)@"<a href=\"" . &link("http:$2") .  "\">$1$2</a>"@ge; +	s@(ftp:[#-~]+)@<a href="$1">$1</a>@g; +	s@<a href="../test/read.cgi/\w+/\d+/@<a href="$cgi/@g; +	if ($i == 1 || ($i >= $start && $i <= $end)) { +		print <<EOF; +<dt><a name="$i">$i</a> :$name:$date +<dd> +$_ +<p> +EOF +	} +	$i++; +} +print <<EOF; +</dl> +<hr> +<form method=POST action="$cgi"><input type=submit value="書き込む" name=submit> 名前: <input name=FROM size=19> E-mail<font size=1> (省略可) </font>: <input name=mail size=19><br><textarea rows=5 cols=70 wrap=off name=MESSAGE></textarea><input type=hidden name=bbs value=$bbs><input type=hidden name=key value=$datnum><input type=hidden name=time value=@{[time]}></form></body></html> +EOF + +sub link { +	local($_) = @_; +	if (m@/test/read.cgi/@) { +		return "$CGI?$_"; +	} +	return $_; +} + +sub subback { +	$dat = $_; +	s@http://@@ || exit; +	$tmp = $ENV{"HOME"} . "/.w3m2ch/$_"; +	$dat =~ s/([^\w\/.\:\-])/\\$1/g; +	$tmp =~ s/([^\w\/.\:\-])/\\$1/g; +	($dir = $tmp) =~ s@/[^/]+$@@; +	$cmd = "mkdir -p $dir; $WGET -O $tmp $dat >/dev/null 2>&1"; +	system $cmd; +print <<EOF; +Content-Type: text/html + +EOF +	@ARGV = ($tmp); +	while (<>) { +		if (/<base href="([^"]+)"/) { +			$base = $1; +		} elsif ($base) { +			s@^<a href="@<a href="$CGI?$base@; +		} +		print; +	} +	unlink($tmp); +} + +sub post { +	my $debug = 0; + +	$| = 1; +	use IO::Socket; +	my @POST = <>; +	$QUERY_STRING =~ m@^http://([^/]+)@; +	my $host = $1; +	my $sock = IO::Socket::INET->new("$host:80") or die; +	# retrieve posting cookie; this may not work +	print "Content-Type: text/html\n\n"; +	print $sock +	    "HEAD /test/bbs.cgi HTTP/1.1\n", +	    "Host: $host\n", +	    "Connection: keep-alive\n", +	    "\n"; +	my $posting_cookie = undef; +	while (<$sock>) { +		print if ($debug); +		s/[\n\r]+$//; +		last if (/^$/); +		if (/^set-cookie:.*(PON=[^;]+)/i) { +			$posting_cookie = $1; +		} +	} +	#$sock = IO::Socket::INET->new("$host:80") or die; +	my $submit = +	    "POST /test/bbs.cgi HTTP/1.1\n" . +	    "Host: $host\n" . +	    "Accept-Language: ja\n" . +	    "User-Agent: $UserAgent\n" . +	    "Referer: $QUERY_STRING\n" . +	    "Cookie: $posting_cookie; NAME=nobody; MAIL=sage\n" . +	    "Content-Length: " . length(join("", @POST)) . "\n" . +	    "\n@POST"; +	print $sock $submit or die; +	print "\n-- POSTed contents --\n${submit}\n-- POSTed contents --\n" +	    if ($debug); +	my $chunked = 0; +	while (<$sock>) { +		s/[\n\r]*$//; +		last if (/^$/); +		$chunked = 1 if (/^transfer-encoding:\s*chunked/i); +	} +	my $post_response = ""; +	while (<$sock>) { +		if ($chunked) { +			s/[ \r\n]*$//; +			my $len = hex($_); +			$len > 0 or last; +			read($sock, $_, $len); +			<$sock>;	#skip empty line at the end of chunk. +		} +		$post_response .= $_; +	} +	$post_response =~ s/<META content=(\d+);URL=(\S+) http-equiv=refresh>/<META content=$1;URL=$cgi http-equiv=refresh>/im; +	print $post_response; +	exit; +} diff --git a/Bonus/README b/Bonus/README new file mode 100644 index 0000000..af019ce --- /dev/null +++ b/Bonus/README @@ -0,0 +1,80 @@ +2ch.cgi + +  [w3m-dev 03635] 2ch.cgi +  2ch 、ホ dat 、トセニノ、゚、ケ、 local CGI 、ヌ、ケ。」 + +  w3m file:/cgi-bin/2ch.cgi?http://pc.2ch.net/test/read.cgi/unix/1035755937/ + +  wget 、ホコケハャナセチ(-c)、サネ、、、゙、ケ。」 +  ニノ、、タ dat 、マ ~/.w3m2ch/ ーハイシ、ヒハンツク、キ、゙、ケ。」 +  ス、ュケ、゚、マ、ヌ、ュ、゙、サ、。」 + +smb.cgi + +  [w3m-dev 03634] smb.cgi +  SMB 、ヒ・「・ッ・サ・ケ、ケ、 local CGI 、ヌ、ケ。」 +  nmblookup,smbclient 、サネ、ヲ、ホ、ヌ sabma 、ャ・、・・ケ・ネ。シ・、オ、、ニ、、、 +  ノャヘラ、ャ、「、熙゙、ケ。」 +  ・ム・ケ・。シ・ノ、マ。「 +  1) ~/.w3m/smb 、ヒ・ム・ケ・。シ・ノ、ャタ゚ト熙オ、、ニ、ェ、遙「 +     smbclient 、ホ -A ・ェ・ラ・キ・逾、サネ、ィ、、ハ、 +     smbclient -A ~/.w3m/smb 、ネ、キ、ニナマ、キ、゙、ケ。」 +  2) エトカュハムソ PASSWD_FILE (・ム・ケ・。シ・ノ、ホ、゚、ホ・ユ・。・、・)、ャタ゚ト +     、オ、、ニ、、、セケ遉マ。「エトカュハムソ PASSWD_FILE 、サネ、、、゙、ケ。」 +  3) ~/.w3m/smb 、ヒ・ム・ケ・。シ・ノ、ャタ゚ト熙オ、、ニ、、、、ミ。「 +     エトカュハムソ PASSWD_FD 、サネ、テ、ニノクス猗ホマキミヘウ、ヌナマ、キ、゙、ケ。」 +  、ノ、チ、鬢ヒ、サ、陦「、「、゙、ホノ、、サ、ヌ、マ、ハ、、、ホ、ヌ SMB(CIFS)・ラ・・ネ・ウ・、 +  テ、ネヌ、エヒセ。」 + +google.cgi + +  [w3m-dev 03625] keymap key SEARCH string + +html2latex + +  HTML、ホハクス、LaTeX 、ヒハムエケ、キ、゙、ケ。・Ruby・ケ・ッ・・ラ・ネ、ヌ、ケ。・ノヤエーチエ、ヌ、ケ。・ +  、「、トナル、ホフ、ヒ、マホゥ、ト、ォ、筅キ、、゙、サ、。・ + +  サネヘムヒ。 + +    html2latex file.html > file.tex + +  、ウ、ウ、ヒテヨ、、、ニ、「、ヘヘウ + +    makeref 、ホ、ソ、皃ホノノハシ隍熙ヌ、ケ :-) + +makeref + +  HTML、ホハクス、ニノ、゚。、・「・・ォ。シ、ヒネヨケ讀ソカ、熙゙、ケ。・ネヨケ讀ソカ、テ、ソハクス、 +  ノクス狄ミホマ、ヒス、ュスミ、キ。、コヌク螟ヒ、ス、ホーヘ、スミホマ、キ、゙、ケ。・Ruby ・ケ・ッ・・ラ・ネ、ヌ、ケ。・ + +  サネヘムヒ。 + +    makeref [-url base_url] [file] + +    -url: ハクス、ホURL、サリト熙キ、゙、ケ。・・・・ッ、ホーヘ、スミ、ケ、ネ、ュ、ヒ。、、ス、ホURL、 +          ハ莇ー、ケ、、ソ、皃ヒサネ、、、゙、ケ。・ + +  ・ミ・ー + +    HTML、ホオュスメ・゚・ケ( < 、ヌ、マ、ハ、ッ < 、サネ、ヲ。、&... 、ホコヌク螟ヒ ; 、ノユ、ア、ハ、、 +    ナ)、ャ、「、、ネ。、ネ盻エ、ハキイフ、ヒ、ハ、、ウ、ネ、ャ、「、熙゙、ケ。・ + +    ネセウム・ォ・ハ(JIS X-0201・ォ・ハ)、ヒツミア、キ、ニ、、、゙、サ、。・ + +htmldump + +  URL 、ォ、飃TMLハクス、ニノ、゚。、・「・・ォ。シ、ヒネヨケ讀ソカ、テ、ニターキチ、キ。、ノクス狄ミホマ、ヒ +  ス、ュスミ、キ、゙、ケ。・ + +  サネヘムヒ。 + +    dumphtml [URL] + +    URL 、セハホャ、ケ、、ネ。、$WWW_HOME 、ホニ簣ニ、ニノ、゚、゙、ケ。・ + +  ・ミ・ー + +    URL 、ホサリ、ケハクス、ャHTML、ヌ、ハ、ォ、テ、ソセケ遑、、ォ、、、、ス、ヲ、ハ、ウ、ネ、ヒ、ハ、熙゙、ケ。・ +    makeref 、サネ、テ、ニ、、、、ホ、ヌ。、makeref 、ャ、ヲ、゙、ッス靉、ヌ、ュ、ハ、、ハクス、ホノスシィ +    、マハム、ヒ、ハ、熙゙、ケ。・ diff --git a/Bonus/README.eng b/Bonus/README.eng new file mode 100644 index 0000000..2f7507d --- /dev/null +++ b/Bonus/README.eng @@ -0,0 +1,77 @@ +2ch.cgi + +  [w3m-dev 03635] 2ch.cgi +  localcgi to read 2ch dat directly + +  w3m file:/cgi-bin/2ch.cgi?http://pc.2ch.net/test/read.cgi/unix/1035755937/ + +  It uses wget -c. +  `dat' files are recorded under ~/w3m2ch/. +  You can not post. + +smb.cgi + +  [w3m-dev 03634] smb.cgi +  localcgi to access SMB. +  Since it uses nmblookup, smbclient, you should install samba. +  Password can be passed to smbclient: +  1) When the password is set by contents of ~/.w3m/smb and +     -A option available, `smbclient -A ~/.w3m/smb' is used. +  2) When the environment variable PASSWD_FILE, it is used. +  3) When the password is set by contents of ~/.w3m/smb, +     the password is passed via standrad I/O using +     the environment variable PASSWD_FD. + +google.cgi + +  [w3m-dev 03625] keymap key SEARCH string + +html2latex + +  Convert HTML document into LaTeX. Ruby script. incomplete. + +  Usage: + +    html2latex file.html > file.tex + +  Why this script is here? + +    To exploit code for makeref. :-) + +makeref + +  Read HTML document and number the anchors. Print numbered document +  into standard output and append reference index. Ruby script. + +  Usage: + +    makeref [-u] [-url base_url] [file] + +    -url: Specify URL of the document. It is used to complete link +          in the document. + +    -u: Append URL after each anchor, instead of reference number. + +  Bugs + +    If there are any error in HTML (unbalanced < , character entity +    without ; , etc.), output will be miserable. + +htmldump + +  Read HTML document from URL, number the anchors and format it, +  and output it on standard output. + +  Usage + +    htmldump [-u] [URL] + +    -u: Append URL after each anchor, instead of reference number. + +    If URL is omitted, $WWW_HOME is used instead. + +  Bugs + +    It assumes that the document on URL is HTML. +    As it uses makeref to number the anchor, it can't handle any document +    makeref can't handle. diff --git a/Bonus/backslash_to_slash.cgi b/Bonus/backslash_to_slash.cgi new file mode 100755 index 0000000..20b0808 --- /dev/null +++ b/Bonus/backslash_to_slash.cgi @@ -0,0 +1,9 @@ +#!/usr/bin/perl +# keymap "x \\" GOTO file:/$LIB/backslash_to_slash.cgi  + +$_ = $ENV{W3M_CURRENT_LINK} || exit; +s@\\@/@g; +print <<EOF; +Location: $_ + +EOF diff --git a/Bonus/goodict.cgi b/Bonus/goodict.cgi new file mode 100755 index 0000000..8f443c1 --- /dev/null +++ b/Bonus/goodict.cgi @@ -0,0 +1,38 @@ +#!/usr/bin/perl + +# ~/.w3m/urimethodmap +# e:      file:/cgi-bin/goodict.cgi?%s +# w:      file:/cgi-bin/goodict.cgi?%s +# j:      file:/cgi-bin/goodict.cgi?%s + +use NKF; +#$mode = 0; # substring +$mode = 1;  # perfect match +#$mode = 3; # search body text +$url = "http://dictionary.goo.ne.jp"; +$_ = $ENV{"QUERY_STRING"}; +if (/^e:/) { +    $kind = 'ej'; +} elsif (/^w:/) { +    $kind = 'je'; +} elsif (/^j:/) { +    $kind = 'jn'; +} +s@^[ewjs]:@@ && s@^//@@ && s@/$@@; +if ($_) { +	s/\+/ /g; +	s/%([\da-f][\da-f])/pack('C', hex($1))/egi; +	$_ = nkf("-e", $_); +	s/[\000-\040\+:#?&%<>"\177-\377]/sprintf('%%%02X', unpack('C', $&))/eg; +	$url .= "/search.php?MT=$_&kind=$kind&mode=$mode"; +} else { +	$input = "w3m-control: GOTO_LINK"; +} +print <<EOF; +w3m-control: GOTO $url +w3m-control: DELETE_PREVBUF +w3m-control: SEARCH \\[ +w3m-control: MOVE_RIGHT +${input} + +EOF diff --git a/Bonus/google.cgi b/Bonus/google.cgi new file mode 100755 index 0000000..0016340 --- /dev/null +++ b/Bonus/google.cgi @@ -0,0 +1,25 @@ +#!/usr/bin/perl + +# ~/.w3m/urimethodmap +# g:      file:/cgi-bin/google.cgi?%s +# google: file:/cgi-bin/google.cgi?%s + +$url = "http://www.google.com/"; +$_ = $ENV{"QUERY_STRING"}; +s@^g(oogle)?:@@ && s@^//@@ && s@/$@@; +if ($_) { +	s/\+/ /g; +	s/%([\da-f][\da-f])/pack('C', hex($1))/egi; +	s/[\000-\040\+:#?&%<>"\177-\377]/sprintf('%%%02X', unpack('C', $&))/eg; +	$url .= "search?q=$_&hl=ja&lr=lang_ja&ie=EUC-JP"; +} else { +	$input = "w3m-control: GOTO_LINK"; +} +print <<EOF; +w3m-control: GOTO $url +w3m-control: DELETE_PREVBUF +w3m-control: SEARCH \\[ +w3m-control: MOVE_RIGHT +${input} + +EOF diff --git a/Bonus/html2latex b/Bonus/html2latex new file mode 100755 index 0000000..898799a --- /dev/null +++ b/Bonus/html2latex @@ -0,0 +1,517 @@ +#!/usr/local/bin/ruby + +# +#       HTML to LaTeX converter +#         by A. Ito, 16 June, 1997 +# + +require 'kconv' + +# configuration +def gif2eps(giffile,epsfile) +  cmd = "convert #{giffile} #{epsfile}" +  STDERR.print cmd,"\n" +  system cmd +end + +########################################################################### +class Tag +  def initialize(str) +    if str =~ /<(.+)>/ then +      str = $1 +    end +    tags = str.split +    @tagname = tags.shift.downcase +    @vals = {} +    tags.each do |t| +      if t =~ /=/ then +	tn,tv = t.split(/\s*=\s*/,2) +	tv.sub!(/^"/,"") +	tv.sub!(/"$/,"") +	@vals[tn.downcase] = tv +      else +	@vals[t.downcase] = TRUE +      end +    end +  end +  def tagname +    return @tagname +  end +  def each +    @vals.each do |k,v| +      yield k,v +    end +  end +  def switch(k) +    return @vals[k] +  end +end + +class TokenStream +  TAG_START = ?< +  TAG_END = ?> +  AMP_START = ?& +  AMP_END = ?; +   +  AMP_REPLACE_TABLE = { +    '&'   => '\\&', +    '>'    => '$>$', +    '<'    => '$<$', +    ' '  => '~', +    '"'  => '"', +  } +  def initialize(file) +    if file.kind_of?(File) then +      @f = file +    else +      @f = File.new(file) +    end +    @buf = nil +    @bpos = 0 +  end +   +  def read_until(endsym) +    complete = FALSE +    tag = [] +    begin +      while @bpos < @buf.size +	c = @buf[@bpos] +	if c == endsym then +	  tag.push(c.chr) +	  complete = TRUE +	  @bpos += 1 +	  break +	end +	if c == 10 || c == 13 then +	  tag.push(' ') +	else +	  tag.push(c.chr) +	end +	@bpos += 1 +      end +      unless complete +	@buf = @f.gets +	@bpos = 0 +	break if @f.eof? +      end +    end until complete +    return tag.join('') +  end +     +  def get +    while TRUE +      if @buf.nil? then +	@buf = Kconv.toeuc(@f.gets) +	if @f.eof? then +	  return nil +	end +	@bpos = 0 +      end +      if @buf[@bpos] == TAG_START then +	return Tag.new(read_until(TAG_END)) +      elsif @buf[@bpos] == AMP_START then +	return replace_amp(read_until(AMP_END)) +      else +	i = @bpos +	while i < @buf.size && @buf[i] != TAG_START && @buf[i] != AMP_START +	  i += 1 +	end +	r = @buf[@bpos,i-@bpos] +	if i == @buf.size then +	  @buf = nil +	else +	  @bpos = i +	end +	redo if r =~ /^\s+$/ +	return r +      end +    end +  end +  public :eof? +  def eof? +    @f.eof? +  end +  def replace_amp(s) +    if AMP_REPLACE_TABLE.key?(s) then +      return AMP_REPLACE_TABLE[s] +    else +      return s +    end +  end +end + + +def print_header +  print ' +\documentstyle[epsf]{jarticle} +\def\hr{\par\hbox to \textwidth{\hrulefill}} +\def\pre{\begin{quote}\def\baselinestretch{0.8}\tt\obeylines} +\def\endpre{\end{quote}} +\makeatletter +\@ifundefined{gt}{\let\gt=\dg}{} +\makeatother +' +end + + +class Environ_stack +  def initialize(*envs) +    @stack = envs +  end +  def action(tag) +    if tag =~ /^!/ then # comment +      return ["",nil] +    end +    i = @stack.size-1 +    while i >= 0 +      a = @stack[i].action(tag) +      unless a.nil? then +	return a +      end +      i -= 1 +    end +    return nil +  end +  def pop +    @stack.pop +  end +  def push(env) +    @stack.push(env) +  end +  def top +    @stack[@stack.size-1] +  end +  def dup +    @stack.push(top.clone) +  end +end + + +class Environment +  def initialize(interp) +    @silent = FALSE +    @in_table = FALSE +    @interp = interp; +    @align = nil; +  end +  def action(tag) +    return @interp[tag] +  end +   +  def flush(tok) +    if tok.kind_of?(String) then +      tok = tok.gsub(/&/,"\\&"); +      tok = tok.gsub(/%/,"\\%"); +      tok = tok.gsub(/#/,"\\#"); +      tok = tok.gsub(/\$/,"\\$"); +      tok = tok.gsub(/_/,"\\verb+_+"); +      tok = tok.gsub(/\^/,"\\verb+^+"); +      tok = tok.gsub(/~/,"\\verb+~+"); +    end +    if @in_table then +      @table[@table_rows][@table_cols] += tok +    elsif !@silent then +      if !@align.nil? && tok =~ /\n$/ then +	print tok.chop,"\\\\\n" +      else +	print tok +      end +    end +  end +   +  def set_interp(interp) +    @interp = interp +  end +   +  # tag processing methods +   +  # <TITLE> +  def do_silent(tag) +    @silent = TRUE +  end +   +  # </TITLE> +  def undo_silent(tag) +    @silent = FALSE +  end +   +  # <IMG> +  def img_proc(tag) +    src = tag.switch('src') +    newfile = src.sub(/\.GIF/i,".eps") +    gif2eps(src,newfile) +    flush "\\epsfile{file=#{newfile}}\n" +  end +   +  # <TABLE> +  def starttable(tag) +    @table = [] +    @tablespan = [] +    @table_rows = -1 +    @table_cols_max = 0 +    @in_table = TRUE +    unless tag.switch('border').nil? then +      @table_border = TRUE +    else +      @table_border = FALSE +    end +  end +   +  # <TR> +  def start_row(tag) +    @table_rows += 1 +    @table[@table_rows] = [] +    @tablespan[@table_rows] = [] +    @table_cols = -1 +    @colspan = 1 +  end +   +  # <TD> +  def start_col(tag) +    @colspan = tag.switch('colspan') +    if @colspan.nil? then +      @colspan = 1 +    else +      @colspan = @colspan.to_i +    end +    @tablespan[@table_rows][@table_cols+1] = @colspan +    @table_cols += @colspan +    if @table_cols > @table_cols_max then +      @table_cols_max = @table_cols +    end +  end +   +  # </TABLE> +  def endtable(tag) +    @in_table = FALSE +    flush "\\begin{tabular}{*{" +    flush @table_cols_max+1 +    if @table_border then +      flush "}{|l}|}\n\\hline\n" +    else +      flush "}{l}}\n" +    end +    for i in 0..@table_rows +      j = 0 +      while j <= @table_cols +	span = @tablespan[i][j] +	if span == 1 then +	  flush @table[i][j] +	elsif @table_border then +	  form = "|l" +	  if j+span > @table_cols then +	    form = "|l|" +	  end +	  flush "\\multicolumn{"+span.to_s+"}{"+form+"}{" +	  flush @table[i][j+span-1] +	  flush "}" +	else +	  flush "\\multicolumn{"+span.to_s+"}{l}{" +	  flush @table[i][j+span-1] +	  flush "}" +	end +	j += span +	if j <= @table_cols then +	  flush "&" +	end +      end +      flush "\\\\\n" +      flush "\\hline\n" if @table_border +    end +    flush "\\end{tabular}\n" +  end   +   +  # <CENTER> +  def startcenter(tag) +    if @in_table then +      flush "\\hfil" +    else +      flush "\\begin{center}\n" +    end +  end +   +  # </CENTER> +  def endcenter(tag) +    if @in_table then +      flush "\\hfil" +    else +      flush "\\end{center}\n" +    end +  end +   +  # <P> +  def paragraph(tag) +    align = tag.switch('align') +    if align.nil? then +      flush "\\par\n" +      @endparagraph = "" +    else +      align = align.downcase +      case align +      when "left" then +	flush "\\begin{flushleft}\n" +	@endparagraph = "\\end{flushleft}\n" +      when "center" then +	flush "\\begin{center}\n" +	@endparagraph = "\\end{center}\n" +      when "right" then +	flush "\\begin{flushright}\n" +	@endparagraph = "\\end{flushright}\n" +      end +    end +    @align = align +  end +   +  # </P> +  def endparagraph(tag) +    unless @align.nil? then +      @align = nil +      flush @endparagraph +    end +  end +end + + +enum_interp = { +  'li' => ["\\item ",nil] +} + +item_interp = { +  'li' => ["\\item ",nil] +} + +desc_interp = { +  'dt' => ["\\item[",nil], +  'dd' => ["]\n",nil] +} + +table_interp = { +  'tr' => [:start_row,nil], +  'td' => [:start_col,nil], +  '/tr' => ["",nil], +  '/td' => ["",nil], +} + +para_interp = { +  '/p'      => [:endparagraph ,"pop",TRUE], +} + +main_interp = { +  'body'    => ["\\begin{document}\n",nil,FALSE], +  '/body'   => ["\\end{document}\n",nil,FALSE], +  'head'    => ["",nil,FALSE], +  '/head'   => ["",nil,FALSE], +  'html'    => ["",nil,FALSE], +  '/html'   => ["",nil,FALSE], +  'title'   => [:do_silent,nil,FALSE], +  '/title'  => [:undo_silent,nil,FALSE], +  '!'       => ["",nil,FALSE], +  'h1'      => ["\\section{",nil,TRUE], +  'h2'      => ["\\subsection{",nil,TRUE], +  'h3'      => ["\\subsubsection{",nil,TRUE], +  'h4'      => ["\\paragraph{",nil,TRUE], +  '/h1'     => ["}\n",nil,TRUE], +  '/h2'     => ["}\n",nil,TRUE], +  '/h3'     => ["}\n",nil,TRUE], +  '/h4'     => ["}\n",nil,TRUE], +  'a'       => ["",nil,TRUE], +  '/a'      => ["",nil,TRUE], +  'center'  => [:startcenter,nil,TRUE], +  '/center' => [:endcenter,nil,TRUE], +  'ol'      => ["\\begin{enumerate}\n",enum_interp,TRUE], +  '/ol'     => ["\\end{enumerate}\n","pop",TRUE], +  'ul'      => ["\\begin{itemize}\n",item_interp,TRUE], +  '/ul'     => ["\\end{itemize}\n","pop",TRUE], +  'dl'      => ["\\begin{description}\n",desc_interp,TRUE], +  '/dl'     => ["\\end{description}\n","pop",TRUE], +  'pre'     => ["\\begin{pre}\n",nil,TRUE], +  '/pre'    => ["\\end{pre}\n",nil,TRUE], +  'p'       => [:paragraph ,para_interp,TRUE], +  'br'      => ["\\par ",nil,TRUE], +  'img'     => [:img_proc,nil,TRUE], +  'hr'      => ["\\hr ",nil,TRUE], +  'b'       => ["{\\bf\\gt ",nil,TRUE], +  '/b'      => ["}",nil,TRUE], +  'strong'  => ["{\\bf\\gt ",nil,TRUE], +  '/strong' => ["}",nil,TRUE], +  'dfn'     => ["{\\bf\\gt ",nil,TRUE], +  '/dfn'    => ["}",nil,TRUE], +  'i'       => ["{\\it",nil,TRUE], +  '/i'      => ["}",nil,TRUE], +  'address' => ["{\\it",nil,TRUE], +  '/address'=> ["}",nil,TRUE], +  'cite'    => ["{\\it",nil,TRUE], +  '/cite'   => ["}",nil,TRUE], +  'code'    => ["{\\tt",nil,TRUE], +  '/code'   => ["}",nil,TRUE], +  'kbd'     => ["{\\tt",nil,TRUE], +  '/kbd'    => ["}",nil,TRUE], +  'tt'      => ["{\\tt",nil,TRUE], +  '/tt'     => ["}",nil,TRUE], +  'samp'    => ["{\\tt",nil,TRUE], +  '/samp'   => ["}",nil,TRUE], +  'em'      => ["{\\em",nil,TRUE], +  '/em'     => ["}",nil,TRUE], +  'u'       => ["$\\underline{\\mbox{",nil,TRUE], +  '/u'      => ["}}$",nil,TRUE], +  'sub'     => ["${}_\mbox{",nil,TRUE], +  '/sub'    => ["}$",nil,TRUE], +  'sup'     => ["${}^\mbox{",nil,TRUE], +  '/sup'    => ["}$",nil,TRUE], +  'table'   => [:starttable, table_interp,TRUE], +  '/table'  => [:endtable, "pop",TRUE], +  'font'    => ["",nil,TRUE], +  '/font'   => ["",nil,TRUE], +} + + + + +################################ MAIN #################################### + +$in_document = FALSE +print_header +intp = Environ_stack.new(Environment.new(main_interp)) +f = TokenStream.new(ARGV[0]) +until f.eof? +  tok = f.get +  if tok.kind_of?(Tag) then +    case tok.tagname +    when "body" +      $in_document = TRUE +    when "/body" +      $in_document = FALSE +    end +    act = intp.action(tok.tagname) +    if act.nil? then +      STDERR.print "tag ",tok.tagname," ignored\n" +    else +      if act[2] && !$in_document then +        print "\\begin{document}\n" +	$in_document = TRUE +      end +      # environment push +      if act[1].kind_of?(Hash) && +	  (tok.tagname != "p" || tok.switch('align') != nil) then +	  intp.dup +	  intp.top.set_interp(act[1]) +      end +       +      if act[0].kind_of?(String) then +	intp.top.flush act[0] +      elsif act[0].kind_of?(Fixnum) then # interned symbol +	intp.top.send(act[0],tok) +      end +       +      # environment pop +      if act[1] == "pop" then +	intp.pop +      end +    end +  elsif !tok.nil? then +    intp.top.flush tok +  end +end +if $in_document then +  print "\\end{document}\n" +end diff --git a/Bonus/htmldump b/Bonus/htmldump new file mode 100755 index 0000000..4be60bf --- /dev/null +++ b/Bonus/htmldump @@ -0,0 +1,12 @@ +#!/bin/sh +OPT= +if [ $# -gt 0 -a $1 = "-u" ]; then +  OPT=-u +  shift +fi +if [ $# = 0 ]; then +  URL=$WWW_HOME +else +  URL=$1 +fi +w3m -dump_source $URL | makeref $OPT -url $URL | w3m -dump -F -T text/html diff --git a/Bonus/makeref b/Bonus/makeref new file mode 100755 index 0000000..9cb1942 --- /dev/null +++ b/Bonus/makeref @@ -0,0 +1,266 @@ +#!/usr/local/bin/ruby + +#  HTML reference generator +#  by A.Ito 1999/3/30 + +require 'kconv' + +########################################################################### +class URL +  attr 'scheme' +  attr 'host' +  attr 'port' +  attr 'file' +  attr 'label' +  def initialize(str) +    if /([a-zA-Z+\-]+):(.*)/ =~ str then +      @scheme = $1 +      str = $2 +    else +      @scheme = 'unknown' +    end +    hostpart = '' +    if %r'//([^/]*)(/.*)' =~ str then +      hostpart = $1 +      str = $2 +    elsif %r'//([^/]*)$' =~ str then +      hostpart = str +      str = '' +    end +    if hostpart != '' then +      if /(.*):(\d+)/ =~ hostpart then +        @host = $1 +        @port = $2 +      else +        @host = hostpart +        @port = '' +      end +    else +      @host = @port = '' +    end +    if /(.*)#(.*)/ =~ str then +      @file = $1 +      @label = $2 +    else +      @file = str +      @label = '' +    end +  end +  def to_s +    s = "#{@scheme}:" +    if s == 'news' or s == 'mailto' then +      return s+@file +    end +    s += "//"+@host +    s += ":"+@port if @port.size > 0 +    s += @file +    s += "#"+@label if @label.size > 0 +    s +  end +  def complete(current) +    @scheme = current.scheme  if @scheme == 'unknown' +    @port = current.port if @host == '' and @port == '' +    @host = current.host if @host == '' +    unless @file =~ %r'^/' then +      @file = File.expand_path(File.dirname(current.file)+'/'+@file) +    end +    self +  end +end + +class Tag +  def initialize(str) +    if str =~ /<(.+)>/ then +      str = $1 +    end +    tags = str.split +    @tagname = tags.shift.downcase +    @vals = {} +    tags.each do |t| +      if t =~ /=/ then +	tn,tv = t.split(/\s*=\s*/,2) +	tv.sub!(/^"/,"") +	tv.sub!(/"$/,"") +	@vals[tn.downcase] = tv +      else +	@vals[t.downcase] = TRUE +      end +    end +  end +  def tagname +    return @tagname +  end +  def each +    @vals.each do |k,v| +      yield k,v +    end +  end +  def switch(k) +    return @vals[k] +  end +  def to_s +    if tagname =~ /!--/ then +      return '' +    end +    t = "<"+tagname +    if @vals.size == 0 then +      return t+">" +    end +    each do |a,v| +      if v == true then +        t += " #{a}" +      else +        t += " #{a}=\"#{v}\"" +      end +    end +    t+">" +  end +end + +class TokenStream +  TAG_START = ?< +  TAG_END = ?> +  AMP_START = ?& +  AMP_END = ?; +   +  def initialize(file) +    if file.kind_of?(IO) then +      @f = file +    else +      @f = File.new(file) +    end +    @buf = nil +    @bpos = 0 +  end +   +  def read_until(endsym) +    complete = FALSE +    tag = [] +    begin +      while @bpos < @buf.size +	c = @buf[@bpos] +	if c == endsym then +	  tag.push(c.chr) +	  complete = TRUE +	  @bpos += 1 +	  break +	end +	if c == 10 || c == 13 then +	  tag.push(' ') +	else +	  tag.push(c.chr) +	end +	@bpos += 1 +      end +      unless complete +	@buf = @f.gets +	@bpos = 0 +	break if @f.eof? +      end +    end until complete +    return tag.join('') +  end +     +  def get +    while TRUE +      if @buf.nil? then +	@buf = @f.gets +	if @f.eof? then +	  return nil +	end +        @buf = Kconv.toeuc(@buf) +	@bpos = 0 +      end +      if @buf[@bpos] == TAG_START then +	return Tag.new(read_until(TAG_END)) +      elsif @buf[@bpos] == AMP_START then +	return read_until(AMP_END) +      else +	i = @bpos +	while i < @buf.size && @buf[i] != TAG_START && @buf[i] != AMP_START +	  i += 1 +	end +	r = @buf[@bpos,i-@bpos] +	if i == @buf.size then +	  @buf = nil +	else +	  @bpos = i +	end +	redo if r =~ /^\s+$/ +	return r +      end +    end +  end +  public :eof? +  def eof? +    @f.eof? +  end +end + +################################ MAIN #################################### + +refs = [] +refnum = 0 +body_finished = false +html_finished = false +currentURL = nil +immediate_ref = false + +while ARGV[0] =~ /^-/ +  case ARGV.shift +  when '-url' +    currentURL = URL.new(ARGV.shift) +  when '-u' +    immediate_ref = true +  end +end + +if ARGV.size > 0 then +  f = TokenStream.new(ARGV[0]) +else +  f = TokenStream.new(STDIN) +end + +until f.eof? +  tok = f.get +  if tok.kind_of?(Tag) then +    if tok.tagname == 'a' and !tok.switch('href').nil? then +      refs[refnum] = tok.switch('href') +      refnum += 1 +    elsif tok.tagname == '/a' then +      if immediate_ref then +        r = refs[refnum-1] +        if !currentURL.nil? then +          r = URL.new(r).complete(currentURL).to_s +        end +        print "[#{r}]" +      else +        print "[#{refnum}]" +      end +    elsif tok.tagname == '/body' then +      body_finished = true +      break +    elsif tok.tagname == '/html' then +      html_finished = true +      break +    end +    print tok.to_s +  elsif !tok.nil? then +    print tok +  end +end +if !immediate_ref and refs.size > 0 then +  print "<hr><h2>References</h2>\n" +  for i in 0..refs.size-1 +    if currentURL.nil? then +      r = refs[i] +    else +      r = URL.new(refs[i]) +      r.complete(currentURL) +      r = r.to_s +    end +    print "[#{i+1}] #{r}<br>\n" +  end +end +print "</body>\n" unless body_finished +print "</html>\n" unless html_finished diff --git a/Bonus/oldconfigure.sh b/Bonus/oldconfigure.sh new file mode 100755 index 0000000..541facb --- /dev/null +++ b/Bonus/oldconfigure.sh @@ -0,0 +1,183 @@ +#! /bin/sh +# +# oldconfig.sh: convert a config.param file and execute configure +# + +# functions +opt_push () { +#  OPT="${OPT} $1" +  OPT="${OPT}	\\ +	$1" +} + +opt_enable_set () { +  val="" +  if test x"$1" = xy; then +    val="--enable-$2" +  elif test x"$1" = xn; then +    val="--disable-$2" +  fi +  if test x"$val" != x; then +    opt_push "$val" +  fi +} + +opt_with_set () { +  val="" +  if test x"$1" != x; then +    val="--with-$2='$1'" +  else +    val="--without-$2" +  fi +  if test x"$val" != x; then +    opt_push "$val" +  fi +} + +env_set () { +  # no overwrite +  if test x"$1" != x && eval "test -z \"\$$1\"" > /dev/null; then +    echo "$1='$2'; export $1" +    eval "$1='$2'; export $1" +  fi +} + +# main +topdir="`dirname $0`/.." + +if test x"$1" = x-v; then +  echo_only=yes +  shift +fi +if test x"$1" = x; then +  echo "USAGE: $0 [-v] <config.param file>" +  echo "    option: -v ... echo only" +  exit 1 +fi + +if expr "$1" : '.*/' > /dev/null; then +  conffile="$1" +else +  conffile=./"$1" +fi +. "$conffile" # read config.param + +OPT="" +libdir=`echo $libdir | sed 's@/w3m[^/]*/cgi-bin@@'` +libexecdir=`echo $auxbindir | sed 's@/w3m[^/]*@@'` +datadir=`echo $helpdir | sed 's@/w3m[^/]*@@'` +sysconfdir=`echo $sysconfdir | sed 's@/w3m[^/]*@@'` +opt_push "--bindir='$bindir'" +opt_push "--libexecdir='$libexecdir'" +opt_push "--datadir='$datadir'" +opt_push "--sysconfdir='$sysconfdir'" +opt_push "--libdir='$libdir'" +opt_push "--mandir='$mandir'" + +#case "$dmodel" in +#  1) val=baby;; +#  2) val=little;; +#  3) val=mouse;; +#  4) val=cookie;; +#  5) val=monster;; +#  *) echo "ERROR: Illegal model type (model=$dmodel)." +#     exit 1;; +#esac +#opt_push "--enable-model=$val" + +case "$lang" in +  JA) +    if test x$display_code != x; then +      opt_push "--enable-japanese='$display_code'" +    else +      opt_push "--enable-japanese" +    fi +    opt_enable_set "$kanji_symbols" kanjisymbols +    ;; +  *) +    ;; +esac + +opt_enable_set "$use_color" color +opt_enable_set "$use_ansi_color" ansi-color +opt_enable_set "$use_bg_color" bgcolor +if test x"$use_migemo" = xy; then +  if test x"$def_migemo_command" != x; then +    opt_push "--with-migemo='$def_migemo_command'" +  fi +elif test x"$use_migemo" = xn; then +  opt_push "--without-migemo" +fi +opt_enable_set "$use_mouse" mouse +opt_enable_set "$use_menu" menu +opt_enable_set "$use_cookie" cookie +opt_enable_set "$use_dict" dict +opt_enable_set "$use_history" history +opt_enable_set "$use_digest_auth" digest-auth +opt_enable_set "$use_nntp" nntp +opt_enable_set "$use_gopher" gopher +if test x"$use_lynx_key" = xy; then +  opt_push "--enable-keymap=lynx" +else +  opt_push "--enable-keymap=w3m" +fi +opt_with_set "$ded" editor +opt_with_set "$dmail" mailer +opt_with_set "$dbrowser" browser +opt_enable_set "$use_help_cgi" help-cgi +opt_enable_set "$use_external_uri_loader" external-uri-loader +opt_enable_set "$use_w3mmailer" w3mmailer +opt_enable_set "$use_alarm" alarm +if test x"$use_image" = xy; then +  val_x11="" +  val_fb="" +  if test x"$use_w3mimg_x11" = xy; then +    val_x11="x11" +  fi +  if test x"$use_w3mimg_fb" = xy; then +    if test x"$w3mimgdisplay_setuid" = xy; then +      val_fb="fb+s" +    else +      val_fb="fb" +    fi +  fi +  if test x"$val_x11" != x; then +    if test x"$val_fb" != x; then +      val="$val_x11,$val_fb" +    else +      val="$val_x11" +    fi +  elif test x"$val_fb" != x; then +    val="$val_fb" +  fi + +  if test x"$val" = x; then +    opt_push "--enable-image" +  else +    opt_push "--enable-image='$val'" +  fi + +  opt_enable_set "$use_xface" xface +elif test x"$use_image" = xn; then +  opt_push "--disable-image" +fi +if test x"$dtermlib" != x; then +  dtermlib=`echo "$dtermlib"|sed 's/^-l//'` +  opt_with_set "$dtermlib" termlib +fi +if test x"$use_ssl" = xy; then +  opt_push "--with-ssl" +  opt_enable_set "$use_ssl_verify" sslverify +elif test x"$use_ssl" = xn; then +  opt_push "--without-ssl" +fi +opt_enable_set "$use_ipv6" ipv6 + +env_set CC "$dcc" +env_set CFLAGS "$dcflags" +env_set LDFLAGS "$dldflags" + +echo "( cd '$topdir' && sh configure ${OPT} )" +if test "${echo_only+set}" != set; then +  echo "( cd '$topdir' && sh configure ${OPT} )" | sh +fi diff --git a/Bonus/scanhist.rb b/Bonus/scanhist.rb new file mode 100644 index 0000000..69dcc9d --- /dev/null +++ b/Bonus/scanhist.rb @@ -0,0 +1,88 @@ +#!/usr/local/bin/ruby + +# scan history + +def usage +  STDERR.print "usage: scanhist -h HISTORY ML-archive1 ML-archive2 ...\n" +  exit 1 +end + +def html_quote(s) +  s.gsub!(/&/,"&") +  s.gsub!(/</,"<") +  s.gsub!(/>/,">") +  s +end + +if ARGV.size == 0 then +  usage +end + +histfile = nil + +while ARGV[0] =~ /^-/ +  case ARGV.shift +  when "-h" +    histfile = ARGV.shift +  else +    usage +  end +end + +if histfile.nil? then +  usage +end + +patched = {} +histline = {} +f = open(histfile) +while f.gets +  if /Subject: (\[w3m-dev.*\])/ then +    patched[$1] = true +    histline[$1] = $. +  end +end +f.close + +archive = {} +subject = nil +for fn in ARGV +  f = open(fn) +  while f.gets +    if /^From / then +       # beginning of a mail +       subject = nil +    elsif subject.nil? and /^Subject: / then +       $_ =~ /Subject: (\[w3m-dev.*\])/ +       subject = $1 +       archive[subject] = [$_.chop.sub(/^Subject:\s*/,""),false,fn+"#"+($.).to_s] +    elsif /^\+\+\+/ or /\*\*\*/ or  /filename=.*(patch|diff).*/ or /^begin \d\d\d/ +       archive[subject][1] = true +    end +  end +  f.close +end + +print "<html><head><title>w3m patch configuration\n</title></head><body>\n" +print "<pre>\n" +for sub in archive.keys.sort +  a = archive[sub] +  if a[1] then +    if patched[sub] then +      print "[<a href=\"#{histfile}\##{histline[sub]}\">+</a>]" +    else +      print "[-]" +    end +    print "<a href=\"#{a[2]}\">" +    print "<b>",html_quote(a[0]),"</b></a>\n" +  else +    if patched[sub] then +      print "[<a href=\"#{histfile}\##{histline[sub]}\">o</a>]" +    else +      print "   " +    end +    print "<a href=\"#{a[2]}\">" +    print "<b>",html_quote(a[0]),"</b></a>\n" +  end +end +print "</pre></body></html>\n" diff --git a/Bonus/smb.cgi b/Bonus/smb.cgi new file mode 100755 index 0000000..536db89 --- /dev/null +++ b/Bonus/smb.cgi @@ -0,0 +1,462 @@ +#!/usr/bin/perl + +# Workgroup list: file:/$LIB/smb.cgi +# Server list:    file:/$LIB/smb.cgi?workgroup +# Sahre list:     file:/$LIB/smb.cgi?//server +#                 file:/$LIB/smb.cgi/server +# Directory:      file:/$LIB/smb.cgi?//server/share +#                 file:/$LIB/smb.cgi?//server/share/dir... +#                 file:/$LIB/smb.cgi/server/share +# Get file:       file:/$LIB/smb.cgi?//server/share/dir.../file +#                 file:/$LIB/smb.cgi/server/share/dir.../file +# +# ----- ~/.w3m/smb ----- +# workgroup = <workgroup> +# [ username = <username> ] +# [ password = <password> ] +# [ password_file = <password_file> ] +# ---------------------- +# --- <password_file> --- +# <password> +# ----------------------- +# default: +#  <username> = $USER +#  <password> = $PASSWD  (Don't use!) +#  <password_file> = $PASSWD_FILE + +$DEBUG = 1; + +$MIME_TYPE = "~/.mime.types"; +$AUTH_FILE = "~/.w3m/smb"; +$MIME_TYPE =~ s@^~/@$ENV{"HOME"}/@; +$AUTH_FILE =~ s@^~/@$ENV{"HOME"}/@; +$WORKGROUP = "-"; +$USER = $ENV{"USER"}; +$PASSWD = $ENV{"PASSWD"}; +$PASSWD_FILE = $ENV{"PASSWD_FILE"}; +&load_auth_file($AUTH_FILE); + +$NMBLOOKUP = "nmblookup"; +$SMBCLIENT = "smbclient"; +@NMBLOOKUP_OPT = ("-T"); +@SMBCLIENT_OPT = ("-N"); +$USE_OPT_A = defined($PASSWD) && (-f $AUTH_FILE) && &check_opt_a(); +if ($USE_OPT_A) { +	push(@SMBCLIENT_OPT, "-A", $AUTH_FILE); +} elsif (-f $PASSWD_FILE) { +	$USE_PASSWD_FILE = 1; +} elsif (defined($PASSWD)) { +	$USE_PASSWD_FD = 1; +	$PASSWD_FD = 0; +} +if (defined($PASSWD)) { +	$passwd = "*" x 8; +} +$DEBUG && print <<EOF; +DEBUG: NMBLOOKUP=$NMBLOOKUP @NMBLOOKUP_OPT +DEBUG: SMBCLIENT=$SMBCLIENT @SMBCLIENT_OPT +DEBUG: WORKGROUP=$WORKGROUP +DEBUG: USER=$USER +DEBUG: PASSWD=$passwd +DEBUG: PASSWD_FILE=$PASSWD_FILE +DEBUG: PASSWD_FD=$PASSWD_FD +EOF + +$PAGER = "cat"; +$FILE = "F000"; + +$CGI = "file://" . &file_encode($ENV{"SCRIPT_NAME"} || $0); +$QUERY = $ENV{"QUERY_STRING"}; +$PATH_INFO = $ENV{"PATH_INFO"}; + +if ($PATH_INFO =~ m@^/@) { +	$_ = $PATH_INFO; +	if (! m@^//@) { +		$_ = "/$_"; +	} +	s@[\r\n\0\\"]@@g; +	$DEBUG && print "DEBUG: PATH_INFO=\"$_\"\n"; +	$Q = ""; +} +else { +	$_ = &file_decode($QUERY); +	$DEBUG && print "DEBUG: QUERY_STRING=\"$_\"\n"; +	$Q = "?"; +} +if (s@^//([^/]+)@@) { +	$server = $1; +#	if (!$USE_OPT_A && !defined($PASSWD)) { +#		&print_form("//$server$_"); +#		exit; +#	} +	if (s@^/([^/]+)@@) { +		&file_list("//$server/$1", &cleanup($_)); +	} else { +		&share_list($server); +	} +} elsif (m@^[^/]@) { +	&server_list($_); +} else { +	&group_list(); +} + +sub file_list { +	local($service, $file) = @_; +	local(@files) = (); +	local($dir, $qservice, $qfile);  +	local($_, $c); + +$DEBUG && print "DEBUG: service=\"$service\" file=\"$file\"\n"; +	if ($file eq "/") { +		goto get_list; +	} +	$_ = $file; +	s@/@\\@g; +	@cmd = ($SMBCLIENT, $service, @SMBCLIENT_OPT, "-c", "ls \"$_\""); +	$F = &open_pipe(1, @cmd); +	while (<$F>) { +$DEBUG && print "DEBUG: $_"; +		/^\s/ && last; +	} +	close($F); +	if (s/\s+([A-Z]*) {1,8}\d+  (\w{3} ){2}[ \d]\d \d\d:\d\d:\d\d \d{4}\s*$// +		&& $1 !~ /D/) { +		&get_file($service, $file); +		exit; +	} + +    get_list: +	$_ = "$file/*"; +	s@/+@\\@g; +	@cmd = ($SMBCLIENT, $service, @SMBCLIENT_OPT, "-c", "ls \"$_\""); +	$F = &open_pipe(1, @cmd); +	while (<$F>) { +		/^\s*$/ && last; +$DEBUG && print "DEBUG: $_"; +		/^cd\s+/ && last; +		/^\S/ && next; +		s/\r?\n//; +		push(@files, $_); +	} +	close($F); + +	$qservice = &html_quote($service); +	$service = &file_encode($service); +	$qfile = &html_quote($file); +	$file = &file_encode($file); + +	print "Content-Type: text/html\n\n"; +	print "<title>$qservice$qfile</title>\n"; +	print "<b>$qservice$qfile</b>\n"; +	print "<pre>\n"; +	for (sort @files) { +		s/\s+([A-Z]*) {1,8}\d+  (\w{3} ){2}[ \d]\d \d\d:\d\d:\d\d \d{4}\s*$// || next; +		$c = $&; +		s/^  //; +		$_ eq "." && next; +		print "<a href=\"$CGI$Q$service" +			. &cleanup("$file/" . &file_encode($_)) . "\">" +			. &html_quote($_) . "</a>" +			. &html_quote($c) . "\n"; +	} +	print "</pre>\n"; +} + +sub get_file { +	local($service, $file) = @_; +	local($encoding, $type); +	local($_, @cmd); + +	$_ = $file; +	s@/@\\@g; +	@cmd = ($SMBCLIENT, $service, @SMBCLIENT_OPT, "-E", "-c", "more \"$_\""); +$DEBUG && print "DEBUG: @cmd\n"; + +	($encoding, $type) = &guess_type($file); +	$file =~ s@^.*/@@; +	$| = 1; +	print "Content-Encoding: $encoding\n" if $encoding; +	print "Content-Type: $type; name=\"$file\"\n\n"; + +	$ENV{"PAGER"} = $PAGER if $PAGER; +	&exec_cmd(1, @cmd); +} + +sub share_list { +	local($server) = @_; +	local(@share); +	local($qserver, $_, $d, @c); + +	@share = &get_list(1, $server, "Share"); + +	$qserver = &html_quote($server); +	$server = &file_encode($server); + +	print "Content-Type: text/html\n\n"; +	print "<title>Share list: $qserver</title>\n"; +	print "<table>\n"; +	print "<tr><td colspan=3><b>$qserver</b>"; +	for (sort @share) { +		($_, $d, @c) = split(" "); +		if ($d eq 'Disk') { +			print "<tr><td>+ <a href=\"$CGI$Q//$server/" +				. &file_encode($_) . "\">" +				. &html_quote($_) . "</a>"; +		} else { +			print "<tr><td>+ " +				. &html_quote($_); +		} +		print "<td><td>" +			. &html_quote($d) . "<td><td>" +			. &html_quote("@c") . "\n"; +	} +	print "</table>\n"; +} + +sub server_list { +	local($group) = @_; +	local($master, @server); +	local($_, @c); + +	$master = &get_master($group); +	@server = &get_list(0, $master, "Server"); + +	$group = &html_quote($group); + +	print "Content-Type: text/html\n\n"; +	print "<title>Server list: $group</title>\n"; +	print "<table>\n"; +	print "<tr><td colspan=3><b>$group</b>\n"; +	for (sort @server) { +		($_, @c) = split(" "); +		print "<tr><td>+ <a href=\"$CGI$Q//" +			. &file_encode($_) . "\">" +			. &html_quote($_) . "</a><td><td>" +			. &html_quote("@c") . "\n"; +	} +	print "</table>\n"; +} + +sub group_list { +	local($master, @group); +	local($_, @c); + +	$master = &get_master($WORKGROUP || "-"); +	@group = &get_list(0, $master, "Workgroup"); + +	print "Content-Type: text/html\n\n"; +	print "<title>Workgroup list</title>\n"; +	print "<table>\n"; +	for (sort @group) { +		($_, @c) = split(" "); +		print "<tr><td><a href=\"$CGI?" +			. &file_encode($_) . "\">" +			. &html_quote($_) . "</a><td><td>" +			. &html_quote("@c") . "\n"; +	} +	print "</table>\n"; +} + +sub check_opt_a { +	local($_, $F, @cmd); + +	@cmd = ($SMBCLIENT, "-h"); +	$F = &open_pipe(0, @cmd); +	while (<$F>) { +		if (/^\s*-A\s/) { +$DEBUG && print "DEBUG: $_"; +			close($F); +			return 1; +		} +	} +	close($F); +	return 0; +} + +sub get_master { +	local($group) = @_; +	local($_, $F, @cmd); + +	@cmd = ($NMBLOOKUP, "-M", @NMBLOOKUP_OPT, $group); +	$F = &open_pipe(0, @cmd); +	$_ = <$F>; +	$_ = <$F>; +	close($F); +	($_) = split(/[,\s]/); +	s/\.*$//; +	return $_; +} + +sub get_list { +	local($passwd, $server, $header) = @_; +	local(@list) = (); +	local($_, @cmd, $F); + +	@cmd = ($SMBCLIENT, @SMBCLIENT_OPT, "-L", $server); +	$F = &open_pipe($passwd, @cmd); +	while (<$F>) { +		if (/^\s*$header/) { +$DEBUG && print "DEBUG: $_"; +			last; +		} +	} +	while (<$F>) { +		/^\s*$/ && last; +$DEBUG && print "DEBUG: $_"; +		/^\S/ && last; +		/^\s*-/ && next; +		push(@list, $_); +	} +	close($F); +	return @list; +} + +sub open_pipe { +	local($passwd, @cmd) = @_; +	local($F) = $FILE++; + +$DEBUG && print "DEBUG: @cmd\n"; +	open($F, "-|") || &exec_cmd($passwd, @cmd); +	return $F; +} + +sub exec_cmd { +	local($passwd, @cmd) = @_; + +	$ENV{"LC_ALL"} = "C"; +	$ENV{"USER"} = $USER; +	if ($passwd && !$USE_OPT_A) { +		if ($USE_PASSWD_FILE) { +			$ENV{"PASSWD_FILE"} = $PASSWD_FILE; +		} elsif ($USE_PASSWD_FD) { +			$ENV{"PASSWD_FD"} = $PASSWD_FD; +			if (open(W, "|-")) { +				print W $PASSWD; +				close(W); +				exit; +			} +		} +	} +	open(STDERR, ">/dev/null"); +	exec @cmd; +	exit 1; +} + +sub print_form { +	local($_) = @_; +	local($q) = &html_quote($_); +	$_ = &file_encode($_); + +	print <<EOF; +Content-Type: text/html + +<h1>$q</h1> +<form action="$CGI$Q$_" method=POST> +<table> +<tr><td>Workgroup	<td>User	<td>Password +<tr><td><input type=text size=8 name=group value="$WORKGROUP"> +    <td><input type=text size=8 name=user value="$USER"> +    <td><input type=password size=8 name=passwd value="$PASSWD"> +    <td><input type=submit name=OK value=OK> +</table> +</form> +EOF +} + +sub load_auth_file { +	local($_) = @_; + +	if ($USER =~ s/%(.*)$//) { +		$PASSWD = $1 unless $PASSWD; +	} +	open(F, $_) || return; +	while (<F>) { +		s/\s+$//; +		if (s/^workgroup\s*=\s*//i) { +			$WORKGROUP = $_; +		} elsif (s/^user(name)?\s*=\s*//i) { +			$USER = $_; +		} elsif (s/^passw(or)?d\s*=\s*//i) { +			$PASSWD = $_; +		} elsif (s/^passw(or)?d_file\s*=\s*//i) { +			$PASSWD_FILE = $_; +		} +	} +	close(F); +} + +sub load_mime_type { +	local($_) = @_; +	local(%mime) = (); +	local($type, @suffix); + +	open(F, $_) || return (); +	while(<F>) { +		/^#/ && next; +		chop; +		(($type, @suffix) = split(" ")) >= 2 || next; +		for (@suffix) { +			$mime{$_} = $type; +		} +	} +	close(F); +	return %mime; +} + +sub guess_type { +	local($_) = @_; +	local(%mime) = &load_mime_type($MIME_TYPE); +	local($encoding) = undef; + +	if (s/\.gz$//i) { +		$encoding = "gzip"; +	} elsif (s/\.Z$//i) { +		$encoding = "compress"; +	} elsif (s/\.bz2?$//i) { +		$encoding = "bzip2"; +	} +	/\.(\w+)$/; +	$_ = $1; +	tr/A-Z/a-z/; +	return ($encoding, $mime{$_} || "text/plain"); +} + +sub cleanup { +	local($_) = @_; + +	$_ .= "/"; +	s@//+@/@g; +	s@/\./@/@g; +	while(m@/\.\./@) { +		s@^/(\.\./)+@/@; +		s@/[^/]+/\.\./@/@; +	} +	s@(.)/$@$1@; +	return $_; +} + +sub file_encode { +	local($_) = @_; +	s/[\000-\040\+:#?&%<>"\177-\377]/sprintf('%%%02X', unpack('C', $&))/eg; +	return $_; +} + +sub file_decode { +	local($_) = @_; +	s/\+/ /g; +	s/%([\da-f][\da-f])/pack('C', hex($1))/egi; +	s@[\r\n\0\\"]@@g; +	return $_; +} + +sub html_quote { +	local($_) = @_; +	local(%QUOTE) = ( +		'<', '<', +		'>', '>', +		'&', '&', +		'"', '"', +	); +	s/[<>&"]/$QUOTE{$&}/g; +	return $_; +} diff --git a/Bonus/utf8.cgi b/Bonus/utf8.cgi new file mode 100644 index 0000000..a21731e --- /dev/null +++ b/Bonus/utf8.cgi @@ -0,0 +1,21 @@ +#!/usr/bin/perl +# +# [w3m-dev 03783] +# Install it in $LIB/utf8.cgi and configure keymap as +#   keymap  "x u"   GOTO file:/$LIB/utf8.cgi +# +$conv = "lv -Iu -Oe"; +# $conv = "iconv -f UTF-8 -t EUC-JP"; +$type = $ENV{W3M_TYPE} || "text/plain"; +$url = $ENV{W3M_URL}; +$file = $ENV{W3M_SOURCEFILE}; +-f $file || exit; +$| = 1; +print <<EOF; +Content-Type: $type; charset=EUC-JP + +EOF +if ($type =~ /^text\/html/i && $url) { +	print "<BASE HREF=\"$url\">\n"; +} +exec split(" ", $conv), $file; diff --git a/Bonus/wrap3m b/Bonus/wrap3m new file mode 100755 index 0000000..9555c9a --- /dev/null +++ b/Bonus/wrap3m @@ -0,0 +1,33 @@ +#!/bin/sh + +HOMEPAGE=http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/ +OPT="" +URL="" +for i in $@ +do +  case $i in +  -*)  +    OPT="$OPT $i" +    ;; +  *) +    URL="$URL $i" +    ;; +  esac +done + +if [ -z "$URL" ]; then +  URL=$HOMEPAGE +fi +URLARG="" +for u in $URL +do +  if [ `expr $u : '[a-z][a-z]*://'` -gt 0 ]; then +    URLARG="$URLARG $u" +  elif [ -f $u -o -d $u ]; then +    URLARG="$URLARG $u" +  else +    URLARG="$URLARG http://$u" +  fi +done + +w3m $OPTS $URLARG | 
