====== regex template plugin ======
---- plugin ----
description: Choose template from regex on $ID
author : Cédric Villemain
email : cedric.villemain@dalibo.com
type : action
lastupdate : 2009-10-14
compatible : 2009-02-14b
depends :
conflicts :
similar :
tags : editing, template
downloadurl: http://dalibo.org/_media/regex_template.tgz
----
This plugin works similar to [[:namespace templates]] but the template to use is chosen based on a configuration matching regular expressions against the page name.
===== Download and Installation =====
Download and install the plugin using the [[plugin:plugin|Plugin Manager]] using the following URL. Refer to [[:Plugins]] on how to install plugins manually.
* [[http://dalibo.org/_media/regex_template.tgz]]
For Angua, use the following action.php and rename the plugin directory to regextemplate(no underscore):
*/
if(!defined('DOKU_INC')) die();
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'action.php');
class action_plugin_regextemplate extends DokuWiki_Action_Plugin {
/**
* return some info
*/
function getInfo(){
return confToHash(dirname(__FILE__).'/info.txt');
}
/**
* register the eventhandlers
*/
function register(&$contr){
$contr->register_hook('COMMON_PAGETPL_LOAD', 'BEFORE', $this, 'regextemplate', array());
}
function regextemplate(&$event, $param) {
global $conf;
$array_regex = (array)explode("\n",$conf['plugin']['regextemplate']['reg_tpl_regex']);
reset($array_regex);
foreach ($array_regex as $regex) {
list($pattern, $replacement) = explode(',', $regex);
$my_new_ID = @preg_replace($pattern, $replacement, $event->data['id']);
$my_new_file = wikiFN($my_new_ID);
if(@file_exists($my_new_file)){
$tpl = io_readFile($my_new_file);
break;
}
}
if($tpl) $event->data['tpl'] = $tpl;
if(!$tpl) return '';
// replace placeholders
$tpl = str_replace('@ID@',$ID,$tpl);
$tpl = str_replace('@NS@',getNS($ID),$tpl);
$tpl = str_replace('@PAGE@',strtr(noNS($ID),'_',' '),$tpl);
$tpl = str_replace('@USER@',$_SERVER['REMOTE_USER'],$tpl);
$tpl = str_replace('@NAME@',$INFO['userinfo']['name'],$tpl);
$tpl = str_replace('@MAIL@',$INFO['userinfo']['mail'],$tpl);
$tpl = str_replace('@DATE@',$conf['dformat'],$tpl);
// we need the callback to work around strftime's char limit
$tpl = preg_replace_callback('/%./',create_function('$m','return strftime($m[0]);'),$tpl);
$event->result=$tpl;
$event->preventDefault();
}
}
==== Adjust setting ====
There is one configuration option to add regex, they must be added one per line, take care of spaces, in the following format:
pattern,replacement
pattern and replacement MUST follow the [[http://php.net/manual/en/function.preg-replace.php|preg_replace rules]].
=== Example ===
/.*:info:start/,templates:info_start
/.*:info:.*:issue/,templates:info_issue
You here just have to edit the //templates/info_start// and //templates/info_issue// to make them templates (no worry of _template.txt and __template.txt they are used if the regex does not match **or** if the templates in the regex does not exists.
===== Discussion =====
NS replace does not work, $id needs to be replaced by $ID (line 65 in action.php)
// replace placeholders
$tpl = str_replace('@ID@',$ID,$tpl);
$tpl = str_replace('@NS@',getNS($ID),$tpl);
Otherwise great plugin. Jörg
The plugin does not work with //rc2010-10-27 "Busy Wednesday"//, for me this works:
/**
* register the eventhandlers
*/
function register(&$contr){
$contr->register_hook('COMMON_PAGE_FROMTEMPLATE', 'BEFORE', $this, 'regex_template', array());
}
function regex_template(&$event, $param) {
global $conf;
$array_regex = (array)explode("\n",$conf['plugin']['regex_template']['reg_tpl_regex']);
reset($array_regex);
foreach ($array_regex as $regex) {
list($pattern, $replacement) = explode(',', $regex);
$my_new_ID = @preg_replace($pattern, $replacement, $event->data['id']);
$my_new_file = wikiFN($my_new_ID);
if(@file_exists($my_new_file)){
$tpl = io_readFile($my_new_file);
break;
}
}
if($tpl) $event->data['tpl'] = $tpl;
}
}
(from lahondes at sibio.fr) This work with latest version using the code just above and modifying the hook (which was changed in 2011-02-03), using COMMON_PAGETPL_LOAD instead of COMMON_PAGE_FROMTEMPLATE. This give the following version of action.php:
/**
* register the eventhandlers
*/
function register(&$contr){
$contr->register_hook('COMMON_PAGETPL_LOAD', 'BEFORE', $this, 'regex_template', array());
}
function regex_template(&$event, $param) {
global $conf;
$array_regex = (array)explode("\n",$conf['plugin']['regex_template']['reg_tpl_regex']);
reset($array_regex);
foreach ($array_regex as $regex) {
list($pattern, $replacement) = explode(',', $regex);
$my_new_ID = @preg_replace($pattern, $replacement, $event->data['id']);
$my_new_file = wikiFN($my_new_ID);
if(@file_exists($my_new_file)){
$tpl = io_readFile($my_new_file);
break;
}
}
if($tpl) $event->data['tpl'] = $tpl;
}
}