DokuWiki

It's better when it's simple

User Tools

Site Tools


plugin:timeline2

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Both sides next revision
plugin:timeline2 [2011-05-04 13:40]
213.234.249.210 [Discussion]
plugin:timeline2 [2016-04-29 11:43] (current)
87.223.101.51 [Discussion]
Line 2: Line 2:
  
 ---- plugin ---- ---- plugin ----
-description:  +description: Add TimeLine capability to DokuWiki 
-author     :  Lasse Ristig +author     : Lasse Ristig 
-email      :  ristigl@ratsgymnasium-pe.de +email      : ristigl@ratsgymnasium-pe.de 
-type       : +type       : syntax
 lastupdate : 2011-04-26 lastupdate : 2011-04-26
-compatible : +compatible : Angua
 depends    :  depends    : 
 conflicts  conflicts 
Line 13: Line 13:
 tags       : timeline, time tags       : timeline, time
  
-downloadurl: # eg. http://github.com//dokuwiki-plugin-timeline2/zipball/master +downloadurl: # eg. https://github.com//dokuwiki-plugin-timeline2/zipball/master 
-bugtracker : # eg. http://github.com//dokuwiki-plugin-timeline2/issues +bugtracker : # eg. https://github.com//dokuwiki-plugin-timeline2/issues 
-sourcerepo : # eg. http://github.com//dokuwiki-plugin-timeline2/+sourcerepo : # eg. https://github.com//dokuwiki-plugin-timeline2/
 donationurl:  donationurl: 
 ---- ----
- 
  
 ===== Installation ===== ===== Installation =====
Line 24: Line 23:
 Refer to [[:Plugins]] on how to install plugins manually. Refer to [[:Plugins]] on how to install plugins manually.
  
-Create a folder in the plugin-directory named timeline2, then copy the following syntax.php an style.css into that folder.+Create a folder in the plugin-directory named timeline2, then copy the following syntax.php and style.css into that folder.
  
 ====syntax.php==== ====syntax.php====
Line 367: Line 366:
         padding-bottom:1.8em;         padding-bottom:1.8em;
         display:none;         display:none;
-        width:100%; +        bottom:1em;
-        top:-2.8em;+
         left:-1px;         left:-1px;
         border:1px solid black;         border:1px solid black;
