import ResourceComponent from "../../data/ResourceComponent";
import Path from "../../Path";
import {TemplateSystem} from "../../TemplateSystem";
import PathHelper from "../../PathHelper";
import Ts3PathTemplate from "./Ts3PathTemplate";
import Ts3PathOut from "./Ts3PathOut";
import Setting from "../../Setting";
import * as path from 'path';
export interface ILines {
}
export default class Ts3ExportComponent
{
public com: ResourceComponent;
constructor(com: ResourceComponent) {
this.com = com;
this.name = this.com.className;
}
public name: string;
structClassContent:string;
structClassDeclareContent:string;
public Export()
{
this.ExportStructClass();
this.ExportExtend();
}
///
/// 导出结构, 合并版本
///
private ExportStructClass()
{
let com = this.com;
let imports: any[] = [];
let fields: any[] = [];
let setControllerList: any[] = [];
let setTransitionList: any[] = [];
let setDisplayList: any[] = [];
// fields
for(let node of this.com.controllerList)
{
if(node.isIgnore)
continue;
let line = [node.fieldName,node.type, node.type];
fields.push(line);
let lineCtrl = [node.fieldName, node.name];
setControllerList.push(lineCtrl);
}
for (let node of this.com.transitionList)
{
if (node.isIgnore)
continue;
let line = [node.fieldName, node.type, node.type];
fields.push(line);
let lineTrans = [node.fieldName, node.name];
setTransitionList.push(lineTrans);
}
for(let node of this.com.displayList)
{
if(node.isIgnore)
continue;
let lines = [node.fieldName,node.type, node.type];
fields.push(lines);
let lineDis = [node.fieldName,node.name,node.type];
setDisplayList.push(lineDis);
}
for(let node of this.com.componentNodeList)
{
if(node.isIgnore)
continue;
let type = node.GetTypeForLaya2(this.com);
var typeStr;
if (node.resourceComponent.isIgnore)
{
typeStr = node.resourceComponent.extendClassName;
}
else
{
let typePath = "src/" + path.basename(Setting.Options.outCodePath) + "/Extends/" + node.resourceComponent.package.codeFolderName + "/" + node.resourceComponent.classNameExtend;
// console.log(typePath);
typeStr = `import('${typePath}').default`;
}
let lines = [node.fieldName, type , typeStr];
fields.push(lines);
let lines2 = [node.fieldName,node.name, type];
setDisplayList.push(lines2);
}
// dependPackages
let dependPackages = "";
let dependPackageList: string[] = new Array();
for (let pkg of this.com.dependPackageList)
{
dependPackageList.push(`\"${pkg.name}\"`);
}
dependPackages = dependPackageList.toString();
// imports
// let importDict = new Map();
// for(let node of this.com.componentNodeList)
// {
// if (node.isIgnore)
// continue;
// if (node.resourceComponent == null)
// continue;
// if (node.resourceComponent.isIgnore)
// continue;
// if (!importDict.has(node.resourceComponent.classNameExtend))
// {
// importDict.set(node.resourceComponent.classNameExtend, true);
// let lines = [node.resourceComponent.classNameExtend, node.GetImportPathForStruct(com) ];
// imports.push(lines);
// }
// }
// imports.push([ com.classNameExtend, PathHelper.GetImportPath(com.tsStructPath, com.tsExtendPath)]);
var template = new TemplateSystem(Path.ReadTxt(Ts3PathTemplate.ComponentStructClassJS));
// template.AddVariable("imports", imports);
template.AddVariable("classNameFGUI", com.classNameFGUI);
template.AddVariable("classNameStruct", com.classNameStruct);
template.AddVariable("classNameExtend", com.classNameExtend);
template.AddVariable("pkgNamespace", com.package.codeFolderName);
template.AddVariable("packagename", com.packageName);
template.AddVariable("dependPackages", dependPackages);
template.AddVariable("comname", Path.GetFileNameWithoutExtension(com.name));
template.AddVariable("URL", com.URL);
template.AddVariable("fields", fields);
template.AddVariable("setControllerList", setControllerList);
template.AddVariable("setDisplayList", setDisplayList);
template.AddVariable("setTransitionList", setTransitionList);
var content = template.Parse();
this.structClassContent = content;
// let path = TsPathOut.ComponentStructClass;
// Path.CheckPath(path, true);
// fs.appendFileSync(path, content , {encoding:'utf-8'})
// 描述文件
let typePath = "src/" + path.basename(Setting.Options.outCodePath) + "/Extends/" + com.package.codeFolderName + "/" + com.classNameExtend;
// console.log(typePath);
var classNameExtend = `import('${typePath}').default`;
var template = new TemplateSystem(Path.ReadTxt(Ts3PathTemplate.ComponentStructClassDeclare));
template.AddVariable("classNameFGUI", com.classNameFGUI);
template.AddVariable("classNameStruct", com.classNameStruct);
template.AddVariable("classNameExtend", classNameExtend);
template.AddVariable("pkgNamespace", com.package.codeFolderName);
template.AddVariable("packagename", com.packageName);
template.AddVariable("dependPackages", dependPackages);
template.AddVariable("comname", Path.GetFileNameWithoutExtension(com.name));
template.AddVariable("URL", com.URL);
template.AddVariable("fields", fields);
template.AddVariable("setControllerList", setControllerList);
template.AddVariable("setDisplayList", setDisplayList);
template.AddVariable("setTransitionList", setTransitionList);
var content = template.Parse();
this.structClassDeclareContent = content;
}
///
/// 导出扩展
///
private ExportExtend()
{
let com = this.com;
let path = Ts3PathOut.ComponentExtend.format(com.package.codeFolderName,this.name);
if(Path.IsFile(path))
return;
// imports
var imports = [];
var lines = [ com.classNameStruct, PathHelper.GetImportPath(com.ts3ExtendPath, Ts3PathOut.FguiStruct) ];
imports.push(lines);
let template: TemplateSystem = new TemplateSystem(Path.ReadTxt(Ts3PathTemplate.ComponentExtend));
// template.AddVariable("imports", imports);
template.AddVariable("pkgNamespace", com.package.codeFolderName);
template.AddVariable("classNameFGUI", com.classNameFGUI);
template.AddVariable("classNameStruct", com.classNameStruct);
template.AddVariable("classNameExtend", com.classNameExtend);
let content = template.Parse();
Path.CheckPath(path);
Path.WriteTxt(path, content);
}
}