summaryrefslogtreecommitdiff
path: root/platform/www/inc/Action/Export.php
blob: 6b46b276e9eeb18aa73da7984d5a45c37ba9c582 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php

namespace dokuwiki\Action;

use dokuwiki\Action\Exception\ActionAbort;
use dokuwiki\Extension\Event;

/**
 * Class Export
 *
 * Handle exporting by calling the appropriate renderer
 *
 * @package dokuwiki\Action
 */
class Export extends AbstractAction {

    /** @inheritdoc */
    public function minimumPermission() {
        return AUTH_READ;
    }

    /**
     * Export a wiki page for various formats
     *
     * Triggers ACTION_EXPORT_POSTPROCESS
     *
     *  Event data:
     *    data['id']      -- page id
     *    data['mode']    -- requested export mode
     *    data['headers'] -- export headers
     *    data['output']  -- export output
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     * @author Michael Klier <chi@chimeric.de>
     * @inheritdoc
     */
    public function preProcess() {
        global $ID;
        global $REV;
        global $conf;
        global $lang;

        $pre = '';
        $post = '';
        $headers = array();

        // search engines: never cache exported docs! (Google only currently)
        $headers['X-Robots-Tag'] = 'noindex';

        $mode = substr($this->actionname, 7);
        switch($mode) {
            case 'raw':
                $headers['Content-Type'] = 'text/plain; charset=utf-8';
                $headers['Content-Disposition'] = 'attachment; filename=' . noNS($ID) . '.txt';
                $output = rawWiki($ID, $REV);
                break;
            case 'xhtml':
                $pre .= '<!DOCTYPE html>' . DOKU_LF;
                $pre .= '<html lang="' . $conf['lang'] . '" dir="' . $lang['direction'] . '">' . DOKU_LF;
                $pre .= '<head>' . DOKU_LF;
                $pre .= '  <meta charset="utf-8" />' . DOKU_LF; // FIXME improve wrapper
                $pre .= '  <title>' . $ID . '</title>' . DOKU_LF;

                // get metaheaders
                ob_start();
                tpl_metaheaders();
                $pre .= ob_get_clean();

                $pre .= '</head>' . DOKU_LF;
                $pre .= '<body>' . DOKU_LF;
                $pre .= '<div class="dokuwiki export">' . DOKU_LF;

                // get toc
                $pre .= tpl_toc(true);

                $headers['Content-Type'] = 'text/html; charset=utf-8';
                $output = p_wiki_xhtml($ID, $REV, false);

                $post .= '</div>' . DOKU_LF;
                $post .= '</body>' . DOKU_LF;
                $post .= '</html>' . DOKU_LF;
                break;
            case 'xhtmlbody':
                $headers['Content-Type'] = 'text/html; charset=utf-8';
                $output = p_wiki_xhtml($ID, $REV, false);
                break;
            default:
                $output = p_cached_output(wikiFN($ID, $REV), $mode, $ID);
                $headers = p_get_metadata($ID, "format $mode");
                break;
        }

        // prepare event data
        $data = array();
        $data['id'] = $ID;
        $data['mode'] = $mode;
        $data['headers'] = $headers;
        $data['output'] =& $output;

        Event::createAndTrigger('ACTION_EXPORT_POSTPROCESS', $data);

        if(!empty($data['output'])) {
            if(is_array($data['headers'])) foreach($data['headers'] as $key => $val) {
                header("$key: $val");
            }
            print $pre . $data['output'] . $post;
            exit;
        }

        throw new ActionAbort();
    }

}