DokuWiki

It's better when it's simple

User Tools

Site Tools


plugin:tablemath

tablemath plugin

Compatible with DokuWiki

No compatibility info given!

plugin adds calculated column to built-in table syntax

Last updated on
2009-08-23
Provides
Syntax

This extension has not been updated in over 2 years. It may no longer be maintained or supported and may have compatibility issues.

Similar to tablecalc

Tagged with calculation, math, tables

<note info>There are significant changes to the previous version, please look at the usage section for new syntax</note>

Donation

Installation

  1. create a foler named “tablemath” in the plugin folder
  2. create 2 files named “syntax.php” and “script.js” in the in tablemath folder, copy the file content below into those 2 files
syntax.php
<?php
// must be run within Dokuwiki
if(!defined('DOKU_INC')) die();
 
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_tablemath extends DokuWiki_Syntax_Plugin {
 
    /**
     * return some info
     */
    function getInfo() {
        return array(
                'author' => 'James GuanFeng Lin',
                'email'  => 'guanfenglin@gmail.com',
                'date'   => '24-08-09',
                'name'   => 'Table Math Plugin',
                'desc'   => 'Enables calculated columns in built in table syntax',
                'url'    => '',
                );
    }
 
    function getType() { return 'substition'; }
    function getSort() { return 1213; }
 
    /**
     * Connect pattern to lexer
     */
    function connectTo($mode) {
        $this->Lexer->addSpecialPattern("~~=[a-zA-Z0-9_]*\([0-9,:]*\)~~", $mode, 'plugin_tablemath');
    }
 
    /**
     * Handle the match
     */
    function handle($match, $state, $pos, &$handler) {
        global $ID, $ACT, $INFO;
        $match = str_replace('~~', '', $match);
        $match = str_replace('=', '', $match);
        $tmp = explode('(', $match);
        if (count($tmp)>1)
        {
                $tmp[1] = str_replace(')', '', $tmp[1]);
                return array('method'=>$tmp[0],'set'=>$tmp[1], 'divid'=>'tm'.rand());
        }
        return array();
    }
 
    function render($mode, &$renderer, $data) {
        global $INFO, $ID, $conf;
        if($mode == 'xhtml'){
                  // get discussion meta file name
          $renderer->doc .= '<html><div id="'.$data['divid'].'"><script type="text/javascript" defer="defer">tablemath("'.$data['divid'].'","'.$data['method'].'","'.$data['set'].'");</script></div></html>';
          return true;
        }
        return false;
    }
 
}
?>
script.js
function tablemath(divID,method,rangeStr)
{
  var result;
  var div = document.getElementById(divID);
  var table = div.parentNode.parentNode.parentNode;
  var setArray = tmSetToArray(table, rangeStr);
  switch(method)
  {
        case 'sum':
        break;
        case 'avg':
        break;
        default:
                method = 'unknown';
        break;
  }
  eval('result = tm'+method+'(setArray);');
  div.innerHTML = result;
}
function tmSetToArray(table, rangeStr)
{
        //range should be like this x,y:x,y
        var range = rangeStr.split(':');
        var start = range[0].split(',');
        var end = range[1].split(',');
        var startX = start[0];
        var startY = start[1];
        var endX = end[0];
        var endY = end[1];
 
        var set = new Array();
        for(var x = startX; x<=endX; x++)
        {
                for(var y = startY; y<=endY; y++)
                {
                        set.push(tmParseValue(table.rows[y].cells[x]));
                }
        }
        //alert(set);
        return set;
}
 
function tmParseValue(cell)
{
    var value = parseInt(cell.innerHTML);
    if (isNaN(value))
    {
      value = 0;
    }
    return value;
}
 
function tmunknown(setArray)
{
        return 'Error';
}
 
function tmsum(setArray)
{
        var sum = 0;
        for (var i=0; i<setArray.length; i++)
        {
                sum += setArray[i];
        }
        return sum;
}
 
function tmavg(setArray)
{
        return tmsum(setArray)/setArray.length;
}

Usage

put the syntax into the desired column at the last row of the table.

~~=<Method name>(x,y:x1,y1)~~
Method nameDescription
sumcalculate the total value of defined set
avgcalculate the average value of defined set

Range set eg.1,1:2,2

defines the range in table you want your calculation method should apply to

0,0 1,0 2,0
0,1 1,1 2,1
0,2 1,2 2,2

Example

^header1^header2^header3^Average|
|A|1|2|~~=avg(1,1:2,1)~~|
|B|2|3|~~=avg(1,2:2,2)~~|
|C|3|4|~~=avg(1,3:2,3)~~|
|Total|~~=sum(1,1:1,3)~~|~~=sum(2,1:2,3)~~|~~=sum(1,1:2,3)~~|

Limitations

  • Calculated column referencing to another calculated column will give incorrect values

Feedback

Please check if the calculations work with decimal points eg. 10.2+1.5 /alwin kumar Thu Mar 18 2010/

plugin/tablemath.txt · Last modified: 2017-01-27 21:41 by 78.41.119.98