xref: /plugin/extab4/helper/odt.php (revision 130610123883ed7f05e8bd8870234d2e32d88403) !
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