예제 #1
0
파일: Dates.php 프로젝트: raincious/facula
 /**
  * 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;
 }
예제 #2
0
파일: Logic.php 프로젝트: raincious/facula
 /**
  * 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)));
 }
예제 #3
0
 /**
  * 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;
 }
예제 #4
0
 /**
  * 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;
 }