uHTML
view release on metacpan or search on metacpan
uHTML/std.pm view on Meta::CPAN
my $SO = qr/\s*,\s*/ ;
my $RO = qr/\s*[,;:]\s*/ ;
use constant { TIMEOUT => 6000 } ;
sub setDebug
{
$DEBUG = shift ;
$DEBUG_MASK = shift ;
}
sub DoIf( $ )
{
my $Node = shift ;
my $Child ;
if( eval( $Node->attr( 'cond' ) ) )
{
my @D ;
for( $Child=$Node->{'FirstChild'}; $Child; $Child=$Child->{'Next'} )
{
push @D,$Child if $Child->{'Name'} eq 'else';
}
$_->delete() foreach @D ;
$Node->map( '','' ) ;
}
else
{
my( $Elif,$Else ) ;
for( $Child=$Node->{'FirstChild'}; $Child && !$Elif; $Child=$Child->{'Next'} )
{
next unless $Child->{'Name'} eq 'else' ;
if( $Child->testAttr( 'cond' ) )
{
$Elif = $Child if eval( $Child->attr( 'cond' ) ) ;
}
else
{
$Else = $Child ;
}
}
$Else = $Elif if $Elif ;
$Node->{'Text'} = '' ;
$Node->{'HTML'} = $Else ? $Else->map( '','' ) : undef ;
}
}
sub Choice( $ )
{
my $Node = shift ;
return unless $Node->testAttr( 'tag' ) ;
my $Name = $Node->attr( 'tag' ) ;
return unless $Name ;
my $cond = eval( $Node->attr( 'cond' ) ) ? 0 : 1 ;
my( $P,@S ) ;
@S = split m/\|/,$Name,2 ;
$Name = $S[$cond] if $#S>0 ;
return unless $Name and $Name ne 'choice' ;
$Node->name( $Name ) ;
my $Add = $Node->attr( 'attr' ) ;
$Node->deleteAttr( 'cond','tag','attr' ) ;
foreach( keys %{$Node->attributes()} )
{
next unless $P = $Node->rawAttr( $_ ) ;
@S = split m/\|/,$P,2 ;
$S[$cond] ne '' ? $Node->rawAttr( $_,$S[$cond] ) : $Node->deleteAttr( $_ ) if $#S>0 ;
}
if( $Add )
{
@S = split m/\|/,$Add,2 ;
$Node->addAttr( split $SO,( $#S>0?$S[$cond]:$Add ) ) ;
}
$Node->process() ; #kein insert da dann uHTML-Tags nicht berücksichtigt werden
$Node->trailer( '' ) ; #process hat den Anhang bereits angefügt
}
sub VarChoice( $ )
{
my( $Node,$Par,$Var,$cond,$true,$false ) = @_ ;
return( eval $cond ? $true : $false ) ;
}
sub CondAttr
{
my $Node = shift ;
my $Name = $Node->attr( 'tag' ) ;
return unless $Name ;
$Node->name( $Name ) ;
$Node->deleteAttr( 'tag' ) ;
$Node->attr( $_ ) ne '' or $Node->deleteAttr( $_ ) foreach keys %{$Node->attributes()} ;
$Node->map( '','' ) ;
}
sub Identity( $ )
{
my $Node = shift ;
return $_[1] if shift ;
$Node->map( '','' ) ;
}
sub InsertText( $ )
{
my $Node = shift ;
return uHTML::recode( $_[1],$Node->{'ENV'} ) if shift ;
$Node->testAttr( 'raw' ) ? $Node->HTML( $Node->attr( 'text' ) ) : $Node->map( $Node->attr( 'text' ),'' ) ;
}
sub ReplaceText
{
my( $Node,$Par,$Var,$Text,$Pattern,$Replace,$opt ) = @_ ;
unless( $Par )
{
$Text = $Node->attr( 'text' ) ;
$Pattern = $Node->attr( 'pattern' ) ;
$Replace = $Node->attr( 'replace' ) ;
$opt = $Node->attr( 'options' ) ;
}
$Pattern =~ s"(?<!\\)/"\\/"g ;
$Replace =~ s"(?<!\\)/"\\/"g ;
$opt =~ s"[^msixpgcadlu]""g ;
eval( "\$Text =~ s/$Pattern/$Replace/$opt" ) ;
return $Text ;
}
sub uFilePath( $$ )
{
uHTML/std.pm view on Meta::CPAN
}
return $env->{'uHTML.Macros'}->{$Name} ;
}
sub _getMacroValue()
{
my $Node = shift ;
my $Par = shift ;
my $Name = shift ;
my $Cnt = scalar @_ ;
my $env = $Node->{'ENV'} ;
my $M = _checkMacro( $env,$Name ) ;
print STDERR "getMacroValue $Name (".ref($M).")\n" if $DEBUG > 0 ;
return '' unless $M and ref $M eq 'uHTMLnode' ;
return $env->{'uHTML.MacroHTML'}->{$Name} if exists $env->{'uHTML.MacroHTML'}->{$Name} ;
my $Macro = $M->copy ;
if( $Cnt and ref $env->{'uHTML.MacroAttr'}->{$Name} eq 'ARRAY' )
{
my( $attr,$val ) ;
$env->{'uHTML.MacroVal'}->{$Name}->{$a} = $b ;
foreach $attr( @{$env->{'uHTML.MacroAttr'}->{$Name}} )
{
$val = $Cnt-- > 0 ? shift : $env->{'uHTML.MacroVal'}->{$Name}->{$attr} ;
uHTML::register( $attr,\&_Replace,1 ) unless _testDefine( $env,$attr ) ;
unshift @{$env->{'uHTML.Defines'}->{$attr}},$val ;
}
$Macro->map( '','' ) ;
shift @{$env->{'uHTML.Defines'}->{$_}} foreach @{$env->{'uHTML.MacroAttr'}->{$Name}} ;
}
else
{
$Macro->map( '','' ) ;
}
return( $env->{'uHTML.MacroHTML'}->{$Name} = $Macro->HTML() ) ;
}
sub _DoMacro( $ )
{
my $Node = shift ;
my $env = $Node->{'ENV'} ;
my $Name = $Node->name() ;
my $Macro ;
print STDERR "Check Macro '$Name'\n" if $DEBUG > 1 ;
return unless my $M = _checkMacro( $env,$Name ) ;
print STDERR "Execute Macro '$Name'\n" if $DEBUG > 0 ;
$Macro = $M->copy() ;
$Node->attr( $_ ) or $Node->deleteAttr( $_ ) foreach qw( createonly replace ) ;
$Node->testAttr( $_ ) or $Node->setAttr( $_,$env->{'uHTML.MacroVal'}->{$Name}->{$_} ) foreach @{$env->{'uHTML.MacroAttr'}->{$Name}} ;
print STDERR "Execute macro $Name(${\(join ',',map \"$_='${\($Node->attr($_))}'\",keys %{$Node->attributes()})})\n" if $DEBUG > 0 ;
Define( $Node ) ;
if( $env->{'uHTML.MacroBody'}->{$Name} )
{
$Node->map( '','' ) ;
$Macro->map( '','' ) ;
my( $H,$T ) = split m/<MacroBody>/s,$Macro->HTML(),2 ;
unshift @{$Node->{HTML}},$H ;
push @{$Node->{HTML}},$T ;
}
else
{
$Macro->map( '','' ) ;
$Node->{HTML} = $Macro->{HTML} ;
}
ClearDef( $Node ) ;
}
sub _findMacroBody
{
my $Node = shift ;
return undef unless $Node->firstChild() ;
my( $Child,$MBody ) ;
for( $Child = $Node->firstChild() ; $Child ; $Child=$Child->next() )
{
$MBody ? $Child->delete() : ($MBody = $Child) if $Child->name() eq 'MacroBody' ;
$MBody ? _findMacroBody( $Child ) : ($MBody = _findMacroBody( $Child )) ;
}
return $MBody ;
}
sub Macro( $ )
{
my $Node = shift ;
my $env = $Node->{'ENV'} ;
my $Replace ;
my $Name ;
return unless $Node->end() and $Name = $Node->attr( 'name' ) ;
return if $Replace = _checkMacro( $env,$Name ) and not $Node->testAttr( 'replace' ) ;
print STDERR "Define Macro '$Name\(${\($Node->attr( 'attributes' ))}\)'\n" if $DEBUG > 1 ;
$env->{'uHTML.MacroBody'}->{$Name} = _findMacroBody( $env->{'uHTML.Macros'}->{$Name} = $Node->copy() ) ;
if( $Node->testAttr( 'attributes' ) )
{
my( @AT,@A ) ;
if( @AT = ($Node->attr( 'attributes' ) =~ m/([^,'"=\s]+)(?:\s*\=\s*((?:\\,|[^'",])(?:\\,|[^,\s])*|'(?:\\'|[^'])*'|"(?:\\"|[^"])*")?)?\s*,?/sg) )
{
$_ & 1 ? $AT[$_] =~ m/^["']/ && $AT[$_] =~ s/^["']|["']$//g : push( @A,$AT[$_] ) foreach 0 .. $#AT ;
%{$env->{'uHTML.MacroVal'}->{$Name}} = ( @AT ) ;
$env->{'uHTML.MacroAttr'}->{$Name} = \@A ;
}
}
return if $Replace ;
print STDERR "Register Macro '$Name'\n" if $DEBUG > 0 and $env->{'uHTML.Macros'}->{$Name} and $Name eq 'Help' ;
uHTML::registerTag( $Name,\&_DoMacro,1 ) ;
uHTML::registerVar( $Name,\&_getMacroValue,1 ) ;
}
sub DefinedVar
{
( run in 1.760 second using v1.01-cache-2.11-cpan-5511b514fd6 )