Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Koodin korostus rivinumeroineen

Sivun loppuun

NiKC [16.05.2003 07:51:34]

#

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>

NiKC [16.05.2003 23:06:09]

#

huvikseni rupesin tutkimaan miten tuota saisi vähemmän purkkamaiseksi ja siihenhän kävisi highlight_string() -funktio.

taas opittiin että rtfm kannattaa aina :)

Antti Laaksonen [18.05.2003 02:01:15]

#

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.

NiKC [20.05.2003 15:47:40]

#

bugittaa vielä jos käyttää multiline kommentteja...

NiKC [20.05.2003 16:51:24]

#

fiksattu...

odys [23.05.2003 00:15:11]

#

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>

odys [23.05.2003 00:16:01]

#

No unohtui sitten [/koodi] perästä :)
no kai tosta selvää saa...

NiKC [23.05.2003 07:43:29]

#

saishan sen noin, mutta se download-linkki on mielestäni ihan riittävä.

odys [27.05.2003 12:46:26]

#

No onhan se perjaatteessa, mutta mielummin itse copy pastean koodinpätkät :)

Hyvää työtä kuitenkin!

Tumpi [31.05.2003 21:12:25]

#

Sinänsä huono että tossa on vaan toi downloadi... kun ei onnistu ton avaaminen muistiossa, pitää käyttää sit aina jotain raskaampaa..

KuinKala [24.11.2004 15:08:54]

#

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);


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta