DokuWiki Plugin : AV Task Box

avtaskbox plugin by Sherri W. (http://www.start.ofitall.com)
Generates nicely formatted boxes for describing project tasks or user stories.

Last updated on 2009-11-19. Provides Syntax.
Compatible with DokuWiki 2008-05-05+.

Tagged with box, gtd, pm, projects, task, tasks, todo, userstory.

    Download

    Download/Install plugin-avtaskbox.zip (Paste this into the Plugin Manager to install automatically.)
    Last Updated 2009-11-19

    Description

    With this plugin you can format task or userstory information into nice tables for doing project management or keeping a todolist.

    Screenshot and info available here: www.source.ofitall.com

    Syntax and Usage

    <task>
    TITLE: A test task
    PRIORITY: High
    ESTIMATE: 4h
    PROGRESS: 10%
    ASSIGNED: Sherri
    DESCRIPTION: Some stuff for you. You can have newlines in this part. Description must be the last item.
    </task>
    • The labels for each item are not case sensitive. I just make them all caps to make them visible.
    • Each item must take up only one line, except the description can be on multiple lines.
    • The description will maintain newlines.
    • The description must be the last item in the list before the </task> tag. The other items can be in any order before the description item.
    • You can leave out any of the items(attributes), or leave them blank, and it will still look okay.
    • The entire thing is wrapped in a span with the CSS class “avtaskbox” so you can style it in your CSS.

    Output

    Installation

    • Plugin Manager: Paste this URL into the Plugin Manager to install AVTaskBox automatically: http://www.source.ofitall.com/devel/addons/avtaskbox/plugin-avtaskbox.zip
    • Manually: To get the plugin to work, manually install the plugin:
      1. Make a new directory avtaskbox/ in your plugins directory.
      2. Add the source code below to a file syntax.php in the avtaskbox directory.

    Known Bugs

    • None.

    To Do

    • Nothing.

    Changelog

    2009-11-19

    • created plugin.

    Source

    syntax.php

    <?php
    /*
     * DokuWiki task box plugin
     * Copyright (C) 2009 Sherri Wheeler
     * Usage:
     *
     * <task>
     * TITLE: A test task
     * PRIORITY: High
     * ESTIMATE: 4h
     * PROGRESS: 10%
     * ASSIGNED: Sherri
     * DESCRIPTION: Some stuff for you. You can have newlines in this part. Description must be the last item.
     * </task>
     * 
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation; either version 2 of the License, or
     * (at your option) any later version.
     * 
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     * 
     * You should have received a copy of the GNU General Public License
     * along with this program; if not, write to the Free Software
     * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     */
     
    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');
     
    class syntax_plugin_avtaskbox extends DokuWiki_Syntax_Plugin
    {
     
    	/**
    	 * return some info
    	 */
    	function getInfo()
    	{
    		return array
    		(
    			'author' => 'Sherri Wheeler',
    			'email'  => 'Use my website: www.start.ofitall.com',
    			'date'   => '2009-11-19',
    			'name'   => 'AV Task Box',
    			'desc'   => 'Creates task/user story table boxes.',
    			'url'	=> 'http://www.source.ofitall.com',
    		);
    	}
     
    	/**
    	 * 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->addEntryPattern('\<task\>',$mode,'plugin_avtaskbox');
        }
     
        function postConnect() {
          $this->Lexer->addExitPattern('\</task\>','plugin_avtaskbox');
        }
     
     
        /**
         * Handle the match
         */
        function handle($match, $state, $pos, &$handler){
            switch ($state) {
              case DOKU_LEXER_ENTER : 
                return array($state, '');
              case DOKU_LEXER_MATCHED :
                break;
              case DOKU_LEXER_UNMATCHED :
     
    			$resultStr = '<table class="inline" width="500">';
     
    			preg_match('/^Title:(.*?)$/isxm', $match, $matches);
    			$title = (!empty($matches[1]) && strlen(trim($matches[1]))>0) ? trim($matches[1]) : '&nbsp;';
     
    			preg_match('/^Priority:(.*?)$/isxm', $match, $matches);
    			$priority =(!empty($matches[1]) && strlen(trim($matches[1]))>0) ? 'Priority: '.trim($matches[1]) : '&nbsp;';
     
    			preg_match('/^Estimate:(.*?)$/isxm', $match, $matches);
    			$estimate = (!empty($matches[1]) && strlen(trim($matches[1]))>0) ? ' of '.trim($matches[1]) : '&nbsp;';
     
    			preg_match('/^Assigned:(.*?)$/isxm', $match, $matches);
    			$assigned = (!empty($matches[1]) && strlen(trim($matches[1]))>0) ? '('.trim($matches[1]).')' : '&nbsp;';
     
    			preg_match('/^Progress:(.*?)$/isxm', $match, $matches);
    			$progress = (!empty($matches[1]) && strlen(trim($matches[1]))>0) ? intval(preg_replace('[^0-9]','',$matches[1])) : '0';
     
    			preg_match('/Description:(.*)/isx', $match, $matches);
    			$description = (!empty($matches[1]) && strlen(trim($matches[1]))>0) ? trim($matches[1]) : '&nbsp;';
     
    			if($progress<0){$progress=0;}
    			if($progress>100){$progress=100;}
    			$sizeLeft = 100-$progress;
    			$progbar .= '<span style="margin-top:3px;padding:0;height:8px;width: 100px;">'.($progress<=0 ? '' : '<span style="margin:0;padding:0;background-color:#74a6c9; height:8px; width:'.$progress.'"><img src="'.dirname($_SERVER['PHP_SELF']).'lib/images/blank.gif" height="8" width="'.$progress.'" border="0" title="'.$progress.'%" alt="'.$progress.'%" hspace="0" vspace="0" style="" /></span>') . ($progress>=100 ? '' : '<span style="margin:0;padding:0;background-color: #dee7ec;height:8px;width:'.$sizeLeft.'"><img src="'.dirname($_SERVER['PHP_SELF']).'lib/images/blank.gif" height="8" width="'.$sizeLeft.'" border="0" title="'.$progress.'%" alt="'.$progress.'%" hspace="0" vspace="0" style="" /></span>') .'</span>';
     
    			$resultStr .= '<tr class="row0"><th><b>'.$title.'</b><span style="float:right;font-weight:normal;">'.$assigned.'</span></th></tr>';
    			$resultStr .= '<tr><td>'.nl2br($description).'</td></tr>';
    		    $resultStr .= '<tr><td valign="middle">'.$priority.'<span style="float:right;font-size:-1;">('.$progress.'%'.$estimate.') '.$progbar.'</span></td></tr>';
     
     
    			$resultStr .= '</table>';
     
                $match = $resultStr;
                return array($state, $match);
     
     
              case DOKU_LEXER_EXIT :
                return array($state, '');
              case DOKU_LEXER_SPECIAL :
                break;
            }
            return array();
        }
     
     
        /**
         * Create output
         */
        function render($mode, &$renderer, $data) {
          if($mode == 'xhtml'){
            list($state, $match) = $data;
     
            switch ($state) {
              case DOKU_LEXER_ENTER : 
                $renderer->doc .= "<span class='avtaskbox'>"; 
                break;
     
              case DOKU_LEXER_MATCHED :
                break;
     
              case DOKU_LEXER_UNMATCHED :
     
                $renderer->doc .= $match; break;          
     
              case DOKU_LEXER_EXIT :
                $renderer->doc .= "</span>"; 
                break;
     
              case DOKU_LEXER_SPECIAL :
                break;
            }
            return true; 
          }
    	return false;
    	}
    }
     
    ?>

    Comments / Discussion

    Hi everyone, let me know what you think. You can also post comments on the avtaskbox plugin page on my website. ~Sherri

    I needed a small fix to get the progress bar work on my wiki:

    <img src="'.dirname($_SERVER['PHP_SELF']).'**/**lib/images/blank.gif"

    You just need to add a backslash in both image paths. Without the backslash the progress bar is not displayed correctly in Firefox and shows an ugly frame in Chrome/IE8. — nyoman 2009/12/21 09:24

    Hi, quite a simple useful plugin. I have got some ideas for improvment:

    1. Including dokuwiki syntax within description field.
    2. Maybe the task should be enclosed in HTML div, not in table. So, in case of longer description the text will be displayed in whole page.

    peter 2010/05/20 17:25.

    Hi. ProgressBar is buggy. I'm using DW 09-12-25c 25 percent 90 percent winky 2010/06/02 11:02

     
    plugin/avtaskbox.txt · Last modified: 2010/06/02 11:03 by 81.200.198.20
     
    Except where otherwise noted, content on this wiki is licensed under the following license:CC Attribution-Noncommercial-Share Alike 3.0 Unported
    Imprint Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki
    WikiForumIRCBugsGitXRefTranslate