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

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