/*
* 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