xref: /dokuwiki/inc/parser/code.php (revision ece4159b488ee81a13b9122239c88d82ec1aa59c)
13d491f75SAndreas Gohr<?php
23d491f75SAndreas Gohr/**
33d491f75SAndreas Gohr * A simple renderer that allows downloading of code and file snippets
43d491f75SAndreas Gohr *
53d491f75SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
63d491f75SAndreas Gohr */
73d491f75SAndreas Gohrif(!defined('DOKU_INC')) die('meh.');
83d491f75SAndreas Gohr
93d491f75SAndreas Gohrclass Doku_Renderer_code extends Doku_Renderer {
103d491f75SAndreas Gohr    var $_codeblock = 0;
113d491f75SAndreas Gohr
123d491f75SAndreas Gohr    /**
133d491f75SAndreas Gohr     * Send the wanted code block to the browser
143d491f75SAndreas Gohr     *
153d491f75SAndreas Gohr     * When the correct block was found it exits the script.
163d491f75SAndreas Gohr     */
170ea51e63SMatt Perry    function code($text, $language = null, $filename = '') {
18f0859d4bSTom N Harris        global $INPUT;
193d491f75SAndreas Gohr        if(!$language) $language = 'txt';
203d491f75SAndreas Gohr        if(!$filename) $filename = 'snippet.'.$language;
213009a773SAndreas Gohr        $filename = utf8_basename($filename);
222d3f0c16SAndreas Gohr        $filename = utf8_stripspecials($filename, '_');
233d491f75SAndreas Gohr
24*ece4159bSAndreas Gohr        // send CRLF to Windows clients
25*ece4159bSAndreas Gohr        if(strpos($INPUT->server->str('HTTP_USER_AGENT'), 'Windows') !== false) {
26*ece4159bSAndreas Gohr            $text = str_replace("\n", "\r\n", $text);
27*ece4159bSAndreas Gohr        }
28*ece4159bSAndreas Gohr
29f0859d4bSTom N Harris        if($this->_codeblock == $INPUT->str('codeblock')) {
303d491f75SAndreas Gohr            header("Content-Type: text/plain; charset=utf-8");
313d491f75SAndreas Gohr            header("Content-Disposition: attachment; filename=$filename");
323d491f75SAndreas Gohr            header("X-Robots-Tag: noindex");
333d491f75SAndreas Gohr            echo trim($text, "\r\n");
343d491f75SAndreas Gohr            exit;
353d491f75SAndreas Gohr        }
363d491f75SAndreas Gohr
373d491f75SAndreas Gohr        $this->_codeblock++;
383d491f75SAndreas Gohr    }
393d491f75SAndreas Gohr
403d491f75SAndreas Gohr    /**
413d491f75SAndreas Gohr     * Wraps around code()
423d491f75SAndreas Gohr     */
430ea51e63SMatt Perry    function file($text, $language = null, $filename = '') {
44f9d4952bSAndreas Gohr        $this->code($text, $language, $filename);
453d491f75SAndreas Gohr    }
463d491f75SAndreas Gohr
473d491f75SAndreas Gohr    /**
483d491f75SAndreas Gohr     * This should never be reached, if it is send a 404
493d491f75SAndreas Gohr     */
503d491f75SAndreas Gohr    function document_end() {
519d2e1be6SAndreas Gohr        http_status(404);
523d491f75SAndreas Gohr        echo '404 - Not found';
533d491f75SAndreas Gohr        exit;
543d491f75SAndreas Gohr    }
553d491f75SAndreas Gohr
563d491f75SAndreas Gohr    /**
573d491f75SAndreas Gohr     * Return the format of the renderer
583d491f75SAndreas Gohr     *
593d491f75SAndreas Gohr     * @returns string 'code'
603d491f75SAndreas Gohr     */
613d491f75SAndreas Gohr    function getFormat() {
623d491f75SAndreas Gohr        return 'code';
633d491f75SAndreas Gohr    }
643d491f75SAndreas Gohr}
65