/** * Convert variable format * * @param string $varName Name of the variable * @param array $parameter Array contains format parameters * @param array $pool Data that may needed for compile * @param DataContainer $dataContainer Parser data container * * @throws Exception\VariableDateMustSet * @throws Exception\VariableDateFormatNotFound * * @return string Compiled PHP code */ public static function convert($varName, array $parameter, array $pool, DataContainer $dataContainer) { $phpCode = ''; if (!isset($parameter[0]) || !$parameter[0]) { throw new Exception\VariableDateMustSet($varName); } if (!isset($pool['LanguageMap']['FORMAT_DATE_' . $parameter[0]])) { throw new Exception\VariableDateFormatNotFound($parameter[0], $varName); } if (!$dataContainer->hasDefineBlock('Header', 'Variable:InitDateTime')) { $dataContainer->setDefineBlock('Header', 'Variable:InitDateTime', '<?php $____dateTimeZones_____ = ' . var_export(static::$timeZones, true) . '; $____dateTime_____ = new DateTime(); ?>'); $dataContainer->setDefineBlock('Footer', 'Variable:DeInitDateTime', '<?php unset($____dateTimeZones_____); unset($____dateTime_____); ?>'); $dataContainer->setMutex('Overwrite!$____dateTimeZones_____'); $dataContainer->setMutex('Overwrite!$____dateTime_____'); } $phpCode .= '<?php '; if (isset($parameter[1]) && $parameter[1]) { $parameters = new Parameters('var="' . $parameter[1] . '"', array('var' => 'variable')); $phpCode .= 'if (isset(' . $parameters->get('var') . ', $____dateTimeZones_____[' . $parameters->get('var') . '])) {'; $phpCode .= '$____dateTime_____->setTimezone(new DateTimeZone('; $phpCode .= '$____dateTimeZones_____[' . $parameters->get('var') . '])'; $phpCode .= '); }'; } $phpCode .= '$____dateTime_____->setTimestamp((int)' . $varName . '); ' . 'echo($____dateTime_____->format(\'' . str_replace('\'', '\\\'', $pool['LanguageMap']['FORMAT_DATE_' . $parameter[0]]) . '\')); ?>'; return $phpCode; }
/** * Compile parameter to IF expression * * @param Parameter $parameters The parameter will be used to compile * * @throws Exception\LogicFirstParamaterMustBeVar * @throws Exception\LogicOverwriteRisk * * @return array Result of compiled parameters including isset check syntaxes. */ protected function compileParameters(Parameter $parameters) { $phpIsset = $lastVarName = ''; $stacks = $varNames = $logicStack = array(); $params = $parameters->fetch(); if (!isset($params[0])) { return array('Check' => $phpIsset, 'Logic' => trim(implode(' && ', $logicStack))); } if ($params[0]['Tag'] != 'var' && $params[0]['Tag'] != 'empty' && $params[0]['Tag'] != 'not_empty' && $params[0]['Tag'] != 'true' && $params[0]['Tag'] != 'not_true' && $params[0]['Tag'] != 'false' && $params[0]['Tag'] != 'not_false') { throw new Exception\LogicFirstParamaterMustBeVar(implode(', ', array('empty', 'not_empty', 'true', 'not_true', 'false', 'not_false'))); } foreach ($parameters->fetch() as $param) { switch ($param['Tag']) { case 'empty': // just remember the tag, discards data // just remember the tag, discards data case 'not_empty': // just remember the tag, discards data // just remember the tag, discards data case 'true': // just remember the tag, discards data // just remember the tag, discards data case 'not_true': // just remember the tag, discards data // just remember the tag, discards data case 'false': // just remember the tag, discards data // just remember the tag, discards data case 'not_false': // just remember the tag, discards data $stacks[] = array('Tag' => $param['Tag'], 'Var' => $param['Data']); $varNames[] = $param['Data']; break; case 'var': $varNames[] = $param['Data']; $lastVarName = $param['Data']; break; case 'fits': // fits and not_fits use same operation // fits and not_fits use same operation case 'not_fits': $stacks[] = array('Tag' => $param['Tag'], 'Var' => $lastVarName, 'Data' => $this->getIsDataFitType($param['Data'])); break; case 'equals': // equals and not_equals use same operation // equals and not_equals use same operation case 'not_equals': // Save the variable name to varNames $varNames[] = $param['Data']; // And save the variable name as data, like defaults did $stacks[] = array('Tag' => $param['Tag'], 'Var' => $lastVarName, 'Data' => $param['Data']); break; default: $stacks[] = array('Tag' => $param['Tag'], 'Var' => $lastVarName, 'Data' => $param['Data']); break; } } // I'll do this with violence // Syntax to check if variable has set. foreach ($varNames as $varName) { // Check overwrite for $varName $varPureName = $this->getPureVarName($varName); if ($this->dataContainer->checkMutex('Overwrite!' . $varPureName)) { throw new Exception\LogicOverwriteRisk($varPureName); } $phpIsset .= 'if (!isset(' . $varName . ')) { '; $phpIsset .= $varName . ' = null; '; $phpIsset .= '} '; } // The IF Logic syntax foreach ($stacks as $stack) { // Check overwrite for $stack['Var'] $varPureName = $this->getPureVarName($stack['Var']); if ($this->dataContainer->checkMutex('Overwrite!' . $varPureName)) { throw new Exception\LogicOverwriteRisk($varPureName); } switch ($stack['Tag']) { case 'empty': $logicStack[] = 'empty(' . $stack['Var'] . ')'; break; case 'not_empty': $logicStack[] = '!empty(' . $stack['Var'] . ')'; break; case 'true': $logicStack[] = '(' . $stack['Var'] . ')'; break; case 'not_true': $logicStack[] = '(' . $stack['Var'] . ' !== true)'; break; case 'false': $logicStack[] = '(!' . $stack['Var'] . ')'; break; case 'not_false': $logicStack[] = '(' . $stack['Var'] . ' !== false)'; break; case 'equals': // $stack['Data'] will be the variable $dataVarPureName = $this->getPureVarName($stack['Data']); if ($this->dataContainer->checkMutex('Overwrite!' . $dataVarPureName)) { throw new Exception\LogicOverwriteRisk($dataVarPureName); } $logicStack[] = '(' . $stack['Var'] . ' == ' . $stack['Data'] . ')'; break; case 'not_equals': // $stack['Data'] will be the variable too $dataVarPureName = $this->getPureVarName($stack['Data']); if ($this->dataContainer->checkMutex('Overwrite!' . $dataVarPureName)) { throw new Exception\LogicOverwriteRisk($dataVarPureName); } $logicStack[] = '(' . $stack['Var'] . ' != ' . $stack['Data'] . ')'; break; case 'is': $logicStack[] = '(' . $stack['Var'] . ' == "' . str_replace('"', '\\"', $stack['Data']) . '")'; break; case 'not': $logicStack[] = '(' . $stack['Var'] . ' != "' . str_replace('"', '\\"', $stack['Data']) . '")'; break; case 'fits': $logicStack[] = '(' . $stack['Var'] . ' === ' . $stack['Data'] . ')'; break; case 'not_fits': $logicStack[] = '(' . $stack['Var'] . ' !== ' . $stack['Data'] . ')'; break; case 'larger': $logicStack[] = '(' . $stack['Var'] . ' > ' . $stack['Data'] . ')'; break; case 'not_larger': $logicStack[] = '(' . $stack['Var'] . ' <= ' . $stack['Data'] . ')'; break; case 'smaller': $logicStack[] = '(' . $stack['Var'] . ' < ' . $stack['Data'] . ')'; break; case 'not_smaller': $logicStack[] = '(' . $stack['Var'] . ' >= ' . $stack['Data'] . ')'; break; default: break; } } return array('Check' => $phpIsset, 'Logic' => trim(implode(' && ', $logicStack))); }
/** * Get time displaying code * * @param string $varName Name of the variable * @param array $parameter Array contains format parameters * @param array $pool Data that may needed for compile * * @throws Exception\VariableDateFormatNotFound * * @return string Compiled PHP code */ protected static function getTimeCode($varName, array &$parameter, array &$pool) { $timeFormatType = 'DEFAULTTIME'; $phpCode = ''; if (isset($parameter[0]) && $parameter[0]) { $timeFormatType = $parameter[0]; } if (!isset($pool['LanguageMap']['FORMAT_DATE_' . $timeFormatType])) { throw new Exception\VariableDateFormatNotFound($timeFormatType, $varName); } if (isset($parameter[1]) && $parameter[1]) { $parameters = new Parameters('var="' . $parameter[1] . '"', array('var' => 'variable')); $phpCode .= 'if (isset(' . $parameters->get('var') . ', $____dateTimeZones_____[' . $parameters->get('var') . '])) {'; $phpCode .= '$____dateTime_____->setTimezone(new DateTimeZone('; $phpCode .= '$____dateTimeZones_____[' . $parameters->get('var') . '])'; $phpCode .= '); }'; } $phpCode .= '$____dateTime_____->setTimestamp((int)' . $varName . '); ' . 'echo($____dateTime_____->format(\'' . str_replace('\'', '\\\'', $pool['LanguageMap']['FORMAT_DATE_' . $timeFormatType]) . '\')); '; return $phpCode; }
/** * Get the set & to pair * * @param Parameter $parameter The parameter object which contains parameters * * @return array The array of paired set / to set */ protected function getSetTo(Parameter $parameter) { $result = array(); $sets = $parameter->getAll('set'); $tos = $parameter->getAll('to'); $setCount = count($sets); $toCount = count($tos); if ($toCount != $setCount) { throw new Exception\TemplateMissingSetOrTo($setCount, $toCount); return false; } foreach ($sets as $key => $set) { if (!isset($tos[$key])) { throw new Exception\TemplateMissingTo($set); } if (!$set) { throw new Exception\TemplateSetIsEmpty($key + 1); } $result[str_replace($this->backSlash['Search'], $this->backSlash['Replace'], $set)] = str_replace($this->backSlash['Search'], $this->backSlash['Replace'], $tos[$key]); } return $result; }