xref: /dokuwiki/inc/Action/Export.php (revision 3dc2d50c5fda9c4bf708ff4c26e266ba239af62c)
1<?php
2
3namespace dokuwiki\Action;
4
5use dokuwiki\Action\Exception\ActionAbort;
6
7/**
8 * Class Export
9 *
10 * Handle exporting by calling the appropriate renderer
11 *
12 * @package dokuwiki\Action
13 */
14class Export extends AbstractAction {
15
16    /** @inheritdoc */
17    public function minimumPermission() {
18        return AUTH_READ;
19    }
20
21    /**
22     * Export a wiki page for various formats
23     *
24     * Triggers ACTION_EXPORT_POSTPROCESS
25     *
26     *  Event data:
27     *    data['id']      -- page id
28     *    data['mode']    -- requested export mode
29     *    data['headers'] -- export headers
30     *    data['output']  -- export output
31     *
32     * @author Andreas Gohr <andi@splitbrain.org>
33     * @author Michael Klier <chi@chimeric.de>
34     * @inheritdoc
35     */
36    public function preProcess() {
37        global $ID;
38        global $REV;
39        global $conf;
40        global $lang;
41
42        $pre = '';
43        $post = '';
44        $headers = array();
45
46        // search engines: never cache exported docs! (Google only currently)
47        $headers['X-Robots-Tag'] = 'noindex';
48
49        $mode = substr($this->actionname, 7);
50        switch($mode) {
51            case 'raw':
52                $headers['Content-Type'] = 'text/plain; charset=utf-8';
53                $headers['Content-Disposition'] = 'attachment; filename=' . noNS($ID) . '.txt';
54                $output = rawWiki($ID, $REV);
55                break;
56            case 'xhtml':
57                $pre .= '<!DOCTYPE html>' . DOKU_LF;
58                $pre .= '<html lang="' . $conf['lang'] . '" dir="' . $lang['direction'] . '">' . DOKU_LF;
59                $pre .= '<head>' . DOKU_LF;
60                $pre .= '  <meta charset="utf-8" />' . DOKU_LF; // FIXME improve wrapper
61                $pre .= '  <title>' . $ID . '</title>' . DOKU_LF;
62
63                // get metaheaders
64                ob_start();
65                tpl_metaheaders();
66                $pre .= ob_get_clean();
67
68                $pre .= '</head>' . DOKU_LF;
69                $pre .= '<body>' . DOKU_LF;
70                $pre .= '<div class="dokuwiki export">' . DOKU_LF;
71
72                // get toc
73                $pre .= tpl_toc(true);
74
75                $headers['Content-Type'] = 'text/html; charset=utf-8';
76                $output = p_wiki_xhtml($ID, $REV, false);
77
78                $post .= '</div>' . DOKU_LF;
79                $post .= '</body>' . DOKU_LF;
80                $post .= '</html>' . DOKU_LF;
81                break;
82            case 'xhtmlbody':
83                $headers['Content-Type'] = 'text/html; charset=utf-8';
84                $output = p_wiki_xhtml($ID, $REV, false);
85                break;
86            default:
87                $output = p_cached_output(wikiFN($ID, $REV), $mode, $ID);
88                $headers = p_get_metadata($ID, "format $mode");
89                break;
90        }
91
92        // prepare event data
93        $data = array();
94        $data['id'] = $ID;
95        $data['mode'] = $mode;
96        $data['headers'] = $headers;
97        $data['output'] =& $output;
98
99        trigger_event('ACTION_EXPORT_POSTPROCESS', $data);
100
101        if(!empty($data['output'])) {
102            if(is_array($data['headers'])) foreach($data['headers'] as $key => $val) {
103                header("$key: $val");
104            }
105            print $pre . $data['output'] . $post;
106            exit;
107        }
108
109        throw new ActionAbort();
110    }
111
112}
113