| 212 | | my ($last_tree,$buffer) = ("",""); |
| 213 | | for my $i (0 .. @loc-1) { |
| 214 | | next unless defined $loc[$i]; |
| 215 | | my $c = substr($src_text,$i,1); |
| 216 | | my $tree = ""; |
| 217 | | for my $action_ref (@{$loc[$i]}) { |
| 218 | | $tree .= ${$action_ref} . " "; |
| 219 | | } |
| 220 | | if($tree ne $last_tree) { |
| 221 | | $str .= qq{<span id="tree_$i" style="display:none;">$last_tree</span>}; |
| 222 | | my $rule; |
| 223 | | my $rule_to_color = 0; |
| 224 | | $buffer = escape_html($buffer); |
| 225 | | my @rules = (); |
| 226 | | @rules = reverse(split / /,$last_tree) if $last_tree ne ''; |
| 227 | | for $rule (@rules) { |
| 228 | | if($rule eq 'unv') { |
| 229 | | $rule_to_color = '_comment'; |
| 230 | | last; |
| 231 | | } elsif($colors{$rule} && $buffer ne '') { |
| 232 | | $rule_to_color = $rule; |
| 233 | | last; |
| 234 | | } |
| 235 | | } |
| 236 | | if($rule_to_color) { |
| 237 | | if($last_tree =~ /identifier/) { |
| 238 | | if($parser->is_type($buffer)) { |
| 239 | | $str .= qq{<span id="node_$i" class="_type">$buffer</span>}; |
| 240 | | } elsif($parser->is_routine($buffer)) { |
| 241 | | $str .= qq{<span id="node_$i" class="_routine">$buffer</span>}; |
| 242 | | } else { |
| 243 | | $str .= qq{<span id="node_$i" class="$rule_to_color">$buffer</span>}; |
| 244 | | } |
| 245 | | } else { |
| 246 | | $str .= qq{<span id="node_$i" class="$rule_to_color">$buffer</span>}; |
| 247 | | } |
| 248 | | } else { |
| 249 | | $str .= qq{<span id="node_$i">$buffer</span>}; |
| 250 | | } |
| 251 | | $buffer = $c; |
| | 212 | local *spit_full_html = sub { |
| | 213 | my ($i, $buffer, $rule, $tree) = @ARG; |
| | 214 | $buffer = escape_html($buffer); |
| | 215 | $str .= qq{<span id="tree_$i" style="display:none;">$tree</span>}; |
| | 216 | if($rule) { |
| | 217 | $str .= qq{<span id="node_$i" class="$rule">$buffer</span>}; |