每周学一点 egret(6):抽离Exml对象id声明

今天抽了一点小时间,写了一个抽离Exml文件的工具,采用As3正则一点点调试,在网上找了一个匹配表达式开始尝试。然后一步步抽出来。
至于匹配率如何?我想还可以继续深入挖潜吧,只不过是方便自己使用。偷懒去声明这些对象,但是对于自定义的对象声明没有做出来的。只能加入类型去匹配了。这一点也不是特别难。但是整体难是这个正则每次都得去查询一下,一点点尝试。
这里写图片描述

代码如下,生成一个swf 就可以使用,其实还可以继续做成拖动文件生成的效果,官方提供这种机制还更好。还有一部分人在基础类使用一种巧妙的办法处理,不用去生成这些声明。

都是方便自己而已。

import flash.text.*;
var codeText:TextField  = new TextField();
codeText.text = "粘贴Egret代码";
codeText.width  = 736.95;
codeText.height = 223.85;
codeText.type = TextFieldType.INPUT;
codeText.border = true;
codeText.x = 25;
codeText.y =  20;
codeText.multiline = true;
addChild(codeText);


var resultText:TextField  = new TextField();
resultText.text = "输出结果";
resultText.width  = 736.95;
resultText.height = 223.85;
resultText.type = TextFieldType.DYNAMIC;
resultText.border = true;
resultText.x = 25;
resultText.y =  262;
resultText.multiline = true;
addChild(resultText);


stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDownHandler);

function onKeyDownHandler(event:KeyboardEvent):void
{
    if (event.keyCode == 13)
    {
        changeCode();
    }
}

//抽离id值
function changeCode():void
{

    var codeStr:String = codeText.text;
    var array:Array = codeStr.split("\r");
    var reg:RegExp = new RegExp(" id=\"(.*?)\"","ig");
    var resultStr:String = "";//结果
    for each (var str:String in array)
    {
        //搜索空格符
        var space:String = str.substr(str.indexOf(":") + 1);

        //从:冒号开始搜索
        var startIndex:int = str.indexOf(":") + 1;
        var endIndex:int = startIndex + space.indexOf(" ");//以第一个空格符结束为标记
        var typeStr:String = str.substring(startIndex,endIndex);//egret的类型

        var temp:Array = str.match(reg);
        if (temp && temp[0])
        {
            var idStr:String =  temp[0].replace("id=",'').replace("\"",'').replace("\"",'');
            resultStr +=  "public #1:egret.gui.#2;".replace("#1",idStr).replace("#2",typeStr) + "\n";
        }
    }

resultText.text = resultStr;
}

