From f6ec8df813b28547ca3b04bb39f0ce670a6bb990 Mon Sep 17 00:00:00 2001
From: Adrian Lang <lang@cosmocode.de>
Date: Mon, 29 Mar 2010 12:00:30 +0200
Subject: [PATCH] Allow plugins to specify that they have to be instantiated

Plugins may return false in isSingleton to let plugin_load return a new
instance every time it is called.
Renderer plugins are not loaded with $new set to true, but instead specify
themself that they are not singletons. This behaviour allows the odt renderer
to keep working (see #1598).
---
 inc/parser/renderer.php        | 9 +++++++++
 inc/parserutils.php            | 2 +-
 inc/plugin.php                 | 6 +++---
 inc/plugincontroller.class.php | 2 +-
 lib/plugins/syntax.php         | 8 --------
 5 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php
index 393099003..4dac75d21 100644
--- a/inc/parser/renderer.php
+++ b/inc/parser/renderer.php
@@ -49,6 +49,15 @@ class Doku_Renderer extends DokuWiki_Plugin {
         trigger_error('getFormat() not implemented in '.get_class($this), E_USER_WARNING);
     }
 
+    /**
+     * Allow the plugin to prevent DokuWiki from reusing an instance
+     *
+     * @return bool   false if the plugin has to be instantiated
+     */
+    function isSingleton() {
+        return false;
+    }
+
 
     //handle plugin rendering
     function plugin($name,$data){
diff --git a/inc/parserutils.php b/inc/parserutils.php
index 4bec3ab1d..35ccdc1d6 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -585,7 +585,7 @@ function & p_get_renderer($mode) {
         // Maybe a plugin/component is available?
         list($plugin, $component) = $plugin_controller->_splitName($rname);
         if (!$plugin_controller->isdisabled($plugin)){
-            $Renderer =& $plugin_controller->load('renderer',$rname, true);
+            $Renderer =& $plugin_controller->load('renderer',$rname);
         }
 
         if(is_null($Renderer)){
diff --git a/inc/plugin.php b/inc/plugin.php
index 364534739..aff07c1e5 100644
--- a/inc/plugin.php
+++ b/inc/plugin.php
@@ -231,12 +231,12 @@ class DokuWiki_Plugin {
     }
 
     /**
-     * Allow the plugin to prevent DokuWiki creating a second instance of itself
+     * Allow the plugin to prevent DokuWiki from reusing an instance
      *
-     * @return bool   true if the plugin can not be instantiated more than once
+     * @return bool   false if the plugin has to be instantiated
      */
     function isSingleton() {
-        return false;
+        return true;
     }
 
     // deprecated functions
diff --git a/inc/plugincontroller.class.php b/inc/plugincontroller.class.php
index 043687270..61f460414 100644
--- a/inc/plugincontroller.class.php
+++ b/inc/plugincontroller.class.php
@@ -66,7 +66,7 @@ class Doku_Plugin_Controller {
 
         //plugin already loaded?
         if(!empty($DOKU_PLUGINS[$type][$name])){
-            if ($new  && !$DOKU_PLUGINS[$type][$name]->isSingleton()) {
+            if ($new || !$DOKU_PLUGINS[$type][$name]->isSingleton()) {
                 $class = $type.'_plugin_'.$name;
                 return class_exists($class) ? new $class : null;
             } else {
diff --git a/lib/plugins/syntax.php b/lib/plugins/syntax.php
index 601b5591e..f7b64d8c0 100644
--- a/lib/plugins/syntax.php
+++ b/lib/plugins/syntax.php
@@ -266,13 +266,5 @@ class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode {
     return $conf;
   }
 
-  /**
-   * Allow the plugin to prevent DokuWiki creating a second instance of itself
-   *
-   * @return bool   true if the plugin can not be instantiated more than once
-   */
-  function isSingleton() {
-    return false;
-  }
 }
 //Setup VIM: ex: et ts=4 enc=utf-8 :
-- 
GitLab