使用jsfl批量重命名flash库项目

时间:2011-02-21 19:19:24

标签: flash rename jsfl

版本flash cs5

好的,所以我知道重命名所有选定库项目的通用代码

var items = fl.getDocumentDOM().library.getSelectedItems();
for (var i=0; i<items.length; i++){
var item = items[i];
item.name = "ABC_"+item.name;
}

但如果库项目在文件夹中,这还不够好...因为item.name返回完整路径,但item.name设置名称。 o.O正如其他人在此指出的那样,http://forums.adobe.com/message/107718

  • 所以当我尝试将 Level1 重命名为 ABC_Level1
  • 如果Level1的文件夹路径是LIBRARY / FolderA / FolderB / Level1
  • 我得到了这个
  • ABC_FolderA-FolderB中-级别1

我可能会编写某种字符串解析器,就像这样,

item.name =“ABC _”+ item.name.substr(item.name.lastIndexOf(“ - ”),99)

但是这真的很难看,如果库项目已经包含“ - ”,那就不行了。例如“Level-1”

所以我想我想要的是一种不同的方式来访问名称,它只返回名称而不是路径

3 个答案:

答案 0 :(得分:8)

这很棘手,因为当你获取这个名称时,它就是完整路径,但是当你设置这个名字时,它只是项目名称(而不是路径)。在连接之前,您必须分隔名称和文件夹。因此,没有“干净”的方法来做到这一点,尽管编写一个函数可能会使它更具可读性:

function getItemName(item) {
   return item.name.split("/").pop();
}

然后设置项目的名称:

 item.name = "ABC_" + getItemName(item);

答案 1 :(得分:1)

如果我没有误会 - JSFL就像大多数JavaScript语言实现一样,是一种基于原型的语言。这意味着,您可以向现有内置对象添加新属性/方法。理论上,你可以使所有的库项目都有一个“getShortName()”方法,就像@Justin Putney的解决方案一样。

有些事情:

Object.prototype.addMethod = function(name, pMethod) {
  this.prototype[name] = pMethod;
}

Function.prototype.addMethod = function(name, pMethod) {
  this.prototype[name] = pMethod;
}

Object.addMethod( "getShortName", function() {
  return this.name.split("/").pop();
});

/*
  NOTE: SymbolItem.addMethod was causing a bug, so Object, although it's generic,
  seems like the best choice.
*/

fl.trace( fl.getDocumentDOM().library.items[0].getShortName() );

这使得它成为一般在JSFL中扩展功能的简便方法。理想情况下,您只想运行此代码段ONCE的第一部分(方法定义),因为只要您的Flash IDE正在运行,它们就会持续存在。

答案 2 :(得分:0)

在JSFL中添加属性是可能的,但是你永远不应该向本机原型添加属性,因为这将修改Flash中的所有对象,特别是在for..in迭代中修复它的丑陋头。 Adobe的IK工具实际上在内部使用for..in循环,它们本应使用for循环。扩展Object.prototype后你会注意到这一点......当你与舞台交互时,输出面板(CS4)将开始填满错误!

我的测试,我无法扩展Item(也许是因为它内部是一个抽象类?)但我可以扩展SymbolItem(所以你需要扩展所有其他Item变体):

SymbolItem.prototype.__defineGetter__('shortName', function(element){ return this.name.split('/').pop(); })
SymbolItem.prototype.__defineGetter__('path', function(element){ return this.name; })

trace(fl.getDocumentDOM().library.items[0].shortName);

使用getter还可以保护您免受我刚才提到的问题。