====== Extended Table Syntax TrueTable Plugin ====== ---- plugin ---- description: Parses extended tables (similar to simplified MediaWiki) author : Kuanysh K email : kuanyshk@google.com type : Syntax lastupdate : 2007-10-13 compatible : 2006-11-06 depends : conflicts : similar : exttab2 tags : MediaWiki, tables downloadurl: bugtracker : sourcerepo : donationurl: screenshot_img: ---- ===== About ===== TrueTable Plugin parse ALL DokuWiki syntax correctly within table. ===== Installation ===== * create the folder //lib/plugins/truetable// * and copy the source code to //lib/plugins/truetable/syntax.php// ===== Usage ===== Syntax (only in leftmost(!) position): {| <- !! <- |# <-
|| <- |- <-
# = [1-9] see below !# <- # = [1-9] see below |} <-
Horizontal & vertical alignment: # = [1-9] 7 8 9 ≡ top-left top-center top-right 4 5 6 ≡ middle-left middle-center middle-right 1 2 3 ≡ bottom-left bottom-center bottom-right See also [[https://www.mediawiki.org/wiki/Help:Tables|Help:Tables - MediaWiki]]. ===== Limits ===== Not supported elements: * HTML-attributes and CSS styles; * table's caption; * first row token (''%%{| ... |- ... ||%%'') * compact syntax (''%%| ... || ... ||%%'') * rowspan and colspan attributes ==== Nested tables ==== To be continued... ===== Sources ===== * !! <- * || <- * |- <- * |# <- # = [1-9] see below * !# <- # = [1-9] see below * |} <- * * Horizontal & vertical alignment: * # = [1-9] * 7 8 9 top-left top-center top-right * 4 5 6 = middle-left middle-center middle-right * 1 2 3 bottom-left bottom-center bottom-right * * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Kuanysh K * @date 2007-10-11 */ // 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_truetable extends DokuWiki_Syntax_Plugin { /** * return some info */ function getInfo() { return array ( 'author' => 'Kuanysh K', 'email' => 'kuanyshk@google.com', 'date' => '2007-10-11', 'name' => 'truetable Plugin', 'desc' => 'Parses extended tables (similar to simplified MediaWiki).', 'url' => 'https://www.dokuwiki.org/plugin:truetable' ); } /** * What kind of syntax are we? */ function getType() { return 'protected'; } /** * What kind of plugin are we? */ function getPType() { return 'block'; } function getAllowedTypes() { return array ( 'container', 'formatting', 'substition', 'disabled', 'protected', 'paragraphs' ); } function getSort() { return 55; } function accepts( $mode ) { if ( $mode == substr( get_class( $this ), 7 ) ) return true; return parent::accepts( $mode ); } /** * Connect pattern to lexer */ function connectTo( $mode ) { // {| $this->Lexer->addEntryPattern( "\{(?=\|)", $mode, 'plugin_truetable' ); // |} $this->Lexer->addEntryPattern( "\n\|(?=\})", $mode, 'plugin_truetable' ); $this->Lexer->addEntryPattern( "\|(?=\})", $mode, 'plugin_truetable' ); // |- $this->Lexer->addEntryPattern( "\n\|(?=\-)", $mode, 'plugin_truetable' ); // !! & !# $this->Lexer->addEntryPattern( "\n\!(?=[\!0-9])", $mode, 'plugin_truetable' ); // || & |# $this->Lexer->addEntryPattern( "\n\|(?=[\|0-9])", $mode, 'plugin_truetable' ); } function postConnect() { // {| $this->Lexer->addExitPattern( "\|", 'plugin_truetable' ); // |} $this->Lexer->addExitPattern( "\}", 'plugin_truetable' ); // ! $this->Lexer->addExitPattern( "\-", 'plugin_truetable' ); // # $this->Lexer->addExitPattern( "[1-9]", 'plugin_truetable' ); // |} $this->Lexer->addExitPattern( "\!", 'plugin_truetable' ); } /** * Handle the match */ function handle( $match, $state, $pos, &$handler ) { //error_log( $match ); switch( $state ) { case DOKU_LEXER_ENTER: return array( 'truetableOpen', $match ); break; case DOKU_LEXER_UNMATCHED: return array( 'truetableText', $match ); break; case DOKU_LEXER_MATCHED: return array(); break; case DOKU_LEXER_EXIT: return array( 'truetableClose', $match ); } return array(); } /** * Create output */ function render( $mode, &$renderer, $data ) { if ( $mode == 'xhtml' ) { list( $tag, $tagData ) = $data; switch ( $tag ) { case 'truetableOpen': $renderer->doc .= $this->_tagPrint( $tagData, true ); break; case 'truetableClose': $renderer->doc .= $this->_tagPrint( $tagData ); break; case 'truetableText': $renderer->doc .= $renderer->_xmlEntities( $tagData ); break; } return true; } return false; } // private methods function _tagPrint( $arg = '', $onlyPrepare = false ) { static $insideTable = false, $insideTR = false, $insideTH = false, $insideTD = false, // tell the difference between !# and |# when prepare $willTD = false, $willTH = false, $alignmentsList = array( '1' => 'class="leftalign" valign="bottom"', '2' => 'class="centeralign" valign="bottom"', '3' => 'class="rightalign" valign="bottom"', '4' => 'class="leftalign" valign="middle"', '5' => 'class="centeralign" valign="middle"', '6' => 'class="rightalign" valign="middle"', '7' => 'class="leftalign" valign="top"', '8' => 'class="centeralign" valign="top"', '9' => 'class="rightalign" valign="top"' ); $arg = trim( $arg ); $res = ''; // prepare if ( $onlyPrepare ) { switch( $arg ) { case '!': $willTH = true; break; case '|': $willTD = true; break; } return $res; } // print tags if ( $insideTH ) { $res .= DOKU_TAB . DOKU_TAB . '' . DOKU_LF; $insideTH = false; } else if ( $insideTD ) { $res .= DOKU_TAB . DOKU_TAB . '' . DOKU_LF; $insideTD = false; } switch( $arg ) { // {| // || case '|': if ( $insideTable ) // || { $res .= DOKU_TAB . DOKU_TAB . '' . DOKU_LF; $insideTD = true; } else { $res .= '' .DOKU_LF; $res .= DOKU_TAB . '' .DOKU_LF; $insideTable = true; $insideTR = true; } break; // |} case '}': $res .= DOKU_TAB . '' .DOKU_LF; $res .= '
' .DOKU_LF; $insideTable = false; $insideTR = false; break; // |- case '-': $res .= DOKU_TAB . '' . DOKU_LF; break; // !! case '!': $res .= DOKU_TAB . DOKU_TAB . '' . DOKU_LF; $insideTH = true; break; // !# & |# case '7': case '8': case '9': case '4': case '5': case '6': case '1': case '2': case '3': if ( $willTH ) { $res .= DOKU_TAB . DOKU_TAB . '' . DOKU_LF; $insideTH = true; } else if ( $willTD ) { $res .= DOKU_TAB . DOKU_TAB . '' . DOKU_LF; $insideTD = true; } break; } $willTD = false; $willTH = false; return $res; } } ?>
===== Discussion ===== As great as this plugin is, it causes problems when trying to tabulate numerical data using DokuWiki's standard table notation, eg: ^ 999 ^ 20 ^ 50 ^ | 123 | 765 | 252 | | 44 | 458 | 8548 | | 58 | | | Putting alphabetical characters in front of the numbers displays the table correctly. Would it be possible to only enable it for content between the ''%%{|%%'' and ''%%|}%%'' tags. Thanks, Bob 10-Apr-08 Solved it myself by including a space before the numeric data :-D