skripti joka lukee tiedoston palvelimelta, tulostaa rivinumerot ja värittää php-koodin palvelimen asetusten mukaan (hightlight_string()-funktiota käyttäen)
Tarjoaa myös skriptin download mahdollisuuden.
http://nikc.fdns.net/~nikke/dev/highl2.php?fn=highl2.php
<?php ////////////////////////////////////////////////////////////// // highl2.php // // Version 2.4 // // A script for highlighting the code of a php-script // with functionality for downloading the code as well. // // Params: // o fn - filename of script to parse // // Created in May 2003 by Niklas Lindgren (nikke@nikke.letm.com) // // // Feel free to use free of charge. However I would appreciate // if you would drop me a line if you do find this useful :) ////////////////////////////////////////////////////////////// if( isset($_GET['fn']) && (is_file($_GET['fn'])) ) { $fn = $_GET['fn']; if (ereg("(^/)|(\.\.)", $fn)) { die("Illegal chars in filename"); } $fileisok = true; } else { $fileisok = false; } // check for download if( isset($_GET['dl']) && ($_GET['dl'] == 1) && $fileisok ) { header( "Content-Type: application/octet-stream\n\n" ); header( "Content-Disposition: attachment; filename=".$fn ); readfile( $fn ); exit( 0 ); } ?> <html><head> <title>Sourcecode of <?php print( $fn ); ?></title> <style type="text/css"> table,tr,td { font: 10pt courier; } .over { background-color: #dddddd; } .out { background-color: white; } .rn { background-color: #dddddd; text-align: right; } </style> </head><body> <?php if( ! $fileisok ): ?> Invalid filename <?php print($_GET['fn']); ?>... <?php else: ?> <h1><?php print($fn); ?></h1> [<a href="<?php printf( "%s?fn=%s&dl=1", $_SERVER['PHP_SELF'], $fn )?>">Download</a>]<br> <br> <table cellspacing="0" cellpadding="2"> <?php function striptags( $str ) { // hightlight_string() requires < ? and ? > to actually do something. // this part removes them since we don't want them on every line $pone = strpos( $str, "<?php" ); $ptwo = strrpos( $str, "?>" ); $str = substr( $str, 0, $pone ).substr( $str, $pone+8, $ptwo-($pone+8) ).substr( $str, $ptwo+5 ); return $str; } // read file contens into array $linearray = file( $fn ); for( $i = 0, $php = 0, $mlc = 0; $i < sizeof($linearray); $i++ ) { // in order for highlight to work correctly we need to check if this is explicitly html or php. // or actually, the start of a php-block. Rows with "inline"-php don't require any state changes :) if( strpos($linearray[$i], "<"."?") === FALSE || strpos($linearray[$i], "?".">") === FALSE ) { if( strpos($linearray[$i], "<"."?") !== FALSE ) { $php = 1; } else if( strpos($linearray[$i], "?".">") !== FALSE ) { $php = 2; } } /* * this part is here because multiline comments caused errors. * comment state is controlled here */ if( strpos($linearray[$i], "/*") !== FALSE && strpos($linearray[$i], "*/") === FALSE ) { $mlc = 1; $linearray[$i] = $linearray[$i] . "*/"; } else if( $mlc != 0 && strpos($linearray[$i], "*/") !== FALSE ) { $mlc = 3; } /* * this part is here because multiline comments caused errors. * comment-markings are added here */ if( $mlc > 1 ) { $linearray[$i] = "//" . $linearray[$i]; } switch( $php ) { case 0: // Highlight html, or php which starts and ends on the same row $hrow = highlight_string($linearray[$i], true); break; case 1: // Highlight explicit php-code. $hrow = striptags( highlight_string("<"."?php".$linearray[$i]."?".">", true) ); break; case 2: // Highlight the last row of a php-block $php = 0; $hrow = striptags( highlight_string("<"."?php". substr($linearray[$i], 0, strpos($linearray[$i], "?".">")+2). "?".">", true). highlight_string(substr($linearray[$i], strpos($linearray[$i], "?".">")+2), true) ); break; } /* * this part is here because multiline comments caused errors. * the added comment-markings are removed here. */ switch( $mlc ) { case 1: $hrow = substr( $hrow, 0, strpos($hrow, "*/") ).substr( $hrow, strpos($hrow, "*/") + 2 ); $mlc++; break; case 3: $mlc = 0; case 2: $hrow = substr( $hrow, 0, strpos($hrow, "//") ).substr( $hrow, strpos($hrow, "//") + 2 ); break; } // output the result and become very very happy print( "<tr><td class=\"rn\">".($i+1)."</td>". "<td onMouseOver=\"this.className = 'over'\" onMouseOut=\"this.className = 'out'\" nowrap>". str_replace( "\n", "", $hrow ). "</td></tr>\n" ); } ?> </table> <?php endif; ?> </body></html>
huvikseni rupesin tutkimaan miten tuota saisi vähemmän purkkamaiseksi ja siihenhän kävisi highlight_string() -funktio.
taas opittiin että rtfm kannattaa aina :)
Tyylikäs ja hyvin tehty systeemi. En tiennytkään, että download onnistuu noin näppärästi. Rivin korostus on vähän turha, mutta senhän saa helposti pois.
bugittaa vielä jos käyttää multiline kommentteja...
fiksattu...
Ainoa huono puoli on ettei koodia saa kopioitua suoraan.. Sen voisi korjata laittamalla tablet tyyliin:
<table> <tr> <td> <table> <tr><td>Rivi 1</td></tr> <tr><td>Rivi 2</td></tr> </table> </td> <td> <table> <tr><td>Koodirivi 1</td></tr> <tr><td>Koodirivi 2</td></tr> </table> </td> </tr> </table>
No unohtui sitten [/koodi] perästä :)
no kai tosta selvää saa...
saishan sen noin, mutta se download-linkki on mielestäni ihan riittävä.
No onhan se perjaatteessa, mutta mielummin itse copy pastean koodinpätkät :)
Hyvää työtä kuitenkin!
Sinänsä huono että tossa on vaan toi downloadi... kun ei onnistu ton avaaminen muistiossa, pitää käyttää sit aina jotain raskaampaa..
Mistähän johtuu jos koodissa on vaikka rivinvaihto näin: \n
niin alkaa huutamaan tämmöstä:
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /http/koodi.php on line 112
"\\n\", $data);
Aihe on jo aika vanha, joten et voi enää vastata siihen.