長い URL を折り返して表示する jQuery プラグインを作りました

  主に Firefox での使用を意識しているのですが、Firefox では長い URL は折り返さない仕様なのでページのレイアウトが崩れてしまうことがあります (Firefox 3 では折り返す仕様になるみたいです)。

  このため MR Tech Link Wrapper というアドオンや、url_breaker+ という Greasemonky スクリプトがあります。

  それらを参考にして、長い URL を折り返して表示する jQuery プラグイン Link Wrapper を作ってみました。

- jquery.linkwrapper.js のデモ
  http://pocari.org/demo/jquery.linkwrapper/

  jquery.linkwrapper.js

  このプラグインは、MR Tech Link Wrapper や url_breaker+ と同じように、<wbr> という非標準のタグを挿入しています。また、Opera は <wbr> に対応していないようなので、&#8203; (ZERO WIDTH SPACE: ゼロ幅スペース) を挿入しています。

# ですので、Opera では URL の文字をコピーすると h t t p : / / w w w のようにスペースが入ってしまいます。

  このプラグインでは、<wbr> の挿入位置ですが、デフォルトでは 1 文字毎にしています。
  1 文字毎はやりすぎな感じもするのですが、まあ綺麗に折り返すために、取り合えずこのようにしてみました。

  オプション (pattern) に <wbr> を挿入する正規表現を指定することで、折り返しの位置を調整することができます。

- 使い方

<script type="text/javascript" src="jquery-1.2.2.pack.js"></script>
<script type="text/javascript" src="jquery.linkwrapper-1.0.3.js"></script>
<script type="text/javascript">
// <![CDATA[
$(function() {
  // オプションを指定しない場合
  $('a.link1').linkwrapper();
  // オプションを指定する場合
  $('a.link2').linkwrapper({ pattern: '(&|\\?)' });
});
// ]]>
</script>
</head>
<body>
<p><a href="http://..." class="link1">http://...</a></p>
<p><a href="http://..." class="link2">http://...</a></p>


  対応しているブラウザですが、IE 6.0、IE 7.0、Firefox 2.0.0.11、Safari 3.0.4、Netscape 7.1、Opera 9.25 で確認したところ問題ないようです。

  以下にソースを載せておきます。
  ライセンスは、jQuery と同様に MIT と GPL のデュアルライセンスにしました。

(function() {
  jQuery.fn.linkwrapper = function(config) {
    config = jQuery.extend({
      pattern: '(.)'
    }, config);
    var pattern = new RegExp(config.pattern, 'g');
    var tag = jQuery.browser.opera ? '&#8203;' : '<wbr />';
    return this.each(function() {
      jQuery(this).html(jQuery(this).text().replace(pattern, '$1' + tag));
    });
  };
})(jQuery);


- ダウンロード
  jquery.linkwrapper-1.0.3.js

  なお、jQuery のプラグインの作り方は、以下のエントリが大変参考になりました。

- ref.: jQuery のプラグインを作成する : ブログの新着記事を表示:Goodpic
  http://www.goodpic.com/mt/archives2/2007/11/jquery.html

- ref.: The wbr tag
  http://www.quirksmode.org/oddsandends/wbr.html

- 追記 (2008-02-05)
  メソッドチェーンができないことに気づいたので、jquery.linkwrapper-1.0.2 をリリースしました。
  これで、以下のようにできるようになります。

$('a.link1').linkwrapper().css('color', '#f00');


- 追記 (2008-03-21)
  jQuery.noConflict(); の時に動作しないのを修正して、jquery.linkwrapper-1.0.3 をリリースしました。