123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- <?php
- namespace Grav\Plugin\Admin;
- use Grav\Common\Grav;
- use Grav\Common\Language\Language;
- use Symfony\Component\Yaml\Yaml;
- use Symfony\Component\Yaml\Parser;
- class AdminTwigExtension extends \Twig_Extension
- {
- /**
- * @var Grav
- */
- protected $grav;
- /**
- * @var Language $lang
- */
- protected $lang;
- public function __construct()
- {
- $this->grav = Grav::instance();
- $this->lang = $this->grav['user']->language;
- }
- /**
- * Returns extension name.
- *
- * @return string
- */
- public function getName()
- {
- return 'AdminTwigExtension';
- }
- public function getFilters()
- {
- return [
- new \Twig_SimpleFilter('tu', [$this, 'tuFilter']),
- new \Twig_SimpleFilter('toYaml', [$this, 'toYamlFilter']),
- new \Twig_SimpleFilter('fromYaml', [$this, 'fromYamlFilter']),
- new \Twig_SimpleFilter('adminNicetime', [$this, 'adminNicetimeFilter']),
- ];
- }
- public function getFunctions()
- {
- return [
- new \Twig_SimpleFunction('getPageUrl', [$this, 'getPageUrl'], ['needs_context' => true]),
- new \Twig_SimpleFunction('clone', [$this, 'cloneFunc']),
- ];
- }
- public function cloneFunc($obj)
- {
- return clone $obj;
- }
- public function getPageUrl($context, $page)
- {
- $page_route = trim($page->rawRoute(), '/');
- $page_lang = $page->language();
- $base_url = $context['base_url'];
- $base_url_simple = $context['base_url_simple'];
- $admin_lang = Grav::instance()['session']->admin_lang ?: 'en';
- if ($page_lang && $page_lang != $admin_lang) {
- $page_url = $base_url_simple . '/' . $page_lang . '/' . $context['admin_route'] . '/pages/' . $page_route;
- } else {
- $page_url = $base_url . '/pages/' . $page_route;
- }
- return $page_url;
- }
- public function tuFilter()
- {
- $args = func_get_args();
- $numargs = count($args);
- $lang = null;
- if (($numargs == 3 && is_array($args[1])) || ($numargs == 2 && !is_array($args[1]))) {
- $lang = array_pop($args);
- } elseif ($numargs == 2 && is_array($args[1])) {
- $subs = array_pop($args);
- $args = array_merge($args, $subs);
- }
- return $this->grav['admin']->translate($args, $lang);
- }
- public function toYamlFilter($value, $inline = true)
- {
- return Yaml::dump($value, $inline);
- }
- public function fromYamlFilter($value)
- {
- $yaml = new Parser();
- return $yaml->parse($value);
- }
- public function adminNicetimeFilter($date, $long_strings = true)
- {
- if (empty($date)) {
- return $this->grav['admin']->translate('NICETIME.NO_DATE_PROVIDED', null, true);
- }
- if ($long_strings) {
- $periods = [
- "NICETIME.SECOND",
- "NICETIME.MINUTE",
- "NICETIME.HOUR",
- "NICETIME.DAY",
- "NICETIME.WEEK",
- "NICETIME.MONTH",
- "NICETIME.YEAR",
- "NICETIME.DECADE"
- ];
- } else {
- $periods = [
- "NICETIME.SEC",
- "NICETIME.MIN",
- "NICETIME.HR",
- "NICETIME.DAY",
- "NICETIME.WK",
- "NICETIME.MO",
- "NICETIME.YR",
- "NICETIME.DEC"
- ];
- }
- $lengths = ["60", "60", "24", "7", "4.35", "12", "10"];
- $now = time();
- // check if unix timestamp
- if ((string)(int)$date == $date) {
- $unix_date = $date;
- } else {
- $unix_date = strtotime($date);
- }
- // check validity of date
- if (empty($unix_date)) {
- return $this->grav['admin']->translate('NICETIME.BAD_DATE', null, true);
- }
- // is it future date or past date
- if ($now > $unix_date) {
- $difference = $now - $unix_date;
- $tense = $this->grav['admin']->translate('NICETIME.AGO', null, true);
- } else {
- $difference = $unix_date - $now;
- $tense = $this->grav['admin']->translate('NICETIME.FROM_NOW', null, true);
- }
- for ($j = 0; $difference >= $lengths[$j] && $j < count($lengths) - 1; $j++) {
- $difference /= $lengths[$j];
- }
- $difference = round($difference);
- if ($difference != 1) {
- $periods[$j] .= '_PLURAL';
- }
- if ($this->grav['language']->getTranslation($this->grav['user']->language,
- $periods[$j] . '_MORE_THAN_TWO')
- ) {
- if ($difference > 2) {
- $periods[$j] .= '_MORE_THAN_TWO';
- }
- }
- $periods[$j] = $this->grav['admin']->translate($periods[$j], null, true);
- return "$difference $periods[$j] {$tense}";
- }
- }
|