################################################## ## This module is not Object Oriented ## It merely contains general utility subroutines used ## in DLPS middleware package DlpsUtils; use Exporter ( ); @ISA = qw( Exporter ); @EXPORT = qw( SortUniquifyList PrintStringToFile TrimSpaces errorBail GetParallelHash Min Max GetHtmlTemplateText OutputHtmlPage OutputMimeTypedPage StartHtmlPage FinishPage SetupHtmlDebugging CollectionResolution Flatten8bitChars SimpleHtmlFilter CleanResidualTags FilterCharEnts_All GetIntersection GetNWayIntersection CleanCgiParameters FindHostName StartSession BuildPullDown BuildSelect BuildTextInput ); use CGI; use DlpsSession; # ---------------------------------------------------------------------- # NAME : Flatten8bitChars # PURPOSE : obvious # CALLED BY : ANY # CALLS : NONE # INPUT : scalar # RETURNS : scalar flattened # GLOBALS : NONE # SIDE-EFFECTS : NONE # NOTES : # ---------------------------------------------------------------------- sub Flatten8bitChars { my $w = shift; $w =~ tr/ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåçèéêëìíîïñòóôõöøùúûüý>/aaaaaaceeeeiiiinoooooouuuuysaaaaaaceeeeiiiinoooooouuuuyy/; return $w; } # ---------------------------------------------------------------------- # NAME : Max # PURPOSE : obvious # CALLED BY : ANY # CALLS : NONE # INPUT : 2 scalar values which can be compared numerically # RETURNS : the Max of the two values # GLOBALS : NONE # SIDE-EFFECTS : NONE # NOTES : # ---------------------------------------------------------------------- sub Max { my ( $a, $b ) = @_; return $b if ( $b > $a ); return $a; } # ---------------------------------------------------------------------- # NAME : Min # PURPOSE : obvious # CALLED BY : ANY # CALLS : NONE # INPUT : 2 scalar values which can be compared numerically # RETURNS : the Min of the two values # GLOBALS : NONE # SIDE-EFFECTS : NONE # NOTES : # ---------------------------------------------------------------------- sub Min { my ( $a, $b ) = @_; return $b if ( $b < $a ); return $a; } # ---------------------------------------------------------------------- # NAME : GetAuthListFromENV # PURPOSE : concat the restricted and public envvars, strip '-dev' # and split into a list # CALLED BY : ANY # CALLS : NONE # INPUT : NONE # RETURNS : list of authorized collections # GLOBALS : $ENV # SIDE-EFFECTS : NONE # NOTES : -dev is for development # ---------------------------------------------------------------------- sub GetAuthListFromENV { my $env = $ENV{'AUTHZD_COLL'} . $ENV{'PUBLIC_COLL'}; $env =~ s,-dev,,g; $env =~ s,^[\s:],,; $env =~ s,[\s:]$,,; return split( /:/, $env ); } # ---------------------------------------------------------------------- # NAME : SortUniquifyList # PURPOSE : sort and uniq any list (alphabetically by default, # numerically if any second param with any value at all is passed in) # CALLED BY : ANY # CALLS : NONE # INPUT : reference to an array # RETURNS : NONE # GLOBALS : # SIDE-EFFECTS : changes array via reference # NOTES : # ---------------------------------------------------------------------- sub SortUniquifyList { my ( $aRef, $numeric ) = @_; my %hash; foreach my $item ( @$aRef ) { $hash{$item}++; } if ( defined ( $numeric ) ) { @$aRef = sort { $a <=> $b } ( keys %hash ); } else { @$aRef = sort ( keys %hash ); } } # ---------------------------------------------------------------------- # NAME : OutputHtmlPage # PURPOSE : # # CALLED BY : # CALLS : # INPUT : ref to string of entire html to print # RETURNS : NONE # GLOBALS : # SIDE-EFFECTS : prints to STDOUT # NOTES : # ---------------------------------------------------------------------- sub OutputHtmlPage { my $sRef = shift ; # print out html header print &CGI::header( -type => 'text/html' ); # mod_perl version of same ( not sure this will be ever be needed ) # $gReq->content_type( 'text/html' ); # $gReq->send_http_header; # return "OK" if $gReq->header_only; print $$sRef; } # ---------------------------------------------------------------------- # NAME : OutputMimeTypedPage # PURPOSE : # # CALLED BY : # CALLS : # INPUT : ref to string of entire content to print, mime type, # and value for "expires" (usually 'now') # RETURNS : NONE # GLOBALS : # SIDE-EFFECTS : prints to STDOUT # NOTES : # ---------------------------------------------------------------------- sub OutputMimeTypedPage { my ( $sRef, $mimeType ) = @_; # print out header print &CGI::header( -type => $mimeType, -expires => 'now' ); # print page print $$sRef; } # ---------------------------------------------------------------------- # NAME : DumpEnvVars # PURPOSE : print HTML dump of all environment variables # CALLED BY : debugging routines # CALLS : # INPUT : # RETURNS : NONE # NOTES : # ---------------------------------------------------------------------- sub DumpEnvVars { my $s = ''; $s .= q{} . &CGI::h2(qq{ENVIRONMENT VARIABLES}) . q{}; foreach my $key (sort keys %ENV) { $s .= qq{$key  } . qq{$ENV{$key}
\n}; } return ( $s ); } # ---------------------------------------------------------------------- # NAME : errorBail # PURPOSE : an enhanced bail function # CALLED BY : various # CALLS : # INPUT : zero or more strings to be printed as error messages to # the web browser # RETURNS : NONE # NOTES : # ---------------------------------------------------------------------- sub errorBail { my( @errors ) = @_; my $s = ''; $s .= &StartHtmlPage ( 'DLPS Error Page', '#FFFFFF' ); $s .= join( "\n", @errors ); $s .= &FinishPage; &OutputHtmlPage ( \$s ); exit; } # ---------------------------------------------------------------------- # NAME : StartHtmlPage # PURPOSE : print HTML title and header # CALLED BY : main # CALLS : Apache::Request->print # INPUT : request object # RETURNS : NONE # NOTES : # ---------------------------------------------------------------------- sub StartHtmlPage { my ( $title, $color ) = @_; my $s = ''; $s .= &CGI::start_html( -title => $title, -bgcolor => $color ); return $s; } # ---------------------------------------------------------------------- # NAME : FinishPage # PURPOSE : print HTML to close body and html # CALLED BY : main # CALLS : CGI::end_html # INPUT : NONE # RETURNS : NONE # NOTES : # ---------------------------------------------------------------------- sub FinishPage { return ( &CGI::end_html ); } # ---------------------------------------------------------------------- # NAME : # PURPOSE : # # CALLED BY : # CALLS : # INPUT : # RETURNS : # GLOBALS : # SIDE-EFFECTS : # NOTES : # ---------------------------------------------------------------------- sub SetupHtmlDebugging { my $debugVal = shift; $ENV{'DEBUG'} = $debugVal; print &CGI::header( -type => 'text/html' ); print &DlpsUtils::StartHtmlPage ( 'DEBUG', '#FFFFFF' ); } # ---------------------------------------------------------------------- # NAME : CollectionResolution # PURPOSE : set up authorized and requested collection arrays # CALLED BY : main # CALLS : NONE # INPUT : NONE # RETURNS : # GLOBALS : eventually uses Environment variable set by Auth System # SIDE-EFFECTS : sets globals @gRequestedColls, @gAuthzdColls ( sorted and # and uniq-ed from here on out # NOTES : currently hard coded authzd collections # ---------------------------------------------------------------------- sub CollectionResolution { my ( $cgi, $authzdCollsRef ) = @_; my @RequestedColls = $cgi->param( 'c' ); if ( !defined( @RequestedColls ) || scalar ( @RequestedColls ) == 0 ) { @RequestedColls = @$authzdCollsRef; } # uniquify lists &SortUniquifyList ( $authzdCollsRef ); &SortUniquifyList ( \@RequestedColls ); # set requested colls to only those they requested that are also authorized @RequestedColls = &GetIntersection ( $authzdCollsRef, \@RequestedColls ); # overwrite the query string's collections with the updated list of requested ones $cgi->param( 'c', @RequestedColls ); return ( @RequestedColls ); } # ---------------------------------------------------------------------- # NAME : GetParallelHash # PURPOSE : buils a hash from two parallel arrays using the first # array to key the second array # CALLED BY : clients # CALLS : NONE # INPUT : references to two lists # RETURNS : hash # GLOBALS : NONE # SIDE-EFFECTS : NONE # NOTES : # ---------------------------------------------------------------------- sub GetParallelHash { my ( $aRef1, $aRef2 ) = @_; my ( %hash, $i ); foreach my $item ( @$aRef1 ) { $hash{$item} = @$aRef2[$i++]; } return %hash; } # ---------------------------------------------------------------------- # NAME : GetIntersection # PURPOSE : get the intersection of two uniqued lists # CALLED BY : CollectionResolution # CALLS : NONE # INPUT : references to two lists # RETURNS : list of intersection of the two lists # GLOBALS : NONE # SIDE-EFFECTS : NONE # NOTES : # ---------------------------------------------------------------------- sub GetIntersection { my ( $aRef1, $aRef2 ) = @_; my @a = @$aRef1; my @b = @$aRef2; my @toReturn = ( ); foreach my $item ( @a ) { push ( @toReturn, grep ( /^$item$/, @b ) ); } return ( @toReturn ); } # ---------------------------------------------------------------------- # NAME : GetNWayIntersection # PURPOSE : get the intersection of N uniqued lists # CALLED BY : clients # CALLS : GetIntersection # INPUT : reference to list of references to N lists # RETURNS : list of common elements across N lists # GLOBALS : NONE # SIDE-EFFECTS : NONE # NOTES : # ---------------------------------------------------------------------- sub GetNWayIntersection { my $setOfSetRefsRef = shift; my @nWayIntersection = @{ pop( @$setOfSetRefsRef ) }; SETLOOP: while ( @$setOfSetRefsRef ) { @nWayIntersection = &GetIntersection( pop( @$setOfSetRefsRef ), \@nWayIntersection ); if ( scalar( @nWayIntersection ) == 0 ) { last SETLOOP; } } # now uniquify list &SortUniquifyList ( \@nWayIntersection ); return ( @nWayIntersection ); } # ---------------------------------------------------------------------- # NAME : CleanCgiParameters # PURPOSE : remove all empty URL parameters # CALLED BY : # CALLS : CGI->param, CGI->delete # INPUT : CGI object # RETURNS : NONE # GLOBALS : # SIDE-EFFECTS : changes CGI object # NOTES : # ---------------------------------------------------------------------- sub CleanCgiParameters { my $cgi = shift; foreach my $p ( $cgi->param ) { if ( !$cgi->param( $p )) { $cgi->delete( $p ); } } } # ---------------------------------------------------------------------- # NAME : BuildText # PURPOSE : use CGI to create a text input box # CALLED BY : # CALLS : # INPUT : # RETURNS : # GLOBALS : # SIDE-EFFECTS : # NOTES : # ---------------------------------------------------------------------- sub BuildTextInput { my ( $cgi, $name, $piParamsRef ) = @_; my $s = ''; my ( $size, $class, $default, $override ); if ( exists ( $$piParamsRef{'size'} ) ) { $size = $$piParamsRef{'size'} ; } if ( exists ( $$piParamsRef{'class'} ) ) { $class = $$piParamsRef{'class'} ; } if ( exists ( $$piParamsRef{'default'} ) ) { $default = $$piParamsRef{'default'} ; $override = 1 ; } # $s .= qq{
\n} if ( $class ); $s .= $cgi->textfield ( -name => $name, -size => $size, -class => $class, -default => $default, -override => $override, ); # $s .= qq{
\n} if ( $class ); return $s; } # ---------------------------------------------------------------------- # NAME : BuildSelect # PURPOSE : use CGI to create a "popup menu" # CALLED BY : FilterCollPickPage # CALLS : CGI->popup_menu # INPUT : CGI obj, select's name, ref to list of values, default value # RETURNS : html text for select # GLOBALS : # SIDE-EFFECTS : # NOTES : # ---------------------------------------------------------------------- sub BuildSelect { my ( $cgi, $name, $listRef, $default, $size, $multiple ) = @_; my $s; if ( $size == 1 ) { $s = $cgi->popup_menu( -name => $name, -values => $listRef, -default => $default, ); } elsif ( ! defined ($multiple) ) { $s = $cgi->scrolling_list( -name => $name, -values => $listRef, -default => $default, -size => $size, ); } else { $s = $cgi->scrolling_list( -name => $name, -values => $listRef, -default => $default, -size => $size, -multiple => $multiple ); } return $s; }; # ---------------------------------------------------------------------- # NAME : BuildPullDown # PURPOSE : use CGI to create a "popup menu" # CALLED BY : FilterCollPickPage # CALLS : CGI->popup_menu # INPUT : CGI obj, select's name, ref to list of values, default value # RETURNS : html text for select # GLOBALS : # SIDE-EFFECTS : # NOTES : This routine ALWAYS expects a labels hash # ---------------------------------------------------------------------- sub BuildPullDown { my ( $cgi, $name, $listRef, $default, $labelsHashRef, $otherParamsHashRef ) = @_; my $s = ''; if ( defined ( $otherParamsHashRef ) ) { $s = $cgi->popup_menu( -name => $name, -values => $listRef, -default => $default, -labels => $labelsHashRef, %$otherParamsHashRef, ); } else { $s = $cgi->popup_menu( -name => $name, -values => $listRef, -default => $default, -labels => $labelsHashRef, ); } return $s; } # ********************************************************************** # NAME : GetHtmlTemplateText # PURPOSE : read into scalar full text of an html template page # also fill in some values for some general variables # CALLED BY : ServePage # CALLS : NONE # INPUT : filename of html template # RETURNS : scalar of template's text # NOTES : # ********************************************************************** sub GetHtmlTemplateText { my $pageName = shift; open( PAGE, "<$pageName" ) || &errorBail( $gERRORS{'PAGE_NOT_FOUND'}, $pageName ); my $text = join( '', ); close ( PAGE ); return $text; } # ---------------------------------------------------------------------- # NAME : FindHostName # PURPOSE : find the name of the host that is running this program, or # set it to something in case we are running on the command line # CALLED BY : main # CALLS : NONE # INPUT : NONE # RETURNS : string # GLOBALS : $ENV vars # SIDE-EFFECTS : NONE # NOTES : # ---------------------------------------------------------------------- sub FindHostName { my $host = ''; if ( $ENV{'HTTP_HOST'} ) { $host = $ENV{'HTTP_HOST'}; } ## if run on the command line else { $host = $ENV{'HOST'}; } return $host; } # ---------------------------------------------------------------------- # NAME : SimpleHtmlFilter # PURPOSE : replace <, >, and & with entity references; nothing more # # CALLED BY : # CALLS : # INPUT : ref to string # RETURNS : NONE # GLOBALS : # SIDE-EFFECTS : changes string via reference # NOTES : # ---------------------------------------------------------------------- sub SimpleHtmlFilter { my $sRef = shift; $$sRef =~ s,\&,\&\;,gs; $$sRef =~ s,\<,\<\;,gs; $$sRef =~ s,\>,\>\;,gs; } # ---------------------------------------------------------------------- # NAME : CleanResidualTags # PURPOSE : # # CALLED BY : # CALLS : # INPUT : # RETURNS : # GLOBALS : # SIDE-EFFECTS : # NOTES : # ---------------------------------------------------------------------- sub CleanResidualTags { my $sRef = shift; $$sRef =~ s,]*>,
,g; $$sRef =~ s,]*>,: ,g; $$sRef =~ s,^[^<>]*>, ,; $$sRef =~ s,<[^<>]*$, ,; $$sRef =~ s,, / ,g; $$sRef =~ s,

