TOP/拡張スクリプト/チュートリアル - Searcher フィルタ

チュートリアル - Searcher フィルタ

BMX2WAV Searcher では左側のツリーでフォルダをクリックした場合等に、 その中のファイルの内フィルタで通ったファイル(通常 BMS 系のファイル)のみを 表示するようになっています。 このフィルタはスクリプトで定義されており、ユーザはスクリプトを編集することで 表示させたいファイルを選別することが可能になっています。

ここではスクリプトを編集することで、フィルタを定義する方法について説明しています。

スクリプトファイルを追加する

BMX2WAV Searcher ではユーザが記述するスクリプトは bmx2wav_searcher.nut になります。 このファイルは初期段階では存在しないのでユーザが作成する必要があります。

特定の拡張子を持つファイルのみを通すフィルタ

pms の拡張子を持つファイルのみ表示するフィルタを追加します。

Searcher.display_filters は配列で、そこにフィルタを追加します。 特定の拡張子のみを通す通すフィルタは ExtensionsFilter クラスとして用意されています。

以下のように PMS 用のフィルタを追加します。

Searcher.display_filters.append( ExtensionsFilter( "PMSのみ", "pms" ) );

編集した後に BMX2WAV Searcher を起動すると、「PMSのみ」のフィルタが追加されている筈です。

独自のフィルタを作成する。

特定の拡張子を持つファイルだけではなく、ユーザが独自にフィルタを作ることができます。

ここでは拡張子がBMS系のファイルで、ランダム構文を持つものだけを表示するフィルタを作成してみます。

Searcher.display_filters の配列に入れる事ができるのは、 名前としてスロット name に文字列があり、 スロット filtering に関数(Searcher.Entry インスタンスを引数とし、真偽値を返す)がある テーブルまたはインスタンスになります。

まずは、特に中身が無いフィルタを作成してみます。

local filter = {
  name = "ランダム構文のみ",
  function filterling( entry ) {
    // ここで選別する
    return false;
  }
};
Searcher.display_filters.append( filter );

次に、 BMS 系の拡張子を持つファイルのみ選別します。これは前述のExtensionsFilter を利用します。

local filter = {
  name = "ランダム構文のみ",
  function filterling( entry ) {
    local bms_filter = ExtensionsFilter( "名称なし", "bms", "bme", "bml", "pms" );
    if ( bms_filter.filtering( entry ) ) {
      // BMS 系が確定
      return false;
    }
    else {
      return false;
    }
  }
};
Searcher.display_filters.append( filter );

次に、フィルタに引数で渡されるSearcher.Entry インスタンスは 未だ BMS の構文解析をしていないので構文解析をさせます。

local filter = {
  name = "ランダム構文のみ",
  function filterling( entry ) {
    local bms_filter = ExtensionsFilter( "名称なし", "bms", "bme", "bml", "pms" );
    if ( bms_filter.filtering( entry ) ) {
      // BMS の構文解析をする。
      entry.parse_as_bms_data_once();
      return false;
    }
    else {
      return false;
    }
  }
};
Searcher.display_filters.append( filter );

構文解析をすると entry のプロパティ bms_data が有効になるので、 そこからランダム構文が存在するかどうかの真偽値がありますので、 その真偽値を関数の戻り値にすることでフィルタが完成します。

local filter = {
  name = "ランダム構文のみ",
  function filterling( entry ) {
    local bms_filter = ExtensionsFilter( "名称なし", "bms", "bme", "bml", "pms" );
    if ( bms_filter.filtering( entry ) ) {
      entry.parse_as_bms_data_once();
      return entry.bms_data.has_random_statement;
    }
    else {
      return false;
    }
  }
};
Searcher.display_filters.append( filter );

編集した後に BMX2WAV Searcher を起動すると、ランダム構文のみを持つ BMS のみ表示するフィルタが追加されています。

クラスの継承機能になれているならば、 ExtensionsFilter クラスを継承して作成するのも良いでしょう。

TOP/拡張スクリプト/チュートリアル - Searcher フィルタ