Share Pastebin
Guest
Public paste!

lolcodeclass LOLCODE

By: a guest | Jun 16th, 2009 | Syntax: PHP | Size: 8.82 KB | Hits: 81 | Expires: Never
Copy text to clipboard
  1. <?php
  2.  
  3. /**
  4.  * LOLCode
  5.  *
  6.  * @package LOLCode
  7.  * @author Xikeon / 3picM1ke
  8.  * @copyright 2009
  9.  * @access public
  10.  */
  11. class LOLCode {
  12.        
  13.     public $sDir = 'pages/';
  14.     public $bDebug = false;
  15.    
  16.     /**
  17.     * LOLCode::display()
  18.     *
  19.     * @param mixed $sFile
  20.     * @return void
  21.     */
  22.     public function display( $sFile )
  23.     {
  24.        
  25.         if( strstr( $sFile, ',' ) )
  26.         {
  27.        
  28.             $aFiles = explode( ',', $sFile );
  29.            
  30.             foreach( $aFiles as $sFilename )
  31.             {
  32.            
  33.                 if( $this->isPage( $sFilename ) )
  34.                 {
  35.                    
  36.                     $sPage = $this->getPage( $sFilename );
  37.                    
  38.                     if( $this->bDebug )
  39.                     {
  40.                        
  41.                         echo '<strong>Debug:</strong><br /><pre>' . htmlspecialchars( $this->doLol( $sPage ) ) . '</pre><hr />';
  42.                                        
  43.                     }
  44.                     else
  45.                     {
  46.                        
  47.                         eval( '?> ' . $this->doLol( $sPage ) );
  48.                        
  49.                     }
  50.                                    
  51.                 }
  52.                 else
  53.                 {
  54.                    
  55.                     die( 'Page does not exist: ' . htmlspecialchars( $sFilename ) );
  56.                                    
  57.                 }
  58.                
  59.             }
  60.        
  61.         }
  62.         else
  63.         {
  64.        
  65.             if( $this->isPage( $sFile ) )
  66.             {
  67.                
  68.                 $sPage = $this->getPage( $sFile );
  69.                
  70.                 if( $this->bDebug )
  71.                 {
  72.                    
  73.                     echo '<strong>Debug:</strong><br /><pre>' . htmlspecialchars( $this->doLol( $sPage ) ) . '</pre><hr />';
  74.                                    
  75.                 }
  76.                 else
  77.                 {
  78.                    
  79.                     eval( '?> ' . $this->doLol( $sPage ) );
  80.                    
  81.                 }
  82.                
  83.             }
  84.             else
  85.             {
  86.                
  87.                 die( 'Page does not exist: ' . htmlspecialchars( $sFile ) );
  88.                
  89.             }
  90.        
  91.         }
  92.    
  93.     }
  94.    
  95.     /**
  96.     * LOLCode::isPage()
  97.     *
  98.     * @param mixed $sFile
  99.     * @return
  100.     */
  101.     private function isPage( $sFile )
  102.     {
  103.        
  104.         if( is_file( $this->sDir . $sFile . '.lol' ) )
  105.         {
  106.        
  107.             return true;
  108.        
  109.         }
  110.        
  111.         return false;
  112.    
  113.     }
  114.    
  115.     /**
  116.     * LOLCode::getPage()
  117.     *
  118.     * @param mixed $sFile
  119.     * @return
  120.     */
  121.     private function getPage( $sFile )
  122.     {
  123.        
  124.         $sContent = file_get_contents( $this->sDir . $sFile . '.lol' );
  125.        
  126.         return $sContent;
  127.    
  128.     }
  129.    
  130.     /**
  131.      * LOLCode::doLol()
  132.      *
  133.      * @param mixed $sContent
  134.      * @return
  135.      */
  136.     private function doLol( $sContent )
  137.     {
  138.        
  139.         // Only between HAI and KTHXBYE
  140.         preg_match( '/HAI(.*)KTHXBYE/s', $sContent, $aMatches );
  141.        
  142.         $sNewContent = str_replace( $aMatches[ 0 ], '[r3pl4c3m3w1thth3c0d3]', $sContent );
  143.        
  144.         $aReplaces = array(
  145.             // Tag
  146.             '/^[\s]*HAI[\s]*$/' => '<?php',
  147.            '/^[\s]*KTHXBYE[\s]*$/' => '?>',
  148.            
  149.             // Include for .lol & Require for .php
  150.             '/^[\s]*CAN HAS ([a-zA-Z0-9-_]*)\?[\s]*$/' => 'eval( \'?> \' . $this->display( strtolower( \'$1\' ) ) );',
  151.             '/^[\s]*MUST HAS ([a-zA-Z0-9-_]*)[\s]*$/' => 'require( strtolower( \'$1.php\' ) );',
  152.            
  153.             // Echo
  154.             '/^[\s]*VISIBLE ([a-zA-Z0-9]*)[\s]*$/' => 'echo \$$1;',
  155.             '/^[\s]*VISIBLE (.+?)[\s]*$/' => 'echo $1;',
  156.            
  157.             // Comments
  158.             '/^[\s]*BTW (.+?)[\s]*$/' => '// $1',
  159.             '/^[\s]*BTW![\s]*$/' => '/*',
  160.             '/^[\s]*!BTW[\s]*$/' => '*/',
  161.            
  162.             // Arrays
  163.             '/^[\s]*I HAS ([a-zA-Z0-9]*) IZ BUCKET[\s]*$/' => '\$$1 = array(',
  164.             '/^[\s]*(\d+) FISH ([a-zA-Z0-9]*) !![\s]*$/' => '$1 => \$$2,',
  165.             '/^[\s]*(\d+) FISH (.*) !![\s]*$/' => '$1 => $2,',
  166.             '/^[\s]*([a-zA-Z0-9]*) FISH ([a-zA-Z0-9]*) !![\s]*$/' => '\$$1 => \$$2,',
  167.             '/^[\s]*([a-zA-Z0-9]*) FISH (.*) !![\s]*$/' => '\$$1 => $2,',
  168.             '/^[\s]*(.*) FISH (.*) !![\s]*$/' => '$1 => $2,',
  169.             '/^[\s]*(.*) FISH ([a-zA-Z0-9]*) !![\s]*$/' => '$1 => \$$2,',
  170.             '/^[\s]*BUCKET[\s]*$/' => ');',
  171.            
  172.             // If, elseif, else
  173.             '/^[\s]*IZ ([a-zA-Z0-9]*) (.*)[\s]*$/' => 'if( \$$1 $2 ) {',
  174.             '/^[\s]*IZ (.*)[\s]*$/' => 'if( $1 ) {',
  175.             '/^[\s]*ORLY (.*)[\s]*$/' => '} elseif( $2 ) {',
  176.             '/^[\s]*NOWAI[\s]*$/' => '} else {',
  177.             '/^[\s]*KTHX[\s]*$/' => '}',
  178.            
  179.             // Vars
  180.             '/^[\s]*I HAS ([a-zA-Z0-9]*)[\s]*$/' => '\$$1 = null;',
  181.             '/^[\s]*I HAS ([a-zA-Z0-9]*) ITZ (.*)[\s]*$/' => '\$$1 = $2;',
  182.             '/^[\s]*([a-zA-Z0-9]*) IZ (.*)[\s]*$/' => '\$$1 = $2;',
  183.            
  184.             // Global Vars
  185.             '/GET#([a-zA-Z0-9-_]*)#/' => '$_GET[ \'$1\' ]',
  186.             '/POST#([a-zA-Z0-9-_]*)#/' => '$_POST[ \'$1\' ]',
  187.             '/SERVER#([a-zA-Z0-9-_]*)#/' => '$_SERVER[ \'$1\' ]',
  188.             '/COOKIE#([a-zA-Z0-9-_]*)#/' => '$_COOKIE[ \'$1\' ]',
  189.             '/SESSION#([a-zA-Z0-9-_]*)#/' => '$_SESSION[ \'$1\' ]',
  190.            
  191.             // Returning vars
  192.             '/&&([a-zA-Z0-9]*)&&/' => '\${ ${ $1 } }',
  193.             '/&([a-zA-Z0-9]*)&/' => '\$$1',
  194.             '/&([a-zA-Z0-9]*)#([a-zA-Z0-9-_]*)&/' => '\$$1[ strtolower( \'$2\' ) ]',
  195.            
  196.             // Joining
  197.             '/ N /' => ' . ',
  198.            
  199.             // Loops
  200.             '/^[\s]*IM IN YR LOOP, ([a-zA-Z0-9]*) IZ (\d+) UPPIN TO (\d+)[\s]*$/' => 'for( \$$1 = $2; \$$1 < $3; \$$1++ ):',
  201.             '/^[\s]*IM IN YR LOOP, ([a-zA-Z0-9]*) IZ (\d+) UPPIN TILL (\d+)[\s]*$/' => 'for( \$$1 = $2; \$$1 <= $3; \$$1++ ):',
  202.             '/^[\s]*IM IN YR LOOP, ([a-zA-Z0-9]*) IZ (\d+) NERFIN TO (\d+)[\s]*$/' => 'for( \$$1 = $2; \$$1 > $3; \$$1-- ):',
  203.             '/^[\s]*IM IN YR LOOP, ([a-zA-Z0-9]*) IZ (\d+) NERFIN TILL (\d+)[\s]*$/' => 'for( \$$1 = $2; \$$1 >= $3; \$$1-- ):',
  204.            
  205.             '/^[\s]*IM IN YR ([a-zA-Z0-9]*) ITZA ([a-zA-Z0-9]*)[\s]*$/' => 'foreach( \$$1 as \$$2 ):',
  206.            
  207.             '/^[\s]*IM OUTTA YR LOOP[\s]*$/' => 'endfor;',
  208.             '/^[\s]*IM OUTTA YR ([a-zA-Z0-9]*)[\s]*$/' => 'endforeach;',
  209.            
  210.             '/^[\s]*WATCH ([a-zA-Z0-9]*) ITZA ([a-zA-Z0-9]*)[\s]*$/' => 'while( \$$1 = \$$2 ) {',
  211.             '/^[\s]*WATCH ([a-zA-Z0-9]*) ITZA (.*)[\s]*$/' => 'while( \$$1 = $2 ) {',
  212.            
  213.             // Function
  214.             '/^[\s]*SO IM LIKE ([a-zA-Z0-9]*) WITH (.*)[\s]*$/' => '$this->createFunction( "$1", "$2" )',
  215.             '/^[\s]*I FOUND MAH ([a-zA-Z0-9]*)[\s]*$/' => 'return \$$1;',
  216.             '/^[\s]*I FOUND MAH (.*)[\s]*$/' => 'return $1;',
  217.            
  218.             '/[\s]*([a-zA-Z0-9]*)\(([a-zA-Z0-9]*|[^\s]*)\)[\s]*/' => '$1( \$$2 )',
  219.             '/[\s]*([a-zA-Z0-9]*)\((.*)\)[\s]*/' => '$1($2)',
  220.            
  221.             // Define & printing defines
  222.             '/^[\s]*ALWAYZ ([a-zA-Z0-9]*) IZ (.*)[\s]*$/' => 'define( \'$1\', \'$2\' )',
  223.             '/__([a-zA-Z0-9]*)__/' => '$1',
  224.            
  225.             // Redirect
  226.             '/^[\s]*SEND TO ([a-zA-Z0-9]*)[\s]*$/' => 'header( "Location: " . \$$1 );',
  227.             '/^[\s]*SEND TO (.+?)[\s]*$/' => 'header( "Location: " . $1 );',
  228.         );
  229.        
  230.         $aSearch = array( );
  231.         $aReplace = array( );
  232.         foreach( $aReplaces as $sFrom => $sTo )
  233.         {
  234.            
  235.             $aSearch[ ] = $sFrom;
  236.             $aReplace[ ] = $sTo;
  237.                    
  238.         }
  239.        
  240.         $aLines = explode( "\n", $aMatches[ 0 ] );
  241.        
  242.         $sContent = preg_replace( $aSearch, $aReplace, $aLines );
  243.        
  244.         $sContent = implode( "\n", $sContent );
  245.        
  246.         // Put rest of the code back
  247.         $sContent = str_replace( '[r3pl4c3m3w1thth3c0d3]', $sContent, $sNewContent );
  248.        
  249.         return $sContent;
  250.            
  251.     }
  252.    
  253.     private function createFunction( $sName, $sArgs )
  254.     {
  255.        
  256.         $sFunc = 'function ' . $sName . '( ';
  257.        
  258.         $aArgs = explode( ' ', $sArgs );
  259.         foreach( $aArgs as $iKey => $sArg )
  260.         {
  261.            
  262.             if( $iKey != 0 )
  263.             {
  264.                
  265.                 $sFunc .= ', ';
  266.                            
  267.             }
  268.            
  269.             $sFunc .= '$' . $sArg;
  270.                    
  271.         }
  272.        
  273.         $sFunc .= ' ) {';
  274.        
  275.         return $sFunc;
  276.        
  277.     }
  278.                
  279. }
  280.  
  281. ?>