From d968d3e5210d971ea439f2f29c47af438c1106c8 Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Wed, 12 Mar 2008 01:56:47 +0100 Subject: Add support for plugin renderers to replace standard renderers This patch is the fourth in a series aimed at making it easier for DW to allow plugins to modify the standard handling of line-breaks. It adds: - new config setting 'renderer_xhtml', default value 'xhtml' - new renderer method 'reset()' which is used by reusable renderers when used to render second and subsequent data. (*) An extra step has been added to the renderer selection process. - check $conf["renderer_$mode] for renderer name. If it doesn't exist use $mode as the renderer name. (*) It maybe that the 'document_start()' method can be used for this. However the current xhtml does not correctly reset itself for reuse. darcs-hash:20080312005647-f07c6-ff2cb960c05927f5c6f3e916a364fcad470c2ce3.gz --- inc/parserutils.php | 51 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 19 deletions(-) (limited to 'inc/parserutils.php') diff --git a/inc/parserutils.php b/inc/parserutils.php index c65185239..d03ad8d1e 100644 --- a/inc/parserutils.php +++ b/inc/parserutils.php @@ -530,26 +530,10 @@ function p_sort_modes($a, $b){ function p_render($mode,$instructions,&$info){ if(is_null($instructions)) return ''; - // try default renderer first: - $file = DOKU_INC."inc/parser/$mode.php"; - if(@file_exists($file)){ - require_once $file; - $rclass = "Doku_Renderer_$mode"; + $Renderer =& p_get_renderer($mode); + if (is_null($Renderer)) return null; - if ( !class_exists($rclass) ) { - trigger_error("Unable to resolve render class $rclass",E_USER_WARNING); - msg("Renderer for $mode not valid",-1); - return null; - } - $Renderer = & new $rclass(); - }else{ - // Maybe a plugin is available? - $Renderer =& plugin_load('renderer',$mode); - if(is_null($Renderer)){ - msg("No renderer for $mode found",-1); - return null; - } - } + $Renderer->reset(); $Renderer->smileys = getSmileys(); $Renderer->entities = getEntities(); @@ -572,6 +556,35 @@ function p_render($mode,$instructions,&$info){ return $Renderer->doc; } +function & p_get_renderer($mode) { + global $conf; + + $rname = !empty($conf['renderer_'.$mode]) ? $conf['renderer_'.$mode] : $mode; + + // try default renderer first: + $file = DOKU_INC."inc/parser/$rname.php"; + if(@file_exists($file)){ + require_once $file; + $rclass = "Doku_Renderer_$rname"; + + if ( !class_exists($rclass) ) { + trigger_error("Unable to resolve render class $rclass",E_USER_WARNING); + msg("Renderer '$rname' for $mode not valid",-1); + return null; + } + $Renderer = & new $rclass(); + }else{ + // Maybe a plugin is available? + $Renderer =& plugin_load('renderer',$rname); + if(is_null($Renderer)){ + msg("No renderer '$rname' found for mode '$mode'",-1); + return null; + } + } + + return $Renderer; +} + /** * Gets the first heading from a file * -- cgit v1.2.3