# ================================================================== # Gossamer Threads Module Library - http://gossamer-threads.com/ # # GT::HTML::Primitives # Author : Aki Mimoto # $Id: Primitives.pm,v 1.3 2002/06/20 21:12:23 aki Exp $ # # Copyright (c) 2002 Gossamer Threads Inc. All Rights Reserved. # ================================================================== # # Description: # package HTML; # ================================================================== use strict; use vars qw/ @ISA $ATTRIBS @EXPORT_OK %EXPORT_TAGS $HTML_ESC_RE /; use Exporter; use GT::Template; @ISA = qw( Exporter ); @EXPORT_OK = qw( text textarea hidden submit reset password button radio file checkbox select form_start form_end attrs ); %EXPORT_TAGS = ( all => [ @EXPORT_OK ] ); $HTML_ESC_RE = q|(["'<>()&])|; sub file{ # -------------------------------------------------- @_ or return; my $attrs = ref $_[0] ? shift : {@_}; $attrs->{value} ||= GT::Template->tags()->{$attrs->{name}}; return qq|'; } sub text { # -------------------------------------------------- @_ or return; my $attrs = ref $_[0] ? shift : {@_}; $attrs->{value} ||= GT::Template->tags()->{$attrs->{name}}; return qq|'; } sub textarea { # -------------------------------------------------- @_ or return; my $attrs = ref $_[0] ? shift : {@_}; $attrs->{value} ||= GT::Template->tags()->{$attrs->{name}}; my $value = html_escape( $attrs->{value} ); return qq|' . $value . ''; } sub hidden { # -------------------------------------------------- @_ or return; my $attrs = ref $_[0] ? shift : {@_}; $attrs->{value} ||= GT::Template->tags()->{$attrs->{name}}; return qq|'; } sub submit { # -------------------------------------------------- @_ or return; my $attrs = ref $_[0] ? shift : {@_}; $attrs->{value} ||= GT::Template->tags()->{$attrs->{name}}; return qq|'; } sub reset { # -------------------------------------------------- @_ or return; my $attrs = ref $_[0] ? shift : {@_}; $attrs->{value} ||= GT::Template->tags()->{$attrs->{name}}; return qq|'; } sub password { # -------------------------------------------------- @_ or return; my $attrs = ref $_[0] ? shift : {@_}; $attrs->{value} ||= GT::Template->tags()->{$attrs->{name}}; return qq|'; } sub button { # -------------------------------------------------- @_ or return; my $attrs = ref $_[0] ? shift : {@_}; $attrs->{value} ||= GT::Template->tags()->{$attrs->{name}}; return qq|'; } sub radio { # -------------------------------------------------- # $obj->radio( $item ); # @_ or return; my $attrs = ref $_[0] ? shift : {@_}; my $selected ||= GT::Template->tags()->{$attrs->{name}}; unless ( exists $attrs->{'-checked'} ) { my $values; if ( ref $selected eq 'ARRAY' ) { $values = {map {($_=>1)} @$selected}; } elsif ( ref $selected eq 'HASH' ) { $values = $selected; } elsif (! ref $selected ) { $values = { $selected => 1 }; } if ( $values ) { $attrs->{'-checked'} = exists $values->{$attrs->{value}} ? 1 : 0; } } my $checked = $attrs->{'-checked'} ? ' checked' : ''; return qq|'; } sub checkbox { # -------------------------------------------------- # $obj->checkbox( $item ); # @_ or return; my $attrs = ref $_[0] ? shift : {@_}; my $selected ||= GT::Template->tags()->{$attrs->{name}}; unless ( exists $attrs->{'-checked'} ) { my $values; if ( ref $selected eq 'ARRAY' ) { $values = {map {($_=>1)} @$selected}; } elsif ( ref $selected eq 'HASH' ) { $values = $selected; } elsif (! ref $selected ) { $values = { $selected => 1 }; } if ( $values ) { $attrs->{'-checked'} = exists $values->{$attrs->{value}} ? 1 : 0; } } my $checked = $attrs->{'-checked'} ? ' checked' : ''; return qq|'; } sub select { # -------------------------------------------------- # $obj->select( $item ); # @_ or return; my $attrs = ref $_[0] ? shift : {@_}; my $options = $attrs->{'-options'} or return; my $order = $attrs->{'-order'}; $attrs->{selected} ||= GT::Template->tags()->{$attrs->{name}}; my $selected = shift || $attrs->{'-selected'} || {}; if ( ref $selected eq 'ARRAY' ) { $selected = {map {($_=>1)} @$selected }; } my $item_str = '{'-multiple'} ? ' multiple' : '' ) . '>'; my ( $value, $seld ); foreach my $option ( ref $order ? @$order : ( sort keys %$options ) ) { $value = $options->{$option}; $seld = ( exists $selected->{$option} and $selected->{$option} ) ? ' selected' : ''; $item_str .= qq||; } $item_str .= ''; return $item_str; } sub form_start { # -------------------------------------------------- @_ or return; my $attrs = ref $_[0] ? shift : {@_}; my $action = $attrs->{action} || $attrs->{value}; return qq|
1,action=>1,value=>1}) . '>'; } sub form_end { # -------------------------------------------------- return "
"; } sub attrs { # -------------------------------------------------- my $attrs = shift or return ''; my $skip = shift; my $attr_str = ''; foreach my $attr_key ( keys %$attrs ) { next unless ( $attr_key =~ /^[^\W_]+$/ ); next if ( $skip and $skip->{$attr_key} ); next if ( ref $attrs->{$attr_key} ); my $value = defined $attrs->{$attr_key} ? $attrs->{$attr_key} : ''; # the following methods extracted out for the sake of speed $attr_key =~ s/$HTML_ESC_RE/"&#".ord($1).";"/geo; $value =~ s/$HTML_ESC_RE/"&#".ord($1).";"/geo; $attr_str .= qq| $attr_key="$value"|; } return $attr_str; } sub html_escape { # -------------------------------------------------- $_[0] =~ s/$HTML_ESC_RE/"&#".ord($1).";"/geo; return $_[0]; } 1;