From d968d3e5210d971ea439f2f29c47af438c1106c8 Mon Sep 17 00:00:00 2001
From: Chris Smith <chris.eureka@jalakai.co.uk>
Date: Wed, 12 Mar 2008 01:56:47 +0100
Subject: [PATCH] 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
---
 conf/dokuwiki.php       |  1 +
 inc/parser/renderer.php |  4 ++++
 inc/parserutils.php     | 51 ++++++++++++++++++++++++++---------------
 3 files changed, 37 insertions(+), 19 deletions(-)

diff --git a/conf/dokuwiki.php b/conf/dokuwiki.php
index 9cfdb5c3b..6475ff291 100644
--- a/conf/dokuwiki.php
+++ b/conf/dokuwiki.php
@@ -119,6 +119,7 @@ $conf['rss_show_summary'] = 1;           //Add revision summary to title? 0|1
 $conf['broken_iua']  = 0;                //Platform with broken ignore_user_abort (IIS+CGI) 0|1
 $conf['xsendfile']   = 0;                //Use X-Sendfile (1 = lighttpd, 2 = standard)
 $conf['xmlrpc'] = 0;                     //Enable/disable XML-RPC interface
+$conf['renderer_xhtml'] = 'xhtml';       //renderer to use for main page generation
 
 //Set target to use when creating links - leave empty for same window
 $conf['target']['wiki']      = '';
diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php
index aa4da9dc1..92bbf51fb 100644
--- a/inc/parser/renderer.php
+++ b/inc/parser/renderer.php
@@ -29,6 +29,10 @@ class Doku_Renderer extends DokuWiki_Plugin {
     var $entities = array();
     var $interwiki = array();
 
+    // allows renderer to be used again, clean out any per-use values
+    function reset() {
+    }
+
     function nocache() {
         $this->info['cache'] = false;
     }
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
  *
-- 
GitLab