Benutzer-Werkzeuge

Webseiten-Werkzeuge


users:werner:exttab1source

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

users:werner:exttab1source [2006-12-02 1524] (aktuell)
werner angelegt
Zeile 1: Zeile 1:
 +====== Sourcetext des Plugins exttab1 ======
  
 +<code php>
 +<?php
 +/**
 + * exttab1-Plugin: Parses extended tables (like MediaWiki)
 + *
 + * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 + * @author     Werner Flamme <w.flamme@web.de>
 + * @date       2006-10-19
 + */
 + 
 +if(!defined('DOKU_INC'))
 +    define('DOKU_INC', realpath(dirname(__FILE__) . '/../../') . '/');
 +if(!defined('DOKU_PLUGIN'))
 +    define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
 +require_once(DOKU_PLUGIN . 'syntax.php');
 +
 +/**
 + * All DokuWiki plugins to extend the parser/rendering mechanism
 + * need to inherit from this class
 + */
 +class syntax_plugin_exttab1 extends DokuWiki_Syntax_Plugin {
 +    /** settings
 +    *
 +    */
 +    var $lineHasStartTag = false;
 +    var $lineHasEndTag   = false;
 +    var $bodyHasStartTag = false;
 +    var $tableHasHeader  = false;
 +
 +    /**
 +     * return some info
 +     */
 +    function getInfo()
 +    {
 +        return array(
 +            'author' => 'Werner Flamme',
 +            'email'  => 'w.flamme@web.de',
 +            'date'   => '2006-10-19',
 +            'name'   => 'Extended Table Plugin',
 +            'desc'   => 'parses MediaWiki-like tables',
 +            'url'    => 'http://wiki.splitbrain.org/doku.php?id=users:wflamme:exttab1'
 +        );
 +    } // function getInfo
 +
 +    /**
 +    * What kind of syntax are we?
 +    */
 +    function getType()
 +    {
 +        return 'protected';
 +    } // function getType
 +
 +    /**
 +    * What kind of plugin are we?
 +    */
 +    function getPType()
 +    {
 +        return 'block';
 +    } // function getPType
 +
 +    /**
 +    * Where to sort in?
 +    */
 +    function getSort()
 +    {
 +        return 100;
 +    } // function getSort
 +
 +    /**
 +    * Connect pattern to lexer
 +    */
 +    function connectTo($mode)
 +    {
 +        $this->Lexer->addEntryPattern('<exttab1(?=.*\x3C/exttab1\x3E)', $mode, 'plugin_exttab1');
 +    } // function connectTo
 +
 +    function postConnect()
 +    {
 +        $this->Lexer->addExitPattern('</exttab1>', 'plugin_exttab1');
 +    } // function postConnect
 +
 +    /**
 +     * Handle the match
 +    */
 +    function handle($match, $state, $pos) 
 +    {
 +      if ( $state == DOKU_LEXER_UNMATCHED ) {
 +        $matches = preg_split('/>/u', $match, 2);
 +        $matches[0] = trim($matches[0]);
 +        if ( trim($matches[0]) == '' ) {
 +          $matches[0] = NULL;
 +        } // if ( trim($matches[0]) == '' )
 +        return array($matches[1], $matches[0]);
 +      } // if ( $state == DOKU_LEXER_UNMATCHED )
 +      return true;
 +    } // function handle
 +
 +    /**
 +     * Create output
 +     @param $mode       current mode of DokuWiki (see http://wiki.splitbrain.org/plugin:tutorial)
 +     @param $renderer   DokuWiki's rendering object
 +     @param $data       the data between \<exttab1> and \</exttab1> tags
 +     @var   $rawdata    $data split into lines
 +     @var   $rawline    any line of $rawdata
 +     @var   $mytable    the code that will be inserted into the document
 +     @return true, if rendering happens, false in all other cases
 +    */
 +    function render($mode, &$renderer, $data)
 +    {
 +        if ($mode == 'xhtml' && strlen($data[0]) > 1) {
 +            $rawdata = explode("\n", $data[0]);
 +            $mytable = '';
 +            $this->lineHasStartTag = false;
 +            $this->lineHasEndTag   = false;
 +            foreach ($rawdata as $rawline) {
 +                $rawline = trim($rawline);
 +                if (substr($rawline, 0, 2) == '|-') {
 +                    // new table line
 +                    $mytable .= $this->_handleNewTableLine($rawline);
 +                } // new table line
 +                elseif (substr($rawline, 0, 2) == '{|') {
 +                    // start table
 +                    $mytable .= $this->_handleTableStart($rawline);
 +                } // start table
 +                elseif (substr($rawline, 0, 2) == '|}') {
 +                    // end table
 +                    $mytable .= "    </tr>\n  </tbody>\n</table>\n";
 +                    $this->bodyHasStartTag = false;
 +                } // end table
 +                elseif (substr($rawline, 0, 2) == '|+') {
 +                    // table caption
 +                    $mytable .= $this->_handleTableCaption($rawline);
 +                } // table caption
 +                elseif (substr($rawline, 0, 1) == '|') {
 +                    // regular line
 +                    $mytable .= $this->_handleRegularLine($rawline);
 +                } // regular line
 +                elseif (substr($rawline, 0, 1) == '!') {
 +                    // header line
 +                    $mytable .= $this->_handleHeaderLine($rawline);
 +                } // header line
 +            } // foreach ($rawdata as $rawline)
 +            $renderer->doc .= $mytable;
 +            return true;
 +        } // if ($mode == 'xhtml' && strlen($data[0]) > 1)
 +        return false;
 +    } // function render
 +
 +    /**
 +        handle tags for a new table line
 +        @param $linedata    the line to be interpreted
 +        @return HTML code
 +    **/
 +    function _handleNewTableLine($linedata)
 +    {
 +        $my2c = '';
 +        if (!$this->lineHasEndTag) {
 +            $my2c .= "    </tr>\n";
 +            $this->lineHasEndTag   = true;
 +            $this->lineHasStartTag = false;
 +        } //if (!this->lineHasEndTag) 
 +        if ($this->tableHasHeader) {
 +            $my2c .= "  </thead>\n";
 +            $this->tableHasHeader = false;
 +        } // if ($this->tableHasHeader)
 +        if (!$this->bodyHasStartTag) {
 +            $my2c .= "  <tbody>\n";
 +            $this->bodyHasStartTag = true;
 +        } // if (!$this->bodyHasStartTag)
 +        if (!$this->lineHasStartTag) {
 +            $my2c .= "    <tr " . substr($linedata, 2) . ">\n";
 +            $this->lineHasStartTag = true;
 +            $this->lineHasEndTag   = false;
 +        } // if (!$this->lineHasStartTag)
 +        return $my2c;
 +    } // function _handleNewTableLine
 +
 +    /**
 +        handle start of table
 +        @param $linedata    the line to be interpreted
 +        @return HTML code
 +    **/
 +    function _handleTableStart($linedata)
 +    {
 +        if (strlen(trim($linedata)) > 2)
 +            $fillInData = 'class="exttab1" ' . substr($linedata, 2);
 +        else
 +            $fillInData = 'class="exttab1"';
 +        $my2c = "\n<table $fillInData>\n";
 +        $this->lineHasStartTag = false;
 +        $this->bodyHasStartTag = false;
 +        $this->lineHasEndTag   = true;
 +        return $my2c;
 +    } // function _handleTableStart
 +
 +    /**
 +        handle table caption
 +        @param $linedata    the line to be interpreted
 +        @return HTML code
 +    **/
 +    function _handleTableCaption($linedata)
 +    {
 +        $my2c = '';
 +        if ($this->lineHasStartTag)
 +            $my2c .= "    </tr>\n";
 +        if ( ($pos = strpos($linedata, '|', 2)) !== false ) {
 +            $parsedData = $this->_parseDisplayData(trim(substr($linedata, $pos + 1)));
 +            $my2c .= '  <caption ' . trim(substr($linedata, 2, $pos - 2)) . '>' .
 +                        "$parsedData</caption>\n";
 +        } // formatting data plus content
 +        else {
 +            $parsedData = $this->_parseDisplayData(trim(substr($linedata, 2)));
 +            $my2c .= "  <caption>$parsedData</caption>\n";
 +        } // content only
 +        $this->lineHasStartTag = false;
 +        $this->lineHasEndTag   = true;
 +        $my2c .= "  <tbody>\n";
 +        $this->bodyHasStartTag = true;
 +        return $my2c;
 +    } // function _handleTableCaption
 +
 +    /**
 +        handles regular table line
 +        @param $linedata    the line to be interpreted
 +        @return HTML code
 +    **/
 +    function _handleRegularLine($linedata)
 +    {
 +        $my2c = '';
 +        if (!$this->lineHasStartTag) {
 +            if (!$this->bodyHasStartTag) {
 +                $my2c .= "  <tbody>\n";
 +                $this->bodyHasStartTag = true;
 +            } // if (!$this->bodyHasStartTag)
 +            $my2c .= "    <tr>\n";
 +            $this->lineHasStartTag = true;
 +            $this->lineHasEndTag   = false;
 +        } // if (!$lineHasStartTag)
 +        $subitems = explode('||', $linedata);
 +        foreach($subitems as $pick) {
 +            if ( ($pos = strpos($pick, '|', 1)) !== false ) {
 +                $parsedData = $this->_parseDisplayData(trim(substr($pick, $pos + 1)));
 +                $my2c .= '      <td ' . trim(substr($pick, 1, $pos - 1)) . '>' .
 +                            "$parsedData</td>\n";
 +            } // formatting data plus content
 +            else {
 +                $parsedData = $this->_parseDisplayData(trim(substr($pick, 1)));
 +                $my2c .= '      <td>' . "$parsedData</td>\n";
 +            } // content only
 +        } // foreach($subitems as $pick)
 +        return $my2c;
 +    } // function _handleRegularLine
 +
 +    /**
 +        handles table header entries
 +        @param $linedata    the line to be interpreted
 +        @return HTML code
 +    **/
 +    function _handleHeaderLine($linedata)
 +    {
 +        $my2c = '';
 +        if (!$this->lineHasStartTag) {
 +            $my2c .= "  <thead>\n    <tr>\n";
 +            $this->lineHasStartTag = true;
 +            $this->lineHasEndTag   = false;
 +            $this->tableHasHeader  = true;
 +        } // if (!$lineHasStartTag)
 +        $subitems = explode('!!', $linedata);
 +        foreach ($subitems as $pick) {
 +            if ( ($pos = strpos($pick, '|', 1)) !== false ) {
 +                $parsedData = $this->_parseDisplayData(trim(substr($pick, $pos + 1)));
 +                // formatting data plus content
 +                $my2c .= '      <th ' . trim(substr($pick, 1, $pos - 1)) . '>' .
 +                            "$parsedData</th>\n";
 +            } // formatting data plus content
 +            else {
 +                // content only
 +                $parsedData = $this->_parseDisplayData(trim(substr($pick, 1)));
 +                $my2c .= '      <th>' . "$parsedData</th>\n";
 +            } // content only
 +        } // foreach ($subitems as $pick)
 +        return $my2c;
 +    } // function _handleHeaderLine
 +    
 +    /**
 +        this function parses data "internally"
 +    **/
 +    function _parseDisplayData($mydata)
 +    {
 +        $retval = $mydata;
 +        $really = false;
 +        $allowedTags = array('}}', ']]', "''");
 +        foreach ($allowedTags as $tag) {
 +            $really = ($really or (strrpos($mydata, $tag) > 0));
 +        } // foreach ($allowedTags as $tag)
 +        if ($really) {
 +            if (!function_exists('p_get_instructions'))
 +                require_once(DOKU_INC . 'inc/parserutils.php');
 +            $instruc = p_get_instructions($mydata);
 +            $myinfo  = array();
 +            $retval = p_render('xhtml', $instruc, &$myinfo);
 +            $retval = str_replace('\n', '', $retval);
 +            $retval = substr($retval, 4, -5);
 +        } // if ($really)
 +        return $retval;
 +    } // function _parseDisplayData
 +
 +} // class syntax_plugin_exttab1
 +
 +//Setup VIM: ex: et ts=4 enc=utf-8 :
 +
 +</code>
users/werner/exttab1source.txt · Zuletzt geändert: 2006-12-02 1524 von werner