Annotation of loncom/xml/lonxml.pm, revision 1.2
1.2 ! sakharuk 1: # The LearningOnline Network with CAPA
! 2: # Style Parser Module
! 3: #
! 4: # last modified 06/23/00 by Alexander Sakharuk
! 5:
! 6: package Apache::lonstyleparser;
1.1 sakharuk 7:
8: use strict;
9: use HTML::TokeParser;
10:
1.2 ! sakharuk 11: #============================================================= style subroutine
1.1 sakharuk 12:
13: sub styleparser {
14:
1.2 ! sakharuk 15: my ($target,$content_style_string) = @_;
1.1 sakharuk 16:
1.2 ! sakharuk 17: #------------------------------------------- target redefinition (if necessary)
1.1 sakharuk 18:
1.2 ! sakharuk 19: my @target_string = '';
! 20: my $element;
1.1 sakharuk 21:
1.2 ! sakharuk 22: ($element,@target_string) = split ('&&',$target);
1.1 sakharuk 23:
1.2 ! sakharuk 24: map {$content_style_string =~ s/\<(.*)$_\>/\<$1$element\>/g; } @target_string;
1.1 sakharuk 25:
1.2 ! sakharuk 26: $target = $element;
1.1 sakharuk 27:
1.2 ! sakharuk 28: #-------------------------------------------- create a table for defined target
! 29: #----------------------------------------- from the information from Style File
1.1 sakharuk 30:
1.2 ! sakharuk 31: my @value_style = ();
! 32: my $current_key = '';
! 33: my $current_value = '';
! 34: my $stoken;
! 35: my $flag;
! 36: my $iele;
! 37:
! 38: my $pstyle = HTML::TokeParser->new(\$content_style_string);
! 39:
! 40: while ($stoken = $pstyle->get_token) {
! 41: #----------------------------------------------------- start for tag definition
! 42: if ($stoken->[0] eq 'S' and $stoken->[1] eq 'definetag') {
! 43: #-------------------------------------------------------------- new key in hash
! 44: $current_key = $stoken->[2]{name};
! 45: $flag = 0;
! 46: #-------------------------------------------------------------- metadata output
! 47: if ($target eq 'meta') {
! 48: while ($stoken = $pstyle->get_token and $stoken->[1] ne 'definetag') {
! 49: if ($stoken->[0] eq 'S' and $stoken->[1] eq 'meta') {
! 50: while ($stoken = $pstyle->get_token and $stoken->[1] ne 'meta') {
! 51: $current_value .= $stoken->[1];
! 52: }
! 53: }
! 54: }
! 55: } else {
! 56: #--------------------------------------------------------------- outtext output
! 57: while ($stoken = $pstyle->get_token and $stoken->[1] ne 'outtext') {
! 58: if ($stoken->[1] eq 'definetag') {
! 59: $flag = 1;
! 60: last;
! 61: }
! 62: }
! 63: if ($flag == 0) {
! 64: while ($stoken = $pstyle->get_token and $stoken->[0] ne 'S') {
! 65: $current_value .= $stoken->[1];
! 66: }
! 67: while ($stoken->[1] ne 'definetag') {
! 68: if ($stoken->[0] eq 'S' and $stoken->[1] eq $target) {
! 69: while ($stoken = $pstyle->get_token) {
! 70: if ($stoken->[1] ne $target) {
! 71: if ($stoken->[0] eq 'S') {
! 72: my $flagelem = 0;
! 73: for (my $i=$#value_style-1;$i>0;$i=$i-2) {
! 74: if ($stoken->[1] eq $value_style[$i]) {
! 75: $flagelem = 1;
! 76: $iele = $i+1;
! 77: last;
! 78: }
! 79: }
! 80: if ($flagelem == 0) {
! 81: $current_value .= $stoken->[4];
! 82: } else {
! 83: $current_value .= $value_style[$iele];
! 84: }
! 85: }
! 86: if ($stoken->[0] eq 'E') {
! 87: my $flagelem = 0;
! 88: for (my $i=$#value_style-1;$i>0;$i=$i-2) {
! 89: if ('/'.$stoken->[1] eq $value_style[$i]) {
! 90: $flagelem = 1;
! 91: $iele = $i+1;
! 92: last;
! 93: }
! 94: }
! 95: if ($flagelem == 0) {
! 96: $current_value .= $stoken->[2];
! 97: } else {
! 98: $current_value .= $value_style[$iele];
! 99: }
! 100: }
! 101: if ($stoken->[0] eq 'T') {
! 102: $current_value .= $stoken->[1];
! 103: }
! 104: } else {
! 105: last;
! 106: }
! 107: }
! 108: } elsif ($stoken->[0] eq 'S' and $stoken->[1] ne $target) {
! 109: my $tempotempo = $stoken->[1];
! 110: while ($stoken = $pstyle->get_token and $stoken->[1] ne $tempotempo) {
! 111: }
! 112: }
! 113:
! 114: while ($stoken = $pstyle->get_token) {
! 115: if ($stoken->[0] eq 'T') {
! 116: $current_value .= $stoken->[1];
! 117: }
! 118: if ($stoken->[0] eq 'E') {
! 119: last;
! 120: }
! 121: if ($stoken->[0] eq 'S') {
! 122: last;
! 123: }
! 124: }
1.1 sakharuk 125:
1.2 ! sakharuk 126: }
! 127: }
! 128: }
1.1 sakharuk 129:
1.2 ! sakharuk 130: }
! 131: $current_value =~ s/(\s)+/$1/g;
! 132: if ($current_value ne ' ' and $current_value ne '' ) {
! 133: push (@value_style,lc $current_key,$current_value);
! 134: }
! 135: $current_key = '';
! 136: $current_value = '';
! 137:
! 138: }
! 139: my %style_for_target = @value_style;
! 140: #--------------------------------------------------------------- check printing
! 141: # while (($current_key,$current_value) = each %style_for_target) {
1.1 sakharuk 142: # print "$current_key => $current_value\n";
1.2 ! sakharuk 143: # }
! 144: #---------------------------------------------------------------- return result
! 145: return %style_for_target;
1.1 sakharuk 146: }
147:
148: 1;
149: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>