columns plugin

columns plugin by Michael Arlt
Arrange information in multiple columns

Last updated on 2007-10-22. Provides Syntax.
Compatible with DokuWiki 2007-11-06.

Tagged with columns.

Description

You can arrange your information in multiple columns. Column breaks must be inserted manual. I use a table with one <td> for each column. This worked best together with the S5 plugin from Andreas Gohr.

Syntax

Simply add two lines around your information and enter your column breaks.

The first parameter is the width of the table. The following parameters are for the columns. If you do not want to specify a value for the table- or column-width use ”-” instead.

<columns>

information in column 1

~~NEWCOL~~

information in column 2

</columns>
<columns 100% 50% - ->

information in column 1 (50% width)

~~NEWCOL~~

information in column 2

~~NEWCOL~~

information in column 3

</columns>

Localisation

The keywords can be customized - see Dokuwiki: administration → configuration.

Language Start End Next Column
English <columns> </columns> ~~NEWCOL~~
German <spalten> </spalten> ~~NEUESPALTE~~
$lang['kwcolumns']
$lang['kwnewcol']

Download / Installation

Install the current release with the plugin manager. Have a look at the DokuWiki plugin configuration.

Source Code

syntax.php

<?php
/**
 * columns Plugin: Arrange information in mulitple columns
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Michael Arlt <michael.arlt [at] sk-schwanstetten [dot] de>
 * @version    2007-10-22
 */
 
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');
 
function td($tdwidth,$css)
{
  if ($tdwidth == "-")
  {
    return '<td style="'.$css.'">';
  }
  else
  {
    return '<td style="width:'.$tdwidth.';'.$css.'">';
  }
}
 
/**
 * All DokuWiki plugins to extend the parser/rendering mechanism
 * need to inherit from this class
 */
class syntax_plugin_columns extends DokuWiki_Syntax_Plugin {
 
    /**
     * function constructor
     */
    function syntax_plugin_columns(){
      // enable direct access to language strings
      $this->setupLocale();
    }
 
    /**
     * return some info
     */
    function getInfo(){
        return array(
            'author' => 'Michael Arlt',
            'email'  => 'michael.arlt@sk-schwanstetten.de',
            'date'   => '2007-10-22',
            'name'   => 'columns Plugin',
            'desc'   => 'Arrange information in multiple columns',
            'url'    => 'http://wiki.splitbrain.org/plugin:columns',
        );
    }
 
    /**
     * What kind of syntax are we?
     */
    function getType(){
        return 'formatting';
    }
 
function getPType(){
        return 'normal';
    }
 
    /**
     * What modes are allowed within our mode?
     */
    function getAllowedTypes() {
        return array('substition','protected','disabled','formatting');
    }
 
    /**
     * Where to sort in?
     */
    function getSort(){
        return 1;
    }
 
    function connectTo($mode) {
      $kwcolumns=$this->getConf('kwcolumns');
      if ($kwcolumns=="") { $kwcolumns=$this->lang["kwcolumns"]; };
      $this->Lexer->addSpecialPattern('<'.$kwcolumns.'.*?>.*?</'.$kwcolumns.'>',$mode,'plugin_columns');
    }
 
    /**
     * Handle the match
     */
    function handle($match, $state, $pos, &$handler)
    {
      $kwnewcol=$this->getConf('kwnewcol');
      if ($kwnewcol=="") { $kwnewcol=$this->lang["kwnewcol"]; };
      $kwcolumns=$this->getConf('kwcolumns');
      if ($kwcolumns=="") { $kwcolumns=$this->lang["kwcolumns"]; };
 
      $length=strlen($this->lang["kwcolumns"])+2;
      $end=strpos($match,">");
      if($end > $length)
      {
        $width=preg_split('/ /',substr($match,$length,$end-$length));
      }
      #$lines="$kwcolumns:$kwnewcol:".substr($match,$length,$end-$length).":";
      $css1=$this->getConf('css1');
      $css2=$this->getConf('css2');
      $css3=$this->getConf('css3');
      $lines.='<table';
      if ($width[0] != "-")
      {
        $lines.=' style="width:'.$width[0].'"';
      }
      $lines.= '><tr>';
      $column=0;
      foreach (preg_split('/'.$kwnewcol.'/',substr($match,$end+1,-$length-1)) as $col)
      {
        if ($column==1) # first column
        {
          $lines.=td($width[$column],$css1);
          $lines.= p_render('xhtml',p_get_instructions($oldcol),$info);
        }
        else
        {
          if ($column>1) # all other columns
          {
            $lines.=td($width[$column],$css2);
            $lines.= p_render('xhtml',p_get_instructions($oldcol),$info);
          }
        }
        $column++;
        $oldcol=$col;
      }
      $lines.=td($width[$column],$css3);
      $lines.= p_render('xhtml',p_get_instructions($oldcol),$info); # last column
      $lines.='</td></tr></table>';
      return $lines;
    }
 
