デリゲートでBBCodeの拡張を Part2
このブログで、PHPのソースを紹介する時、以前は、WordPressのプラグインをつかって、色分けされたソースを表示していました。
しかしながら、同様のことはXOOPSのDelegateを使用しても実現出来ます。少し前の投稿からこのDelegateによって拡張したBBCodeの[phpsrc]タグを使用するように変更しました。
以下のソースをCustomSanitizer.class.phpというファイル名で/preloadディレクトリに置くことによって、3つの新しいタグが使用出来るようになります。
・[siteimg][/siteimg]:[url]タグに対する[siteurl] タグと同様の働きをするものを
[img]タグに適用したものです。
・[phpsrc][/phpsrc]: PHPのソースファイルの内容をそのまま表示するときに使用します。
・[phpcode][/phpcode]: PHPのソースの断片を表示するときに使用します。
<?php
class CustomSanitizer extends XCube_ActionFilter
{
function preBlockFilter() {
$this->mController->mRoot->mDelegateManager->add("MyTextSanitizer.XoopsCodePre",array(&$this,"BBCodePre"));
}
function BBCodePre(&$patterns, &$replacements, $allowimage) {
// Replacement rules for [siteimg] tag
$patterns[] = "/\[siteimg align=(['\"]?)(left|center|right)\\1]([^\"\(\)\?\&'<>]*)\[\/siteimg\]/sU";
$patterns[] = "/\[siteimg]([^\"\(\)\?\&'<>]*)\[\/siteimg\]/sU";
if( $allowimage ) {
$replacements[] = '<img src="'.XOOPS_URL.'/\\3" align="\\2" alt="" />';
$replacements[] = '<img src="'.XOOPS_URL.'/\\1" alt="" />';
} else {
$replacements[] = '<a href"'.XOOPS_URL.'/\\3" target="_blank">'.XOOPS_URL.'/\\3</a>';
$replacements[] = '<a href"'.XOOPS_URL.'/\\1" target="_blank">'.XOOPS_URL.'/\\1</a>';
}
$patterns[] = '/\[phpcode\](.*?)\[\/phpcode\]/es';
$replacements[] = "CustomSanitizer::phpSource('\\1',true);";
$patterns[] = '/\[phpsrc\](.*?)\[\/phpsrc\]/es';
$replacements[] = "CustomSanitizer::phpSource('\\1',false);";
}
function phpSource($text,$tag=false) {
$maxlines = 30;
$maxwidth = "85%";
$text =str_replace(array('\"'),array('"'),$text);
if (!preg_match('/[<>"\']+/',$text)) {
$text =str_replace(array('>','<','"','''),array('>','<','"',"'"),$text);
}
$text = trim($text);
$linecount = count(explode("\n",$text))+1;
$text = preg_replace("/\r\n/","\n",$text);
if ($linecount > $maxlines) {
$linecount = $maxlines + 0.5;
}
if ($tag) {
$text = highlight_string("<?php\n".$text."\n?>", true);
$text = preg_replace('/(<font color="#0000BB">)<\?php<br \/>/','$1',$text);
$text = str_replace("<font color=\"#0000BB\">?></font>\n",'',$text);
} else {
$text = highlight_string($text, true);
}
$text = str_replace("<code><font color=\"#000000\">\n",'<code><font color="#000000">',$text);
return '<div class="phpsource" style="padding:0.0em 10px 0.1em 10px;margin: 5px 10px 5px 20px;font-size:12px;line-height:1.2;height:'.$linecount*1.2.'em;width:'.$maxwidth.';max-width:'.$maxwidth.';overflow:auto;">'.$text.'</div>';
}
}
?>
どうぞ、お試しあれ!
実は、同様の拡張を、xoopscube.orgにてwanikooさんが公開されています。
が・・・一部のソースがhtmlspecialcharsがかかって正しい状態にはになっていない
ようですね。
-Code Highlight2 Preload Hack ( XCCodeHighlight Version, for XC )
-Code Highlight3 Preload Hack ( New xcode version, for XC )
コメント
この投稿には、まだコメントが付いていません
コメントの投稿
ごめんなさい、現在コメントを付けることは出来ません