📄 reader.php
字号:
*/ case 'var': $result = false; break; /** * instance */ case 'instance': case 'comment': $result = false; break; /** * any other tag */ default: if (isset($this->_funcAliases[strtolower($name)])) { $name = $this->_funcAliases[strtolower($name)]; } $name = ucfirst( $name ); if( !$this->_tmpl->moduleExists( 'Function', $name ) ) { if (isset($this->_options['defaultFunction']) && !empty($this->_options['defaultFunction'])) { $attributes['_originalTag'] = $name; $name = ucfirst($this->_options['defaultFunction']); } else { return patErrorManager::raiseError( PATTEMPLATE_READER_ERROR_UNKNOWN_TAG, $this->_createErrorMessage( "Unknown tag {$ns}:{$name}." ) ); } } $result = array( 'type' => 'custom', 'function' => $name, 'attributes' => $attributes ); break; } if( patErrorManager::isError( $result ) ) { return $result; } array_push( $this->_tmplStack, $result ); return true; } /** * handle end element * * @access private * @param string element name */ function _endElement( $ns, $name ) { $el = array_pop( $this->_elStack ); $data = $this->_getCData(); $this->_depth--; if( $el['name'] != $name || $el['ns'] != $ns ) { return patErrorManager::raiseError( PATTEMPLATE_READER_ERROR_INVALID_CLOSING_TAG, $this->_createErrorMessage( "Invalid closing tag {$ns}:{$name}, {$el['ns']}:{$el['name']} expected" ) ); } $tmpl = array_pop( $this->_tmplStack ); /** * handle tag */ switch( $name ) { /** * template */ case 'tmpl': $this->_closeTemplate( $tmpl, $data ); break; /** * sub-template */ case 'sub': $this->_closeSubTemplate( $tmpl, $data ); break; /** * link */ case 'link': $this->_closeLink( $tmpl ); break; /** * variable */ case 'var': $this->_handleVariable( $el['attributes'], $data ); break; /** * instance */ case 'instance': break; /** * comment */ case 'comment': $this->_handleComment( $el['attributes'], $data ); break; /** * custom function */ default: $name = ucfirst( $tmpl['function'] ); if( !isset( $this->_functions[$name] ) ) { $this->_functions[$name] = $this->_tmpl->loadModule( 'Function', $name ); $this->_functions[$name]->setReader( $this ); } $result = $this->_functions[$name]->call( $tmpl['attributes'], $data ); if( patErrorManager::isError( $result ) ) { return $result; } if( is_string( $result ) ) { $this->_characterData( $result, false ); } break; } return true; } /** * handle character data * * @access private * @param string data */ function _characterData( $data, $readFromTemplate = true ) { $this->_data[$this->_depth] .= $data; if ($readFromTemplate) { $this->_processedData .= $data; } return true; } /** * handle a Link * * @access private * @param array attributes * @return boolean true on success */ function _initLink( $attributes ) { /** * needs a src attribute */ if( !isset( $attributes['src'] ) ) { return patErrorManager::raiseError( PATTEMPLATE_READER_ERROR_INVALID_TAG, $this->_createErrorMessage( "Attribute 'src' missing for link" ) ); } /** * create a new template */ $tmpl = array( 'type' => 'link', 'src' => $attributes['src'], ); return $tmpl; } /** * close a link template * * It will be added to the dependecies of the parent template. * * @access private * @param array template definition for the link */ function _closeLink( $tmpl ) { /** * add it to the dependencies */ if( !empty( $this->_tmplStack ) ) { $this->_addToParentTag( 'dependencies', strtolower( $tmpl['src'] ) ); $this->_characterData( sprintf( "%sTMPL:%s%s", $this->_startTag, strtoupper( $tmpl['src'] ), $this->_endTag ) ); } return true; } /** * create a new template * * @access private * @param array attributes * @return boolean true on success */ function _initTemplate( $attributes ) { /** * build name for the template */ if (!isset( $attributes['name'] )) { $name = $this->_buildTemplateName(); } else { $name = strtolower( $attributes['name'] ); unset( $attributes['name'] ); } /** * name must be unique */ if( isset( $this->_templates[$name] ) || $this->_tmpl->exists( $name ) ) { patErrorManager::raiseNotice( PATTEMPLATE_READER_NOTICE_TEMPLATE_EXISTS, $this->_createErrorMessage( "Template $name already exists" ), $name ); } /** * update the path */ array_push( $this->_path, $name ); if( isset( $attributes['maxloop'] ) ) { if (!isset( $attributes['parent'] )) { $attributes['parent'] = $this->_getFromParentTemplate( 'name' ); } } $attributes = $this->_prepareTmplAttributes( $attributes, $name ); array_push( $this->_inheritAtts, array( 'whitespace' => $attributes['whitespace'], 'unusedvars' => $attributes['unusedvars'], 'autoclear' => $attributes['autoclear'] ) ); /** * create a new template */ $tmpl = array( 'type' => 'tmpl', 'name' => $name, 'attributes' => $attributes, 'content' => '', 'dependencies' => array(), 'varspecs' => array(), 'comments' => array(), 'loaded' => false, 'parsed' => false, 'input' => $this->_name.'://'.$this->_currentInput ); if( $this->_root == null ) { $this->_root = $name; $tmpl['isRoot'] = true; } /** * prepare subtemplates */ switch( $attributes['type'] ) { case 'condition': case 'modulo': $tmpl['subtemplates'] = array(); break; } return $tmpl; } /** * prepare attributes * * @access private * @param array attributes * @param string template name (only used for error messages) * @return array attributes */ function _prepareTmplAttributes( $attributes, $templatename ) { /** * do not prepare twice */ if( isset( $attributes['__prepared'] ) && $attributes['__prepared'] === true ) { return $attributes; } $attributes = $this->_inheritAttributes( $attributes ); /** * get the attributes */ $attributes = array_merge( $this->_tmpl->getDefaultAttributes(), $attributes ); $attributes['type'] = strtolower( $attributes['type'] ); if( !isset( $attributes['rowoffset'] ) ) { $attributes['rowoffset'] = 1; } if( !isset( $attributes['addsystemvars'] ) ) { $attributes['addsystemvars'] = false; } else { switch ($attributes['addsystemvars']) { case 'on': case 'boolean': $attributes['addsystemvars'] = 'boolean'; break; case 'int': case 'integer': $attributes['addsystemvars'] = 'integer'; break; case 'off': $attributes['addsystemvars'] = false; break; } } /** * external template */ if( isset( $attributes['src'] ) ) { if( !isset( $attributes['parse'] ) ) $attributes['parse'] = 'on'; if( !isset( $attributes['reader'] ) ) $attributes['reader'] = $this->getName(); if( !isset( $attributes['autoload'] ) ) $attributes['autoload'] = $this->_defaultAtts['autoload']; if (isset($attributes['relative']) && strtolower($attributes['relative'] === 'yes')) { $attributes['relative'] = $this->getCurrentInput(); } else { $attributes['relative'] = false; } } /** * varscope is set */ if( isset( $attributes['varscope'] ) ) { /** * varscope is parent */ if( $attributes['varscope'] === '__parent' ) { $attributes['varscope'] = $this->_getFromParentTemplate( 'name' ); } $attributes['varscope'] = strtolower( $attributes['varscope'] ); if (strstr($attributes['varscope'], ',')) { $attributes['varscope'] = array_map('trim', explode(',', $attributes['varscope'])); } } switch( $attributes['type'] ) { /** * validate condition template */ case 'condition': if( !isset( $attributes['conditionvar'] ) ) { return patErrorManager::raiseError( PATTEMPLATE_READER_ERROR_INVALID_TAG, $this->_createErrorMessage( "Attribute 'conditionvar' missing for $templatename" ) ); } $attributes['conditionvar'] = strtoupper( $attributes['conditionvar'] ); if( strstr( $attributes['conditionvar'], '.' ) ) { list( $attributes['conditiontmpl'], $attributes['conditionvar'] ) = explode( '.', $attributes['conditionvar'] ); $attributes['conditiontmpl'] = strtolower( $attributes['conditiontmpl'] ); } $attributes['autoclear'] = 'yes'; if (!isset( $attributes['useglobals'] )) { $attributes['useglobals'] = 'no'; } break; /** * validate simplecondition template */ case 'simplecondition': if( !isset( $attributes['requiredvars'] ) ) { return patErrorManager::raiseError( PATTEMPLATE_READER_ERROR_INVALID_TAG, $this->_createErrorMessage( "Attribute 'requiredvars' missing for $templatename" ) ); } $tmp = array_map( 'trim', explode( ',', $attributes['requiredvars'] ) ); $attributes['requiredvars'] = array(); foreach( $tmp as $var ) { $pos = strpos( $var, '=' ); if ($pos !== false) { $val = trim(substr( $var, $pos+1 )); $var = trim(substr( $var, 0, $pos )); } else { $val = null; } $var = strtoupper($var); $pos = strpos( $var, '.' ); if ($pos === false) { array_push( $attributes['requiredvars'], array( $templatename, $var, $val ) ); } else { array_push( $attributes['requiredvars'], array( strtolower( substr( $var, 0, $pos ) ), substr( $var, $pos+1 ), $val ) ); } } $attributes['autoclear'] = 'yes'; break; /** * oddeven => switch to new modulo syntax */ case 'oddeven': $attributes['type'] = 'modulo'; $attributes['modulo'] = 2; $attributes['autoclear'] = 'yes'; break; /** * modulo => requires a module attribute */ case 'modulo': if( !isset( $attributes['modulo'] ) ) { return patErrorManager::raiseError( PATTEMPLATE_READER_ERROR_INVALID_TAG, $this->_createErrorMessage( "Attribute 'modulo' missing for $templatename" ) ); } $attributes['autoclear'] = 'yes'; break; /** * standard template => do nothing */ case 'standard': break; /** * unknown type */ default: return patErrorManager::raiseError( PATTEMPLATE_READER_ERROR_INVALID_TAG, $this->_createErrorMessage( "Unknown value for attribute type: {$attributes['type']}" ) ); break; } $attributes['__prepared'] = true; return $attributes; } /** * build a template name * * @access private * @return string new template name */ function _buildTemplateName() { return strtolower( uniqid( 'tmpl' ) ); } /** * close the current template * * @access private * @return boolean true on success */ function _closeTemplate( $tmpl, $data ) { $name = array_pop( $this->_path ); $data = $this->_adjustWhitespace( $data, $tmpl['attributes']['whitespace'] ); array_pop( $this->_inheritAtts ); /** * check for special templates */ switch( $tmpl['attributes']['type'] ) { /** * check for whitespace in conditional templates * and raise a notice */ case 'condition': case 'modulo': if( trim( $data ) != '' ) { patErrorManager::raiseNotice( PATTEMPLATE_READER_NOTICE_INVALID_CDATA_SECTION,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -