269 lines
3.6 KiB
Perl
Executable File
269 lines
3.6 KiB
Perl
Executable File
#!/usr/local/bin/perl
|
|
|
|
$QUERY = $ENV{'QUERY_STRING'};
|
|
$KEYMAP = "$ENV{'HOME'}/.w3m/keymap";
|
|
|
|
if ($QUERY) {
|
|
# &write_keymap($QUERY);
|
|
print <<EOF;
|
|
Content-Type: text/html
|
|
w3m-control: DELETE_PREVBUF
|
|
w3m-control: BACK
|
|
|
|
EOF
|
|
exit;
|
|
}
|
|
&init_func();
|
|
@key = ();
|
|
@func = ();
|
|
@data = ();
|
|
open(KEYMAP, $KEYMAP);
|
|
while (<KEYMAP>) {
|
|
s/^keymap\s+// || next;
|
|
(($k, $_) = &getQWord($_)) || next;
|
|
(($f, $_) = &getWord($_)) || next;
|
|
$FUNC_EXIST{$f} || next;
|
|
($d, $_) = &getQWord($_);
|
|
push(@key, $k);
|
|
push(@func, $f);
|
|
push(@data, $d);
|
|
}
|
|
close(KEYMAP);
|
|
|
|
$N = @key;
|
|
|
|
print <<EOF;
|
|
Content-Type: text/html
|
|
|
|
<head><title>Keymap Setting</title></head>
|
|
<h1>Keymap Setting</h1>
|
|
<form action="file:///\$LIB/keymap.cgi">
|
|
<table>
|
|
<tr><td> Key<td> Command<td> Argument
|
|
<tr><td><input name=k_$N size=6>
|
|
<td><select name=f_$N>
|
|
EOF
|
|
&print_func();
|
|
print <<EOF;
|
|
</select>
|
|
<td><input name=d_$N>
|
|
<td><input type=submit name=ok value=Ok>
|
|
<tr><td colspan=4><hr>
|
|
EOF
|
|
$i = 0;
|
|
while(@key) {
|
|
$k = &Q(shift @key);
|
|
$f = shift @func;
|
|
$d = &Q(shift @data);
|
|
print <<EOF;
|
|
<tr><td><input type=hidden name=k_$i value=\"$k\"> $k
|
|
<td><select name=f_$i>
|
|
EOF
|
|
&print_func($f);
|
|
print <<EOF;
|
|
</select>
|
|
<td><input name=d_$i value=\"$d\">
|
|
<td><input type=checkbox name=del_$i>Delete
|
|
EOF
|
|
$i++;
|
|
}
|
|
print <<EOF;
|
|
</table>
|
|
</form>
|
|
EOF
|
|
|
|
sub write_keymap {
|
|
local($query) = @_;
|
|
@key = ();
|
|
@func = ();
|
|
@data = ();
|
|
|
|
for $q (split('&', $query)) {
|
|
($_, $d) = split('=', $q);
|
|
if (s/^k_//) {
|
|
$key[$_] = $d;
|
|
} elsif (s/^f_//) {
|
|
$func[$_] = $d;
|
|
} elsif (s/^d_//) {
|
|
$data[$_] = $d;
|
|
} elsif (s/^del_//) {
|
|
$del[$_] = 1;
|
|
}
|
|
}
|
|
open(KEYMAP, "> ${KEYMAP}") || next;
|
|
while(@key) {
|
|
$k = &UQ(shift @key);
|
|
$f = shift @func;
|
|
$d = &UQ(shift @data);
|
|
($f =~ /^\w/) || next;
|
|
(shift @del) && next;
|
|
print KEYMAP "keymap\t$k\t$f";
|
|
if ($d ne '') {
|
|
if ($d =~ /[\"\'\\\s]/) {
|
|
$d =~ s/([\"\\])/\\$1/g;
|
|
print KEYMAP "\t\t\"$d\"";
|
|
} else {
|
|
$d =~ s/([\"\\])/\\$1/g;
|
|
print KEYMAP "\t\t$d";
|
|
}
|
|
}
|
|
print KEYMAP "\n";
|
|
}
|
|
close(KEYMAP);
|
|
}
|
|
|
|
sub UQ {
|
|
local($_) = @_;
|
|
s/\+/ /g;
|
|
s/%([\da-f][\da-f])/pack('c', hex($1))/egi;
|
|
return $_;
|
|
}
|
|
|
|
sub Q {
|
|
local($_) = @_;
|
|
s/\&/\&/g;
|
|
s/\</\</g;
|
|
s/\>/\>/g;
|
|
s/\"/\"/g;
|
|
return $_;
|
|
}
|
|
|
|
sub getQWord {
|
|
local($_) = @_;
|
|
local($x) = '';
|
|
s/^\s+//;
|
|
while($_ ne '') {
|
|
if (s/^\'(([^\'\\]|\\.)*)\'// ||
|
|
s/^\"(([^\"\\]|\\.)*)\"// ||
|
|
s/^([^\'\"\\\s]+)// || s/^\\(.)//) {
|
|
$x .= $1;
|
|
} else {
|
|
last;
|
|
}
|
|
}
|
|
return ($x, $_);
|
|
}
|
|
|
|
sub getWord {
|
|
local($_) = @_;
|
|
s/^\s+//;
|
|
s/^(\S+)// || return ();
|
|
return ($1, $_);
|
|
}
|
|
|
|
sub print_func {
|
|
local($f) = @_;
|
|
for(@FUNC_LIST) {
|
|
if ($f eq $_) {
|
|
print "<option selected>$_\n";
|
|
} else {
|
|
print "<option>$_\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
sub init_func {
|
|
@FUNC_LIST = ();
|
|
%FUNC_EXIST = ();
|
|
while(<DATA>) {
|
|
chop;
|
|
push(@FUNC_LIST, $_);
|
|
$FUNC_EXIST{$_} = 1;
|
|
}
|
|
}
|
|
|
|
__END__
|
|
- - - - - - -
|
|
ABORT
|
|
ADD_BOOKMARK
|
|
BACK
|
|
BEGIN
|
|
BOOKMARK
|
|
CENTER_H
|
|
CENTER_V
|
|
COOKIE
|
|
DELETE_PREVBUF
|
|
DICT_WORD
|
|
DICT_WORD_AT
|
|
DOWN
|
|
DOWNLOAD
|
|
EDIT
|
|
EDIT_SCREEN
|
|
END
|
|
ESCBMAP
|
|
ESCMAP
|
|
EXEC_SHELL
|
|
EXIT
|
|
EXTERN
|
|
EXTERN_LINK
|
|
FRAME
|
|
GOTO
|
|
GOTO_LINE
|
|
GOTO_LINK
|
|
HELP
|
|
HISTORY
|
|
INFO
|
|
INIT_MAILCAP
|
|
INTERRUPT
|
|
LEFT
|
|
LINE_BEGIN
|
|
LINE_END
|
|
LINE_INFO
|
|
LINK_BEGIN
|
|
LINK_END
|
|
LOAD
|
|
MAIN_MENU
|
|
MARK
|
|
MARK_MID
|
|
MARK_URL
|
|
MENU
|
|
MOUSE
|
|
MOUSE_TOGGLE
|
|
MOVE_DOWN
|
|
MOVE_LEFT
|
|
MOVE_RIGHT
|
|
MOVE_UP
|
|
NEXT_LINK
|
|
NEXT_MARK
|
|
NEXT_PAGE
|
|
NEXT_WORD
|
|
NOTHING
|
|
NULL
|
|
OPTIONS
|
|
PCMAP
|
|
PEEK
|
|
PEEK_LINK
|
|
PIPE_SHELL
|
|
PREV_LINK
|
|
PREV_MARK
|
|
PREV_PAGE
|
|
PREV_WORD
|
|
PRINT
|
|
QUIT
|
|
READ_SHELL
|
|
REDRAW
|
|
REG_MARK
|
|
RELOAD
|
|
RIGHT
|
|
SAVE
|
|
SAVE_IMAGE
|
|
SAVE_LINK
|
|
SAVE_SCREEN
|
|
SEARCH
|
|
SEARCH_BACK
|
|
SEARCH_FORE
|
|
SEARCH_NEXT
|
|
SEARCH_PREV
|
|
SELECT
|
|
SHELL
|
|
SHIFT_LEFT
|
|
SHIFT_RIGHT
|
|
SOURCE
|
|
SUSPEND
|
|
UP
|
|
VIEW
|
|
VIEW_BOOKMARK
|
|
VIEW_IMAGE
|
|
WHEREIS
|
|
WRAP_TOGGLE
|