summaryrefslogtreecommitdiffstats
path: root/lib/twig.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/twig.php')
-rw-r--r--lib/twig.php129
1 files changed, 129 insertions, 0 deletions
diff --git a/lib/twig.php b/lib/twig.php
new file mode 100644
index 0000000..db1354d
--- /dev/null
+++ b/lib/twig.php
@@ -0,0 +1,129 @@
+<?php
+
+require_once('Twig/Autoloader.php');
+Twig_Autoloader::register();
+
+class Twig_Loader_Dokuwiki implements Twig_LoaderInterface, Twig_ExistsLoaderInterface
+{
+ private function build_pagename($name) {
+ return 'hostinfo:templates:' . cleanID($name);
+ }
+
+ public function getSource($name)
+ {
+ $page = $this->build_pagename($name);
+ return rawWiki($page);
+ }
+
+ public function getCacheKey($name)
+ {
+ return $this->build_pagename($name);
+ }
+
+ public function isFresh($name, $time)
+ {
+ $page = $this->build_pagename($name);
+ $last_change = p_get_metadata($page, 'last_change date');
+ return $last_change < $time;
+ }
+
+ public function exists($name)
+ {
+ $page = $this->build_pagename($name);
+ return page_exists($page);
+ }
+}
+
+class Hostinfo_Twig_Extension extends Twig_Extension
+{
+ public function getFilters()
+ {
+ return array(
+ new Twig_SimpleFilter('contact_info', function($value) {
+ if (is_array($value)) {
+ return '[[' . current($value) . '|' . key($value) . ']]';
+ }
+
+ return '[[' . $value . '@spline.inf.fu-berlin.de' . '|' . $value . ']]';
+ }),
+
+ new Twig_SimpleFilter('parse_service', function($value) {
+ if (is_array($value)) {
+ return array(
+ 'port' => current($value),
+ 'name' => key($value),
+ );
+ }
+
+ return array(
+ 'name' => $value,
+ 'port' => $null,
+ );
+ }),
+
+ new Twig_SimpleFilter('group_by', function($value, $key) {
+ $array = array();
+
+ foreach ($value as $k => $v) {
+ if (array_key_exists($key, $v)) {
+ if (is_array($v[$key])) {
+ foreach ($v[$key] as $key_part) {
+ $array[$key_part][$k] = $v;
+ }
+ }
+ else {
+ $array[$v[$key]][$k] = $v;
+ }
+ }
+ }
+
+ return $array;
+ }),
+
+ new Twig_SimpleFilter('key_not_exists', function($value, $key) {
+ if (!is_array($value)) {
+ return array();
+ }
+
+ return array_filter($value,
+ function($v) use ($key) {
+ return !array_key_exists($key, $v);
+ });
+ }),
+
+ new Twig_SimpleFilter('count', function($value) {
+ return count($value);
+ }),
+
+ new Twig_SimpleFilter('length', function($value) {
+ return strlen($value);
+ }),
+ );
+ }
+
+ public function getName()
+ {
+ return 'hostinfo';
+ }
+}
+
+class Twig
+{
+ function __construct()
+ {
+ $loader = new Twig_Loader_Dokuwiki();
+ $this->twig = new Twig_Environment($loader, array(
+ 'cache' => __DIR__ . '/../templates_c/',
+ 'auto_reload' => true,
+ ));
+ $this->twig->addExtension(new Hostinfo_Twig_Extension());
+ }
+
+ public function render($template, $vars=null)
+ {
+ $tmpl = $this->twig->loadTemplate($template . '.tpl');
+ return $tmpl->render($vars);
+ }
+}
+
+// vim: set ts=4 sw=4 tw=0 et :