ライブラリのアイテムを 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); } } }