DokuWiki

It's better when it's simple

User Tools

Site Tools


plugin:tab

Tab Plugin

Compatible with DokuWiki

No compatibility info given!

plugin Inserts 5 non-breaking spaced to 'force' a tab

Last updated on
2006-08-16
Provides
Syntax

Similar to nbsp, space, wrap

Tagged with typography

Description

Nothing too special. I have some poetry on my site, so I wanted a way to add 'tabs'. Since you can't really do tabs in HTML, I decided to just use non-breaking spaces (nbsp's) instead. 5 nbsp's = 1 tab.

Use

Simply insert '<tab>' into the text. When DokuWiki parses it, it will replace '<tab>' with 5 nbsp's.

Code

lib/plugins/tab/syntax.php
<?php
/**
 * Plugin Tab: Inserts "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" into the document for every <tab> it encounters
 * 
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Tim Skoch <timskoch@hotmail.com>
 */
 
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_tab extends DokuWiki_Syntax_Plugin {
 
    /**
     * return some info
     */
    function getInfo(){
        return array(
            'author' => 'Tim Skoch',
            'email'  => 'timskoch@hotmail.com',
            'date'   => '2006-08-16',
            'name'   => 'Tab Plugin',
            'desc'   => 'Inserts "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" into the html of the document for every <tab> it encounters',
            'url'    => 'http://www.dokuwiki.org/wiki:plugins:tab',
        );
    }
 
    /**
     * What kind of syntax are we?
     */
    function getType(){
        return 'substition';
    }
 
    /**
     * What kind of syntax do we allow (optional)
     */
//    function getAllowedTypes() {
//        return array();
//    }
 
    /**
     * What about paragraphs? (optional)
     */
//    function getPType(){
//        return 'normal';
//    }
 
    /**
     * Where to sort in?
     */ 
    function getSort(){
        return 999;
    }
 
 
    /**
     * Connect pattern to lexer
     */
    function connectTo($mode) {
      $this->Lexer->addSpecialPattern('<tab>',$mode,'plugin_tab');
//      $this->Lexer->addEntryPattern('<TEST>',$mode,'plugin_test');
    }
 
//    function postConnect() {
//      $this->Lexer->addExitPattern('</TEST>','plugin_test');
//    }
 
 
    /**
     * Handle the match
     */
    function handle($match, $state, $pos, &$handler){
        switch ($state) {
          case DOKU_LEXER_ENTER : 
            break;
          case DOKU_LEXER_MATCHED :
            break;
          case DOKU_LEXER_UNMATCHED :
            break;
          case DOKU_LEXER_EXIT :
            break;
          case DOKU_LEXER_SPECIAL :
            break;
        }
        return array();
    }
 
    /**
     * Create output
     */
    function render($mode, &$renderer, $data) {
        if($mode == 'xhtml'){
            $renderer->doc .= "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";            // ptype = 'normal'
//            $renderer->doc .= "<p>Hello World!</p>";     // ptype = 'block'
            return true;
        }
        return false;
    }
}
 
//Setup VIM: ex: et ts=4 enc=utf-8 :

Installation

Just like any other plugin: Create a new folder “lib/plugins/tab”, and create a file “syntax.php” with the above code as its contents.

Enjoy!

Discussion

Is any really necessary? ;-)

Tim,

We used your code to spawn our pagebreak plugin. Thanks a million for giving us a starting point. ~Jonathan and Chris


2010-05-18 :?: It doesn't work in lastest version. Did you test it in lastest version?

New Code

Could be done in less lines (drop test code etc).

<?php
 
/**
 * Plugin Tab: Inserts "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" into the document for every <tab> it encounters
 * 
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Tim Skoch <timskoch@hotmail.com>
 */
 
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_tab extends DokuWiki_Syntax_Plugin {
 
    /**
     * return some info
     */
    function getInfo(){
        return array(
            'author' => 'Tim Skoch',
            'email'  => 'timskoch@hotmail.com',
            'date'   => '2006-08-16',
            'name'   => 'Tab Plugin',
            'desc'   => 'Inserts "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" into the html of the document for every <tab> it encounters',
            'url'    => 'http://www.dokuwiki.org/plugin:tab',
        );
    }
 
    /**
     * What kind of syntax are we?
     */
    function getType(){
        return 'substition';
    }
 
    /**
     * Where to sort in?
     */ 
    function getSort(){
        return 999;
    }
 
    /**
     * Connect pattern to lexer
     */
    function connectTo($mode) {
      $this->Lexer->addSpecialPattern('<tab>', $mode, 'plugin_tab');
    }
 
    /**
     * Handle the match
     */
    function handle($match, $state, $pos, &$handler){
        return array();
    }
 
    /**
     * Create output
     */
    function render($mode, &$renderer, $data) {
        if($mode == 'xhtml'){
            $renderer->doc .= '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
            return true;
        }
        return false;
    }
}
 
?>

When we updated to the latest version of DokuWiki, this broke. It failed to interpret ”&nbsp;” as a non-breaking space, and simply displayed it as text instead. The quick fix for me was to replace ”&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;” with ”&#160;&#160;&#160;&#160;&#160;”. Works for us, but we are a one-language shop and our limited user base is almost exclusively using Firefox. YMMV.
Nathan Randall 2008-04-15 10:33

2011-07-26 Works great in latest version using “New Code” above. Thanks


Enhancement/Feature Extension

2011-09-22 by Taggic

If you modify the code according below you can define the quantity of ”&nbsp” signs. If the parameter is missing it is using automatically the old behaiviour so that nobody has to search through all pages and replace the formerly used “tabs”.

following both syntax lines are working:

<tab> 5 times "&nbsp;" as before
<tab2> 2 times "&nbsp;" (where 2 can be each positive integer value, a negative value will be ignored)
    // Connect pattern to lexer
    function connectTo($mode) { 
      $this->Lexer->addSpecialPattern('<tab\d*>', $mode, 'plugin_tab'); }
 
    // Handle the match
    function handle($match, $state, $pos, &$handler){
        $match = substr($match,4,-1);             //strip markup from start and end
 
        if ((strlen($match)>0) && ($match >0)) {  // add as many space as defined if value is positive
            $data .= str_repeat('&#160;', $match);
        }
        else {                                    // if standard tab is used then insert 5 spaces
          $data = '&#160;&#160;&#160;&#160;&#160;';                        
        }
        return $data;
    }
 
    // Create output
    function render($mode, &$renderer, $data) {
        if($mode == 'xhtml'){
            $renderer->doc .= $data;
            return true;         }
        return false;
    }
plugin/tab.txt · Last modified: 2014/03/20 17:50 by Aleksandr