1. 程式人生 > >每週學一點 egret(6):抽離Exml物件id宣告

每週學一點 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 彈出視窗,這樣子就可以生成我們想要的資料了。

這裡寫圖片描述