compiler.inc

来自「eGroupWare is a multi-user, web-based gr」· INC 代码 · 共 667 行 · 第 1/2 页

INC
667
字号
<?php/**************************************************************************** copyright            : (C) 2001-2003 Advanced Internet Designs Inc.* email                : forum@prohost.org* $Id: compiler.inc,v 1.6 2004/07/08 14:25:47 iliaa Exp $** This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or * (at your option) any later version.***************************************************************************/	@set_time_limit(6000);function resolve_refs($file_name){	if (isset($GLOBALS['file_cache'][$file_name])) {		return;	}	$fc =& $GLOBALS['file_cache'][$file_name];	/* Fetch file definition */	$GLOBALS['CURFILE'] = $GLOBALS['DATA_DIR'].'thm/'.$GLOBALS['__COMPILER__']['tset'].'/tmpl/'.$file_name;	if (($str = @file_get_contents($GLOBALS['CURFILE'])) === false) {		$file1 = $GLOBALS['DATA_DIR'].'thm/default/tmpl/'.$file_name;		if (($str = @file_get_contents($file1)) === false) {			exit('referenced file named (<b>'.$file_name.'</b>) doesn\'t exist');		}	}	if (($st = strpos($str, '{PHP_FILE: ')) !== false) {		$st += 11;		$st = substr($str, $st, (strpos($str, '}', $st) - $st - 1));		$fc['src'] = substr($st, 7, (strpos($st, ';', 7) - 7));		$fc['dst'] = substr($st, (strrpos($st, ' ') + 1));		if (!$fc['src'] || !$fc['dst']) {			exit('invalid PHP_FILE directive inside (<b>'.$file_name.'</b>)');		}		parse_sections($str, $fc['dst']);	} else {		$fc['inline'] = 1;		parse_sections($str, '');	}	if (strpos($GLOBALS['CURFILE'], 'thm/default/tmpl') === false) {		if (($tmp = @file_get_contents($GLOBALS['DATA_DIR'].'thm/default/tmpl/'.$file_name)) !== false) {			parse_sections($tmp, ($st !== false ? $fc['dst'] : ''), 1);		}	}	$p = 0;	while (($p = strpos($str, '{REF: ', $p)) !== false) {		$p += 6;		$e = strpos($str, '}', $p);		$nr = substr($str, $p, ($e - $p));		if (!isset($fc['include'][$nr])) {			$fc['include'][$nr] = $nr;		}		resolve_refs($nr);		$p = $e + 1;	}}$GLOBALS['__FUD_SECTIONS__'] = array('MAIN_SECTION' => '{MAIN_SECTION: ', 'PAGE' => '{PAGE: ', 'SECTION' => '{SECTION: ');function parse_sections($str, $file, $sl=0){	$PHP_FILE = ($file && substr($file, -4) == '.php') ? 1 : 0;	/* we parse each section individually, it is faster the looking for all of them together	 * due to the large number of {} that can be found inside the template files	 */	foreach ($GLOBALS['__FUD_SECTIONS__'] as $k => $v) {		$p = 0;		$tr =& $GLOBALS['TC'][$k];		while (($p = strpos($str, $v, $p)) !== false) {			$p += strlen($v);			$e = strpos($str, '}', $p);			$name = substr($str, $p, ($e - $p));			if (($p = strpos($name, ' ')) !== false) {				$name = substr($name, 0, $p);			}			++$e;			if (isset($tr[$name])) {				if (!$sl) {					exit('DUPE: '.$k.' -> '.$name.' found in '.$tr[$name]['file'].' (now parsing '.$GLOBALS['CURFILE'].')');				} else {					if (($e2 = strpos($str, $v .'END}', $e)) === false) {						exit('unterminated tag '.$k.' inside '.$file);					}					$p = $e2 + strlen($v) + 4;					continue;				}			}			if (($e2 = strpos($str, $v .'END}', $e)) === false) {				exit('unterminated tag '.$k.' inside '.$file);			}			if ($PHP_FILE) {				$GLOBALS['PHP_FILE_SEC'][$k][$name] = 1;			}			if (isset($tr[$name])) {				array_push($tr[$name], array('file' => $GLOBALS['CURFILE'], 'data' => trim(substr($str, $e, ($e2 - $e)))));			} else {				$tr[$name] = array('file' => $GLOBALS['CURFILE'], 'data' => trim(substr($str, $e, ($e2 - $e))));			}			$p = $e2 + strlen($v) + 4;		}	}}function resolve_sections($str){	if (($p = strpos($str, '{')) === false) {		return $str;	}	$op = 0;	$ret = '';	$ch_list =& $GLOBALS['__char_list'];	do {		@$chr = $str[$p + 1];		if ($chr < 'A' || $chr > 'Z') {			++$p;			continue;		}		if ($op != $p) {			$ret .= substr($str, $op, ($p - $op));		}		++$p;		if (($e = strpos($str, '}', $p)) === false) {			exit('unterminated tag '.substr($str, ($p - 1), 255));		}		if (($te = strpos($str, ': ', $p)) !== false && $te < $e) {			$tag = substr($str, $p, ($te - $p));			$te += 2;			if (($ds = strpos($str, ' ', $te)) === false || $ds > $e) {				$ds = $e;			}			$name = substr($str, $te, ($ds - $te));		} else {			$tag = substr($str, $p, ($e - $p));		}		$op = $p = $e + 1;		switch ($tag) {			case 'MSG':				if (!isset($GLOBALS['MSG'][$name])) {					exit('Missing Message entry '.$name.' inside i18n/'.$GLOBALS['__COMPILER__']['lang'].'/msg');				}				$ret .= $GLOBALS['MSG'][$name]['data'];				break;			case 'VAR':			case 'TEMPLATE-DATA':				$ret .= '\'.$'.$name.'.\'';				break;			case 'GVAR':				$ret .= '\'.$GLOBALS[\''.$name.'\'].\'';				break;			case 'DEF':				$ret .= '\'.'.$name.'.\'';				break;			case 'VAR-URL':				$ret .= '\'.urlencode($'.$name.').\'';				break;			case 'VAR-HTML':				$ret .= '\'.htmlspecialchars($'.$name.').\'';				break;			case 'VAR-UH':				$ret .= '\'.htmlspecialchars(urldecode($'.$name.')).\'';				break;			case 'VAR-FORM':				$ret .= '\'.stripslashes($'.$name.').\'';				break;			case 'ALT-VAR':				$t = strtok(substr($str, ++$ds, ($e - $ds)), ' ');				$ret .= '\'.alt_var(\''.$name.'\',\''.$t.'\',\''.strtok(' ').'\').\'';				break;			case 'DATE':				if ($name[0] != '!') {					$ret .= '\'.strftime("'.ltrim(substr($str, ++$ds, ($e - $ds))).'", $'.$name.').\'';				} else {					$ret .= '\'.strftime("'.ltrim(substr($str, ++$ds, ($e - $ds))).'", '.substr($name,1).').\'';				}				break;			case 'TEMPLATE':				if (isset($GLOBALS['TC']['SECTION'][$name])) {					$sec = 'SECTION';				} else if (isset($GLOBALS['TC']['MAIN_SECTION'][$name])) {					$sec = 'MAIN_SECTION';				} else if (isset($GLOBALS['TC']['PAGE'][$name])) {					$sec = 'PAGE';				} else {					exit('Undefined template: "'.$tag.'" inside "'.$name.'"');				}				$ret .= $GLOBALS['TC'][$sec][$name]['data'] = resolve_sections($GLOBALS['TC'][$sec][$name]['data']);				break;			case 'META-CONTENT-LANGUAGE':				$ret .= '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset='.$GLOBALS['char_set'].'">';				break;			case 'CHARSET':				$ret .= $GLOBALS['char_set'];				break;			case 'FUNC':				$ret .= "'." . substr($str, $te, ($e - $te)) . ".'";				break;			case 'ROOT':			case 'THEME_ROOT':			case 'THEME_IMAGE_ROOT':				$ret .= $GLOBALS['__COMPILER__'][$tag];				break;			default:				exit('No such tag: '.htmlspecialchars($tag).' -> '.htmlspecialchars($name));		}	} while (($p = strpos($str, '{', $p)) !== false);	return $ret . substr($str, $op, (strlen($str) - $op));}function compile_file($source){	if (empty($source)) {		exit('No file passed to compile, fatal error');	}	if (($file_data = file_get_contents($GLOBALS['DATA_DIR'].'src/'.$source)) === false) {		exit('Unable to open file '.$GLOBALS['DATA_DIR'].'src/'.$source);	}	if (($p = strpos($file_data, '{TEMPLATE: ')) === false) {		return str_replace('{SQL_TABLE_PREFIX}', $GLOBALS['DBHOST_TBL_PREFIX'], $file_data);	}	$gfc =& $GLOBALS['file_cache'];	$t = substr($source, 0, strpos($source, '.')).'.tmpl';	if (isset($gfc[$t]['include'])) {		$ir =& $gfc[$t]['include'];		foreach ($ir as $v) {			if (!isset($gfc[$v]['compiled']) && $t != $v) {				generate_file($v);			}		}	}	$op = 0;	$ret = '';	do {		if ($op != $p) {			$ret .= substr($file_data, $op, ($p - $op));		}		$p += 11;		$name = substr($file_data, $p, (strpos($file_data, '}', $p) - $p));		if (isset($GLOBALS['TC']['SECTION'][$name])) {			$sec = 'SECTION';		} else if (isset($GLOBALS['TC']['MAIN_SECTION'][$name])) {			$sec = 'MAIN_SECTION';		} else if (isset($GLOBALS['TC']['PAGE'][$name])) {			$sec = 'PAGE';		} else {			exit('Undefined template: "'.$name.'" inside "'.$source.'"');		}		$ref =& $GLOBALS['TC'][$sec][$name]['data'];		$ref = resolve_sections($ref);		if ($sec == 'PAGE') {			$ref = str_replace(array(".'.", ".''.", ".'", "'."), array(".<?php echo ", '.', '; ?>', '<?php echo '), $ref);		}		$ret .= $ref;		if (($e = strpos($file_data, '}', $p)) === false) {			exit('Unterminated tag "'.$name.'" inside "'.$source.'"');		}		$op = $p = $e + 1;	} while (($p = strpos($file_data, '{TEMPLATE: ', $p)) !== false);	return str_replace('{SQL_TABLE_PREFIX}', $GLOBALS['DBHOST_TBL_PREFIX'], $ret . substr($file_data, $op, (strlen($file_data) - $op)));}function generate_file($php_file){	if (!isset($GLOBALS['file_cache'][$php_file]['compiled']) && !isset($GLOBALS['file_cache'][$php_file]['inline'])) {		$GLOBALS['file_cache'][$php_file]['compiled'] = compile_file($GLOBALS['file_cache'][$php_file]['src']);	}	if (isset($GLOBALS['file_cache'][$php_file]['inline'])) {		$GLOBALS['file_cache'][$php_file]['compiled'] = '';		return;	}	$fc =& $GLOBALS['file_cache'][$php_file];	$file_data = $fc['compiled'];	if (substr($fc['dst'], -4) != '.inc') {		/*		 * ! - end		 * @ - middle		 * 0 - start		 */		$ins = array('!' => '', '@' => '', 0 => '');		if (isset($fc['include'])) {			foreach($fc['include'] as $v2) {				if ($v2 == $php_file) {					continue;				}				$k = $v2;				$v =& $GLOBALS['file_cache'][$v2];				if (empty($v['compiled']) && !isset($v['inline'])) {					$v['compiled'] = compile_file($v['src']);				}	        		if (isset($v['inline'])) {					continue;	        		}				$s = strpos($v['compiled'], '*/')+2;				$k = $v['dst'][0];				if (!isset($ins[$k])) {					$k = 0;				}				$ins[$k] .= str_replace(array(" ''.", ".'';", ".''"), array(' ', ';', ''), trim(substr($v['compiled'], $s, (strrpos($v['compiled'], '?>') - $s))));			}			$file_data = str_replace(array('/*{PRE_HTML_PHP}*/', '/*{POST_HTML_PHP}*/', '/*{POST_PAGE_PHP_CODE}*/'), array($ins[0], $ins['@'], $ins['!']), $file_data);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?