markupend',
"/\\(:source(\\s+.*?)?\\s*:\\)[^\\S\n]*\\[([=@])(.*?)\\2\\]/sei",
"SourceBlock(\$pagename, PSS('$1'), PSS('$3'))");
Markup('sourceblockend', '>sourceblock',
"/\\(:source(\\s+.*?)?\\s*:\\)[^\\S\n]*\n(.*?)\\(:sourcee?nd:\\)/sei",
"SourceBlock(\$pagename, PSS('$1'), PSS('$2'))");
Markup('codeblock', '>markupend',
"/\\(:code(\\s+.*?)?\\s*:\\)[^\\S\n]*\\[([=@])(.*?)\\2\\]/sei",
"CodeBlock(\$pagename, PSS('$1'), PSS('$3'))");
Markup('codeblockend', '>codeblock',
"/\\(:code(\\s+.*?)?\\s*:\\)[^\\S\n]*\n(.*?)\\(:codee?nd:\\)/sei",
"CodeBlock(\$pagename, PSS('$1'), PSS('$2'))");
function HandleSourceBlock($pagename) {
global $HandleBrowseFmt;
$HandleBrowseFmt = '';
HandleBrowse($pagename);
return;
}
function ManageSourceBlockHandling($pagename, &$opt, &$block) {
global $PCache, $action, $SourceBlockAction, $SourceBlockLinkUrl,
$SourceBlockLinkText;
SDV($PCache[$pagename]['sourceblock'], 0);
$ref = ++$PCache[$pagename]['sourceblock'];
if ($action == $SourceBlockAction && ($ref == $_REQUEST['ref'] || ( isset($opt['filename']) && $opt['filename']== $_REQUEST['ref'])) ) {
# undo PmWiki's htmlspecialchars conversion
if (isset($opt['load'])) {
$block = @file_get_contents($opt['load']);
if ($block===false) {
$block = "PmWiki ERROR: file $opt[load] was not found";
}
} else {
$block = str_replace(array('<:vspace>', '<', '>', '&'),
array('', '<', '>', '&'), $block);
}
$filename = isset($opt['filename']) ?
$opt['filename'] : "sourceblock_{$ref}.txt";
$type = 'text/plain';
$disp = @in_array('attach', $opt['-']) ? 'attachment' : 'inline';
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) {
$type = 'application/octet-stream';
$disp = 'attachment';
}
header("Content-type: $type");
header("Content-disposition: $disp; filename=$filename");
header('Content-Length: ' . strlen($block));
echo $block;
exit(0);
}
SDV($SourceBlockLinkUrl, "\$LinkText");
SDV($SourceBlockLinkText, "[$[Get Code]]");
return MakeLink($pagename,
"{$pagename}?action={$SourceBlockAction}&ref={$ref}",
$SourceBlockLinkText, NULL, $SourceBlockLinkUrl);
}
function CodeBlock($pagename, $args, $block) {
global $CodeBlockHeaderFmt, $CodeBlockFooterFmt, $HTMLStylesFmt;
$opt = ParseArgs($args);
$Url = ManageSourceBlockHandling($pagename, $opt, $block);
$txt = isset($opt['wrap']) ? wordwrap($block, $opt['wrap']) : $block;
SDV($CodeBlockHeaderFmt, "
\$Url
");
SDV($CodeBlockFooterFmt, "
");
SDV($HTMLStylesFmt['codeblock'], "
.codeblocklink {
text-align: right;
font-size: smaller;
}
.codeblocktext {
text-align: left;
padding: 0.5em;
border: 1px solid #808080;
background-color: #f1f0ed;
}
.codeblocktext pre {
font-family: monospace;
font-size: small;
line-height: 1;
}\n");
return '<:block>'.Keep(eval("return (\"$CodeBlockHeaderFmt\");") . $txt .
eval("return (\"$CodeBlockFooterFmt\");"));
}
function SourceBlock($pagename, $args, $block) {
global $SourceBlockParams, $GESHI_PATH, $HTMLStylesFmt, $GeshiStyles,
$SourceBlockHeaderFmt, $SourceBlockFooterFmt;
SDVA($SourceBlockParams, array(
'header' => '',
'footer' => '',
));
$opt = array_merge((array)$SourceBlockParams, ParseArgs($args));
$Url = ManageSourceBlockHandling($pagename, $opt, $block);
if(!@in_array('trim', $opt['-'])) $block = trim($block);
if($opt['lang']) {
SDV($GESHI_PATH, dirname(__FILE__) . "/geshi");
include_once($GESHI_PATH . "/geshi.php");
# undo PmWiki's htmlspecialchars conversion
if (isset($opt['load'])) {
$block = @file_get_contents($opt['load']);
if ($block===false) {
$block = "PmWiki ERROR: file $opt[load] was not found";
}
} else {
$block = str_replace(array('<:vspace>', '<', '>', '&'),
array('', '<', '>', '&'), $block);
}
$geshi =& new GeSHi($block, $opt['lang'], $GESHI_PATH . "/geshi");
$geshi->enable_classes();
SDVA($GeshiStyles, array(
'code' => 'font-family: monospace; font-weight: normal;',
'line1' => 'font-family: monospace; color: black; font-weight: normal;',
'line2' => 'font-weight: bold;',
));
$geshi->set_code_style($GeshiStyles['code']);
$geshi->set_line_style($GeshiStyles['line1'], $GeshiStyles['line2']);
$geshi->set_header_type(GESHI_HEADER_DIV);
if ($opt['tabwidth']) $geshi->set_tab_width($opt['tabwidth']);
if (@in_array('linenum', $opt['']))
$geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS);
if ($opt['linenum']) {
$geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS);
$geshi->start_line_numbers_at($opt['linenum']);
}
if($opt['highlight']) {
$geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS);
$geshi->highlight_lines_extra(preg_split("/[\s,]+/", $opt['highlight']));
}
$geshi->set_header_content($opt['header']);
$geshi->set_footer_content($opt['footer']);
if ($opt['id']) $geshi->set_overall_id($opt['id']);
$HTMLStylesFmt['geshi_'.$opt['lang']] = $geshi->get_stylesheet();
$txt = $geshi->parse_code();
if($geshi->error()) $txt = $geshi->error();
} else {
$lines = explode("\n", $block);
$count = count($lines);
if(@in_array('linenum', $opt[''])) $linenum = "";
elseif ($opt['linenum']) $linenum = "";
for ($i = 0; $i < $count; $i++)
$txt .= ($linenum ? "- " : "") . $lines[$i] . ($linenum ? "
" : "
");
$txt = "{$linenum}{$txt}" . ($linenum ? "" : "") . "
";
}
SDV($HTMLStylesFmt['sourceblock'], "
.sourceblocklink {
text-align: right;
font-size: smaller;
}
.sourceblocktext {
padding: 0.5em;
border: 1px solid #808080;
background-color: #f1f0ed;
}
.sourceblocktext div {
font-family: monospace;
font-size: small;
line-height: 1;
height: 1%;
}
.sourceblocktext div.head,
.sourceblocktext div.foot {
font: italic medium serif;
padding: 0.5em;
}\n");
SDV($SourceBlockHeaderFmt, "
\$Url
");
SDV($SourceBlockFooterFmt, "
");
return '<:block>'.Keep(eval("return (\"$SourceBlockHeaderFmt\");") . $txt .
eval("return (\"$SourceBlockFooterFmt\");"));
}