![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
use CGI::Imagemap; $map = new CGI::Imagemap; $map->setmap(@map); $action = $map->action($x,$y); -- or --
use CGI::Imagemap 'action_map'; $action = action_map($x,$y,@map);
The imagemap file follows that of the NCSA imagemap program. Each point is an x,y tuple. Each line in the map consists of one of the following formats. Comment lines start with ``#''.
circle action center edgepoint rect action upperleft lowerright point action point poly action point1 point2 ... pointN default action
Using ``point'' and ``default'' in the same map makes no sense. If ``point'' is used, the action for the closest one is selected.
To use CGI::Imagemap, define an image submit map on your form with something like:
<input type=image name=mv_todo SRC="image_url">
You can pass a ``client-side'' imagemap like this:
<input type="hidden" name="todo.map" value="rect action1 0,0 25,20"> <input type="hidden" name="todo.map" value="rect action2 26,0 50,20"> <input type="hidden" name="todo.map" value="rect action3 51,0 75,20"> <input type="hidden" name="todo.map" value="default action0">
If the @map
passed parameter contains a NUL (\0) in the first
array position, the map is assumed to be null-separated and
@map
is built by splitting it. This allows a null-separated
todo.map with multiple values (parsed by a cgi-lib.pl or the like) to be
referenced.
All of the following examples assume the above definitions in your form.
use CGI::Imagemap qw(action_map map_untaint);
$query = new CGI; my $x = $query->param('todo.x'); my $y = $query->param('todo.y'); my $map = $query->param('todo.map'); $action = action_map($x, $y, $map);
If you are using the old cgi-lib.pl library, which places multiple instances of the same form variable in a scalar, separated by null (\0) characters, you can do this:
ReadParse(*FORM); my $x = $FORM{'todo.x'}; my $y = $FORM{'todo.y'}; my $map = $FORM{'todo.map'}; $action = action_map($x, $y, $map);
map_untaint(1)
to set map untainting on a global
basis. (If using class methods, each has its own instance of untainting).
It ensures all characters in the action fit pattern of [-\w.+@]+, meaning alphnumerics, underscores, dashes (-), periods, and the @ sign. It also checks the methods (rect,poly,point,default,circle) and ensures that points/tuples are only integers. Once that is done, it untaints the passed form variables.
map_untaint(1); # Turns on untainting map_untaint('yes');# Same as above
map_untaint(0); # Disable untainting map_untaint('no'); # Same as above $status = map_untaint(); # Get status
Default is no untainting.
use CGI::Form; use CGI::Imagemap;
$query = new CGI::Form; $map = new CGI::Imagemap;
$map = new CGI::Imagemap; $map->setmap($query->param('todo.map'));
$map->addmap('point action5 3,9'));
$x = $query->param('todo.x'); $y = $query->param('todo.y'); $action = $map->action($x, $y);
$map->untaint(1); # Turns on untainting $map->untaint('yes'); # Same as above $map->untaint(1); # Disables untainting $map->untaint('yes'); # Same as above $status = $map->untaint(); # Get status
testmap - Uses the CGI::Form module testmap.old - Uses the old cgi-lib.pl
$CommentsMailTo = "perl5@dcs.ed.ac.uk"; include("../syssies_footer.inc");?>