コメント中に @UserName
と記述することによって、プロフィールへの自動リンクが張られる機能を指す。
「ユーザー名に日本語を許容する」課題(#4)に関連した課題。
現状
ASCII ユーザー名にしか対応していない。
日本語ユーザー名には、リンクが張られない。
拡張
日本語ユーザー名にもリンクが張られるように拡張する。
実装方法
リンク元の処理
/library/core/class.format.php
public static function Mentions($Mixed) {
if (!is_string($Mixed)) {
return self::To($Mixed, 'Mentions');
} else {
// Handle @mentions.
if(C('Garden.Format.Mentions')) {
$Mixed = preg_replace(
'/(^|[\s,\.>])@(\w{1,50})\b/i', //{3,20}
'\1'.Anchor('@\2', '/profile/\\2'),
$Mixed
);
}
上記の正規表現を変更する。
日本語ユーザー名の正規表現の条件は、 #4 を参照。
リンク先の処理
リンク元の処理を日本語ユーザー名に対応させても、そのままではジャンプ後に 404 エラーとなる。
/applications/dashboard/models/class.usermodel.php
public function GetByUsername($Username) {
if ($Username == '')
return FALSE;
$this->UserQuery();
$User = $this->SQL->Where('u.Name', $Username)->Get()->FirstRow();
$this->SetCalculatedFields($User);
return $User;
}
上記の Where() の実引数を変更する。
$User = $this->SQL->Where('u.Name', urldecode($Username))->Get()->FirstRow();
これで、日本語ユーザー名でもプロフィールページが正常に表示されるようになる。
@リプライ ユーザー 一覧取得処理
モデルから呼び出されている。
/library/core/functions.general.php
if (!function_exists('GetMentions')) {
function GetMentions($String) {
$Mentions = array();
// This one grabs mentions that start at the beginning of $String
preg_match_all(
'/(?:^|[\s,\.>])@(\w{3,20})\b/i',
$String,
$Matches
);
if (count($Matches) > 1) {
$Result = array_unique($Matches[1]);
return $Result;
}
return array();
}
}
上記の正規表現を変更する。
日本語ユーザー名の正規表現の条件は、 #4 を参照。
これはコアハックではなく conf/bootstrap.before.php
内でオーバーライドできる。
その他留意事項
関連で、ハッシュタグサーチ (#検索語句
で検索リンクが張られる機能) も日本語対応する。
該当コードは Mentions() 内部。
課題は #6 を参照。