, ,g; $$sRef =~ s,

, / ,g; $$sRef =~ s,]+>, ,g; } # ---------------------------------------------------------------------- # NAME : # PURPOSE : # # CALLED BY : # CALLS : # INPUT : # RETURNS : # GLOBALS : # SIDE-EFFECTS : # NOTES : This copied from gums-idx.dev # ----------------------------------------------------------------------- my $icons = '/icons'; my $greek = $icons . '/greek'; # no trailing slash here my $grol = $icons . '/grol'; # no trailing slash here my $misc = $icons . '/misc'; # no trailing slash here my %charEntHash_CH_Greek; # Chadwick-Healey my %charEntHash_Misc; my %charEntHash_ISO_Greek; sub InitCharEntHash_CH_Greek { %charEntHash_CH_Greek = ('initzzz' => "1", 'grdot' => ".", 'GRAa' => "\"[Agr]\"\"[acugr]\"", 'GRAc' => "\"[Agr]\"\"[cirgr]\"", 'GRAd' => "\"[Agr]\"\"[diagr]\"", 'GRAg' => "\"[Agr]\"\"[gragr]\"", 'GRAr' => "\"[Agr]\"\"[rougr]\"", 'GRAra' => "\"[Agr]\"\"[ragr]\"", 'GRArg' => "\"[Agr]\"\"[rggr]\"", 'GRAs' => "\"[Agr]\"\"[smogr]\"", 'GRAsa' => "\"[Agr]\"\"[sagr]\"", 'GRAsc' => "\"[Agr]\"\"[scgr]\"", 'GRAsg' => "\"[Agr]\"\"[sggr]\"", 'GREa' => "\"[Egr]\"\"[acugr]\"", 'GREd' => "\"[Egr]\"\"[diagr]\"", 'GREr' => "\"[Egr]\"\"[rougr]\"", 'GREra' => "\"[Egr]\"\"[ragr]\"", 'GREs' => "\"[Egr]\"\"[smogr]\"", 'GREsa' => "\"[Egr]\"\"[sagr]\"", 'GREsc' => "\"[Egr]\"\"[scgr]\"", 'GRHc' => "\"[EEgr]\"\"[cirgr]\"", 'GRHg' => "\"[EEgr]\"\"[gragr]\"", 'GRHr' => "\"[EEgr]\"\"[rougr]\"", 'GRHra' => "\"[EEgr]\"\"[ragr]\"", 'GRHrc' => "\"[EEgr]\"\"[rcgr]\"", 'GRHrg' => "\"[EEgr]\"\"[rggr]\"", 'GRHs' => "\"[EEgr]\"\"[smogr]\"", 'GRHsa' => "\"[EEgr]\"\"[sagr]\"", 'GRHsc' => "\"[EEgr]\"\"[scgr]\"", 'GRHsg' => "\"[EEgr]\"\"[sggr]\"", 'GRIa' => "\"[Igr]\"\"[acugr]\"", 'GRIc' => "\"[Igr]\"\"[cirgr]\"", 'GRIg' => "\"[Igr]\"\"[gragr]\"", 'GRIr' => "\"[Igr]\"\"[rougr]\"", 'GRIra' => "\"[Igr]\"\"[ragr]\"", 'GRIrg' => "\"[Igr]\"\"[rggr]\"", 'GRIs' => "\"[Igr]\"\"[smogr]\"", 'GRIsa' => "\"[Igr]\"\"[sagr]\"", 'GRIsc' => "\"[Igr]\"\"[scgr]\"", 'GROa' => "\"[Ogr]\"\"[acugr]\"", 'GROar' => "\"[Ogr]\"\"[ragr]\"", 'GROdc' => "\"[Ocirgr]\"\"[diagr]\"", 'GROg' => "\"[Ogr]\"\"[gragr]\"", 'GROr' => "\"[Ogr]\"\"[rougr]\"", 'GROra' => "\"[Ogr]\"\"[ragr]\"", 'GROrg' => "\"[Ogr]\"\"[rggr]\"", 'GROs' => "\"[Ogr]\"\"[smogr]\"", 'GROsa' => "\"[Ogr]\"\"[sagr]\"", 'GROsc' => "\"[Ogr]\"\"[scgr]\"", 'GRRr' => "\"[Rgr]\"\"[rougr]\"", 'GRRs' => "\"[Rgr]\"\"[smogr]\"", 'GRST' => "\"[Sgr]\"", 'GRUa' => "\"[Ugr]\"\"[acugr]\"", 'GRUr' => "\"[Ugr]\"\"[rougr]\"", 'GRUra' => "\"[Ugr]\"\"[ragr]\"", 'GRUs' => "\"[Ugr]\"\"[smogr]\"", 'GRWc' => "\"[OHgr]\"\"[cirgr]\"", 'GRWcs' => "\"[OHgr]\"\"[scgr]\"", 'GRWd' => "\"[OHgr]\"\"[diagr]\"", 'GRWia' => "\"[OHacugr]\"\"[iotgr]\"", 'GRWr' => "\"[OHgr]\"\"[rougr]\"", 'GRWra' => "\"[OHgr]\"\"[ragr]\"", 'GRWrc' => "\"[OHgr]\"\"[rcgr]\"", 'GRWrg' => "\"[OHgr]\"\"[rggr]\"", 'GRWs' => "\"[OHgr]\"\"[smogr]\"", 'GRWsa' => "\"[OHgr]\"\"[sagr]\"", 'GRWsc' => "\"[OHgr]\"\"[scgr]\"", 'grA' => "\"[Agr]\"", 'grAs' => "\"[Agr]\"\"[smogr]\"", 'grB' => "\"[Bgr]\"", 'grC' => "\"[Xgr]\"", 'grD' => "\"[Dgr]\"", 'grE' => "\"[Egr]\"", 'grF' => "\"[PHgr]\"", 'grG' => "\"[Ggr]\"", 'grH' => "\"[EEgr]\"", 'grI' => "\"[Igr]\"", 'grK' => "\"[Kgr]\"", 'grL' => "\"[Lgr]\"", 'grM' => "\"[Mgr]\"", 'grN' => "\"[Ngr]\"", 'grO' => "\"[Ogr]\"", 'grP' => "\"[Pgr]\"", 'grQ' => "\"[THgr]\"", 'grR' => "\"[Rgr]\"", 'grS' => "\"[Sgr]\"", 'grST' => "\"[Sgr]\"", 'grT' => "\"[Tgr]\"", 'grU' => "\"[Ugr]\"", 'grV' => "\"[DIGgr]\"", 'grW' => "\"[OHgr]\"", 'grX' => "\"[KHgr]\"", 'grY' => "\"[PSgr]\"", 'grZ' => "\"[Zgr]\"", 'gra' => "\"[agr]\"", 'graa' => "\"[aacugr]\"", 'graad' => "\"[aacugr]\"\"[diagr]\"", 'grac' => "\"[acirgr]\"", 'gracd' => "\"[acirgr]\"\"[diagr]\"", 'graci' => "\"[acigr]\"", 'gracs' => "\"[ascgr]\"", 'grad' => "\"[agr]\"\"[diagr]\"", 'gradc' => "\"[acirgr]\"\"[diagr]\"", 'grag' => "\"[agragr]\"", 'grai' => "\"[aiotgr]\"", 'graia' => "\"[aaigr]\"", 'graic' => "\"[acigr]\"", 'grais' => "\"[asigr]\"", 'graisa' => "\"[asaigr]\"", 'grap' => "\"[apos]\"", 'grar' => "\"[arougr]\"", 'grara' => "\"[aragr]\"", 'grarg' => "\"[arggr]\"", 'gras' => "\"[asmogr]\"", 'grasa' => "\"[asagr]\"", 'grasad' => "\"[asagr]\"\"[diagr]\"", 'grasc' => "\"[ascgr]\"", 'grasci' => "\"[ascigr]\"", 'grasd' => "\"[asmogr]\"\"[diagr]\"", 'grasg' => "\"[asggr]\"", 'grasi' => "\"[asigr]\"", 'grasia' => "\"[asaigr]\"", 'grb' => "\"[bgr]\"", 'grc' => "\"[xgr]\"", 'grcolon' => "\"[cogr]\"", 'grd' => "\"[dgr]\"", 'gre' => "\"[egr]\"", 'grea' => "\"[eacugr]\"", 'gread' => "\"[eacugr]\"\"[diagr]\"", 'grec' => "\"[egr]\"\"[cirgr]\"", 'grecs' => "\"[esmogr]\"\"[cirgr]\"", 'gred' => "\"[egr]\"\"[diagr]\"", 'greda' => "\"[eacugr]\"\"[diagr]\"", 'gredg' => "\"[egragr]\"\"[diagr]\"", 'greg' => "\"[egragr]\"", 'grei' => "\"[egr]\"\"[iotgr]\"", 'grer' => "\"[erougr]\"", 'grera' => "\"[eragr]\"", 'grerg' => "\"[erggr]\"", 'gres' => "\"[esmogr]\"", 'gresa' => "\"[esagr]\"", 'gresad' => "\"[esagr]\"\"[diagr]\"", 'gresc' => "\"[esmogr]\"\"[cirgr]\"", 'gresg' => "\"[esggr]\"", 'grf' => "\"[phgr]\"", 'grg' => "\"[ggr]\"", 'grh' => "\"[eegr]\"", 'grha' => "\"[eeacugr]\"", 'grhai' => "\"[eeaigr]\"", 'grhc' => "\"[eecirgr]\"", 'grhcd' => "\"[eecirgr]\"\"[diagr]\"", 'grhci' => "\"[eecigr]\"", 'grhcr' => "\"[eercgr]\"", 'grhcri' => "\"[eercigr]\"", 'grhcs' => "\"[eescgr]\"", 'grhd' => "\"[eegr]\"\"[diagr]\"", 'grhg' => "\"[eegragr]\"", 'grhgd' => "\"[eegragr]\"\"[diagr]\"", 'grhi' => "\"[eeigr]\"", 'grhia' => "\"[eeaigr]\"", 'grhic' => "\"[eecigr]\"", 'grhicr' => "\"[eercigr]\"", 'grhid' => "\"[eeigr]\"\"[diagr]\"", 'grhig' => "\"[eegigr]\"", 'grhisc' => "\"[eescigr]\"", 'grhr' => "\"[eerougr]\"", 'grhra' => "\"[eeragr]\"", 'grhrc' => "\"[eercgr]\"", 'grhrci' => "\"[eercigr]\"", 'grhrd' => "\"[eerougr]\"\"[diagr]\"", 'grhrg' => "\"[eerggr]\"", 'grhric' => "\"[eercigr]\"", 'grhs' => "\"[eesmogr]\"", 'grhsa' => "\"[eesagr]\"", 'grhsai' => "\"[eesaigr]\"", 'grhsc' => "\"[eescgr]\"", 'grhsci' => "\"[eescigr]\"", 'grhsg' => "\"[eesggr]\"", 'grhsi' => "\"[eesigr]\"", 'gri' => "\"[igr]\"", 'gria' => "\"[iacugr]\"", 'griad' => "\"[iadgr]\"", 'gric' => "\"[icirgr]\"", 'gricr' => "\"[ircgr]\"", 'grics' => "\"[iscgr]\"", 'grid' => "\"[idiagr]\"", 'grida' => "\"[iadgr]\"", 'gridg' => "\"[igdgr]\"", 'grig' => "\"[igragr]\"", 'grir' => "\"[irougr]\"", 'grira' => "\"[iragr]\"", 'grirc' => "\"[ircgr]\"", 'grirg' => "\"[irggr]\"", 'gris' => "\"[ismogr]\"", 'grisa' => "\"[isagr]\"", 'grisc' => "\"[iscgr]\"", 'grisd' => "\"[ismogr]\"\"[diagr]\"", 'grisg' => "\"[isggr]\"", 'grk' => "\"[kgr]\"", 'grl' => "\"[lgr]\"", 'grm' => "\"[mgr]\"", 'grn' => "\"[ngr]\"", 'gro' => "\"[ogr]\"", 'groa' => "\"[oacugr]\"", 'groad' => "\"[oacugr]\"\"[diagr]\"", 'groc' => "\"[ogr]\"\"[cirgr]\"", 'grod' => "\"[ogr]\"\"[diagr]\"", 'grog' => "\"[ogragr]\"", 'grogd' => "\"[ogragr]\"\"[diagr]\"", 'groi' => "\"[ogr]\"\"[iotgr]\"", 'gror' => "\"[orougr]\"", 'grora' => "\"[oragr]\"", 'grorc' => "\"[orougr]\"\"[cirgr]\"", 'grorg' => "\"[orggr]\"", 'gros' => "\"[osmogr]\"", 'grosa' => "\"[osagr]\"", 'grosc' => "\"[osmogr]\"\"[cirgr]\"", 'grosdc' => "\"[osmogr]\"\"[cirgr]\"\"[diagr]\"", 'grosg' => "\"[osggr]\"", 'grp' => "\"[pgr]\"", 'grq' => "\"[thgr]\"", 'grr' => "\"[rgr]\"", 'grra' => "\"[rgr]\"\"[acugr]\"", 'grrg' => "\"[rgr]\"\"[gragr]\"", 'grrr' => "\"[rrougr]\"", 'grrra' => "\"[rrougr]\"\"[acugr]\"", 'grrrg' => "\"[rrougr]\"\"[gragr]\"", 'grrs' => "\"[rsmogr]\"", 'grs' => "\"[sgr]\"", 'grst' => "\"[sfgr]\"", 'grt' => "\"[tgr]\"", 'gru' => "\"[ugr]\"", 'grua' => "\"[uacugr]\"", 'gruad' => "\"[uadgr]\"", 'gruc' => "\"[ucirgr]\"", 'grucr' => "\"[urcgr]\"", 'grucs' => "\"[uscgr]\"", 'grud' => "\"[udiagr]\"", 'gruda' => "\"[uadgr]\"", 'grug' => "\"[ugragr]\"", 'grui' => "\"[ugr]\"\"[iotgr]\"", 'grur' => "\"[urougr]\"", 'grura' => "\"[uragr]\"", 'grurc' => "\"[urcgr]\"", 'grurdc' => "\"[urcgr]\"\"[diagr]\"", 'grurg' => "\"[urggr]\"", 'grus' => "\"[usmogr]\"", 'grusa' => "\"[usagr]\"", 'grusc' => "\"[uscgr]\"", 'grusg' => "\"[usggr]\"", 'grv' => "\"[diggr]\"", 'grw' => "\"[ohgr]\"", 'grwa' => "\"[ohacugr]\"", 'grwac' => "\"[ohacugr]\"\"[cirgr]\"", 'grwad' => "\"[ohacugr]\"\"[diagr]\"", 'grwai' => "\"[ohaigr]\"", 'grwc' => "\"[ohcirgr]\"", 'grwcd' => "\"[ohcirgr]\"\"[diagr]\"", 'grwci' => "\"[ohcigr]\"", 'grwcs' => "\"[ohscgr]\"", 'grwd' => "\"[ohgr]\"\"[diagr]\"", 'grwdc' => "\"[ohcirgr]\"\"[diagr]\"", 'grwdg' => "\"[ohgragr]\"\"[diagr]\"", 'grwg' => "\"[ohgragr]\"", 'grwgi' => "\"[ohgigr]\"", 'grwi' => "\"[ohiotgr]\"", 'grwia' => "\"[ohaigr]\"", 'grwic' => "\"[ohcigr]\"", 'grwirc' => "\"[ohrcigr]\"", 'grwis' => "\"[ohsigr]\"", 'grwr' => "\"[ohrougr]\"", 'grwra' => "\"[ohragr]\"", 'grwrc' => "\"[ohrcgr]\"", 'grwrd' => "\"[ohrougr]\"\"[diagr]\"", 'grwrg' => "\"[ohrggr]\"", 'grws' => "\"[ohsmogr]\"", 'grwsa' => "\"[ohsagr]\"", 'grwsai' => "\"[ohsaigr]\"", 'grwsc' => "\"[ohscgr]\"", 'grwsg' => "\"[ohsggr]\"", 'grx' => "\"[khgr]\"", 'gry' => "\"[psgr]\"", 'grz' => "\"[zgr]\"", ); } sub InitCharEntHash_Misc { %charEntHash_Misc = ('initzzz' => "1", '#38' => "&", '#60' => ">", '#62' => "<", 'emsp' => " ", 'ensp' => " ", 'Prime' => "\"[']\"", 'prime' => "\"[']\"", 'plus' => "+", 'nldr' => "..", 'mldr' => "...", 'hellip' => "...", 'tilde' => "~", 'le' => "<=", 'ndash' => "-", 'hyphen' => "-", 'pound' => "#", 'mdash' => "--", 'yog' => "\"[yogh]\"", 'Yog' => "\"[Yogh]\"", 'darr' => "\"[darr]\"", 'uarr' => "\"[uarr]\"", 'larr' => "\"[larr]\"", 'rarr' => "\"[rarr]\"", 'OEli' => "OE", 'oeli' => "\"[oe]\"", 'esse' => "\ß", 'ldqu' => '"', 'rdqu' => '"', 'rdquo' => '"', 'grdquo' => '"', 'lsqu' => "`", 'lsquo' => "`", 'rsqu' => "'", 'rsquo' => "'", 'grsqu' => '"', 'lcub' => "{", 'lsquor' => "`", 'rcub' => "}", 'frac12' => "1/2", 'frac14' => "1/4", 'frac34' => "3/4", 'frac13' => "1/3", 'frac15' => "1/5", 'frac16' => "1/6", 'frac18' => "1/8", 'frac23' => "2/3", 'frac25' => "2/5", 'frac35' => "3/5", 'frac38' => "3/8", 'frac58' => "5/8", 'Acaron' => "[A]", 'Cacute' => "[C]", 'Ccaron' => "[C]", 'Dcaron' => "[D]", 'Ecaron' => "[E]", 'Icaron' => "[I]", 'Nacute' => "[N]", 'Ncaron' => "[N]", 'Ocaron' => "[O]", 'Rcaron' => "[R]", 'Ruml' => "[R]", 'Scaron' => "[S]", 'Ucaron' => "[U]", 'ucaron' => "[u]", 'Zcaron' => "[Z]", 'Zdot' => "[Z]", 'acedil' => "[a]", 'bacute' => "[b]", 'cacute' => "[c]", 'ccaron' => "[c]", 'cgrave' => "[c]", 'dcaron' => "[d]", 'gacute' => "[g]", 'hacute' => "[h]", 'iogon' => "[i]", 'ltilde' => "[l]", 'ncaron' => "[n]", 'ngrave' => "[n]", 'rcaron' => "[r]", 'rgrave' => "[r]", 'sacute' => "[s]", 'scaron' => "[s]", 'sgrave' => "[s]", 'stilde' => "[s]", 'uring' => "[u]", 'utilde' => "[u]", 'wacute' => "[w]", 'ycirc' => "[y]", 'zcaron' => "[z]", 'zdot' => "[z]", 'breve' => "\"[breve]\"", 'caron' => "\"[caron]\"", 'cir' => "\"[circular", 'Dagger' => "\"[dagger]\"", 'dagger' => "\"[dagger]\"", 'angst' => "\"[degree]\"", 'dot' => "\"[dot]\"", 'bull' => "\"[dot", 'grave' => "\"[grave]\"", 'lacute' => "\"[l]\"", 'macute' => "\"[m]\"", 'nacute' => "\"[n]\"", 'racute' => "\"[r]\"", 'zacute' => "\"[z]\"", 'acaron' => "\"[a]\"", 'ecaron' => "\"[e]\"", 'icaron' => "\"[i]\"", 'ocaron' => "\"[o]\"", 'edot' => "\"[e]\"", 'imacr' => "\"[i]\"", 'etilde' => "\"[e]\"", 'itilde' => "\"[i]\"", 'check' => "\"[check", ); } sub InitCharEntHash_ISO_Greek { %charEntHash_ISO_Greek= ('initzzz' => "1", 'Agr' => "\"[Agr]\"", 'agr' => "\"[agr]\"", 'aacgr' => "\"[aacugr]\"", 'aacugr' => "\"[aacugr]\"", 'aaigr' => "\"[aaigr]\"", 'acigr' => "\"[acigr]\"", 'acirgr' => "\"[acirgr]\"", 'agigr' => "\"[agigr]\"", 'agragr' => "\"[agragr]\"", 'agvgr' => "\"[agragr]\"", 'aiotgr' => "\"[aiotgr]\"", 'aragr' => "\"[aragr]\"", 'araigr' => "\"[araigr]\"", 'arcgr' => "\"[arcgr]\"", 'arcigr' => "\"[arcigr]\"", 'arggr' => "\"[arggr]\"", 'argigr' => "\"[argigr]\"", 'arigr' => "\"[arigr]\"", 'arougr' => "\"[arougr]\"", 'asagr' => "\"[asagr]\"", 'asaigr' => "\"[asaigr]\"", 'ascgr' => "\"[ascgr]\"", 'ascigr' => "\"[ascigr]\"", 'asggr' => "\"[asggr]\"", 'asgigr' => "\"[asgigr]\"", 'asigr' => "\"[asigr]\"", 'asmogr' => "\"[asmogr]\"", 'Bgr' => "\"[Bgr]\"", 'bgr' => "\"[bgr]\"", 'Ggr' => "\"[Ggr]\"", 'ggr' => "\"[ggr]\"", 'Dgr' => "\"[Dgr]\"", 'dgr' => "\"[dgr]\"", 'Egr' => "\"[Egr]\"", 'egr' => "\"[egr]\"", 'eacgr' => "\"[eacugr]\"", 'eacugr' => "\"[eacugr]\"", 'egvgr' => "\"[egragr]\"", 'egragr' => "\"[egragr]\"", 'eragr' => "\"[eragr]\"", 'erggr' => "\"[erggr]\"", 'erougr' => "\"[erougr]\"", 'esagr' => "\"[esagr]\"", 'esggr' => "\"[esggr]\"", 'esmogr' => "\"[esmogr]\"", 'Zgr' => "\"[Zgr]\"", 'zgr' => "\"[zgr]\"", 'EEgr' => "\"[EEgr]\"", 'eegr' => "\"[eegr]\"", 'eeacgr' => "\"[eeacugr]\"", 'eeacugr' => "\"[eeacugr]\"", 'eeaigr' => "\"[eeaigr]\"", 'eecigr' => "\"[eecigr]\"", 'eecirgr' => "\"[eecirgr]\"", 'eegigr' => "\"[eegigr]\"", 'eegvgr' => "\"[eegragr]\"", 'eegragr' => "\"[eegragr]\"", 'eeigr' => "\"[eeigr]\"", 'eeragr' => "\"[eeragr]\"", 'eeraigr' => "\"[eeraigr]\"", 'eercgr' => "\"[eercgr]\"", 'eercigr' => "\"[eercigr]\"", 'eerggr' => "\"[eerggr]\"", 'eergigr' => "\"[eergigr]\"", 'eerigr' => "\"[eerigr]\"", 'eerougr' => "\"[eerougr]\"", 'eesagr' => "\"[eesagr]\"", 'eesaigr' => "\"[eesaigr]\"", 'eescgr' => "\"[eescgr]\"", 'eescigr' => "\"[eescigr]\"", 'eesggr' => "\"[eesggr]\"", 'eesgigr' => "\"[eesgigr]\"", 'eesigr' => "\"[eesigr]\"", 'eesmogr' => "\"[eesmogr]\"", 'THgr' => "\"[THgr]\"", 'thgr' => "\"[thgr]\"", 'Igr' => "\"[Igr]\"", 'igr' => "\"[igr]\"", 'iacgr' => "\"[iacugr]\"", 'iacugr' => "\"[iacugr]\"", 'iadgr' => "\"[iadgr]\"", 'icirgr' => "\"[icirgr]\"", 'idiagr' => "\"[idiagr]\"", 'igdgr' => "\"[igdgr]\"", 'igvgr' => "\"[igragr]\"", 'igragr' => "\"[igragr]\"", 'iragr' => "\"[iragr]\"", 'ircgr' => "\"[ircgr]\"", 'irggr' => "\"[irggr]\"", 'irougr' => "\"[irougr]\"", 'isagr' => "\"[isagr]\"", 'iscgr' => "\"[iscgr]\"", 'isggr' => "\"[isggr]\"", 'ismogr' => "\"[ismogr]\"", 'Kgr' => "\"[Kgr]\"", 'kgr' => "\"[kgr]\"", 'Lgr' => "\"[Lgr]\"", 'lgr' => "\"[lgr]\"", 'Mgr' => "\"[Mgr]\"", 'mgr' => "\"[mgr]\"", 'Ngr' => "\"[Ngr]\"", 'ngr' => "\"[ngr]\"", 'Xgr' => "\"[Xgr]\"", 'xgr' => "\"[xgr]\"", 'Ogr' => "\"[Ogr]\"", 'ogr' => "\"[ogr]\"", 'oacgr' => "\"[oacugr]\"", 'oacugr' => "\"[oacugr]\"", 'ogvgr' => "\"[ogragr]\"", 'ogragr' => "\"[ogragr]\"", 'oragr' => "\"[oragr]\"", 'orggr' => "\"[orggr]\"", 'orougr' => "\"[orougr]\"", 'osagr' => "\"[osagr]\"", 'osggr' => "\"[osggr]\"", 'osmogr' => "\"[osmogr]\"", 'Pgr' => "\"[Pgr]\"", 'pgr' => "\"[pgr]\"", 'Rgr' => "\"[Rgr]\"", 'rgr' => "\"[rgr]\"", 'rrougr' => "\"[rrougr]\"", 'rsmogr' => "\"[rsmogr]\"", 'Sgr' => "\"[Sgr]\"", 'sgr' => "\"[sgr]\"", 'sfgr' => "\"[sfgr]\"", 'Tgr' => "\"[Tgr]\"", 'tgr' => "\"[tgr]\"", 'Ugr' => "\"[Ugr]\"", 'ugr' => "\"[ugr]\"", 'uacugr' => "\"[uacugr]\"", 'uadgr' => "\"[uadgr]\"", 'ucirgr' => "\"[ucirgr]\"", 'udiagr' => "\"[udiagr]\"", 'ugdgr' => "\"[ugdgr]\"", 'ugvgr' => "\"[ugragr]\"", 'ugragr' => "\"[ugragr]\"", 'uragr' => "\"[uragr]\"", 'urcgr' => "\"[urcgr]\"", 'urggr' => "\"[urggr]\"", 'urougr' => "\"[urougr]\"", 'usagr' => "\"[usagr]\"", 'uscgr' => "\"[uscgr]\"", 'usggr' => "\"[usggr]\"", 'usmogr' => "\"[usmogr]\"", 'PHgr' => "\"[PHgr]\"", 'phgr' => "\"[phgr]\"", 'KHgr' => "\"[KHgr]\"", 'khgr' => "\"[khgr]\"", 'PSgr' => "\"[PSgr]\"", 'psgr' => "\"[psgr]\"", 'OHgr' => "\"[OHgr]\"", 'ohgr' => "\"[ohgr]\"", 'ohacgr' => "\"[ohacugr]\"", 'ohacugr' => "\"[ohacugr]\"", 'ohaigr' => "\"[ohaigr]\"", 'ohcigr' => "\"[ohcigr]\"", 'ohcirgr' => "\"[ohcirgr]\"", 'ohgigr' => "\"[ohgigr]\"", 'ohgragr' => "\"[ohgragr]\"", 'ohiotgr' => "\"[ohiotgr]\"", 'ohragr' => "\"[ohragr]\"", 'ohraigr' => "\"[ohraigr]\"", 'ohrcgr' => "\"[ohrcgr]\"", 'ohrcigr' => "\"[ohrcigr]\"", 'ohrggr' => "\"[ohrggr]\"", 'ohrgigr' => "\"[ohrgigr]\"", 'ohrigr' => "\"[ohrigr]\"", 'ohrougr' => "\"[ohrougr]\"", 'ohsagr' => "\"[ohsagr]\"", 'ohsaigr' => "\"[ohsaigr]\"", 'ohscgr' => "\"[ohscgr]\"", 'ohscigr' => "\"[ohscigr]\"", 'ohsggr' => "\"[ohsggr]\"", 'ohsgigr' => "\"[ohsgigr]\"", 'ohsigr' => "\"[ohsigr]\"", 'ohsmogr' => "\"[ohsmogr]\"", 'DIGgr' => "\"[DIGgr]\"", 'diggr' => "\"[diggr]\"", 'KOgr' => "\"[KOgr]\"", 'kogr' => "\"[kogr]\"", 'samgr' => "\"[samgr]\"", 'SLgr' => "\"[SLgr]\"", 'slgr' => "\"[slgr]\"", 'acugr' => "\"[acugr]\"", 'apos' => "\"[apos]\"", 'cirgr' => "\"[cirgr]\"", 'cogr' => "\"[cogr]\"", 'colon' => "\"[colon]\"", 'comma' => "\"[comma]\"", 'diagr' => "\"[diagr]\"", 'gdgr' => "\"[gdgr]\"", 'gragr' => "\"[gragr]\"", 'hyphen' => "\"[hyphen]\"", 'iotgr' => "\"[iotgr]\"", 'laquo' => "\"[laquo]\"", 'lpar' => "\"[lpar]\"", 'lsqb' => "\"[lsqb]\"", 'period' => "\"[period]\"", 'qmgr' => "\"[qmgr]\"", 'ragr' => "\"[ragr]\"", 'raquo' => "\"[raquo]\"", 'rcgr' => "\"[rcgr]\"", 'rggr' => "\"[rggr]\"", 'rougr' => "\"[rougr]\"", 'rpar' => "\"[rpar]\"", 'rsqb' => "\"[rsqb]\"", 'sagr' => "\"[sagr]\"", 'scgr' => "\"[scgr]\"", 'sdgr' => "\"[sdgr]\"", 'sggr' => "\"[sggr]\"", 'smogr' => "\"[smogr]\"", ); } sub FilterCharEnts_CH_Greek { my $sRef = shift; if (! $charEntHash_CH_Greek{'initzzz'}) { &InitCharEntHash_CH_Greek; }; $$sRef =~ s,(\&([^ \;]+?)\;),$charEntHash_CH_Greek{$2} ? $charEntHash_CH_Greek{$2} : $1,eg; if ( $ENV{'DEBUG'} && $ENV{'charents'} ) { if ( $1 ) { print "[|$1| -> |$2| -> |$charEntHash_CH_Greek{$2}|]" } } } sub FilterCharEnts_ISO_Greek { my $sRef = shift; if (! $charEntHash_ISO_Greek{'initzzz'}) { &InitCharEntHash_ISO_Greek; }; $$sRef =~ s,(\&([^ \;]+?)\;),$charEntHash_ISO_Greek{$2} ? $charEntHash_ISO_Greek{$2} : $1,eg; if ( $ENV{'DEBUG'} && $ENV{'charents'} ) { if ( $1 ) { print "[|$1| -> |$2| -> |$charEntHash_ISO_Greek{$2}|]" } } } sub FilterCharEnts_Misc { my $sRef = shift; if (! $charEntHash_Misc{'initzzz'}) { &InitCharEntHash_Misc; }; # A few complex regexps $$sRef =~ s|\&super([^\;]+)\;|$1|g; # All the rest $$sRef =~ s,(\&([^ \;]+?)\;),$charEntHash_Misc{$2} ? $charEntHash_Misc{$2} : $1,eg; if ( $ENV{'DEBUG'} && $ENV{'charents'} ) { if ( $1 ) { print "[|$1| -> |$2| -> |$charEntHash_Misc{$2}|]" } } } sub FilterCharEnts_All { my $sRef = shift; FilterCharEnts_Misc( $sRef ); FilterCharEnts_ISO_Greek( $sRef ); FilterCharEnts_CH_Greek( $sRef ); } # ---------------------------------------------------------------------- # NAME : StartSession # PURPOSE : set the global $gSessionId and creates a DlpsSession object # (which wraps an Apache::Session::DBI object) # CALLED BY : main # CALLS : DlpsSession->new # INPUT : # RETURNS : # GLOBALS : # NOTES : # ---------------------------------------------------------------------- sub StartSession { my $cgi = shift; # get session id if there is one passed in my $sid = $cgi->param('sid'); my $dso; eval { $dso = new DlpsSession( $sid ); }; if ( $@ ) { &errorBail( $@ ); } $sid = $dso->GetSessionId( ); # update global session id variable $cgi->param( 'sid', $sid ); # update cgi obj with session id param if ( ( $ENV{'DEBUG'} eq 'session' ) || ( $ENV{'DEBUG'} eq 'all' ) ) { print( &CGI::p("Debugging $0"), &CGI::br(), &CGI::hr() ); print( &CGI::p(qq{Session ID is: }, $sid), &CGI::br(), &CGI::hr() ); } return $dso; } # ---------------------------------------------------------------------- # NAME : PrintStringToFile # PURPOSE : # CALLED BY : # CALLS : # INPUT : string, filename of file to print it to # RETURNS : NONE # GLOBALS : # SIDE-EFFECTS : # NOTES : # ---------------------------------------------------------------------- sub PrintStringToFile { my ( $s, $file ) = @_; open ( TEMPFILE, ">$file" ) || die; print TEMPFILE $s; close ( TEMPFILE ); } # ---------------------------------------------------------------------- # NAME : TrimSpaces # PURPOSE : remove leading and trailing white space from a string # CALLED BY : # CALLS : # INPUT : reference a string # RETURNS : # GLOBALS : # SIDE-EFFECTS : changes string by reference # NOTES : # ---------------------------------------------------------------------- sub TrimSpaces { my $sRef = shift; $$sRef =~ s,^\s*,,; $$sRef =~ s,\s*$,,; } # ********************************************************************** # ********************************************************************** 1;