ExtendScript Parse资源字符串以创建变量路径

时间:2014-12-17 20:09:59

标签: javascript regex extendscript resourcestring

我希望通过解析资源字符串来自动创建我的变量路径来加快我的工作流程。查看大规模用户界面不仅会让人感到困惑,而且更难以通过写出路径来访问每个元素。 ExtendScript有很多" quirks"我们称之为。因此,为了简单起见,下面的示例将被切断。

var res = "group{,\
itemsToRenameGrp: Group{,\
    itemsToRenameDD: DropDownList{},\
    help: Button{},\
},\
listTabPnl: Panel{,\
    listOfItemsTab: Panel{,\
        listOfItemsPnl: Panel{,\
            listOfItemsLB: ListBox{},\
        },\
        confirmChanges: Button{},\
    },\
    badItemsTab: Panel{,\
        errorLogET: EditText{},\
    },\
},\
}";

我需要为变量赋值创建这样的路径:

itemsToRenameGrp.itemsToRenameDD
itemsToRenameGrp.help

listTabPnl.listOfItemsTab.listOfItemsPnl
listTabPnl.listOfItemsTab.listOfItemsPnl.listOfItemsLB
listTabPnl.listOfItemsTab.confirmChanges

listTabPnl.badItemsTab
listTabPnl.badItemsTab.errorLogET

我知道必须通过RegExp来解析制表符空格,或者"},\"为了完成这项工作,我只能自己找出解决方案。任何帮助表示赞赏。感谢。

4 个答案:

答案 0 :(得分:0)

不需要那些反斜杠,当你用三个双引号开始一个字符串时有一个特殊的多行模式。

不是解析源代码,而是将其留给ExtendScript并迭代生成的UI对象。

答案 1 :(得分:0)

我同意,查看复杂的资源字符串然后必须将“路径”写入您想要使用的UI元素是相当麻烦的。我不确定RegEx是这样的,我没有看得太远,但我提出的解决方案是创建一个函数,返回元素的“扁平路径”,以便我可以参考他们很轻松。如果资源字符串发生了变化,那么我所要做的就是修改“flattened pathway”函数来解释这些变化 - 这样我就不需要在代码中的其他地方更改任何内容了。

例如,根据您发布的代码,我会创建一个看起来像这样的函数:

function getGUI(ui){

  var gui = {};

  gui.lRename  = ui.itemsToRenameGrp.itemsToRenameDD;
  gui.bHelp    = ui.itemsToRenameGrp.help;
  gui.lItems   = ui.listTabPn1.listOfItemsTab.listOfItemsPn1.listOfItemsLB;
  gui.bConfirm = ui.listTabPn1.listOfItemsTab.confirmChanges;
  gui.eLog     = ui.listTabPn1.badItemsTab.errorLogET;

  return gui;
}

然后,当您使用Window对象完成“构建”UI时,请调用该函数:

var _mainGUI = getGUI({variable that holds your Window object});

现在,当您想要访问元素时,只需将它们称为:

_mainGUI.lRename
_mainGUI.bConfirm
_mainGUI.lItems

......等等。因此,如果您对资源字符串进行了更改,则只需修改getGUI函数,您的应用程序代码就可以保持不变。希望这有帮助,并且我对最初的,不完整的回答帖子表示道歉 - 我太早意外地点击了提交按钮。

答案 2 :(得分:0)

另一种可能性是解析字符串而不是完成的窗口,如下所示:

function loadNamedWidgets(cont, _target){
    // cont : ScruitUI container
    // _target : Object
    var k, K, child, id;
    K=cont.children.length;
    for (k=0; k<K; k++){
        child = cont.children[k];
        if (/^(Window|Panel|Group)$/.test(child.constructor.name)){
            loadNamedWidgets(child, _target);
            }
        else{
            // check that a ownProperty of cont is same as child
            for (id in cont){
                if (cont.hasOwnProperty(id)){
                    if (cont[id] === child) {_target[id] = child; break;};
                    }
                else break;
                };
            };
        };
    return;
    };

