2

我希望通过解析资源字符串来自动创建我的变量路径来加快我的工作流程。不仅查看大型 UI 会让人感到困惑,而且写出访问每个元素的路径更糟糕。ExtendScript 有很多“怪癖”,我们称之为。因此,为了简单起见,下面的示例被削减了很多。

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

4 回答 4

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;
    };

TEST : 在下面的测试中,*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());
于 2015-02-12T17:19:50.570 回答
0

我同意查看复杂的资源字符串然后必须将“路径”写入要使用的 UI 元素是相当麻烦的。我不确定 RegEx 是否正确,我也没有深入研究它,但我想出的解决方案是创建一个函数,该函数返回元素的“扁平路径”,以便我可以参考他们轻松。如果资源字符串发生变化,那么我所要做的就是修改“扁平化路径”函数来解决这些变化——这样我就不需要在代码的其他地方进行任何更改。

例如,给定您发布的代码,我将创建一个看起来像这样的函数:

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 函数,您的应用程序代码就可以保持不变。希望这会有所帮助,对于最初的、不完整的回答后,我深表歉意——我不小心太早地点击了提交按钮。

于 2015-02-01T15:06:21.583 回答
0

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

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

于 2014-12-19T07:51:10.233 回答
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"));

——大卫·托尔诺

于 2017-03-02T10:00:55.240 回答