今天抽了一点小时间,写了一个抽离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 弹出窗口,这样子就可以生成我们想要的数据了。