# The LearningOnline Network with CAPA
# Style Parser Module
#
# last modified 06/29/00 by Alexander Sakharuk
package Apache::style;
use strict;
use HTML::TokeParser;
sub styleparser {
my ($target,$content_style_string) = @_;
my @target_list = ('target','web','tex','edit','modified','rat','answer','metadis');
my @value_style = ();
my $current_key = '';
my $current_value = '';
my $stoken;
my $flag;
my $iele;
my $flag_target;
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 {
# render output
while ($stoken = $pstyle->get_token and $stoken->[1] ne 'render') {
if ($stoken->[1] eq 'definetag') {
$flag = 1;
last;
}
}
if ($flag == 0) {
while ($stoken = $pstyle->get_token and $stoken->[1] ne 'definetag'
and $stoken->[1] ne 'render') {
# if token not equal to target $flag_target=0
$flag_target = 0;
for (my $i=0; $i<$#target_list; $i++) {
if ($stoken->[1] eq $target_list[$i]) {
$flag_target = 1;
}
}
if ($flag_target == 0) {
# target not found
my $tempo_out = &test($stoken->[0],$stoken->[1],$stoken->[2],$stoken->[4],@value_style);
$current_value .= $tempo_out;
} else {
# target found
if ($stoken->[0] eq 'S' and $stoken->[1] eq 'target') {
# target defined via <target> tag
if (defined $stoken->[2]{dest}) {
if (index($stoken->[2]{dest},$target) == -1) {
while ($stoken = $pstyle->get_token and $stoken->[1] ne 'target') {
}
} elsif (index($stoken->[2]{dest},$target) != -1) {
while ($stoken = $pstyle->get_token and $stoken->[1] ne 'target') {
my $tempo_out = &test($stoken->[0],$stoken->[1],$stoken->[2],$stoken->[4],@value_style);
$current_value .= $tempo_out;
}
}
} else {
if (index($stoken->[2]{excl},$target) != -1) {
while ($stoken = $pstyle->get_token and $stoken->[1] ne 'target') {
}
} elsif (index($stoken->[2]{excl},$target) == -1) {
while ($stoken = $pstyle->get_token and $stoken->[1] ne 'target') {
my $tempo_out = &test($stoken->[0],$stoken->[1],$stoken->[2],$stoken->[4],@value_style);
$current_value .= $tempo_out;
}
}
}
} elsif ($stoken->[1] ne $target) {
#target defined via short-form tag
my $tempo_token = $stoken->[1];
while ($stoken = $pstyle->get_token and $stoken->[1] ne $tempo_token) {
}
} else {
my $tempo_token = $stoken->[1];
while ($stoken = $pstyle->get_token and $stoken->[1] ne $tempo_token) {
my $tempo_out = &test($stoken->[0],$stoken->[1],$stoken->[2],$stoken->[4],@value_style);
$current_value .= $tempo_out;
}
}
}
}
}
}
}
$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;
}
sub test {
my ($zeroth,$first,$second,$fourth,@value_style) = @_;
my $current_value = '';
my $num;
my $flag;
if ($zeroth eq 'T') {
$current_value .= $first;
} elsif ($zeroth eq 'S') {
$flag = 0;
for (my $i=$#value_style-1;$i>=0;$i=$i-2) {
if ($first eq $value_style[$i]) {
$flag = 1;
$num = $i + 1;
last;
}
}
if ($flag == 0) {
$current_value .= $fourth;
} else {
$current_value .= $value_style[$num];
}
} elsif ($zeroth eq 'E') {
$flag = 0;
for (my $i=$#value_style-1;$i>=0;$i=$i-2) {
if ($first eq $value_style[$i]) {
$flag = 1;
$num = $i + 1;
last;
}
}
if ($flag == 0) {
$current_value .= $second;
} else {
$current_value .= $value_style[$num];
}
}
return $current_value;
}
1;
__END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>