ブックマークレット: 2007年4月アーカイブ

猫バトン

| | コメント(8)

にゃーんだと?

語尾にニャとかふざけてるのか!そんなバカなこと出来な…な…

猫化ブックマークレット

ブックマークレットと呼ばれてるやり方で実装しました。利用方法は簡単。

  1. 変換したいページを呼び出します。
    how-step-1.png
  2. ブラウザのアドレス欄に javascript:(function(){var u="http://zenith.sakura.ne.jp/bookmarklet/arisyu.js" ;var d=document;var s=d.createElement('script');s.charset="UTF-8";s.src=u;d.body.appendChild(s);})() をコピーして貼り付け、 Enter キーを押します。するとあら、こんなところにニャンコが…!
    how-step-2.png

もっと簡単な方法は、ブックマークに登録するやり方です。

  1. こちらのブックマークレットのページを表示して、猫化を右クリックしてコンテクスト メニューを出し、ブックマークに登録します。セキュリティうんぬんと出ますが無視します。
    bookmark-step-1.png
  2. 変換したいページを表示させ、先ほど登録したブックマークをクリックすると変換されます。
    bookmark-step-2.png

使用しているソースコード

/**
 * 猫化ブックマークレット
 *
 * 使用方法は、変換を適用させたいページをブラウザに表示させてから
 * アドレス欄に
 * javascript:(function(){var u="http://ブックマークレット設置箇所";var d=document;var s=d.createElement('script');s.charset="UTF-8";s.src=u;d.body.appendChild(s);})()
 * と入力します。
 */

// 名前空間用のオブジェクト window.Zenith が存在しなければ定義
if (!("Zenith" in window))
{
  Zenith = {};
}

// 名前空間用のオブジェクト window.Zenith.Bookmarklet が存在しなければ定義
if (!("Bookmarklet" in window.Zenith))
{
  Zenith.Bookmarklet = {};
}

/**
 * HTML 文章を猫化するブックマークレットの新しいインスタンスを初期化します。
 */
window.Zenith.Bookmarklet.Arisyu = function ()
{
  this.filters = [];
}

/**
 * 指定した要素に変換フィルタを適用します。
 *
 * @param HTMLElement element 対象の要素。
 * @param bool recursive 子要素にも再帰的に適用するなら TRUE、しないなら FALSE。
 */
window.Zenith.Bookmarklet.Arisyu.prototype.filter = function (element, recursive)
{
  for (var i = 0, iLast = this.filters.length; i < iLast; i++)
  {
    var f = this.filters[i];
    
    f.apply(element);
    
    if (recursive)
    {
      for (var j = 0, jLast = element.childNodes.length; j < jLast; j++)
      {
        var child = element.childNodes[j];
        this.filter(child, recursive);
      }
    }
  }
}

/**
 * 指定した要素が持つ全ての子要素のうち、変換対象の要素のテキストを猫化します。
 * 子要素は再帰的に列挙されます。
 *
 * @param HTMLElement element 対象の要素。
 */
window.Zenith.Bookmarklet.Arisyu.prototype.apply = function (container)
{
  this.filter(container, true);
}


/**
 * 正規表現により文章を置換するフィルタの新しいインスタンスを初期化します。
 */
window.Zenith.Bookmarklet.Arisyu.RegExpFilter = function ()
{
  /**
   * 置換候補の正規表現と結果の辞書
   */
  this.dictionaries = [
      {
        "pattern": "な",
        "option": "gm",
        "replace": "にゃ"
      },
      {
        "pattern": "ぬ",
        "option": "gm",
        "replace": "にゅ"
      },
      {
        "pattern": "わたし|ワタシ|わたくし|ワタクシ|私|ぼく|ボク|ぼかぁ|僕|おれ|オレ|俺|じぶん|ジブン|自分|拙者|麻呂",
        "option": "gm",
        "replace": "我輩"
      },
      {
        "pattern": "([!!]+)",
        "option": "gm",
        "replace": "にゃ$1"
      },
      {
        "pattern": "([…+|・+])",
        "option": "gm",
        "replace": "にゃ$1"
      },
      {
        "pattern": "、",
        "option": "gm",
        "replace": "にゃー、"
      },
      {
        "pattern": "(ね?)。",
        "option": "gm",
        "replace": "にゃん。"
      }
    ];
  
  /**
   * 正規表現オブジェクトのキャッシュ
   */
  this.regexpCache = [];
}
  
/**
 * 指定された要素がフィルタの適用対象かどうかを取得します。
 *
 * @param HTMLElement 調べる対象の要素。
 * @return bool 適用対象なら TRUE、対象外なら FALSE。
 */
window.Zenith.Bookmarklet.Arisyu.RegExpFilter.prototype.isAcceptElement = function (element)
{
  var isAccept;
  
  switch (element.nodeName.toLowerCase())
  {
    case 'style':
    case 'script':
    case 'frame':
    case 'code':
      isAccept = false;
      break;
    
    default:
      isAccept = true;
  }
  
  return isAccept;
}

/**
 * 指定された要素へフィルタを適用します。
 *
 * @param HTMLElement 適用対象の要素。
 */
window.Zenith.Bookmarklet.Arisyu.RegExpFilter.prototype.apply = function (element)
{
  if ("parentNode" in element && element.parentNode != null)
  {
    if (!this.isAcceptElement(element.parentNode))
    {
      return;
    }
  }
  
  if (element.nodeName.toLowerCase() != "#text")
  {
    return;
  }
  
  var nodeValue = element.nodeValue;
  
  for (var i = 0, iLast = this.dictionaries.length; i < iLast; i++)
  {
    var dictionary =  this.dictionaries[i];
    
    if (!(i in this.regexpCache))
    {
      this.regexpCache[i] = new RegExp(dictionary.pattern, dictionary.option);
    }
    
    var regexp = this.regexpCache[i];
    nodeValue = nodeValue.replace(regexp, dictionary.replace);
  }
  
  element.nodeValue = nodeValue;
}


////////////////////////////////////////////////////////////////////////////
// ここから実行
////////////////////////////////////////////////////////////////////////////

var arisyu = new Zenith.Bookmarklet.Arisyu();

// フィルタ設定
arisyu.filters = [
    new Zenith.Bookmarklet.Arisyu.RegExpFilter()
  ];

// トップ レベルの文章に適用
arisyu.apply(window.document);

// フレームがあればそちらも適用
if ("frames" in window)
{
  for (var i = 0, iLast = window.frames.length; i < iLast; i++)
  {
    arisyu.apply(window.frames[i].document);
  }
}

このアーカイブについて

このページには、2007年4月以降に書かれたブログ記事のうちブックマークレットカテゴリに属しているものが含まれています。

次のアーカイブはブックマークレット: 2008年3月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ブックマークレット: 2007年4月: 月別アーカイブ

Powered by Movable Type 4.12