Files
core/Test/Applications/DocxFormatCodeGen/codegen/CodegenJS.cs
Sergey.Konovalov 85035b1aa0 (2.0.0.163): ASCOfficeDocxFile2
(1.0.0.110): XlsxSerializerCom
Serialize полной структуры chart, с помощью генератора кода из xsd
переход на один StringWriter из xmlutils
при записи c_oSerCellTypes::RefRowCol индексы начинаются от 0.

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@55323 954022d7-b5bf-4e40-9824-e11837661b57
2016-05-20 22:49:33 +03:00

383 lines
18 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace codegen
{
class CodegenJS
{
Dictionary<string, GenClass> m_mapProcessedClasses = new Dictionary<string, GenClass>();
public void Process(string sOutputDir, List<GenClass> aGenClasses)
{
StringBuilder oJsSer = new StringBuilder();
List<GenClass> aEnums = new List<GenClass>();
List<GenClass> aClasses = new List<GenClass>();
for (int i = 0; i < aGenClasses.Count; ++i)
{
GenClass oGenClass = aGenClasses[i];
if (oGenClass.bIsEnum)
aEnums.Add(oGenClass);
else
aClasses.Add(oGenClass);
m_mapProcessedClasses[oGenClass.sName] = oGenClass;
}
string sFileJs = "SerializeChart.js";
oJsSer.AppendFormat("\"use strict\";\r\n");
oJsSer.AppendFormat(Utils.gc_sFilePrefix);
//enums
ProcessEnums(oJsSer, aEnums);
//ser enums
ProcessSerEnums(oJsSer, aClasses);
//ToBin
oJsSer.AppendFormat("function {0}(memory){{\r\n", Utils.gc_sBinaryChartWriter);
oJsSer.AppendFormat("this.memory = memory;\r\n");
oJsSer.AppendFormat("this.bs = new BinaryCommonWriter(this.memory);\r\n");
oJsSer.AppendFormat("}}\r\n");
for (int i = 0; i < aClasses.Count; ++i)
ProcessToBin(oJsSer, aClasses[i]);
//FromBin
ProcessFromBin(oJsSer, aEnums, aClasses);
File.WriteAllText(Path.Combine(sOutputDir, sFileJs), oJsSer.ToString());
}
public void ProcessEnums(StringBuilder sb, List<GenClass> aGenClasses)
{
for (int i = 0; i < aGenClasses.Count; ++i)
{
GenClass oGenClass = aGenClasses[i];
for (int j = 0; j < oGenClass.aMembers.Count; ++j)
{
GenMember oGenMember = oGenClass.aMembers[j];
if(!oGenMember.bInternal)
sb.AppendFormat("var {0} = {1};\r\n", Utils.GetEnumElemName(oGenClass.sName, oGenMember.sName), j);
}
sb.AppendFormat("\r\n");
}
}
public void ProcessSerEnums(StringBuilder sb, List<GenClass> aGenClasses)
{
for (int i = 0; i < aGenClasses.Count; ++i)
{
GenClass oGenClass = aGenClasses[i];
int nCounter = 0;
for (int j = 0; j < oGenClass.aMembers.Count; ++j)
{
GenMember oGenMember = oGenClass.aMembers[j];
if (!oGenMember.bInternal)
{
sb.AppendFormat("var {0} = {1};\r\n", Utils.GetSerEnumElemName(oGenClass.sName, oGenMember.sName), nCounter++);
if (null != oGenMember.aArrayTypes)
{
for (int k = 0; k < oGenMember.aArrayTypes.Count; ++k)
{
sb.AppendFormat("var {0} = {1};\r\n", Utils.GetSerEnumElemName(oGenClass.sName, oGenMember.aArrayTypes[k].sName), nCounter++);
}
}
}
}
sb.AppendFormat("\r\n");
}
}
public void ProcessFromBin(StringBuilder sb, List<GenClass> aEnums, List<GenClass> aClasses)
{
sb.AppendFormat("function {0}(stream){{\r\n", Utils.gc_sBinaryChartReader);
sb.AppendFormat("this.stream = stream;\r\n");
sb.AppendFormat("this.bcr = new Binary_CommonReader(this.stream);\r\n");
sb.AppendFormat("}}\r\n");
for (int i = 0; i < aClasses.Count; ++i)
{
GenClass oGenClass = aClasses[i];
if (oGenClass.bIsRoot)
{
sb.AppendFormat("{0}.prototype.ExternalRead{1} = function(length, val){{\r\n", Utils.gc_sBinaryChartReader, oGenClass.sName);
sb.AppendFormat("var res = c_oSerConstants.ReadOk;\r\n");
sb.AppendFormat("var oThis = this;\r\n");
sb.AppendFormat("res = this.bcr.Read1(length, function(t, l){{\r\n");
sb.AppendFormat("return oThis.Read{0}(t, l, val);\r\n", oGenClass.sName);
sb.AppendFormat("}});\r\n");
sb.AppendFormat("return res;\r\n");
sb.AppendFormat("}}\r\n");
}
sb.AppendFormat("{0}.prototype.Read{1} = function(type, length, val){{\r\n", Utils.gc_sBinaryChartReader, oGenClass.sName);
sb.AppendFormat("var res = c_oSerConstants.ReadOk;\r\n");
sb.AppendFormat("var oThis = this;\r\n");
int nCounter = 0;
for (int j = 0; j < oGenClass.aMembers.Count; ++j)
{
GenMember oGenMember = oGenClass.aMembers[j];
if (!oGenMember.bInternal)
{
if (null != oGenMember.aArrayTypes)
{
for (int k = 0; k < oGenMember.aArrayTypes.Count; ++k)
{
nCounter = ProcessMemberFromBin(sb, "val", oGenClass, oGenMember.aArrayTypes[k], oGenMember, nCounter);
}
}
else
{
nCounter = ProcessMemberFromBin(sb, "val", oGenClass, oGenMember, null, nCounter);
}
}
}
sb.AppendFormat("else\r\nres = c_oSerConstants.ReadUnknown;\r\nreturn res;\r\n}}\r\n", oGenClass.sName);
}
}
int ProcessMemberFromBin(StringBuilder sb, string sVal, GenClass oGenClass, GenMember oGenMember, GenMember oGenMemberContainer, int nCounter)
{
if (0 != nCounter)
sb.AppendFormat("else ");
sb.AppendFormat("if({0} === type){{\r\n", Utils.GetSerEnumElemName(oGenClass.sName, oGenMember.sName));
if (oGenMember.bToDo || !CanProcessToDoString(oGenMember))
sb.AppendFormat("//todo\r\n");
sb.AppendFormat("var oNewVal;\r\n");
if (!ProcessFromBinToDo(sb, oGenMember, "oNewVal"))
{
if (null != oGenMember.sType)
{
GenClass oTempClass;
if (m_mapProcessedClasses.TryGetValue(oGenMember.sType, out oTempClass))
{
if (oTempClass.bIsEnum)
{
sb.AppendFormat("oNewVal = {0};\r\n", ProcessJsTypeFromBin(sb, typeof(byte)));
}
else
{
sb.AppendFormat("oNewVal = {{}};\r\n");
sb.AppendFormat("res = this.bcr.Read1(length, function(t, l){{\r\n");
sb.AppendFormat("return oThis.Read{0}(t, l, oNewVal);\r\n", oTempClass.sName);
sb.AppendFormat("}});\r\n");
}
}
}
else if (null != oGenMember.oSystemType)
{
sb.AppendFormat("oNewVal = {0};\r\n", ProcessJsTypeFromBin(sb, oGenMember.oSystemType));
}
else
sb.AppendFormat("res = c_oSerConstants.ReadUnknown;\r\n");
}
if (null != oGenMemberContainer)
{
sb.AppendFormat("if(null == {0}.{1})\r\n", sVal, Utils.GetMemberElemName(oGenMemberContainer.sArrayTypesElementName));
sb.AppendFormat("{0}.{1} = [];\r\n", sVal, Utils.GetMemberElemName(oGenMemberContainer.sArrayTypesElementName));
sb.AppendFormat("{0}.{1}.push({2});\r\n", sVal, Utils.GetMemberElemName(oGenMemberContainer.sArrayTypesElementName), Utils.GetEnumElemName(oGenMemberContainer.sArrayTypesEnumName, oGenMember.sName));
sb.AppendFormat("if(null == {0}.{1})\r\n", sVal, Utils.GetMemberElemName(oGenMemberContainer.sName));
sb.AppendFormat("{0}.{1} = [];\r\n", sVal, Utils.GetMemberElemName(oGenMemberContainer.sName));
sb.AppendFormat("{0}.{1}.push(oNewVal);\r\n", sVal, Utils.GetMemberElemName(oGenMemberContainer.sName));
}
else
{
if (oGenMember.bIsArray)
{
sb.AppendFormat("if(null == {0}.{1})\r\n", sVal, Utils.GetMemberElemName(oGenMember.sName));
sb.AppendFormat("{0}.{1} = [];\r\n", sVal, Utils.GetMemberElemName(oGenMember.sName));
sb.AppendFormat("{0}.{1}.push(oNewVal);\r\n", sVal, Utils.GetMemberElemName(oGenMember.sName));
}
else
sb.AppendFormat("{0}.{1} = oNewVal;\r\n", sVal, Utils.GetMemberElemName(oGenMember.sName));
}
sb.AppendFormat("}}\r\n");
nCounter++;
return nCounter;
}
bool ProcessFromBinToDo(StringBuilder sb, GenMember oGenMember, string oVal)
{
bool bRes = false;
if (oGenMember.bToDoString)
{
bRes = true;
if ("spPr" == oGenMember.sName)
{
sb.AppendFormat("res = c_oSerConstants.ReadUnknown;\r\n");
//sb.AppendFormat("var oPPTXContentLoader = new CPPTXContentLoader();\r\n");
//sb.AppendFormat("{0} = oPPTXContentLoader.ReadShapeProperty(this.stream);\r\n", oVal);
}
else if ("txPr" == oGenMember.sName || "rich" == oGenMember.sName)
{
sb.AppendFormat("res = c_oSerConstants.ReadUnknown;\r\n");
//sb.AppendFormat("{0} = new CTitle();\r\n", oVal);
//sb.AppendFormat("var oPPTXContentLoader = new CPPTXContentLoader();\r\n");
//sb.AppendFormat("oPPTXContentLoader.ReadTextBody(null, this.stream, {0});\r\n", oVal);
}
else
bRes = false;
}
return bRes;
}
string ProcessJsTypeFromBin(StringBuilder sb, Type oType)
{
string sRes;
//todo
switch (Type.GetTypeCode(oType))
{
case TypeCode.Boolean:
sRes = "this.stream.GetBool()";
break;
case TypeCode.Byte:
case TypeCode.SByte:
sRes = "this.stream.GetUChar()";
break;
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
sRes = "this.stream.GetULongLE()";
break;
case TypeCode.Single:
case TypeCode.Double:
sRes = "this.stream.GetDoubleLE()";
break;
default: sRes = "this.stream.GetString2LE(length)"; break;
}
return sRes;
}
public void ProcessToBin(StringBuilder sb, GenClass oGenClass)
{
sb.AppendFormat("{0}.prototype.Write{1} = function(oVal){{\r\n", Utils.gc_sBinaryChartWriter, oGenClass.sName);
sb.AppendFormat("var oThis = this;\r\n");
for (int i = 0; i < oGenClass.aMembers.Count; ++i)
{
GenMember oGenMember = oGenClass.aMembers[i];
if (!oGenMember.bInternal)
{
if (oGenMember.bIsArray)
{
sb.AppendFormat("if(null != oVal.{0})\r\n{{\r\n", Utils.GetMemberElemName(oGenMember.sName));
sb.AppendFormat("for(var i = 0, length = oVal.{0}.length; i < length; ++i)\r\n", Utils.GetMemberElemName(oGenMember.sName));
sb.AppendFormat("{{\r\n");
if (null != oGenMember.aArrayTypes)
{
sb.AppendFormat("var eType = oVal.{0}[i];\r\n", Utils.GetMemberElemName(oGenMember.sArrayTypesElementName));
sb.AppendFormat("this.toBin{0}(eType, oVal.{1}[i]);\r\n", oGenMember.sArrayTypesEnumName, Utils.GetMemberElemName(oGenMember.sName));
}
else
{
sb.AppendFormat("var oCurVal = oVal.{0}[i];\r\n", Utils.GetMemberElemName(oGenMember.sName));
ProcessMemberToBin(sb, oGenClass, oGenMember, "oCurVal");
}
sb.AppendFormat("}}\r\n");
sb.AppendFormat("}}\r\n");
}
else
{
sb.AppendFormat("var oCurVal = oVal.{0};\r\n", Utils.GetMemberElemName(oGenMember.sName));
ProcessMemberToBin(sb, oGenClass, oGenMember, "oCurVal");
}
}
}
sb.AppendFormat("}}\r\n");
for (int i = 0; i < oGenClass.aMembers.Count; ++i)
{
GenMember oGenMember = oGenClass.aMembers[i];
if (!oGenMember.bInternal)
{
if (null != oGenMember.aArrayTypes)
ProcessArrayTypesToBin(sb, oGenClass, oGenMember);
}
}
}
void ProcessArrayTypesToBin(StringBuilder sb, GenClass oGenClass, GenMember oGenMember)
{
sb.AppendFormat("{0}.prototype.toBin{1} = function(eType, oVal){{\r\n", Utils.gc_sBinaryChartWriter, oGenMember.sArrayTypesEnumName);
sb.AppendFormat("var oThis = this;\r\n");
sb.AppendFormat("switch(eType)\r\n{{\r\n");
for (int i = 0; i < oGenMember.aArrayTypes.Count; ++i)
{
GenMember oTempMember = oGenMember.aArrayTypes[i];
sb.AppendFormat("case {0}:\r\n{{\r\n", Utils.GetEnumElemName(oGenMember.sArrayTypesEnumName, oTempMember.sName));
ProcessMemberToBin(sb, oGenClass, oTempMember, "oVal");
sb.AppendFormat("}}\r\nbreak;\r\n");
}
sb.AppendFormat("}}\r\n");
sb.AppendFormat("}}\r\n");
}
void ProcessMemberToBin(StringBuilder sb, GenClass oGenClass, GenMember oGenMember, string oVal)
{
sb.AppendFormat("if(null != {0})\r\n", oVal);
sb.AppendFormat("{{\r\n");
sb.AppendFormat("this.bs.WriteItem({0}, function(){{\r\n", Utils.GetSerEnumElemName(oGenClass.sName, oGenMember.sName));
if (oGenMember.bToDo || !CanProcessToDoString(oGenMember))
sb.AppendFormat("//todo\r\n");
if (!ProcessToBinToDo(sb, oGenMember, oVal))
{
if (null != oGenMember.sType)
{
GenClass oTemp;
if (m_mapProcessedClasses.TryGetValue(oGenMember.sType, out oTemp))
{
if (oTemp.bIsEnum)
ProcessJsTypeToBin(sb, oVal, typeof(byte));
else
sb.AppendFormat("oThis.Write{0}({1});\r\n", oGenMember.sType, oVal);
}
}
else if (null != oGenMember.oSystemType)
{
ProcessJsTypeToBin(sb, oVal, oGenMember.oSystemType);
}
}
sb.AppendFormat("}});\r\n", Utils.GetSerEnumElemName(oGenClass.sName, oGenMember.sName));
sb.AppendFormat("}}\r\n");
}
bool ProcessToBinToDo(StringBuilder sb, GenMember oGenMember, string oVal)
{
bool bRes = false;
if (oGenMember.bToDoString)
{
bRes = true;
if ("spPr" == oGenMember.sName)
sb.AppendFormat("window.global_pptx_content_writer.WriteSpPr(oThis.memory, {0});\r\n", oVal);
else if ("txPr" == oGenMember.sName || "rich" == oGenMember.sName)
sb.AppendFormat("window.global_pptx_content_writer.WriteTextBody(oThis.memory, {0});\r\n", oVal);
else
bRes = false;
}
return bRes;
}
void ProcessJsTypeToBin(StringBuilder sb, string sCodeMember, Type oType)
{
//todo
switch (Type.GetTypeCode(oType))
{
case TypeCode.Boolean:
sb.AppendFormat("oThis.memory.WriteBool({0});\r\n", sCodeMember);
break;
case TypeCode.Byte:
case TypeCode.SByte:
sb.AppendFormat("oThis.memory.WriteByte({0});\r\n", sCodeMember);
break;
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
sb.AppendFormat("oThis.memory.WriteLong({0});\r\n", sCodeMember);
break;
case TypeCode.Single:
case TypeCode.Double:
sb.AppendFormat("oThis.memory.WriteDouble2({0});\r\n", sCodeMember);
break;
default: sb.AppendFormat("oThis.memory.WriteString3({0});\r\n", sCodeMember); break;
}
}
bool CanProcessToDoString(GenMember oGenMember)
{
bool bRes = true;
if (oGenMember.bToDoString)
{
bRes = false;
if ("spPr" == oGenMember.sName || "txPr" == oGenMember.sName || "rich" == oGenMember.sName)
bRes = true;
}
return bRes;
}
}
}