*/ // 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'; require_once(DOKU_INC.'inc/FeedParser.php'); class FFindrParser extends FeedParser { function FFindrParser() { parent::__construct(); $this->set_item_class($class = 'FFindrParser_Item'); } static function sort_items($a, $b) { return strcmp($a->get_tag('dateStart'), $b->get_tag('dateStart')); } } class FFindrParser_Item extends SimplePie_Item { function get_tag($name) { $tag = $this->get_item_tags("", $name); return $this->sanitize($tag[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } } class syntax_plugin_ffindr_ffindr extends DokuWiki_Syntax_Plugin { function getType() { return 'substition'; } function getPType() { return 'block'; } function getSort() { return 310; } function connectTo($mode) { $this->Lexer->addSpecialPattern('{{ffindr>.*?}}',$mode,'plugin_ffindr_ffindr'); } function handle($match, $dummy_state, $dummy_pos, &$dummy_handler){ $data = array(); $match = substr($match, 9, -2); list($url, $dummy_header) = explode('|', $match, 2); list($url, $params) = explode(' ', $url, 2); foreach (explode(' ', $params) as $param) { list($key, $value) = explode('=', $param, 2); if ($value) $data[$key] = $value; else $format[] = $key; } $format = array_filter((array)$format); return $data + array( 'url' => $url, 'max' => 100, 'format' => $format ? $format : explode(' ', "date title location"), ); } function render($mode, &$renderer, $data) { if($mode != 'xhtml') return false; if ($data['url']) { $feed = new FFindrParser(); $feed->set_feed_url($data['url']); // disable warning while fetching if (!defined('DOKU_E_LEVEL')) $elvl = error_reporting(E_ERROR); $rc = $feed->init(); if (!defined('DOKU_E_LEVEL')) error_reporting($elvl); // decide on start and end $max = max(1, intval($data['max'] - 1)); if ($data['sort'] == "reverse") { $start = $feed->get_item_quantity() - 1; $end = max(0, $start - $max); $step = -1; } else { $start = 0; $end = min($max, $feed->get_item_quantity() - 1); $step = 1; } if($rc) { $dateformat = "%d.%m."; $renderer->doc .= ''; foreach (range($start, $end, $step) as $i) { $item = $feed->get_item($i); $renderer->doc .= ''; foreach ($data['format'] as $cell) { $renderer->doc .= ""; } $renderer->doc .= "\n"; } $renderer->doc .= "
"; switch (trim($cell)) { case 'date': { $renderer->doc .= strftime($dateformat, strtotime($item->get_tag('dateStart'))) . " - " . strftime($dateformat, strtotime($item->get_tag('dateEnd'))); break; } case 'title': { // support feeds without links if ($linkurl = $item->get_permalink()) { // title is escaped by SimplePie, we unescape here because it // is escaped again in externallink() FS#1705 $renderer->externallink($linkurl, htmlspecialchars_decode($item->get_title())); } else $renderer->doc .= $item->get_title(); break; } case 'author': { if ($author = $item->get_author(0)) { $name = $author->get_name(); if(!$name) $name = $author->get_email(); if($name) $renderer->doc .= $lang['by'].' '.$name ; } break; } case 'location': { $renderer->doc .= 'get_longitude() . '">' . $item->get_tag('location') . ""; break; } } $renderer->doc .= "
"; } else { $renderer->doc .= ''; } } else $renderer->doc .= '
No FFindr URL specified
'; return true; } } // vim:ts=4:sw=4:et: