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