'twig_date_format_filter', 'strftime' => 'twig_strftime_format_filter', 'strtotime' => 'strtotime', 'numberformat' => 'number_format', 'moneyformat' => 'money_format', 'filesizeformat' => 'twig_filesize_format_filter', 'format' => 'sprintf', 'relative' => 'relative_time', // numbers 'even' => 'twig_is_even_filter', 'odd' => 'twig_is_odd_filter', // escaping and encoding 'escape' => 'twig_escape_filter', 'e' => 'twig_escape_filter', 'urlencode' => 'twig_urlencode_filter', 'quotes' => 'twig_quotes_filter', 'slashes' => 'addslashes', // string filters 'title' => 'twig_title_string_filter', 'capitalize' => 'twig_capitalize_string_filter', 'upper' => 'strtoupper', 'lower' => 'strtolower', 'strip' => 'trim', 'rstrip' => 'rtrim', 'lstrip' => 'ltrim', 'translate' => 'twig_translate_string_filter', 'translate_plural' => 'twig_translate_plural_string_filter', 'normalize' => 'normalize', 'truncate' => 'twig_truncate_filter', 'excerpt' => 'twig_excerpt_filter', 'replace' => 'twig_replace_filter', 'match' => 'twig_match_filter', 'contains' => 'substr_count', 'linebreaks' => 'nl2br', 'camelize' => 'camelize', 'strip_tags' => 'strip_tags', 'pluralize' => 'twig_pluralize_string_filter', 'depluralize' => 'twig_depluralize_string_filter', 'sanitize' => 'sanitize', 'repeat' => 'str_repeat', // array helpers 'join' => 'twig_join_filter', 'split' => 'twig_split_filter', 'first' => 'twig_first_filter', 'offset' => 'twig_offset_filter', 'last' => 'twig_last_filter', 'reverse' => 'array_reverse', 'length' => 'twig_length_filter', 'count' => 'count', 'sort' => 'twig_sort_filter', // iteration and runtime 'default' => 'twig_default_filter', 'keys' => 'array_keys', 'items' => 'twig_get_array_items_filter', // debugging 'inspect' => 'twig_inspect_filter', 'uploaded' => 'uploaded', 'fallback' => 'oneof', 'selected' => 'twig_selected_filter', 'checked' => 'twig_checked_filter', 'option_selected' => 'twig_option_selected_filter' ); class Twig_LoopContextIterator implements Iterator { public $context; public $seq; public $idx; public $length; public $parent; public function __construct(&$context, $seq, $parent) { $this->context = $context; $this->seq = $seq; $this->idx = 0; $this->length = count($seq); $this->parent = $parent; } public function rewind() {} public function key() {} public function valid() { return $this->idx < $this->length; } public function next() { $this->idx++; } public function current() { return $this; } } function unretarded_array_unshift(&$arr, &$val) { $arr = array_merge(array(&$val), $arr); } /** * This is called like an ordinary filter just with the name of the filter * as first argument. Currently we just raise an exception here but it * would make sense in the future to allow dynamic filter lookup for plugins * or something like that. */ function twig_missing_filter($name) { $args = func_get_args(); array_shift($args); $text = $args[0]; array_shift($args); array_unshift($args, $name); unretarded_array_unshift($args, $text); $trigger = Trigger::current(); if ($trigger->exists($name)) return call_user_func_array(array($trigger, "filter"), $args); return $text; } function twig_get_attribute($obj, $item, $function = true) { if (is_array($obj) && isset($obj[$item])) return $obj[$item]; if (!is_object($obj)) return NULL; if ($function and method_exists($obj, $item)) return call_user_func(array($obj, $item)); if (property_exists($obj, $item)) { $tmp = get_object_vars($obj); return $tmp[$item]; } $method = 'get' . ucfirst($item); if ($function and method_exists($obj, $method)) return call_user_func(array($obj, $method)); if (is_object($obj)) { @$obj->$item; # Funky way of allowing __get to activate before returning the value. return @$obj->$item; } return NULL; } function twig_paginate(&$context, $as, $over, $per_page) { $name = (in_array("page", Paginator::$names)) ? $as."_page" : "page" ; if (count($over) == 2 and $over[0] instanceof Model and is_string($over[1])) $context[$as] = $context["::parent"][$as] = new Paginator($over[0]->__getPlaceholders($over[1]), $per_page, $name); else $context[$as] = $context["::parent"][$as] = new Paginator($over, $per_page, $name); } function twig_iterate(&$context, $seq) { $parent = isset($context['loop']) ? $context['loop'] : null; $seq = twig_make_array($seq); $context['loop'] = array('parent' => $parent, 'iterated' => false); return new Twig_LoopContextIterator($context, $seq, $parent); } function twig_set_loop_context(&$context, $iterator, $target) { $context[$target] = $iterator->seq[$iterator->idx]; $context['loop'] = twig_make_loop_context($iterator); } function twig_set_loop_context_multitarget(&$context, $iterator, $targets) { $values = $iterator->seq[$iterator->idx]; if (!is_array($values)) $values = array($values); $idx = 0; foreach ($values as $value) { if (!isset($targets[$idx])) break; $context[$targets[$idx++]] = $value; } $context['loop'] = twig_make_loop_context($iterator); } function twig_make_loop_context($iterator) { return array( 'parent' => $iterator->parent, 'length' => $iterator->length, 'index0' => $iterator->idx, 'index' => $iterator->idx + 1, 'revindex0' => $iterator->length - $iterator->idx - 1, 'revindex '=> $iterator->length - $iterator->idx, 'first' => $iterator->idx == 0, 'last' => $iterator->idx + 1 == $iterator->length, 'iterated' => true ); } function twig_make_array($object) { if (is_array($object)) return array_values($object); elseif (is_object($object)) { $result = array(); foreach ($object as $value) $result[] = $value; return $result; } return array(); } function twig_date_format_filter($timestamp, $format='F j, Y, G:i') { return when($format, $timestamp); } function twig_strftime_format_filter($timestamp, $format='%x %X') { return when($format, $timestamp, true); } function twig_urlencode_filter($url, $raw=false) { if ($raw) return rawurlencode($url); return urlencode($url); } function twig_join_filter($value, $glue='') { return implode($glue, (array) $value); } function twig_default_filter($value, $default='') { return is_null($value) ? $default : $value; } function twig_get_array_items_filter($array) { $result = array(); foreach ($array as $key => $value) $result[] = array($key, $value); return $result; } function twig_filesize_format_filter($value) { $value = max(0, (int)$value); $places = strlen($value); if ($places <= 9 && $places >= 7) { $value = number_format($value / 1048576, 1); return "$value MB"; } if ($places >= 10) { $value = number_format($value / 1073741824, 1); return "$value GB"; } $value = number_format($value / 1024, 1); return "$value KB"; } function twig_is_even_filter($value) { return $value % 2 == 0; } function twig_is_odd_filter($value) { return $value % 2 == 1; } function twig_replace_filter($str, $search, $replace, $regex = false) { if ($regex) return preg_replace($search, $replace, $str); else return str_replace($search, $replace, $str); } function twig_match_filter($str, $match) { return preg_match($match, $str); } // add multibyte extensions if possible if (function_exists('mb_get_info')) { function twig_upper_filter($string) { $template = twig_get_current_template(); if (!is_null($template->charset)) return mb_strtoupper($string, $template->charset); return strtoupper($string); } function twig_lower_filter($string) { $template = twig_get_current_template(); if (!is_null($template->charset)) return mb_strtolower($string, $template->charset); return strtolower($string); } function twig_title_string_filter($string) { $template = twig_get_current_template(); if (is_null($template->charset)) return ucwords(strtolower($string)); return mb_convert_case($string, MB_CASE_TITLE, $template->charset); } function twig_capitalize_string_filter($string) { $template = twig_get_current_template(); if (is_null($template->charset)) return ucfirst(strtolower($string)); return mb_strtoupper(mb_substr($string, 0, 1, $template->charset)) . mb_strtolower(mb_substr($string, 1, null, $template->charset)); } // override the builtins $twig_filters['upper'] = 'twig_upper_filter'; $twig_filters['lower'] = 'twig_lower_filter'; } // and byte fallback else { function twig_title_string_filter($string) { return ucwords(strtolower($string)); } function twig_capitalize_string_filter($string) { return ucfirst(strtolower($string)); } } function twig_translate_string_filter($string, $domain = "theme") { $domain = ($domain == "theme" and ADMIN) ? "chyrp" : $domain ; return __($string, $domain); } function twig_translate_plural_string_filter($single, $plural, $number, $domain = "theme") { $domain = ($domain == "theme" and ADMIN) ? "chyrp" : $domain ; return _p($single, $plural, $number, $domain); } function twig_inspect_filter($thing) { if (ini_get("xdebug.var_display_max_depth") == -1) return var_dump($thing); else return '
' .
               fix(var_export($thing, true)) .
               '
