From af146da051337e3c5821b6e482d5121816294c67 Mon Sep 17 00:00:00 2001
From: andi <andi@splitbrain.org>
Date: Sun, 26 Jun 2005 13:15:13 +0200
Subject: [PATCH] paragraphtypes for syntax plugins

darcs-hash:20050626111513-9977f-5b317b14c9544a0c0a637d21816542d394e6606f.gz
---
 inc/parser/handler.php | 33 ++++++++++++++++++++++++++++++---
 lib/plugins/syntax.php | 18 ++++++++++++++++++
 2 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/inc/parser/handler.php b/inc/parser/handler.php
index d2d201282..6b0d99cf4 100644
--- a/inc/parser/handler.php
+++ b/inc/parser/handler.php
@@ -1195,7 +1195,7 @@ class Doku_Handler_Block {
     var $atStart = TRUE;
     var $skipEolKey = -1;
     
-    // Blocks don't contain linefeeds
+    // Blocks these should not be inside paragraphs
     var $blockOpen = array(
             'header',
             'listu_open','listo_open','listitem_open',
@@ -1214,7 +1214,7 @@ class Doku_Handler_Block {
             'code','file','php','html','hr','preformatted',
         );
     
-    // Stacks can contain linefeeds
+    // Stacks can contain paragraphs
     var $stackOpen = array(
         'footnote_open','section_open',
         );
@@ -1222,7 +1222,34 @@ class Doku_Handler_Block {
     var $stackClose = array(
         'footnote_close','section_close',
         );
-   
+  
+
+    /**
+     * Constructor. Adds loaded syntax plugins to the block and stack
+     * arrays
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function Doku_Handler_Block(){
+        global $DOKU_PLUGINS;
+        //check if syntax plugins were loaded
+        if(!is_array($DOKU_PLUGINS['syntax'])) return;
+        foreach($DOKU_PLUGINS['syntax'] as $n => $p){
+            $ptype = $p->getPType();
+            if($ptype == 'block'){
+                $this->blockOpen[]  = 'plugin_'.$n;
+                $this->blockOpen[]  = 'plugin_'.$n.'_open';
+                $this->blockClose[] = 'plugin_'.$n;
+                $this->blockClose[] = 'plugin_'.$n.'_close';
+            }elseif($ptype == 'stack'){
+                $this->stackOpen[]  = 'plugin_'.$n;
+                $this->stackOpen[]  = 'plugin_'.$n.'_open';
+                $this->stackClose[] = 'plugin_'.$n;
+                $this->stackClose[] = 'plugin_'.$n.'_close';
+            }
+        }
+    }
+ 
     /**
      * Close a paragraph if needed
      *
diff --git a/lib/plugins/syntax.php b/lib/plugins/syntax.php
index 303c0de33..2a67a5ca5 100644
--- a/lib/plugins/syntax.php
+++ b/lib/plugins/syntax.php
@@ -17,12 +17,30 @@ require_once(DOKU_INC.'inc/parser/parser.php');
 class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode {
 
     /**
+     * Syntax Type
+     *
      * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
      */
     function getType(){
         trigger_error('getType() not implemented in '.get_class($this), E_USER_WARNING);
     }
 
+    /**
+     * Paragraph Type
+     *
+     * Defines how this syntax is handled regarding paragraphs. This is important
+     * for correct XHTML nesting. Should return one of the following:
+     *
+     * 'normal' - The plugin can be used inside paragraphs
+     * 'block'  - Open paragraphs need to be closed before plugin output
+     * 'stack'  - Special case. Plugin wraps other paragraphs.
+     *
+     * @see Doku_Handler_Block
+     */
+    function getPType(){
+        return 'normal';
+    }
+
     /**
      * Handler to prepare matched data for the rendering process
      *
-- 
GitLab