Line 433: Line 431:
 hmm hmm
 </code> </code>
 +
 +==== HTML output ====
 {{http://img716.imageshack.us/img716/4994/timeline2.png?nolink&400|}} {{http://img716.imageshack.us/img716/4994/timeline2.png?nolink&400|}}
 +
 +==== LaTeX output ====
 {{http://img263.imageshack.us/img263/2108/timeline2pdf.png?nolink&400|}} {{http://img263.imageshack.us/img263/2108/timeline2pdf.png?nolink&400|}}
  
Line 467: Line 469:
  
 ===== FAQ ===== ===== FAQ =====
- 
 //[discussions should ideally be deleted and turned into FAQ entries along the way]// //[discussions should ideally be deleted and turned into FAQ entries along the way]//
 +
 +  - How do I get this working with Latex?  Installing the Latex plugin doesn't seem to be enough.
 +
 +Hi, I get the following error everytime I save a page that contains a timeline:\\
 +Warning: Cannot modify header information - headers already sent by (output started at /var/www/abcd/http/wiki/lib/plugins/timeline2/syntax.php:1) in /var/www/abcd/http/wiki/inc/common.php on line 1543
 +
 +After reloading  the page is fine and all changes are saved.
 +I run "Rincewind" on an debian Lenny. 
 +Any ideas on that?
 +
 +Cheers, Thomas
  
 ===== Discussion ===== ===== Discussion =====
Line 476: Line 488:
  
 Much better then my own! 8-) , Wbr, Oleg Karachevtsev Much better then my own! 8-) , Wbr, Oleg Karachevtsev
 +
 +:?: Question: is the plugin running well right now? I tried to install it but have problems which means that the charts are not displayed but rows of numbers (weeks)?
 +
 +==== Issue: Declarations handle/render mismatch? ====
 +
 +This plugins works here, but i get this warning messages, top of the webpage.
 +
 +<code php>
 +Warning: Declaration of syntax_plugin_timeline2::handle($match, $state, $pos, &$handler) should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in C:\xampp\htdocs\dokuwiki\lib\plugins\timeline2\syntax.php on line 289
 +
 +Warning: Declaration of syntax_plugin_timeline2::render($mode, &$renderer, $indata) should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in C:\xampp\htdocs\dokuwiki\lib\plugins\timeline2\syntax.php on line 289
 +</code>
 +===== Proposal =====
 +I modified the code to allow for alternate date formats (see new constants) so that we in countries that insist on continuing to do things the nonsensical way can use this awesome plugin with m/d/Y.
 +
 +<code php syntax.php>
 +<?php
 +
 +/**
 + * Add TimeLine capability to dokuwiki
 + *
 + * <TimeLine interval=dd/mm/yyyy-dd/mm/yyyy [color=hexcolor] [[scale={w|m|y}] [legend]>
 + * highlite=dd/mm/yyyy-dd/mm/yyyy[:hex color][=internal wiki page link][=Name of link][=lrch]
 + * ...
 + * </TimeLine>
 + *
 + * @license    GNU_GPL_v2
 + * @author     Lasse Ristig a fork from timeline by Oleg Karachevtsev <oleg@karachevtsev.ru> with alternate date formatting by Joel Simpson
 + */
 +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_timeline2 extends DokuWiki_Syntax_Plugin
 +{
 +
 +    var $scale = 0;
 +    var $bgcolor_interval = '11aa11';
 +    var $bgcolor_highlight = 'cc5555';
 +
 +    //Indexes for the order the date elements appear
 +    const DAYINDEX = 1;  //for US, would be 2
 +    const MONTHINDEX = 2;  //for US, would be 1
 +    const YEARINDEX = 3;
 +    //The desired date format, indexes above should match the order they appear
 +    const DATEFORMAT = 'd.m.Y';  //for US, would be m/d/Y
 +
 +
 +    function getInfo()
 +    {
 +        return array(
 +            'author' => 'Lasse Ristig a fork timeline by Oleg Karachevtsev',
 +            'email' => 'ristigl@ratsgymnasium-pe.de',
 +            'date' => '2010-01-27',
 +            'name' => 'TimeLine2 Plugin',
 +            'desc' => 'Add TimeLine Capability (forked from timeline by Oleg Karachevtsev)',
 +            'url' => 'http://www.dokuwiki.org/plugin:timeline2',
 +        );
 +    }
 +
 +    function getType()
 +    {
 +        return 'substition';
 +    }
 +
 +    function getPType()
 +    {
 +        return 'normal';
 +    }
 +
 +    function getAllowedTypes()
 +    {
 +        return array('container', 'substition', 'protected', 'disabled', 'formatting', 'paragraphs');
 +    }
 +
 +    function getSort()
 +    {
 +        return 195;
 +    }
 +
 +    function accepts($mode)
 +    {
 +        if ($mode == substr(get_class($this), 7))
 +            return true;
 +        return parent::accepts($mode);
 +    }
 +
 +    function connectTo($mode)
 +    {
 +        $this->Lexer->addEntryPattern('<TimeLine.*?>(?=.*?</TimeLine>)', $mode, 'plugin_timeline2');
 +    }
 +
 +    function postConnect()
 +    {
 +        $this->Lexer->addExitPattern('</TimeLine>', 'plugin_timeline2');
 +    }
 +
 +    function reinitvars()
 +    {
 +        $this->pdf_bar_height = 0.5;
 +        $this->scale = 0;
 +        $this->legend = 0;
 +        $this->bgcolor_interval = '11aa11';
 +        $this->bgcolor_highlight = 'cc5555';
 +        $this->lasse_labels = array();
 +        $this->lasse_day = 1;
 +        $this->lasse_events = array();
 +        $this->lasse_interval = array();
 +    }
 +
 +    function handle($match, $state, $pos, &$handler)
 +    {
 +
 +        switch ($state) {
 +
 +            case DOKU_LEXER_ENTER :
 +                $interval = trim(substr($match, 9, -1));
 +                if (strlen($interval)) {
 +                    return array($state, $interval);
 +                }
 +                return array($state, $this->default);
 +
 +            case DOKU_LEXER_UNMATCHED :
 +                return array($state, $match);
 +
 +            default:
 +                return array($state);
 +        }
 +    }
 +
 +    function render($mode, &$renderer, $indata)
 +    {
 +
 +        if ($mode == 'xhtml' or $mode == "latex") {
 +            list($state, $data) = $indata;
 +
 +            switch ($state) {
 +                case DOKU_LEXER_ENTER :
 +                    $this->reinitvars();
 +                    preg_match("|interval=([\d\/]*)-([\d\/]*)|", $data, $matches);
 +                    preg_match("|color=([\dabcdef]*)|i", $data, $color);
 +                    preg_match("|scale=([\w])|i", $data, $scale);
 +                    preg_match("|(legend)|i", $data, $legend);
 +                    if (isset($scale)) {
 +                        $this->scale = $scale[1];
 +                        if (isset($legend[1]))
 +                            $this->legend = 1;
 +                    }
 +                    if (isset($color[1])) {
 +                        $this->bgcolor_interval = $color[1];
 +                    }
 +                    # Get interval to by shown
 +                    if (preg_match('/^\s*(\d\d?)[^\w](\d\d?)[^\w](\d{1,4}\s*$)/', $matches[1], $match)) {
 +                        $matches[1] = $match[self::MONTHINDEX] . '/' . $match[self::DAYINDEX] . '/' . $match[self::YEARINDEX];
 +                    }
 +                    if (preg_match('/^\s*(\d\d?)[^\w](\d\d?)[^\w](\d{1,4}\s*$)/', $matches[2], $match)) {
 +
 +                        $matches[2] = $match[self::MONTHINDEX] . '/' . $match[self::DAYINDEX] . '/' . $match[self::YEARINDEX];
 +                    }
 +                    $dt = array($matches[1], $matches[2]);
 +                    $this->lasse_interval = array($matches[1], $matches[2]);
 +                    $i = 0;
 +                    # Check all days for labels and get number of days in interval
 +                    while (strtotime($dt[1]) >= strtotime("+" . $i . " day", strtotime($dt[0]))) {
 +                        $daytime = strtotime("+" . $i . " day", strtotime($dt[0]));
 +                        if (isset($this->scale)) {
 +                            if ($this->scale == "w" && date("w", $daytime) == 0) {
 +                                $this->lasse_labels[] = array(date("W", $daytime), $i);
 +                            } elseif ($this->scale == "m" && date("j", $daytime) == 1) {
 +                                $this->lasse_labels[] = array(date("n", $daytime), $i);
 +                            } elseif ($this->scale == "y" && date("n", $daytime) == 1 && date("j", $daytime) == 1) {
 +                                $this->lasse_labels[] = array(date("y", $daytime), $i);
 +                            }
 +                        }
 +                        $i++;
 +                    }
 +                    $this->lasse_days = $i;
 +                    break;
 +                case DOKU_LEXER_UNMATCHED :
 +                    preg_match_all("|highlight=([\d\/]*)-([\d\/]*):?([^\s=]*)?=?([^=]*)?=?([^=]*)?=?([lrch])?|", $data, $matchesall);
 +                    for ($m = 0;; $m++) {
 +                        if (!isset($matchesall[0][$m])) {
 +                            break;
 +                        }
 +                        unset($matches);
 +                        $matches[1] = $matchesall[1][$m];
 +                        $matches[2] = $matchesall[2][$m];
 +                        if (isset($matchesall[3][$m]) && strlen($matchesall[3][$m]))
 +                            $matches[3] = $matchesall[3][$m];
 +                        if (isset($matchesall[4][$m]) && strlen($matchesall[4][$m]))
 +                            $matches[4] = $matchesall[4][$m];
 +                        if (isset($matchesall[5][$m]) && strlen($matchesall[5][$m]))
 +                            $matches[5] = $matchesall[5][$m];
 +                        if (isset($matchesall[6][$m]) && strlen($matchesall[6][$m]))
 +                            $matches[6] = $matchesall[6][$m];
 +                        if (preg_match('/^\s*(\d\d?)[^\w](\d\d?)[^\w](\d{1,4}\s*$)/', $matches[1], $match)) {
 +                            $matches[1] = $match[self::MONTHINDEX] . '/' . $match[self::DAYINDEX] . '/' . $match[self::YEARINDEX];
 +                        }
 +                        if (preg_match('/^\s*(\d\d?)[^\w](\d\d?)[^\w](\d{1,4}\s*$)/', $matches[2], $match)) {
 +                            $matches[2] = $match[self::MONTHINDEX] . '/' . $match[self::DAYINDEX] . '/' . $match[self::YEARINDEX];
 +                        }
 +                        $dt = Array($matches[1], $matches[2]);
 +
 +                        # Get start and end of event in days in interval
 +                        $i = 0;
 +                        $lasse_event = array();
 +                        while (strtotime($this->lasse_interval[1]) >= strtotime("+" . $i . " day", strtotime($this->lasse_interval[0]))) {
 +                            $daytime_a = strtotime("+" . $i . " day", strtotime($this->lasse_interval[0]));
 +                            $daytime_b = strtotime("+" . ($i - 1) . " day", strtotime($this->lasse_interval[0]));
 +                            if ($daytime_a == strtotime($dt[0])) {
 +                                $lasse_event[0] = $i;
 +                            }
 +                            if ($daytime_b == strtotime($dt[1])) {
 +                                $lasse_event[1] = $i;
 +                            }
 +                            $i++;
 +                        }
 +                        #                            start         ,ende           ,color      ,link       ,linkname   ,date-start ,date-ende
 +                        $this->lasse_events[] = array($lasse_event[0], $lasse_event[1], $matches[3], $matches[4], $matches[5], $matches[1], $matches[2]);
 +                    }
 +                    break;
 +                case DOKU_LEXER_EXIT :
 +// ---------------------------------------------------------------------
 +//                          xhtml
 +// ---------------------------------------------------------------------
 +                    if ($mode == "xhtml") {
 +                        // --------------- Render bars ---------------------
 +                        $renderer->doc .= "\n<div class='TimeLineBox'><div class=\"TimeLine\">";
 +                        if ($this->scale)
 +                            foreach ($this->lasse_labels as $k => $value) {
 +                                $renderer->doc.="<div class='label' style='left:" . ($value[1] * 100 / $this->lasse_days) . "%;'>$value[0]</div>";
 +                            }
 +                        foreach ($this->lasse_events as $k => $value) {
 +                            $renderer->doc.="<div class='bar' style='left:" . ($value[0] * 100 / $this->lasse_days) . "%; width:" . (($value[1] - $value[0]) * 100 / $this->lasse_days) . "%; background-color:#$value[2]'></div>";
 +                            $renderer->doc.="<div class='bar-hover' style='left:" . ($value[0] * 100 / $this->lasse_days) . "%; width:" . (($value[1] - $value[0]) * 100 / $this->lasse_days) . "%; '>";
 +                            $renderer->doc.="<span class=hover><span class=label>";
 +                            if ($value[3]) {
 +                                $renderer->doc.=html_wikilink($value[3], $value[4]);
 +                            } else {
 +                                $renderer->doc.= ( $value[4] != "") ? $value[4] : "&nbsp;";
 +                            }
 +                            $renderer->doc.="</span><span class=datum>";
 +
 +                            $renderer->doc.=date(self::DATEFORMAT, strtotime($value[5]));
 +
 +                            $renderer->doc.="-";
 +
 +                            $renderer->doc.=date(self::DATEFORMAT, strtotime($value[6]));
 +
 +                            $renderer->doc.="</span>";
 +                            $renderer->doc.="</div>";
 +                        }
 +                        $renderer->doc .= "\n</div><br>";
 +                        // -------------- Render Legend --------------------
 +                        if ($this->legend == 1) {
 +                            $renderer->doc.="<br><div class='TimeLineLegend'><ul>";
 +                            foreach ($this->lasse_events as $k => $value) {
 +                                $renderer->doc.="<li>";
 +                                $renderer->doc.="<span class=legend style='background-color:#$value[2];'></span>";
 +                                if ($value[3]) {
 +                                    $renderer->doc.=html_wikilink($value[3], $value[4]);
 +                                } else {
 +                                    $renderer->doc.= ( $value[4] != "") ? $value[4] : "&nbsp;";
 +                                }
 +                                $renderer->doc.=": ";
 +
 +
 +                                $renderer->doc.=date(self::DATEFORMAT, strtotime($value[5]));
 +
 +                                $renderer->doc.="-";
 +
 +                                $renderer->doc.=date(self::DATEFORMAT, strtotime($value[6]));
 +
 +                                $renderer->doc.="</li>";
 +                            }
 +                            $renderer->doc.="</ul></div>";
 +                        }
 +                        $renderer->doc .="</div>";
 +                        break;
 +                    }
 +// ---------------------------------------------------------------------
 +//                          Latex
 +// ---------------------------------------------------------------------
 +                    if ($mode == "latex") {
 +                        // ------------------- Render bars -----------------
 +                        $w = 16;
 +                        $h = count($this->lasse_events) * $this->pdf_bar_height;
 +                        $renderer->doc.="\\begin{pspicture*}(0,-0.7)($w," . ($h + 0.7) . ")\n";
 +                        $renderer->doc.="  \\pcline[linewidth=1.5pt](0,0)($w,0)\n";   # bottom line
 +                        $renderer->doc.="  \\pcline[linewidth=1.5pt](0,$h)($w,$h)\n"; # upper line
 +                        # date at top
 +                        $renderer->doc.="  \\rput[r]($w," . ($h + 0.3) . "){\\small\\textsf{" . date(self::DATEFORMAT, strtotime($this->lasse_interval[0])) . " bis " . date(self::DATEFORMAT, strtotime($this->lasse_interval[1])) . "}}\n";
 +                        $renderer->doc.="  %Ticks \n";
 +                        # Ticks
 +                        if ($this->scale)
 +                            foreach ($this->lasse_labels as $k => $value) {
 +                                $xp = ($value[1] * $w / $this->lasse_days);
 +                                $renderer->doc.="  \\pcline[linestyle=dotted,linewidth=0.5pt]($xp,-0.1)($xp,$h)\n";
 +                                $renderer->doc.="  \\rput($xp,-0.4){\\textsf{" . $value[0] . "}}\n";
 +                            }
 +                        # Events
 +                        $i = 0;
 +                        foreach ($this->lasse_events as $k => $value) {
 +                            $i++;
 +                            $xps = ($value[0] * $w / $this->lasse_days);
 +                            $xpe = ($value[1] * $w / $this->lasse_days);
 +                            $yp = $h - ($i - 0.5) * $this->pdf_bar_height;
 +                            $renderer->doc.="\\pcline[offset=0pt]{|-|}($xps,$yp)($xpe,$yp)\n";
 +                            if ($value[3] or $value[4]) {
 +                                if ($xpe - $xps > 3) {
 +                                    $renderer->doc.="\\lput*{:U}";
 +                                } else {
 +                                    if ($xps > $w / 3) {
 +                                        $renderer->doc.="\\rput[r]($xps,$yp)";
 +                                    } else {
 +                                        $renderer->doc.="\\rput[l]($xpe,$yp)";
 +                                    }
 +                                }
 +                                if ($value[4]) {
 +                                    $a = $value[4];
 +                                } else {
 +                                    $a = $value[3];
 +                                }
 +                                $renderer->doc.="{\\textsf{\\quad " . $a . "\\quad}}\n";
 +                            }
 +                            $renderer->doc.="";
 +                        }
 +                        // ----------------- Render Legend -----------------
 +                        $renderer->doc .= "\n\\end{pspicture*}\n";
 +                        if ($this->legend == 1) {
 +                            $renderer->doc.="\\begin{itemize}\n";
 +                            foreach ($this->lasse_events as $k => $value) {
 +                                $renderer->doc.="  \\dokuitem ";
 +                                if ($value[4]) {
 +                                    $renderer->doc.=$value[4];
 +                                } else {
 +                                    $renderer->doc.= ( $value[3] != "") ? $value[3] : "- ";
 +                                }
 +                                $renderer->doc.=": ";
 +                                $renderer->doc.=date(self::DATEFORMAT, strtotime($value[5]));
 +                                $renderer->doc.=" bis ";
 +                                $renderer->doc.=date(self::DATEFORMAT, strtotime($value[6]));
 +                                $renderer->doc.="\n";
 +                            }
 +                            $renderer->doc.="\\end{itemize}\n";
 +                        }
 +                        break;
 +                    }
 +            }
 +            return true;
 +        }
 +        return false;
 +    }
 +
 +}
 +
 +//Setup VIM: ex: et ts=4 enc=utf-8 :
 +?>
 +</code>
 +
plugin/timeline2.1304509238.txt.gz · Last modified: 2011-05-04 13:40 by 213.234.249.210