1 <?php
2 
3 use dokuwiki\Utf8\Clean;
4 use dokuwiki\Utf8\PhpString;
5 
6 /**
7  * A simple renderer that allows downloading of code and file snippets
8  *
9  * @author Andreas Gohr <andi@splitbrain.org>
10  */
11 class Doku_Renderer_code extends Doku_Renderer
12 {
13     protected $_codeblock = 0;
14 
15     /**
16      * Send the wanted code block to the browser
17      *
18      * When the correct block was found it exits the script.
19      *
20      * @param string $text
21      * @param string $language
22      * @param string $filename
23      */
24     public function code($text, $language = null, $filename = '')
25     {
26         global $INPUT;
27         if (!$language) $language = 'txt';
28         $language = preg_replace(PREG_PATTERN_VALID_LANGUAGE, '', $language);
29         if (!$filename) $filename = 'snippet.' . $language;
30         $filename = PhpString::basename($filename);
31         $filename = Clean::stripspecials($filename, '_');
32 
33         // send CRLF to Windows clients
34         if (strpos($INPUT->server->str('HTTP_USER_AGENT'), 'Windows') !== false) {
35             $text = str_replace("\n", "\r\n", $text);
36         }
37 
38         if ($this->_codeblock == $INPUT->str('codeblock')) {
39             header("Content-Type: text/plain; charset=utf-8");
40             header("Content-Disposition: attachment; filename=$filename");
41             header("X-Robots-Tag: noindex");
42             echo trim($text, "\r\n");
43             exit;
44         }
45 
46         $this->_codeblock++;
47     }
48 
49     /**
50      * Wraps around code()
51      *
52      * @param string $text
53      * @param string $language
54      * @param string $filename
55      */
56     public function file($text, $language = null, $filename = '')
57     {
58         $this->code($text, $language, $filename);
59     }
60 
61     /**
62      * This should never be reached, if it is send a 404
63      */
64     public function document_end()
65     {
66         http_status(404);
67         echo '404 - Not found';
68         exit;
69     }
70 
71     /**
72      * Return the format of the renderer
73      *
74      * @returns string 'code'
75      */
76     public function getFormat()
77     {
78         return 'code';
79     }
80 }
81