📄 reader.php
字号:
$this->_createErrorMessage( sprintf( 'No cdata is allowed inside a template of type %s (cdata was found in %s)', $tmpl['attributes']['type'], $tmpl['name'] ) ) ); } $data = null; break; } /** * store the content */ $tmpl['content'] = $data; /** * No external template */ if( !isset( $tmpl['attributes']['src'] ) ) { $tmpl['loaded'] = true; } /** * add it to the dependencies */ if( !empty( $this->_tmplStack ) ) { $this->_addToParentTag( 'dependencies', $name ); if( isset( $tmpl['attributes']['placeholder'] ) ) { // maintain BC if( $this->shouldMaintainBc() && $tmpl['attributes']['placeholder'] === 'none' ) { $tmpl['attributes']['placeholder'] = '__none'; } if( $tmpl['attributes']['placeholder'] !== '__none' ) { $this->_characterData( $this->_startTag.(strtoupper( $tmpl['attributes']['placeholder'] ) ).$this->_endTag ); } } else { $this->_characterData( sprintf( "%sTMPL:%s%s", $this->_startTag, strtoupper( $name ), $this->_endTag ) ); } } unset( $tmpl['name'] ); unset( $tmpl['tag'] ); $this->_templates[$name] = $tmpl; return true; } /** * create a new sub-template * * @access private * @param array attributes * @return boolean true on success */ function _initSubTemplate( $attributes ) { /** * has to be embedded in a 'tmpl' tag */ if (!$this->_parentTagIs('tmpl')) { return patErrorManager::raiseError( PATTEMPLATE_READER_ERROR_INVALID_TAG, $this->_createErrorMessage( 'A subtemplate is only allowed in a TMPL tag' ) ); } /** * needs a condition attribute */ if (!isset( $attributes['condition'] )) { return patErrorManager::raiseError( PATTEMPLATE_READER_ERROR_NO_CONDITION_SPECIFIED, $this->_createErrorMessage( 'Missing \'condition\' attribute for subtemplate' ) ); } $matches = array(); $regexp = '/^'.$this->_startTag.'([^a-z]+[^\\\])'.$this->_endTag.'$/U'; if (preg_match($regexp, $attributes['condition'], $matches)) { $attributes['var'] = $matches[1]; } /** * maintain BC */ if( $this->shouldMaintainBc() && in_array( $attributes['condition'], array( 'default', 'empty', 'odd', 'even' ) ) ) { $attributes['condition'] = '__' . $attributes['condition']; } if( $attributes['condition'] == '__odd' ) { $attributes['condition'] = 1; } elseif( $attributes['condition'] == '__even' ) { $attributes['condition'] = 0; } $parent = array_pop( $this->_tmplStack ); array_push( $this->_tmplStack, $parent ); if ($parent['attributes']['type'] == 'modulo') { if( preg_match( '/^\d$/', $attributes['condition'] ) ) { if( (integer)$attributes['condition'] >= $parent['attributes']['modulo'] ) { return patErrorManager::raiseError( PATTEMPLATE_READER_ERROR_INVALID_CONDITION, $this->_createErrorMessage( 'Condition may only be between 0 and '.($parent['attributes']['modulo']-1) ) ); } } } $attributes = $this->_inheritAttributes( $attributes ); $condition = $attributes['condition']; unset( $attributes['condition'] ); $subTmpl = array( 'type' => 'sub', 'condition' => $condition, 'data' => '', 'attributes' => $attributes, 'comments' => array(), 'dependencies' => array() ); return $subTmpl; } /** * close subtemplate * * @access private * @param string data * @return boolean true on success */ function _closeSubTemplate( $subTmpl, $data ) { $data = $this->_adjustWhitespace( $data, $subTmpl['attributes']['whitespace'] ); $subTmpl['data'] = $data; $condition = $subTmpl['condition']; unset( $subTmpl['condition'] ); $this->_addToParentTemplate( 'subtemplates', $subTmpl, $condition ); return true; } /** * handle a variable * * @access private * @param array attributes of the var tag * @param string cdata between the tags (will be used as default) * @return boolean true on success */ function _handleVariable( $attributes, $data ) { if( !isset( $attributes['name'] ) ) { return patErrorManager::raiseError( PATTEMPLATE_READER_ERROR_NO_NAME_SPECIFIED, $this->_createErrorMessage( 'Variable needs a name attribute' ) ); } $specs = array(); /** * get name */ $name = strtoupper( $attributes['name'] ); unset( $attributes['name'] ); $specs['name'] = $name; /** * use data as default value */ if( isset( $attributes['default'] ) ) { $data = $attributes['default']; $specs['default'] = $data; unset( $attributes['default'] ); } elseif (!empty( $data )) { $specs['default'] = $data; } /** * add it to template, if it's not hidden */ if (!isset( $attributes['hidden'] ) || $attributes['hidden'] == 'no') { $this->_characterData( $this->_startTag . strtoupper( $name ) . $this->_endTag ); } if( isset( $attributes['hidden'] ) ) { unset( $attributes['hidden'] ); } /** * copy value from any other variable */ if (isset( $attributes['copyfrom'] )) { $specs['copyfrom'] = strtoupper( $attributes['copyfrom'] ); if (strstr( $specs['copyfrom'], '.' )) { $specs['copyfrom'] = explode( '.', $specs['copyfrom'] ); $specs['copyfrom'][0] = strtolower( $specs['copyfrom'][0] ); } unset( $attributes['copyfrom'] ); } if( isset( $attributes['modifier'] ) ) { $modifier = $attributes['modifier']; unset( $attributes['modifier'] ); $type = isset( $attributes['modifiertype'] ) ? $attributes['modifiertype'] : 'auto'; if( isset( $attributes['modifiertype'] ) ) unset( $attributes['modifiertype'] ); $specs['modifier'] = array( 'mod' => $modifier, 'type' => $type, 'params' => $attributes ); } if (!empty( $specs )) { $this->_addToParentTemplate( 'varspecs', $specs, $name ); } return true; } /** * handle a comment * * @access private * @param array attributes of the comment tag * @param string cdata between the tags (will be used as default) * @return boolean true on success */ function _handleComment( $attributes, $data ) { $this->_addToParentTag( 'comments', $data ); } /** * get the character data of the element * * @access private * @return string */ function _getCData() { if( $this->_depth == 0 ) { return ''; } return $this->_data[$this->_depth]; } /** * add to a property of the parent template * * @access private * @param string property to add to * @param mixed value to add * @param string key */ function _addToParentTemplate( $property, $value, $key = null ) { $cnt = count( $this->_tmplStack ); if ($cnt === 0) { return false; } $pos = $cnt - 1; while ($pos >= 0) { if ($this->_tmplStack[$pos]['type'] != 'tmpl') { $pos--; continue; } if ($key === null) { if (!in_array( $value, $this->_tmplStack[$pos][$property] )) { array_push( $this->_tmplStack[$pos][$property], $value ); } } else { $this->_tmplStack[$pos][$property][$key] = $value; } return true; } return false; } /** * get a property of the parent template * * @access private * @param string property to add to * @return mixed value to add */ function _getFromParentTemplate( $property ) { $cnt = count( $this->_tmplStack ); if ($cnt === 0) { return false; } $pos = $cnt - 1; while ($pos >= 0) { if( $this->_tmplStack[$pos]['type'] != 'tmpl' ) { $pos--; continue; } if (isset( $this->_tmplStack[$pos][$property] )) { return $this->_tmplStack[$pos][$property]; } return false; } return false; } /** * add to a property of the parent tag * * @access private * @param string property to add to * @param mixed value to add * @param string key */ function _addToParentTag( $property, $value, $key = null ) { $cnt = count( $this->_tmplStack ); if ($cnt === 0) { return false; } $pos = $cnt - 1; if ($key === null) { if (!in_array( $value, $this->_tmplStack[$pos][$property] )) { array_push( $this->_tmplStack[$pos][$property], $value ); } } else { $this->_tmplStack[$pos][$property][$key] = $value; } return true; } /** * adjust whitespace in a CData block * * @access private * @param string data * @param string behaviour * @return string data */ function _adjustWhitespace( $data, $behaviour ) { switch( $behaviour ) { case 'trim': $data = str_replace( '\n', ' ', $data ); $data = preg_replace( '/\s\s+/', ' ', $data ); $data = trim( $data ); break; } return $data; } /** * inherit attributes from the parent template * * The following attributes are inherited automatically: * - whitespace * - unusedvars * * @access private * @param array attributes * @param array attributes with inherited attributes * @return array new attribute collection */ function _inheritAttributes( $attributes ) { if (!empty( $this->_inheritAtts )) { $parent = end( $this->_inheritAtts ); } else { $parent = array( 'whitespace' => $this->_defaultAtts['whitespace'], 'unusedvars' => $this->_defaultAtts['unusedvars'], 'autoclear' => $this->_defaultAtts['autoclear'] ); } $attributes = array_merge( $parent, $attributes ); return $attributes; } /** * checks, whether the parent tag is of a certain type * * This is needed to ensure, that subtemplates are only * placed inside a template * * @access private * @param string type (tmpl, sub, var, link) * @return boolean */ function _parentTagIs( $type ) { $parent = array_pop( $this->_tmplStack ); if( $parent === null ) { return false; } array_push( $this->_tmplStack, $parent ); if( $parent['type'] == $type ) { return true; } return false; } /** * get the current line number * * @access private * @return integer line number */ function _getCurrentLine() { $line = count( explode( "\n", $this->_processedData ) ); return $line; } /** * create an error message * * This method takes an error messages and appends the * current line number as well as a pointer to the input * (filename) * * @access private * @param string base error message * @return strin error message */ function _createErrorMessage( $msg ) { return sprintf( '%s in %s on line %d', $msg, $this->getCurrentInput(), $this->_getCurrentLine() ); } /** * get the current input * * @access public * @return string */ function getCurrentInput() { return $this->_currentInput; } /** * tests whether the reader should maintain backwards compatibility * * If enabled, you can still use 'default', 'empty', 'odd' and 'even' * instead of '__default', '__empty', etc. * * This will be disabled by default in future versions. * * @access public * @return boolean */ function shouldMaintainBc() { if (!isset( $this->_options['maintainBc'] )) { return false; } return $this->_options['maintainBc']; } /** * returns, whether the reader currently is in use * * @access public * @return boolean */ function isInUse() { return $this->_inUse; } /** * get the template root for this reader * * @access public * @return string */ function getTemplateRoot() { if (!isset($this->_options['root'])) { return null; } if (isset($this->_options['root'][$this->_name])) { return $this->_options['root'][$this->_name]; } if (isset($this->_options['root']['__default'])) { return $this->_options['root']['__default']; } return null; }}?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -