Adding upstream version 0.5.1
This commit is contained in:
9
scripts/.cvsignore
Normal file
9
scripts/.cvsignore
Normal file
@@ -0,0 +1,9 @@
|
||||
dirlist.cgi
|
||||
w3mhelp.cgi
|
||||
w3mmail.cgi
|
||||
w3mhelp-funcdesc.en.pl
|
||||
w3mhelp-funcdesc.ja.pl
|
||||
w3mhelp-funcname.pl
|
||||
w3mhelp-funcdesc-stamp
|
||||
xface2xpm
|
||||
Makefile
|
||||
135
scripts/Makefile.in
Normal file
135
scripts/Makefile.in
Normal file
@@ -0,0 +1,135 @@
|
||||
@SET_MAKE@
|
||||
SHELL=@SHELL@
|
||||
PACKAGE = @PACKAGE@
|
||||
VERSION = @VERSION@
|
||||
DOMAIN = $(PACKAGE)
|
||||
srcidr=@srcdir@
|
||||
top_srcdir=@top_srcdir@
|
||||
VPATH= $(srcdir):.
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
bindir = @bindir@
|
||||
datadir = @datadir@
|
||||
libdir = @libdir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
libexecdir = @libexecdir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
oldincludedir = @oldincludedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
VPATH = $(srcdir):.
|
||||
DESTDIR =
|
||||
|
||||
CGIBIN_DIR = $(libexecdir)/$(PACKAGE)/cgi-bin
|
||||
AUXBIN_DIR = $(libexecdir)/$(PACKAGE)
|
||||
HELP_DIR = @HELP_DIR@
|
||||
RC_DIR = @RC_DIR@
|
||||
ETC_DIR = $(sysconfdir)
|
||||
CONF_DIR = $(sysconfdir)/$(PACKAGE)
|
||||
DOCDIRS = @DOCDIRS@
|
||||
|
||||
AUXBIN_TARGETS = xface2xpm
|
||||
LIB_TARGETS = dirlist.cgi w3mhelp.cgi w3mmail.cgi
|
||||
HELP_TARGETS = w3mhelp-funcname.pl w3mhelp-funcdesc-stamp
|
||||
SUBDIRS = multipart w3mman
|
||||
.PHONY: $(SUBDIRS)
|
||||
|
||||
MKDIR = mkdir -p
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
|
||||
PERL = @PERL@
|
||||
|
||||
all: $(LIB_TARGETS) $(AUXBIN_TARGETS) $(HELP_TARGETS) $(SUBDIRS)
|
||||
|
||||
w3mhelp-funcname.pl: w3mhelp-funcname.pl.in ../funcname.tab $(top_srcdir)/doc/keymap.default $(top_srcdir)/doc/keymap.lynx
|
||||
@echo "generating w3mhelp-funcname.pl..."
|
||||
@echo '%funcname = (' > w3mhelp-funcname.pl
|
||||
@sed -ne "/^[a-zA-Z@]/s/\([a-zA-Z@][a-zA-Z0-9@_]*\)[ ][ ]*\([^ ]*\)/'\1', '\2',/p" < ../funcname.tab >> w3mhelp-funcname.pl
|
||||
@echo ');' >> w3mhelp-funcname.pl
|
||||
@echo '%keyfunc = (' >> w3mhelp-funcname.pl
|
||||
@case "$(KEYBIND_SRC)" in *lynx*) keymap=keymap.lynx;; *) keymap=keymap.default;; esac; \
|
||||
sed -ne "/^keymap/s/^keymap[ ][ ]*\([^ ]*\)[ ][ ]*\([a-zA-Z@][a-zA-Z0-9@_]*\)/'\1', '\2', /p" < $(top_srcdir)/doc/$$keymap >> w3mhelp-funcname.pl
|
||||
@echo ');' >> w3mhelp-funcname.pl
|
||||
@cat $(srcdir)/w3mhelp-funcname.pl.in >> w3mhelp-funcname.pl
|
||||
@echo "done"
|
||||
|
||||
w3mhelp-funcdesc-stamp: $(top_srcdir)/doc/README.func $(top_srcdir)/doc-jp/README.func w3mhelp-funcdesc.en.pl.in w3mhelp-funcdesc.ja.pl.in
|
||||
@echo "generating w3mhelp-funcdesc*.pl..."
|
||||
@for dirlang in $(DOCDIRS); do \
|
||||
dir=`expr "$$dirlang" : "\(.*\):.*"`; \
|
||||
lang=`expr "$$dirlang" : ".*:\(.*\)_.*"`; \
|
||||
echo '%funcdesc = (' > w3mhelp-funcdesc.$$lang.pl; \
|
||||
sed -ne "/^[a-zA-Z@]/s/\([a-zA-Z@][a-zA-Z0-9@_]*\)[ ][ ]*\(.*\)/'\1', '\2',/p" < $(top_srcdir)/$$dir/README.func >> w3mhelp-funcdesc.$$lang.pl; \
|
||||
echo ');' >> w3mhelp-funcdesc.$$lang.pl; \
|
||||
cat $(srcdir)/w3mhelp-funcdesc.$$lang.pl.in >> w3mhelp-funcdesc.$$lang.pl; \
|
||||
done
|
||||
@echo done
|
||||
@touch w3mhelp-funcdesc-stamp
|
||||
|
||||
$(SUBDIRS):
|
||||
for subdir in $(SUBDIRS); \
|
||||
do \
|
||||
(cd $$subdir && $(MAKE)); \
|
||||
done
|
||||
|
||||
install: $(LIB_TARGETS) $(HELP_TARGETS)
|
||||
-$(MKDIR) $(DESTDIR)$(AUXBIN_DIR)
|
||||
-$(MKDIR) $(DESTDIR)$(CGIBIN_DIR)
|
||||
-$(MKDIR) $(DESTDIR)$(HELP_DIR)
|
||||
for file in $(AUXBIN_TARGETS); \
|
||||
do \
|
||||
$(INSTALL_SCRIPT) $$file $(DESTDIR)$(AUXBIN_DIR); \
|
||||
done
|
||||
for file in $(LIB_TARGETS); \
|
||||
do \
|
||||
$(INSTALL_SCRIPT) $$file $(DESTDIR)$(CGIBIN_DIR); \
|
||||
done
|
||||
for file in w3mhelp-*.pl; \
|
||||
do \
|
||||
$(INSTALL_DATA) $$file $(DESTDIR)$(HELP_DIR); \
|
||||
done
|
||||
for subdir in $(SUBDIRS); \
|
||||
do \
|
||||
(cd $$subdir && $(MAKE) install); \
|
||||
done
|
||||
|
||||
uninstall:
|
||||
-for file in $(AUXBIN_TARGETS); \
|
||||
do \
|
||||
rm -f $(AUXBIN_DIR)/$$file; \
|
||||
done
|
||||
-for file in $(LIB_TARGETS); \
|
||||
do \
|
||||
rm -f $(LIB_DIR)/$$file; \
|
||||
done
|
||||
-for file in w3mhelp-*.pl; \
|
||||
do \
|
||||
rm -f $(HELP_DIR)/$$file; \
|
||||
done
|
||||
-for subdir in $(SUBDIRS); \
|
||||
do \
|
||||
(cd $$subdir && $(MAKE) uninstall); \
|
||||
done
|
||||
|
||||
clean:
|
||||
-rm -f $(HELP_TARGETS) w3mhelp-*.pl
|
||||
-for subdir in $(SUBDIRS); \
|
||||
do \
|
||||
(cd $$subdir && $(MAKE) clean); \
|
||||
done
|
||||
|
||||
distclean:
|
||||
-rm -f $(LIB_TARGETS) $(AUXBIN_TARGETS)
|
||||
-for subdir in $(SUBDIRS); \
|
||||
do \
|
||||
(cd $$subdir && $(MAKE) distclean); \
|
||||
done
|
||||
-rm -f Makefile
|
||||
|
||||
21
scripts/bm2menu/README
Normal file
21
scripts/bm2menu/README
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
bm2menu.pl
|
||||
|
||||
ブックマークファイル ~/.w3m/bookmark.html を変換して w3m の
|
||||
ブックマークメニューとして使える様にする。
|
||||
|
||||
使用法
|
||||
|
||||
~/.w3m/bookmark.html を変換して ~/.w3m/menu に追加。
|
||||
|
||||
perl bm2menu.pl ~/.w3m/bookmark.html >> ~/.w3m/menu
|
||||
|
||||
次に、~/.w3m/keymap に
|
||||
|
||||
keymap x MENU Bookmarks
|
||||
|
||||
の様にキーの割り当てを追加します。
|
||||
|
||||
これで、キー `x' でブックマークメニューが開きます。
|
||||
メニューの操作は doc-jp/README.menu を読んでください。
|
||||
|
||||
58
scripts/bm2menu/bm2menu.pl
Normal file
58
scripts/bm2menu/bm2menu.pl
Normal file
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
$PRE_MENU = "";
|
||||
$POST_MENU = <<EOF;
|
||||
nop "----------------------"
|
||||
func "¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÄɲà (a)" ADD_BOOKMARK "aA"
|
||||
EOF
|
||||
# $POST_MENU = <<EOF;
|
||||
# nop "----------------------"
|
||||
# func "Add Bookmark (a)" ADD_BOOKMARK "aA"
|
||||
# EOF
|
||||
|
||||
@section = ();
|
||||
%title = ();
|
||||
%url = ();
|
||||
while(<>) {
|
||||
if (/<h2>(.*)<\/h2>/) {
|
||||
$s = &unquote($1);
|
||||
push(@section, $s);
|
||||
} elsif (/<li><a href=\"(.*)\">(.*)<\/a>/) {
|
||||
$u = &unquote($1);
|
||||
$t = &unquote($2);
|
||||
$url{$s} .= "$u\n";
|
||||
$title{$s} .= "$t\n";
|
||||
}
|
||||
}
|
||||
|
||||
print "menu Bookmarks\n";
|
||||
print $PRE_MENU;
|
||||
foreach(@section) {
|
||||
print " popup\t\"$_\"\t\"$_\"\n";
|
||||
}
|
||||
print $POST_MENU;
|
||||
print "end\n";
|
||||
|
||||
foreach(@section) {
|
||||
print "\n";
|
||||
print "menu \"$_\"\n";
|
||||
@ts = split("\n", $title{$_});
|
||||
@us = split("\n", $url{$_});
|
||||
while(@ts) {
|
||||
$t = shift @ts;
|
||||
$u = shift @us;
|
||||
print " func\t\"$t\"\tGOTO\t\"\"\t\"$u\"\n";
|
||||
}
|
||||
print "end\n";
|
||||
}
|
||||
|
||||
sub unquote {
|
||||
local($_) = @_;
|
||||
|
||||
s/\</\</g;
|
||||
s/\>/\>/g;
|
||||
s/\ / /g;
|
||||
s/\&/\&/g;
|
||||
|
||||
return $_;
|
||||
}
|
||||
536
scripts/dirlist.cgi.in
Executable file
536
scripts/dirlist.cgi.in
Executable file
@@ -0,0 +1,536 @@
|
||||
#!@PERL@
|
||||
#
|
||||
# Directory list CGI by Hironori Sakamoto (hsaka@mth.biglobe.ne.jp)
|
||||
#
|
||||
|
||||
if ( $^O =~ /^(ms)?(dos|win(32|nt)?)/i ) {
|
||||
$WIN32 = 1;
|
||||
$CYGPATH = 1;
|
||||
}
|
||||
elsif ( $^O =~ /cygwin|os2/i ) {
|
||||
$WIN32 = 1;
|
||||
$CYGPATH = 0;
|
||||
}
|
||||
else {
|
||||
$WIN32 = 0;
|
||||
$CYGPATH = 0;
|
||||
}
|
||||
$RC_DIR = '@RC_DIR@';
|
||||
$RC_DIR =~ s@^~/@$ENV{'HOME'}/@;
|
||||
if ($CYGPATH) {
|
||||
$RC_DIR = &cygwin_pathconv("$RC_DIR");
|
||||
}
|
||||
$CONFIG = "$RC_DIR/dirlist";
|
||||
$CGI = $ENV{'SCRIPT_NAME'} || $0;
|
||||
$CGI = "file://" . &file_encode("$CGI");
|
||||
|
||||
$AFMT = '<a href="%s"><nobr>%s</nobr></a>';
|
||||
$NOW = time();
|
||||
|
||||
@OPT = &init_option($CONFIG);
|
||||
|
||||
$query = $ENV{'QUERY_STRING'};
|
||||
$dir = '';
|
||||
$cmd = '';
|
||||
$cookie = '';
|
||||
$local_cookie = '';
|
||||
foreach(split(/\&/, $query)) {
|
||||
if (s/^dir=//) {
|
||||
$dir = &form_decode($_);
|
||||
}
|
||||
}
|
||||
$body = undef;
|
||||
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
|
||||
sysread(STDIN, $body, $ENV{'CONTENT_LENGTH'});
|
||||
foreach(split(/\&/, $body)) {
|
||||
if (s/^dir=//) {
|
||||
$dir = &form_decode($_);
|
||||
} elsif (s/^opt(\d+)=//) {
|
||||
$OPT[$1] = $_;
|
||||
} elsif (s/^cmd=//) {
|
||||
$cmd = $_;
|
||||
} elsif (s/^cookie=//) {
|
||||
$cookie = &form_decode($_);
|
||||
}
|
||||
}
|
||||
}
|
||||
$cookie_file = $ENV{'LOCAL_COOKIE_FILE'};
|
||||
if (-f $cookie_file) {
|
||||
open(F, "< $cookie_file");
|
||||
$local_cookie = <F>;
|
||||
close(F);
|
||||
}
|
||||
if ($local_cookie eq '' || (defined($body) && $cookie ne $local_cookie)) {
|
||||
print <<EOF;
|
||||
Content-Type: text/plain
|
||||
|
||||
Local cookie doesn't match: It may be an illegal execution
|
||||
EOF
|
||||
exit(1);
|
||||
}
|
||||
$local_cookie = &html_quote($local_cookie);
|
||||
if ($dir !~ m@/$@) {
|
||||
$dir .= '/';
|
||||
}
|
||||
if ($dir =~ m@^/@ && $CYGPATH) {
|
||||
$dir = &cygwin_pathconv("$dir");
|
||||
}
|
||||
$ROOT = '';
|
||||
if ($WIN32) {
|
||||
if (($dir =~ s@^//[^/]+@@) || ($dir =~ s@^[a-z]:@@i)) {
|
||||
$ROOT = $&;
|
||||
}
|
||||
if ($CYGPATH) {
|
||||
$ROOT = &cygwin_pathconv("$ROOT");
|
||||
}
|
||||
}
|
||||
$dir = &cleanup($dir);
|
||||
|
||||
$TYPE = $OPT[$OPT_TYPE];
|
||||
$FORMAT = $OPT[$OPT_FORMAT];
|
||||
$SORT = $OPT[$OPT_SORT];
|
||||
if ($cmd) {
|
||||
&update_option($CONFIG);
|
||||
}
|
||||
|
||||
$qdir = "$ROOT" . &html_quote("$dir");
|
||||
$edir = "$ROOT" . &file_encode("$dir");
|
||||
if (! opendir(DIR, "$ROOT$dir")) {
|
||||
print <<EOF;
|
||||
Content-Type: text/html
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>Directory list of $qdir</title>
|
||||
</head>
|
||||
<body>
|
||||
<b>$qdir</b>: $! !
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
||||
exit 1;
|
||||
}
|
||||
|
||||
print <<EOF;
|
||||
Content-Type: text/html
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>Directory list of $qdir</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Directory list of $qdir</h1>
|
||||
EOF
|
||||
&print_form($qdir, @OPT);
|
||||
print <<EOF;
|
||||
<hr>
|
||||
EOF
|
||||
$dir =~ s@/$@@;
|
||||
@sdirs = split('/', $dir);
|
||||
$_ = $sdirs[0];
|
||||
if ($_ eq '') {
|
||||
$_ = '/';
|
||||
}
|
||||
if ($TYPE eq $TYPE_TREE) {
|
||||
print <<EOF;
|
||||
<table hborder width="640">
|
||||
<tr valign=top><td width="160">
|
||||
<pre>
|
||||
EOF
|
||||
$q = "$ROOT". &html_quote("$_");
|
||||
$e = "$ROOT" . &file_encode("$_");
|
||||
if ($dir =~ m@^$@) {
|
||||
$n = "\" name=\"current";
|
||||
} else {
|
||||
$n = '';
|
||||
}
|
||||
printf("$AFMT\n", "$e$n", "<b>$q</b>");
|
||||
$N = 0;
|
||||
$SKIPLINE = "";
|
||||
|
||||
&left_dir('', @sdirs);
|
||||
|
||||
print <<EOF;
|
||||
</pre>
|
||||
</td><td width="400">
|
||||
<pre>$SKIPLINE
|
||||
EOF
|
||||
} else {
|
||||
print <<EOF;
|
||||
<pre>
|
||||
EOF
|
||||
}
|
||||
|
||||
&right_dir($dir);
|
||||
|
||||
if ($TYPE eq $TYPE_TREE) {
|
||||
print <<EOF;
|
||||
</pre>
|
||||
</td></tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
||||
} else {
|
||||
print <<EOF;
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
||||
}
|
||||
|
||||
sub left_dir {
|
||||
local($pre, $dir, @sdirs) = @_;
|
||||
local($ok) = (@sdirs == 0);
|
||||
local(@cdirs) = ();
|
||||
local($_, $dir0, $d, $qdir, $q, $edir, $e);
|
||||
|
||||
$dir0 = "$dir/";
|
||||
$dir = "$dir0";
|
||||
opendir(DIR, "$ROOT$dir") || return;
|
||||
|
||||
foreach(sort readdir(DIR)) {
|
||||
-d "$ROOT$dir$_" || next;
|
||||
/^\.$/ && next;
|
||||
/^\.\.$/ && next;
|
||||
push(@cdirs, $_);
|
||||
}
|
||||
closedir(DIR);
|
||||
|
||||
$qdir = "$ROOT" . &html_quote($dir);
|
||||
$edir = "$ROOT" . &file_encode($dir);
|
||||
while(@cdirs) {
|
||||
$_ = shift @cdirs;
|
||||
$q = &html_quote($_);
|
||||
$e = &file_encode($_);
|
||||
$N++;
|
||||
if (!$ok && $_ eq $sdirs[0]) {
|
||||
$d = $dir0 . shift @sdirs;
|
||||
if (!@sdirs) {
|
||||
$n = "\" name=\"current";
|
||||
$SKIPLINE = "\n" x $N;
|
||||
} else {
|
||||
$n = '';
|
||||
}
|
||||
printf("${pre}o-$AFMT\n", "$edir$e$n", "<b>$q</b>");
|
||||
&left_dir(@cdirs ? "$pre| " : "$pre ", $d, @sdirs);
|
||||
$ok = 1;
|
||||
} else {
|
||||
printf("${pre}+-$AFMT\n", "$edir$e", $q);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub right_dir {
|
||||
local($dir) = @_;
|
||||
local(@list);
|
||||
local($_, $qdir, $q, $edir, $e, $f, $max, @d, $type, $u, $g);
|
||||
local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
|
||||
$atime,$mtime,$ctime,$blksize,$blocks);
|
||||
local(%sizes, %ctimes, %prints);
|
||||
|
||||
$dir = "$dir/";
|
||||
opendir(DIR, "$ROOT$dir") || return;
|
||||
|
||||
$qdir = "$ROOT" . &html_quote($dir);
|
||||
$edir = "$ROOT" . &file_encode($dir);
|
||||
if ($TYPE eq $TYPE_TREE) {
|
||||
print "<b>$qdir</b>\n";
|
||||
}
|
||||
@list = ();
|
||||
$max = 0;
|
||||
foreach(readdir(DIR)) {
|
||||
/^\.$/ && next;
|
||||
# if ($TYPE eq $TYPE_TREE) {
|
||||
# /^\.\.$/ && next;
|
||||
# }
|
||||
$f = "$ROOT$dir$_";
|
||||
(($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
|
||||
$atime,$mtime,$ctime,$blksize,$blocks) = lstat($f)) || next;
|
||||
push(@list, $_);
|
||||
$sizes{$_} = $size;
|
||||
$ctimes{$_} = $ctime;
|
||||
|
||||
if ($FORMAT eq $FORMAT_COLUMN) {
|
||||
if (length($_) > $max) {
|
||||
$max = length($_);
|
||||
}
|
||||
next;
|
||||
}
|
||||
$type = &utype($mode);
|
||||
if ($FORMAT eq $FORMAT_SHORT) {
|
||||
$prints{$_} = sprintf("%-6s ", "[$type]");
|
||||
next;
|
||||
}
|
||||
if ($type =~ /^[CB]/) {
|
||||
$size = sprintf("%3u, %3u", ($rdev >> 8) & 0xff, $rdev & 0xffff00ff);
|
||||
}
|
||||
if ($FORMAT eq $FORMAT_LONG) {
|
||||
$u = $USER{$uid} || ($USER{$uid} = getpwuid($uid) || $uid);
|
||||
$g = $GROUP{$gid} || ($GROUP{$gid} = getgrgid($gid) || $gid);
|
||||
$prints{$_} = sprintf( "%s %-8s %-8s %8s %s ",
|
||||
&umode($mode), $u, $g, $size, &utime($ctime));
|
||||
# } elsif ($FORMAT eq $FORMAT_STANDARD) {
|
||||
} else {
|
||||
$prints{$_} = sprintf("%-6s %8s %s ", "[$type]", $size, &utime($ctime));
|
||||
}
|
||||
}
|
||||
closedir(DIR);
|
||||
if ($SORT eq $SORT_SIZE) {
|
||||
@list = sort { $sizes{$b} <=> $sizes{$a} || $a cmp $b } @list;
|
||||
} elsif ($SORT eq $SORT_TIME) {
|
||||
@list = sort { $ctimes{$b} <=> $ctimes{$a} || $a cmp $b } @list;
|
||||
} else {
|
||||
@list = sort @list;
|
||||
}
|
||||
if ($FORMAT eq $FORMAT_COLUMN) {
|
||||
local($COLS, $l, $nr, $n);
|
||||
if ($TYPE eq $TYPE_TREE) {
|
||||
$COLS = 60;
|
||||
} else {
|
||||
$COLS = 80;
|
||||
}
|
||||
$l = int($COLS / ($max + 2)) || 1;
|
||||
$nr = int($#list / $l + 1);
|
||||
$n = 0;
|
||||
print "<table>\n<tr valign=top>";
|
||||
foreach(@list) {
|
||||
$f = "$ROOT$dir$_";
|
||||
$q = &html_quote($_);
|
||||
$e = &file_encode($_);
|
||||
if ($n % $nr == 0) {
|
||||
print "<td>";
|
||||
}
|
||||
if (-d $f) {
|
||||
printf($AFMT, "$edir$e", "$q/");
|
||||
} else {
|
||||
printf($AFMT, "$edir$e", $q);
|
||||
}
|
||||
$n++;
|
||||
if ($n % $nr == 0) {
|
||||
print "</td>\n";
|
||||
} else {
|
||||
print "<br>\n";
|
||||
}
|
||||
}
|
||||
print "</tr></table>\n";
|
||||
return;
|
||||
}
|
||||
foreach(@list) {
|
||||
$f = "$ROOT$dir$_";
|
||||
$q = &html_quote($_);
|
||||
$e = &file_encode($_);
|
||||
print $prints{$_};
|
||||
if (-d $f) {
|
||||
printf($AFMT, "$edir$e", "$q/");
|
||||
} else {
|
||||
printf($AFMT, "$edir$e", $q);
|
||||
}
|
||||
if (-l $f) {
|
||||
print " -> ", &html_quote(readlink($f));
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub init_option {
|
||||
local($config) = @_;
|
||||
$OPT_TYPE = 0;
|
||||
$OPT_FORMAT = 1;
|
||||
$OPT_SORT = 2;
|
||||
$TYPE_TREE = 't';
|
||||
$TYPE_STANDARD = 'd';
|
||||
$FORMAT_SHORT = 's';
|
||||
$FORMAT_STANDARD = 'd';
|
||||
$FORMAT_LONG = 'l';
|
||||
$FORMAT_COLUMN = 'c';
|
||||
$SORT_NAME = 'n';
|
||||
$SORT_SIZE = 's';
|
||||
$SORT_TIME = 't';
|
||||
local(@opt) = ($TYPE_TREE, $FORMAT_STANDARD, $SORT_NAME);
|
||||
local($_);
|
||||
|
||||
open(CONFIG, "< $config") || return @opt;
|
||||
while(<CONFIG>) {
|
||||
chop;
|
||||
s/^\s+//;
|
||||
tr/A-Z/a-z/;
|
||||
if (/^type\s+(\S)/i) {
|
||||
$opt[$OPT_TYPE] = $1;
|
||||
} elsif (/^format\s+(\S)/i) {
|
||||
$opt[$OPT_FORMAT] = $1
|
||||
} elsif (/^sort\s+(\S)/i) {
|
||||
$opt[$OPT_SORT] = $1;
|
||||
}
|
||||
}
|
||||
close(CONFIG);
|
||||
return @opt;
|
||||
}
|
||||
|
||||
sub update_option {
|
||||
local($config) = @_;
|
||||
|
||||
open(CONFIG, "> $config") || return;
|
||||
print CONFIG <<EOF;
|
||||
type $TYPE
|
||||
format $FORMAT
|
||||
sort $SORT
|
||||
EOF
|
||||
close(CONFIG);
|
||||
}
|
||||
|
||||
sub print_form {
|
||||
local($d, @OPT) = @_;
|
||||
local(@disc) = ('Type', 'Format', 'Sort');
|
||||
local(@val) = (
|
||||
"('t', 'd')",
|
||||
"('s', 'd', 'c')",
|
||||
"('n', 's', 't')",
|
||||
);
|
||||
local(@opt) = (
|
||||
"('Tree', 'Standard')",
|
||||
"('Short', 'Standard', 'Column')",
|
||||
"('By Name', 'By Size', 'By Time')"
|
||||
);
|
||||
local($_, @vs, @os, $v, $o);
|
||||
|
||||
print <<EOF;
|
||||
<form method=post action=\"$CGI#current\">
|
||||
<center>
|
||||
<table cellpadding=0>
|
||||
<tr valign=top>
|
||||
EOF
|
||||
foreach(0 .. 2) {
|
||||
print "<td align> $disc[$_]</td>\n";
|
||||
}
|
||||
print "</tr><tr>\n";
|
||||
foreach(0 .. 2) {
|
||||
print "<td><select name=opt$_>\n";
|
||||
eval "\@vs = $val[$_]";
|
||||
eval "\@os = $opt[$_]";
|
||||
foreach $v (@vs) {
|
||||
$o = shift(@os);
|
||||
if ($v eq $OPT[$_]) {
|
||||
print "<option value=$v selected>$o\n";
|
||||
} else {
|
||||
print "<option value=$v>$o\n";
|
||||
}
|
||||
}
|
||||
print "</select></td>\n";
|
||||
}
|
||||
print <<EOF;
|
||||
<td><input type=submit name=cmd value="Update"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</center>
|
||||
<input type=hidden name=dir value="$d">
|
||||
<input type=hidden name=cookie value="$local_cookie">
|
||||
</form>
|
||||
EOF
|
||||
}
|
||||
|
||||
sub html_quote {
|
||||
local($_) = @_;
|
||||
local(%QUOTE) = (
|
||||
'<', '<',
|
||||
'>', '>',
|
||||
'&', '&',
|
||||
'"', '"',
|
||||
);
|
||||
s/[<>&"]/$QUOTE{$&}/g;
|
||||
return $_;
|
||||
}
|
||||
sub file_encode {
|
||||
local($_) = @_;
|
||||
s/[\000-\040\+:#?&%<>"\177-\377]/sprintf('%%%02X', unpack('C', $&))/eg;
|
||||
return $_;
|
||||
}
|
||||
|
||||
sub form_decode {
|
||||
local($_) = @_;
|
||||
s/\+/ /g;
|
||||
s/%([\da-f][\da-f])/pack('C', hex($1))/egi;
|
||||
return $_;
|
||||
}
|
||||
|
||||
sub cleanup {
|
||||
local($_) = @_;
|
||||
|
||||
s@//+@/@g;
|
||||
s@/\./@/@g;
|
||||
while(m@/\.\./@) {
|
||||
s@^/(\.\./)+@/@;
|
||||
s@/[^/]+/\.\./@/@;
|
||||
}
|
||||
return $_;
|
||||
}
|
||||
|
||||
sub utype {
|
||||
local($_) = @_;
|
||||
local(%T) = (
|
||||
0010000, 'PIPE',
|
||||
0020000, 'CHR',
|
||||
0040000, 'DIR',
|
||||
0060000, 'BLK',
|
||||
0100000, 'FILE',
|
||||
0120000, 'LINK',
|
||||
0140000, 'SOCK',
|
||||
);
|
||||
return $T{($_ & 0170000)} || 'FILE';
|
||||
}
|
||||
|
||||
sub umode {
|
||||
local($_) = @_;
|
||||
local(%T) = (
|
||||
0010000, 'p',
|
||||
0020000, 'c',
|
||||
0040000, 'd',
|
||||
0060000, 'b',
|
||||
0100000, '-',
|
||||
0120000, 'l',
|
||||
0140000, 's',
|
||||
);
|
||||
|
||||
return ($T{($_ & 0170000)} || '-')
|
||||
. (($_ & 00400) ? 'r' : '-')
|
||||
. (($_ & 00200) ? 'w' : '-')
|
||||
. (($_ & 04000) ? 's' :
|
||||
(($_ & 00100) ? 'x' : '-'))
|
||||
. (($_ & 00040) ? 'r' : '-')
|
||||
. (($_ & 00020) ? 'w' : '-')
|
||||
. (($_ & 02000) ? 's' :
|
||||
(($_ & 00010) ? 'x' : '-'))
|
||||
. (($_ & 00004) ? 'r' : '-')
|
||||
. (($_ & 00002) ? 'w' : '-')
|
||||
. (($_ & 01000) ? 't' :
|
||||
(($_ & 00001) ? 'x' : '-'));
|
||||
}
|
||||
|
||||
sub utime {
|
||||
local($_) = @_;
|
||||
local(@MON) = (
|
||||
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
|
||||
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
|
||||
);
|
||||
local($sec,$min,$hour,$mday,$mon,
|
||||
$year,$wday,$yday,$isdst) = localtime($_);
|
||||
|
||||
if ($_ > $NOW - 182*24*60*60 && $_ < $NOW + 183*24*60*60) {
|
||||
return sprintf("%3s %2d %.2d:%.2d", $MON[$mon], $mday, $hour, $min);
|
||||
} else {
|
||||
return sprintf("%3s %2d %5d", $MON[$mon], $mday, 1900+$year);
|
||||
}
|
||||
}
|
||||
|
||||
sub cygwin_pathconv {
|
||||
local($_) = @_;
|
||||
local(*CYGPATH);
|
||||
|
||||
open(CYGPATH, '-|') || exec('cygpath', '-w', $_);
|
||||
$_ = <CYGPATH>;
|
||||
close(CYGPATH);
|
||||
s/\r?\n$//;
|
||||
s!\\!/!g;
|
||||
s!/$!!;
|
||||
return $_;
|
||||
}
|
||||
2
scripts/multipart/.cvsignore
Normal file
2
scripts/multipart/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
multipart.cgi
|
||||
Makefile
|
||||
75
scripts/multipart/Makefile.in
Normal file
75
scripts/multipart/Makefile.in
Normal file
@@ -0,0 +1,75 @@
|
||||
@SET_MAKE@
|
||||
SHELL=@SHELL@
|
||||
PACKAGE = @PACKAGE@
|
||||
VERSION = @VERSION@
|
||||
DOMAIN = $(PACKAGE)
|
||||
srcidr=@srcdir@
|
||||
top_srcdir=@top_srcdir@
|
||||
VPATH= $(srcdir):.
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
bindir = @bindir@
|
||||
datadir = @datadir@
|
||||
libdir = @libdir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
libexecdir = @libexecdir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
oldincludedir = @oldincludedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
VPATH = $(top_srcdir):.
|
||||
DESTDIR =
|
||||
|
||||
CGIBIN_DIR = $(libexecdir)/$(PACKAGE)/cgi-bin
|
||||
AUXBIN_DIR = $(libexecdir)/$(PACKAGE)
|
||||
HELP_DIR = @HELP_DIR@
|
||||
RC_DIR = @RC_DIR@
|
||||
ETC_DIR = $(sysconfdir)
|
||||
CONF_DIR = $(sysconfdir)/$(PACKAGE)
|
||||
|
||||
LIB_TARGETS = multipart.cgi
|
||||
|
||||
MKDIR = mkdir -p
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
|
||||
PERL = @PERL@
|
||||
NKF = @NKF@
|
||||
|
||||
all: $(LIB_TARGETS)
|
||||
|
||||
# do nothing
|
||||
$(LIB_TARGETS):
|
||||
|
||||
install: $(LIB_TARGETS)
|
||||
-$(MKDIR) $(DESTDIR)$(CGIBIN_DIR)
|
||||
for file in $(LIB_TARGETS); \
|
||||
do \
|
||||
$(INSTALL_SCRIPT) $$file $(DESTDIR)$(CGIBIN_DIR); \
|
||||
done
|
||||
|
||||
uninstall:
|
||||
-for file in $(LIB_TARGETS); \
|
||||
do \
|
||||
rm -f $(CGIBIN_DIR)/$$file; \
|
||||
done
|
||||
|
||||
clean:
|
||||
|
||||
distclean:
|
||||
-rm -f $(LIB_TARGETS)
|
||||
-rm -f Makefile
|
||||
|
||||
dist: all
|
||||
@-rm -fr $(distdir)/multipart
|
||||
$(MKDIR) $(distdir)/multipart
|
||||
cp Makefile README multipart.cgi.in $(distdir)/multipart
|
||||
( cd $(distdir); tar -cf - multipart | GZIP='' gzip ) \
|
||||
> $(distdir)/multipart.tar.gz
|
||||
-rm -fr $(distdir)/multipart
|
||||
|
||||
24
scripts/multipart/README
Normal file
24
scripts/multipart/README
Normal file
@@ -0,0 +1,24 @@
|
||||
|
||||
Content-Type: multipart/* を扱う local-CGI
|
||||
|
||||
Content-Type: multipart/* なファイルを扱うための local-CGI です。
|
||||
主に mailx などでメールを PAGER="w3m -m" で読む場合を想定しています。
|
||||
|
||||
インストール
|
||||
|
||||
* make install
|
||||
必要なら PERL, NKF, LIBDIR を設定してください。
|
||||
|
||||
* mailcap を ~/.w3m/mailcap にマージ
|
||||
multipart.cgi のパスに注意
|
||||
|
||||
* w3m の Option Setting Panel で、
|
||||
『保存時に Content-Transfer-Encoding をデコードする』を ON
|
||||
添付ファイルの保存時に便利です。
|
||||
|
||||
必要なもの
|
||||
|
||||
* NKF モジュールまたは nkf
|
||||
文字コード変換や MIME ヘッダのデコードにを使ってます。
|
||||
気にいらなければ変えてください。
|
||||
|
||||
1
scripts/multipart/mailcap
Normal file
1
scripts/multipart/mailcap
Normal file
@@ -0,0 +1 @@
|
||||
multipart/*; /usr/local/lib/w3m/multipart.cgi %s %{boundary}; htmloutput
|
||||
313
scripts/multipart/multipart.cgi.in
Normal file
313
scripts/multipart/multipart.cgi.in
Normal file
@@ -0,0 +1,313 @@
|
||||
#!@PERL@
|
||||
|
||||
eval "use NKF;";
|
||||
if (! $@) {
|
||||
$use_NKF = 1;
|
||||
$CONV = "-e";
|
||||
$MIME_DECODE = "-m -e";
|
||||
} else {
|
||||
$use_NKF = 0;
|
||||
# $CONV = "w3m -dump -e";
|
||||
$CONV = "@NKF@ -e";
|
||||
$MIME_DECODE = "@NKF@ -m -e";
|
||||
}
|
||||
$MIME_TYPE = "$ENV{'HOME'}/.mime.types";
|
||||
|
||||
$SCRIPT_NAME = $ENV{'SCRIPT_NAME'} || $0;
|
||||
$CGI = "file://$SCRIPT_NAME";
|
||||
|
||||
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
|
||||
sysread(STDIN, $query, $ENV{'CONTENT_LENGTH'});
|
||||
} elsif (defined($ENV{'QUERY_STRING'})) {
|
||||
$query = $ENV{'QUERY_STRING'};
|
||||
}
|
||||
if (defined($query)) {
|
||||
for (split('&', $query)) {
|
||||
s/^([^=]*)=//;
|
||||
$v{$1} = $_;
|
||||
}
|
||||
$file = &form_decode($v{'file'});
|
||||
$boundary = &form_decode($v{'boundary'});
|
||||
} else {
|
||||
$file = $ARGV[0];
|
||||
if (@ARGV >= 2) {
|
||||
$boundary = $ARGV[1];
|
||||
}
|
||||
}
|
||||
(-f $file) || exit(1);
|
||||
open(F, "< $file") || exit(1);
|
||||
$end = 0;
|
||||
$mbody = '';
|
||||
if (defined($boundary)) {
|
||||
while(<F>) {
|
||||
s/\r?\n$//;
|
||||
($_ eq "--$boundary") && last;
|
||||
($_ eq "--$boundary--") && ($end = 1, last);
|
||||
$mbody .= "$_\n";
|
||||
}
|
||||
} else {
|
||||
while(<F>) {
|
||||
s/\r?\n$//;
|
||||
if (s/^\-\-//) {
|
||||
$boundary = $_;
|
||||
last;
|
||||
}
|
||||
$mbody .= "$_\n";
|
||||
}
|
||||
}
|
||||
|
||||
if (defined($v{'count'})) {
|
||||
$count = 0;
|
||||
while($count < $v{'count'}) {
|
||||
while(<F>) {
|
||||
s/\r?\n$//;
|
||||
($_ eq "--$boundary") && last;
|
||||
}
|
||||
eof(F) && exit;
|
||||
$count++;
|
||||
}
|
||||
|
||||
%header = ();
|
||||
$hbody = '';
|
||||
while(<F>) {
|
||||
/^\s*$/ && last;
|
||||
$x = $_;
|
||||
s/\r?\n$//;
|
||||
if (/=\?/) {
|
||||
$_ = &decode($_, $MIME_DECODE);
|
||||
}
|
||||
if (s/^(\S+)\s*:\s*//) {
|
||||
$h = $&;
|
||||
if ($h =~ /^w3m-control/i) {
|
||||
$h = "WARNING: $h";
|
||||
}
|
||||
$hbody .= "$h$_\n";
|
||||
$p = $1;
|
||||
$p =~ tr/A-Z/a-z/;
|
||||
$header{$p} = $_;
|
||||
} elsif (s/^\s+//) {
|
||||
chop $hbody;
|
||||
$hbody .= "$_\n";
|
||||
$header{$p} .= $_;
|
||||
}
|
||||
}
|
||||
$type = $header{"content-type"};
|
||||
$dispos = $header{"content-disposition"};
|
||||
if ($type =~ /application\/octet-stream/) {
|
||||
if ($type =~ /type\=gzip/) {
|
||||
print "Content-Encoding: x-gzip\n";
|
||||
}
|
||||
if ($type =~ /name=\"?([^\"]+)\"?/ ||
|
||||
$dispos =~ /filename=\"?([^\"]+)\"?/) {
|
||||
$type = &guess_type($1);
|
||||
if ($type) {
|
||||
print "Content-Type: $type; name=\"$1\"\n";
|
||||
} else {
|
||||
print "Content-Type: text/plain; name=\"$1\"\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
print $hbody;
|
||||
print "\n";
|
||||
while(<F>) {
|
||||
$x = $_;
|
||||
s/\r?\n$//;
|
||||
($_ eq "--$boundary") && last;
|
||||
if ($_ eq "--$boundary--") {
|
||||
last;
|
||||
}
|
||||
print $x;
|
||||
}
|
||||
close(F);
|
||||
exit;
|
||||
}
|
||||
|
||||
$qcgi = &html_quote($CGI);
|
||||
$qfile = &html_quote($file);
|
||||
$qboundary = &html_quote($boundary);
|
||||
|
||||
if ($mbody =~ /\S/) {
|
||||
$_ = $mbody;
|
||||
s/\&/\&/g;
|
||||
s/\</\</g;
|
||||
s/\>/\>/g;
|
||||
print "<pre>\n";
|
||||
print $_;
|
||||
print "</pre>\n";
|
||||
}
|
||||
|
||||
$count = 0;
|
||||
while(! $end) {
|
||||
%header = ();
|
||||
$hbody = '';
|
||||
while(<F>) {
|
||||
/^\s*$/ && last;
|
||||
s/\r?\n$//;
|
||||
if (/=\?/) {
|
||||
$_ = &decode($_, $MIME_DECODE);
|
||||
}
|
||||
if (s/^(\S+)\s*:\s*//) {
|
||||
$hbody .= "$&$_\n";
|
||||
$p = $1;
|
||||
$p =~ tr/A-Z/a-z/;
|
||||
$header{$p} = $_;
|
||||
} elsif (s/^\s+//) {
|
||||
chop $hbody;
|
||||
$hbody .= "$_\n";
|
||||
$header{$p} .= $_;
|
||||
}
|
||||
}
|
||||
$type = $header{"content-type"};
|
||||
$dispos = $header{"content-disposition"};
|
||||
$plain = 0;
|
||||
$image = 0;
|
||||
if (! $dispos || $dispos =~ /^inline/i) {
|
||||
if (! $type || $type =~ /^text\/plain/i) {
|
||||
$plain = 1;
|
||||
} elsif ($type =~ /^image\//i) {
|
||||
$image = 1;
|
||||
}
|
||||
}
|
||||
$body = '';
|
||||
while(<F>) {
|
||||
s/\r?\n$//;
|
||||
($_ eq "--$boundary") && last;
|
||||
if ($_ eq "--$boundary--") {
|
||||
$end = 1;
|
||||
last;
|
||||
}
|
||||
if ($plain) {
|
||||
$body .= "$_\n";
|
||||
}
|
||||
}
|
||||
$| = 1;
|
||||
print "<hr>\n";
|
||||
{
|
||||
$_ = $hbody;
|
||||
s/\&/\&/g;
|
||||
s/\</\</g;
|
||||
s/\>/\>/g;
|
||||
print "<pre>\n";
|
||||
print $_;
|
||||
print "</pre>\n";
|
||||
if ($type =~ /name=\"?([^\"]+)\"?/ ||
|
||||
$dispos =~ /filename=\"?([^\"]+)\"?/) {
|
||||
$name = $1;
|
||||
} else {
|
||||
$name = "Content";
|
||||
}
|
||||
print "<form action=\"$qcgi\">\n";
|
||||
print "<input type=hidden name=file value=\"$qfile\">\n";
|
||||
print "<input type=hidden name=boundary value=\"$qboundary\">\n";
|
||||
print "<input type=hidden name=count value=\"$count\">\n";
|
||||
if ($image) {
|
||||
print "<input type=image name=submit src=\"$qcgi?file=",
|
||||
&html_quote(&form_encode($file)),
|
||||
"&boundary=",
|
||||
&html_quote(&form_encode($boundary)),
|
||||
"&count=$count\" alt=\"",
|
||||
&html_quote($name), "\">\n";
|
||||
} else {
|
||||
print "<input type=submit name=submit value=\"",
|
||||
&html_quote($name), "\">\n";
|
||||
}
|
||||
print "</form>\n"
|
||||
}
|
||||
if ($plain) {
|
||||
$body = &decode($body, $CONV);
|
||||
$_ = $body;
|
||||
s/\&/\&/g;
|
||||
s/\</\</g;
|
||||
s/\>/\>/g;
|
||||
print "<pre>\n\n";
|
||||
print $_;
|
||||
print "</pre>\n";
|
||||
}
|
||||
eof(F) && last;
|
||||
$count++;
|
||||
}
|
||||
close(F);
|
||||
|
||||
sub decode {
|
||||
if ($use_NKF) {
|
||||
local($body, $opt) = @_;
|
||||
return nkf($opt, $body);
|
||||
}
|
||||
local($body, @cmd) = @_;
|
||||
local($_);
|
||||
|
||||
$| = 1;
|
||||
pipe(R, W2);
|
||||
pipe(R2, W);
|
||||
if (! fork()) {
|
||||
close(F);
|
||||
close(R);
|
||||
close(W);
|
||||
open(STDIN, "<&R2");
|
||||
open(STDOUT, ">&W2");
|
||||
exec @cmd;
|
||||
die;
|
||||
}
|
||||
close(R2);
|
||||
close(W2);
|
||||
print W $body;
|
||||
close(W);
|
||||
$body = '';
|
||||
while(<R>) {
|
||||
$body .= $_;
|
||||
}
|
||||
close(R);
|
||||
return $body;
|
||||
}
|
||||
|
||||
sub html_quote {
|
||||
local($_) = @_;
|
||||
local(%QUOTE) = (
|
||||
'<', '<',
|
||||
'>', '>',
|
||||
'&', '&',
|
||||
'"', '"',
|
||||
);
|
||||
s/[<>&"]/$QUOTE{$&}/g;
|
||||
return $_;
|
||||
}
|
||||
|
||||
sub form_decode {
|
||||
local($_) = @_;
|
||||
s/\+/ /g;
|
||||
s/%([\da-f][\da-f])/pack('c', hex($1))/egi;
|
||||
return $_;
|
||||
}
|
||||
|
||||
sub form_encode {
|
||||
local($_) = @_;
|
||||
s/[\000-\040\+:#?&%<>"\177-\377]/sprintf('%%%02X', unpack('C', $&))/eg;
|
||||
return $_;
|
||||
}
|
||||
|
||||
sub guess_type {
|
||||
local($_) = @_;
|
||||
|
||||
/\.(\w+)$/ || return "";
|
||||
$_ = $1;
|
||||
tr/A-Z/a-z/;
|
||||
%mime_type = &load_mime_type($MIME_TYPE);
|
||||
$mime_type{$_};
|
||||
}
|
||||
|
||||
sub load_mime_type {
|
||||
local($file) = @_;
|
||||
local(%m, $a, @b, $_);
|
||||
|
||||
open(M, "< $file") || return ();
|
||||
while(<M>) {
|
||||
/^#/ && next;
|
||||
chop;
|
||||
(($a, @b) = split(" ")) >= 2 || next;
|
||||
for(@b) {
|
||||
$m{$_} = $a;
|
||||
}
|
||||
}
|
||||
close(M);
|
||||
return %m;
|
||||
}
|
||||
48
scripts/w3mhelp-funcdesc.en.pl.in
Normal file
48
scripts/w3mhelp-funcdesc.en.pl.in
Normal file
@@ -0,0 +1,48 @@
|
||||
# charset
|
||||
$charset = 'US-ASCII';
|
||||
|
||||
# Buffer selection mode
|
||||
|
||||
%buf_funcdesc = (
|
||||
'BUF:PREV', 'Select previous buffer',
|
||||
'BUF:NEXT', 'Select next buffer',
|
||||
'BUF:DELETE', 'Delete current buffer',
|
||||
'BUF:GO', 'Go to the selected buffer',
|
||||
);
|
||||
|
||||
%lineedit_funcdesc = (
|
||||
'LINEEDIT:FORWARD', 'Move cursor forward',
|
||||
'LINEEDIT:BACK', 'Move cursor backward',
|
||||
'LINEEDIT:BS', 'Delete previous character',
|
||||
'LINEEDIT:DEL', 'Delete current character',
|
||||
'LINEEDIT:KILL_AFTER', 'Kill everything after cursor',
|
||||
'LINEEDIT:KILL_BEFORE', 'Kill everything before cursor',
|
||||
'LINEEDIT:TOP', 'Move to the top of line',
|
||||
'LINEEDIT:BOTTOM', 'Move to the bottom of line',
|
||||
'LINEEDIT:PREV', 'Fetch the previous string from the history list',
|
||||
'LINEEDIT:NEXT', 'Fetch the next string from the history list',
|
||||
'LINEEDIT:EDITOR', 'Edit with external editor',
|
||||
'LINEEDIT:COMPLETE', 'Complete filename',
|
||||
'LINEEDIT:ACCEPT', 'Accept',
|
||||
);
|
||||
|
||||
%menu_funcdesc = (
|
||||
'MENU:SELECT', 'Select item',
|
||||
'MENU:CLOSE', 'Close menu',
|
||||
'MENU:CANCEL', 'Back',
|
||||
'MENU:DOWN', 'Move to next item',
|
||||
'MENU:UP', 'Move to previous item',
|
||||
'MENU:LINE_UP', 'Scroll up one item',
|
||||
'MENU:LINE_DOWN', 'Scroll down one item',
|
||||
'MENU:TOP', 'Go to top item',
|
||||
'MENU:LAST', 'Go to last item',
|
||||
'MENU:NEXT', 'Go to next page',
|
||||
'MENU:PREV', 'Go to previous page',
|
||||
'MENU:SEARCH_FORE', 'Search foreward',
|
||||
'MENU:SEARCH_BACK', 'Search backward',
|
||||
'MENU:SEARCH_NEXT', 'Search next regexp',
|
||||
'MENU:SEARCH_PREV', 'Search previous regexp',
|
||||
'MENU:SUSPEND', 'Suspend',
|
||||
);
|
||||
|
||||
1;
|
||||
66
scripts/w3mhelp-funcdesc.ja.pl.in
Normal file
66
scripts/w3mhelp-funcdesc.ja.pl.in
Normal file
@@ -0,0 +1,66 @@
|
||||
# charset
|
||||
$charset = 'EUC-JP';
|
||||
|
||||
# Buffer selection mode
|
||||
|
||||
%buf_funcdesc = (
|
||||
'BUF:PREV', '一つ上のバッファを選択',
|
||||
'BUF:NEXT', '一つ下のバッファを選択',
|
||||
'BUF:DELETE', '現在選択しているバッファを削除',
|
||||
'BUF:GO', '現在選択しているバッファを表示',
|
||||
);
|
||||
|
||||
%lineedit_funcdesc = (
|
||||
'LINEEDIT:FORWARD', 'カーソルを右へ移動',
|
||||
'LINEEDIT:BACK', 'カーソルを左へ移動',
|
||||
'LINEEDIT:BS', '前の文字を削除',
|
||||
'LINEEDIT:DEL', 'カーソル位置の文字を削除',
|
||||
'LINEEDIT:KILL_AFTER', 'カーソルの後方を全て削除',
|
||||
'LINEEDIT:KILL_BEFORE', 'カーソルの前までを全て削除',
|
||||
'LINEEDIT:TOP', '行頭に移動',
|
||||
'LINEEDIT:BOTTOM', '行末へ移動',
|
||||
'LINEEDIT:PREV', 'ヒストリから一つ前の文字列を取り出す',
|
||||
'LINEEDIT:NEXT', 'ヒストリから次の文字列を取り出す',
|
||||
'LINEEDIT:EDITOR', '外部エディタで編集',
|
||||
'LINEEDIT:COMPLETE', 'ファイル名の補完',
|
||||
'LINEEDIT:ACCEPT', '入力終了',
|
||||
);
|
||||
|
||||
%menu_funcdesc = (
|
||||
'MENU:SELECT', '項目を選択',
|
||||
'MENU:CLOSE', 'メニューを閉じる',
|
||||
'MENU:CANCEL', '戻る',
|
||||
'MENU:DOWN', '一つ下の項目へ',
|
||||
'MENU:UP', '一つ上の項目へ',
|
||||
'MENU:LINE_UP', '項目を下にスクロール',
|
||||
'MENU:LINE_DOWN', '項目を上にスクロール',
|
||||
'MENU:TOP', '先頭の項目へ',
|
||||
'MENU:LAST', '最後の項目へ',
|
||||
'MENU:NEXT', '次ページの項目へ',
|
||||
'MENU:PREV', '前ページの項目へ',
|
||||
'MENU:SEARCH_FORE', '項目を下に向かって検索',
|
||||
'MENU:SEARCH_BACK', '項目を上に向かって検索',
|
||||
'MENU:SEARCH_NEXT', '次の項目を検索',
|
||||
'MENU:SEARCH_PREV', '前の項目を検索',
|
||||
'MENU:SUSPEND', 'サスペンド',
|
||||
);
|
||||
|
||||
%title = (
|
||||
"Show keymap file", 'keymap ファイルを見る',
|
||||
"Page/Cursor motion", 'ページ/カーソル移動',
|
||||
"Hyperlink operation", 'ハイパーリンク操作',
|
||||
"File/Stream operation", 'ファイル/ストリーム操作',
|
||||
"Buffer operation", 'バッファ操作',
|
||||
"Tab operation", 'タブ操作',
|
||||
"Buffer selection mode", 'バッファ選択モード',
|
||||
"Bookmark operation", 'ブックマーク操作',
|
||||
"Search", '検索',
|
||||
"Dictionary look-up", '辞書検索',
|
||||
"Mark operation", 'マーク操作',
|
||||
"Miscellany", 'その他',
|
||||
"User defined keymaps", 'ユーザ定義',
|
||||
"Line-edit mode", '行編集モード',
|
||||
"Popup menu", 'メニュー',
|
||||
);
|
||||
|
||||
1;
|
||||
105
scripts/w3mhelp-funcname.pl.in
Normal file
105
scripts/w3mhelp-funcname.pl.in
Normal file
@@ -0,0 +1,105 @@
|
||||
|
||||
%buf_funcname = (
|
||||
'BUF:PREV', 'buffer_prev',
|
||||
'BUF:NEXT', 'buffer_next',
|
||||
'BUF:DELETE', 'buffer_delete',
|
||||
'BUF:GO', 'buffer_go',
|
||||
);
|
||||
|
||||
%lineedit_funcname = (
|
||||
'LINEEDIT:FORWARD', 'lineedit_forward',
|
||||
'LINEEDIT:BACK', 'lineedit_back',
|
||||
'LINEEDIT:BS', 'lineedit_backspace',
|
||||
'LINEEDIT:DEL', 'lineedit_delete',
|
||||
'LINEEDIT:KILL_AFTER', 'lineedit_kill_after',
|
||||
'LINEEDIT:KILL_BEFORE', 'lineedit_kill_before',
|
||||
'LINEEDIT:TOP', 'lineedit_top',
|
||||
'LINEEDIT:BOTTOM', 'lineedit_bottom',
|
||||
'LINEEDIT:PREV', 'lineedit_prev',
|
||||
'LINEEDIT:NEXT', 'lineedit_next',
|
||||
'LINEEDIT:EDITOR', 'lineedit_editor',
|
||||
'LINEEDIT:COMPLETE', 'lineedit_complete',
|
||||
'LINEEDIT:ACCEPT', 'lineedit_accept',
|
||||
);
|
||||
|
||||
%menu_funcname = (
|
||||
'MENU:SELECT', 'menu_select',
|
||||
'MENU:CLOSE', 'menu_close',
|
||||
'MENU:CANCEL', 'menu_cancel',
|
||||
'MENU:DOWN', 'menu_down',
|
||||
'MENU:UP', 'menu_up',
|
||||
'MENU:LINE_UP', 'menu_line_up',
|
||||
'MENU:LINE_DOWN', 'menu_line_down',
|
||||
'MENU:TOP', 'menu_top',
|
||||
'MENU:LAST', 'menu_last',
|
||||
'MENU:NEXT', 'menu_next',
|
||||
'MENU:PREV', 'menu_prev',
|
||||
'MENU:SEARCH_FORE', 'menu_search_fore',
|
||||
'MENU:SEARCH_BACK', 'menu_search_back',
|
||||
'MENU:SEARCH_NEXT', 'menu_search_next',
|
||||
'MENU:SEARCH_PREV', 'menu_search_prev',
|
||||
'MENU:SUSPEND', 'menu_suspend',
|
||||
);
|
||||
|
||||
%buf_keyfunc = (
|
||||
'k', 'BUF:PREV',
|
||||
'C-p', 'BUF:PREV',
|
||||
'j', 'BUF:NEXT',
|
||||
'C-n', 'BUF:NEXT',
|
||||
'D', 'BUF:DELETE',
|
||||
'RET', 'BUF:GO'
|
||||
);
|
||||
|
||||
%lineedit_keyfunc = (
|
||||
'C-f', 'LINEEDIT:FORWARD',
|
||||
'C-b', 'LINEEDIT:BACK',
|
||||
'C-h', 'LINEEDIT:BS',
|
||||
'C-d', 'LINEEDIT:DEL',
|
||||
'C-k', 'LINEEDIT:KILL_AFTER',
|
||||
'C-u', 'LINEEDIT:KILL_BEFORE',
|
||||
'C-a', 'LINEEDIT:TOP',
|
||||
'C-e', 'LINEEDIT:BOTTOM',
|
||||
'C-p', 'LINEEDIT:PREV',
|
||||
'C-n', 'LINEEDIT:NEXT',
|
||||
'C-o', 'LINEEDIT:EDITOR',
|
||||
'TAB', 'LINEEDIT:COMPLETE',
|
||||
'SPC', 'LINEEDIT:COMPLETE',
|
||||
'RET', 'LINEEDIT:ACCEPT'
|
||||
);
|
||||
|
||||
%menu_keyfunc = (
|
||||
'RET', 'MENU:SELECT',
|
||||
'SPC', 'MENU:SELECT',
|
||||
'RIGHT', 'MENU:SELECT',
|
||||
'^[[28~', 'MENU:CLOSE',
|
||||
'^[[2~', 'MENU:CLOSE',
|
||||
'C-c', 'MENU:CLOSE',
|
||||
'C-h', 'MENU:CANCEL',
|
||||
'DEL', 'MENU:CANCEL',
|
||||
'LEFT', 'MENU:CANCEL',
|
||||
'C-n', 'MENU:DOWN',
|
||||
'j', 'MENU:DOWN',
|
||||
'DOWN', 'MENU:DOWN',
|
||||
'C-p', 'MENU:UP',
|
||||
'k', 'MENU:UP',
|
||||
'UP', 'MENU:UP',
|
||||
'K', 'MENU:LINE_UP',
|
||||
'J', 'MENU:LINE_DOWN',
|
||||
'C-a', 'MENU:TOP',
|
||||
'C-e', 'MENU:LAST',
|
||||
'C-f', 'MENU:NEXT',
|
||||
'C-v', 'MENU:NEXT',
|
||||
'^[[6~', 'MENU:NEXT',
|
||||
'C-b', 'MENU:PREV',
|
||||
'ESC-v', 'MENU:PREV',
|
||||
'^[[5~', 'MENU:PREV',
|
||||
'C-s', 'MENU:SEARCH_FORE',
|
||||
'/', 'MENU:SEARCH_FORE',
|
||||
'C-r', 'MENU:SEARCH_BACK',
|
||||
'?', 'MENU:SEARCH_BACK',
|
||||
'n', 'MENU:SEARCH_NEXT',
|
||||
'N', 'MENU:SEARCH_PREV',
|
||||
'C-z', 'MENU:SUSPEND',
|
||||
);
|
||||
|
||||
1;
|
||||
323
scripts/w3mhelp.cgi.in
Normal file
323
scripts/w3mhelp.cgi.in
Normal file
@@ -0,0 +1,323 @@
|
||||
#!@PERL@
|
||||
# $Id: w3mhelp.cgi.in,v 1.28 2004/03/22 17:03:13 ukai Exp $
|
||||
|
||||
if ( $^O =~ /^(ms)?(dos|win(32|nt)?)/i ) {
|
||||
$CYGPATH = 1;
|
||||
}
|
||||
|
||||
$prefix = "@prefix@";
|
||||
$helpdir = "@HELP_DIR@";
|
||||
if ($CYGPATH) {
|
||||
$helpdir = &cygwin_pathconv($helpdir);
|
||||
}
|
||||
unshift(@INC, $helpdir);
|
||||
@docdirs = split(" ", "@DOCDIRS@");
|
||||
|
||||
require "w3mhelp-funcname.pl";
|
||||
require "w3mhelp-funcdesc.en.pl";
|
||||
$lang = 'en';
|
||||
$charset = 'US-ASCII';
|
||||
|
||||
%htmlesc = (
|
||||
'<', '<',
|
||||
'>', '>',
|
||||
'&', '&'
|
||||
);
|
||||
|
||||
$RC_DIR = '@RC_DIR@';
|
||||
$RC_DIR =~ s/^~/$ENV{'HOME'}/;
|
||||
if ($CYGPATH) {
|
||||
$RC_DIR = &cygwin_pathconv("$RC_DIR");
|
||||
}
|
||||
$keymap = "$RC_DIR/keymap";
|
||||
$version = '*unknown*';
|
||||
if (defined($ENV{'QUERY_STRING'})) {
|
||||
print "QUERY_STRING=$ENV{'QUERY_STRING'}\n";
|
||||
if ($ENV{'QUERY_STRING'} =~ /(^|&)version=([^&]*)/) {
|
||||
$version = $2;
|
||||
$version =~ s/\+|%([0-9A-Fa-f][0-9A-Fa-f])/$& eq '+' ? ' ' : pack('C', hex($1))/ge;
|
||||
$version =~ s/w3m\///;
|
||||
}
|
||||
if ($ENV{'QUERY_STRING'} =~ /(^|&)lang=([^&]*)/) {
|
||||
local($tlang) = $2;
|
||||
$tlang =~ s/\+|%([0-9A-Fa-f][0-9A-Fa-f])/$& eq '+' ? ' ' : pack('C', hex($1))/ge;
|
||||
$tlang =~ tr/A-Z/a-z/;
|
||||
if ($tlang !~ /^[a-z][a-z]$/) {
|
||||
$tlang = 'en';
|
||||
}
|
||||
# print "tlang=$tlang\n";
|
||||
eval {require "w3mhelp-funcdesc.$tlang.pl";};
|
||||
if (defined(%funcdesc)) {
|
||||
$lang = $tlang;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%f = %keyfunc;
|
||||
%keyfunc = ();
|
||||
while (($key, $fname) = each %f) {
|
||||
$key = &norm_key($key);
|
||||
$keyfunc{$key} = $fname;
|
||||
}
|
||||
|
||||
if (-f $keymap) {
|
||||
open(KEYMAP, "< $keymap") || die "cannot open keymap: $keymap, $!";
|
||||
&load_keymap(*KEYMAP, $func);
|
||||
close(KEYMAP);
|
||||
}
|
||||
|
||||
local (%funckeydesc, $key, $fname, $desc);
|
||||
|
||||
%funcname = (%funcname, %buf_funcname, %lineedit_funcname, %menu_funcname);
|
||||
|
||||
%funcdesc = (%funcdesc, %buf_funcdesc, %lineedit_funcdesc, %menu_funcdesc);
|
||||
while (($fname, $desc) = each %funcdesc) {
|
||||
$funckeydesc{$funcname{$fname}} = "$fname\n$desc\n";
|
||||
}
|
||||
|
||||
while (($key, $fname) = each %keyfunc) {
|
||||
$keydata{$key} && next;
|
||||
$funckeydesc{$funcname{$fname}} .= "$key,";
|
||||
}
|
||||
while (($key, $fname) = each %buf_keyfunc) {
|
||||
$funckeydesc{$funcname{$fname}} .= "$key,";
|
||||
}
|
||||
while (($key, $fname) = each %lineedit_keyfunc) {
|
||||
$funckeydesc{$funcname{$fname}} .= "$key,";
|
||||
}
|
||||
while (($key, $fname) = each %menu_keyfunc) {
|
||||
$funckeydesc{$funcname{$fname}} .= "$key,";
|
||||
}
|
||||
|
||||
print <<HEADING;
|
||||
Content-Type: text/html; charset=$charset
|
||||
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>w3m help page</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<CENTER>
|
||||
*******
|
||||
<A HREF="http://w3m.sourceforge.net/">w3m</A>
|
||||
(WWW-wo-Miru) Version $version by
|
||||
<A HREF="mailto:aito\@fw.ipsj.or.jp">A.ITO</A> ********<BR>
|
||||
***** Key assign table *****
|
||||
</CENTER>
|
||||
|
||||
HEADING
|
||||
|
||||
$q_version = $version;
|
||||
$q_version =~ s/[^A-Za-z0-9_\$\.\-]/sprintf('%%%02X', ord($&))/ge;
|
||||
$script = "<A HREF=\"$ENV{'SCRIPT_NAME'}?version=$q_version&lang=";
|
||||
|
||||
# doc:en_English doc-jp:ja_Japanese
|
||||
for $otherlang (@docdirs) {
|
||||
local(@d) = split(/[:_]/, $otherlang);
|
||||
|
||||
if ($d[1] ne $lang) {
|
||||
$d[1] =~ s/[^A-Za-z0-9_\$\.\-]/sprintf('%%%02X', ord($&))/ge;
|
||||
print $script, $d[1], "\">$d[2] version</A>\n";
|
||||
}
|
||||
}
|
||||
|
||||
$keymap =~ s/[<>&]/$htmlesc{$&}/ge;
|
||||
$head = "Show keymap file";
|
||||
if (defined($title{$head})) {
|
||||
$head = $title{$head};
|
||||
$head =~ s/[<>&]/$htmlesc{$&}/ge;
|
||||
}
|
||||
print "<P><A HREF=\"$keymap\">$head</A>\n";
|
||||
|
||||
&show_keymap("Page/Cursor motion",
|
||||
split(" ", "pgFore pgBack movR movL movD movU
|
||||
movR1 movL1 movD1 movU1 ldown1 lup1
|
||||
shiftl shiftr col1L col1R linbeg linend ctrCsrH ctrCsrV
|
||||
goLine goLineF goLineL movRW movLW
|
||||
topA lastA nextA prevA movlistMn
|
||||
nextR nextL nextD nextU nextRD nextLU
|
||||
undoPos redoPos"));
|
||||
|
||||
&show_keymap("Hyperlink operation",
|
||||
split(" ", "followA tabA svA followI svI submitForm
|
||||
curURL peekURL peekIMG pginfo curlno chkURL chkWORD chkNMID
|
||||
rFrame extbrz linkbrz linkLst listMn linkMn accessKey"));
|
||||
|
||||
&show_keymap("File/Stream operation",
|
||||
split(" ", "goURL gorURL tabURL tabrURL ldfile readsh pipesh
|
||||
pipeBuf"));
|
||||
|
||||
&show_keymap("Buffer operation",
|
||||
split(" ", "backBf nextBf prevBf selMn selBuf vwSrc svSrc svBuf
|
||||
editBf editScr reload reshape rdrwSc dispI stopI"));
|
||||
|
||||
&show_keymap("Tab operation",
|
||||
split(" ", "newT closeT nextT prevT tabMn tabR tabL"));
|
||||
|
||||
&show_keymap("Bookmark operation",
|
||||
split(" ", "ldBmark adBmark"));
|
||||
|
||||
&show_keymap("Search",
|
||||
split(" ", "srchfor srchbak srchnxt srchprv isrchfor isrchbak"));
|
||||
|
||||
&show_keymap("Dictionary look-up",
|
||||
split(" ", "dictword dictwordat"));
|
||||
|
||||
&show_keymap("Mark operation",
|
||||
split(" ", "_mark nextMk prevMk reMark"));
|
||||
|
||||
&show_keymap("Miscellany",
|
||||
split(" ", "mainMn ldhelp ldOpt dispVer cooLst ldHist ldDL
|
||||
docCSet defCSet
|
||||
msgs msToggle wrapToggle execCmd setAlarm setOpt setEnv defKey
|
||||
reinit execsh susp qquitfm quitfm"));
|
||||
|
||||
&show_keymap_data("User defined keymaps");
|
||||
|
||||
print "<BR>\n<HR WIDTH=80%>\n";
|
||||
|
||||
&show_keymap("Buffer selection mode",
|
||||
split(" ", "buffer_next buffer_prev buffer_delete buffer_go"));
|
||||
|
||||
print "<BR>\n<HR WIDTH=80%>\n";
|
||||
|
||||
&show_keymap("Line-edit mode",
|
||||
split(" ", "lineedit_forward lineedit_back lineedit_backspace
|
||||
lineedit_delete lineedit_kill_after lineedit_kill_before
|
||||
lineedit_top lineedit_bottom lineedit_prev lineedit_next
|
||||
lineedit_editor lineedit_complete lineedit_accept"));
|
||||
|
||||
print "<BR>\n<HR WIDTH=80%>\n";
|
||||
|
||||
&show_keymap("Popup menu",
|
||||
split(" ", "menu_select menu_close menu_cancel menu_down menu_up
|
||||
menu_line_up menu_line_down menu_top menu_last menu_next
|
||||
menu_prev menu_search_fore menu_search_back menu_search_next
|
||||
menu_search_prev menu_suspend"));
|
||||
|
||||
print <<PAGE;
|
||||
<HR>
|
||||
</BODY>
|
||||
</HTML>
|
||||
PAGE
|
||||
|
||||
exit 0;
|
||||
|
||||
sub load_keymap {
|
||||
local(*FH) = shift;
|
||||
local($func) = @_;
|
||||
|
||||
while (<FH>) {
|
||||
/^#/ && next;
|
||||
s/^\s*keymap\s+// || next;
|
||||
s/^(\"(\\\"|[^\"])+\"|\'(\\\'|[^\'])+\'|\S+)\s+(\S+)\s*// || next;
|
||||
($key, $fname) = ($1, $4);
|
||||
$data = $_;
|
||||
$fname =~ tr/a-z/A-Z/;
|
||||
defined($funcdesc{$fname}) || next;
|
||||
$key =~ s/^["'](.*)["']$/$1/;
|
||||
$key = &norm_key($key);
|
||||
$keyfunc{$key} = $fname;
|
||||
if ($data) {
|
||||
$keydata{$key} = $data;
|
||||
} else {
|
||||
delete $keydata{$key};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub norm_key {
|
||||
local($_) = @_;
|
||||
|
||||
s/(ESC|SPC|TAB|DEL|UP|DOWN|RIGHT|LEFT)/\U$1/i;
|
||||
s/\\(.)/$1/g;
|
||||
s/(^|\s+|-)\^(.)/${1}C-$2/g;
|
||||
s/(^|\s+|-)(C-\[|M-)/${1}ESC-/g;
|
||||
if (/^ESC-\[/) {
|
||||
/^ESC-\[A$/ && return "UP";
|
||||
/^ESC-\[B$/ && return "DOWN";
|
||||
/^ESC-\[C$/ && return "RIGHT";
|
||||
/^ESC-\[D$/ && return "LEFT";
|
||||
}
|
||||
s/(^|\s+|-)ESC-\[/$1\^\[\[/g;
|
||||
s/(^|\s+|-)ESC-\^(.)/${1}ESC-C-$2/g;
|
||||
s/(^|\s+|-)(ESC-)?C-[iI]/$1${2}TAB/g;
|
||||
s/(^|\s+|-)(ESC-)?C-\?/$1${2}DEL/g;
|
||||
return $_;
|
||||
}
|
||||
|
||||
sub show_keymap {
|
||||
local($head, @list) = @_;
|
||||
local($fid);
|
||||
local($attr) = " WIDTH=140";
|
||||
|
||||
if (defined($title{$head})) {
|
||||
$head = $title{$head};
|
||||
$head =~ s/[<>&]/$htmlesc{$&}/ge;
|
||||
}
|
||||
|
||||
print <<PAGE;
|
||||
<H2>$head</H2>
|
||||
<table cellpadding=0>
|
||||
PAGE
|
||||
foreach $fid (@list) {
|
||||
local ($name, $desc, $keys) = split("\n", $funckeydesc{$fid}, 3);
|
||||
$keys =~ s/,$//;
|
||||
$keys = '<NOT ASSIGNED>' if ($keys eq '');
|
||||
$keys =~ s/[<>&]/$htmlesc{$&}/ge;
|
||||
if ($name =~ /:/) {
|
||||
$name = "";
|
||||
} else {
|
||||
$name =~ s/[<>&]/$htmlesc{$&}/ge;
|
||||
$name = " (<b>$name</b>)";
|
||||
}
|
||||
$desc =~ s/[<>&]/$htmlesc{$&}/ge;
|
||||
print <<PAGE;
|
||||
<TR><TD$attr>$keys<TD><NOBR>$desc$name</NOBR>
|
||||
PAGE
|
||||
$attr = "";
|
||||
}
|
||||
print "</table>\n";
|
||||
}
|
||||
|
||||
sub show_keymap_data {
|
||||
local($head, @list) = @_;
|
||||
local($fid);
|
||||
local($attr) = " WIDTH=140";
|
||||
|
||||
if (defined($title{$head})) {
|
||||
$head = $title{$head};
|
||||
$head =~ s/[<>&]/$htmlesc{$&}/ge;
|
||||
}
|
||||
|
||||
print <<PAGE;
|
||||
<H2>$head</H2>
|
||||
<table cellpadding=0>
|
||||
PAGE
|
||||
foreach $keys (sort keys %keydata) {
|
||||
$keys =~ s/[<>&]/$htmlesc{$&}/ge;
|
||||
$name = $keyfunc{$keys};
|
||||
$data = $keydata{$keys};
|
||||
$name =~ s/[<>&]/$htmlesc{$&}/ge;
|
||||
$data =~ s/[<>&]/$htmlesc{$&}/ge;
|
||||
print <<PAGE;
|
||||
<TR><TD$attr>$keys<TD>$name<TD><NOBR>$data</NOBR>
|
||||
PAGE
|
||||
$attr = "";
|
||||
}
|
||||
print "</table>\n";
|
||||
}
|
||||
|
||||
|
||||
sub cygwin_pathconv {
|
||||
local($_) = @_;
|
||||
local(*CYGPATH);
|
||||
|
||||
open(CYGPATH, '-|') || exec('cygpath', '-w', $_);
|
||||
$_ = <CYGPATH>;
|
||||
close(CYGPATH);
|
||||
s/\r?\n$//;
|
||||
s!\\!/!g;
|
||||
s!/$!!;
|
||||
return $_;
|
||||
}
|
||||
403
scripts/w3mmail.cgi.in
Executable file
403
scripts/w3mmail.cgi.in
Executable file
@@ -0,0 +1,403 @@
|
||||
#!@PERL@
|
||||
|
||||
$rcsid = q$Id: w3mmail.cgi.in,v 1.13 2003/09/22 21:02:29 ukai Exp $;
|
||||
($id = $rcsid) =~ s/^.*,v ([\d\.]*).*/$1/;
|
||||
($prog=$0) =~ s/.*\///;
|
||||
|
||||
$query = $ENV{'QUERY_STRING'};
|
||||
$cookie_file = $ENV{'LOCAL_COOKIE_FILE'};
|
||||
$local_cookie = '';
|
||||
$SENDMAIL = '/usr/lib/sendmail';
|
||||
$SENDMAIL = '/usr/sbin/sendmail' if -x '/usr/sbin/sendmail';
|
||||
$SENDMAIL_OPT = '-oi -t';
|
||||
|
||||
if (-f $cookie_file) {
|
||||
open(F, "< $cookie_file");
|
||||
$local_cookie = <F>;
|
||||
close(F);
|
||||
}
|
||||
if ($query =~ s/^\w+://) {
|
||||
$url = $query;
|
||||
$qurl = &html_quote($url);
|
||||
$to = $query;
|
||||
$opt = '';
|
||||
if ($to =~ /^([^?]*)\?(.*)$/) {
|
||||
$to = $1;
|
||||
$opt = $2;
|
||||
}
|
||||
$to = &url_unquote($to);
|
||||
%opt = &parse_opt($opt);
|
||||
|
||||
@to = ($to);
|
||||
push(@to, $opt{'to'}) if ($opt{'to'});
|
||||
$opt{'to'} = join(',', @to);
|
||||
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
|
||||
sysread(STDIN, $body, $ENV{'CONTENT_LENGTH'});
|
||||
$content_type = $ENV{'CONTENT_TYPE'};
|
||||
if ($content_type =~ /^multipart\/form-data;\s+boundary=(.*)$/) {
|
||||
$boundary = $1;
|
||||
}
|
||||
} else {
|
||||
$body = $opt{'body'};
|
||||
delete $opt{'body'};
|
||||
}
|
||||
&lang_setup;
|
||||
|
||||
print "Content-Type: text/html; charset=$charset\r\n";
|
||||
print "w3m-control: END\r\n";
|
||||
print "w3m-control: PREV_LINK\r\n";
|
||||
print "\r\n";
|
||||
print "<html><head><title>W3M Mailer: $qurl</title></head>\n";
|
||||
print "<body><h1>W3M Mailer: $qurl</h1>\n";
|
||||
print "<form action=\"file://$0\" method='POST'>\n";
|
||||
$local_cookie = &html_quote($local_cookie);
|
||||
print "<input type='hidden' name='cookie' value=\"$local_cookie\">\n";
|
||||
print "<table>\n";
|
||||
foreach $h ('from', 'to', 'cc', 'bcc', 'subject') {
|
||||
$v = &lang_html_quote($opt{$h});
|
||||
print "<tr><td>\u$h:<td><input type='text' name=\"$h\" value=\"$v\">\n";
|
||||
delete $opt{$h};
|
||||
}
|
||||
if ($boundary) {
|
||||
$boundary = &html_quote($boundary);
|
||||
print "<tr><td>Content-Type:<td>multipart/form-data; boundary=\"$boundary\"\n";
|
||||
print "<input type='hidden' name='boundary' value=\"$boundary\">\n";
|
||||
}
|
||||
foreach $h (keys %opt) {
|
||||
$qh = &html_quote($h);
|
||||
$v = &lang_html_quote($opt{$h});
|
||||
print "<tr><td>\u$h:<td>$v\n";
|
||||
print "<input type='hidden' name=\"$qh\" value=\"$v\">\n";
|
||||
}
|
||||
print "<tr><td colspan=2>\n";
|
||||
print "<textarea cols=40 rows=10 name='body'>\n";
|
||||
if ($body) {
|
||||
print &lang_html_quote($body);
|
||||
}
|
||||
print "</textarea>\n";
|
||||
print "</table>\n";
|
||||
print "<input type='submit' name='action' value='Preview'>\n";
|
||||
print "</form>\n";
|
||||
print "</body></html>\n";
|
||||
exit(0);
|
||||
} else {
|
||||
sysread(STDIN, $req, $ENV{'CONTENT_LENGTH'});
|
||||
%opt = &parse_opt($req);
|
||||
if ($local_cookie ne $opt{'cookie'}) {
|
||||
print "Content-Type: text/plain\r\n";
|
||||
print "\r\n";
|
||||
print "Local cookie doesn't match: It may be an illegal execution\n";
|
||||
exit 1;
|
||||
}
|
||||
delete $opt{'cookie'};
|
||||
$body = $opt{'body'};
|
||||
delete $opt{'body'};
|
||||
$act = $opt{'action'};
|
||||
delete $opt{'action'};
|
||||
$boundary = $opt{'boundary'};
|
||||
delete $opt{'boundary'};
|
||||
&lang_setup;
|
||||
|
||||
if ($act eq "Preview") {
|
||||
print "Content-Type: text/html; charset=$charset\r\n";
|
||||
print "w3m-control: DELETE_PREVBUF\r\n";
|
||||
print "w3m-control: NEXT_LINK\r\n";
|
||||
print "\r\n";
|
||||
print "<html><head><title>W3M Mailer</title></head>\n";
|
||||
print "<body>\n";
|
||||
print "<h1>W3M Mailer: preview</h1>\n";
|
||||
print "<form action=\"file://$0\" method='POST'>\n";
|
||||
$local_cookie = &html_quote($local_cookie);
|
||||
print "<input type='hidden' name='cookie' value=\"$local_cookie\">\n";
|
||||
print "<hr>\n";
|
||||
print "<pre>\n";
|
||||
foreach $h (keys %opt) {
|
||||
$qh = &html_quote($h);
|
||||
$v{$h} = &lang_html_quote($opt{$h});
|
||||
if ($v{$h}) {
|
||||
print "\u$qh: $v{$h}\n";
|
||||
}
|
||||
}
|
||||
($cs,$cte,$body) = &lang_body(&lang_html_quote($body), 0);
|
||||
print "Mime-Version: 1.0\n";
|
||||
if ($boundary) {
|
||||
$boundary = &html_quote($boundary);
|
||||
print "Content-Type: multipart/form-data;\n";
|
||||
print " boundary=\"$boundary\"\n";
|
||||
} else {
|
||||
print "Content-Type: text/plain; charset=$cs\n";
|
||||
}
|
||||
# print "Content-Transfer-Encoding: $cte\n";
|
||||
print "User-Agent: ", &html_quote("$ENV{'SERVER_SOFTWARE'} $prog/$id"),
|
||||
"\n";
|
||||
print "\n";
|
||||
print $body;
|
||||
print "\n" if ($body !~ /\n$/);
|
||||
print "</pre>\n";
|
||||
print "<input type='submit' name='action' value='Send'>\n";
|
||||
print "<hr>\n";
|
||||
print "<table>\n";
|
||||
foreach $h ('from', 'to', 'cc', 'bcc', 'subject') {
|
||||
print "<tr><td>\u$h:<td><input type='text' name=\"$h\" value=\"$v{$h}\">\n";
|
||||
delete $opt{$h};
|
||||
}
|
||||
if ($boundary) {
|
||||
print "<tr><td>Content-Type:<td>Content-Type: multipart/form-data; boundary=\"$boundary\"\n";
|
||||
print "<input type='hidden' name=\"boundary\" value=\"$boundary\">\n";
|
||||
}
|
||||
foreach $h (keys %opt) {
|
||||
$qh = &html_quote($h);
|
||||
print "<tr><td>\u$qh:<td>$v{$h}\n";
|
||||
print "<input type='hidden' name=\"$qh\" value=\"$v{$h}\">\n";
|
||||
}
|
||||
print "<tr><td colspan=2>\n";
|
||||
print "<textarea cols=40 rows=10 name=body>\n";
|
||||
if ($body) {
|
||||
print $body;
|
||||
}
|
||||
print "</textarea>\n";
|
||||
print "</table>\n";
|
||||
print "<input type='submit' name='action' value='Preview'><br>\n";
|
||||
print "</body></html>\n";
|
||||
} else {
|
||||
# XXX: quote?
|
||||
# if ($opt{'from'}) {
|
||||
# $sendmail_fromopt = '-f' . $opt{'from'};
|
||||
# }
|
||||
unless (open(MAIL, "|$SENDMAIL $SENDMAIL_OPT")) {
|
||||
print "Content-Type: text/html\r\n";
|
||||
print "\r\n";
|
||||
print "<html><head><title>W3M Mailer</title></head>\n";
|
||||
print "<body><h1>W3M Mailer: open sendmail failed</h1>\n";
|
||||
print "<p>", &html_quote($@), "</p>\n";
|
||||
print "</body></html>\n";
|
||||
exit(0);
|
||||
}
|
||||
foreach $h (keys %opt) {
|
||||
$v = &lang_header($opt{$h});
|
||||
if ($v) {
|
||||
print MAIL "\u$h: $v\n";
|
||||
}
|
||||
}
|
||||
($cs,$cte,$body) = &lang_body($body, 1);
|
||||
print MAIL "Mime-Version: 1.0\n";
|
||||
if ($boundary) {
|
||||
print MAIL "Content-Type: multipart/form-data;\n";
|
||||
print MAIL " boundary=\"$boundary\"\n";
|
||||
} else {
|
||||
print MAIL "Content-Type: text/plain; charset=$cs\n";
|
||||
}
|
||||
print MAIL "Content-Transfer-Encoding: $cte\n";
|
||||
print MAIL "User-Agent: $ENV{'SERVER_SOFTWARE'} $prog/$id\n";
|
||||
print MAIL "\n";
|
||||
print MAIL $body;
|
||||
if (close(MAIL)) {
|
||||
print "w3m-control: DELETE_PREVBUF\r\n";
|
||||
print "w3m-control: BACK\r\n";
|
||||
print "\r\n";
|
||||
} else {
|
||||
print "Content-Type: text/html\r\n";
|
||||
print "\r\n";
|
||||
print "<html><head><title>W3M Mailer</title></head>\n";
|
||||
print "<body><h1>W3M Mailer: close sendmail failed</h1>\n";
|
||||
print "<p>", &html_quote($@), "</p>\n";
|
||||
print "</body></html>\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub lang_setup {
|
||||
$lang = $ENV{'LC_ALL'} || $ENV{'LC_CTYPE'} || $ENV{'LANG'};
|
||||
if ($lang =~ /^ja/i) {
|
||||
eval "use NKF;";
|
||||
if (! $@) {
|
||||
$use_NKF = 1;
|
||||
} else {
|
||||
$use_NKF = 0;
|
||||
}
|
||||
$charset = "EUC-JP";
|
||||
} else {
|
||||
$charset = &guess_charset($lang);
|
||||
}
|
||||
}
|
||||
|
||||
sub lang_header {
|
||||
if ($lang =~ /^ja/i) {
|
||||
return &lang_header_ja(@_);
|
||||
} else {
|
||||
return &lang_header_default(@_);
|
||||
}
|
||||
}
|
||||
|
||||
sub lang_body {
|
||||
if ($lang =~ /^ja/i) {
|
||||
return &lang_body_ja(@_);
|
||||
} else {
|
||||
return &lang_body_default(@_);
|
||||
}
|
||||
}
|
||||
|
||||
sub lang_html_quote {
|
||||
local($_) = @_;
|
||||
if ($lang =~ /^ja/i) {
|
||||
if (/[\x80-\xFF]/ || /\033[\$\(][BJ@]/) {
|
||||
$_ = &conv_nkf("-e", $_);
|
||||
}
|
||||
}
|
||||
return &html_quote($_);
|
||||
}
|
||||
|
||||
sub lang_header_default {
|
||||
local($h) = @_;
|
||||
if ($h =~ s/([=_?\x80-\xFF])/sprintf("=%02x", ord($1))/ge) {
|
||||
return "=?$charset?Q?$h?=";
|
||||
} else {
|
||||
return $h;
|
||||
}
|
||||
}
|
||||
|
||||
sub lang_body_default {
|
||||
local($body, $_7bit) = @_;
|
||||
if ($body =~ /[\x80-\xFF]/) {
|
||||
if ($_7bit) {
|
||||
$body =~ s/([=\x80-\xFF])/sprintf("=%02x", ord($1))/ge;
|
||||
return ($charset, "quoted-printable", $body);
|
||||
} else {
|
||||
return ($charset, "8bit", $body);
|
||||
}
|
||||
} else {
|
||||
return ("US-ASCII", "7bit", $body);
|
||||
}
|
||||
}
|
||||
|
||||
sub lang_header_ja {
|
||||
local($h) = @_;
|
||||
if ($h =~ /[\x80-\xFF]/ || $h =~ /\033[\$\(][BJ@]/) {
|
||||
$h = &conv_nkf("-j", $h);
|
||||
&conv_nkf("-M", $h);
|
||||
} else {
|
||||
return $h;
|
||||
}
|
||||
}
|
||||
|
||||
sub lang_body_ja {
|
||||
local($body, $_7bit) = @_;
|
||||
if ($body =~ /[\x80-\xFF]/ || $body =~ /\033[\$\(][BJ@]/) {
|
||||
if ($_7bit) {
|
||||
$body = &conv_nkf("-j", $body);
|
||||
}
|
||||
return ("ISO-2022-JP", "7bit", $body);
|
||||
} else {
|
||||
return ("US-ASCII", "7bit", $body);
|
||||
}
|
||||
}
|
||||
|
||||
sub conv_nkf {
|
||||
local(@opt) = @_;
|
||||
if ($use_NKF) {
|
||||
return nkf(@opt);
|
||||
}
|
||||
local($body) = pop(@opt);
|
||||
$body =~ s/\r+\n/\n/g;
|
||||
$| = 1;
|
||||
pipe(R, W2);
|
||||
pipe(R2, W);
|
||||
if (! fork()) {
|
||||
close(F);
|
||||
close(R);
|
||||
close(W);
|
||||
open(STDIN, "<&R2");
|
||||
open(STDOUT, ">&W2");
|
||||
exec "nkf", @opt;
|
||||
die;
|
||||
}
|
||||
close(R2);
|
||||
close(W2);
|
||||
print W $body;
|
||||
close(W);
|
||||
$body = '';
|
||||
while(<R>) {
|
||||
$body .= $_;
|
||||
}
|
||||
close(R);
|
||||
return $body;
|
||||
};
|
||||
|
||||
|
||||
|
||||
sub parse_opt {
|
||||
local($opt) = @_;
|
||||
local(%opt) = ();
|
||||
if ($opt) {
|
||||
foreach $o (split('&', $opt)) {
|
||||
if ($o =~ /(\w+)=(.*)/) {
|
||||
$opt{"\L$1"} = &url_unquote($2);
|
||||
}
|
||||
}
|
||||
}
|
||||
return %opt;
|
||||
}
|
||||
|
||||
sub html_quote {
|
||||
local($_) = @_;
|
||||
local(%QUOTE) = (
|
||||
'<', '<',
|
||||
'>', '>',
|
||||
'&', '&',
|
||||
'"', '"',
|
||||
);
|
||||
s/[<>&"]/$QUOTE{$&}/g;
|
||||
return $_;
|
||||
}
|
||||
|
||||
sub url_unquote {
|
||||
local($_) = @_;
|
||||
s/\+|%([0-9A-Fa-f][0-9A-Fa-f])/$& eq '+' ? ' ' : pack('c', hex($1))/ge;
|
||||
return $_;
|
||||
}
|
||||
|
||||
sub guess_charset {
|
||||
local(%lang_charset) = (
|
||||
'cs', 'iso-8859-2',
|
||||
'el', 'iso-8859-7',
|
||||
'iw', 'iso-8859-8',
|
||||
'ja', 'EUC-JP',
|
||||
'ko', 'EUC-KR',
|
||||
'hu', 'iso-8859-2',
|
||||
'pl', 'iso-8859-2',
|
||||
'ro', 'iso-8859-2',
|
||||
'ru', 'iso-8859-5',
|
||||
'sk', 'iso-8859-2',
|
||||
'sl', 'iso-8859-2',
|
||||
'tr', 'iso-8859-9',
|
||||
'zh', 'GB2312',
|
||||
);
|
||||
local($_) = @_;
|
||||
local($lang);
|
||||
|
||||
if (! s/\.(.*)$//) {
|
||||
if (/^zh_tw/i) {
|
||||
return 'Big5';
|
||||
}
|
||||
/^(..)/;
|
||||
return $lang_charset{$1} || 'iso-8859-1';
|
||||
}
|
||||
$lang = $_;
|
||||
$_ = $1;
|
||||
if (/^euc/i) {
|
||||
if (/^euc$/i) {
|
||||
$lang =~ /^zh_tw/ && return 'EUC-TW';
|
||||
$lang =~ /^zh/ && return 'GB2312';
|
||||
$lang =~ /^ko/ && return 'EUC-KR';
|
||||
return 'EUC-JP';
|
||||
}
|
||||
/^euccn/i && return 'GB2312';
|
||||
s/[\-_]//g;
|
||||
s/^euc/EUC-/i;
|
||||
tr/a-z/A-Z/;
|
||||
} elsif (/^iso8859/i) {
|
||||
s/[\-_]//g;
|
||||
s/^iso8859/iso-8859-/i;
|
||||
}
|
||||
return $_;
|
||||
}
|
||||
5
scripts/w3mman/.cvsignore
Normal file
5
scripts/w3mman/.cvsignore
Normal file
@@ -0,0 +1,5 @@
|
||||
w3mman
|
||||
w3mman2html.cgi
|
||||
w3mman.1
|
||||
|
||||
Makefile
|
||||
96
scripts/w3mman/Makefile.in
Normal file
96
scripts/w3mman/Makefile.in
Normal file
@@ -0,0 +1,96 @@
|
||||
@SET_MAKE@
|
||||
SHELL=@SHELL@
|
||||
PACKAGE = @PACKAGE@
|
||||
VERSION = @VERSION@
|
||||
DOMAIN = $(PACKAGE)
|
||||
srcidr=@srcdir@
|
||||
top_srcdir=@top_srcdir@
|
||||
VPATH= $(srcdir):.
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
bindir = @bindir@
|
||||
datadir = @datadir@
|
||||
libdir = @libdir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
libexecdir = @libexecdir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
oldincludedir = @oldincludedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
VPATH = $(top_srcdir):.
|
||||
DESTDIR =
|
||||
|
||||
CGIBIN_DIR = $(libexecdir)/$(PACKAGE)/cgi-bin
|
||||
AUXBIN_DIR = $(libexecdir)/$(PACKAGE)
|
||||
HELP_DIR = @HELP_DIR@
|
||||
RC_DIR = @RC_DIR@
|
||||
ETC_DIR = $(sysconfdir)
|
||||
CONF_DIR = $(sysconfdir)/$(PACKAGE)
|
||||
BIN_DIR = $(bindir)
|
||||
MAN1_DIR = $(mandir)/man1
|
||||
|
||||
TARGETS = w3mman
|
||||
CGIBIN_TARGETS = w3mman2html.cgi
|
||||
MAN1_TARGETS = w3mman.1
|
||||
MAN_TARGETS = $(MAN1_TARGETS)
|
||||
|
||||
MKDIR = mkdir -p
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_MAN = @INSTALL_DATA@
|
||||
|
||||
all: $(TARGETS) $(CGIBIN_TARGETS) $(MAN_TARGETS)
|
||||
|
||||
# do nothing
|
||||
$(TARGETS) $(CGIBIN_TARGETS) $(MAN_TARGETS):
|
||||
|
||||
install: $(TARGETS) $(CGIBIN_TARGETS) $(MAN_TARGETS)
|
||||
-$(MKDIR) $(DESTDIR)$(BIN_DIR)
|
||||
-$(MKDIR) $(DESTDIR)$(CGIBIN_DIR)
|
||||
-$(MKDIR) $(DESTDIR)$(MAN1_DIR)
|
||||
for file in $(TARGETS); \
|
||||
do \
|
||||
$(INSTALL_SCRIPT) $$file $(DESTDIR)$(BIN_DIR); \
|
||||
done
|
||||
for file in $(CGIBIN_TARGETS); \
|
||||
do \
|
||||
$(INSTALL_SCRIPT) $$file $(DESTDIR)$(CGIBIN_DIR); \
|
||||
done
|
||||
for file in $(MAN1_TARGETS); \
|
||||
do \
|
||||
$(INSTALL_MAN) $$file $(DESTDIR)$(MAN1_DIR); \
|
||||
done
|
||||
|
||||
uninstall:
|
||||
-for file in $(TARGETS); \
|
||||
do \
|
||||
rm -f $(BIN_DIR)/$$file; \
|
||||
done
|
||||
-for file in $(CGIBIN_TARGETS); \
|
||||
do \
|
||||
rm -f $(CGIBIN_DIR)/$$file; \
|
||||
done
|
||||
-for file in $(MAN1_TARGETS); \
|
||||
do \
|
||||
rm -f $(MAN1_DIR)/$$file; \
|
||||
done
|
||||
|
||||
clean:
|
||||
|
||||
distclean:
|
||||
-rm -f $(TARGETS) $(CGIBIN_TARGETS) $(MAN_TARGETS)
|
||||
-rm -f Makefile
|
||||
|
||||
dist: all
|
||||
@-rm -fr $(distdir)/w3mman
|
||||
-$(MKDIR) $(distdir)/w3mman
|
||||
cp Makefile README w3mman.in w3mman2html.cgi.in hlink.cgi w3mman.1.in $(distdir)/w3mman
|
||||
( cd $(distdir); tar -cf - w3mman | GZIP='' gzip ) \
|
||||
> $(distdir)/w3mman.tar.gz
|
||||
-rm -fr $(distdir)/w3mman
|
||||
|
||||
54
scripts/w3mman/README
Normal file
54
scripts/w3mman/README
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
w3mman
|
||||
|
||||
他のマニュアルやヘッダファイルにリンクをはることができる
|
||||
man コマンドの代替コマンドです。
|
||||
|
||||
使用法
|
||||
|
||||
w3mman
|
||||
w3mman <command>[(<section>)]
|
||||
w3mman [<section>] <command>
|
||||
w3mman -k <keyword>
|
||||
|
||||
環境変数
|
||||
|
||||
W3MMAN_W3M
|
||||
使用する w3m コマンドを指定します(デフォルトは w3m)
|
||||
W3MMAN_MAN
|
||||
使用する man コマンドを指定します(デフォルトは man)
|
||||
|
||||
インストール
|
||||
|
||||
make install
|
||||
必要なら PERL, MAN, LIBDIR を設定してください。
|
||||
w3mman2html.cgi もインストールされます。
|
||||
|
||||
================
|
||||
|
||||
w3mman2html.cgi
|
||||
|
||||
使用法
|
||||
|
||||
w3m file:///$LIB/w3mman2html.cgi
|
||||
w3m file:///$LIB/w3mman2html.cgi?<command>[(<section>)]
|
||||
w3m file:///$LIB/w3mman2html.cgi?man=<command>[§ion=<section>]
|
||||
w3m file:///$LIB/w3mman2html.cgi?keyword=<keyword>
|
||||
|
||||
インストール
|
||||
|
||||
make install
|
||||
必要なら PERL, MAN, LIBDIR を設定してください。
|
||||
w3mman もインストールされます。
|
||||
|
||||
================
|
||||
|
||||
hlink.cgi
|
||||
|
||||
ヘッダファイルなどにリンクを張る
|
||||
|
||||
インストール
|
||||
|
||||
/$LIB/ にコピー
|
||||
w3mman2html.cgi で使用するならば $CGI2 に設定してください。
|
||||
|
||||
97
scripts/w3mman/hlink.cgi
Normal file
97
scripts/w3mman/hlink.cgi
Normal file
@@ -0,0 +1,97 @@
|
||||
#!/usr/local/bin/perl
|
||||
|
||||
$SCRIPT_NAME = $ENV{'SCRIPT_NAME'} || $0;
|
||||
$CGI = "file://$SCRIPT_NAME?";
|
||||
|
||||
if ($ENV{'QUERY_STRING'}) {
|
||||
$file = $ENV{'QUERY_STRING'};
|
||||
} else {
|
||||
$file = $ARGV[0];
|
||||
}
|
||||
$file = &cleanup($file);
|
||||
|
||||
if (-d $file) {
|
||||
print <<EOF;
|
||||
Location: file:$file
|
||||
EOF
|
||||
exit;
|
||||
}
|
||||
if (! open(FILE, "< $file")) {
|
||||
$file = &html_quote($file);
|
||||
$_ = "$file: " . &html_quote($!);
|
||||
print <<EOF;
|
||||
Content-Type: text/html
|
||||
|
||||
<head><title>$file</title></head>
|
||||
<b>$_</b>
|
||||
EOF
|
||||
exit 1;
|
||||
}
|
||||
|
||||
$file = &html_quote($file);
|
||||
($dir = $file) =~ s@[^/]*$@@;
|
||||
|
||||
print <<EOF;
|
||||
Content-Type: text/html
|
||||
|
||||
<head><title>$file</title></head>
|
||||
<pre>
|
||||
EOF
|
||||
while (<FILE>) {
|
||||
$_ = &html_quote($_);
|
||||
|
||||
s/^(\#\s*include\s+)(\".*\"|\<\;.*\>\;)/$1 . &header_ref($2)/ge;
|
||||
|
||||
print;
|
||||
}
|
||||
close(FILE);
|
||||
print "</pre>\n";
|
||||
|
||||
sub header_ref {
|
||||
local($_) = @_;
|
||||
local($d);
|
||||
|
||||
if (s/^\"//) {
|
||||
s/\"$//;
|
||||
return ""<a href=\"$CGI$dir$_\">$_</a>"";
|
||||
}
|
||||
s/^\<\;//;
|
||||
s/\>\;$//;
|
||||
|
||||
for $d (
|
||||
"/usr/include",
|
||||
"/usr/local/include",
|
||||
"/usr/X11R6/include",
|
||||
"/usr/X11/include",
|
||||
"/usr/X/include",
|
||||
"/usr/include/X11"
|
||||
) {
|
||||
-f "$d/$_" && return "<<a href=\"$CGI$d/$_\">$_</a>>";
|
||||
}
|
||||
return $_;
|
||||
}
|
||||
|
||||
|
||||
sub html_quote {
|
||||
local($_) = @_;
|
||||
local(%QUOTE) = (
|
||||
'<', '<',
|
||||
'>', '>',
|
||||
'&', '&',
|
||||
'"', '"',
|
||||
);
|
||||
s/[<>&"]/$QUOTE{$&}/g;
|
||||
return $_;
|
||||
}
|
||||
|
||||
sub cleanup {
|
||||
local($_) = @_;
|
||||
|
||||
s@//+@/@g;
|
||||
s@/\./@/@g;
|
||||
while(m@/\.\./@) {
|
||||
s@^/(\.\./)+@/@;
|
||||
s@/[^/]+/\.\./@/@;
|
||||
}
|
||||
return $_;
|
||||
}
|
||||
53
scripts/w3mman/w3mman.1.in
Normal file
53
scripts/w3mman/w3mman.1.in
Normal file
@@ -0,0 +1,53 @@
|
||||
.TH W3MMAN 1 "Mar 14, 2002"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
.\" .nh disable hyphenation
|
||||
.\" .hy enable hyphenation
|
||||
.\" .ad l left justify
|
||||
.\" .ad b justify to both left and right margins
|
||||
.\" .nf disable filling
|
||||
.\" .fi enable filling
|
||||
.\" .br insert line break
|
||||
.\" .sp <n> insert n+1 empty lines
|
||||
.\" for manpage-specific macros, see man(7)
|
||||
.SH NAME
|
||||
w3mman \- an interface to the on-line reference manuals by w3m(1)
|
||||
.SH SYNOPSIS
|
||||
.B w3mman
|
||||
.RI "[-M " path ] " " [ section ] " page"
|
||||
.br
|
||||
.B w3mman
|
||||
.RI "[-M " path "] -k " keyword
|
||||
.SH DESCRIPTION
|
||||
.B w3mman
|
||||
is the system's manual pager by
|
||||
.BR w3m (1).
|
||||
.SH OPTIONS
|
||||
A summary of options is included below.
|
||||
.TP
|
||||
.BI \-M " path"
|
||||
Specify
|
||||
.I path
|
||||
as MANPATH.
|
||||
.TP
|
||||
.B \-k " keyword"
|
||||
Specify
|
||||
.I keyword.
|
||||
.SH ENVIRONMENT
|
||||
.TP
|
||||
.B W3MMAN_W3M
|
||||
If W3MMAN_W3M is set, its value is used instead of @W3M@.
|
||||
.TP
|
||||
.B W3MMAN_MAN
|
||||
If W3MMAN_MAN is set, its value is used instead of @MAN@.
|
||||
.SH FILES
|
||||
.TP
|
||||
.I @libexecdir@/@PACKAGE@/cgi-bin/w3mman2html.cgi
|
||||
convert manual page to html.
|
||||
.SH SEE ALSO
|
||||
.BR man (1),
|
||||
.BR w3m (1).
|
||||
.SH AUTHOR
|
||||
This manual page was written by Fumitoshi UKAI <ukai@debian.or.jp>,
|
||||
for the Debian GNU/Linux system (but may be used by others).
|
||||
41
scripts/w3mman/w3mman.in
Normal file
41
scripts/w3mman/w3mman.in
Normal file
@@ -0,0 +1,41 @@
|
||||
#!@PERL@
|
||||
|
||||
@W3M = split(' ', $ENV{'W3MMAN_W3M'} || '@W3M@');
|
||||
$ENV{'W3MMAN_MAN'} ||= '@MAN@';
|
||||
$SCRIPT = 'file:///$LIB/w3mman2html.cgi';
|
||||
|
||||
sub usage {
|
||||
($_ = $0) =~ s@.*/@@;
|
||||
print STDERR "$_ [-M <path>] [[<section>] <command>]\n";
|
||||
print STDERR "$_ [-M <path>] [-k <keyword>]\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
$query = "";
|
||||
while (@ARGV) {
|
||||
$_ = shift @ARGV;
|
||||
if (/^-M$/) {
|
||||
@ARGV || &usage();
|
||||
$ENV{'MANPATH'} = shift @ARGV;
|
||||
} elsif (/^-k$/) {
|
||||
@ARGV || &usage();
|
||||
$query = "?keyword=" . &form_encode(shift @ARGV);
|
||||
} elsif (/^-/) {
|
||||
&usage();
|
||||
} elsif (/^\d/ || $_ eq 'n') {
|
||||
@ARGV || &usage();
|
||||
$query = "?quit=ok&man=" . &form_encode(shift @ARGV);
|
||||
$query .= "§ion=" . &form_encode($_);
|
||||
} else {
|
||||
$query = "?quit=ok&man=" . &form_encode($_);
|
||||
}
|
||||
}
|
||||
|
||||
exec @W3M, "$SCRIPT$query";
|
||||
|
||||
sub form_encode {
|
||||
local($_) = @_;
|
||||
s/[\000-\040\+:#?&%<>"\177-\377]/sprintf('%%%02X', unpack('C', $&))/eg;
|
||||
return $_;
|
||||
}
|
||||
|
||||
274
scripts/w3mman/w3mman2html.cgi.in
Normal file
274
scripts/w3mman/w3mman2html.cgi.in
Normal file
@@ -0,0 +1,274 @@
|
||||
#!@PERL@
|
||||
|
||||
$MAN = $ENV{'W3MMAN_MAN'} || '@MAN@';
|
||||
$QUERY = $ENV{'QUERY_STRING'} || $ARGV[0];
|
||||
$SCRIPT_NAME = $ENV{'SCRIPT_NAME'} || $0;
|
||||
$CGI = "file://$SCRIPT_NAME";
|
||||
$CGI2 = "file:";
|
||||
# $CGI2 = "file:///\$LIB/hlink.cgi?";
|
||||
$SQUEEZE = 1;
|
||||
$ENV{'PAGER'} = 'cat';
|
||||
|
||||
if ($QUERY =~ /\=/) {
|
||||
for (split('&', $QUERY)) {
|
||||
($v, $q) = split('=', $_, 2);
|
||||
$query{$v} = &form_decode($q);
|
||||
}
|
||||
} else {
|
||||
$QUERY =~ s/^man=//;
|
||||
$query{"man"} = &form_decode($QUERY);
|
||||
}
|
||||
|
||||
if (! $query{"man"}) {
|
||||
if ($query{"keyword"}) {
|
||||
$keyword = $query{"keyword"};
|
||||
$k = &html_quote($keyword);
|
||||
print <<EOF;
|
||||
Content-Type: text/html
|
||||
|
||||
<html>
|
||||
<head><title>man -k $k</title></head>
|
||||
<body>
|
||||
<h2>man -k <b>$k</b></h2>
|
||||
<ul>
|
||||
EOF
|
||||
$keyword =~ s:([^-\w\200-\377.,])::g;
|
||||
open(F, "$MAN -k $keyword 2> /dev/null |");
|
||||
@line = ();
|
||||
while(<F>) {
|
||||
chop;
|
||||
$_ = &html_quote($_);
|
||||
s/(\s+-.*)$//;
|
||||
$title = $1;
|
||||
s@(\w[\w.\-]*(\s*\,\s*\w[\w.\-]*)*)\s*(\([\dn]\w*\))@&keyword_ref($1, $3)@ge;
|
||||
print "<li>$_$title\n";
|
||||
}
|
||||
close(F);
|
||||
print <<EOF;
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
||||
exit;
|
||||
}
|
||||
print <<EOF;
|
||||
Content-Type: text/html
|
||||
|
||||
<html>
|
||||
<head><title>man</title></head>
|
||||
<body>
|
||||
<form action="$CGI">
|
||||
<table>
|
||||
<tr><td>Manual:<td><input name=man>
|
||||
<tr><td>Section:<td><input name=section>
|
||||
<tr><td>Keyword:<td><input name=keyword>
|
||||
<tr><td><td><input type=submit> <input type=reset>
|
||||
</table>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
||||
exit;
|
||||
}
|
||||
|
||||
$man = $query{"man"};
|
||||
if ($man =~ s/\((\w+)\)$//) {
|
||||
$section = $1;
|
||||
$man_section = "$man($1)";
|
||||
} elsif ($query{"section"}) {
|
||||
$section = $query{"section"};
|
||||
$man_section = "$man($section)";
|
||||
} else {
|
||||
$section = "";
|
||||
$man_section = "$man";
|
||||
}
|
||||
|
||||
$section =~ s:([^-\w\200-\377.,])::g;
|
||||
$man =~ s:([^-\w\200-\377.,])::g;
|
||||
open(F, "$MAN $section $man 2> /dev/null |");
|
||||
$ok = 0;
|
||||
undef $header;
|
||||
$blank = -1;
|
||||
$cmd = "";
|
||||
$prev = "";
|
||||
while(<F>) {
|
||||
if (! defined($header)) {
|
||||
/^\s*$/ && next;
|
||||
$header = $_;
|
||||
$space = $header;
|
||||
chop $space;
|
||||
$space =~ s/\S.*//;
|
||||
} elsif ($_ eq $header) { # delete header
|
||||
$blank = -1;
|
||||
next;
|
||||
} elsif (!/\010/ && /^$space[\w\200-\377].*\s\S/o) { # delete footer
|
||||
$blank = -1;
|
||||
next;
|
||||
}
|
||||
if ($SQUEEZE) {
|
||||
if (/^\s*$/) {
|
||||
$blank || $blank++;
|
||||
next;
|
||||
} elsif ($blank) {
|
||||
$blank > 0 && print "\n";
|
||||
$blank = 0;
|
||||
}
|
||||
}
|
||||
|
||||
s/\&/\&/g;
|
||||
s/\</\</g;
|
||||
s/\>/\>/g;
|
||||
|
||||
s@([\200-\377].)(\010{1,2}\1)+@<b>$1</b>@g;
|
||||
s@(\&\w+;|.)(\010\1)+@<b>$1</b>@g;
|
||||
s@__\010{1,2}((\<b\>)?[\200-\377].(\</b\>)?)@<u>$1</u>@g;
|
||||
s@_\010((\<b\>)?(\&\w+\;|.)(\</b\>)?)@<u>$1</u>@g;
|
||||
s@((\<b\>)?[\200-\377].(\</b\>)?)\010{1,2}__@<u>$1</u>@g;
|
||||
s@((\<b\>)?(\&\w+\;|.)(\</b\>)?)\010_@<u>$1</u>@g;
|
||||
s@.\010(.)@$1@g;
|
||||
|
||||
s@\</b\>\</u\>\<b\>_\</b\>\<u\>\<b\>@_@g;
|
||||
s@\</u\>\<b\>_\</b\>\<u\>@_@g;
|
||||
s@\</u\>\<u\>@@g;
|
||||
s@\</b\>\<b\>@@g;
|
||||
|
||||
if (! $ok) {
|
||||
/^No/ && last;
|
||||
print <<EOF;
|
||||
Content-Type: text/html
|
||||
|
||||
<html>
|
||||
<head><title>man $man_section</title></head>
|
||||
<body>
|
||||
<pre>
|
||||
EOF
|
||||
print;
|
||||
$ok = 1;
|
||||
next;
|
||||
}
|
||||
|
||||
s@(http|ftp)://[\w.\-/~]+[\w/]@<a href="$&">$&</a>@g;
|
||||
s@(\W)(mailto:)?(\w[\w.\-]*\@\w[\w.\-]*\.[\w.\-]*\w)@$1<a href="mailto:$3">$2$3</a>@g;
|
||||
s@(\W)(\~?/[\w.][\w.\-/~]*)@$1 . &file_ref($2)@ge;
|
||||
s@(include(<\/?[bu]\>|\s)*\<)([\w.\-/]+)@$1 . &include_ref($3)@ge;
|
||||
if ($prev && m@^\s*(\<[bu]\>)*(\w[\w.\-]*)(\</[bu]\>)*(\([\dm]\w*\))@) {
|
||||
$cmd .= "$2$4";
|
||||
$prev =~ s@(\w[\w.\-]*-)((\</[bu]\>)*\s*)$@<a href="$CGI?$cmd">$1</a>$2@;
|
||||
print $prev;
|
||||
$prev = '';
|
||||
s@^(\s*(\<[bu]\>)*)(\w[\w.\-]*)@@;
|
||||
print "$1<a href=\"$CGI?$cmd\">$3</a>";
|
||||
} elsif ($prev) {
|
||||
print $prev;
|
||||
$prev = '';
|
||||
}
|
||||
s@(\w[\w.\-]*)((\</[bu]\>)*)(\([\dm]\w*\))@<a href="$CGI?$1$4">$1</a>$2$4@g;
|
||||
if (m@(\w[\w.\-]*)-(\</[bu]\>)*\s*$@) {
|
||||
$cmd = $1;
|
||||
$prev = $_;
|
||||
next;
|
||||
}
|
||||
print;
|
||||
}
|
||||
if ($prev) {
|
||||
print $prev;
|
||||
}
|
||||
close(F);
|
||||
if (! $ok) {
|
||||
if ($query{'quit'}) {
|
||||
print STDERR "No manual entry for $man_section.\n";
|
||||
print <<EOF;
|
||||
w3m-control: EXIT
|
||||
EOF
|
||||
exit 1;
|
||||
}
|
||||
print <<EOF;
|
||||
Content-Type: text/html
|
||||
|
||||
<html>
|
||||
<head><title>man $man_section</title></head>
|
||||
<body>
|
||||
<pre>
|
||||
EOF
|
||||
print "No manual entry for <B>$man_section</B>.\n";
|
||||
}
|
||||
print <<EOF;
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
||||
|
||||
sub is_command {
|
||||
local($_) = @_;
|
||||
local($p);
|
||||
|
||||
(! -d && -x) || return 0;
|
||||
if (! defined(%PATH)) {
|
||||
for $p (split(":", $ENV{'PATH'})) {
|
||||
$p =~ s@/+$@@;
|
||||
$PATH{$p} = 1;
|
||||
}
|
||||
}
|
||||
s@/[^/]*$@@;
|
||||
return defined($PATH{$_});
|
||||
}
|
||||
|
||||
sub file_ref {
|
||||
local($_) = @_;
|
||||
|
||||
if (&is_command($_)) {
|
||||
($man = $_) =~ s@.*/@@;
|
||||
return "<a href=\"$CGI?$man\">$_</a>";
|
||||
}
|
||||
if (/^\~/ || -f || -d) {
|
||||
return "<a href=\"$CGI2$_\">$_</a>";
|
||||
}
|
||||
return $_;
|
||||
}
|
||||
|
||||
sub include_ref {
|
||||
local($_) = @_;
|
||||
local($d);
|
||||
|
||||
for $d (
|
||||
"/usr/include",
|
||||
"/usr/local/include",
|
||||
"/usr/X11R6/include",
|
||||
"/usr/X11/include",
|
||||
"/usr/X/include",
|
||||
"/usr/include/X11"
|
||||
) {
|
||||
-f "$d/$_" && return "<a href=\"$CGI2$d/$_\">$_</a>";
|
||||
}
|
||||
return $_;
|
||||
}
|
||||
|
||||
sub keyword_ref {
|
||||
local($_, $s) = @_;
|
||||
local(@a) = ();
|
||||
|
||||
for (split(/\s*,\s*/)) {
|
||||
push(@a, "<a href=\"$CGI?$_$s\">$_</a>");
|
||||
}
|
||||
return join(", ", @a) . $s;
|
||||
}
|
||||
|
||||
sub html_quote {
|
||||
local($_) = @_;
|
||||
local(%QUOTE) = (
|
||||
'<', '<',
|
||||
'>', '>',
|
||||
'&', '&',
|
||||
'"', '"',
|
||||
);
|
||||
s/[<>&"]/$QUOTE{$&}/g;
|
||||
return $_;
|
||||
}
|
||||
|
||||
sub form_decode {
|
||||
local($_) = @_;
|
||||
s/\+/ /g;
|
||||
s/%([\da-f][\da-f])/pack('c', hex($1))/egi;
|
||||
return $_;
|
||||
}
|
||||
|
||||
0
scripts/xface2xbm.in
Normal file
0
scripts/xface2xbm.in
Normal file
94
scripts/xface2xpm.in
Normal file
94
scripts/xface2xpm.in
Normal file
@@ -0,0 +1,94 @@
|
||||
#!@PERL@
|
||||
|
||||
$USAGE = "xface2xpm [-t] [-fg <color>] [-bg <color>] [<file>]";
|
||||
|
||||
# compface/uncompface
|
||||
# ftp://metalab.unc.edu/pub/Linux/apps/graphics/convert/
|
||||
$UNCOMPFACE = "uncompface";
|
||||
|
||||
$T = "c";
|
||||
$BG = "white";
|
||||
$FG = "black";
|
||||
while (@ARGV) {
|
||||
$_ = shift @ARGV;
|
||||
if (/^-h/) {
|
||||
&usage(0);
|
||||
} elsif (/^-t/) {
|
||||
$T = "s";
|
||||
$BG = "none";
|
||||
} elsif (/^-bg/) {
|
||||
@ARGV || &usage(1);
|
||||
$BG = shift @ARGV;
|
||||
} elsif (/^-fg/) {
|
||||
@ARGV || &usage(1);
|
||||
$FG = shift @ARGV;
|
||||
} elsif (/^-./) {
|
||||
&usage(1);
|
||||
} else {
|
||||
unshift(@ARGV, $_);
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
$xf = "";
|
||||
while(<>) {
|
||||
# s/^X-Face://i if ($xf eq "");
|
||||
$xf .= $_;
|
||||
}
|
||||
|
||||
pipe(R, W2);
|
||||
pipe(R2, W);
|
||||
if (! fork()) {
|
||||
close(R);
|
||||
close(W);
|
||||
open(STDIN, "<&R2");
|
||||
open(STDOUT, ">&W2");
|
||||
exec $UNCOMPFACE;
|
||||
exit 1;
|
||||
}
|
||||
close(R2);
|
||||
close(W2);
|
||||
print W $xf;
|
||||
close(W);
|
||||
while(<R>) {
|
||||
while(s/0x(..)(..)//) {
|
||||
push(@bm, hex($1), hex($2));
|
||||
}
|
||||
}
|
||||
close(R);
|
||||
@bm || exit 1;
|
||||
|
||||
$W = 48;
|
||||
$H = @bm * 8 / $W; # must be 48
|
||||
print <<EOF;
|
||||
/* XPM */
|
||||
static char *xf[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"$W $H 2 1",
|
||||
" $T $BG",
|
||||
". c $FG",
|
||||
/* pixels */
|
||||
EOF
|
||||
while (@bm) {
|
||||
print "\"";
|
||||
for (1..6) {
|
||||
$x = shift @bm;
|
||||
for $i (1 .. 8) {
|
||||
print ((($x >> (8-$i)) & 1) ? "." : " ");
|
||||
}
|
||||
}
|
||||
print (@bm ? "\",\n" : "\"\n");
|
||||
}
|
||||
print <<EOF;
|
||||
};
|
||||
EOF
|
||||
|
||||
sub usage {
|
||||
local($err) = @_;
|
||||
if ($err) {
|
||||
print STDERR "$USAGE\n";
|
||||
} else {
|
||||
print "$USAGE\n";
|
||||
}
|
||||
exit $err;
|
||||
}
|
||||
Reference in New Issue
Block a user