ページ

2005年5月25日水曜日

.Text のコメントの自動リンク処理の修正

.Text でコメントを書くときに URL らしき文字列は自動的にリンクになります。
しかし、


http://msdn2.microsoft.com/library/s1wwdcbf(en-us,vs.80).aspx


というように URL の途中に括弧が入っていると、途中でちょん切られたリンクになってしまいます。URL の途中に括弧が入ってるなんてめったに出会わないと思うんですが、上記のように .NET Framework 2.0 のドキュメントが括弧を使ってるんですよねぇ(^^;
この問題は AI-Light blog の うなまな Blog 「シリアル通信が楽になるかな。。。」 のコメントのやり取りを見て気付きました(^^


これを修正するには、ソースを直してビルドしなおす必要があります。


文字列中から URL を探してリンクにする処理は Code\Dottext.Framework\Util\Globals.cs の EnableUrls メソッドで行なわれていますが、ここで使われている正規表現が原因です。
もともとの EnableUrls メソッドは以下のようになっているかと思います。


public static string EnableUrls(string text)
{
string pattern = @"(http|ftp|https):\/\/[\w]+(.[\w]+)([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])";
MatchCollection matchs;

matchs = Regex.Matches(text,pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
foreach (Match m in matchs)
{
text = text.Replace(m.ToString(), "<a target=\"_new\" href=\"" + m.ToString() + "\">" + m.ToString() + "</a>");
}
return text;
}


これを


public static string EnableUrls(string text)
{
string pattern = @"((http|ftp|https):\/\/[\w]+(.[\w]+)([\w\-\.,@?^=%&amp;:/~\+#()]*[\w\-\@?^=%&amp;/~\+#]))";
string replacement = "<a rel=\"nofollow\" target=\"_blank\" href=\"$1\">$1</a>";
text = Regex.Replace(text, pattern, replacement, RegexOptions.IgnoreCase);
return text;
}


このように修正します。
修正内容は



  • URL として抽出する正規表現に括弧( "(" と ")" ) を追加。
  • ついでに、元のコードだとループを回して処理していたのを Replace 一発で処理するように変更。ちなみに、元のコードだと置換した結果をさらに置換してしまうというバグが発生する場合があるみたいなのでこのように修正しました。
  • 元のコードだと <a target="_new"... としていたのを <a rel="nofollow" target="_blank"... に変更。
    rel="nofollow" は、コメントスパム対策用です。「米Google、リンク属性を利用したコメントスパム対策機能」 などを参照。書くの忘れてましたが、2005年 2月くらいにコメントスパムがやってくるようになったころに rel="nofollow" を入れるように改造してました。
    target="_blank" にしたのは好みです。"_blank" にするつもりが間違って "_new" としたのか、わざと "_new" にしたのかはわかりませんけど。ちなみに、"_blank" は 「常に新規にウインドウを開く」 という予約されたターゲット名ですが、"_new" にはそんな規定はないので単に 「"_new" という名前のウインドウがなければ新規に開き、あれば再利用する」 という動作になります。

です。


上記の修正をした DLL を http://www.divakk.co.jp/aoyagi/dotText_bin.ZIP において置きました(今回の修正だけではなく、今までの修正すべてが反映されています)。


2005/05/25 10:25 追記
肝心のソースのところが化けてたので修正しました。(化けていたというか、ソース中の <a> とかがうまく変換できてなかったのでちゃんと表示されていませんでした)

1 件のコメント:

  1. >中さん


    ご指摘ありがとうございます。直しました。

    C# のソースとしてはあってたんですが、HTML にするときに string replacement = "<a... なんかの <a> とかが &lt;a&gt; になってなくて、一番肝心なところが表示されてませんでした。


    というか、最初は HTML もあってたと思うんですが .Text が使っている FreeTextBox って HTML の編集をしてると < とか > とかの扱いに失敗することが多々あるんだよなぁ。


    # 修正前はたまたま replacement = "$1" となってたから、これだと握りつぶすことすらせず

    # 結果としては 「何もしない」 ことになっちゃいます(^^;

    返信削除