diff options
author | Andreas Gohr <andi@splitbrain.org> | 2009-07-26 19:51:58 +0200 |
---|---|---|
committer | Andreas Gohr <andi@splitbrain.org> | 2009-07-26 19:51:58 +0200 |
commit | 3d491f758802dd2376dddd5d001765b940b08743 (patch) | |
tree | a9b27250e2e19c33ad52c63e1e642924be03b5bc /inc/parser | |
parent | a6783fdb13cb5cc9b0225cb1ea1ac8c028a775da (diff) | |
download | rpg-3d491f758802dd2376dddd5d001765b940b08743.tar.gz rpg-3d491f758802dd2376dddd5d001765b940b08743.tar.bz2 |
enhanced <code> and <file> syntax
Ignore-this: 80398f84222bec1fce56eee8f107d37a
This patch enhances the code and file syntax with several new features.
1. code and file are now essentially the same and just differ in the class
name. This means you now can use the file syntax with syntax highlighting
as well. This also solves problems where the code to highlight already
contains a <code> tag (FS#1493)
2. a filename can be given as label for the code or file block. It is
specified as second parameter after the language:
<code html myfile.html>...</code>
If no highlighting is wanted, but a filename shall be given, you can use
a dash as language:
<code - somefile.foo>...</code>
3. when a filename was given (as shown above), the label links to a
download of the code given in the code/file block. This is made possible
by a new renderer in inc/parser/code.php. The basename of given filename
is suggested as filename when downloading.
darcs-hash:20090726175158-7ad00-969641a06ae1393a6d99207c3cd938fb67f23a71.gz
Diffstat (limited to 'inc/parser')
-rw-r--r-- | inc/parser/code.php | 58 | ||||
-rw-r--r-- | inc/parser/handler.php | 46 | ||||
-rw-r--r-- | inc/parser/parser.php | 2 | ||||
-rw-r--r-- | inc/parser/renderer.php | 6 | ||||
-rw-r--r-- | inc/parser/xhtml.php | 47 |
5 files changed, 122 insertions, 37 deletions
diff --git a/inc/parser/code.php b/inc/parser/code.php new file mode 100644 index 000000000..d2bcf7d42 --- /dev/null +++ b/inc/parser/code.php @@ -0,0 +1,58 @@ +<?php +/** + * A simple renderer that allows downloading of code and file snippets + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +if(!defined('DOKU_INC')) die('meh.'); +require_once DOKU_INC . 'inc/parser/renderer.php'; + +class Doku_Renderer_code extends Doku_Renderer { + var $_codeblock=0; + + /** + * Send the wanted code block to the browser + * + * When the correct block was found it exits the script. + */ + function code($text, $language = NULL, $filename='' ) { + if(!$language) $language = 'txt'; + if(!$filename) $filename = 'snippet.'.$language; + $filename = basename($filename); + + if($this->_codeblock == $_REQUEST['codeblock']){ + header("Content-Type: text/plain; charset=utf-8"); + header("Content-Disposition: attachment; filename=$filename"); + header("X-Robots-Tag: noindex"); + echo trim($text,"\r\n"); + exit; + } + + $this->_codeblock++; + } + + /** + * Wraps around code() + */ + function file($text) { + $this->code($text); + } + + /** + * This should never be reached, if it is send a 404 + */ + function document_end() { + header("HTTP/1.0 404 Not Found"); + echo '404 - Not found'; + exit; + } + + /** + * Return the format of the renderer + * + * @returns string 'code' + */ + function getFormat(){ + return 'code'; + } +} diff --git a/inc/parser/handler.php b/inc/parser/handler.php index 83f837b70..58b68bc42 100644 --- a/inc/parser/handler.php +++ b/inc/parser/handler.php @@ -323,13 +323,6 @@ class Doku_Handler { return true; } - function file($match, $state, $pos) { - if ( $state == DOKU_LEXER_UNMATCHED ) { - $this->_addCall('file',array($match), $pos); - } - return true; - } - function quote($match, $state, $pos) { switch ( $state ) { @@ -360,23 +353,28 @@ class Doku_Handler { return true; } - function code($match, $state, $pos) { - switch ( $state ) { - case DOKU_LEXER_UNMATCHED: - $matches = explode('>',$match,2); - $matches[0] = trim($matches[0]); - if ( trim($matches[0]) == '' ) { - $matches[0] = NULL; - } - # $matches[0] contains name of programming language - # if available, We shortcut html here. - if($matches[0] == 'html') $matches[0] = 'html4strict'; - $this->_addCall( - 'code', - array($matches[1],$matches[0]), - $pos - ); - break; + function file($match, $state, $pos) { + return $this->code($match, $state, $pos, 'file'); + } + + function code($match, $state, $pos, $type='code') { + if ( $state == DOKU_LEXER_UNMATCHED ) { + $matches = explode('>',$match,2); + $matches[0] = trim($matches[0]); + + list($language,$filename) = explode(' ',$matches[0],2); + $language = trim($language); + $filename = trim($filename); + if ( $language == '' ) $language = null; + if ( $language == '-' ) $language = null; + if ( $filename == '' ) $filename = null; + # We shortcut html here. + if($language == 'html') $language = 'html4strict'; + $this->_addCall( + $type, + array($matches[1],$language,$filename), + $pos + ); } return true; } diff --git a/inc/parser/parser.php b/inc/parser/parser.php index 491206b81..773d9d4d5 100644 --- a/inc/parser/parser.php +++ b/inc/parser/parser.php @@ -561,7 +561,7 @@ class Doku_Parser_Mode_code extends Doku_Parser_Mode { class Doku_Parser_Mode_file extends Doku_Parser_Mode { function connectTo($mode) { - $this->Lexer->addEntryPattern('<file>(?=.*</file>)',$mode,'file'); + $this->Lexer->addEntryPattern('<file(?=.*</file>)',$mode,'file'); } function postConnect() { diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php index bd2b5043a..94aa5c67b 100644 --- a/inc/parser/renderer.php +++ b/inc/parser/renderer.php @@ -161,13 +161,13 @@ class Doku_Renderer extends DokuWiki_Plugin { function preformatted($text) {} - function file($text) {} - function quote_open() {} function quote_close() {} - function code($text, $lang = NULL) {} + function file($text, $lang = null, $file = null ) {} + + function code($text, $lang = null, $file = null ) {} function acronym($acronym) {} diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php index 5a1c1893b..3137281e7 100644 --- a/inc/parser/xhtml.php +++ b/inc/parser/xhtml.php @@ -36,7 +36,8 @@ class Doku_Renderer_xhtml extends Doku_Renderer { var $node = array(0,0,0,0,0); var $store = ''; - var $_counter = array(); // used as global counter, introduced for table classes + var $_counter = array(); // used as global counter, introduced for table classes + var $_codeblock = 0; // counts the code and file blocks, used to provide download links function getFormat(){ return 'xhtml'; @@ -358,11 +359,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } function preformatted($text) { - $this->doc .= '<pre class="code">' . trim($this->_xmlEntities($text),"\n\r") . '</pre>'. DOKU_LF; + $this->doc .= '<pre class="code">' . trim($this->_xmlEntities($text)) . '</pre>'. DOKU_LF; } function file($text) { - $this->doc .= '<pre class="file">' . trim($this->_xmlEntities($text),"\n\r"). '</pre>'. DOKU_LF; + $this->doc .= '<pre class="file">' . trim($this->_xmlEntities($text)). '</pre>'. DOKU_LF; } function quote_open() { @@ -373,21 +374,49 @@ class Doku_Renderer_xhtml extends Doku_Renderer { $this->doc .= '</div></blockquote>'.DOKU_LF; } + function preformatted($text) { + $this->doc .= '<pre class="'.$class.'">' . trim($this->_xmlEntities($text)) . '</pre>'. DOKU_LF; + } + + function file($text, $language=null, $filename=null) { + $this->_highlight('file',$text,$language,$filename); + } + + function code($text, $language=null, $filename=null) { + $this->_highlight('code',$text,$language,$filename); + } + /** - * Callback for code text - * - * Uses GeSHi to highlight language syntax + * Use GeSHi to highlight language syntax in code and file blocks * * @author Andreas Gohr <andi@splitbrain.org> */ - function code($text, $language = NULL) { + function _highlight($type, $text, $language=null, $filename=null) { global $conf; + global $ID; + global $lang; + + if($filename){ + $this->doc .= '<dl class="'.$type.'">'.DOKU_LF; + $this->doc .= '<dt><a href="'.exportlink($ID,'code',array('codeblock'=>$this->_codeblock)).'" title="'.$lang['download'].'">'; + $this->doc .= hsc($filename); + $this->doc .= '</a></dt>'.DOKU_LF.'<dd>'; + } if ( is_null($language) ) { - $this->preformatted($text); + $this->doc .= '<pre class="'.$type.'">'.$this->_xmlEntities($text).'</pre>'.DOKU_LF; } else { - $this->doc .= p_xhtml_cached_geshi($text, $language); + $class = 'code'; //we always need the code class to make the syntax highlighting apply + if($type != 'code') $class .= ' '.$type; + + $this->doc .= "<pre class=\"$class $language\">".p_xhtml_cached_geshi($text, $language, '').'</pre>'.DOKU_LF; + } + + if($filename){ + $this->doc .= '</dd></dl>'.DOKU_LF; } + + $this->_codeblock++; } function acronym($acronym) { |