Home »  » 2006年 » 11月 » 30日

デリゲートでBBCodeの拡張を Part2

flagflag

このブログで、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('&gt;','&lt;','&quot;','&#039;'),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">)&lt;\?php<br \/>/','$1',$text);
            
$text str_replace("<font color=\"#0000BB\">?&gt;</font>\n",'',$text);
        } else {
            
$text highlight_string($texttrue);
        }
        
$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 )


コメント

このコメントのRSS

この投稿には、まだコメントが付いていません

コメントの投稿

ごめんなさい、現在コメントを付けることは出来ません


18 queries. 0.024 sec.
Powered by WordPress Module based on WordPress ME & WordPress

flagflag

メインメニュー

XOOPS初心者サーチ


Add to Google

Xoops Cube Project

XOOPS Cube Project Site

XC Developers Ring

http://img.simpleapi.net/small/http://www.peak.ne.jp/xoops/ SIZE:128x128(7.6KB)