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
 |