1. <?php 
  2.     error_reporting(E_ALL); 
  3.      
  4.     if (isset($_GET['thing']) === false) 
  5.     { 
  6.         $thing = 'source.php'; 
  7.     } 
  8.     else 
  9.     { 
  10.         $thing = basename($_GET['thing']); 
  11.     } 
  12.      
  13.     if ($thing !== 'source.php') 
  14.     { 
  15.         $thing = 'source/' . $thing; 
  16.     } 
  17.      
  18.     if (file_exists($thing) === false || substr($thing, -4) != '.php') 
  19.     { 
  20.         Header('Content-type: text/plain'); 
  21.         printf("I'm not that dumb. Mm'k?"); 
  22.         exit(); 
  23.     } 
  24.      
  25.     // kuja's php highlighter. :> 
  26.     // modified to my wishes, of course. 
  27.      
  28.     // Fix certain tokens between PHP4 and PHP5. 
  29.     if (defined('T_ML_COMMENT') === false) 
  30.     { 
  31.         // Define T_ML_COMMENT for PHP5. 
  32.         define('T_ML_COMMENT', T_COMMENT); 
  33.     } 
  34.     else 
  35.     { 
  36.         // Define T_DOC_COMMENT for PHP4. 
  37.         define('T_DOC_COMMENT', T_ML_COMMENT); 
  38.     } 
  39.      
  40.     /** 
  41.      * Generate valid-HTML PHP syntax highlighting. 
  42.      * 
  43.      * @author Matthew Harris <shugotenshi@gmail.com> 
  44.      */ 
  45.      
  46.     function highlight($file) 
  47.     { 
  48.         static $functions = false; 
  49.          
  50.         if ($functions === false) 
  51.         { 
  52.             $functions = get_defined_functions(); 
  53.             $functions = $functions['internal']; 
  54.         } 
  55.          
  56.         // Get file as string. 
  57.         $str    = trim(file_get_contents($file)); 
  58.          
  59.         // Get all tokens from string. 
  60.         $tokens    = token_get_all($str); 
  61.          
  62.         // Output beginning of ordered list.      
  63.         $code    = '<ol id="highlight">' . "\n" . '<li class="odd">'; 
  64.          
  65.         $iterator = 1; 
  66.         foreach ($tokens as $key => $token) 
  67.         { 
  68.             // Get token and value. 
  69.             if (is_array($token)) 
  70.             { 
  71.                 $value = $token[1]; 
  72.                 $token = $token[0]; 
  73.             } 
  74.             else 
  75.             { 
  76.                 $value = $token; 
  77.             } 
  78.              
  79.             // Convert any HTML values in $value to entities. 
  80.             $base = $value; 
  81.             $value = htmlentities($value); 
  82.              
  83.             // Convert each tab to spaces, and each space to HTML non-breaking spaces. 
  84.             $value = str_replace(array("\t", ' '), array('&nbsp;&nbsp;&nbsp;&nbsp;', '&nbsp;'), $value); 
  85.              
  86.             /* 
  87.             do 
  88.             { 
  89.                 $position = strpos($value, "\t", 0); 
  90.                  
  91.                 if ($position === false) 
  92.                 { 
  93.                     break; 
  94.                 } 
  95.                  
  96.                 $prefix = substr($value, 0, $position); 
  97.                 $suffix = substr($value, $position + 1); 
  98.                  
  99.                 $value = $prefix . str_repeat('&nbsp;', 4 - (strlen($prefix) % 4)). $suffix; 
  100.             } 
  101.             while (true); 
  102.             $value = str_replace(' ', '&nbsp;', $value); 
  103.             */ 
  104.              
  105.             // Check each token. 
  106.             switch ($token) 
  107.             { 
  108.                 case '@': 
  109.                 { 
  110.                     $code .= '<span class="errSupp">'        . $value . '</span>'; 
  111.                     break; 
  112.                 } 
  113.                  
  114.                 case '!': 
  115.                 { 
  116.                     $code .= '<span class="notOper">'        . $value . '</span>'; 
  117.                     break; 
  118.                 } 
  119.                  
  120.                 case '=': 
  121.                 { 
  122.                     $code .= '<span class="equalSign">'        . $value . '</span>'; 
  123.                     break; 
  124.                 } 
  125.                  
  126.                 case '{': 
  127.                 { 
  128.                     $code .= '<span class="curlyOpen">'        . $value . '</span>'; 
  129.                     break; 
  130.                 } 
  131.                  
  132.                 case '}': 
  133.                 { 
  134.                     $code .= '<span class="curlyClose">'        . $value . '</span>'; 
  135.                     break; 
  136.                 } 
  137.                  
  138.                 case '(': 
  139.                 { 
  140.                     $code .= '<span class="parenOpen">'        . $value . '</span>'; 
  141.                     break; 
  142.                 } 
  143.                  
  144.                 case ')': 
  145.                 { 
  146.                     $code .= '<span class="parenClose">'        . $value . '</span>'; 
  147.                     break; 
  148.                 } 
  149.                  
  150.                 case '[': 
  151.                 { 
  152.                     $code .= '<span class="bracketOpen">'        . $value . '</span>'; 
  153.                     break; 
  154.                 } 
  155.                  
  156.                 case ']': 
  157.                 { 
  158.                     $code .= '<span class="bracketClose">'        . $value . '</span>'; 
  159.                     break; 
  160.                 } 
  161.                  
  162.                 case ';': 
  163.                 { 
  164.                     $code .= '<span class="semiColon">'        . $value . '</span>'; 
  165.                     break; 
  166.                 } 
  167.                  
  168.                 case ',': 
  169.                 { 
  170.                     $code .= '<span class="comma">'            . $value . '</span>'; 
  171.                     break; 
  172.                 } 
  173.                  
  174.                 case ':': 
  175.                 { 
  176.                     $code .= '<span class="colon">'            . $value . '</span>'; 
  177.                     break; 
  178.                 } 
  179.                  
  180.                 case '.': 
  181.                 { 
  182.                     $code .= '<span class="concat">'        . $value . '</span>'; 
  183.                     break; 
  184.                 } 
  185.                  
  186.                 case '<': 
  187.                 { 
  188.                     $code .= '<span class="lessThan">'        . $value . '</span>'; 
  189.                     break;     
  190.                 } 
  191.                  
  192.                 case '>': 
  193.                 { 
  194.                     $code .= '<span class="greaterThan">'        . $value . '</span>'; 
  195.                     break; 
  196.                 } 
  197.                  
  198.                 case '+': 
  199.                 { 
  200.                     $code .= '<span class="addition">'        . $value . '</span>'; 
  201.                     break; 
  202.                 } 
  203.                  
  204.                 case '-': 
  205.                 { 
  206.                     $code .= '<span class="subtraction">'        . $value . '</span>'; 
  207.                     break; 
  208.                 } 
  209.                  
  210.                 case '*': 
  211.                 { 
  212.                     $code .= '<span class="multiplication">'    . $value . '</span>'; 
  213.                     break; 
  214.                 } 
  215.                  
  216.                 case '/': 
  217.                 { 
  218.                     $code .= '<span class="division">'        . $value . '</span>'; 
  219.                     break; 
  220.                 } 
  221.                  
  222.                 case '%': 
  223.                 { 
  224.                     $code .= '<span class="modulus">'        . $value . '</span>'; 
  225.                     break; 
  226.                 } 
  227.                  
  228.                 case '&': 
  229.                 { 
  230.                     $code .= '<span class="bitAnd">'        . $value . '</span>'; 
  231.                     break; 
  232.                 } 
  233.                  
  234.                 case '|': 
  235.                 { 
  236.                     $code .= '<span class="bitOr">'            . $value . '</span>'; 
  237.                     break; 
  238.                 } 
  239.                  
  240.                 case '^': 
  241.                 { 
  242.                     $code .= '<span class="bitXor">'        . $value . '</span>'; 
  243.                     break; 
  244.                 } 
  245.                  
  246.                 case '~': 
  247.                 { 
  248.                     $code .= '<span class="bitNot">'        . $value . '</span>'; 
  249.                     break; 
  250.                 } 
  251.                  
  252.                 default: 
  253.                 { 
  254.                     // Check for new lines, to create list items from. 
  255.                     if ($value == "\n") 
  256.                     { 
  257.                         $code .= '&nbsp;</li>' . "\n" . '<li class="' . (++$iterator % 2 ? "odd" : "even") . '">'; 
  258.                     } 
  259.                     else 
  260.                     { 
  261.                         // Explode code by newlines. 
  262.                         $lines = explode("\n", $value); 
  263.                          
  264.                         foreach ($lines as $key => $line) 
  265.                         { 
  266.                             // Make sure it's not an empty line. 
  267.                             if (trim($line) != '') 
  268.                             { 
  269.                                 switch ($token) 
  270.                                 { 
  271.                                     // This list isn't complete. 
  272.                                     case T_EXIT: 
  273.                                     case T_SWITCH: 
  274.                                     case T_BREAK: 
  275.                                     case T_ECHO: 
  276.                                     case T_ARRAY: 
  277.                                     case T_ISSET: 
  278.                                     case T_FOREACH: 
  279.                                     case T_REQUIRE_ONCE: 
  280.                                     case T_UNSET: 
  281.                                     case T_RETURN: 
  282.                                     case T_STRING: 
  283.                                     { 
  284.                                         if ($token !== T_STRING || in_array(strtolower($value), $functions) === true) 
  285.                                         { 
  286.                                             $code .= '<span class="' . (is_int($token) ? token_name($token) : 'unknown') . '"><a class="' . (is_int($token) ? token_name($token) : 'unknown') . '" href="http://www.php.net/manual-lookup.php?lang=en&amp;pattern=' . strtolower($value) . '">' . $line . '</a></span>'; 
  287.                                             break; 
  288.                                         } 
  289.                                     } 
  290.                                      
  291.                                     default: 
  292.                                     { 
  293.                                         $code .= '<span class="' . (is_int($token) ? token_name($token) : 'unknown') . '">' . $line . '</span>'; 
  294.                                         break; 
  295.                                     } 
  296.                                 } 
  297.                             } 
  298.                              
  299.                             // Separate new lines as list items. 
  300.                             if (count($lines) > 1 && isset($lines[$key + 1])) 
  301.                             { 
  302.                                 $code .= '&nbsp;</li>' . "\n" . '<li class="' . (++$iterator % 2 ? "odd" : "even") . '">'; 
  303.                             } 
  304.                         } 
  305.                     } 
  306.                      
  307.                     break; 
  308.                 } 
  309.             } 
  310.         } 
  311.          
  312.         // End ordered list. 
  313.         $code .= '&nbsp;</li>' . "\n" . '</ol>' . "\n"; 
  314.          
  315.         // Return highlighted code.      
  316.         return $code;     
  317.     } 
  318. ?> 
  319. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd"> 
  320.  
  321. <html> 
  322.     <head> 
  323.         <title>source: viewing '<?php echo htmlentities(basename($thing)); ?>'</title> 
  324.          
  325.         <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
  326.         <meta http-equiv="Pragma" content="no-cache"> 
  327.          
  328.         <style type="text/css"> 
  329.             @import url('http://rick.gibbed.us/styles/highlight.css'); 
  330.              
  331.             body 
  332.             { 
  333.                 margin: 0em; 
  334.                 padding: 0em; 
  335.                 font-size: 0.8em; 
  336.                  
  337.                 font-family: Tahoma, Verdana, Arial, sans-serif; 
  338.             } 
  339.              
  340.             #highlight 
  341.             { 
  342.                 width: auto; 
  343.                 margin-left: 4em; 
  344.             } 
  345.              
  346.             #highlight li 
  347.             { 
  348.                 font-family: "Courier New", Courier, monospace; 
  349.                 white-space: nowrap; 
  350.             } 
  351.              
  352.             #highlight li.odd 
  353.             { 
  354.                 background-color: #ffffff; 
  355.             } 
  356.              
  357.             #highlight li.even 
  358.             { 
  359.                 background-color: #f9f9f9; 
  360.             } 
  361.         </style> 
  362.     </head> 
  363.      
  364.     <body> 
  365. <?php echo highlight($thing); ?> 
  366.     </body> 
  367. </html>