コマンドの引数を利用する

先ほど紹介した様々なコマンドの中には、引数を利用するものが数多くあった。そこで前ページのhelloコマンドについても、引数を取るかたちに変更し、「こんにちは、<入力された引数>」と出力するようにしてみよう。

改良後のコマンドライン。引数を入力するよう促される

「Ubiquity」と入力した結果

以下に示すのが、コマンドラインから引数を取るよう改良したプログラムだ。

CmdUtils.CreateCommand({
  name: "hello", // コマンドの名前
  // (1) 引数の情報をtakesで指定
  takes: {"あなたのお名前": noun_arb_text},
  execute: function(name) {
    // (2) 入力値が関数の引数として与えられる
    displayMessage("こんにちは!" + name.text);
  }
});

(1) CreateCommand()の引数オブジェクトにtakes属性を追加し、コマンド引数の情報を指定する。"あなたのお名前"の部分が引数のラベルとなる。noun_arb_textは、「引数が任意の文字列である」ということを表しており、「Noun type」(名詞の型)と呼ばれる情報を指定する。「Noun type」は、引数として指定できる文字列に制約を課したり、入力候補を表示したりするのに使用される。他にもnoun_type_date(日付のみ)やnoun_type_language(言語名のみ)などがあり、容易に自作することもできる。

(2) コマンドに入力された引数は、関数execute()に対する引数として渡される。文字列が直接渡されるわけではなく、以下のような属性を持つオブジェクトが渡される。

inputObject.text  // フォーマットなしの、入力されたプレーンテキスト
inputObject.html  // タグを含む、フォーマットされたHTMLテキスト
inputObject.data  // 文字列ではない、任意のデータオブジェクト
inputObject.summary // 非常に長い入力値に対する、簡略化された文字列

とはいえ、text以外を使用しなければならない状況はまれだろう。筆者もいろいろ試したのだが、長い文字列を渡すとsummaryの値が変化したこと以外、textとhtmlは違いがよくわからず、dataは常にundefinedであった。さらに詳細が判明したら、改めて報告する。