*/
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
if(!defined('DOKU_DATA')) define('DOKU_DATA',DOKU_INC.'data/pages/');
require_once(DOKU_PLUGIN.'syntax.php');
require_once(DOKU_INC.'inc/parser/xhtml.php');
require_once(DOKU_INC.'inc/parser/renderer.php');
include_once(DOKU_INC.'inc/geshi.php');
/**
* All DokuWiki plugins to extend the parser/rendering mechanism
* need to inherit from this class
*/
class syntax_plugin_xssnipper extends DokuWiki_Syntax_Plugin {
/******************************************************************************/
/* return some info
*/
function getInfo(){
return confToHash(dirname(__FILE__).'/plugin.info.txt');
}
function getType(){ return 'substition';}
function getPType(){ return 'block';}
function getSort(){ return 999;}
/******************************************************************************/
/* Connect pattern to lexer
*/
function connectTo($mode){
$this->Lexer->addSpecialPattern('\{\(xssnipper\>.*?\)\}',$mode,'plugin_xssnipper');
}
/******************************************************************************/
/* handle the match
*/
function handle($match, $state, $pos, Doku_Handler &$handler) {
global $ID;
$match = substr($match,strlen('{(xssnipper>'),-2); //strip markup from start and end
//handle params
$data = array();
/******************************************************************************/
/* parameters can be:
{(xssnipper>[file path],[from line],[to line],[type])}
[file path] ... path to the file (either it is in DokuWiki media directory or windows fileshare, etc.)
[from line] ... the first line, which should be displayed
[to line] ... the last line, which should be displayed
[type] [file] ... the type of content to tell the syntax higlighter how to interprete and set colors
and pass a file for download the code block
/******************************************************************************/
$params = explode(",",$match); // if you will have more parameters and choose ',' to delim them
if (!$params) {
msg('Syntax of xssnipper detected but parameter missing.', -1);
}
elseif($params[0] == ''){
// 0 1 2 3
// {(xssnipper>,[start line],[type] [file],[content])}
$params = explode(",",$match,4);
$xssnipper = array();
$xssnipper['filepath'] = '';
$xssnipper['from'] = $params[1];
$alpha = explode(' ',$params[2]);
$xssnipper['type'] = $alpha[0];
$xssnipper['file'] = $alpha[1];
$xssnipper['block'] = $alpha[2];
$xssnipper['code'] = $params[3];
}
else {
// Values
$xssnipper = array();
$xssnipper['filepath'] = $params[0];
$xssnipper['from'] = $params[1];
$xssnipper['until'] = $params[2];
$alpha = explode(' ',$params[3]);
$xssnipper['type'] = $alpha[0];
$xssnipper['file'] = $alpha[1];
$xssnipper['block'] = $alpha[2];
}
return $xssnipper;
}
/******************************************************************************/
/* render output
* @author Taggic
*/
function render($mode, Doku_Renderer &$renderer, $xssnipper) {
global $ID;
if(!$xssnipper['type']) $xssnipper['type']='txt';
if($this->_codeblock<1) $this->_codeblock=1;
if($xssnipper['filepath']=='') {
$code_lines = $xssnipper['code'];
}
else {
if(!$xssnipper['file']) $xssnipper['file']= basename($xssnipper['filepath']);
if(!$xssnipper['file']) $xssnipper['file']='snippet.'.$xssnipper['type'];
// 1. check if $xssnipper['filepath'] exist, else error message
if(!file_exists($xssnipper['filepath'])) {
msg('file '.$xssnipper['filepath'].' not found',-1);
return false;
}
// 2. open the file in read mode
$records = file($xssnipper['filepath']);
// 3. load the file content from line = $xssnipper['from'] , to line = $xssnipper['until'] into $code_lines
if(!$xssnipper['until']) $xssnipper['until']=count($records);
foreach ($records as $line_num => $line) {
if(($line_num>=$xssnipper['from']-1) && ($line_num<=$xssnipper['until']-2))
$code_lines .= $line;
if ($line_num>$xssnipper['until']) break;
}
}
$geshi = new GeSHi($code_lines, $xssnipper['type']);
$geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS);
$geshi->set_overall_class('xssnipper');
$geshi->set_header_type(GESHI_HEADER_DIV);
// $geshi->set_header_type(GESHI_HEADER_PRE_TABLE);
$geshi->start_line_numbers_at($xssnipper['from']);
$xs_path = '?do=export_code&id='.$ID;
$text = $geshi->parse_code();
$code_block .= NL.NL.'
-
'.$xssnipper['file'].'
';
// returns the javascript function for clip-clap of block if downloadblock is used
$clipclap_flag = false;
if($xssnipper['block']) {
$code_block .= '
'.$this->__scripts_html();
$clipclap_id = microtime();
$img_ID = 'img_'.$clipclap_id;
$clipclap_img .= ''.NL;
$code_block .= ''.NL;
$clipclap_flag = true;
}
$code_block .= '- '.$code_lines.'
'.$text.NL;
if($clipclap_flag == true) {
$code_block .= ''.NL;
$code_block .= ''.NL;
}
$code_block .= '
'.NL;
$renderer->doc .= $code_block;
if($this->_codeblock == $_REQUEST['codeblock']){
header("Content-Type: text/plain; charset=utf-8");
header("Content-Disposition: attachment; filename=".trim($xssnipper['file']));
header("X-Robots-Tag: noindex");
header("Pragma: public");
echo trim($code_lines,"\r\n");
exit;
}
$this->_codeblock++;
}
/******************************************************************************/
function __scripts_html() {
$ret .= ''.NL;
return $ret;
}
}
?>