📄 it.php
字号:
* @param string name of the block to be parsed
* @access public
* @see parseCurrentBlock()
* @throws IT_Error
*/
function parse($block = "__global__", $flag_recursion = false) {
if (!isset($this->blocklist[$block])) {
return new IT_Error("The block '$block' was not found in the template.", __FILE__, __LINE__);
return false;
}
if ("__global__" == $block)
$this->flagGlobalParsed = true;
$regs = array();
$values = array();
if ($this->clearCacheOnParse) {
foreach ($this->variableCache as $name => $value) {
$regs[] = "@" . $this->openingDelimiter . $name . $this->closingDelimiter . "@";
$values[] = $value;
}
$this->variableCache = array();
} else {
foreach ($this->blockvariables[$block] as $allowedvar => $v) {
if (isset($this->variableCache[$allowedvar])) {
$regs[] = "@".$this->openingDelimiter . $allowedvar . $this->closingDelimiter . "@";
$values[] = $this->variableCache[$allowedvar];
unset($this->variableCache[$allowedvar]);
}
}
}
$outer = (0 == count($regs)) ? $this->blocklist[$block] : preg_replace($regs, $values, $this->blocklist[$block]);
$empty = (0 == count($values)) ? true : false;
if (isset($this->blockinner[$block])) {
foreach ($this->blockinner[$block] as $k => $innerblock) {
$this->parse($innerblock, true);
if ("" != $this->blockdata[$innerblock])
$empty = false;
$placeholder = $this->openingDelimiter . "__" . $innerblock . "__" . $this->closingDelimiter;
$outer = str_replace($placeholder, $this->blockdata[$innerblock], $outer);
$this->blockdata[$innerblock] = "";
}
}
if ($this->removeUnknownVariables)
$outer = preg_replace($this->removeVariablesRegExp, "", $outer);
if ($empty) {
if (!$this->removeEmptyBlocks) {
$this->blockdata[$block ].= $outer;
} else {
if (isset($this->touchedBlocks[$block]))
$this->blockdata[$block] .= $outer;
}
} else {
$this->blockdata[$block] .= $outer;
}
return $empty;
} // end func parse
/**
* Parses the current block
* @see parse(), setCurrentBlock(), $currentBlock
* @access public
*/
function parseCurrentBlock() {
return $this->parse($this->currentBlock);
} // end func parseCurrentBlock
/**
* Sets a variable value.
*
* The function can be used eighter like setVariable( "varname", "value")
* or with one array $variables["varname"] = "value" given setVariable($variables)
* quite like phplib templates set_var().
*
* @param mixed string with the variable name or an array %variables["varname"] = "value"
* @param string value of the variable or empty if $variable is an array.
* @param string prefix for variable names
* @access public
*/
function setVariable($variable, $value = "") {
if (is_array($variable)) {
$this->variableCache = array_merge($this->variableCache, $variable);
} else {
$this->variableCache[$variable] = $value;
}
} // end func setVariable
/**
* Sets the name of the current block that is the block where variables are added.
*
* @param string name of the block
* @return boolean false on failure, otherwise true
* @throws IT_Error
* @access public
*/
function setCurrentBlock($block = "__global__") {
if (!isset($this->blocklist[$block]))
return new IT_Error("Can't find the block '$block' in the template.", __FILE__, __LINE__);
$this->currentBlock = $block;
return true;
} // end func setCurrentBlock
/**
* Preserves an empty block even if removeEmptyBlocks is true.
*
* @param string name of the block
* @return boolean false on false, otherwise true
* @throws IT_Error
* @access public
* @see $removeEmptyBlocks
*/
function touchBlock($block) {
if (!isset($this->blocklist[$block]))
return new IT_Error("Can't find the block '$block' in the template.", __FILE__, __LINE__);
$this->touchedBlocks[$block] = true;
return true;
} // end func touchBlock
/**
* Clears all datafields of the object and rebuild the internal blocklist
*
* LoadTemplatefile() and setTemplate() automatically call this function
* when a new template is given. Don't use this function
* unless you know what you're doing.
*
* @access public
* @see free()
*/
function init() {
$this->free();
$this->findBlocks($this->template);
$this->buildBlockvariablelist();
} // end func init
/**
* Clears all datafields of the object.
*
* Don't use this function unless you know what you're doing.
*
* @access public
* @see init()
*/
function free() {
$this->err = array();
$this->currentBlock = "__global__";
$this->variableCache = array();
$this->blocklookup = array();
$this->touchedBlocks = array();
$this->flagBlocktrouble = false;
$this->flagGlobalParsed = false;
} // end func free
/**
* Sets the template.
*
* You can eighter load a template file from disk with LoadTemplatefile() or set the
* template manually using this function.
*
* @param string template content
* @param boolean remove unknown/unused variables?
* @param boolean remove empty blocks?
* @see LoadTemplatefile(), $template
* @access public
*/
function setTemplate($template, $removeUnknownVariables = true, $removeEmptyBlocks = true) {
$this->removeUnknownVariables = $removeUnknownVariables;
$this->removeEmptyBlocks = $removeEmptyBlocks;
if ("" == $template && $this->flagCacheTemplatefile) {
$this->variableCache = array();
$this->blockdata = array();
$this->touchedBlocks = array();
$this->currentBlock = "__global__";
} else {
$this->template = '<!-- BEGIN __global__ -->' . $template . '<!-- END __global__ -->';
$this->init();
}
if ($this->flagBlocktrouble)
return false;
return true;
} // end func setTemplate
/**
* Reads a template file from the disk.
*
* @param string name of the template file
* @param bool how to handle unknown variables.
* @param bool how to handle empty blocks.
* @access public
* @return boolean false on failure, otherwise true
* @see $template, setTemplate(), $removeUnknownVariables, $removeEmptyBlocks
*/
function loadTemplatefile($filename, $removeUnknownVariables = true, $removeEmptyBlocks = true) {
$template = "";
if (!$this->flagCacheTemplatefile || $this->lastTemplatefile != $filename)
$template = $this->getfile($filename);
$this->lastTemplatefile = $filename;
return $this->setTemplate($template, $removeUnknownVariables, $removeEmptyBlocks, true);
} // end func LoadTemplatefile
/**
* Sets the file root. The file root gets prefixed to all filenames passed to the object.
*
* Make sure that you override this function when using the class
* on windows.
*
* @param string
* @see IntegratedTemplate()
* @access public
*/
function setRoot($root) {
if ("" != $root && "/" != substr($root, -1))
$root .= "/";
$this->fileRoot = $root;
} // end func setRoot
/**
* Build a list of all variables within of a block
*/
function buildBlockvariablelist() {
foreach ($this->blocklist as $name => $content) {
preg_match_all( $this->variablesRegExp, $content, $regs );
if (0 != count($regs[1])) {
foreach ($regs[1] as $k => $var)
$this->blockvariables[$name][$var] = true;
} else {
$this->blockvariables[$name] = array();
}
}
} // end func buildBlockvariablelist
/**
* Returns a list of all
*/
function getGlobalvariables() {
$regs = array();
$values = array();
foreach ($this->blockvariables["__global__"] as $allowedvar => $v) {
if (isset($this->variableCache[$allowedvar])) {
$regs[] = "@" . $this->openingDelimiter . $allowedvar . $this->closingDelimiter."@";
$values[] = $this->variableCache[$allowedvar];
unset($this->variableCache[$allowedvar]);
}
}
return array($regs, $values);
} // end func getGlobalvariables
/**
* Recusively builds a list of all blocks within the template.
*
* @param string string that gets scanned
* @see $blocklist
*/
function findBlocks($string) {
$blocklist = array();
if (preg_match_all($this->blockRegExp, $string, $regs, PREG_SET_ORDER)) {
foreach ($regs as $k => $match) {
$blockname = $match[1];
$blockcontent = $match[2];
if (isset($this->blocklist[$blockname])) {
new IT_Error("The name of a block must be unique within a template. Found '$blockname' twice. Unpredictable results may appear.", __FILE__, __LINE__);
$this->flagBlocktrouble = true;
}
$this->blocklist[$blockname] = $blockcontent;
$this->blockdata[$blockname] = "";
$blocklist[] = $blockname;
$inner = $this->findBlocks($blockcontent);
foreach ($inner as $k => $name) {
$pattern = sprintf('@<!--\s+BEGIN\s+%s\s+-->(.*)<!--\s+END\s+%s\s+-->@sm',
$name,
$name
);
$this->blocklist[$blockname] = preg_replace( $pattern,
$this->openingDelimiter . "__" . $name . "__" . $this->closingDelimiter,
$this->blocklist[$blockname]
);
$this->blockinner[$blockname][] = $name;
$this->blockparents[$name] = $blockname;
}
}
}
return $blocklist;
} // end func findBlocks
/**
* Reads a file from disk and returns its content.
* @param string Filename
* @return string Filecontent
*/
function getFile($filename) {
if ("/" == $filename{0} && "/" == substr($this->fileRoot, -1))
$filename = substr($filename, 1);
$filename = $this->fileRoot . $filename;
if (!($fh = @fopen($filename, "r"))) {
new IT_Error("Can't read '$filename'.", __FILE__, __LINE__);
return "";
}
$content = fread($fh, filesize($filename));
fclose($fh);
return $content;
} // end func getFile
} // end class IntegratedTemplate
?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -