ClipMenu の JavaScript アクションの書き方

JavaScript, Mac, ソフトウェア No Comments »

基本

ClipMenuでは、ユーザーの作成したアクションを使って、テキスト形式のクリップボード履歴に対する文字列処理を行うことができます。ユーザーアクションの実行には、スクリプト言語のJavaScriptを使用します。

ClipMenuのJavaScript実行エンジンには、WebKitに含まれるJavaScriptCoreを利用しています。JavaScriptの動作仕様は、Safariを参考にしてください。なお、ClipMenuでは基本的に、コアJavaScript部分のみを使用します。

設置

ユーザー作成のJavaScriptファイルは、以下のフォルダに設置します。このフォルダが存在しない場合は、Finderから新規に作成してください。

/Users/<ユーザ名>/ライブラリ/Application Support/ClipMenu/script/action
スクリプトファイルの拡張子は、”.js” になります。これ以外の拡張子を持ったファイルは、無視されます。

actionフォルダ以下に存在するフォルダは、アクションメニューのサブメニューとして機能します。同じ種類のスクリプトファイルは、フォルダにまとめておくと便利です。

スクリプトの書き方

[クリップボード文字列]

ClipMenuアプリケーションから渡されたクリップボード履歴の文字列は、clipText 変数に代入されています。この変数に対して関数を適用したり、メソッドを実行して文字列処理を行ってください。

例)アルファベットをすべて大文字に変える

clipText.toUpperCase();

[処理の終了]

必要な処理が済んだら、return 文で値を戻します。return 文に渡す式の戻り値は、文字列か数値になるようにしてください。

例)アルファベットをすべて大文字に変えて、クリップボードに送る

return clipText.toUpperCase();
この時、return 文に式を指定しないと、クリップボード履歴に対する処理は何も行われません。

例)何も返さず、終了

return;

[ライブラリの読み込み]

複数のファイルで共通して使用する関数などは、ライブラリとして別ファイルに保存しておくと便利です。ClipMenuでは、指定したフォルダに置かれたスクリプトを、ライブラリとして読み込むことができます。読み込みには、ClipMenuオブジェクトの、require() メソッドを使用します。

例)inflection-jsを読み込む

ClipMenu.require('inflection');
require() メソッドの引数には、ライブラリスクリプトのファイル名を渡します。拡張子の”.js”は、有っても無くても構いません。読み込みが成功したかどうかは、require() メソッドの戻り値を使ってチェックできます。ライブラリが見つかれば 1 を、見つからなければ 0 を返します。

例)require() メソッドの戻り値をチェック

var isExist = ClipMenu.require('inflection');
if (!isExist) {
    throw new Error('Cound not find the file');
}
ライブラリの読み込みが成功すると、ライブラリ内で定義された関数が利用可能になります。

例)inflection-jsで定義された、capitalize() メソッドを使用する

clipText.capitalize();
ライブラリフォルダには、アプリケーションバンドル内にある標準ライブラリフォルダと、ユーザーが設置するユーザーライブラリフォルダの二種類があります。ユーザーライブラリフォルダは、以下のパスに作成してください。
/Users/<ユーザ名>/ライブラリ/Application Support/ClipMenu/script/lib
ライブラリの読み込みは、ユーザーライブラリフォルダが優先されます。こちらから検索した後、標準ライブラリフォルダの検索を行います。

[ユーザー入力]

prompt() メソッドを使用すれば、ユーザー入力を組み合わせた処理ができます。

例)クリップボードにコピーしたURLと、入力したタイトルを組み合わせて、HTMLコードを作成

var input = prompt('タイトルを入力:');
return '<a href="' + clipText + '" title="' + input + '">' + input + '</a>';

その他

  • alert() 、 confirm() メソッドは動作しません。

LGTM とは?

英語 No Comments »

“Looks Good To Me” の略です。

» LGTM - What does LGTM stand for? Acronyms and abbreviations by the Free Online Dictionary.

