- Timestamp:
- 10/31/08 10:05:52 (2 months ago)
- Location:
- src/perl6
- Files:
-
- 2 modified
-
STD_syntax_highlight (modified) (8 diffs)
-
STD_syntax_highlight.js (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/perl6/STD_syntax_highlight
r22835 r22838 14 14 # And finally our modules 15 15 use STD; 16 use DumpMatch;17 16 18 17 =head1 NAME … … 40 39 41 40 my ($clean_html,$help) = (0,0); 42 my ($full_html,$redspans_html) = (0, 0,'-');41 my ($full_html,$redspans_html) = (0,'-'); 43 42 my ($file, $parser, $src_text); 44 43 … … 95 94 96 95 # and finally print out the html code 97 highlight_match( $what=>$parser,{});96 highlight_match(); 98 97 } 99 98 … … 121 120 =cut 122 121 sub highlight_match { 123 my $name = shift;124 my $r = shift;125 my $opt = shift || {};126 my $events = [];127 128 122 if($full_html) { 129 traverse_match($r,$name,0,$events,$opt); 130 my $html = highlight_perl6_full($r,$::ORIG,$events,$opt); 123 my $html = highlight_perl6_full(); 131 124 write_html_file $full_html, $html; 132 125 } … … 143 136 =cut 144 137 sub highlight_perl6_full { 145 my ($r,$orig,$events,$opt,$file) = @ARG,146 138 my $str = ""; 147 my $at = 0;148 139 149 140 # slurp libraries and javascript to inline them … … 152 143 'STD_syntax_highlight.js', 153 144 'STD_syntax_highlight.css'); 145 my %colors = (); 146 my $line; 147 open CSS_FILE, $CSS 148 or die "Could not open $CSS: $OS_ERROR\n"; 149 while($line = <CSS_FILE>) { 150 if($line =~ /^\s*\.(\w+)\s*{\s*color\s*:\s*(\w+)/) { 151 $colors{$1} = $2; 152 } 153 } 154 close CSS_FILE; 155 154 156 my $jquery_js = qq{<script type="text/javascript" src="../$JQUERY_JS"></script>}; 155 157 my $js = qq{<script type="text/javascript" src="../$JS"></script>}; … … 189 191 HTML 190 192 191 my $curr_rule = q{}; 192 for (sort {$a->[0] <=> $b->[0] or $a->[4] <=> $b->[4]} @{$events}) { 193 my $text = substr($orig,$at,$_->[0]-$at); 194 my $esc_text .= escape_html($text); 195 $at = $_->[0]; 196 197 if($curr_rule eq 'identifier') { 198 if($parser->is_type($text)) { 199 $str .= qq{<span class="_type">$esc_text</span>}; 200 } elsif($parser->is_routine($text)) { 201 $str .= qq{<span class="_routine">$esc_text</span>}; 193 my ($last_tree,$buffer) = ("",""); 194 for my $i (0 .. @loc-1) { 195 next unless defined $loc[$i]; 196 my $c = substr($src_text,$i,1); 197 my $tree = "@{$loc[$i]}"; 198 199 if($tree ne $last_tree) { 200 $str .= qq{<span id="tree_$i" style="display:none;">$last_tree</span>}; 201 my $rule; 202 my $rule_to_color = 0; 203 $buffer = escape_html($buffer); 204 my @rules = (); 205 @rules = reverse(split / /,$last_tree) if $last_tree ne ''; 206 for $rule (@rules) { 207 if($rule eq 'unv') { 208 $rule_to_color = '_comment'; 209 last; 210 } elsif($colors{$rule} && $buffer ne '') { 211 $rule_to_color = $rule; 212 last; 213 } 214 } 215 if($rule_to_color) { 216 if($last_tree =~ /identifier/) { 217 if($parser->is_type($buffer)) { 218 $str .= qq{<span id="node_$i" class="_type">$buffer</span>}; 219 } elsif($parser->is_routine($buffer)) { 220 $str .= qq{<span id="node_$i" class="_routine">$buffer</span>}; 221 } else { 222 $str .= qq{<span id="node_$i" class="$rule_to_color">$buffer</span>}; 223 } 224 } else { 225 $str .= qq{<span id="node_$i" class="$rule_to_color">$buffer</span>}; 226 } 202 227 } else { 203 $str .= $esc_text;228 $str .= qq{<span id="node_$i">$buffer</span>}; 204 229 } 230 $buffer = $c; 205 231 } else { 206 $str .= $esc_text; 207 } 208 209 if ($_->[1] eq 'from') { 210 $curr_rule = $_->[2]; 211 $str .= '<span class="'.$curr_rule.'">'; 212 } elsif ($_->[1] eq 'to') { 213 $str .= '</span>'; 214 } 215 } 216 232 $buffer .= $c; 233 } 234 $last_tree = $tree; 235 } 236 217 237 $str .= <<"HTML"; 218 238 </pre> … … 269 289 my ($last_tree,$buffer) = ("",""); 270 290 for my $i (0 .. @loc-1) { 271 say("Undefined $i"),next unless defined $loc[$i];291 next unless defined $loc[$i]; 272 292 my $c = substr($src_text,$i,1); 273 293 my $tree = "@{$loc[$i]}"; -
src/perl6/STD_syntax_highlight.js
r22720 r22838 1 1 $(document.body).ready(function() { 2 2 //find first span after pre and use it as top-level node 3 var topLevelRuleName = null;4 3 var lastSelectedNode = null; 5 4 var keepResults = false; 6 5 var timeoutId = null; 7 6 8 $("pre > span").each(function(index,value) {9 topLevelRuleName = this.className;10 });11 12 if(topLevelRuleName == "") {13 alert("Assertion: Top Level node (pre > span) could not be found...");14 return;15 }16 7 $("#parse_tree_output").html("Found " + $("span").size() + " node(s)"); 17 8 18 9 function updateTree(node) { 19 10 if(lastSelectedNode) { 20 $(lastSelectedNode).css("border","");21 $(lastSelectedNode).css("background-color","");11 $(lastSelectedNode).css("border",""); 12 $(lastSelectedNode).css("background-color",""); 22 13 } 23 14 $(node).css("border","1px solid orange"); … … 26 17 var output = ""; 27 18 var ident = ""; 28 var rules = new Array(); 29 var ruleName; 30 do { 31 var ruleName = node.className; 32 var r = ruleName; 33 rules.push(ruleName); 34 node = node.parentNode; 35 } while(ruleName != topLevelRuleName) 36 for(var i = rules.length - 1; i >= 0; i--) { 37 var r = rules[i]; 38 output += ident + '<span class="' + r + '">' + r + '</span><br/>'; 19 var rules = $("#" + node.id.replace("node","tree")).text().split(/ /); 20 for(var i = 0; i < rules.length; i++) { 21 var r = rules[i]; 22 output += ident + '<span class="' + r + '">' + r + '</span><br/>'; 39 23 ident += " "; 40 24 }
