分享
 
 
 

class.rFastTemplate(2)

王朝other·作者佚名  2008-05-21
窄屏简体版  字體: |||超大  

for ($offend = $pos + strlen($dynend[1]); $offend < $l; $offend++) {

$c = $rest{$offend};

if ($c == "

") {

$offend++;

break;

}

if (($c != ' ') && ($c != "")) {

$offend = $pos + strlen($dynend[1]);

break;

}

}

}

// if ($debug)

// $this->logwrite ("parse_internal_1: DYNAMIC BEGIN: (pos,len,beg,end) => ($pos, " . strlen($dynbeg[1]) . ", $offbeg, $offend)

// This includes the contents of the REGEX_DYNEND in the output

// $rest = substr ($rest, $pos);

// This preserves whitespace on the END block line(s).

// $rest = substr ($rest, $pos+strlen($dynend[1]));

// $sub .= substr ($rest, 0, $pos);

$sub .= substr ($rest, 0, $offbeg);

$rest = substr ($rest, $offend);

// Already loaded templates will not be reloaded.

The

// 'clear' test was actually hiding a bug in the clear()

// logic....

if (false && isset($this->TEMPLATE[$dynend[2]]['clear'])

&& $this->TEMPLATE[$dynend[2]]['clear']) {

$this->TEMPLATE[$dynend[2]]['string']

= '';

$this->TEMPLATE[$dynend[2]]['result'] = '';

$this->TEMPLATE[$dynend[2]]['part']

=

$this->parse_internal_1 ($dynend[2], ' ');

} else if (!isset($this->TEMPLATE[$dynend[2]]['loaded'])

|| !$this->TEMPLATE[$dynend[2]]['loaded']) {

// Omit pathological case of empty dynamic template.

if (strlen($sub) > 0) {

$this->TEMPLATE[$dynend[2]]['string'] = $sub;

$this->TEMPLATE[$dynend[2]]['part']

=

$this->parse_internal_1 ($dynend[2], $sub);

$this->TEMPLATE[$dynend[2]]['part']['parent'] = $tag;

}

}

$this->TEMPLATE[$dynend[2]]['loaded'] = true;

$part[] = &$this->TEMPLATE[$dynend[2]];

$this->TEMPLATE[$dynend[2]]['tag']

= $dynend[2];

break;

} else {

$sub .= substr ($rest, 0, $pos+strlen($dynend[1]));

$rest = substr ($rest, $pos+strlen($dynend[1]));

if ($debug)

$this->logwrite ("parse_internal_1: $dynbeg[2] != $dynend[2]");

}

}

if (!$found) {

$this->error ("malformed dynamic template, missing END<BR />

" .

"$dynbeg[1]<BR />

", true);

}

} else {

// Although it would appear to make sense to check that we don't

// have a dangling END block, we will, in fact, ALWAYS appear to

// have a dangling END block.

We stuff the BEGIN string in the

// part before the inferior template and the END string in the

// part after the inferior template.

So for this test to work,

// we would need to look just past the final match.

if (preg_match ($this->REGEX_DYNEND, $rest, $dynend)) {

// $this->error ("malformed dynamic template, dangling END<BR />

" .

//

"$dynend[1]<BR />

", 1);

}

$part[] = $rest;

$rest = '';

}

}

return $part;

}

//

// Description

//

Parse the template.

If $tag is actually an array, we iterate over

//

the array elements.

If it is a simple string tag, we may still

//

recursively parse the template if it contains dynamic templates and

//

we are configured to automatically load those as well.

//

function parse_internal ($tag) {

$debug = $this->DEBUGALL || $this->DEBUG['parse_internal'];

$append = false;

if ($debug)

$this->logwrite ("parse_internal (tag=$tag)");

// If we are handed an array of tags, iterate over all of them.

This

// is really a holdover from the way class.FastTemplate.php3 worked;

// I think subst() already pulls that array apart for us, so this

// should not be necessary unless someone calls the internal member

// function directly.

if (gettype($tag) == 'array') {

reset ($tag);

foreach ($tag as $t) {

$this->parse_internal ($t);

}

} else {

// Load the file if it hasn't already been loaded.

It might be

// nice to put in some logic that reloads the file if it has

// changed since we last loaded it, but that probably gets way too

// complicated and only makes sense if we start keeping it floating

// around between page loads as a persistent variable.

if (!isset($this->TEMPLATE[$tag]['loaded'])) {

if ($this->TEMPLATE[$tag]['dynamic']) {

// Template was declared via define_dynamic().

if ($this->TEMPLATE[$tag]['parent'])

$tag = $this->TEMPLATE[$tag]['parent'];

else {

// Try to find a non-dynamic template with the same file.

// This would have been defined via define(array(), true)

reset ($this->TEMPLATE);

foreach (array_keys($this->TEMPLATE) as $ptag) {

if ($debug)

$this->logwrite ("parse_internal: looking for non-dynamic parent, $ptag");

if (!$this->TEMPLATE[$ptag]['dynamic']

&& ($this->TEMPLATE[$ptag]['file'] == $this->TEMPLATE[$tag]['file'])) {

$tag = $ptag;

break;

}

}

}

}

$this->TEMPLATE[$tag]['string'] = &$this->load($this->TEMPLATE[$tag]['file']);

$this->TEMPLATE[$tag]['loaded'] = 1;

}

// If we are supposed to automatically detect dynamic templates and the dynamic

// flag is not set, scan the template for dynamic sections.

Dynamic sections

// markers have a very rigid syntax as HTML comments....

if ($this->DYNAMIC) {

$this->TEMPLATE[$tag]['tag']

= $tag;

if (!isset($this->TEMPLATE[$tag]['parsed'])

|| !$this->TEMPLATE[$tag]['parsed']) {

$this->TEMPLATE[$tag]['part'] = $this->parse_internal_1 ($tag, $this->TEMPLATE[$tag]['string']);

$this->TEMPLATE[$tag]['parsed'] = true;

}

}

}

}