google-toolbox-for-macのディスカッショングループで見かけた、一言レス。分かんないって :(

» Adding GTMNSWorkspace+ScreenSaver - google-toolbox-for-mac | Google Groups

クリップボード履歴の削除機能は、次のリリースで実装予定

Cocoa, Mac, ソフトウェア No Comments »

クリップボード履歴の削除機能は、ClipMenuの次のリリースで実装します。

どうも、各所でご不便をおかけしているようで、申し訳ないです。現在のところ、不便な点の第一位みたいです。

iusethisというサイトで紹介していただいたんですが、こちらのコメントでも指摘されていました :(

ただ、こちらの説明で、やっと問題の重要性を理解できました。パスワードみたいな、人に見られたくない情報を簡単に消せないと、確かにまずいですね。

次期バージョンでは、履歴をリセットする方法と、選択した履歴を個別に削除する、二種類の方法を用意します。

塀の中で「マッキントッシュ!」と叫ぶ

No Comments »

札幌拘置所で、171日間拘束された島村英紀氏が著した本。『私はなぜ逮捕され、そこで何を見たか。

私はなぜ逮捕され、そこで何を見たか。 (講談社文庫 し 82-1)

ほとんどの人には無縁の拘置所暮らしを、詳細に描いています。

著者は独居房に入れられていたそうですが、直接は見えなくても、隣人の様子を伺い知ることができたとか。そのうちの一人が、「ため息ゴリラ」さん。巨漢の彼は、壁を叩いたり、意味の分からない大声を出したりと、普段から騒々しい人だったそうです。そうかと思えば、一転してため息ばかりついたりも。

そんな描写を淡々と読み進めていたら、ゴリラ氏の叫んだ台詞に、思わず吹いた。

たまに意味のある言葉を大声で叫ぶので、ぎょっとする。
「マッキントッシュ!」と数度。何だろう?

マッキントッシュ?!何ですか、それは?

マッキントッシュといってもいろいろありますが、普通はMacの事ですよね。一体、ゴリラ氏とマッキントッシュの間に何が合ったのか、気になります。

WebKitで、外部リソースへのアクセスを抑制する

Cocoa, JavaScript No Comments »

JavaScriptでXMLHttpRequestを使うと、外部ファイルを読み込めますが、ClipMenuから実行する文字列処理には必要ありません。そこで、WebKitが外部リソースにアクセスできないような変更を加えてみました。

まず、webViewをインスタンス化した後に、delegateを設定。

[webView setPolicyDelegate:self];
WebPolicyDelegateプロトコルのメソッドを実装します。
- (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener
{
    [listener ignore];
}
これで、ClipMenuで実行したJavaScriptでXMLHttpRequestを使ったhttpアクセスを行うと、”Permission denied”と、エラーになるようにできました。

WordPressのテーマを、GlossyBlueに変更

WordPress No Comments »

Hiroさんにコメントで教えていただいたおかげで、WordPressのフィードがうまく機能していないのを直すことができました。

せっかくなので、久しぶりにWordPressを弄ったついでに、テーマもカッコイイものに変えてみました。選んだthemeは、N.Design Studioさん制作の、GlossyBlue。プロのデザインしたテーマは、さすがに完成度が違いますね。

さらに、ソースコードに色を付けるために、google-code-prettifyと、WordPress用のプラグイン、Google Code Prettify for wordpresも導入してみました。

それから、Google Adsenseはブログからを撤去してみることに。なんだか、いかがわしい広告が表示されるのが、前から気になっていたので。代わりに、Amazonおまかせリンクを置いてみました。

読み込むファイル数がちょっと増えちゃいましたが、動作が重くなるようなら、追々対処していくことにします。

Carbonでプロセスを切り替え

Cocoa, Mac, ソフトウェア 7 Comments »

次のような動作を、ClipMenuで実現しようと思いました。

  1. ブラウザでURL (例: http://www.apple.com/)をクリップボードにコピー。
  2. エディタを起動。
  3. ClipMenuを呼び出して、さっきコピーしたURLを履歴から選び、JavaScriptで記述したアクションを実行。
  4. JavaScript内に書かれた、prompt()メソッドで表示されたダイアローグボックスに、タイトル (例: アップル)を入力。
  5. エディタに、JavaScriptで処理した結果 (例: <a href=”http://www.apple.com/” title=”アップル”>アップル</a>)をペースト。

JavaScript内に、prompt()などの、ウィンドウを表示させるメソッドを使わなければ、特に問題はありませんでした。ただ、クリップボードの文字列と、ユーザー入力の文字列を組み合わせた文字列処理を行いたかったので、いくつかの問題を解決する必要がありました。

最前面に、エディタのウィンドウが表示されている状態で、バックグラウンド専用(LSUIElement = 1)で動いているClipMenuからウィンドウを開くと、最前面にあったエディタのウィンドウの下に表示されてしまいます。

これを避けるために、Cocoaでは以下のメソッドを実行すれば、自分のウィンドウを最前面にすることができました。

[NSApp activateIgnoringOtherApps:YES];

ただ、この後にClipMenuが表示したウィンドウを閉じると、はじめに最前面にあったエディタのウィンドウが一番手前になりますが、フォーカスはあたっていません。そのため、このウィンドウにペーストすることができない状態になってしまいます。

ClipMenuが最前面になる前に、

  1. 最前面のウィンドウのIDを記憶
  2. ClipMenuを最前面に切り替え
  3. ClipMenuのウィンドウを閉じる
  4. さっき記憶したIDのウィンドウを最前面に切り替え

を行えば良さそうだと考えましたが、方法が分かりません。唯一思い浮かんだのは、AppleScriptを使ったものです。ただ、「AppleScriptで解決するのは最後の手段」と、メーリングリストで言っていた人もいたので、やはり他の方法を探すことに。

Xcodeのドキュメントで見当たらなかったため、例によって、Cocoabuilderで検索。見つかった方法は、Carbonの関数を利用するものでした。

» Cocoabuilder - (Edison Thomaz) Bring app to foreground in 10.5

ClipMenuを表示する直前に、GetFrontProcess()関数で記憶したProcessSerialNumberを、ClipMenuを閉じる際に、SetFrontProcess()関数で最前面に設定することで、望み通りの動作をさせることができました。

結構、Carbon APIを使わないと実現できない処理がありますね。

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン