# The LearningOnline Network with CAPA
# Style Parser Module
#
# last modified 06/23/00 by Alexander Sakharuk
package Apache::lonstyleparser;
use strict;
use HTML::TokeParser;
#============================================================= style subroutine
sub styleparser {
my ($target,$content_style_string) = @_;
#------------------------------------------- target redefinition (if necessary)
my @target_string = '';
my $element;
($element,@target_string) = split ('&&',$target);
map {$content_style_string =~ s/\<(.*)$_\>/\<$1$element\>/g; } @target_string;
$target = $element;
#-------------------------------------------- create a table for defined target
#----------------------------------------- from the information from Style File
my @value_style = ();
my $current_key = '';
my $current_value = '';
my $stoken;
my $flag;
my $iele;
my $pstyle = HTML::TokeParser->new(\$content_style_string);
while ($stoken = $pstyle->get_token) {
#----------------------------------------------------- start for tag definition
if ($stoken->[0] eq 'S' and $stoken->[1] eq 'definetag') {
#-------------------------------------------------------------- new key in hash
$current_key = $stoken->[2]{name};
$flag = 0;
#-------------------------------------------------------------- metadata output
if ($target eq 'meta') {
while ($stoken = $pstyle->get_token and $stoken->[1] ne 'definetag') {
if ($stoken->[0] eq 'S' and $stoken->[1] eq 'meta') {
while ($stoken = $pstyle->get_token and $stoken->[1] ne 'meta') {
$current_value .= $stoken->[1];
}
}
}
} else {
#--------------------------------------------------------------- outtext output
while ($stoken = $pstyle->get_token and $stoken->[1] ne 'outtext') {
if ($stoken->[1] eq 'definetag') {
$flag = 1;
last;
}
}
if ($flag == 0) {
while ($stoken = $pstyle->get_token and $stoken->[0] ne 'S') {
$current_value .= $stoken->[1];
}
while ($stoken->[1] ne 'definetag') {
if ($stoken->[0] eq 'S' and $stoken->[1] eq $target) {
while ($stoken = $pstyle->get_token) {
if ($stoken->[1] ne $target) {
if ($stoken->[0] eq 'S') {
my $flagelem = 0;
for (my $i=$#value_style-1;$i>0;$i=$i-2) {
if ($stoken->[1] eq $value_style[$i]) {
$flagelem = 1;
$iele = $i+1;
last;
}
}
if ($flagelem == 0) {
$current_value .= $stoken->[4];
} else {
$current_value .= $value_style[$iele];
}
}
if ($stoken->[0] eq 'E') {
my $flagelem = 0;
for (my $i=$#value_style-1;$i>0;$i=$i-2) {
if ('/'.$stoken->[1] eq $value_style[$i]) {
$flagelem = 1;
$iele = $i+1;
last;
}
}
if ($flagelem == 0) {
$current_value .= $stoken->[2];
} else {
$current_value .= $value_style[$iele];
}
}
if ($stoken->[0] eq 'T') {
$current_value .= $stoken->[1];
}
} else {
last;
}
}
} elsif ($stoken->[0] eq 'S' and $stoken->[1] ne $target) {
my $tempotempo = $stoken->[1];
while ($stoken = $pstyle->get_token and $stoken->[1] ne $tempotempo) {
}
}
while ($stoken = $pstyle->get_token) {
if ($stoken->[0] eq 'T') {
$current_value .= $stoken->[1];
}
if ($stoken->[0] eq 'E') {
last;
}
if ($stoken->[0] eq 'S') {
last;
}
}
}
}
}
}
$current_value =~ s/(\s)+/$1/g;
if ($current_value ne ' ' and $current_value ne '' ) {
push (@value_style,lc $current_key,$current_value);
}
$current_key = '';
$current_value = '';
}
my %style_for_target = @value_style;
#--------------------------------------------------------------- check printing
# while (($current_key,$current_value) = each %style_for_target) {
# print "$current_key => $current_value\n";
# }
#---------------------------------------------------------------- return result
return %style_for_target;
}
1;
__END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>