'; } function twig_split_filter($string, $cut = " ") { return explode($cut, $string); } function twig_first_filter($array) { foreach ($array as $key => &$val) return $val; # Return the first one. return false; } function twig_last_filter($array) { return $array[count($array) - 1]; } function twig_offset_filter($array, $offset = 0) { return $array[$offset]; } function twig_selected_filter($foo) { $try = func_get_args(); array_shift($try); $just_class = (end($try) === true); if ($just_class) array_pop($try); if (is_array($try[0])) { foreach ($try as $index => $it) if ($index) $try[0][] = $it; $try = $try[0]; } if (in_array($foo, $try)) return ($just_class) ? " selected" : ' class="selected"' ; } function twig_checked_filter($foo) { if ($foo) return ' checked="checked"'; } function twig_option_selected_filter($foo) { $try = func_get_args(); array_shift($try); if (in_array($foo, $try)) return ' selected="selected"'; } function twig_pluralize_string_filter($string, $number = null) { if ($number and $number == 1) return $string; else return pluralize($string); } function twig_depluralize_string_filter($string) { return depluralize($string); } function twig_quotes_filter($string) { return str_replace(array('"', "'"), array('\"', "\\'"), $string); } function twig_length_filter($thing) { if (is_string($thing)) return strlen($thing); else return count($thing); } function twig_escape_filter($string, $quotes = true, $decode = true) { if (!is_string($string)) # Certain post attributes might be parsed from YAML to an array, return $string; # in which case the module provides a value. However, the attr # is still passed to the "fallback" and "fix" filters when editing. $safe = fix($string, $quotes); return $decode ? preg_replace("/&(#?[A-Za-z0-9]+);/", "&\\1;", $safe) : $safe ; } function twig_truncate_filter($text, $length = 100, $ending = "...", $exact = false, $html = true) { return truncate($text, $length, $ending, $exact, $html); } function twig_excerpt_filter($text, $length = 200, $ending = "...", $exact = false, $html = true) { $paragraphs = preg_split("/(\r?\n\r?\n|\r\r)/", $text); if (count($paragraphs) > 1) return $paragraphs[0]; else return truncate($text, $length, $ending, $exact, $html); } function twig_sort_filter($array) { asort($array); return $array; }