ライブラリを Unix コマンド風に操作するエクステンション

June 16, 2008category: Flash JSFL 

ライブラリのアイテムを Unix コマンド風に操作するエクステンションを作った。

デモソースコード

実装した機能は

  • ls
  • mv
  • cp
  • rm
  • clear
  • ファイル名のタブ補完

だけ。ディレクトリ構造を保持していないので cd は使えない。パーサらしきものは、スペースで split しているだけなのでライブラリ名にスペースが入ると使えない。という、いまいちなツールだが、興味のある方はどうぞ。LibraryConsole.swf を WindowSWF ディレクトリに入れれば Flash IDE に現れるはず。

JSFL と AS を全文掲載しておく。 Flash から JSFL をコールする runScript 関数が便利だった (元ネタ)。

LibraryConsole.jsfl

var names = [];
var library;
var items;

//initNames
function initNames() {
  names = [];
  library = fl.getDocumentDOM().library;
  items = library.items;
  for (var i = 0; i < items.length; i++) {
    names.push(items[i].name);
  }
}

//getNames
function getNames() {
  initNames();
  return names;
}

//run
function run(commands) {
  initNames();
  commands = commands.replace(/\s+$/, "");
  commands = commands.split(" ");
  var command = commands[0];
  var args = commands.slice(1, commands.length);
  if (this[command] != undefined) {
    this[command].apply(this, args);
  }
}

//ls
function ls() {
  if (arguments.length > 0) {
    var dir = arguments[0].replace(/[^\/]$/, "$&/");
    for (var i = 0; i < names.length; i++) {
      var name = names[i];
      if (name.match(new RegExp(dir))) {
        fl.trace(name);
      }
    }
  } else {
    for (var i = 0; i < names.length; i++) {
      var name = names[i];
      if (!name.match(/\//)) {
        fl.trace(name);
      }
    }
  }
}

//mv
function mv() {
  var source = arguments[0];
  var dest = arguments[1].replace(/\/$/, "");

  for (var i = 0; i < names.length; i++) {
    var name = names[i];
    if (name.match(new RegExp(source, "i"))) {
      library.moveToFolder(dest, name, true);
    }
  }
}

//cp
function cp() {
  var source = arguments[0];
  library.duplicateItem(source);
}

//rm
function rm() {
  var source = (arguments[0].match(/\$$/) == null) ? arguments[0] + "$" : arguments[0];
  source = "^" + source;
  for (var i = 0; i < names.length; i++) {
    var name = names[i];
    if (name.match(new RegExp(source, "i"))) {
      library.deleteItem(name);
    }
  }
}


//claer
function clear() {
  fl.outputPanel.clear();
}

//suggest
function suggest(word) {
  initNames();
  var result = [];
  for (var i =0; i < names.length; i++) {
    if (names[i].match(new RegExp("^" + word, "i"))) {
      result.push(names[i]);
    }
  }
  return result;
}

LibraryConsole.as

package {

  import adobe.utils.*;
  import flash.display.*;
  import flash.events.*;
  import flash.text.*;
  import flash.ui.*;

  public class LibraryConsole extends MovieClip {

    private static var JSFL_PATH:String = "file:///path/to/LibraryConsole.jsfl";
    private var fileNames:Array;
    private var suggestions:Array;

    public function LibraryConsole() {
      initialize();
      input.tabEnabled = false;
    }

    public function initialize():void {
      fileNames = runScript(JSFL_PATH, "getNames", "").split(",");

      addEventListener(KeyboardEvent.KEY_DOWN, function(event:KeyboardEvent):void {
        //enter
        if (event.keyCode == Keyboard.ENTER) {
          runScript(JSFL_PATH, "run", input.text);
          input.text = "";
        }

        //tab
        if (event.keyCode == Keyboard.TAB) {
          var wordStartIndex:int =input.text.lastIndexOf(" ", input.caretIndex) + 1;
          var wordEndIndex:int = input.caretIndex;

          var word:String = input.text.substring(wordStartIndex, wordEndIndex);
          var suggestions:Array = runScript(JSFL_PATH, "suggest", word).split(",");
          if (suggestions.length > 0) {
            input.replaceText(wordStartIndex, wordEndIndex, suggestions[0]);
            input.setSelection(input.text.length, input.text.length);
          }
        }
      });
    }

    private function runScript(path:String, func:String, param:String):* {
      var jsfl:String = 'fl.runScript("' + arguments.join('","') + '");';
      return MMExecute(jsfl);
    }
  }
}

comments (0)このエントリーを含むはてなブックマークはてなブックマーク - ライブラリを Unix コマンド風に操作するエクステンション

comments