//

// Description

//

class.FastTemplate.php3 compatible interface.

//

// Notes

//

I prefer the name `subst' to `parse' since during this phase we are

//

really doing variable substitution into the template.

However, at

//

some point we have to load and parse the template and `subst' will

//

do that as well...

//

function parse ($handle, $tag, $autoload = true) {

return $this->subst ($handle, $tag, $autoload);

}

//

// Description

//

Perform substitution on the template.

We do not really recurse

//

downward in the sense that we do not do subsitutions on inferior

//

templates.

For each inferior template which is a part of this

//

template, we insert the current value of their results.

//

// Notes

//

Do I want to make this return a reference?

function subst ($handle, $tag, $autoload = true) {

$append = false;

$debug = $this->DEBUGALL || $this->DEBUG['subst'];

$this->LAST = $handle;

if ($debug)

$this->logwrite ("subst (handle=$handle, tag=$tag, autoload=$autoload)");

// For compatibility with FastTemplate, the results need to overwrite

// for an array.

This really only seems to be useful in the case of

// something like

//

$t->parse ('MAIN', array ('array', 'main'));

// Where the 'main' template has a variable named MAIN which will be

// set on the first pass (i.e., when parasing 'array') and used on the

// second pass (i.e., when parsing 'main').

if (gettype($tag) == 'array') {

foreach (array_values($tag) as $t) {

if ($debug)

$this->logwrite ("subst: calling subst($handle,$t,$autoload)");

$this->subst ($handle, $t, $autoload);

}

return $this->HANDLE[$handle];

}

// Period prefix means append result to pre-existing value.

if (substr($tag,0,1) == '.') {

$append = true;

$tag = substr ($tag, 1);

if ($debug)

$this->logwrite ("subst (handle=$handle, tag=$tag, autoload=$autoload) in append mode");

}

// $this->TEMPLATE[$tag] will only be set if it was explicitly

// declared via define(); i.e., inferior templates will not have an

// entry.

if (isset($this->TEMPLATE[$tag])) {

if (!isset($this->TEMPLATE[$tag]['parsed'])

|| !$this->TEMPLATE[$tag]['parsed'])

$this->parse_internal ($tag);

} else {

if (!$this->DYNAMIC) {

$this->error ("subst (handle=$handle, tag=$tag, autoload=$autoload): " .

'no such tag and dynamic templates are turned off', true);

}

if ($autoload) {

if ($debug)

$this->logwrite ("subst: TEMPLATE[tag=$tag] not found, trying autoload");

foreach (array_keys($this->TEMPLATE) as $t) {

if ($debug)

$this->logwrite ("subst: calling parse_internal (tag=$t)");

if (!isset($this->TEMPLATE[$tag]['parsed'])

|| !$this->TEMPLATE[$tag]['parsed'])

$this->parse_internal ($t);

}

if ($debug)

$this->logwrite ('subst: retrying with autoload = false');

$this->subst ($handle, $tag, false);

if ($debug)

$this->logwrite ('subst: completed with autoload = false');

return;

} else {

$this->error ("subst (handle=$handle, tag=$tag, autoload=$autoload):

no such tag", true);

}

}

if (!$append) {

$this->TEMPLATE[$tag]['result'] = '';

if ($debug)

$this->logwrite ("subst (handle=$handle, tag=$tag, autoload=$autoload) in overwrite mode");

}

if ($debug)

$this->logwrite ('subst: type(this->TEMPLATE[$tag]['part']) => ' .

gettype($this->TEMPLATE[$tag]['part']));

// Hmmm, clear() called before subst() seems to result in this not

// being defined which leaves me a bit confused....

$result = '';

if (isset($this->TEMPLATE[$tag]['part'])) {

reset ($this->TEMPLATE[$tag]['part']);

foreach (array_keys($this->TEMPLATE[$tag]['part']) as $p) {

if ($debug)

$this->logwrite ("subst: looking at TEMPLATE[$tag]['part'][$p]");

$tmp = $this->TEMPLATE[$tag]['part'][$p];

// Don't try if ($p == 'parent')....

if (strcmp ($p, 'parent') == 0) {

if ($debug)

$this->logwrite ("subst: skipping part $p");

$tmp = '';

} else if (gettype($this->TEMPLATE[$tag]['part'][$p]) == 'string') {

if ($debug)

$this->logwrite ("subst: using part $p");

reset ($this->VAR);

// Because we treat VAR and HANDLE separately (unlike

// class.FastTemplate.php3), we have to iterate over both or we

// miss some substitutions and are not 100% compatible.

while (list($key,$val) = each ($this->VAR)) {

if ($debug)

$this->logwrite ("subst: substituting VAR $key = $val in $tag");

$key = '{'.$key.'}';

$tmp = str_replace ($key, $val, $tmp);

}

reset ($this->HANDLE);

while (list($key,$val) = each ($this->HANDLE)) {

if ($debug)

$this->logwrite ("subst: substituting HANDLE $key = $val in $tag");

$key = '{'.$key.'}';

$tmp = str_replace ($key, $val, $tmp);

}

$result .= $tmp;

} else {

$xtag = $this->TEMPLATE[$tag]['part'][$p]['tag'];

if ($debug) {

$this->logwrite ("subst: substituting other tag $xtag result in $tag");

}

// The assignment is a no-op if the result is not set, but when

// E_ALL is in effect, a warning is generated without the

// isset() test.

if (isset ($this->TEMPLATE[$xtag]['result']))

$result .= $this->TEMPLATE[$xtag]['result'];

}

}

}

if ($this->STRICT) {

// If quiet-mode is turned on, skip the check since we're not going

// to do anything anyway.

if (!$this->QUIET) {

if (preg_match ($this->REGEX_VAR, $result)) {

$this->error ("<B>unmatched tags still present in $tag</B><BR />");

}

}

} else {

$result = preg_replace ($this->REGEX_VAR, '', $result);

}

if ($append) {

if ($debug) {

$this->logwrite ("subst: appending TEMPLATE[$tag]['result'] = $result");

$this->logwrite ("subst: old HANDLE[$handle] = {$this->HANDLE[$handle]}");

$this->logwrite ("subst: old TEMPLATE[$tag]['result'] = {$this->TEMPLATE[$tag]['result']}");

}

// The isset() tests are to suppresss warning when E_ALL is in effect

// and the variables have not actually been set yet (even though the

// user specified append-mode).

if (isset ($this->HANDLE[$handle]))

$this->HANDLE[$handle] .= $result;

else

$this->HANDLE[$handle] = $result;

if (isset ($this->TEMPLATE[$tag]['result']))

$this->TEMPLATE[$tag]['result'] .= $result;

else

$this->TEMPLATE[$tag]['result'] = $result;

if ($debug) {

$this->logwrite ("subst: new HANDLE[$handle] = {$this->HANDLE[$handle]}");

$this->logwrite ("subst: new TEMPLATE[$tag]['result'] = {$this->TEMPLATE[$tag]['result']}");

}

} else {

if ($debug)

$this->logwrite ("subst: setting TEMPLATE[$tag]['result'] = $result");

$this->HANDLE[$handle]

= $result;

$this->TEMPLATE[$tag]['result'] = $result;

}

return $this->HANDLE[$handle];

}

//

// Description

//

Clear a block from a template.

The intent is to remove an inferior

//

template from a parent.

This works even if the template has already

//

been parsed since we go straight to the specified template and clear

//

the results element.

If the given template has not yet been

//

loaded, the load is forced by calling parse_internal().

//

function clear_dynamic ($tag = NULL) {

$debug = $this->DEBUGALL || $this->DEBUG['clear_dynamic'];

if (is_null ($tag)) {

// Clear all result elements.

Uhm, needs to be tested.

if ($debug)

$this->logwrite ("clear_dynamic (NULL)");

foreach (array_values ($this->TEMPLATE) as $t) {

$this->clear_dynamic ($t);

}

return;

} else if (gettype($tag) == 'array') {

if ($debug)

$this->logwrite ("clear_dynamic ($tag)");

foreach (array_values($tag) as $t) {

$this->clear_dynamic ($t);

}

return;

}

else if (!isset($this->TEMPLATE[$tag])) {

if ($debug)

$this->logwrite ("clear_dynamic ($tag) --> $tag not set, calling parse_internal");

$this->parse_internal ($tag);

// $this->TEMPLATE[$tag] = array ();

}

if ($debug)

$this->logwrite ("clear_dynamic ($tag)");

// $this->TEMPLATE[$tag]['loaded']

= true;

// $this->TEMPLATE[$tag]['string']

= '';

$this->TEMPLATE[$tag]['result'] = '';

// $this->TEMPLATE[$tag]['clear']

= true;

}

//

// Description

//

Clear the results of a handle set by parse().

The input handle can

//

be a single value, an array, or the PHP constant NULL.

For the

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有