最后改用Air 处理,既可以方便自己使用,又可以查看包路径 一举两得
这里写图片描述

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx"  width="912" height="565"  addedToStage="windowedapplication1_addedToStageHandler(event)" creationComplete="windowedapplication1_creationCompleteHandler(event)">
    <fx:Declarations>
        <!-- 将非可视元素(例如服务、值对象)放在此处 -->
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.events.DragEvent;
            import mx.events.FileEvent;
            import mx.events.FlexEvent;
            import mx.managers.DragManager;

            protected function windowedapplication1_creationCompleteHandler(event:FlexEvent):void
            {
                fileSystemTree.addEventListener(FileEvent.FILE_CHOOSE,onSelectFile);             
                this.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER,onDragEnter);  
                this.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP,onDragComplete); 

                var mainMenu:NativeMenu = new NativeMenu();
                mainMenu.addEventListener(Event.SELECT,onSelectMenu);
                var parse:NativeMenuItem = new NativeMenuItem("粘贴");

                 mainMenu.items = [parse];
                 this.contextMenu=mainMenu;//将菜单加入到程序中
            }  

            private function onSelectMenu(event:Event):void
            {
                var array:Array = Clipboard.generalClipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
                if(array && array.length > 0)
                {
                    var file:File = array[0];
                    var fileStream:FileStream = new FileStream();
                    fileStream.open(file,FileMode.READ);
                    var str:String = fileStream.readMultiByte(fileStream.bytesAvailable,"utf-8");
                    fileStream.close();  
                    if(str)
                    {
                        setText(str,file);
                    }
                }
            }


            private function onDragComplete(event:NativeDragEvent):void
            {
                var dropfiles:Array = event.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;                      
                var file:File = dropfiles[0];  
                var fileStream:FileStream = new FileStream();  
                fileStream.open(file, FileMode.READ);  
                var str:String = fileStream.readMultiByte(fileStream.bytesAvailable, "utf-8");  
                fileStream.close();  
                if(str)
                {
                    setText(str, file);      
                }
            }

            private function onDragEnter(event:NativeDragEvent):void
            {                

                if(event.clipboard.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)   &&
                   event.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT)[0].nativePath.split(".")[1] == "exml")
                {  
                    NativeDragManager.acceptDragDrop(this);  
                }
            }

            private function  onSelectFile(event:FileEvent):void
            {
                if(event.file && event.file.isDirectory == false)
                {
                    var fileStream:FileStream = new FileStream();
                    fileStream.open(event.file,FileMode.READ);
                    var str:String = fileStream.readMultiByte(fileStream.bytesAvailable,"utf-8");
                    fileStream.close();  
                    if(str)
                    {
                        setText(str,event.file);
                    }
                }
            }

            private function setText(str:String,file:File):void
            {
                codeTextArea.text = str;
                changeCode(str);

                //file:///E:/egret/egrettt/AddressBook/src/skins/scene/MainViewSkin.exml
                if(!file) return;
                var url:String = file.url;
                var startIndex:int = url.indexOf("src/")+4;
                var endIndex:int = url.lastIndexOf(".");
                var tempStr:String = url.substring(startIndex,endIndex);
                var reg:RegExp =  new RegExp("/", "g");

                tempStr = tempStr.replace(reg,".");
                resultTextArea.appendText("\n\n\n对应包路径 =============     \n  ");
                resultTextArea.appendText(tempStr);
            }

            private function changeCode(codeStr:String):void
            {

                var codeStr:String = codeStr;
                var array:Array = codeStr.split("\n");
                var reg:RegExp = new RegExp(" id=\"(.*?)\"","ig");
                var resultStr:String = "";//结果
                for each (var str:String in array)
                {
                    //搜索空格符
                    var space:String = str.substr(str.indexOf(":") + 1);

                    //从:冒号开始搜索
                    var startIndex:int = str.indexOf(":") + 1;
                    var endIndex:int = startIndex + space.indexOf(" ");//以第一个空格符结束为标记
                    var typeStr:String = str.substring(startIndex,endIndex);//egret的类型

                    var temp:Array = str.match(reg);
                    if (temp && temp[0])
                    {
                        var idStr:String = String(temp[0]).replace("id=",'').replace("\"",'').replace("\"",'');
                        resultStr +=  "public #1:egret.gui.#2;".replace("#1",idStr).replace("#2",typeStr) + "\n";
                    }
                }

                resultTextArea.text = resultStr;
            }

            protected function windowedapplication1_addedToStageHandler(event:Event):void
            {
                var array:Array = Clipboard.generalClipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
                if(array && array.length > 0)
                {
                    var file:File = array[0];
                    var fileStream:FileStream = new FileStream();
                    fileStream.open(file,FileMode.READ);
                    var str:String = fileStream.readMultiByte(fileStream.bytesAvailable,"utf-8");
                    fileStream.close();  
                    if(str)
                    {
                        setText(str,file);
                    }
                }
            }

        ]]>
    </fx:Script>


    <mx:DividedBox direction="horizontal" width="100%" height="100%">

        <mx:Panel title="目录" width="20%" height="100%" backgroundColor="0xCCCCCC">
            <mx:FileSystemTree  id="fileSystemTree" x="19" y="30" width="100%" height="100%"/>
        </mx:Panel>

        <mx:Panel title="代码" width="40%" height="100%" backgroundColor="0xCCCCCC">
            <s:TextArea id="codeTextArea"  editable="false" x="283" y="30" width="100%" height="100%"/>
        </mx:Panel>
        <mx:Panel title="转换代码" width="40%" height="100%" backgroundColor="0xCCCCCC">
            <s:TextArea  id="resultTextArea" fontSize="15" x="283" y="30" width="100%" height="100%"/>
        </mx:Panel>
    </mx:DividedBox>
</s:WindowedApplication>

安装好后,我们对其进行设置快捷键,则可以快速弹出界面出来。因为我们程序写了复制粘贴的功能,所以复制exml文件也是能够生效的。

这里写图片描述

对文件进行复制,然后使用之前设置的快捷键 ctrl+shift+L 弹出窗口,这样子就可以生成我们想要的数据了。

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值