<?php
/**
* LOLCode
*
* @package LOLCode
* @author Xikeon / 3picM1ke
* @copyright 2009
* @access public
*/
class LOLCode {
public $sDir = 'pages/';
public $bDebug = false;
/**
* LOLCode::display()
*
* @param mixed $sFile
* @return void
*/
public function display( $sFile )
{
{
foreach( $aFiles as $sFilename )
{
if( $this->isPage( $sFilename ) )
{
$sPage = $this->getPage( $sFilename );
if( $this->bDebug )
{
echo '<strong>Debug:</strong><br /><pre>' . htmlspecialchars( $this->doLol( $sPage ) ) . '</pre><hr />';
}
else
{
eval( '?> ' . $this->doLol( $sPage ) );
}
}
else
{
die( 'Page does not exist: ' . htmlspecialchars( $sFilename ) );
}
}
}
else
{
if( $this->isPage( $sFile ) )
{
$sPage = $this->getPage( $sFile );
if( $this->bDebug )
{
echo '<strong>Debug:</strong><br /><pre>' . htmlspecialchars( $this->doLol( $sPage ) ) . '</pre><hr />';
}
else
{
eval( '?> ' . $this->doLol( $sPage ) );
}
}
else
{
die( 'Page does not exist: ' . htmlspecialchars( $sFile ) );
}
}
}
/**
* LOLCode::isPage()
*
* @param mixed $sFile
* @return
*/
private function isPage( $sFile )
{
if( is_file( $this->sDir . $sFile . '.lol' ) )
{
return true;
}
return false;
}
/**
* LOLCode::getPage()
*
* @param mixed $sFile
* @return
*/
private function getPage( $sFile )
{
$sContent = file_get_contents( $this->sDir . $sFile . '.lol' );
return $sContent;
}
/**
* LOLCode::doLol()
*
* @param mixed $sContent
* @return
*/
private function doLol( $sContent )
{
// Only between HAI and KTHXBYE
preg_match( '/HAI(.*)KTHXBYE/s', $sContent, $aMatches );
$sNewContent = str_replace( $aMatches[ 0 ], '[r3pl4c3m3w1thth3c0d3]', $sContent );
$aReplaces = array(
// Tag
'/^[\s]*HAI[\s]*$/' => '<?php',
'/^[\s]*KTHXBYE[\s]*$/' => '?>',
// Include for .lol & Require for .php
'/^[\s]*CAN HAS ([a-zA-Z0-9-_]*)\?[\s]*$/' => 'eval( \'?> \' . $this->display( strtolower( \'$1\' ) ) );',
'/^[\s]*MUST HAS ([a-zA-Z0-9-_]*)[\s]*$/' => 'require( strtolower( \'$1.php\' ) );',
// Echo
'/^[\s]*VISIBLE ([a-zA-Z0-9]*)[\s]*$/' => 'echo \$$1;',
'/^[\s]*VISIBLE (.+?)[\s]*$/' => 'echo $1;',
// Comments
'/^[\s]*BTW (.+?)[\s]*$/' => '// $1',
'/^[\s]*BTW![\s]*$/' => '/*',
'/^[\s]*!BTW[\s]*$/' => '*/',
// Arrays
'/^[\s]*I HAS ([a-zA-Z0-9]*) IZ BUCKET[\s]*$/' => '\$$1 = array(',
'/^[\s]*(\d+) FISH ([a-zA-Z0-9]*) !![\s]*$/' => '$1 => \$$2,',
'/^[\s]*(\d+) FISH (.*) !![\s]*$/' => '$1 => $2,',
'/^[\s]*([a-zA-Z0-9]*) FISH ([a-zA-Z0-9]*) !![\s]*$/' => '\$$1 => \$$2,',
'/^[\s]*([a-zA-Z0-9]*) FISH (.*) !![\s]*$/' => '\$$1 => $2,',
'/^[\s]*(.*) FISH (.*) !![\s]*$/' => '$1 => $2,',
'/^[\s]*(.*) FISH ([a-zA-Z0-9]*) !![\s]*$/' => '$1 => \$$2,',
'/^[\s]*BUCKET[\s]*$/' => ');',
// If, elseif, else
'/^[\s]*IZ ([a-zA-Z0-9]*) (.*)[\s]*$/' => 'if( \$$1 $2 ) {',
'/^[\s]*IZ (.*)[\s]*$/' => 'if( $1 ) {',
'/^[\s]*ORLY (.*)[\s]*$/' => '} elseif( $2 ) {',
'/^[\s]*NOWAI[\s]*$/' => '} else {',
'/^[\s]*KTHX[\s]*$/' => '}',
// Vars
'/^[\s]*I HAS ([a-zA-Z0-9]*)[\s]*$/' => '\$$1 = null;',
'/^[\s]*I HAS ([a-zA-Z0-9]*) ITZ (.*)[\s]*$/' => '\$$1 = $2;',
'/^[\s]*([a-zA-Z0-9]*) IZ (.*)[\s]*$/' => '\$$1 = $2;',
// Global Vars
'/GET#([a-zA-Z0-9-_]*)#/' => '$_GET[ \'$1\' ]',
'/POST#([a-zA-Z0-9-_]*)#/' => '$_POST[ \'$1\' ]',
'/SERVER#([a-zA-Z0-9-_]*)#/' => '$_SERVER[ \'$1\' ]',
'/COOKIE#([a-zA-Z0-9-_]*)#/' => '$_COOKIE[ \'$1\' ]',
'/SESSION#([a-zA-Z0-9-_]*)#/' => '$_SESSION[ \'$1\' ]',
// Returning vars
'/&&([a-zA-Z0-9]*)&&/' => '\${ ${ $1 } }',
'/&([a-zA-Z0-9]*)&/' => '\$$1',
'/&([a-zA-Z0-9]*)#([a-zA-Z0-9-_]*)&/' => '\$$1[ strtolower( \'$2\' ) ]',
// Joining
'/ N /' => ' . ',
// Loops
'/^[\s]*IM IN YR LOOP, ([a-zA-Z0-9]*) IZ (\d+) UPPIN TO (\d+)[\s]*$/' => 'for( \$$1 = $2; \$$1 < $3; \$$1++ ):',
'/^[\s]*IM IN YR LOOP, ([a-zA-Z0-9]*) IZ (\d+) UPPIN TILL (\d+)[\s]*$/' => 'for( \$$1 = $2; \$$1 <= $3; \$$1++ ):',
'/^[\s]*IM IN YR LOOP, ([a-zA-Z0-9]*) IZ (\d+) NERFIN TO (\d+)[\s]*$/' => 'for( \$$1 = $2; \$$1 > $3; \$$1-- ):',
'/^[\s]*IM IN YR LOOP, ([a-zA-Z0-9]*) IZ (\d+) NERFIN TILL (\d+)[\s]*$/' => 'for( \$$1 = $2; \$$1 >= $3; \$$1-- ):',
'/^[\s]*IM IN YR ([a-zA-Z0-9]*) ITZA ([a-zA-Z0-9]*)[\s]*$/' => 'foreach( \$$1 as \$$2 ):',
'/^[\s]*IM OUTTA YR LOOP[\s]*$/' => 'endfor;',
'/^[\s]*IM OUTTA YR ([a-zA-Z0-9]*)[\s]*$/' => 'endforeach;',
'/^[\s]*WATCH ([a-zA-Z0-9]*) ITZA ([a-zA-Z0-9]*)[\s]*$/' => 'while( \$$1 = \$$2 ) {',
'/^[\s]*WATCH ([a-zA-Z0-9]*) ITZA (.*)[\s]*$/' => 'while( \$$1 = $2 ) {',
// Function
'/^[\s]*SO IM LIKE ([a-zA-Z0-9]*) WITH (.*)[\s]*$/' => '$this->createFunction( "$1", "$2" )',
'/^[\s]*I FOUND MAH ([a-zA-Z0-9]*)[\s]*$/' => 'return \$$1;',
'/^[\s]*I FOUND MAH (.*)[\s]*$/' => 'return $1;',
'/[\s]*([a-zA-Z0-9]*)\(([a-zA-Z0-9]*|[^\s]*)\)[\s]*/' => '$1( \$$2 )',
'/[\s]*([a-zA-Z0-9]*)\((.*)\)[\s]*/' => '$1($2)',
// Define & printing defines
'/^[\s]*ALWAYZ ([a-zA-Z0-9]*) IZ (.*)[\s]*$/' => 'define( \'$1\', \'$2\' )',
'/__([a-zA-Z0-9]*)__/' => '$1',
// Redirect
'/^[\s]*SEND TO ([a-zA-Z0-9]*)[\s]*$/' => 'header( "Location: " . \$$1 );',
'/^[\s]*SEND TO (.+?)[\s]*$/' => 'header( "Location: " . $1 );',
);
$aSearch = array( );
$aReplace = array( );
foreach( $aReplaces as $sFrom => $sTo )
{
$aSearch[ ] = $sFrom;
$aReplace[ ] = $sTo;
}
$aLines = explode( "\n", $aMatches[ 0 ] );
$sContent = preg_replace( $aSearch, $aReplace, $aLines );
$sContent = implode( "\n", $sContent );
// Put rest of the code back
$sContent = str_replace( '[r3pl4c3m3w1thth3c0d3]', $sContent, $sNewContent );
return $sContent;
}
private function createFunction( $sName, $sArgs )
{
$sFunc = 'function ' . $sName . '( ';
$aArgs = explode( ' ', $sArgs );
foreach( $aArgs as $iKey => $sArg )
{
if( $iKey != 0 )
{
$sFunc .= ', ';
}
$sFunc .= '$' . $sArg;
}
$sFunc .= ' ) {';
return $sFunc;
}
}
?>