每週學一點 egret(6):抽離Exml物件id宣告
阿新 • • 發佈:2019-01-31
今天抽了一點小時間,寫了一個抽離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 彈出視窗,這樣子就可以生成我們想要的資料了。