syntax commands
*/
class syntax_plugin_blogtng_blog extends DokuWiki_Syntax_Plugin {
/**
* Default configuration for all setups
*/
var $config = [
'sortorder' => 'DESC',
'sortby' => 'created',
'tpl' => 'default',
'limit' => 5,
'offset' => 0,
'blog' => null,
'tags' => [],
'page' => false,
'cache' => false,
'title' => '',
'format' => ':blog:%Y:%m:%{title}',
'listwrap' => 0, //default depends on syntax type
];
/** @var helper_plugin_blogtng_entry */
var $entryhelper = null;
/** @var helper_plugin_blogtng_tools */
var $tools = null;
/** @var helper_plugin_blogtng_comments */
var $commenthelper = null;
/** @var helper_plugin_blogtng_tags */
var $taghelper;
/**
* Types we accept in our syntax
*/
var $type_whitelist = ['list', 'pagination', 'related', 'recentcomments', 'newform', 'tagcloud', 'tagsearch'];
/**
* Values accepted in syntax
*/
var $data_whitelist = [
'sortyorder' => ['asc', 'desc'],
'sortby' => ['created', 'lastmod', 'title', 'page', 'random'],
];
// default plugin functions...
/**
* Syntax Type
*
* @return string
*/
function getType() { return 'substition'; }
/**
* Paragraph Type
*
* @return string
*/
function getPType() { return 'block'; }
/**
* Sort for applying this mode
*
* @return int
*/
function getSort() { return 300; }
/**
* Register the syntax
*
* @param string $mode
*/
function connectTo($mode) {
$this->Lexer->addSpecialPattern(']*>.*?', $mode, 'plugin_blogtng_blog');
}
/**
* Parse the type and configuration data from the syntax
*
* @param string $match The text matched by the patterns
* @param int $state The lexer state for the match
* @param int $pos The character position of the matched text
* @param Doku_Handler $handler The Doku_Handler object
* @return bool|array Return an array with all data you want to use in render, false don't add an instruction
*/
public function handle($match, $state, $pos, Doku_Handler $handler) {
$match = substr(trim($match), 5, -7); // strip ''
list($type,$conf) = explode('>',$match,2);
$type = trim($type);
$conf = trim($conf);
$conf = linesToHash(explode("\n", $conf));
if(!$type) $type = 'list';
// check type
if(!in_array($type,$this->type_whitelist)){
msg('Unknown blog syntax type "'.hsc($type).'" using "list" instead',-1);
$type = 'list';
}
// handle multi keys
$conf['blog'] = array_filter(array_map('trim', explode(',', $conf['blog'])));
$conf['tags'] = array_filter(array_map('trim', explode(',', $conf['tags'])));
$conf['type'] = array_filter(array_map('trim', explode(',', $conf['type'])));
if (($type != 'tagsearch') && (!count($conf['blog']))) {
$conf['blog'] = array('default');
}
// higher default limit for tag cloud
if($type == 'tagcloud' && !$conf['limit']) {
$conf['limit'] = 25;
}
// default to listwrap for recent comments
if(($type == 'recentcomments' || $type == 'tagsearch') && !isset($conf['listwrap'])){
$conf['listwrap'] = 1;
}
// reversed listwrap syntax
if($conf['nolistwrap']) {
$conf['listwrap'] = 0;
unset($conf['nolistwrap']);
}
// reversed nolist to listwrap syntax (backward compatibility)
if($conf['nolist']) {
$conf['listwrap'] = 0;
unset($conf['nolist']);
}
// merge with default config
$conf = array_merge($this->config, $conf);
return array('type'=>$type, 'conf'=>$conf);
}
/**
* Handles the actual output creation.
*
* @param string $format output format being rendered
* @param Doku_Renderer $renderer the current renderer object
* @param array $data data created by handler()
* @return boolean rendered correctly? (however, returned value is not used at the moment)
*/
public function render($format, Doku_Renderer $renderer, $data) {
global $INPUT;
if($format != 'xhtml') return false;
$this->loadHelpers();
// set target if not set yet
global $ID;
if(!isset($data['conf']['target'])) $data['conf']['target'] = $ID;
// add additional data from request parameters
if($start = $INPUT->int('pagination-start')){ // start offset
$data['conf']['offset'] = (int) $start;
}
if($tags = $INPUT->str('post-tags')){ // tags
$data['conf']['tags'] = array_merge(
$data['conf']['tags'],
explode(',',$tags));
}
$data['conf']['tags'] = array_map('trim',$data['conf']['tags']);
$data['conf']['tags'] = array_unique($data['conf']['tags']);
$data['conf']['tags'] = array_filter($data['conf']['tags']);
// dispatch to the correct type handler
$renderer->info['cache'] = (bool)$data['conf']['cache'];
switch($data['type']){
case 'related':
$renderer->doc .= $this->entryhelper->xhtml_related($data['conf']);
break;
case 'pagination':
$renderer->doc .= $this->entryhelper->xhtml_pagination($data['conf']);
break;
case 'newform':
$renderer->info['cache'] = false; //never cache this
$renderer->doc .= $this->entryhelper->xhtml_newform($data['conf']);
break;
case 'recentcomments':
// FIXME to cache or not to cache?
$renderer->doc .= $this->commenthelper->xhtml_recentcomments($data['conf']);
break;
case 'tagcloud':
$renderer->info['cache'] = false; // never cache this
$renderer->doc .= $this->taghelper->xhtml_tagcloud($data['conf']);
break;
case 'tagsearch':
$renderer->doc .= $this->entryhelper->xhtml_tagsearch($data['conf'], $renderer);
break;
default:
$renderer->doc .= $this->entryhelper->xhtml_list($data['conf'], $renderer);
}
return true;
}
/**
* Parse options given in the syntax
*
* @param $opt
*/
function _parse_opt($opt) {
switch(true) {
case (in_array($opt, $this->data_whitelist['sortorder'])):
$this->config['sortorder'] = strtoupper($opt);
break;
case (in_array($opt, $this->data_whitelist['sortby'])):
$this->config['sortby'] = substr($opt, 2);
break;
case (preg_match('/^\d$/', $opt)):
$this->config['limit'] = $opt;
break;
case (preg_match('/^\+(\d+)$/', $opt, $match)):
$this->config['order'] = $match[1];
break;
case (preg_match('/^tpl(\w+)$/', $opt, $match)):
$this->config['tpl'] = $match[1];
break;
default;
break;
}
}
/**
* Load required helper plugins.
*/
private function loadHelpers() {
$this->entryhelper = plugin_load('helper', 'blogtng_entry');
$this->tools = plugin_load('helper', 'blogtng_tools');
$this->commenthelper = plugin_load('helper', 'blogtng_comments');
$this->taghelper = plugin_load('helper', 'blogtng_tags');
}
}