    /**
     * Create output
     */
    function render($mode, &$renderer, $data) {
        if($mode == 'xhtml'){
          $renderer->doc .= $data;
          return true;
        }
        return false;
    }
}
 
//Setup VIM: ex: et ts=4 enc=utf-8 :

Change History

2007-10-22

  • First public release
  • All desired features of the author are implemented

Thanks to ...

Andreas Gohr for Dokuwiki and now: S5!

License

This product is released under the GPL 2

Discussion

It works if I put NEWCOL rather than ~~NEWCOL~~ (I got ~~ appearing as text). The default language is pt-br.

Please give me all information from both (the correct and incorrect) variants: What did you put in the configuration dialog? What do you put in the text? Please type the complete line with “$conf['plugin']['columns']['kwnewcol'] = …” from your conf/local.php;

In the text

<columns 100% 50% 15% - >
information in column 1 (50% width)
NEWCOL
information in column 2 (15% width)
NEWCOL
information in column 3
</columns>

In the configuration settings, I am going with the default (that is left blank). Check it at Playground.


The same here - NEWCOL works better - ~~ are not displayed. Language is: pl. The settings are default.

There is a small bug in …/columns/lang/en/lang.php - change line 10 from 'NEWCOL' to '~~NEWCOL~~'
Please tell me if the problem is fixed then. You can change it in the preferences too. If you enter ~~NEWCOL~~ it should work, too.
After this you must adjust your pages to the new pattern.

Found a bug: when putting links to non-existing pages in one of the columns, the link is red … no problem. But when you now click on it + create the page + go back to the page with the columns … the link remains red. It only turns into the color of a valid pages after editing the page with the columns. I've just tested this on the playground-link provided in the first discussion comment in this page and it's the same there. In other words, not just because of my installation. Is it possible to give this some attention … I plan on using this plugin heavily.

I don't have any idea to fix this. This maybe a problem because i do not understand all of dokuwiki which i use. Any help is welcome. Michael

this is just a caching issue and has nothing to do with the column plugin. Of course, the cache of the column page is not changed if a different (the target) page is edited or created
You'll notice that links on wiki pages are “updated” once a new page was created. To omit that in the column plugin you could use the following in your handler function:
 $renderer->info['cache'] = false;

Michael Klier 2008/03/13 11:58

Michael, I tried to solve this caching-issue using the way described by you above. Sadly it doesn't work. I tried to add the line in several different ways at several places in the code (although I assume it should be added to the method: function render($mode, &$renderer, $data) before the existing code), but nothing works. Can you maybe explain it a bit more or take a look at the code yourself? — Mischa The Evil 2008/04/16 23:30
Same problem here. In addition, ~~NOCACHE~~ at top of the page doesn't help either.StinkyWinky 2008/05/20 14:26
Please publish your code here (or on your own site), that makes it easier and quicker to review your code without having to go to the trouble of installing the plugin. — Christopher Smith 2008/05/21 11:15
Here is the code … If possible leave a hint using email… this will improve response time… Michael Arlt 2008/06/10 23:39
  • The columns plugin is working unstable with indexmenu. Apache error_log message is shown as following.
[client 220.130.131.238] PHP Fatal error:  Allowed memory size of 16777216 bytes exhausted (tried to allocate 35 bytes) in /var/www/html/dev/inc/parser/parser.php on line 98, referer: http://www.everplast.net/dev/everplast/reinforcedhose/video?do=edit&rev=

After tracing the source code, I guess the error could be from that parser cannot found end tag. Does anyone have workaround solution or patch code? — Jonathan Tsai 2008/07/11 09:26

This is not an error of DokuWiki or the Columns plugin. It is an error caused by the PHP-configuration. Your PHP-setup is limited to use not more then 16MB of memory. This error shows you that the limit has been reached.
See the PHP manual for more info about the related configuration-directive (memory_limit).
Mischa The Evil 2008/07/12 05:21
 
plugin/columns.txt · Last modified: 2008/07/12 05:28 by Mischa
 
Imprint Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki
WikiForumIRCBugsTranslate