/* * Copyright (c) 2014,egret.com * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the egret.com nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY EGRET-LABS.ORG AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL EGRET-LABS.ORG AND CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /// import file = require("../FileUtil"); import xml = require("../xml/index"); import CodeUtil = require("./code_util"); import create_manifest = require("./createManifest"); var properties = {}; var stylesMap = {}; class EXMLConfig{ /** * Egret命名空间 */ public static E:string = "http://ns.egret-labs.org/egret"; /** * Wing命名空间 */ public static W:string = "http://ns.egret-labs.org/wing"; /** * 构造函数 */ public constructor() { var exmlPath: string = egret.root + "/tools/lib/exml/"; exmlPath = exmlPath.split("\\").join("/"); var str:string = file.read(exmlPath+"egret-manifest.xml"); var manifest:any = xml.parse(str); this.parseManifest(manifest); str = file.read(exmlPath+"properties.json"); properties = JSON.parse(str); this.findStyles(properties); } public static getInstance():EXMLConfig { if (!exmlConfig) { exmlConfig = new EXMLConfig(); } return exmlConfig; } private findStyles(properties:any):void{ var data:any = properties["styles"]; if(!data){ return; } for(var key in data){ var classData:any = properties[key]; if(!classData){ continue; } var list:Array = data[key]; var length:number = list.length; for(var i:number=0;i = this.classNameToModule[className]; if(!list){ list = this.classNameToModule[className] = []; } if(ns&&list.indexOf(ns)==-1){ list.push(ns); } } } /** * 解析框架清单文件 */ public parseManifest(manifest:any):void{ var children:Array = manifest.children; var length:number = children.length; for(var i:number=0;i0){ var index:number = CodeUtil.getFirstVariableIndex("module",text); if(index==-1){ break; } text = text.substring(index+6); index = text.indexOf("{"); if(index==-1){ continue; } var ns:string = text.substring(0,index).trim(); text = text.substring(index); index = CodeUtil.getBracketEndIndex(text); if(index==-1) { break; } var block:string = text.substring(0,index); text = text.substring(index); if(ns==moduleName){ if(nsPrefiex) { ns = nsPrefiex+"."+moduleName; } data = this.getPropFromBlock(block,className,ns); break; } else if(moduleName.indexOf(ns)==0&&moduleName.charAt(ns.length)=="."){ var tail:string = moduleName.substring(ns.length+1); var prefix:string = moduleName.substring(0,ns.length); if(nsPrefiex){ prefix = nsPrefiex+"."+prefix; } data = this.getPropertiesFromTs(block,tail+"."+className,prefix); if(data) { break; } } } } else{ data = this.getPropFromBlock(text,className,nsPrefiex); } return data; } private getPropFromBlock(block:string,targetClassName:string,ns:string):any{ var data:any; while(block.length>0){ var index:number = CodeUtil.getFirstVariableIndex("class",block); if(index==-1){ break; } block = block.substring(index+5); index = block.indexOf("{"); var preStr:string = block.substring(0,index); block = block.substring(index); var className:string = CodeUtil.getFirstVariable(preStr); if(className!=targetClassName){ continue; } data = {}; preStr = CodeUtil.removeFirstVariable(preStr,className); var word:string = CodeUtil.getFirstVariable(preStr); if(word=="extends"){ preStr = CodeUtil.removeFirstVariable(preStr); word = CodeUtil.getFirstWord(preStr); if(word){ word = this.getFullClassName(word,ns); data["super"] = word; } preStr = CodeUtil.removeFirstWord(preStr); word = CodeUtil.getFirstVariable(preStr); } if(word=="implements"){ preStr = CodeUtil.removeFirstVariable(preStr); var arr:Array = preStr.split(","); for(var i:number = arr.length-1;i>=0;i--){ var inter:string = arr[i]; inter = inter.trim(); if(inter){ inter = this.getFullClassName(inter,ns); arr[i] = inter; } else{ arr.splice(i,1); } } data["implements"] = arr; } index = CodeUtil.getBracketEndIndex(block); if(index==-1) break; var text:string = block.substring(0,index+1); this.readProps(text,data,ns); break; } return data; } /** * 根据类类短名,和这个类被引用的时所在的module名来获取完整类名。 */ private getFullClassName(word:string,ns:string):string { if (!ns||!word) { return word; } var prefix:string = ""; var index:number = word.lastIndexOf("."); var nsList; if(index==-1){ nsList = this.classNameToModule[word]; } else{ prefix = word.substring(0,index); nsList = this.classNameToModule[word.substring(index+1)]; } if(!nsList){ return word; } var length = nsList.length; var targetNs = ""; for(var k=0;ktargetNs.length){ targetNs = superNs; } } } if(targetNs){ word = targetNs+"."+word; } return word; } private basicTypes:Array = ["void","any","number","string","boolean","Object","Array","Function"]; private readProps(text:string,data:any,ns:string):void{ var lines:Array = text.split("\n"); var length:number = lines.length; for(var i:number=0;i = dataA["implements"]; if(list){ var length:number = list.length; for(var i:number=0;i