LOGIN ID Password Auto Login Register Now! Lost Password?
XUGJ Wiki
Page Top

概要 anchor.png

XCL2.1は各種テキストの変換処理を行う機能を持っている。

  • BBCodeの展開
  • 自動リンク処理
  • スマイリー変換
  • 改行のbr変換
  • 一部の危険なパターンの無害化 (コントロールコードやjavascriptを含んだsrc属性等)

X2ではMyTextSanitizerクラスというネーミングも含めて微妙なクラスが、DBエスケープ用のaddslashes()やstripslashes()なども受け持っていたが、XCL2.1のテキストフィルタは、原則的にブラウザへの出力専用となっている。

X2との互換用に

html/class/module.textsanitizer.php

というクラス経由でも呼び出せるが、その実体はあくまで、

html/modules/legacy/kernel/Legacy_TextFilter.class.php

である。

変換パターンを一通り知りたいのであれば、このファイルを読むのが一番手っ取り早い。

Page Top

機能拡張 anchor.png

テキスト変換パターンを変える、というカスタマイズはX2時代から多く行われてきたが、X2では、module.textsanitizer.php を直接書き換えるしか方法がなく、バージョンアップ時のマージなどに問題を抱えていた。

XCL2.1のテキストフィルタでは、ほとんどすべてのテキスト変換パターンを、デリゲート経由で自由にコントロールすることができる。

Page Top

Delegate anchor.png

機能のフック可能ポイントを列挙する

  • 利用推奨されないもの
    • MyTextSanitizer.MakeClickablePostFilter
    • MyTextSanitizer.XoopsCodePostFilter
    • MyTextSanitizer.MakeClickablePre
    • MyTextSanitizer.XoopsCodePre
  • 利用が推奨されるもの
    • Legacy_TextFilter.MakeClickableConvertTable
    • Legacy_TextFilter.MakeXCodeConvertTable
    • Legacy_TextFilter.MakeXCodeCheckImgPatterns
    • Legacy_TextFilter.MakePreXCodeConvertTable
    • Legacy_TextFilter.MakePostXCodeConvertTable
Page Top

BBCodeを拡張する anchor.png

一般的なカスタマイズの一つに、BBCodeの拡張がある。

フックすべきポイントは一つなので、自分専用のサイトpreload(XOOPS_ROOT_PATH/preload/ の直下に置くことで有効になる)を用意しておくのが良いだろう。

下の雛形を使うと楽かも知れない。

この雛形のhook() 内に変換ルールを書くだけである。

変換ルールは、Legacy_TextFilter.class.php のmakeXCodeConvertTable() (292行目付近)を参考にするのが良いだろう。

原則的に、検索パターンと置換パターンをセットで書くだけだが、BBCodeの場合、画像禁止モードと画像許可モードがあるため、検索パターン1つにつき、置換パターンは2つ書く必要がある点に注意が必要である。

Page Top
例1: [img]タグによって生成される<img>タグに共通のclass属性(bbcode)をつける anchor.png

hook()内に変換ルールとして挿入:

       $patterns[] = "/\[img align\=(['\"]?)(left|center|right)\\1\]([^\"\(\)\?\&'<>]*)\[\/img\]/sU";
       $replacements[0][] = '<a href="\\3" target="_blank">\\3</a>';
       $replacements[1][] = '<img src="\\3" align="\\2" alt="" class="bbcode" />';
       $patterns[] = "/\[img\]([^\"\(\)\?\&'<>]*)\[\/img\]/sU";
       $replacements[0][] = '<a href="\\1" target="_blank">\\1</a>';
       $replacements[1][] = '<img src="\\1" alt="" class="bbcode" />';
Page Top
例2: [siteimg]タグを有効にする anchor.png

hook()内に変換ルールとして挿入:

       $patterns[] = "/\[siteimg align\=(['\"]?)(left|center|right)\\1\]([^\"\(\)\?\&'<>]*)\[\/siteimg\]/sU";
       $replacements[0][] = '<img src="'.XOOPS_URL.'/\\3" align="\\2" alt="" class="bbcode" />';
       $replacements[1][] = '<img src="'.XOOPS_URL.'/\\3" align="\\2" alt="" class="bbcode" />';
       $patterns[] = "/\[siteimg\]([^\"\(\)\?\&'<>]*)\[\/siteimg\]/sU";
       $replacements[0][] = '<img src="'.XOOPS_URL.'/\\1" alt="" class="bbcode" />';
       $replacements[1][] = '<img src="'.XOOPS_URL.'/\\1" alt="" class="bbcode" />';

画像禁止モード時でも[siteimg]だけは<img>に変換するのが良い。 理由は以下の通り

  • リファラー問題などは、外部画像以外では起きない
  • d3forumなどでは外部画像禁止モードがデフォルトとなっている
Page Top
参考: MyBBCodeのソースコード anchor.png
<?php

if( ! defined( 'XOOPS_ROOT_PATH' ) ) exit ;

class MyBBCode extends XCube_ActionFilter 
{
	function preBlockFilter()
	{
		// デフォルト変換の優先順位はXCUBE_DELEGATE_PRIORITY_2なので、1を指定する
		$this->mRoot->mDelegateManager->add( 'Legacy_TextFilter.MakeXCodeConvertTable' , array( &$this , 'hook' ) , XCUBE_DELEGATE_PRIORITY_1 ) ;
	}

	function hook( &$patterns, &$replacements )
	{
		// $patterns[] = (検索パターン)
		// $replacements[0][] = (画像表示禁止時の置換パターン)
		// $replacements[1][] = (画像表示許可時の置換パターン)
	}

}

トップ   凍結 差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 6621, today: 1, yesterday: 0
初版日時: 2008-06-12 (木) 23:08:07
最終更新: 2014-01-13 (月) 22:06:02 (JST) (1262d) by hi-debow
Back to Page Top
MainMenu
Manuals
Search
XOOPS Official & Dev.
XOOPS Communities