Template::$scope = array('~typeof' => function ($v = null) { if (is_null($v)) { return 'null'; } if (is_bool($v)) { return 'boolean'; } if (is_string($v)) { return 'string'; } if (is_integer($v)) { return 'number'; } if (is_array($v)) { return 'object'; } if (is_callable($v)) { return 'function'; } }, '~true' => true, '~false' => false, '~years' => function ($start) { $y = date('Y'); if ($y == $start) { return $y; } return $start . '–' . $y; }, '~date' => function ($format, $time = null) { //if(is_null($time))$time=time(); Нельзя выводить текущую дату когда передан null так по ошибке будет не то выводится когда даты просто нет. if ($time === true) { $time = time(); } if ($time == '') { return ''; } $st = (string) $time; if (mb_strlen($st) == 6) { $y = mb_substr($st, 0, 2); $m = mb_substr($st, 2, 2); $d = mb_substr($st, 4, 2); $time = mktime(12, 12, 12, $m, $d, $y); } if (mb_strlen($st) == 8) { $y = mb_substr($st, 0, 4); $m = mb_substr($st, 4, 2); $d = mb_substr($st, 6, 2); $time = mktime(12, 12, 12, $m, $d, $y); } $r = date($format, $time); if (strpos($format, 'F') != -1) { $trans = array('January' => 'января', 'February' => 'февраля', 'March' => 'марта', 'April' => 'апреля', 'May' => 'мая', 'June' => 'июня', 'July' => 'июля', 'August' => 'августа', 'September' => 'сентября', 'October' => 'октября', 'November' => 'ноября', 'December' => 'декабря'); $r = strtr($r, $trans); } return $r; }, '~obj' => function () { $args = func_get_args(); $obj = array(); for ($i = 0, $l = sizeof($args); $i < $l; $i = $i + 2) { if ($l == $i + 1) { break; } $obj[$args[$i]] = $args[$i + 1]; } return $obj; }, '~encode' => function ($str) { if (!is_string($str)) { return $str; } return urlencode($str); }, '~decode' => function ($str) { if (!is_string($str)) { return $str; } return urldecode($str); }, '~length' => function ($obj = null) { if (!$obj) { return 0; } if (is_array($obj)) { return sizeof($obj); } if (is_string($obj)) { return mb_strlen($obj); } return 0; }, '~inArray' => function ($val, $arr) { if (!$arr) { return false; } if (is_array($arr)) { return in_array($val, $arr); } }, '~match' => function ($exp, $val) { preg_match('/' . $exp . '/', $val, $match); return $match; }, '~test' => function ($exp, $val) { $r = preg_match('/' . $exp . '/', $val); return !!$r; }, '~lower' => function ($str) { return mb_strtolower($str); }, '~upper' => function ($str) { return mb_strtoupper($str); }, '~parse' => function ($str = '') { $conf = Template::$moment; if (!$str) { return ''; } $res = Template::parse($str, $conf['data'], 'root', $conf['dataroot'], 'root'); //(url,data,tplroot,dataroot,tplempty){ return $res; }, '~indexOf' => function ($str, $v = null) { //Начиная с нуля if (is_null($v)) { return -1; } $r = mb_stripos($str, $v); if ($r === false) { $r = -1; } return $r; }, '~last' => function () { $conf = Template::$moment; $dataroot = $conf['dataroot']; $key = array_pop($dataroot); $obj =& Sequence::get($conf['data'], $dataroot); if (!$obj) { return true; } foreach ($obj as $k => $v) { } $r = $k == $key; return $r; }, '~words' => function ($count, $one = '', $two = null, $five = null) { if (is_null($two)) { $two = $one; } if (is_null($five)) { $five = $two; } if (!$count) { $count = 0; } if ($count > 20) { $str = (string) $count; $count = mb_substr($str, mb_strlen($str) - 1, 1); $count2 = mb_substr($str, mb_strlen($str) - 2, 1); if ($count2 == 1) { return $five; } //xxx10-xxx19 (иначе 111-114 некорректно) } if ($count == 1) { return $one; } elseif ($count > 1 && $count < 5) { return $two; } else { return $five; } }, '~even' => function () { $conf = Template::$moment; $dataroot = $conf['dataroot']; $key = array_pop($dataroot); $obj =& Sequence::get($conf['data'], $dataroot); $even = 1; foreach ($obj as $k => $v) { if ($key == $k) { break; } $even = $even * -1; } return $even == 1; }, '~array' => function () { $args = func_get_args(); $ar = array(); for ($i = 0, $l = sizeof($args); $i < $l; ++$i) { $ar[] = $args[$i]; } return $ar; }, '~multi' => function () { $args = func_get_args(); $n = 1; for ($i = 0, $l = sizeof($args); $i < $l; ++$i) { $n *= $args[$i]; } return $n; }, '~leftOver' => function ($first, $second) { //Кратное $first = (int) $first; $second = (int) $second; return $first % $second; }, '~sum' => function () { $args = func_get_args(); $n = 0; for ($i = 0, $l = sizeof($args); $i < $l; ++$i) { $n += $args[$i]; } return $n; }, '~odd' => function () { $r = Template::$scope['~even']; return !$r(); }, '~path' => function ($src) { //Передаётся либо относительный путь от корня //либо абсолютный путь //if (preg_match("/^[\-!~]/", $src)) return '/'.$src; if (preg_match("/^https{0,1}:\\/\\//", $src)) { return $src; } if (preg_match("/^\\//", $src)) { return $src; } return '/' . $src; }, '~random' => function () { $args = func_get_args(); shuffle($args); return $args[0]; }, '~first' => function () { //Возвращает true или false первый или не первый это элемент $conf = Template::$moment; $dataroot = $conf['dataroot']; $key = array_pop($dataroot); $obj =& Sequence::get($conf['data'], $dataroot); foreach ($obj as $k => $v) { break; } return $k == $key; }, '~Number' => function ($key, $def = 0) { //Делает из переменной цифру, если это не цифра то будет def $n = (int) $key; if (!$n && $n != 0) { $n = $def; } return $n; }, '~cost' => function ($cost, $text = false) { $cost = (string) $cost; $ar = explode('.', $cost); if (sizeof($ar) == 1) { $ar = explode(',', $cost); } $cop = ''; if (sizeof($ar) >= 2) { $cost = $ar[0]; $cop = $ar[1]; if (mb_strlen($cop) == 1) { $cop .= '0'; } if (mb_strlen($cop) > 2) { $cop = mb_substr($cop, 0, 3); $cop = round($cop / 10); } if ($cop == '00') { $cop = ''; } } if ($text) { $inp = ' '; } else { $inp = ' '; } if (mb_strlen($cost) > 4) { //1000 $l = mb_strlen($cost); $cost = mb_substr($cost, 0, $l - 3) . $inp . mb_substr($cost, $l - 3, $l); } if ($cop) { if ($text) { $cost = $cost . ',' . $cop; } else { $cost = $cost . '<small>,' . $cop . '</small>'; } } return $cost; });