Example #1
0
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 = '&nbsp;';
    }
    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;
});