package HTML::Element; use strict; use warnings; use base 'Exporter'; our @EXPORT_OK = qw(title script heading anchor paragraph sparagraph list definition_list table form fieldset legend label selection input textarea div pre); use HTML::Entities qw(encode_entities); use Base::Data qw(data_file get_hash); use Base::Nifty qw(sline line); my @ics = ('id','class','style'); my @java = qw(onclick ondblclick onkeypress onkeydown onkeyup onmouseover onmousedown onmouseup onmousemove onmouseout); sub get_attributes { my ($options, $valid) = @_; my @attributes; for (@{$valid}) { my $value = $options->{$_}; push @attributes, qq($_="$value") if defined($options->{$_}); } return join(' ',('',@attributes)); } sub open_tag { my ($tag,$opt,$attributes) = @_; my $tag_attributes = get_attributes($opt,$attributes); return $tag.$tag_attributes; } sub plain_element { my ($tag,$attributes,$tab,$value,$opt) = @_; my $open = open_tag($tag,$opt,$attributes); return sline($tab,"<$open>$value"); } # Start elements sub anchor { my ($value,$opt) = @_; my $tag = 'a'; my $open = open_tag($tag,$opt,['href','target','title',@ics,@java]); return "<$open>$value"; } sub title { my ($tab,$value,$opt) = @_; my $tag = 'title'; my $open = $tag; line($tab,"<$open>$value"); } sub script { my ($tab,$opt) = @_; my $tag = 'script'; my $open = open_tag($tag,$opt,['type','src']); line($tab,"<$open>"); } sub heading { my ($tab,$level,$value,$opt) = @_; my $tag = 'h'.$level; print plain_element($tag,[@ics,@java],$tab,$value,$opt); } # Begin paragraphs sub sparagraph { my ($tab,$value,$opt) = @_; my $tag = 'p'; my $open = open_tag($tag,$opt,[@ics,@java]); my $sep = $opt->{separator} ? $opt->{separator} : "\n"; my $line; for (grep(length,split(/$sep/,$value))) { $line .= sline($tab,qq(<$open>)); $line .= sline($tab + 1,$_); $line .= sline($tab,qq()); } return $line; } sub paragraph { print sparagraph(@_); } # End paragraphs # Begin elements for ordered and unordered lists. sub item { my ($tab,$value,$opt) = @_; my $tag = 'li'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,qq(<$open>)); line($tab + 1,$value); if ($opt->{inlist}) { list($tab + 1, @{$opt->{inlist}}); } line($tab,qq()); } sub list { my ($tab,$type,$list,$opt) = @_; my $tag = $type.'l'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,qq(<$open>)); for my $item (@$list) { if (ref($item) eq 'ARRAY') { item($tab + 1,$item->[0],$item->[1]); } else { item($tab + 1,$item); } } line($tab,qq()); } # End elements for ordered and unordered lists. # Begin elements for definition lists. sub term { print plain_element('dt',[@ics,@java],@_); } sub definition { my ($tab,$value,$opt) = @_; my $tag = 'dd'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,qq(<$open>)); line($tab + 1,$value); line($tab,qq()); } # I will be rewriting definition_list to get rid of the data gathering within it. sub definition_list { my ($tab,$opt) = @_; my $tag = 'dl'; my $open = open_tag($tag,$opt,[@ics,@java]); my %definition_list = get_hash( file => $opt->{file} ? $opt->{file} : data_file, headings => [@{$opt->{headings}}], sorted => 'yes', ); line($tab,qq(<$open>)); my $term = shift @{$opt->{headings}}; for my $term (sort {$definition_list{$a}{sort_number} <=> $definition_list{$b}{sort_number}} keys %definition_list) { term($tab + 1,$term); if (@{$opt->{headings}} == 1) { definition($tab + 2,$definition_list{$term}{$opt->{headings}->[0]}); } else { for my $heading (@{$opt->{headings}}) { my $upheading = ucfirst $heading; definition($tab + 2,qq($upheading: ).encode_entities($definition_list{$term}{$heading})); } } } line($tab,qq()); } # End elements for definition lists. # Begin elemeents for tables. sub caption { print plain_element('caption',['align',@ics,@java],@_); } sub cell { my ($tab,$type,$value,$opt) = @_; $type = $opt->{type_override} ? $opt->{type_override} : $type; my $tag = 't'.$type; my $open = open_tag($tag,$opt,['colspan','rowspan',@ics,@java]); line($tab,qq(<$open>)); if ($value eq 'list') { list($tab + 1,@{$opt->{list}}); } else { line($tab + 1,$value); } line($tab,qq()); } sub row { my ($tab,$type,$cells,$opt) = @_; my $tag = 'tr'; my $open = open_tag($tag,$opt,[@ics,@java]); my %types = ( header => 'h', data => 'd', whead => 'd' ); line($tab,qq(<$open>)); if ($type eq 'whead') { my $cell = shift @{$cells}; if (ref($cell) eq 'ARRAY') { cell($tab + 1,'h',ucfirst $cell->[0], { class => 'row_header', $cell->[1] }); } else { cell($tab + 1,'h',ucfirst $cell, { class => 'row_header' }); } } my $cell_type = $types{$type}; for my $cell (@{$cells}) { if (ref($cell) eq 'ARRAY') { cell($tab + 1,$cell_type,$cell->[0],$cell->[1]); } else { cell($tab + 1,$cell_type,$cell); } } line($tab,qq()); } sub col { my ($tab,$opt) = @_; my $tag = 'col'; my $open = open_tag($tag,$opt,['span',@ics,@java]); line($tab,qq(<$open>)); } sub cols { my ($tab,$cols) = @_; col($tab,$_) for @{$cols}; } sub table { my ($tab,$opt) = @_; my $tag = 'table'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,qq(<$open>)); if ($opt->{caption}) { if (ref($opt->{caption}) eq 'ARRAY') { caption($tab + 1, $opt->{caption}->[0],$opt->{caption}->[1]); } else { caption($tab + 1, $opt->{caption}); } } if ($opt->{cols}) { col($tab + 1, $_) for @{$opt->{cols}}; } for my $rowgroup (@{$opt->{rows}}) { my $type = $rowgroup->[0]; my @rows = $rowgroup->[1]; my $attributes = $rowgroup->[2]; if ($type eq 'header') { row($tab + 1, $type , @rows, $attributes); } else { for my $row (@rows) { row($tab + 1, $type , $_, $attributes) for @$row; } } } line($tab,qq()); } # End elements for tables. # Start elements for forms. sub label { print plain_element('label',['for',@ics,@java],@_); } sub option { print plain_element('option',['value',@ics,@java],@_); } sub selection { my ($tab,$options,$opt) = @_; my $tag = 'select'; my $open = open_tag($tag,$opt,['name','multiple',@ics,@java]); label($tab,@{$opt->{label}}) if ($opt->{label} && $opt->{place_label} eq 'before'); line($tab,qq(<$open>)); for (@$options) { option($tab + 1,@$_); } line($tab,qq()); label($tab,@{$opt->{label}}) if ($opt->{label} && $opt->{place_label} eq 'after'); } sub textarea { my ($tab,$value,$opt) = @_; my $tag = 'textarea'; my $open = open_tag($tag,$opt,['name','rows','cols',@ics,@java]); label($tab,@{$opt->{label}}) if ($opt->{label} && $opt->{place_label} eq 'before'); line($tab,"<$open>$value"); label($tab,@{$opt->{label}}) if ($opt->{label} && $opt->{place_label} eq 'after'); } # I have to rewrite input so it can print a list of inputs for check boxes and radio boxes. sub input { my ($tab,$opt) = @_; my $tag = 'input'; my $open = open_tag($tag,$opt,['type','value','name',@ics,@java]); my $text = $opt->{text} ? "$opt->{text} " : ''; label($tab,@{$opt->{label}}) if ($opt->{label} && $opt->{place_label} eq 'before'); line($tab,"$text<$open>"); label($tab,@{$opt->{label}}) if ($opt->{label} && $opt->{place_label} eq 'after'); } sub legend { print plain_element('legend',[@ics,@java],@_); } sub fieldset { my ($tab,$code,$opt) = @_; my $tag = 'fieldset'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,qq(<$open>)); legend($tab,$opt->{legend}) if $opt->{legend}; &$code; line($tab,qq()); } sub form { my ($tab,$code,$opt) = @_; my $tag = 'form'; my $open = open_tag($tag,$opt,['action','method',@ics,@java]); line($tab,qq(<$open>)); &$code; line($tab,qq()); } # End elements for forms. sub div { my ($tab,$code,$opt) = @_; my $tag = 'div'; my $open = open_tag($tag,$opt,[@ics,@java]); line($tab,qq(<$open>)); &$code; line($tab,qq()); } sub pre { my ($tab,$code) = @_; line(0,'
');
  &$code;
  line(0,'
'); } # End elements =head1 NAME B generates HTML tags for most of the HTML elements. =head1 SYNOPSIS To use B to print HTML tags, use the following. use Base::HTML::Element qw( title heading script anchor paragraph sparagraph list definition_list table form fieldset selection input textarea div pre ); =head1 ELEMENTS All of the functions C the elements with the exception of C which returns the anchor and C which returns a paragraph for use in other functions. As with the Perl community, the HTML community expects some indentation so tabs, the first parameter of every function, are included with each element except where noted. The last parameter of every element is a hash with named options except where noted. Most elements have the C, C, C