测试: 在下面的测试中, * radio1和radio2将被写入两次,但来自p2的那些将覆盖来自p1的那些(名称冲突), *在最后添加的titleST(未命名)将不会出现,而valueET(已命名)将会出现。

var w = new Window("palette{\
            text : 'hi',\
            header : Group{\
                        superBtn : Button{},\
                        extraBtn : Button{},\
                        helpBtn : Button{},\
                        },\
            body: Group{\
                        p1 : Panel{\
                                    _tag : 1,\
                                    radio1 : RadioButton{},\
                                    radio2 : RadioButton{},\
                                    },\
                        p2 : Panel{\
                                    _tag : 2,\
                                    radio1 : RadioButton{},\
                                    radio2 : RadioButton{},\
                                    },\
                        },\
            console : Group{\
                        consoleET : EditText{text: '', properties: {readonly: true}},\
                        },\
            footer : Group{}\
            }");
var titleST = w.footer.add("statictext{text : 'title'}");
var valueET = w.footer.valueET = w.footer.add("edittext{text : '0000'}");
var binds = {};
loadNamedWidgets(w, binds);

$.writeln(binds.toSource());

答案 3 :(得分:0)

它很乱,但我终于找到了能给我想要的东西。

解决方案:

var res = "group{,\
    itemsToRenameGrp: Group{,\
        itemsToRenameDD: DropDownList{},\
        help: Button{},\
    },\
    listTabPnl: Panel{,\
        listOfItemsTab: Panel{,\
            listOfItemsPnl: Panel{,\
                listOfItemsLB: ListBox{},\
            },\
            confirmChanges: Button{},\
        },\
        badItemsTab: Panel{,\
            errorLogET: EditText{},\
        },\
    },\
}";

var lines = res.split("\n");
var numLines = lines.length;
var variablePaths = new Array();
var val, newVal, firstColon, firstBrace, lastBrace, tabLength, oldTabLength, path, splitPath;
path = "";
oldTabLength = 0;
if(numLines > 0){
    for(var r=0; r<numLines; r++){
        val = lines[r];
        firstColon = val.indexOf(":");
        firstBrace = val.indexOf("{");
        lastBrace = val.lastIndexOf("}");
        try{tabLength = val.match(/\t/g).length}catch(err){};   /*  Count tabs  */
        if(firstColon > 0 && firstBrace > 0){   /*  Valid possible element line */
            if(firstColon < firstBrace){    /*  Confirmed element line  */
                newVal = val.substring(0, firstColon);  /*  Strip line down to just name and leading tabs   */
                if(tabLength > oldTabLength){   /*  Checks for line indent (child element)  */
                    path += "." + newVal.replace(new RegExp("\t", "g"), "");
                }else if(tabLength == oldTabLength){    /*  Checks for line indent match (same parent as previous element)  */
                    path = path.substring(0, path.lastIndexOf(".")) + "." + newVal.replace(new RegExp("\t", "g"), "");
                }else  if(tabLength < oldTabLength){    /*  Checks for line indent (new parent to add)  */
                    splitPath = path.split(".");
                    try{    /*  This section adjusts how far back in heirarchy to remove    */
                        if(tabLength > 0){
                            splitPath.length -= ((oldTabLength - tabLength)+1);
                        }else{
                            splitPath.length -= (oldTabLength - tabLength);
                        }
                    }catch(err){};
                    path = splitPath.join(".").toString() + "." + newVal.replace(new RegExp("\t", "g"), "");    /*  Creates new cleaned up string path (tabs removed)   */
                }
                oldTabLength = tabLength;
                if(tabLength >= oldTabLength){
                    variablePaths.push(path);   /*  Populates array */
                }
            }
        }
    }
}else{
    alert("Nothing to process");
}

alert("Element Names:\n" + variablePaths.join("\n"));

- David Torno