* * Syntax: ISO-date * * Renders as: * ... */ // must be run within Dokuwiki if (!defined('DOKU_INC')) die(); if (!defined('DOKU_LF')) define('DOKU_LF', "\n"); if (!defined('DOKU_TAB')) define('DOKU_TAB', "\t"); if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); require_once DOKU_PLUGIN.'syntax.php'; class syntax_plugin_since_since extends DokuWiki_Syntax_Plugin { public function getType() { // return 'FIXME: container|baseonly|formatting|substition|protected|disabled|paragraphs'; return 'protected'; } public function getPType() { // return 'FIXME: normal|block|stack'; return 'block'; } public function getSort() { return 195; } public function connectTo($mode) { $this->Lexer->addEntryPattern('.*?)',$mode,'plugin_since_since'); } public function postConnect() { $this->Lexer->addExitPattern('', 'plugin_since_since'); } public function handle($match, $state, $pos, &$handler){ switch ($state) { case DOKU_LEXER_ENTER: $this->syntax = substr($match, 1); return false; case DOKU_LEXER_UNMATCHED: // will include everything from // e.g. ... [attr] > [content] list($attr, $content) = preg_split('/>/u',$match,2); $content = explode(',',$content); // $attr reserved for future use return array($this->syntax, trim($attr), $content); } return false; } public function render($mode, &$renderer, $data) { if($mode != 'xhtml') return false; $now = new DateTime(); // if (count($data) == 1) { list($syntax, $attr, $content) = $data; if ($syntax != 'since') return false; $SinceDate = ''; foreach($content as $date) { $d = date_create( trim($date) ); if( $d === FALSE ) { $SinceDate .= "<bad date '$date'>"; break; } $interval = $d->diff($now); $s = $interval->format('%R'); $s1 = ($s == '-') ? 'in ' : ''; $s2 = ($s == '-') ? '' : ' ago'; $SinceDate .= trim($date).' '.'' .$s1.$interval->format('%yy %mm %dd').$s2 .''; } $renderer->doc .= $SinceDate; return true; // } //return false; } } // vim:ts=4:sw=4:et: