summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_test/tests/inc/parserutils_get_renderer.test.php83
-rw-r--r--inc/load.php6
-rw-r--r--inc/parser/code.php1
-rw-r--r--inc/parser/metadata.php2
-rw-r--r--inc/parser/renderer.php2
-rw-r--r--inc/parser/xhtml.php3
-rw-r--r--inc/parser/xhtmlsummary.php1
-rw-r--r--inc/parserutils.php54
8 files changed, 121 insertions, 31 deletions
diff --git a/_test/tests/inc/parserutils_get_renderer.test.php b/_test/tests/inc/parserutils_get_renderer.test.php
new file mode 100644
index 000000000..69aeb3b19
--- /dev/null
+++ b/_test/tests/inc/parserutils_get_renderer.test.php
@@ -0,0 +1,83 @@
+<?php
+
+class parserutils_get_renderer_test extends DokuWikiTest {
+
+ private $plugin_controller;
+
+ // test default behaviour / usual settings
+ function test_p_get_renderer_normal() {
+ global $conf;
+
+ $old_conf = $conf;
+ $conf['renderer_xhtml'] = 'xhtml';
+
+ $this->assertInstanceOf('Doku_Renderer_xhtml', p_get_renderer('xhtml'));
+
+ $conf = $old_conf;
+ }
+
+ // test get a renderer plugin
+ function test_p_get_renderer_plugin() {
+ global $conf;
+ global $plugin_controller;
+
+ $old_conf = $conf;
+ $conf['renderer_xhtml'] = 'get_renderer_test';
+ $this->plugin_controller = $plugin_controller;
+ $plugin_controller = $this;
+
+ $this->assertInstanceOf('renderer_plugin_test', p_get_renderer('xhtml'));
+
+ $conf = $old_conf;
+ $plugin_controller = $this->plugin_controller;
+ }
+
+ // test fallback succeeds
+ function test_p_get_renderer_fallback() {
+ global $conf;
+
+ $old_conf = $conf;
+ $conf['renderer_xhtml'] = 'badvalue';
+
+ $this->assertInstanceOf('Doku_Renderer_xhtml', p_get_renderer('xhtml'));
+
+ $conf = $old_conf;
+ }
+
+ // test fallback fails
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ * @expectedExceptionCode E_USER_WARNING
+ */
+ function test_p_get_renderer_fallback_fail() {
+ global $conf;
+
+ $old_conf = $conf;
+ $conf['renderer_junk'] = 'badvalue';
+
+ $this->assertNull(p_get_renderer('junk'));
+
+ $conf = $old_conf;
+ }
+
+ // wrapper function for the fake plugin controller, return $this for the fake syntax of this test
+ function load($type,$name,$new=false,$disabled=false){
+ if ($name == 'get_renderer_test') {
+ return new renderer_plugin_test();
+ } else {
+ return $this->plugin_controller->load($type, $name, $new, $disabled);
+ }
+ }
+ }
+
+require_once DOKU_INC . 'inc/parser/xhtml.php';
+
+class renderer_plugin_test extends Doku_Renderer_xhtml {
+
+ function canRender($format) {
+ return ($format=='xhtml');
+ }
+
+}
+
+// vim:ts=4:sw=4:et:
diff --git a/inc/load.php b/inc/load.php
index 497dd6921..f1deffe19 100644
--- a/inc/load.php
+++ b/inc/load.php
@@ -96,6 +96,12 @@ function load_autoload($name){
'DokuWiki_Remote_Plugin' => DOKU_PLUGIN.'remote.php',
'DokuWiki_Auth_Plugin' => DOKU_PLUGIN.'auth.php',
+ 'Doku_Renderer' => DOKU_INC.'inc/parser/renderer.php',
+ 'Doku_Renderer_xhtml' => DOKU_INC.'inc/parser/xhtml.php',
+ 'Doku_Renderer_code' => DOKU_INC.'inc/parser/code.php',
+ 'Doku_Renderer_xhtmlsummary' => DOKU_INC.'inc/parser/xhtmlsummary.php',
+ 'Doku_Renderer_metadata' => DOKU_INC.'inc/parser/metadata.php',
+
);
if(isset($classes[$name])){
diff --git a/inc/parser/code.php b/inc/parser/code.php
index 0b8e3ee02..d77ffd1aa 100644
--- a/inc/parser/code.php
+++ b/inc/parser/code.php
@@ -5,7 +5,6 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
if(!defined('DOKU_INC')) die('meh.');
-require_once DOKU_INC . 'inc/parser/renderer.php';
class Doku_Renderer_code extends Doku_Renderer {
var $_codeblock=0;
diff --git a/inc/parser/metadata.php b/inc/parser/metadata.php
index 8ba159d62..73bae190f 100644
--- a/inc/parser/metadata.php
+++ b/inc/parser/metadata.php
@@ -16,8 +16,6 @@ if ( !defined('DOKU_TAB') ) {
define ('DOKU_TAB',"\t");
}
-require_once DOKU_INC . 'inc/parser/renderer.php';
-
/**
* The Renderer
*/
diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php
index e3401fd48..1f9ad00a2 100644
--- a/inc/parser/renderer.php
+++ b/inc/parser/renderer.php
@@ -6,8 +6,6 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
if(!defined('DOKU_INC')) die('meh.');
-require_once DOKU_INC . 'inc/plugin.php';
-require_once DOKU_INC . 'inc/pluginutils.php';
/**
* An empty renderer, produces no output
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index 315b4d640..184e62fe3 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -17,9 +17,6 @@ if ( !defined('DOKU_TAB') ) {
define ('DOKU_TAB',"\t");
}
-require_once DOKU_INC . 'inc/parser/renderer.php';
-require_once DOKU_INC . 'inc/html.php';
-
/**
* The Renderer
*/
diff --git a/inc/parser/xhtmlsummary.php b/inc/parser/xhtmlsummary.php
index 95f86cbef..867b71f6a 100644
--- a/inc/parser/xhtmlsummary.php
+++ b/inc/parser/xhtmlsummary.php
@@ -1,6 +1,5 @@
<?php
if(!defined('DOKU_INC')) die('meh.');
-require_once DOKU_INC . 'inc/parser/xhtml.php';
/**
* The summary XHTML form selects either up to the first two paragraphs
diff --git a/inc/parserutils.php b/inc/parserutils.php
index 4df273f11..b41e2d473 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -430,8 +430,9 @@ function p_render_metadata($id, $orig){
global $ID, $METADATA_RENDERERS;
// avoid recursive rendering processes for the same id
- if (isset($METADATA_RENDERERS[$id]))
+ if (isset($METADATA_RENDERERS[$id])) {
return $orig;
+ }
// store the original metadata in the global $METADATA_RENDERERS so p_set_metadata can use it
$METADATA_RENDERERS[$id] =& $orig;
@@ -444,8 +445,6 @@ function p_render_metadata($id, $orig){
$evt = new Doku_Event('PARSER_METADATA_RENDER', $orig);
if ($evt->advise_before()) {
- require_once DOKU_INC."inc/parser/metadata.php";
-
// get instructions
$instructions = p_cached_instructions(wikiFN($id),false,$id);
if(is_null($instructions)){
@@ -588,7 +587,7 @@ function p_sort_modes($a, $b){
function p_render($mode,$instructions,&$info){
if(is_null($instructions)) return '';
- $Renderer =& p_get_renderer($mode);
+ $Renderer = p_get_renderer($mode);
if (is_null($Renderer)) return null;
$Renderer->reset();
@@ -616,43 +615,54 @@ function p_render($mode,$instructions,&$info){
}
/**
+ * Figure out the correct renderer class to use for $mode,
+ * instantiate and return it
+ *
* @param $mode string Mode of the renderer to get
* @return null|Doku_Renderer The renderer
+ *
+ * @author Christopher Smith <chris@jalakai.co.uk>
*/
-function & p_get_renderer($mode) {
+function p_get_renderer($mode) {
/** @var Doku_Plugin_Controller $plugin_controller */
global $conf, $plugin_controller;
$rname = !empty($conf['renderer_'.$mode]) ? $conf['renderer_'.$mode] : $mode;
$rclass = "Doku_Renderer_$rname";
+ // if requested earlier or a bundled renderer
if( class_exists($rclass) ) {
$Renderer = new $rclass();
return $Renderer;
}
- // try default renderer first:
- $file = DOKU_INC."inc/parser/$rname.php";
- if(@file_exists($file)){
- require_once $file;
+ // not bundled, see if its an enabled plugin for rendering $mode
+ $Renderer = $plugin_controller->load('renderer',$rname);
+ if (is_a($Renderer, 'Doku_Renderer') && ($mode == $Renderer->getFormat())) {
+ return $Renderer;
+ }
- 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;
+ // there is a configuration error!
+ // not bundled, not a valid enabled plugin, use $mode to try to fallback to a bundled renderer
+ $rclass = "Doku_Renderer_$mode";
+ if ( class_exists($rclass) ) {
+ // viewers should see renderered output, so restrict the warning to admins only
+ $msg = "No renderer '$rname' found for mode '$mode', check your plugins";
+ if ($mode == 'xhtml') {
+ $msg .= " and the 'renderer_xhtml' config setting";
}
- $Renderer = new $rclass();
- }else{
- // Maybe a plugin/component is available?
- $Renderer = $plugin_controller->load('renderer',$rname);
+ $msg .= ".<br/>Attempting to fallback to the bundled renderer.";
+ msg($msg,-1,'','',MSG_ADMINS_ONLY);
- if(!isset($Renderer) || is_null($Renderer)){
- msg("No renderer '$rname' found for mode '$mode'",-1);
- return null;
- }
+ $Renderer = new $rclass;
+ $Renderer->nocache(); // fallback only (and may include admin alerts), don't cache
+ return $Renderer;
}
- return $Renderer;
+ // fallback failed, alert the world
+ trigger_error("Unable to resolve render class $rclass",E_USER_WARNING);
+ msg("No renderer '$rname' found for mode '$mode'",-1);
+ return null;
}
/**