1<?php 2/** 3 * ODT (Open Document format) export for Exttab3 plugin 4 * 5 * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6 * @author Lars (LarsDW223) 7 */ 8 9if (!defined('DOKU_INC')) die(); 10 11class helper_plugin_exttab3_odt extends DokuWiki_Plugin 12{ 13 public function render(Doku_Renderer $renderer, $data) 14 { 15 $properties = array(); 16 17 // Return if installed ODT plugin version is too old. 18 if ( method_exists($renderer, 'getODTProperties') == false 19 || method_exists($renderer, '_odtTableAddColumnUseProperties') == false 20 ) { 21 return false; 22 } 23 24 //list($tag, $state, $match) = $data; 25 list($state, $tag, $attr) = $data; 26 27 // Get style content 28 $style = ''; 29 if (preg_match('/style=".*"/', $attr, $matches) === 1) { 30 $style = substr($matches[0], 6); 31 $style = trim($style, ' "'); 32 } 33 $rowspan = 1; 34 if (preg_match('/rowspan[ ]*=[ ]*"([0-9]*)"/', $attr, $matches) === 1) { 35 $rowspan = $matches[1]; 36 } 37 $colspan = 1; 38 if (preg_match('/colspan[ ]*=[ ]*"([0-9]*)"/', $attr, $matches) === 1) { 39 $colspan = $matches[1]; 40 } 41 42 // class to get CSS Properties by $render->getODTProperties() 43 $class = 'exttable'; 44 45 switch ($state) { 46 case DOKU_LEXER_ENTER: // open tag 47 if (!class_exists('ODTDocument')) { 48 // Code for backwards compatibility to older ODT versions 49 // Get CSS properties for ODT export. 50 $renderer->getODTProperties($properties, $tag, $class, $style); 51 52 switch ($tag) { 53 case 'table': 54 $renderer->_odtTableOpenUseProperties($properties); 55 break; 56 case 'caption': 57 // There is no caption in ODT table format. 58 // So we emulate it by creating a header row spaning over all columns. 59 $renderer->_odtTableRowOpenUseProperties($properties); 60 61 // Parameter 'colspan=0' indicates span across all columns! 62 $renderer->_odtTableHeaderOpenUseProperties($properties, 0, $rowspan); 63 break; 64 case 'th': 65 $renderer->_odtTableHeaderOpenUseProperties($properties); 66 $renderer->_odtTableAddColumnUseProperties($properties); 67 break; 68 case 'tr': 69 $renderer->_odtTableRowOpenUseProperties($properties); 70 break; 71 case 'td': 72 $renderer->_odtTableCellOpenUseProperties($properties); 73 break; 74 } 75 } else { 76 switch ($tag) { 77 case 'table': 78 $renderer->_odtTableOpenUseCSS(null, null, $tag, $attr); 79 break; 80 case 'caption': 81 // There is no caption in ODT table format. 82 // So we emulate it by creating a header row spaning over all columns. 83 $renderer->_odtTableRowOpenUseCSS($tag, $attr); 84 85 // Parameter 'colspan=0' indicates span across all columns! 86 $renderer->_odtTableHeaderOpenUseCSS(0, $rowspan, $tag, $attr); 87 break; 88 case 'th': 89 $renderer->_odtTableHeaderOpenUseCSS($colspan, $rowspan, $tag, $attr); 90 break; 91 case 'tr': 92 $renderer->_odtTableRowOpenUseCSS($tag, $attr); 93 break; 94 case 'td': 95 $renderer->_odtTableCellOpenUseCSS($colspan, $rowspan, $tag, $attr); 96 break; 97 } 98 } 99 break; 100 case DOKU_LEXER_MATCHED: // defensive, shouldn't occur 101 break; 102 case DOKU_LEXER_UNMATCHED: 103 $renderer->cdata($tag); 104 break; 105 case DOKU_LEXER_EXIT: // close tag 106 switch ($tag) { 107 case 'table': 108 //$renderer->table_close(); 109 $renderer->_odtTableClose(); 110 break; 111 case 'caption': 112 $renderer->tableheader_close(); 113 $renderer->tablerow_close(); 114 break; 115 case 'th': 116 $renderer->tableheader_close(); 117 break; 118 case 'tr': 119 $renderer->tablerow_close(); 120 break; 121 case 'td': 122 $renderer->p_close(); 123 $renderer->tablecell_close(); 124 break; 125 } 126 break; 127 } 128 } 129} 130