2008年8月29日金曜日

Ubiquityの「CmdUtils.getTextSelection」でエラーが発生する問題と文字数を数えるコマンド

Ubiquity 0.1」で、オレオレコマンドを試していたのですが、なぜか「CmdUtils.getTextSelection」でエラーが発生してしまいます。皆さんの環境では問題ありませんか?(もしかしたら、私の環境だけかもしれません...。)


↑「CmdUtils.getTextSelection」を実行すると表示されるエラー


やはり選択中の文字列が取り出せないとなると不便なので、少し回避策を考えてみました。そこで、command-editorで再定義!を思いつきました。

具体的には、command-editorにcmdutils.jsのCmdUtils.getTextSelectionのブロック(175〜189行目)をそのままコピーしてみたところ、正常に?動作するようになりました。(今のところ、既存のコマンドへの影響は特に無いと思っています。が、何か問題があるようでしたら削除すればOKです)

もし同じ症状が発生している方がいたら、以下のコードをcommand-editorの一番上辺りに貼り付けてみると良いかもしれません。

−−ここから--
CmdUtils.getTextSelection = function getTextSelection() {
var focused = context.focusedElement;
var retval = "";

if (focused)
if (focused.selectionStart != focused.selectionEnd)
retval = focused.value.substring(focused.selectionStart,
focused.selectionEnd);
if (!retval) {
var sel = context.focusedWindow.getSelection();
if (sel.rangeCount >= 1)
retval = sel.toString();
}

return retval;
};
--ここまで--


私の環境では、この方法で選択中の文字列が取得できるようになりました。という訳で、選択中の文字列の文字数を数えるコマンドを定義してみました。これは「word-count」コマンドでは日本語を扱えないので、とりあえずlengthの値を返すようにしてみただけです。「それ、○○でできるよ!」というのは無しでお願いしますw

以下のコードをcommand-editorの一番下にでも貼り付ければOKです。

--ここから--
CmdUtils.CreateCommand({
name: "length",
description: "選択中の文字列の文字数を表示します。空白や改行などは無視します。",

_length: function() {
var str = CmdUtils.getTextSelection();
str = str.replace(/\s|\n|\r/g, "");
return str.length;
},

preview: function(pblock) {
pblock.innerHTML = this._length() + "文字です。";
},

execute: function() {
displayMessage(this._length() + "文字でした。");
}
});
--ここまで--

このコマンドを使って、先程書いたエントリの文字数を測ってみました。うーむ、想像以上に短かった!


↑文字数をカウントするコマンド「length」←好きな名前を付けて下さいw


以上、私の環境では、「CmdUtils.getTextSelection」で少しハマッたのでメモを残しておこうと思います。


(追記:8/30)わざわざ再定義しなくても、次のようなコードでも選択中の文字列を取得できますね!
  var document = context.focusedWindow.document;
var str = document.getSelection();

3 件のコメント:

匿名 さんのコメント...

解決なされてるかもしれませんが、

getTextSelection()
      ↓
getHtmlSelection()
と名前が変わったようです。

この他にも
snapshotImage()
      ↓
getImageSnapshot()
のようにいくつか名前が変更されてるのがあるみたいですね。

erpalacion さんのコメント...

匿名さん、こんにちは。コメントありがとうございます。

このエントリを書いたのは、ver0.1時代です。お恥ずかしながら、ver 0.1.1に関してはそれほど追っかけていませんでした...。今改めてチェックしてみると、ご指摘の通り、getTextSelection()は無くなっているようですね^^;

ver0.1.1で、選択中の文字列を取得するには、getHtmlSelection()を利用する。この時、HTMLタグを含めたくない場合は、getTextFromHtml()を組み合わせれば良さそうですね!(←文字数を数えるコマンドでは期待通りの結果を返しました!)

まだ追い切れていないのですが、少しずつキャッチアップしていきたいと思います。情報ありがとうございました!

erpalacion さんのコメント...

単純にテキストを取得するだけなら、「CmdUtils.getSelection()」でOKでした。うーん、まだまだ勉強が足りないようです...。