2007-07-02 05:51:26 +00:00
< ? php
2009-08-28 10:56:54 +00:00
error_reporting ( 6135 ); // errors and warnings
2009-06-13 20:55:19 +00:00
include dirname ( __FILE__ ) . " /adminer/include/version.inc.php " ;
2009-05-29 16:57:32 +00:00
include dirname ( __FILE__ ) . " /externals/jsmin-php/jsmin.php " ;
2009-05-29 14:53:42 +00:00
2007-07-09 15:28:37 +00:00
function add_apo_slashes ( $s ) {
return addcslashes ( $s , " \\ ' " );
}
2007-07-05 07:34:42 +00:00
function remove_lang ( $match ) {
2007-08-04 19:36:01 +00:00
global $translations ;
2007-07-26 16:47:28 +00:00
$idf = strtr ( $match [ 2 ], array ( " \\ ' " => " ' " , " \\ \\ " => " \\ " ));
2007-08-04 19:36:01 +00:00
$s = ( $translations [ $idf ] ? $translations [ $idf ] : $idf );
2009-06-21 23:20:32 +00:00
if ( $match [ 3 ] == " , " ) { // lang() has parameters
2007-07-09 15:28:37 +00:00
return " $match[1] " . ( is_array ( $s ) ? " lang(array(' " . implode ( " ', ' " , array_map ( 'add_apo_slashes' , $s )) . " '), " : " sprintf(' " . add_apo_slashes ( $s ) . " ', " );
}
return ( $match [ 1 ] && $match [ 4 ] ? $s : " $match[1] ' " . add_apo_slashes ( $s ) . " ' $match[4] " );
2007-07-05 07:34:42 +00:00
}
2008-05-23 14:46:52 +00:00
function lang_ids ( $match ) {
global $lang_ids ;
2009-07-11 19:45:57 +00:00
$lang_id = & $lang_ids [ stripslashes ( $match [ 1 ])];
if ( ! isset ( $lang_id )) {
$lang_id = count ( $lang_ids ) - 1 ;
}
2009-09-10 19:05:27 +00:00
return ( $_SESSION [ " lang " ] ? $match [ 0 ] : " lang( $lang_id $match[2] " );
2008-05-23 14:46:52 +00:00
}
2007-07-02 05:51:26 +00:00
function put_file ( $match ) {
2009-07-11 19:45:57 +00:00
global $project ;
2009-07-03 06:26:01 +00:00
if ( basename ( $match [ 2 ]) == '$LANG.inc.php' ) {
2009-07-11 19:45:57 +00:00
return $match [ 0 ]; // processed later
2007-07-26 16:47:28 +00:00
}
2009-07-03 06:26:01 +00:00
$return = file_get_contents ( dirname ( __FILE__ ) . " / $project / $match[2] " );
2009-09-10 19:05:27 +00:00
if ( basename ( $match [ 2 ]) != " lang.inc.php " || ! $_SESSION [ " lang " ]) {
2009-06-21 23:20:32 +00:00
$tokens = token_get_all ( $return ); // to find out the last token
2009-06-01 16:20:06 +00:00
return " ?> \n $return " . ( in_array ( $tokens [ count ( $tokens ) - 1 ][ 0 ], array ( T_CLOSE_TAG , T_INLINE_HTML ), true ) ? " <?php " : " " );
} elseif ( preg_match ( '~\\s*(\\$pos = .*)~' , $return , $match2 )) {
2009-06-21 23:20:32 +00:00
// single language lang() is used for plural
2009-09-10 19:05:27 +00:00
return " function lang( \$ translation, \$ number) { \n \t " . str_replace ( '$LANG' , " ' $_SESSION[lang] ' " , $match2 [ 1 ]) . " \n \t return sprintf( \$ translation[ \$ pos], \$ number); \n } \n " ;
2009-06-01 16:20:06 +00:00
} else {
echo " lang() not found \n " ;
2007-07-02 05:51:26 +00:00
}
}
2009-07-11 19:45:57 +00:00
function put_file_lang ( $match ) {
global $lang_ids , $project ;
2009-09-10 19:05:27 +00:00
if ( $_SESSION [ " lang " ]) {
2009-07-11 19:45:57 +00:00
return " " ;
}
$return = " " ;
2009-07-22 11:51:25 +00:00
foreach ( glob ( dirname ( __FILE__ ) . " /adminer/lang/*.inc.php " ) as $filename ) {
2009-07-11 19:45:57 +00:00
include $filename ; // assign $translations
$translation_ids = array_flip ( $lang_ids ); // default translation
foreach ( $translations as $key => $val ) {
if ( isset ( $val )) {
$translation_ids [ $lang_ids [ $key ]] = $val ;
}
}
$return .= " \t case \" " . basename ( $filename , '.inc.php' ) . '": $translations = array(' ;
foreach ( $translation_ids as $val ) {
$return .= ( is_array ( $val ) ? " array(' " . implode ( " ', ' " , array_map ( 'add_apo_slashes' , $val )) . " ') " : " ' " . add_apo_slashes ( $val ) . " ' " ) . " , " ;
}
$return = substr ( $return , 0 , - 2 ) . " ); break; \n " ;
}
return " switch ( \$ LANG) { \n $return } \n " ;
}
2009-04-15 14:31:05 +00:00
function short_identifier ( $number , $chars ) {
$return = '' ;
2009-04-15 11:23:31 +00:00
while ( $number >= 0 ) {
$return .= $chars { $number % strlen ( $chars )};
$number = floor ( $number / strlen ( $chars )) - 1 ;
}
return $return ;
}
2009-07-24 06:13:38 +00:00
// based on http://latrine.dgx.cz/jak-zredukovat-php-skripty
2007-09-04 14:01:00 +00:00
function php_shrink ( $input ) {
2009-05-08 05:13:51 +00:00
$special_variables = array_flip ( array ( '$this' , '$GLOBALS' , '$_GET' , '$_POST' , '$_FILES' , '$_COOKIE' , '$_SESSION' , '$_SERVER' ));
2009-10-06 11:49:31 +00:00
$short_variables = array ();
2009-04-15 11:23:31 +00:00
$shortening = true ;
2009-04-15 14:31:05 +00:00
$tokens = token_get_all ( $input );
foreach ( $tokens as $i => $token ) {
if ( $token [ 0 ] === T_VARIABLE && ! isset ( $special_variables [ $token [ 1 ]])) {
$short_variables [ $token [ 1 ]] ++ ;
}
}
2009-04-16 14:17:31 +00:00
2009-04-15 14:31:05 +00:00
arsort ( $short_variables );
foreach ( array_keys ( $short_variables ) as $number => $key ) {
$short_variables [ $key ] = short_identifier ( $number , implode ( " " , range ( 'a' , 'z' )) . '_' . implode ( " " , range ( 'A' , 'Z' ))); // could use also numbers and \x7f-\xff
}
2009-04-15 11:23:31 +00:00
2007-09-04 14:01:00 +00:00
$set = array_flip ( preg_split ( '//' , '!"#$&\'()*+,-./:;<=>?@[\]^`{|}' ));
$space = '' ;
$output = '' ;
2009-06-01 21:31:05 +00:00
$in_echo = false ;
2009-07-11 19:45:57 +00:00
$doc_comment = false ; // include only first /**
2009-06-01 21:31:05 +00:00
for ( reset ( $tokens ); list ( $i , $token ) = each ( $tokens ); ) {
2007-09-04 14:01:00 +00:00
if ( ! is_array ( $token )) {
$token = array ( 0 , $token );
}
2009-08-26 12:36:59 +00:00
if ( $tokens [ $i + 2 ][ 0 ] === T_CLOSE_TAG && $tokens [ $i + 3 ][ 0 ] === T_INLINE_HTML && $tokens [ $i + 4 ][ 0 ] === T_OPEN_TAG
2009-12-03 21:02:04 +00:00
&& strlen ( addcslashes ( $tokens [ $i + 3 ][ 1 ], " ' \\ " )) < strlen ( $tokens [ $i + 3 ][ 1 ]) + 3
2009-08-26 12:36:59 +00:00
) {
$tokens [ $i + 2 ] = array ( T_ECHO , 'echo' );
$tokens [ $i + 3 ] = array ( T_CONSTANT_ENCAPSED_STRING , " ' " . addcslashes ( $tokens [ $i + 3 ][ 1 ], " ' \\ " ) . " ' " );
$tokens [ $i + 4 ] = array ( 0 , ';' );
}
2009-07-11 19:45:57 +00:00
if ( $token [ 0 ] == T_COMMENT || $token [ 0 ] == T_WHITESPACE || ( $token [ 0 ] == T_DOC_COMMENT && $doc_comment )) {
2007-09-04 14:01:00 +00:00
$space = " \n " ;
} else {
2009-07-11 19:45:57 +00:00
if ( $token [ 0 ] == T_DOC_COMMENT ) {
$doc_comment = true ;
}
2009-04-15 11:23:31 +00:00
if ( $token [ 0 ] == T_VAR ) {
$shortening = false ;
} elseif ( ! $shortening ) {
if ( $token [ 1 ] == ';' ) {
$shortening = true ;
}
2009-06-01 21:31:05 +00:00
} elseif ( $token [ 0 ] == T_ECHO ) {
$in_echo = true ;
} elseif ( $token [ 1 ] == ';' && $in_echo ) {
2009-08-26 14:14:38 +00:00
if ( $tokens [ $i + 1 ][ 0 ] === T_WHITESPACE && $tokens [ $i + 2 ][ 0 ] === T_ECHO ) {
2009-06-01 21:31:05 +00:00
next ( $tokens );
2009-07-30 16:29:38 +00:00
$i ++ ;
}
if ( $tokens [ $i + 1 ][ 0 ] === T_ECHO ) {
// join two consecutive echos
2009-06-01 21:31:05 +00:00
next ( $tokens );
2009-09-23 09:06:38 +00:00
$token [ 1 ] = ',' ; // '.' would conflict with "a".1+2 and would use more memory //! remove ',' and "," but not $var","
2009-08-26 12:36:59 +00:00
} else {
$in_echo = false ;
2009-06-01 21:31:05 +00:00
}
2009-04-15 14:31:05 +00:00
} elseif ( $token [ 0 ] === T_VARIABLE && ! isset ( $special_variables [ $token [ 1 ]])) {
$token [ 1 ] = '$' . $short_variables [ $token [ 1 ]];
2009-04-15 11:23:31 +00:00
}
2007-09-04 14:01:00 +00:00
if ( isset ( $set [ substr ( $output , - 1 )]) || isset ( $set [ $token [ 1 ]{ 0 }])) {
$space = '' ;
}
$output .= $space . $token [ 1 ];
$space = '' ;
}
}
return $output ;
}
2009-06-26 20:43:41 +00:00
function minify_css ( $file ) {
return preg_replace ( '~\\s*([:;{},])\\s*~' , '\\1' , $file );
}
function compile_file ( $match ) {
2009-07-13 21:40:43 +00:00
global $project ;
return call_user_func ( $match [ 2 ], file_get_contents ( dirname ( __FILE__ ) . " / $project / $match[1] " ));
2009-06-26 20:43:41 +00:00
}
2009-09-10 19:05:27 +00:00
unset ( $_COOKIE [ " adminer_lang " ]);
$_SESSION [ " lang " ] = $_SERVER [ " argv " ][ 1 ]; // Adminer functions read language from session
if ( isset ( $_SESSION [ " lang " ])) {
2009-06-13 20:55:19 +00:00
include dirname ( __FILE__ ) . " /adminer/include/lang.inc.php " ;
2009-09-10 19:05:27 +00:00
if ( isset ( $_SERVER [ " argv " ][ 2 ]) || ! isset ( $langs [ $_SESSION [ " lang " ]])) {
2009-10-06 11:49:31 +00:00
echo " Usage: php compile.php [lang] \n Purpose: Compile adminer[-lang].php and editor[-lang].php. \n " ;
2007-07-05 10:46:44 +00:00
exit ( 1 );
}
2009-09-10 19:05:27 +00:00
include dirname ( __FILE__ ) . " /adminer/lang/ $_SESSION[lang] .inc.php " ;
2007-07-05 10:46:44 +00:00
}
2007-08-04 19:36:01 +00:00
2009-10-06 11:49:31 +00:00
foreach ( array ( " adminer " , " editor " ) as $project ) {
$lang_ids = array (); // global variable simplifies usage in a callback function
$file = file_get_contents ( dirname ( __FILE__ ) . " / $project /index.php " );
$file = preg_replace_callback ( '~\\b(include|require) "([^"]*)";~' , 'put_file' , $file );
$file = str_replace ( 'include "../adminer/include/coverage.inc.php";' , '' , $file );
$file = preg_replace_callback ( '~\\b(include|require) "([^"]*)";~' , 'put_file' , $file ); // bootstrap.inc.php
$file = preg_replace_callback ( " ~lang \\ ('((?:[^ \\ \\ ']+| \\ \\ .)*)'([,)])~s " , 'lang_ids' , $file );
$file = preg_replace_callback ( '~\\b(include|require) "([^"]*\\$LANG.inc.php)";~' , 'put_file_lang' , $file );
if ( $_SESSION [ " lang " ]) {
// single language version
$file = preg_replace_callback ( " ~(< \\ ?php \\ s*echo )?lang \\ ('((?:[^ \\ \\ ']+| \\ \\ .)*)'([,)])(; \\ s* \\ ?>)?~s " , 'remove_lang' , $file );
$file = str_replace ( " <?php switch_lang(); ?> \n " , " " , $file );
$file = str_replace ( '<?php echo $LANG; ?>' , $_SESSION [ " lang " ], $file );
}
$file = str_replace ( '<script type="text/javascript" src="static/editing.js"></script>' . " \n " , " " , $file );
$file = preg_replace_callback ( " ~compile_file \\ ('([^']+)', '([^']+)' \\ );~ " , 'compile_file' , $file ); // integrate static files
$replace = 'h(preg_replace("~\\\\\\\\?.*~", "", $_SERVER["REQUEST_URI"])) . "?file=\\1&version=' . $VERSION ;
$file = preg_replace ( '~\\.\\./adminer/static/(default\\.css|functions\\.js|favicon\\.ico)~' , '<?php echo ' . $replace . '"; ?>' , $file );
$file = preg_replace ( '~\\.\\./adminer/static/([^\'"]*)~' , '" . ' . $replace , $file );
$file = str_replace ( " ../externals/jush/ " , " https://jush.svn.sourceforge.net/svnroot/jush/trunk/ " , $file ); // mixed-content warning if Adminer runs on HTTPS and external files on HTTP
$file = preg_replace ( " ~< \\ ?php \\ s* \\ ?> \n ?| \\ ?> \n ?< \\ ?php~ " , '' , $file );
$file = php_shrink ( $file );
2009-07-20 15:46:34 +00:00
2009-11-26 15:56:34 +00:00
$filename = $project . ( $_SESSION [ " lang " ] ? " - $_SESSION[lang] " : " " ) . " .php " ; // "$project-$VERSION"
2009-10-06 11:49:31 +00:00
fwrite ( fopen ( $filename , " w " ), $file ); // file_put_contents() since PHP 5
echo " $filename created. \n " ;
}