2020-01-22 17:33:34 +00:00

3378 lines
115 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.Text.RegularExpressions;
using VEPROMS.CSLA.Library;
using log4net;
using System.IO;
using Volian.Controls.Library;
using C1.Win.C1FlexGrid;
namespace XMLConvert
{
public partial class frmConvertXML : Form
{
public frmConvertXML()
{
InitializeComponent();
Database.VEPROMS_Connection =
"Data Source=.\\SQL2008EXPRESS;Initial Catalog=VEPROMS_Barakah;Integrated Security=True";
}
private XmlDocument _MyXMLDoc = new XmlDocument();
public XmlDocument MyXMLDoc
{
get { return _MyXMLDoc; }
set { _MyXMLDoc = value; }
}
private void btnLoad_Click(object sender, EventArgs e)
{
LoadXml(tbFile.Text, "Document Loaded");
}
private void LoadXml(string fileName, string status)
{
FileInfo fi = new FileInfo(fileName);
//Console.WriteLine(fi.FullName);
StreamReader sr = fi.OpenText();
string buf = sr.ReadToEnd();
sr.Close();
buf = buf.Replace(" \x8", "");
buf = buf.Replace(" \x7", "");
MyXMLDoc.LoadXml(buf);
if (status != null) tbResults.Text = status;
}
private void btnFindNodeTypes_Click(object sender, EventArgs e)
{
LoadXml(tbFile.Text, "Document Loaded");
tbResults.Text = "Finding Nodes\r\n";
SortedList<string, XmlElement> AllNodeTypes = new SortedList<string, XmlElement>();
FindAllNodeTypes(AllNodeTypes, MyXMLDoc.DocumentElement);
foreach (string key in AllNodeTypes.Keys)
tbResults.AppendText(string.Format("[{0}]{1}\r\n", key, Attributes(AllNodeTypes[key])));
}
private string Attributes(XmlElement xe)
{
StringBuilder sb = new StringBuilder();
string sep = "\r\n\t";
foreach (XmlAttribute xa in xe.Attributes)
{
sb.Append(string.Format("{0}[{1}]", sep, xa.Name));
//if (xa.Name == "content")
// sb.Append(string.Format ("\r\n\t\t{0}",xa.Value));
}
return sb.ToString();
}
private void FindAllNodeTypes(SortedList<string, XmlElement> AllNodeTypes, XmlElement xmlElement)
{
if (!AllNodeTypes.ContainsKey(xmlElement.Name))
AllNodeTypes.Add(xmlElement.Name, xmlElement);
foreach (XmlNode xe in xmlElement.ChildNodes)
{
if (xe is XmlElement)
FindAllNodeTypes(AllNodeTypes, xe as XmlElement);
}
}
private void btnStructure_Click(object sender, EventArgs e)
{
tbResults.Clear();
Node.Reset();
LoadStructure(tbFile.Text);
ShowStructure();
}
private void LoadStructure(string fileName)
{
LoadXml(fileName, null);
Node.Add(MyXMLDoc.DocumentElement);
}
private void ShowStructure()
{
foreach (string key in Node.AllNodes.Keys)
{
Node nd = Node.AllNodes[key];
tbResults.AppendText(string.Format("[{0}]{1}\r\n", key, (nd.HasText ? "\tText" : "")));
if (nd.Children.Count > 0)
{
tbResults.AppendText(string.Format("\tChildren:\r\n"));
foreach (string child in nd.Children)
tbResults.AppendText(string.Format("\t\t{0}\r\n", child));
}
if (nd.Attributes.Count > 0)
{
tbResults.AppendText(string.Format("\tAttributes:\r\n"));
foreach (string key1 in nd.Attributes.Keys)
{
Attribute attr = nd.Attributes[key1];
if (key1 == "content")
tbResults.AppendText(string.Format("\t\t{0} Count={1}\r\n", attr.Name, attr.Count));
else if (attr.MinValue == attr.MaxValue)
tbResults.AppendText(string.Format("\t\t{0} Count={1} All={2}\r\n", attr.Name, attr.Count, attr.MinValue));
else
tbResults.AppendText(string.Format("\t\t{0} Count={1} Min={2} Max={3}\r\n", attr.Name, attr.Count, attr.MinValue, attr.MaxValue));
}
}
}
}
private void ShowStructure2()
{
foreach (string key in Node.AllNodes.Keys)
{
Node nd = Node.AllNodes[key];
bool hasContent = false;
tbResults.AppendText(string.Format("case \"{0}\":~", key));
string prefix = "\tformat=\"";
foreach (string key1 in nd.Attributes.Keys)
{
if (key1 == "content")
hasContent = true;
else
{
tbResults.AppendText(string.Format("{0}{1}={{{1}}}\";", prefix, key1));
prefix = " ";
}
if (hasContent)
tbResults.AppendText(string.Format(" {{content}}"));
}
tbResults.AppendText("\";~\tbreak;\r\n");
}
}
private void btnLoadContent_Click(object sender, EventArgs e)
{
LoadXml(tbFile.Text, "Document Loaded");
tbResults.Clear();
ShowAllContent(MyXMLDoc.DocumentElement, 0);
}
private void ShowAllContent(XmlElement xe, int level)
{
ShowContent(xe, level);
foreach (XmlNode ch in xe.ChildNodes)
{
if (ch is XmlElement)
ShowAllContent(ch as XmlElement, level + 1);
}
}
Regex regFixAttributes = new Regex("(\\{[A-Za-z]+?\\})", RegexOptions.Compiled);
private void ShowContent(XmlElement xe, int level)
{
string format = "Not Defined";
string prefix = " ";
switch (xe.Name)
{
case "ident":
format = "Procedure (LabelType-number)={labelType}-{number} fullName={fullName} PNSNo={PNSNo}";
break;
case "type":
format = "Procedure Type: {procedureType}";
break;
case "GrossStep":
format = "number={number} name={name}";
break;
case "Step":
format = "{number} {name}";
prefix = "S ";
break;
case "Contingency":
format = "{number} {name}";
prefix = "C ";
break;
case "attrib":
case "procedure":
case "controllers":
case "row":
format = "";// No Content
break;
case "CautionInstruction":
case "NoteInstruction":
format = "number={number} {content}";
break;
case "UnitaryInstruction":
case "BinaryInstruction":
format = "number={number} Left Target: {leftTarget} Link Target: {linkTarget} {content}";
break;
case "JoinInstruction":
format = "Link Target: {linkTarget} JoinType: {joinType}";
break;
case "UnitaryContingencyCallInstruction":
format = "number={number} Link Target: {linkTarget} Evaluation Type: {evaluationType} {content}";
prefix = "U ";
break;
case "taskGroup":
format = "name={name} borderVisible={borderVisible}";
break;
case "BoolVarInputItem":
format = "varInputLabel={varInputLabel} Data Point: {varInputDataPoint}";
break;
case "TextVarInputItem":
format = "varInputLabel={varInputLabel} Data Point: {varInputDataPoint}";
break;
case "ovationGraphic":
format = "title={title} Diagram Number: {diagramNumber}";
break;
case "ovationGroupTrend":
format = "name={name} description={description}";
break;
case "controller":
format = "controller - Unknown";
break;
case "and":
format = "and id={id}";
break;
case "BigOverview":
format = "BigOverview grossStep={grossStep} number={number} id={id}";
break;
case "BovActionStep":
format = "column={column} number={number} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovCheckBox":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovIfStep":
format = "column={column} number={number} linkTarget={linkTarget} group={group} id={id} name={name} label={label} rightTarget={rightTarget} {content}";
break;
case "BovMessageBox":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovProcedureLink":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovStepInLink":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovStepOutLink":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "descr":
case "esinfo":
case "esproj":
case "esprop":
case "private":
case "pwg":
case "pwt":
case "revbase":
case "systemtest":
format = "";
break;
case "eq":
case "gt":
case "gte":
case "lt":
case "lte":
case "not":
case "or":
format = "id={id}";
break;
case "fcase":
case "tcase":
format = "rst={rst}";
break;
case "logic":
format = "id={id} number={number}";
break;
case "ovationSingleTrend":
format = "description={description} number={number} id={id} name={name}";
break;
case "prop":
format = "type={type} value={value} name={name}";
break;
case "TextVarInputInstruction":
format = "taskDescription={taskDescription} varInputLabel={varinputLabel} number={number} {content}";
break;
case "utest":
format = "tested={tested}";
break;
case "var":
format = "var_type={var_type} id={id} name={name} number={number}";
break;
case "const":
format = "var_type={var_type} id={id} value={value}";
break;
}
tbResults.AppendText(string.Format("\r\n{0}{1}{2} ", prefix, "".PadRight(level, ' ').Replace(" ", "| "), xe.Name));
tbResults.AppendText(ReplaceAllAttributes(format, xe, level, prefix));
}
private string ReplaceAllAttributes(string format, XmlElement xe, int level, string prefix)
{
MatchCollection m;
while ((m = regFixAttributes.Matches(format)).Count > 0)
{
string part1 = format.Substring(0, m[0].Groups[1].Index);
string part3 = format.Substring(m[0].Groups[1].Index + m[0].Groups[1].Length);
string att = m[0].Groups[1].Value.Replace("{", "").Replace("}", "");
XmlAttribute xa = xe.Attributes[att];
//if (xa == null)
// Console.WriteLine(xe.OuterXml);
string part2;
if (xa != null)
part2 = xe.Attributes[att].Value; //GetAttribute(xe, att);
else
part2 = "null";
if (part2 == string.Empty) part2 = "empty";
if (att == "content")
{
string imageSrc = null;
if (part2.Contains(" src="))
{
imageSrc = RegFindImage.Replace(part2, "$1");
//Console.WriteLine(imageSrc);
}
part2 = FixHTML(part2, level);
if (imageSrc != null) part2 += "\n" + imageSrc;
part2 = part2.Replace("<br />", "<br />\n ");
part2 = part2.Replace("\n", string.Format("\r\n {0} ", "".PadRight(level).Replace(" ", "| ")));
}
format = part1 + part2 + part3;
}
return format;
}
private static Regex RegFixHTMLMulti = new Regex("<(p|li) [^>]*?>([^<>]*)</(p|li)>", RegexOptions.Compiled | RegexOptions.Singleline);
private static Regex RegFixHTML = new Regex(".*<(p|li).*?>(.*)</(p|li)>.*", RegexOptions.Compiled | RegexOptions.Singleline);
private static Regex RegFixHTMLbody = new Regex(".*<body.*?>(.*)</body>.*", RegexOptions.Compiled | RegexOptions.Singleline);
private static Regex RegFindImage = new Regex(".*<img src=\"([^\"]*)\".*/>.*", RegexOptions.Compiled | RegexOptions.Singleline);
private string FixHTML(string html, int level)
{
html = cleanupHTML(html, level);
return html;
//Console.WriteLine(html);
MatchCollection mc = RegFixHTMLMulti.Matches(html);
if (mc.Count > 1)
{
StringBuilder sb = new StringBuilder();
string sep = "";
foreach (Match m in mc)
{
string str = RegFixHTML.Replace(m.Value, "$2");
if (str != "")
sb.Append(sep + str);
sep = "\r\n";
}
return StripSpan(sb.ToString());
}
string newHTML = RegFixHTML.Replace(html, "$2");
if (html != newHTML) return StripSpan(newHTML);
newHTML = RegFixHTMLbody.Replace(html, "$1");
if (html != newHTML) return StripSpan(newHTML);
return StripSpan(html);
}
private static Regex RegStripSpan1 = new Regex("<span.*?>", RegexOptions.Compiled | RegexOptions.Singleline);
private static Regex RegStripSpan2 = new Regex("</span>", RegexOptions.Compiled | RegexOptions.Singleline);
private string StripSpan(string html)
{
return RegStripSpan2.Replace(RegStripSpan1.Replace(html, ""), "");
}
private static Regex[] Cleanup =
{
new Regex("<![^>]*>", RegexOptions.Compiled ),
new Regex(" margin-top: ?[0-9]+px;", RegexOptions.Compiled ),
new Regex(" margin-bottom: ?[0-9]+px;", RegexOptions.Compiled ),
new Regex(" margin-right: ?[0-9]+px;", RegexOptions.Compiled ),
new Regex(" margin-left: ?[0-9]+px;", RegexOptions.Compiled ),
new Regex(" padding-top:0;", RegexOptions.Compiled ),
new Regex(" padding-bottom:0;", RegexOptions.Compiled ),
new Regex(" padding-right:0;", RegexOptions.Compiled ),
new Regex(" padding-left:0;", RegexOptions.Compiled ),
new Regex(" color:#000000;", RegexOptions.Compiled ),
new Regex("-qt-paragraph-type:empty;", RegexOptions.Compiled ),
new Regex(" text-indent: ?0px", RegexOptions.Compiled ),
new Regex(" -qt-block-indent: ?0;", RegexOptions.Compiled ),
new Regex(" font-family:'Arial';", RegexOptions.Compiled ),
new Regex(" font-family:'Gulim';", RegexOptions.Compiled ),
new Regex(" font-family:'A';", RegexOptions.Compiled ),
new Regex(" font-size:[0-9]+pt;", RegexOptions.Compiled ),
new Regex("style=\"(| |;)*\"", RegexOptions.Compiled ),
new Regex("</?span[^>]*>", RegexOptions.Compiled ),
new Regex("<style[^>]*>[^<]*</style>", RegexOptions.Compiled ),
new Regex("</?meta[^>]*>", RegexOptions.Compiled ),
//new Regex("</?html[^>]*>", RegexOptions.Compiled ),
new Regex("</?body[^>]*>", RegexOptions.Compiled ),
new Regex("<p ></p>", RegexOptions.Compiled ),
new Regex("</?head[^>]*>", RegexOptions.Compiled),
//new Regex("<p[^>]*>NOTE</p>", RegexOptions.Compiled),
//new Regex("<p[^>]*>CAUTION</p>", RegexOptions.Compiled),
new Regex("<p[^>]*></p>", RegexOptions.Compiled),
};
private static Regex regexFixPFrontPadding = new Regex("<p[^>]*> +", RegexOptions.Compiled);
private static Regex regexFixPRearPadding = new Regex(" +</p>", RegexOptions.Compiled);
private static Regex regexFixLiFrontPadding = new Regex("<li[^>]*> +", RegexOptions.Compiled);
private static Regex regexFixLiRearPadding = new Regex(" +</li>", RegexOptions.Compiled);
private static Regex removeExtraReturns = new Regex("\r?\n(\r?\n)+", RegexOptions.Compiled);
private static Regex RegFixMultipleULs = new Regex("</ul>[\r\n]*<ul[^<>]+>", RegexOptions.Compiled | RegexOptions.Multiline);
private static Regex RegFixMultipleOLs = new Regex("</ol>[\r\n]*<ol[^<>]+>", RegexOptions.Compiled | RegexOptions.Multiline);
private static RegexReplace[] MyRegExReplaceSpecialChars = {
new RegexReplace("oF","\\'b0F"),// Degree
new RegexReplace("oC","\\'b0C"),// Degree
new RegexReplace("\xB0","\\'b0"),// Degree
new RegexReplace("\xBA","\\'b0"),// Degree
new RegexReplace("\u02DA","\\'b0"),// Degree
new RegexReplace("\xB1","\\'b1"),//
new RegexReplace("\xB2","\\up3 2\\up0 "),// Square
new RegexReplace("\xD7","x"),// Times
new RegexReplace("\u2013","\\u8209?"),
new RegexReplace("\xB1","\\'B1"),
new RegexReplace("\xB7","\\u9679?"),
new RegexReplace("\u2022","\\u9679?"),
new RegexReplace("\u2022","*"),
new RegexReplace("\u25AA","\\u9679?"),
new RegexReplace("\xA0","\\u160?"),
new RegexReplace("\u2019","'"),
new RegexReplace("\u2018","'"),
new RegexReplace("\u201C","\""),
new RegexReplace("\u201D","\""),
new RegexReplace("\u0394","\\u916?"),
new RegexReplace("\uFF06","&"),
new RegexReplace("\u2265","\\u8805?"),
new RegexReplace("\u25CF","\\u9679?"),
new RegexReplace("\u33A0","cm\\up3 2\\up0 "),
new RegexReplace("\u2192","\\u8594?"),
new RegexReplace("\uF07F","\\u9633?"),
new RegexReplace("\\u2264","\\u8804?"),
/*
new RegexReplace("",""),
*/
new RegexReplace(@">NOTE\\line<",">NOTE<"),// Note - line break
new RegexReplace(@">NOTES\\line<",">NOTES<"),// Note - line break
new RegexReplace(@">NOTE CONTINUED\\line<",">NOTE CONTINUED<"),// Note - line break
new RegexReplace(@"</p>[\r\n]*<p ?>THEN"," THEN")// Break - THEN
};
private static string cleanupHTML(string html, int level)
{
//Console.WriteLine(html);
//Console.WriteLine("END {0}",level);
html = html.Replace("<br />", "\\line ");
//if (html.Contains("All Safety Function Status Check"))
// Console.WriteLine(html.Substring(html.IndexOf("All Safety Function Status Check") - 10, 20));
foreach (Regex clean in Cleanup)
{
html = clean.Replace(html, "");
}
//if (html.Contains("All Safety Function Status Check"))
// Console.WriteLine(html.Substring(html.IndexOf("All Safety Function Status Check") - 10, 20));
// TODO Remove Padding from Front
//html = regexFixPFrontPadding.Replace(html, "<p>");
//if (html.Contains("All Safety Function Status Check"))
// Console.WriteLine(html.Substring(html.IndexOf("All Safety Function Status Check") - 10, 20));
html = regexFixPRearPadding.Replace(html, "</p>");
html = regexFixLiFrontPadding.Replace(html, "<li>");
html = regexFixLiRearPadding.Replace(html, "</li>");
html = removeExtraReturns.Replace(html, "\n");
if (html.StartsWith("\r\n"))
html = html.Substring(2);
if (html.StartsWith("\n"))
html = html.Substring(1);
//if (html.Contains("IF the RCS has experienced cooldown rate greater than"))
// Console.WriteLine("Here");
html = RegFixMultipleULs.Replace(html, "");
html = RegFixMultipleOLs.Replace(html, "");
//if( html.Contains("NOTE\\"))
// Console.WriteLine("Here");
foreach (RegexReplace rr in MyRegExReplaceSpecialChars)
html = rr.DoReplace(html);
return html;
}
private void tbResults_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.A && e.Control)
{
tbResults.SelectAll();
e.Handled = true;
}
}
private void btnLoadProcedure_Click(object sender, EventArgs e)
{
if (_MyFlexGrid == null)
{
_MyFlexGrid = new VlnFlexGrid();
this.Controls.Add(_MyFlexGrid);
_MyFlexGrid.Location = tbResults.Location;
_MyFlexGrid.Size = tbResults.Size;
_MyFlexGrid.BringToFront();
_NodeProcessed = new List<XmlNode>();
}
XML2PROMSDB(tbFile.Text);
}
private static string _MyTablePrefix;
private static XmlNamespaceManager _NSMGR;
private void XML2PROMSDB(string filename)
{
try
{
LoadXml(filename, null);
FileInfo fi = new FileInfo(filename);
fi.Directory.CreateSubdirectory("TableHTMLs");
_MyTablePrefix = fi.DirectoryName + "\\TableHTMLs";
XmlNamespaceManager nsmgr = new XmlNamespaceManager(MyXMLDoc.NameTable);
nsmgr.AddNamespace("x", MyXMLDoc.DocumentElement.NamespaceURI);
_NSMGR = nsmgr;
XmlNode xn = GetProcedureIdentifier(nsmgr);
string procType = GetProcedureType(xn);
if (procType == "FRP") procType = "EOP";
// Walk through structure Adding Items as you go
DocVersionInfoList dvil = DocVersionInfoList.Get();
DocVersionInfo dvi = null;
foreach (DocVersionInfo dviC in dvil)
if (dviC.MyFolder.Name == procType)
dvi = dviC;
ProcedureInfo lastProc = GetLastProcedure(dvi);
//string ProcNum = GetProcedureNumber(lastProc, xn);
string ProcNum = GetProcedureNumber(lastProc, filename);
lblProcedure.Text = ProcNum;
Application.DoEvents();
using (Procedure proc = Procedure.MakeProcedure(dvi, lastProc, ProcNum, xn.Attributes["fullName"].Value, 0))
{
proc.Save();
lastProc = ProcedureInfo.Get(proc.ItemID);
}
try
{
AddGrossStep(lastProc, nsmgr);
}
catch (Exception ex)
{
Console.WriteLine(lastProc.DisplayNumber + "\r\n\r\n" + ex.GetType().Name + "\r\n\r\n" + ex.Message + "\r\n\r\n" + ex.StackTrace);
MessageBox.Show(lastProc.DisplayNumber + "\r\n\r\n" + ex.Message + "\r\n\r\n" + ex.StackTrace, ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception ex)
{
tbResults.AppendText(string.Format("\r\n{0}\r\n{1} - {2}\r\n", filename, ex.GetType().Name, ex.Message));
}
}
private static string GetProcedureType(XmlNode xn)
{
foreach (XmlNode xnc in xn.ParentNode.ChildNodes)
if (xnc.Name == "type")
return xnc.Attributes["procedureType"].Value;
return null;
}
private static string GetProcedureNumber(string filename)
{
FileInfo fi = new FileInfo(filename);
string fn = Regex.Replace(fi.Name.Replace(fi.Extension, ""), @"1N2-OP-([-0-9A-Z]+).+", "$1");
return fn;
}
private static string GetProcedureNumber(ProcedureInfo lastProc, string filename)
{
string ProcNum = GetProcedureNumber(filename);
if (lastProc == null)
;// ProcNum is correct
else if (lastProc.DisplayNumber == ProcNum)
ProcNum += " Rev 1";
else if (lastProc.DisplayNumber.StartsWith(ProcNum))
{
ProcNum = ProcNum + " Rev " + (1 + int.Parse(lastProc.DisplayNumber.Substring(ProcNum.Length + 5))).ToString();
}
return ProcNum;
}
private static string GetProcedureNumber(ProcedureInfo lastProc, XmlNode xn)
{
string ProcNum = string.Format("{0}-{1}", GetProcedureType(xn), xn.Attributes["shortName"].Value);
if (lastProc == null)
;// ProcNum is correct
else if (lastProc.DisplayNumber == ProcNum)
ProcNum += " Rev 1";
else if (lastProc.DisplayNumber.StartsWith(ProcNum))
{
ProcNum = ProcNum + " Rev " + (1 + int.Parse(lastProc.DisplayNumber.Substring(ProcNum.Length + 5))).ToString();
}
return ProcNum;
}
private XmlNode GetProcedureIdentifier(XmlNamespaceManager nsmgr)
{
XmlNodeList xl = MyXMLDoc.DocumentElement.SelectNodes("//x:ident", nsmgr);
if (xl.Count != 1)
throw (new Exception("XML File Does not contain a Single Ident Node"));
XmlNode xn = xl[0];
return xn;
}
private static ProcedureInfo GetLastProcedure(DocVersionInfo dvi)
{
ProcedureInfo lastProc = null;
if (dvi.Procedures != null)
foreach (ProcedureInfo oldProc in dvi.Procedures)
lastProc = oldProc;
return lastProc;
}
private void AddGrossStep(ProcedureInfo lastProc, XmlNamespaceManager nsmgr)
{
XmlNodeList xl = MyXMLDoc.SelectNodes("//x:GrossStep", nsmgr);
SectionInfo prevSection = null;
pbSection.Maximum = xl.Count;
pbSection.Value = 0;
foreach (XmlNode xn in xl)
{
lblSection.Text = "Sect " + xn.Attributes["number"].Value;
pbSection.Value++;
Application.DoEvents();
string config = null;
int type = 10000;
string sectName = xn.Attributes["name"].Value;
switch (sectName)
{
case "Purpose":
case "Entry Conditions":
case "Exit Conditions":
type = 10001;// Purpose Symptoms and Entry Conditions
config = "<Config><Section ColumnMode=\"1\" /></Config>";
break;
default:
if (sectName.ToUpper().Contains("ACTION"))
type = 10000;// Procedure Steps
else
if (sectName.ToUpper().StartsWith("ATTACHMENT"))
{
type = 10008;
}
else if(HasContingency(xn))
{
type = 10002;// Attachment with Column Header
// Two Column
}
else
{
type = 10008;// Attachment without Column Header
config = "<Config><Section ColumnMode=\"1\" /></Config>";
}
break;
}
using (Section sect = Section.MakeSection(lastProc, prevSection, FixSectionNumber(xn.Attributes["number"].Value), xn.Attributes["name"].Value, type))
{
if (config != null)
sect.MyContent.Config = config;
sect.Save();
prevSection = SectionInfo.Get(sect.ItemID);
AddStepChildren(nsmgr, prevSection, xn.SelectNodes("x:Step", nsmgr));
}
}
}
private bool HasContingency(XmlNode xn)
{
XmlNodeList xl = xn.SelectNodes(".//x:Contingency", _NSMGR);
if (xl.Count == 0) xl = xn.SelectNodes(".//x:BinaryInstruction", _NSMGR);
//if (xl.Count > 0)
// Console.WriteLine("Found Contingency {0} {1} {2} {3}", _ProcNum,xn.Name ,GetAttribute( xn,"number"),GetAttribute( xn,"name"));
return xl.Count > 0;
}
private string FixSectionNumber(string num)
{
if (Regex.IsMatch(num, "[IVX]+"))
return num + ".";
return num;
}
private void AddStepChildren(XmlNamespaceManager nsmgr, SectionInfo prevSection, XmlNodeList xl)
{
if (xl.Count > 0)
{
if (prevSection.DisplayText.StartsWith("Attachment"))
AddAttachments(prevSection, xl, nsmgr);
else
switch (prevSection.DisplayText.ToUpper())
{
case "PURPOSE":
case "ENTRY CONDITIONS":
case "EXIT CONDITIONS":
AddPSEC(prevSection, xl[0].ChildNodes);
break;
default:
if (AllSiblingsAreCautionsOrNotes(xl))
AddPSEC(prevSection, xl[0].ChildNodes);
else
AddStep(prevSection, xl);
break;
}
}
}
private bool AllSiblingsAreCautionsOrNotes(XmlNodeList xl)
{
if (xl.Count > 1) return false;
return AllSiblingsAreCautionsOrNotes((xl[0] as XmlElement).ChildNodes[0] as XmlElement);
}
private void AddPSEC(SectionInfo prevSection, XmlNodeList xl)
{
SectionInfo keepPrevSection = prevSection;
//xl = (xl)[0].ChildNodes;
if (xl.Count == 0) return;
//TODO Need to add logic to save the first note as a step and the rest off of the first note
//TODO ChildNodes Can include xmlText as well as xmlElement nodes
//TODO Create list of children
XmlElement FirstNote = null;
XmlElement FirstCaution = null;
XmlElement FirstUnitary = null;
XmlElement FirstContingency = null;
int UnitaryCount = 0;
// List<XmlElement> xl1 = new List<XmlElement>();
foreach (XmlNode xn in xl)
{
if (xn is XmlElement)
{
//Find First Child that is a Note
if (FirstNote == null || (xn.Name == "NoteInstruction" && FirstNote.Name != "NoteInstruction"))
FirstNote = xn as XmlElement;
if (FirstCaution == null || (xn.Name == "CautionInstruction" && FirstCaution.Name != "CautionInstruction"))
FirstCaution = xn as XmlElement;
if(FirstUnitary == null && (xn.Name == "UnitaryInstruction" || xn.Name == "UnitaryContingencyCallInstruction"
|| xn.Name == "BinaryInstruction" || xn.Name == "Contingency"))
FirstUnitary = xn as XmlElement;
if (xn.Name == "UnitaryInstruction" || xn.Name == "UnitaryContingencyCallInstruction"
|| xn.Name == "BinaryInstruction" || xn.Name == "Contingency")
UnitaryCount++;
if (FirstContingency == null && xn.Name == "Contingency")
FirstContingency = xn as XmlElement;
////if (xn.OuterXml.Contains("ALL AAC"))
// Console.WriteLine("XN ALL AAC");
}
}
FirstNote = FirstNote ?? FirstCaution;
if (FirstNote != null && FirstNote.Name == "UnitaryInstruction")
if (FirstCaution != null && FirstCaution.Name == "NoteInstruction")
Console.WriteLine("oopsie!");
//Remove First Note from List
//xl1.Remove(FirstNote);
//TODO Add Remaining Children
StepLookup mySteps = new StepLookup();
int level = -1;
if (FirstUnitary != null)
{
_LastStepText.Clear();
while (FirstUnitary != null)
{
//XmlElement lastNote = FirstUnitary;
// Add Other Notes if they exist
prevSection = keepPrevSection;
level = -1;
if (FirstUnitary.Attributes["content"] != null)
{
AddContent(prevSection, mySteps, level, FirstUnitary, true, UnitaryCount);
//if (FirstUnitary.ChildNodes.Count > 0 && FirstUnitary.Name == "UnitaryInstruction")
if (FirstUnitary.Name == "UnitaryContingencyCallInstruction")
MyContingencies.Add((1 + MyContingencies.Count).ToString(), mySteps[mySteps.Count - 1].ItemID);
if (FirstUnitary.ChildNodes.Count > 0)
AddStepStucture(mySteps, mySteps.Count - 1, FirstUnitary, false);
//Console.WriteLine("\"Unitary\"\t\"{0}\"\t\"{1}\"", prevSection, mySteps[mySteps.Count - 1]);
if (FirstContingency != null)
{
ContingencyStep = mySteps[mySteps.Count -1];
int lev1 = 1 + Math.Min(level + 1, mySteps.Count);
int inc = 1;
FirstContingency = FirstContingency.ChildNodes[0] as XmlElement;
while (FirstContingency != null)
{
AddStepStucture(mySteps, lev1, FirstContingency, true);
lev1 += inc;
mySteps[lev1 - 1] = mySteps[lev1 - 1];
inc = 0;
FirstContingency = FirstContingency.NextSibling as XmlElement;
}
mySteps[lev1 - 2] = mySteps[lev1 - 2];
}
if (mySteps.Count > 0)
{
level = 1;
prevSection = null;
}
else
{
//Console.WriteLine("No Steps");
}
}
if (FirstNote != null && FirstNote.Name == "UnitaryInstruction")
Console.WriteLine("Should not be Unitary Instruction 1 \"{0}\" {1}", _StepLocation, _StepID);
AddNotesAndCautions(ref prevSection, FirstNote, mySteps, ref level);
FirstNote = null;
FirstUnitary = FirstUnitary.NextSibling as XmlElement;
if (FirstUnitary != null && FirstUnitary == FirstContingency) FirstUnitary = FirstUnitary.NextSibling as XmlElement;
while (FirstUnitary != null && (FirstUnitary.Name == "NoteInstruction" || FirstUnitary.Name == "CautionInstruction"))
{
if (FirstNote == null) FirstNote = FirstUnitary;
FirstUnitary = FirstUnitary.NextSibling as XmlElement;
if (FirstUnitary != null && FirstUnitary == FirstContingency) FirstUnitary = FirstUnitary.NextSibling as XmlElement;
break;
}
// if (FirstUnitary != null && FirstUnitary.Name == "Contingency") Console.WriteLine("Contingency");
//if (FirstUnitary != null && FirstUnitary.Name == "BinaryInstruction") Console.WriteLine("Contingency");
//if(FirstUnitary != null)
// Console.Write("{0}", mySteps[0]);
// if (FirstNote != null) Console.WriteLine("next");
}
}
else
AddNotesAndCautions(ref prevSection, FirstNote, mySteps, ref level);
//TODO Add Cautions
}
private static void AddNotesAndCautions(ref SectionInfo prevSection, XmlElement FirstNote, StepLookup mySteps, ref int level)
{
_LastStepText.Clear();
while (FirstNote != null)
{
//XmlElement lastNote = FirstNote;
// Add Other Notes if they exist
if (FirstNote.Attributes["content"] != null)
{
XmlElement nextNote = FirstNote.NextSibling as XmlElement;
AddContent(prevSection, mySteps, level, FirstNote, true);
if (FirstNote.ChildNodes.Count > 0 && FirstNote.Name != "NoteInstruction" && FirstNote.Name != "CautionInstruction")
AddStepStucture(mySteps, level, FirstNote);
if (mySteps.Count > 0 && (nextNote == null || nextNote.Name != FirstNote.Name))
{
level = 1;
prevSection = null;
}
else
{
//Console.WriteLine("No Steps");
}
}
FirstNote = FirstNote.NextSibling as XmlElement;
if (FirstNote != null && FirstNote.Name != "NoteInstruction" && FirstNote.Name != "CautionInstruction")
break;
// if (FirstNote != null) Console.WriteLine("next");
if (FirstNote != null && FirstNote.Name == "UnitaryInstruction")
Console.WriteLine("Should not be Unitary Instruction 2 \"{0}\" {1}",_StepLocation,_StepID);
}
}
private static StepInfo _ContingencyStep = null;
public static StepInfo ContingencyStep
{
get { return _ContingencyStep; }
set { _ContingencyStep = value; }
}
private static string _LastName = "";
private static List<XmlNode> _NodeProcessed = null;
private static void AddContent(SectionInfo prevSection, StepLookup mySteps, int level, XmlNode xn, bool ignoreNote)
{
AddContent(prevSection, mySteps, level, xn, ignoreNote, 0);
}
private static string _StepLocation;
private static int _StepID;
private static Dictionary<int, StepText> _LastStepText = new Dictionary<int, StepText>();
private static string _MyRawData = null;
private static string _MyRawType = null;
private static bool _MyRawCheck = true;
private static void AddContent(SectionInfo prevSection, StepLookup mySteps, int level, XmlNode xn, bool ignoreNote, int steps)
{
//if (!_NodeProcessed.Contains(xn))
// _NodeProcessed.Add(xn);
//else
// Console.WriteLine("node Being Processed again");
int nextLevel = 0;
int adjustLevel = 0;
//if (level >= mySteps.Count - 1)
//{
// adjustLevel = level - mySteps.Count;
// Console.WriteLine("Level beyond Range");
//}
string RNOGoTo = xn.Attributes["linkTarget"] == null ? "" : xn.Attributes["linkTarget"].Value;
int type = 20001;
if (prevSection != null && prevSection.IsSection ) type = 20002;
E_FromType frType = E_FromType.Step;
string xmlbase = xn.Attributes["content"].Value;
//if (xmlbase.Contains("qt-block-indent"))
// Console.WriteLine("Here Indent");
//if (xmlbase.Contains("the affected SG has been isolated and the cooldown"))
// Console.WriteLine("Here 6");
//if (xmlbase.Contains("unless misoperation"))
// Console.WriteLine("Here 1");
//if (xmlbase.Contains("5. Natural"))
// Console.WriteLine("Here 5");
string xml = cleanupHTML(xmlbase, 0);
_MyRawData = xml;
_MyRawType = xn.Name;
if (xn.Name == "NoteInstruction" && xml != null && xml.Contains("NOTE"))
Console.WriteLine(xml);
//if (xml.Contains("SET CV-PIK-201, Letdown Backpressure Controller"))
// Console.WriteLine("Found it");
//if (xml.Contains("<img")) Console.WriteLine("here");
//if (xn.Name.StartsWith("Unitary")) Console.WriteLine("here");
//if ((xml.Contains("<table") || xml.Contains("<img")) && _MyTableFileName != null)
if (GetSectionStyle(xn.ParentNode) == "Free Form" && _MyTableFileName != null)
{
xmlbase = BuildHTMLLibDoc(xn, xmlbase);
return;
}
//if(xml.Contains(@"\u916?") && !xmlbase.Contains(@"\u916?"))
// Console.WriteLine("here");
if (!xml.Contains("<"))
{
Console.WriteLine("not XML - '{0}'");
xml = "<html><p>" + xml + "</p></html>";
}
//if (xml.Contains("SPADES") || xml.Contains("CONFIRM the diagnosis of a SGTR by performing the following"))
// Console.WriteLine("HERE");
if (prevSection == null)
{
if (xn.Name == "CautionInstruction")
{
type = 20006;
frType = E_FromType.Caution;
}
else if (xn.Name == "NoteInstruction" && (xml.Contains(">NOTE<") || xml.Contains(">NOTES<") || xml.Contains(">NOTE CONTINUED<")))
{
type = 20007;
frType = E_FromType.Note;
}
else
{
if (ContingencyStep != null)
{
type = 20040;
frType = E_FromType.RNO;
}
else
{
type = 20001;
frType = E_FromType.Step;
}
}
}
XmlDocument xd = new XmlDocument();
xd.LoadXml(xml);
//bool resetUL = true;
string lastNodeName = "";
//_LastStepText.Clear();
foreach (XmlNode xn2 in xd.DocumentElement.ChildNodes)
{
if (xn2.InnerText != "" && xn2.InnerText != "NOTE" && xn2.InnerText != "NOTES" && xn2.InnerText != "NOTE CONTINUED" && xn2.InnerText != "CAUTION" && xn2.InnerText != "WARNING")
{
//if (xn2.InnerText.StartsWith("VERIFY the most affected SG 1"))
// Console.WriteLine("{0},{1}",mySteps,level);
StepText xn2Text = FixText(xn2);
//if (xn2Text.Text.Contains("indications should be used to aid in evaluating plant"))
// Console.WriteLine("Here");
//if (xn2Text.Text.Contains("unless misoperation"))
// Console.WriteLine("Here 1");
//if (xn2Text.Text.Contains("temperatures. SG water level is calibrated for normal"))
// Console.WriteLine("Here 4.5");
//if (xn2Text.Text.StartsWith("Natural"))
// Console.WriteLine("Here 5.0");
//if (xn2Text.Text.Contains("the affected SG has been isolated and the cooldown"))
// Console.WriteLine("Here 6.0");
//if (xn2Text.Text.Contains("During all phases of the cooldown"))
// Console.WriteLine("Here 7.0");
//if (xn2Text.Text.Contains("Minimize the number of cycles of pressurizer auxiliary spray"))
// Console.WriteLine("Here 8.0");
//if (xn2Text.Text.Contains("Operators should be aware of the status of CCW supply to the"))
// Console.WriteLine("Here 18.0");
//if (xn2Text.Text.Contains("To minimize the unmonitored release of radioactivity"))
// Console.WriteLine("Here 10.0");
//if (xn2Text.Text.Contains("When indicated SG water level is excessively high"))
// Console.WriteLine("Here 11.0");
//if (xn2Text.Text.Contains("When restarting RCPs, it is preferable to first start an RCP"))
// Console.WriteLine("Here 22.0");
//if (xn2Text.Text.Contains("Allowing the secondary system to backflow to the primary system"))
// Console.WriteLine("Here 27.0");
//if (xn2Text.Text.Contains("SG backflow for level control Backflow is a permissible operational"))
// Console.WriteLine("Here 27.a");
//if (xn2Text.Text.Contains("SG backflow for depressurization and cooldown Back flow is"))
// Console.WriteLine("Here 27.b");
//if (xn2Text.Text.Contains("At least one RCP must be operating before attempting"))
// Console.WriteLine("Here 27.b.*");
//if (xn2Text.Text.Contains("Once the entire RCS has been successfully cooled to SDC entry"))
// Console.WriteLine("Here 28.0");
//if (xn2Text.Text.Contains("Operation of the Containment Spray System "))
// Console.WriteLine("Here 20.0");
//if (xn2Text.Text.StartsWith("10."))
// Console.WriteLine("Numbered Step");
//if (xn2Text.Text.Contains("Cooling System Entry Conditions are satisfied") ||
// xn2Text.Text.Contains("Recovery Guideline may be exited when ANY of the following") ||
// xn2Text.Text.Contains("has accomplished its purpose by satisfying"))
// Console.WriteLine("Here");
// Check against last
int lastLevel = level;
level = getMatchingLevel(_LastStepText, xn2Text,lastLevel);
if (level > 0 && type == 20002)
{
if (xn2Text.Tab == "") type = 20024;
else type = 20001;
}
//if (xn2Text.Tab == "*")
// type = 20004;
//else if (xn2Text.Tab == "" && level > 0)
// type = 20024;
//else
//type = 20001;
if (xn2Text.Text != "")
{
if (xn2.Name == "p")
{
//resetUL = true;
XmlNode pxn = PreviousNode(xn2, "p");
StepText pxnText = FixText(pxn);
XmlNode nxn = NextNode(xn2, "p");
StepText nxnText = FixText(nxn);
//ListMySteps("AddContent", mySteps);
bool levelIsOK = true;// level < 0 || level < mySteps.Count - 1;
if (xn2Text.Text != "AND" && xn2Text.Text != "OR")
{
if (pxnText != null && pxnText.Text == "OR")
using (Step step = MakeCSLAStep(mySteps, level, null, xn2Text.Text, 20005, E_FromType.Step)) { ;}
else if (pxnText != null && pxnText.Text == "AND")
using (Step step = MakeCSLAStep(mySteps, level, null, xn2Text.Text, 20019, E_FromType.Step)) { ;}
else if (nxnText != null && nxnText.Text == "OR" && NextNode(nxn, "p") != null && nxn.ParentNode.Name != "ul" && levelIsOK)
using (Step step = MakeCSLAStep(mySteps, level, null, xn2Text.Text, 20005, E_FromType.Step)) { ;}
else if (nxnText != null && nxnText.Text == "AND")
using (Step step = MakeCSLAStep(mySteps, level, null, xn2Text.Text, 20019, E_FromType.Step)) { ;}
else
{
if (level < 1 && prevSection != null)
{
if (type == 20007 || frType == E_FromType.Note)
Console.WriteLine("Here");
int myType = 20002;
if (prevSection.MyContent.Type == 10001 && steps == 0)
myType = 20041;
if(level < 0)level++;
//Console.WriteLine("\"prevSection1\"\t\"{0}\"\t\"{1}\"\t{2}\t{3}", prevSection, mySteps[level], level, myType);
using (Step step = MakeNewStep(prevSection, mySteps[level], null, xn2Text.Text, myType, E_FromType.Step))
{
//if (step.ItemID == 9408)
// Console.WriteLine("Here");
step.Save();
StepInfo si = mySteps[level] = StepInfo.Get(step.ItemID);
CheckHLS(si, "Case 1");
_StepLocation = si.ShortPath;
_StepID = si.ItemID;
//if (step.ItemID >= 10079 && step.ItemID <= 10089)
// Console.WriteLine("{0} - {1} - {2}", si.ItemID, si.DisplayText, si.ShortPath);
if ((nxnText == null || nxnText.Tab == "" || xn2Text.Tab == "") && (pxnText == null || pxnText.Tab == "" || xn2Text.Tab == ""))
{
prevSection = null;
nextLevel = level + 1;
}
}
}
else
{
switch (frType)
{
case E_FromType.Caution:
if (mySteps[0].Cautions != null && mySteps[0].Cautions.Count > 0)
mySteps[1] = StepInfo.Get(mySteps[0].Cautions[0].LastSibling.ItemID);
break;
case E_FromType.Note:
if (mySteps[0].Notes != null && mySteps[0].Notes.Count > 0)
mySteps[1] = StepInfo.Get(mySteps[0].Notes[0].LastSibling.ItemID);
break;
case E_FromType.RNO:
if (ContingencyStep != null)
{
//Console.WriteLine("BuildMySteps {0} type {1} frtype {2}", ContingencyStep,type,frType);
BuildMySteps(ContingencyStep, mySteps);
ContingencyStep = null;
}
else
{
type = 20024;
frType = E_FromType.Step;
}
level = mySteps.Count;
break;
case E_FromType.Step:
if (level > mySteps.Count) level = mySteps.Count;
if (level > 0 && mySteps[level - 1].Steps != null && mySteps[level - 1].Steps.Count > 0)
mySteps[level] = StepInfo.Get(mySteps[level - 1].Steps[0].LastSibling.ItemID);
break;
case E_FromType.SupInfo:
if (mySteps[level - 1].SupInfos != null && mySteps[level - 1].SupInfos.Count > 0)
mySteps[level] = StepInfo.Get(mySteps[level - 1].SupInfos[0].LastSibling.ItemID);
break;
case E_FromType.Table:
if (mySteps[level - 1].Tables != null && mySteps[level - 1].Tables.Count > 0)
mySteps[level] = StepInfo.Get(mySteps[level - 1].Tables[0].LastSibling.ItemID);
break;
default:
break;
}
switch (frType)
{
case E_FromType.Caution:
using (Step step = MakeNewStep(mySteps[0].MyHLS, GetFirstCaution(mySteps[0].MyHLS), null, xn2Text.Text, type, frType))
{
step.Save();
level = 1;
StepInfo si = mySteps[level] = StepInfo.Get(step.ItemID);
CheckHLS(si, "Case 2");
_StepLocation = si.ShortPath;
_StepID = si.ItemID;
//if (step.ItemID >= 10079 && step.ItemID <= 10089)
// Console.WriteLine("{0} - {1} - {2}", si.ItemID, si.DisplayText, si.ShortPath);
}
type = 20001;
break;
case E_FromType.Note:
using (Step step = MakeNewStep(mySteps[0].MyHLS, GetFirstNote(mySteps[0].MyHLS), null, xn2Text.Text, type, frType))
{
step.Save();
level = 1;
StepInfo si = mySteps[level] = StepInfo.Get(step.ItemID);
CheckHLS(si, "Case 3");
_StepLocation = si.ShortPath;
_StepID = si.ItemID;
//if (step.ItemID >= 10079 && step.ItemID <= 10089)
// Console.WriteLine("{0} - {1} - {2}", si.ItemID, si.DisplayText, si.ShortPath);
}
type = 20001;
break;
default:
//if (frType == E_FromType.RNO)
// Console.WriteLine("{0} {1} {2} {3}", mySteps[level - 1], mySteps[level], frType, xn2.InnerText.Trim(" ".ToCharArray()));
string originalText = null;
if (RNOGoTo != string.Empty && xn.Name != "UnitaryContingencyCallInstruction")
{
string xn2TextAfter = StripQuestion(xn2Text.Text);
if (xn2Text.Text != xn2TextAfter)
{
string removeWord = xn2Text.Text.Replace(xn2TextAfter, "").Replace("?", "");
originalText = xn2Text.Text;
xn2Text.Text = xn2TextAfter;
}
}
if (originalText != null)
_MyRawCheck = false;
using (Step step = MakeCSLAStep(mySteps, level, null, xn2Text.Text, type, frType))
{
if (frType == E_FromType.RNO) level++;
if (originalText != null)
Annotation.MakeAnnotation(step, AnnotationType.GetByNameOrCreate("Barakah Conversion1"), null,
string.Format("Original Text:\r\n\r\n{0}\r\n\r\nThis step may need edited.", originalText), null);
}
break;
}
}
if (RNOGoTo != string.Empty && xn.Name != "UnitaryContingencyCallInstruction")
{
//TODO Add Transitions
using (Step stepr = MakeCSLAStep(mySteps, level + 1, null, "Go to step " + RNOGoTo, 20040, E_FromType.RNO)) { ;}
if(level < 0) level = mySteps.Count - 1;
mySteps[level] = mySteps[level];
}
_MyRawCheck = true;
}
}
}
else if (xn2.Name == "ul" || xn2.Name == "ol")
{
int lev = mySteps.Count - 1;
//if (resetUL)
// mySteps.Remove(lev + 1);
if (lastNodeName == "ul" || lastNodeName == "ol")
lev--;
//resetUL = false;
XmlNodeList xl1 = xn2.SelectNodes("li");
foreach (XmlNode xn3 in xl1)
{
if (prevSection == null)
{
try
{
if(frType == E_FromType.Note && type == 20007)
using (Step step = MakeCSLAStep(mySteps, lev + 1, null, FixText(xn3).Text, type, frType)) { ;}
else
using (Step step = MakeCSLAStep(mySteps, lev + 1, null, FixText(xn3).Text, mySteps[lev].DisplayText.ToUpper().StartsWith("ONE ") ? 20005 : 20004, E_FromType.Step)) { ;}
}
catch (Exception ex)
{
ListMySteps(string.Format("makeCSLAStep Crash Level= {0}\r\n\r\n", lev), mySteps);
throw ex;
}
}
else
{
int myType = 20002;
if (mySteps.Count > level)
{
level++;
}
else
Console.WriteLine("Change in Conversion");
StepText xn3txt = FixText(xn3);
//if(xn3txt.Contains("The following actions are"))
//Console.WriteLine("\"prevSection2\"\t\"{0}\"\t\"{1}\"\t{2}\t{3}", prevSection, mySteps[level], level, myType);
using (Step step = MakeNewStep(prevSection, mySteps[level], null, xn3txt.Text, myType, E_FromType.Step))
{
step.Save();
StepInfo si = mySteps[level] = StepInfo.Get(step.ItemID);
CheckHLS(si, "Case 4");
_StepLocation = si.ShortPath;
_StepID = si.ItemID;
//if (step.ItemID >= 10079 && step.ItemID <= 10089)
// Console.WriteLine("{0} - {1} - {2}", si.ItemID, si.DisplayText, si.ShortPath);
prevSection = null;
lev = level;
}
}
}
}
else
{
if (xn2.Name == "table")
{
//Console.WriteLine("======================> Unprocessed table {0}", GetPath(xn));
//if (xn2.OuterXml.Contains(@"\u916?") )
// Console.WriteLine("Here");
if (mySteps.Count == 0)
using (Step step = MakeNewStep(prevSection, mySteps[level], null, "\xA0 Empty High Level Step", 2, E_FromType.Step))
{
step.Save();
level = Math.Max(level, 0);
StepInfo si = mySteps[level] = StepInfo.Get(step.ItemID);
CheckHLS(si, "Case 5");
_StepLocation = si.ShortPath;
_StepID = si.ItemID;
//if (step.ItemID >= 10079 && step.ItemID <= 10089)
// Console.WriteLine("{0} - {1} - {2}", si.ItemID, si.DisplayText, si.ShortPath);
prevSection = null;
}
if (_MyTableFileName == null)
{
Console.WriteLine("xml='{0}'",xn2.OuterXml);
LoadTable2(xn2, mySteps, level);
}
}
}
}
lastNodeName = xn2.Name;
if(xn2Text.Text != "AND" && xn2Text.Text != "OR")
_LastStepText[level] = xn2Text;
level = Math.Max(level, nextLevel);
}
}
RemoveStepsAbove(mySteps, level);
}
private static Step MakeNewStep(ItemInfo parentInfo, ItemInfo previousInfo, string stepNumber, string stepTitle, int stepType, E_FromType fromType)
{
Step step = Step.MakeStep(parentInfo, previousInfo, stepNumber, stepTitle, stepType, fromType);
if (_MyRawData != null)
{
if (_MyRawCheck && (FixRawData(_MyRawData) != stepTitle))
{
if (stepType != 20007 && _MyRawData.Contains(">NOTE"))
//Console.WriteLine("Here");
Annotation.MakeAnnotation(step, AnnotationType.GetByNameOrCreate("Barakah Raw Data"), null, _MyRawType + ":\r\n" + FixRawData(_MyRawData), null);
}
if (_MyRawCheck && _MyRawData != null && _MyRawType == "BinaryInstruction" && _MyRawType == "Contingency")
Annotation.MakeAnnotation(step, AnnotationType.GetByNameOrCreate("Barakah Raw Data2"), null, _MyRawType + ":\r\n" + FixRawData(_MyRawData), null);
_MyRawData = null;
}
return step;
}
private static string FixRawData(string str)
{
str = str.Replace("<p >", "").Replace("</p>", "").Replace("<li >", "\u25CF ").Replace("</li>", "\r\n").Replace("<html>", "")
.Replace("</html>", "").Replace(@"\line", "").Replace("</ul>","").TrimStart(" \r\n\t".ToCharArray())
.Replace(@"\u8209?", "\u2011").Replace(@"\u9679?", "\u25CF").Replace("<li >", "\u25CF ").Replace("<li>", "\u25CF ");
str = Regex.Replace(str, "<ul[^>]+>", "");
str = Regex.Replace(str, "<p[^>]+>", "");
str = Regex.Replace(str, "[\r\n]+", "\r\n");
return str;
}
private static void CheckHLS(StepInfo si, string str)
{
if (si.MyContent.Type == 20002 && si.ActiveParent is ItemInfo && (si.ActiveParent as ItemInfo).MyContent.Type == 20002)
Console.WriteLine("HLS Parent of HLS {0}",str);
}
private static Regex _regalpha = new Regex(@"[a-z][\.\)]");
private static Regex _regALPHA = new Regex(@"[A-Z][\.\)]");
private static Regex _regNumeric = new Regex(@"([0-9]+)[\.\)]");
private static string NextTab(string tab)
{
Match m = _regalpha.Match(tab);
if (m.Success)
{
string retval = ((char)(tab[0] + 1)) + tab.Substring(1);
return retval;
}
m = _regALPHA.Match(tab);
if (m.Success)
{
string retval = ((char)(tab[0] + 1)) + tab.Substring(1);
return retval;
}
m = _regNumeric.Match(tab);
if (m.Success)
return ((int.Parse(m.Groups[1].Value)+1).ToString() + tab.Substring(m.Groups[1].Length));
return tab;
}
private static Regex _RegFirst = new Regex(@"[1Aa][\.\)]", RegexOptions.Compiled);
private static bool IsFirstTab(string tab)
{
if (tab == "" || tab == "*") return true;
bool retval = _RegFirst.IsMatch(tab);
if(retval) return true;
return false;
}
private static int getMatchingLevel(Dictionary<int, StepText> lastStepText, StepText xn2Text, int level)
{
//if (xn2Text.Text.Contains("All Safety Function Status Check"))
// Console.WriteLine("here");
if (lastStepText.Count == 0) return level;
int maxkey = 0;
int i = 0;
foreach (int key in lastStepText.Keys) // Look at exact match first
{
StepText st = lastStepText[key];
if (NextTab(st.Tab) == xn2Text.Tab)
{
//if (st.Tab != "*" && st.Tab != "")
// Console.WriteLine("Here");
if (st.Indent == xn2Text.Indent)
{
return key;
}
if(xn2Text.Tab != "" && Math.Abs(st.Indent - xn2Text.Indent) > 1)
Console.WriteLine("\"Wrong Indent\"\t\"{0}\"\t{1}\t{2}\t{3}\t\"{4}\"\t\"{5}\"\t\"{6}\"",_StepLocation,_StepID, st.Indent, xn2Text.Indent, st.Tab, xn2Text.Tab, xn2Text.Text);
}
if (key > maxkey) maxkey = key;
i++;
}
i = 0;
foreach (int key in lastStepText.Keys) //Look for an indent match
{
StepText st = lastStepText[key];
if (st.Indent == xn2Text.Indent)
{
//Console.WriteLine("\"=\"\t{0}\t{1}\t{2}\t\"{3}\"\t\"{4}\"", i, st.Indent, xn2Text.Indent, st.Tab, xn2Text.Tab);
//Console.WriteLine("{0}\t\"{1}\"\t\"{2}\"", i, st.Tab, xn2Text.Tab);
if (NextTab(st.Tab) == xn2Text.Tab)
{
//if (st.Tab != "*" && st.Tab != "")
// Console.WriteLine("Here");
return key;
}
if (IsFirstTab(xn2Text.Tab))
return key + 1;
// Partial Indent Match
Console.WriteLine("\"Wrong Tab\"\t\"{0}\"\t{1}\t{2}\t{3}\t\"{4}\"\t\"{5}\"\t\"{6}\"", _StepLocation, _StepID, st.Indent, xn2Text.Indent, st.Tab, xn2Text.Tab, xn2Text.Text);
return key;
}
if (key > maxkey) maxkey = key;
i++;
}
i = 0;
foreach (int key in lastStepText.Keys) // Close Indent Match
{
StepText st = lastStepText[key];
if (st.Indent + 1 == xn2Text.Indent)
{
//Console.WriteLine("\">\"\t{0}\t{1}\t{2}\t\"{3}\"\t\"{4}\"", i, st.Indent, xn2Text.Indent, st.Tab, xn2Text.Tab);
if (xn2Text.Tab == "") return i+1;
return key;
}
if (st.Indent - 1 == xn2Text.Indent)
{
//Console.WriteLine("\"<\"\t{0}\t{1}\t{2}\t\"{3}\"\t\"{4}\"", i, st.Indent, xn2Text.Indent, st.Tab, xn2Text.Tab);
if (xn2Text.Tab == "") return i+1;
return key;
}
i++;
}
if (IsFirstTab(xn2Text.Tab))
return maxkey+1;
Console.WriteLine("\"First Not First\"\t\"{0}\"\t{1}\t{2}\t{3}\t\"{4}\"\t\"{5}\"\t\"{6}\"", _StepLocation, _StepID, "", xn2Text.Indent, "", xn2Text.Tab, xn2Text.Text);
return maxkey + 1;
}
private static string BuildHTMLLibDoc(XmlNode xn, string xmlbase)
{
XmlDocument xd1 = new XmlDocument();
xmlbase = Regex.Replace(xmlbase, "<![^>]+>[\r\n]*", "");
xmlbase = Regex.Replace(xmlbase, " style=\"\" style=\"", " style=\"");
string pat = " style=\\\"([^\"]+)\\\" style=\\\"";
xmlbase = Regex.Replace(xmlbase, pat, " style=\"$1");
xmlbase = xmlbase.Replace(" src=\".", " src=\"..");
if (_MyTableFileName == _LastTableFileName)
{
FileInfo fi = new FileInfo(_LastName);
using (StreamReader tr = fi.OpenText())
{
string lastContents = tr.ReadToEnd();
// Merge two HTML documents
int endLocation = lastContents.IndexOf("</body>");
int startLocation = xmlbase.IndexOf(">", xmlbase.IndexOf("<body "));
xmlbase = lastContents.Substring(0, endLocation) + xmlbase.Substring(startLocation + 1);
}
fi.Delete();
_TableNumber++;
}
else
{
_TableNumber = 1;
}
_LastTableFileName = _MyTableFileName;
xd1.LoadXml(xmlbase);
string filename = MakeFileName(xn);
_LastName = filename;
xd1.Save(filename);
return xmlbase;
}
private static string MakeFileName(XmlNode xn)
{
string filename = _MyTablePrefix + "\\" + GetLibDocName(xn).Replace(".", "").Replace("/", "").Replace("\\.", "") + "_" + _MyTableFileName + "_Table" + string.Format("{0:000}.HTML", _TableNumber);
return filename;
}
private static string GetLibDocName(XmlNode xn)
{
while (xn.Name != "Step")
xn = xn.ParentNode;
return xn.Attributes["name"].Value;
}
private static string _LastTableFileName=null;
private static int _TableNumber = 0;
//private static void LoadTable1(XmlNode xn)
//{
// XmlNode xn2 = xn.SelectSingleNode("tr/td/table");
// if (xn2 != null) xn = xn2;
// //xn.OwnerDocument.Save(filename);
// //if (xn.OuterXml.Contains("colspan") || xn.OuterXml.Contains("colspan"))
// // Console.WriteLine("Span");
// //XmlNodeList xlr = xn.SelectNodes("tr");
// //XmlNodeList xlc = xn.SelectNodes("tr/td");
// //XmlNodeList xlrs = xn.SelectNodes("tr/td/@colspan");
// //XmlNodeList xlcs = xn.SelectNodes("tr/td/@rowspan");
// //Console.WriteLine("{0}\t{1}\t{2}\t{3}", xlr.Count, xlc.Count, sum(xlcs,"colspan"),sum( xlrs,"rowspan"));
// //LoadTable(xn, 0,0,0);
//}
private static int sum(XmlNodeList xls,string attname)
{
int result = 0;
if(xls != null && xls.Count > 0)
foreach(XmlNode xc in xls)
if(xc is XmlAttribute)
result += int.Parse(xc.Value);
return result;
}
//private static void LoadTable(XmlNode xn, int level, int row, int col)
//{
// //if(xn is XmlText)
// //Console.WriteLine("T {0}{1}", "".PadLeft(2*level), xn.InnerText);
// //else
// if(xn is XmlElement)
// foreach(XmlNode xc in xn.ChildNodes)
// {
// if (xc is XmlElement && xc.Name == "td")
// {
// col++;
// //Console.WriteLine("X {0}{1} CS {2} RS {3}", "".PadLeft(2 * level), xc.Name, GetAttribute(xc, "colspan"), GetAttribute(xc, "rowspan"));
// }
// else if (xc is XmlElement && xc.Name == "tr")
// {
// row++;
// //Console.WriteLine("X {0}{1}", "".PadLeft(2 * level), xc.Name);
// }
// else
// //Console.WriteLine("X {0}{1}({2},{3})", "".PadLeft(2 * level), xc.Name,row,col);
// if (xc is XmlElement && xc.Name == "table")
// LoadTable(xc, level + 1, 0, 0);
// else
// LoadTable(xc, level + 1, row, col);
// }
//}
private static string GetAttribute(XmlNode xc, string attName)
{
string retval = null;
XmlAttribute xa = xc.Attributes[attName];
if (xa != null)
retval = xa.Value;
return retval;
}
private static string StripQuestion(string str)
{
string tmp = Regex.Replace(str, @"^(Is|Are|Has|Does|Did|Can|Do|Was|Were) (.+)\?$", "VERIFY $2");
//if (tmp != str)
// tmp = tmp.Substring(0, 1).ToUpper() + tmp.Substring(1);
return tmp;
}
private static Regex _RegRemoveLineBreaks = new Regex(@"\\line +", RegexOptions.Compiled);
private static StepText FixText(XmlNode xn)
{
if (xn == null) return null;
string str = xn.InnerText;
//if (str.Contains("may be exited when ANY of the following conditions"))
// Console.WriteLine("here");
// TODO Remove Tab Numbers
//str = Regex.Replace(xn.InnerText, "[A-Z0-9]+[.)] +", "");
//str = str.Trim(" \t".ToCharArray());
//str = Regex.Replace(str, " +", " ");
str = _RegRemoveLineBreaks.Replace(str, " ");
//if (str.Contains("The diagnosis of a SGTR is NOT confirmed"))
// Console.WriteLine("here");
return new StepText(str);
//RHM return Regex.Replace(str, "^(NOTE|NOTE CONTINUED|CAUTION|WARNING)$", "");
}
private static ItemInfo GetFirstNote(ItemInfo myItemInfo)
{
if (myItemInfo.Notes != null && myItemInfo.Notes.Count > 0)
return StepInfo.Get(myItemInfo.Notes[0].LastSibling.ItemID);
return null;
}
private static ItemInfo GetFirstCaution(ItemInfo myItemInfo)
{
if (myItemInfo.Cautions != null && myItemInfo.Cautions.Count > 0)
return StepInfo.Get(myItemInfo.Cautions[0].LastSibling.ItemID);
return null;
}
private static void BuildMySteps(StepInfo step, StepLookup mySteps)
{
if ((step.ActiveParent as ItemInfo).IsStep)
{
BuildMySteps(step.ActiveParent as StepInfo, mySteps);
mySteps.AddOne(step);
}
else
mySteps[0] = step;
}
private static void ListMySteps(string str, StepLookup mySteps)
{
int i = 0;
foreach (string key in mySteps.Keys)
{
//if (key != i.ToString())
Console.WriteLine("{0} {1} {2} {3}", str, i, key, mySteps[key].ToString());
i++;
}
}
public static Step MakeCSLAStep(StepLookup mySteps, int level, string stepNumber, string stepText, int stepType, E_FromType fromType)
{
if (mySteps.Count < level)
{
//Console.WriteLine("StepText + '{0}", stepText);
level = mySteps.Count;
//throw (new Exception("Error Making Step - null parent and previous"));
}
try
{
//if (mySteps.Count > 1 && mySteps[0].Ordinal == 5 && mySteps[level - 1].IsCautionOrNotePart)
// Console.WriteLine("Here");
if (level < 1) level = 1;
if (stepType == 20002)
{
if (mySteps[level - 1] != null && mySteps[level - 1].MyContent.Type == 20002)
stepType = 20001;
else if (mySteps[level] != null && mySteps[level].MyContent.Type == 20002)
Console.WriteLine("Oops");
}
else if (stepType == 20001)
{
if (mySteps[level] != null && mySteps[level].MyContent.Type == 20002)
stepType = 20002;
}
using (Step stp = MakeNewStep(mySteps[level - 1], mySteps[level], stepNumber, stepText, stepType, fromType))
{
stp.Save();
StepInfo si = mySteps[level] = StepInfo.Get(stp.ItemID);
CheckHLS(si, "Case 6");
_StepLocation = si.ShortPath;
_StepID = si.ItemID;
//if (stp.ItemID >= 10079 && stp.ItemID <= 10089)
// Console.WriteLine("{0} - {1} - {2}", si.ItemID, si.DisplayText, si.ShortPath);
return stp;
}
}
catch (Exception ex)
{
throw (new Exception("Error Making Step"));
}
}
private static void RemoveStepsAbove(StepLookup mySteps, int level)
{
List<string> removeList = new List<string>();
foreach (string key in mySteps.Keys)
if (int.Parse(key) > level)
removeList.Add(key);
foreach (string k in removeList)
mySteps.Remove(k);
//ListMySteps("RemoveStepsAbove", mySteps);
}
private static XmlNode NextNode(XmlNode xn2, string nodeName)
{
while (xn2 != null)
{
xn2 = xn2.NextSibling;
if (xn2 == null) return null;
if (xn2.Name == nodeName) return xn2;
}
return null;
}
private static XmlNode PreviousNode(XmlNode xn2, string nodeName)
{
while (xn2 != null)
{
xn2 = xn2.PreviousSibling;
if (xn2 == null) return null;
if (xn2.Name == nodeName) return xn2;
}
return null;
}
private void AddStep(SectionInfo prevSection, XmlNodeList xl)
{
StepLookup mySteps = new StepLookup();
pbStep.Value = 0;
pbStep.Maximum = xl.Count;
foreach (XmlNode xn in xl)
{
pbStep.Value++;
Application.DoEvents();
using (Step step = MakeNewStep(prevSection, mySteps[0], null, xn.Attributes["name"].Value, 20002, E_FromType.Step))
{
//if (step.ItemID == 9408)
// Console.WriteLine("Here");
//if (xn.Name == "UnitaryContingencyCallInstruction")
//{
// string key = xn.Attributes["number"].Value;
// MyContingencies.Add((1 + MyContingencies.Count).ToString(), step.ItemID);
//}
MyContingencies.Clear();
step.Save();
mySteps[0] = StepInfo.Get(step.ItemID);
CheckHLS(mySteps[0], "Case 7");
_StepLocation = mySteps[0].ShortPath;
_StepID = mySteps[0].ItemID;
lblStep.Text = "Step " + mySteps[0].Ordinal.ToString();
Application.DoEvents();
AddStepStucture(mySteps, 0, xn);
if (MyContingencies.Count > 0) Console.WriteLine("{0} Contingencies not processed", MyContingencies.Count);
}
}
}
private static Dictionary<string, int> _MyContingencies = new Dictionary<string, int>();
public static Dictionary<string, int> MyContingencies
{
get { return frmConvertXML._MyContingencies; }
set { frmConvertXML._MyContingencies = value; }
}
private static void AddStepStucture(StepLookup mySteps, int level, XmlNode xn)
{
AddStepStucture(mySteps, level, xn, true);
}
private static void AddStepStucture(StepLookup mySteps, int level, XmlNode xn, bool addContent)
{
//if (mySteps.Count > 0 && mySteps[0].ToString().StartsWith("5"))
//ListMySteps("AddStepStructure", mySteps);
if (xn.Name != "JoinInstruction" && xn.Attributes["content"] != null && xn.Attributes["content"].Value != "")
{
//if (xn.Attributes["content"].InnerText.Contains("the time of this procedure entry"))
// Console.WriteLine("here");
if (level == -1 && xn.Name != "NoteInstruction" && xn.Name != "CautionInstruction")
level = 0;
if(addContent)
{
_LastStepText.Clear();
AddContent(null, mySteps, level, xn, false);
}
if (level != mySteps.Count && xn.ParentNode.Name == "Contingency")
level = mySteps.Count;
if (xn.Name == "UnitaryContingencyCallInstruction")
{
if (level == 1)
{
string key = xn.Attributes["number"].Value;
MyContingencies.Add((1 + MyContingencies.Count).ToString(), mySteps[mySteps.Count - 1].ItemID);
//ListMyContingencies(string.Format("Parent Count={0} number={1} linkTarget={2}", MyContingencies.Count, key, xn.Attributes["linkTarget"].Value));
}
}
}
string lastNodeName = "";
foreach (XmlNode xn1 in xn.ChildNodes)
{
// ChildNodes can contain XmlText as well as XmlElement nodes
if (xn1 is XmlElement)
{
//if (mySteps.Count > 0 && mySteps[0].Ordinal==5)
// ListMySteps(string.Format("AddStepStructure {0}",xn1.Name), mySteps);
if (xn1.Name == "BoolVarInputItem" || xn1.Name == "TextVarInputItem")
level = mySteps.Count - 1;
//else
if (lastNodeName != xn1.Name && xn1.ParentNode.Name != "Contingency")// RHM 20181018
RemoveStepsAbove(mySteps, level);
lastNodeName = xn1.Name;
if (xn1.Name == "JoinInstruction")
{
AddStepStucture(mySteps, level, xn1);
}
else if (xn1.Name == "UnitaryContingencyCallInstruction")
{
AddStepStucture(mySteps, level + 1, xn1);
string key = xn1.Attributes["number"].Value;
if (level != 0)
{
MyContingencies.Add((1 + MyContingencies.Count).ToString(), mySteps[level + 1].ItemID);
//ListMyContingencies(string.Format("Child count={0} number={1} linkTarget={2}", MyContingencies.Count, key, xn1.Attributes["linkTarget"].Value));
}
}
else if (xn1.Name == "taskGroup")
{
XmlNodeList xl = xn1.SelectNodes(".//x:ovationGraphic",_NSMGR);
if (xl.Count > 0)
{
//Add CPSData annotation for Display
StringBuilder sb = new StringBuilder();
sb.AppendFormat ("<CPSData>");
int i = 0;
foreach (XmlNode xnog in xl)
{
sb.AppendFormat("<display number='{0}'>", ++i);
sb.AppendFormat("<identifier>{0}</identifier>", GetAttribute(xnog, "diagramNumber"));
sb.AppendFormat("<description>{0}</description>", GetAttribute(xnog, "title"));
sb.AppendFormat("</display>");
}
sb.AppendLine("</CPSData>");
if (mySteps.Count > 0)
{
using (Item itm = mySteps[mySteps.Count - 1].Get())
Annotation.MakeAnnotation(itm, AnnotationType.GetByNameOrCreate("CPS Data"), null, sb.ToString(), sb.ToString());
}
}
if (xn1.Attributes["name"].Value != "") AddTaskGroup(mySteps, level + 1, xn1);
else AddStepStucture(mySteps, level, xn1);
}
else if (xn1.Name == "row")
{
AddStepStucture(mySteps, level, xn1);
}
else if (xn1.Name == "BoolVarInputItem")
{
AddBoolVar(mySteps, level, xn1);
}
else if (xn1.Name == "TextVarInputItem")
{
AddTextVar(mySteps, level+1, xn1);
}
else if (xn1.Name == "Contingency")
{
string key = xn1.Attributes["number"].Value;
//Console.WriteLine("Try to use contingency {0}", key);
if (_MyContingencies.Count > 0)
{
if (ContingencyStep != null)
Console.WriteLine("Not Processed");
ContingencyStep = StepInfo.Get(MyContingencies[key]);
if (ContingencyStep == null)
{
Console.WriteLine("Could not find contingency");
}
else
{
//Console.WriteLine("Contingency + {0}", ContingencyStep);
}
MyContingencies.Remove(key);
//ListMyContingencies(string.Format("Remove number {0}", key));
AddStepStucture(mySteps, Math.Min(level + 1, mySteps.Count), xn1);
}
else
{
Console.WriteLine("No Contingencies left");
}
}
else
{
if (xn1.Name == "NoteInstruction" || xn1.Name == "CautionInstruction")
{
StepLookup stack = CloneSteps(mySteps);
//if (mySteps.Count > 0 && mySteps[0].ToString().StartsWith("5"))
// ListMySteps("AddStepStructure Before ", mySteps);
mySteps[0] = mySteps[0];
AddStepStucture(mySteps, 1, xn1);
foreach (string key in stack.Keys)
mySteps[key] = stack[key];
//if (mySteps.Count > 0 && mySteps[0].ToString().StartsWith("5"))
// ListMySteps("AddStepStructure After", mySteps);
}
else
AddStepStucture(mySteps, Math.Min(level + 1, mySteps.Count), xn1);
}
}
}
//if (mySteps.Count > 0 && mySteps[0].ToString().StartsWith("5"))
// ListMySteps("AddStepStructure", mySteps);
}
private static StepLookup CloneSteps(StepLookup mySteps)
{
StepLookup sl = new StepLookup();
foreach (string key in mySteps.Keys)
sl.Add(key, mySteps[key]);
return sl;
}
private static void ListMyContingencies(string name)
{
Console.WriteLine("contingencies - {0}", name);
foreach (string key in MyContingencies.Keys)
Console.WriteLine("{0}\t{1}", key, MyContingencies[key]);
}
private static void AddBoolVar(StepLookup mySteps, int level, XmlNode xn1)
{
if(xn1.Attributes["varInputReadOnly"].Value == "false")
using (Step step = MakeCSLAStep(mySteps, level, null, xn1.Attributes["varInputLabel"].Value + " True __ / False __", 20011, E_FromType.Step)) { ;}
else
using (Step step = MakeCSLAStep(mySteps, level, null, xn1.Attributes["varInputLabel"].Value, 20011, E_FromType.Step)) { ;}
}
private static void AddTextVar(StepLookup mySteps, int level, XmlNode xn1)
{
using (Step step = MakeCSLAStep(mySteps, level, null, xn1.Attributes["varInputLabel"].Value +" ____________", 20011, E_FromType.Step)) { ;}
}
private static void AddTaskGroup(StepLookup mySteps, int level, XmlNode xn1)
{
if (level > mySteps.Count) level = mySteps.Count;
using (Step step = MakeCSLAStep(mySteps, level, null, xn1.Attributes["name"].Value, 20024, E_FromType.Step)) { ;}
AddStepStucture(mySteps, level, xn1);
}
private void AddAttachments(SectionInfo parentSection, XmlNodeList xl, XmlNamespaceManager nsmgr)
{
SectionInfo prevSection = null;
foreach (XmlNode xn in xl)
{
string config = null;
int type ;
if(HasContingency(xn))
{
type=10002;
}
else
{
type = 10008;
config ="<Config><Section ColumnMode=\"1\" /></Config>";
}
using (Section sect = Section.MakeSection(parentSection, prevSection, "Attachment " + xn.Attributes["number"].Value, xn.Attributes["name"].Value, type))
{
if(config != null)
{
sect.MyContent.Config = config;
sect.Save();
}
prevSection = SectionInfo.Get(sect.ItemID);
//AddStepChildren(nsmgr, prevSection, xn.ChildNodes);
//Console.WriteLine("{0} - {1}", prevSection.ShortPath, xn.OuterXml);
_MyTableFileName = parentSection.MyProcedure.DisplayNumber + "_"
+ parentSection.DisplayNumber + prevSection.DisplayNumber;
//if (GetSectionStyle(xn) == "Free Form")
AddPSEC(prevSection, xn.ChildNodes);
//else
// AddStep(prevSection, xn.ChildNodes);
_MyTableFileName = null;
}
}
}
private static string _MyTableFileName;
private void btnBrowse_Click(object sender, EventArgs e)
{
ofd.FileName = tbFile.Text;
if (ofd.ShowDialog() == DialogResult.OK)
tbFile.Text = ofd.FileName;
}
private void btnAll_Click(object sender, EventArgs e)
{
if (_MyFlexGrid == null)
{
_MyFlexGrid = new VlnFlexGrid();
this.Controls.Add(_MyFlexGrid);
_MyFlexGrid.Location = tbResults.Location;
_MyFlexGrid.Size = tbResults.Size;
_MyFlexGrid.BringToFront();
}
FileInfo fi = new FileInfo(tbFile.Text);
pbProcs.Maximum = fi.Directory.GetFiles("*.xml").Count();
pbProcs.Value = 0;
foreach (FileInfo chld in fi.Directory.GetFiles("*.xml"))
{
_ProcNum = GetProcedureNumber(chld.FullName);
XML2PROMSDB(chld.FullName);
pbProcs.Value++;
Application.DoEvents();
}
lblStep.Text = "Step";
lblSection.Text = "Section";
lblProcedure.Text = "Procedure";
tbResults.AppendText("\r\n\r\n Done\r\n");
}
private void btnAllStructure_Click(object sender, EventArgs e)
{
tbResults.Clear();
Node.Reset();
FileInfo fi = new FileInfo(tbFile.Text);
pbProcs.Maximum = fi.Directory.GetFiles("*.xml").Count();
pbProcs.Value = 0;
foreach (FileInfo chld in fi.Directory.GetFiles("*.xml"))
{
LoadStructure(chld.FullName);
pbProcs.Value++;
Application.DoEvents();
}
tbResults.Clear();
ShowStructure2();
}
private void btnAllStructure2_Click(object sender, EventArgs e)
{
tbResults.Clear();
Node.Reset();
FileInfo fi = new FileInfo(tbFile.Text);
pbProcs.Maximum = fi.Directory.GetFiles("*.xml").Count();
pbProcs.Value = 0;
foreach (FileInfo chld in fi.Directory.GetFiles("*.xml"))
{
LoadStructure(chld.FullName);
pbProcs.Value++;
Application.DoEvents();
}
tbResults.Clear();
ShowStructure();
}
private void btnAllContent_Click(object sender, EventArgs e)
{
tbResults.Text = "";
Node.Reset();
FileInfo fi = new FileInfo(tbFile.Text);
FileInfo [] children = fi.Directory.GetFiles("*.xml");
pbProcs.Maximum = children.Count();
pbProcs.Value = 0;
foreach (FileInfo chld in children)
{
if (!chld.Name.StartsWith("._"))
{
tbResults.AppendText("\r\n" + chld.FullName);
GetAllContents(chld.FullName);
pbProcs.Value++;
Application.DoEvents();
}
}
tbResults.AppendText("\r\nDone");
}
private void GetAllContents(string fileName)
{
FileInfo fi = new FileInfo(fileName);
FileInfo fo = new FileInfo(fi.DirectoryName + "\\" + GetProcedureNumber(fileName) + ".txt");
GetAllContents(fi, fo);
}
private void GetAllContents(FileInfo fi, FileInfo fo)
{
StreamWriter sw = fo.CreateText();
LoadXml(fi.FullName, "Document Loaded");
ShowAllContent(MyXMLDoc.DocumentElement, 0, sw);
sw.Close();
}
private void ShowAllContent(XmlElement xe, int level, StreamWriter sw)
{
ShowContent(xe, level, sw);
foreach (XmlNode ch in xe.ChildNodes)
{
if (ch is XmlElement)
ShowAllContent(ch as XmlElement, level + 1, sw);
}
}
private void ShowContent(XmlElement xe, int level, StreamWriter sw)
{
string format = "Not Defined";
string prefix = " ";
switch (xe.Name)
{
case "ident":
format = "Procedure (LabelType-number)={labelType}-{number} fullName={fullName} PNSNo={PNSNo}";
break;
case "type":
format = "Procedure Type: {procedureType}";
break;
case "GrossStep":
format = "number={number} name={name}";
break;
case "Step":
format = "{number} {name}";
prefix = "S ";
break;
case "Contingency":
format = "{number} {name}";
prefix = "C ";
break;
case "attrib":
case "procedure":
case "controllers":
case "row":
format = "";// No Content
break;
case "CautionInstruction":
case "NoteInstruction":
format = "number={number} {content}";
break;
case "UnitaryInstruction":
case "BinaryInstruction":
format = "number={number} Left Target: {leftTarget} Link Target: {linkTarget} {content}";
break;
case "JoinInstruction":
format = "Link Target: {linkTarget} JoinType: {joinType}";
break;
case "UnitaryContingencyCallInstruction":
format = "number={number} Link Target: {linkTarget} Evaluation Type: {evaluationType} {content}";
prefix = "U ";
break;
case "taskGroup":
format = "name={name} borderVisible={borderVisible}";
break;
case "BoolVarInputItem":
format = "varInputLabel={varInputLabel} Data Point: {varInputDataPoint}";
break;
case "TextVarInputItem":
format = "varInputLabel={varInputLabel} Data Point: {varInputDataPoint}";
break;
case "ovationGraphic":
format = "title={title} Diagram Number: {diagramNumber}";
break;
case "ovationGroupTrend":
format = "name={name} description={description}";
break;
case "controller":
format = "controller - Unknown";
break;
case "and":
format = "and id={id}";
break;
case "BigOverview":
format = "BigOverview grossStep={grossStep} number={number} id={id}";
break;
case "BovActionStep":
format = "column={column} number={number} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovCheckBox":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovIfStep":
format = "column={column} number={number} linkTarget={linkTarget} group={group} id={id} name={name} label={label} rightTarget={rightTarget} {content}";
break;
case "BovMessageBox":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovProcedureLink":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovStepInLink":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovStepOutLink":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "descr":
case "esinfo":
case "esproj":
case "esprop":
case "private":
case "pwg":
case "pwt":
case "revbase":
case "systemtest":
format = "";
break;
case "eq":
case "gt":
case "gte":
case "lt":
case "lte":
case "not":
case "or":
format = "id={id}";
break;
case "fcase":
case "tcase":
format = "rst={rst}";
break;
case "logic":
format = "id={id} number={number}";
break;
case "ovationSingleTrend":
format = "description={description} number={number} id={id} name={name}";
break;
case "prop":
format = "type={type} value={value} name={name}";
break;
case "TextVarInputInstruction":
format = "taskDescription={taskDescription} varInputLabel={varinputLabel} number={number} {content}";
break;
case "utest":
format = "tested={tested}";
break;
case "var":
format = "var_type={var_type} id={id} name={name} number={number}";
break;
case "const":
format = "var_type={var_type} id={id} value={value}";
break;
}
sw.Write(string.Format("\r\n{0}{1}{2} ", prefix, "".PadRight(level, ' ').Replace(" ", "| "), xe.Name));
sw.Write(ReplaceAllAttributes(format, xe, level, prefix));
}
private void btnHTML_Click(object sender, EventArgs e)
{
tbResults.Clear();
Node.Reset();
FileInfo fi = new FileInfo(tbFile.Text);
pbProcs.Maximum = fi.Directory.GetFiles("*.xml").Count();
pbProcs.Value = 0;
foreach (FileInfo chld in fi.Directory.GetFiles("*.xml"))
{
LoadStructure3(chld.FullName);
pbProcs.Value++;
Application.DoEvents();
}
tbResults.Clear();
ShowStructure();
}
private void LoadStructure3(string fileName)
{
LoadXml(fileName, null);
//Find Content Attributes
LoadStructure3(MyXMLDoc.DocumentElement);
}
private void LoadStructure3(XmlElement xe)
{
LoadStructure3Content(xe);
foreach (XmlNode xn in xe.ChildNodes)
{
if (xn is XmlElement)
LoadStructure3(xn as XmlElement);
}
}
private void LoadStructure3Content(XmlElement xn)
{
if (xn.Attributes["content"] != null)
{
string xml = cleanupHTML(xn.Attributes["content"].Value, 0);
if (xml == string.Empty) return;
if (xml.Replace(" ", "") == xn.Name) return;
if (!xml.Contains("<"))
{
Console.WriteLine("not XML '{0}'", xml);
xml = "<html><p>" + xml + "</p></html>";
}
XmlDocument xd = new XmlDocument();
xd.LoadXml(xml);
//xml = xml.Replace("<html>", "<html xmlns='http://www.w3.org/2000/html'>");
//vlnhtml myHTML = HtmlSerializer<vlnhtml>.StringDeserialize(xml);
Node.Add(xd.DocumentElement);
}
}
private Dictionary<string, int> _DicHTMLStruct;
public Dictionary<string, int> DicHTMLStruct
{
get { return _DicHTMLStruct; }
set { _DicHTMLStruct = value; }
}
private void btnHTML2_Click(object sender, EventArgs e)
{
DicHTMLStruct = new Dictionary<string, int>();
tbResults.Clear();
Node.Reset();
FileInfo fi = new FileInfo(tbFile.Text);
pbProcs.Maximum = fi.Directory.GetFiles("*.xml").Count();
pbProcs.Value = 0;
foreach (FileInfo chld in fi.Directory.GetFiles("*.xml"))
{
LoadStructure4(chld.FullName);
pbProcs.Value++;
Application.DoEvents();
}
tbResults.Clear();
ShowHtmlStructure();
}
/// <summary>
/// Show Count for each structure
/// </summary>
private void ShowHtmlStructure()
{
tbResults.Text = "";
foreach (string key in DicHTMLStruct.Keys)
tbResults.AppendText(string.Format("{0}\t\"{1}\"\r\n", DicHTMLStruct[key], key));
}
private void LoadStructure4(string fileName)
{
LoadXml(fileName, null);
//Find Content Attributes
LoadStructure4(MyXMLDoc.DocumentElement);
}
private void LoadStructure4(XmlElement xe)
{
LoadStructure4Content(xe);
foreach (XmlNode xn in xe.ChildNodes)
{
if (xn is XmlElement)
LoadStructure4(xn as XmlElement);
}
}
private void LoadStructure4Content(XmlElement xn)
{
if (xn.Attributes["content"] != null)
{
string xml = cleanupHTML(xn.Attributes["content"].Value, 0);
if (xml == string.Empty) return;
if (xml.Replace(" ", "") == xn.Name) return;
if (!xml.Contains("<"))
{
//Console.WriteLine("not XML '{0}'", xml);
xml = "<html><p>" + xml + "</p></html>";
}
XmlDocument xd = new XmlDocument();
xd.LoadXml(xml);
XmlAttribute xa = xd.CreateAttribute("type");
xa.Value = xn.Name;
xd.DocumentElement.Attributes.Append(xa);
if (xn.Attributes["number"] != null && xn.Attributes["number"].Value != string.Empty)
{
XmlAttribute xa1 = xd.CreateAttribute("number");
xa1.Value = xn.Attributes["number"].Value;
if (Regex.IsMatch(xa1.Value, "[0-9]+")) xa1.Value = "#";
xd.DocumentElement.Attributes.Append(xa1);
}
//AddStructure(GetStructurePath(xd.DocumentElement).Replace("[br]-T",""));
AddStructure(GetStructurePath(xd.DocumentElement,true));
}
}
private void AddStructure(string mystruct)
{
if (!DicHTMLStruct.ContainsKey(mystruct))
DicHTMLStruct.Add(mystruct, 1);
else
DicHTMLStruct[mystruct]++;
}
private string GetStructurePath(XmlElement xe, bool removeDuplicates)
{
StringBuilder sb = new StringBuilder();
sb.Append("[" + xe.Name);
if (xe.Name == "ul")
sb.Append(GetUlDetail(xe));
//if (xe.Name == "html")
//{
// sb.Append(" " + xe.Attributes["type"].Value);
// if (xe.Attributes["number"] != null && xe.Attributes["number"].Value != string.Empty)
// sb.Append(" " + xe.Attributes["number"].Value);
//}
if (xe.ChildNodes != null && xe.ChildNodes.Count > 0)
{
if (xe.Name != "table")
{
foreach (XmlNode xc in xe.ChildNodes)
{
if (xc is XmlElement)
sb.Append(GetStructurePath(xc as XmlElement, removeDuplicates));
else if (xc is XmlText)
{
//Console.WriteLine(xc.Value);
Match ma = Regex.Match(xc.Value, "^ *(and|or|AND|OR) *$");
Match mcn = Regex.Match(xc.Value, "^ *(CAUTION|NOTE|WARNING|CAUTIONS|NOTES|WARNINGS|NOTE CONTINUED) *$");
Match m1 = Regex.Match(xc.Value, "^[0-9]+[\\.\\)] ");
Match m2 = Regex.Match(xc.Value, "^[A-Z][\\.\\)] ");
Match m3 = Regex.Match(xc.Value, "^[a-z][\\.\\)] ");
Match m4 = Regex.Match(xc.Value, "^[-\u2022\u25AA\u25CF]");// Bullets and Dashes
Match m5 = Regex.Match(xc.Value, "^[^#0-9\\t*(A-Za-z \u00A0\"<>\u2264\\[\uD558\u00B7\u0025\u002F\uF07F\uFF1C\uFF1E\u02C2\u02C3\u203B\u2265\u2267\u2460\u2461\u25AA\u25B2\u25BC\u25CF] ");
if (mcn.Value != string.Empty)
sb.Append("-T " + mcn.Value);
else if (ma.Value != string.Empty)
sb.Append("-T " + ma.Value);
else if (m1.Value != string.Empty)
sb.Append("-T " + m1.Value.Trim());
else if (m2.Value != string.Empty)
sb.Append("-T " + m2.Value.Trim());
else if (m3.Value != string.Empty)
sb.Append("-T " + m3.Value.Trim());
else if (m4.Value != string.Empty)
sb.Append("-T {" + "Bullet " + ((int)(m4.Value[0])).ToString() + "}");
else if (m5.Value != string.Empty)
sb.Append("-T {{" + ((int)(m5.Value[0])).ToString() + "}}");
else sb.Append("-T");
}
}
}
//else
//Console.WriteLine("here");
}
sb.Append("]");
RemoveRepeats(sb.ToString(),removeDuplicates);
return sb.ToString();
}
private string GetUlDetail(XmlElement xe)
{
XmlAttribute xaType = xe.Attributes["type"];
XmlAttribute xaStyle = xe.Attributes["style"];
string type = string.Empty;
if (xaType != null)
type = " t" + xaType.Value;
string indent = string.Empty;
if (xaStyle != null)
indent = " i" + Regex.Replace(xaStyle.Value, "^.*-qt-list-indent: ([0-9]+).*$", "$1");
return type + indent;
}
RegexReplace[] MyRegExReplaces = {
new RegexReplace("\\[p-T\\]","[Para]"),
new RegexReplace("\\[p-T OR\\]","[OR]"),
new RegexReplace("\\[p-T AND\\]","[AND]"),
new RegexReplace("\\[p-T NOTE\\]","[NOTE]"),
new RegexReplace("\\[p-T CAUTION\\]","[CAUTION]"),
new RegexReplace("\\[p-T WARNING\\]","[WARNING]"),
new RegexReplace("\\[p-T [0-9]+\\.\\]","[Seq1.]"),
new RegexReplace("\\[p-T [0-9]+\\)\\]","[Seq1)]"),
new RegexReplace("\\[p-T [A-Z]\\.\\]","[SeqA.]"),
new RegexReplace("\\[p-T [a-z]\\.\\]","[Seqa.]"),
new RegexReplace("\\[li-T\\]","[Li]"),
new RegexReplace(" tsquare i1","1"),
new RegexReplace(" tsquare i2","2"),
new RegexReplace(" tsquare i3","3"),
new RegexReplace(" tsquare i4","4"),
new RegexReplace("(\\[p\\])+","")
};
RegexReplace[] MyRegExRepeats = {
new RegexReplace("(\\[Para\\])+","[Para]"),
new RegexReplace("(\\[OR\\])+","[OR]"),
new RegexReplace("(\\[AND\\])+","[AND]"),
new RegexReplace("(\\[NOTE\\])+","[NOTE]"),
new RegexReplace("(\\[CAUTION\\])+","[CAUTION]"),
new RegexReplace("(\\[WARNING\\])+","[WARNING]"), new RegexReplace("\\[p-T \\{\u2022\\}\\]","[Bullet]"),
new RegexReplace("(\\[Bullet\\])+","[Bullet]"),
new RegexReplace("(\\[Seq1\\.\\])+","[Seq1.]"),
new RegexReplace("(\\[Seq1\\)\\])+","[Seq1)]"),
new RegexReplace("(\\[SeqA\\.\\])+","[SeqA.]"),
new RegexReplace("(\\[Seqa\\.\\])+","[Seqa.]"),
new RegexReplace("(\\[Li\\])+","[Li]")
};
private string RemoveRepeats(string str, bool removeDuplicates)
{
foreach (RegexReplace rr in MyRegExReplaces)
str = rr.DoReplace(str);
if (removeDuplicates)
foreach (RegexReplace rr in MyRegExRepeats)
str = rr.DoReplace(str);
return str;
}
private void btnCandN_Click(object sender, EventArgs e)
{
LoadXml(tbFile.Text, "Document Loaded");
tbResults.Clear();
FindCandN(MyXMLDoc.DocumentElement);
}
private void FindCandN(XmlElement xe)
{
if ((xe.Name == "CautionInstruction" || xe.Name == "NoteInstruction")
&& (xe.ParentNode as XmlElement).Name == "Step" && AllSiblingsAreCautionsOrNotes(xe))
tbResults.AppendText(xe.Name
+ "\t" + (xe.ParentNode as XmlElement).Attributes["name"].Value
+ "\t" + (xe.ParentNode as XmlElement).Attributes["name"].Value
+ "\t" + (xe.ParentNode.ParentNode as XmlElement).Attributes["name"].Value
+ "\r\n");
foreach (XmlNode xc in xe.ChildNodes)
if (xc is XmlElement)
FindCandN(xc as XmlElement);
}
private bool AllSiblingsAreCautionsOrNotes(XmlElement xe)
{
XmlElement xep = xe.ParentNode as XmlElement;
if (xep == null) return false;
foreach (XmlNode xc in xep.ChildNodes)
if (xc.Name != "CautionInstruction" && xc.Name != "NoteInstruction")
return false;
return true;
}
private void btnHTLM3_Click(object sender, EventArgs e)
{
MessageBox.Show("Not Implemented", "NA", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
private void btnAllContent2_Click(object sender, EventArgs e)
{
tbResults.Text = "";
Node.Reset();
FileInfo fi = new FileInfo(tbFile.Text);
pbProcs.Maximum = fi.Directory.GetFiles("*.xml").Count();
pbProcs.Value = 0;
foreach (FileInfo chld in fi.Directory.GetFiles("*.xml"))
{
tbResults.AppendText("\r\n" + chld.FullName);
GetAllContents2(chld.FullName);
pbProcs.Value++;
Application.DoEvents();
}
tbResults.AppendText("\r\nDone");
}
private void GetAllContents2(string fileName)
{
FileInfo fi = new FileInfo(fileName);
FileInfo fo = new FileInfo(fi.DirectoryName + "\\" + GetProcedureNumber(fileName) + ".txt");
GetAllContents2(fi, fo);
}
private void GetAllContents2(FileInfo fi, FileInfo fo)
{
StreamWriter sw = fo.CreateText();
LoadXml(fi.FullName, "Document Loaded");
ShowAllContent2(MyXMLDoc.DocumentElement, 0, sw);
sw.Close();
}
private void ShowAllContent2(XmlElement xe, int level, StreamWriter sw)
{
ShowContent2(xe, level, sw);
foreach (XmlNode ch in xe.ChildNodes)
{
if (ch is XmlElement)
ShowAllContent2(ch as XmlElement, level + 1, sw);
}
}
private void ShowContent2(XmlElement xe, int level, StreamWriter sw)
{
string format = "Not Defined";
string prefix = " ";
switch (xe.Name)
{
case "ident":
format = "Procedure (LabelType-number)={labelType}-{number} fullName={fullName} PNSNo={PNSNo}";
break;
case "type":
format = "Procedure Type: {procedureType}";
break;
case "GrossStep":
format = "number={number} name={name}";
break;
case "Step":
format = "{number} {name}";
prefix = "S ";
break;
case "Contingency":
format = "{number} {name}";
prefix = "C ";
break;
case "attrib":
case "procedure":
case "controllers":
case "row":
format = "";// No Content
break;
case "CautionInstruction":
case "NoteInstruction":
format = "number={number} {content}";
break;
case "UnitaryInstruction":
case "BinaryInstruction":
format = "number={number} Left Target: {leftTarget} Link Target: {linkTarget} {content}";
break;
case "JoinInstruction":
format = "Link Target: {linkTarget} JoinType: {joinType}";
break;
case "UnitaryContingencyCallInstruction":
format = "number={number} Link Target: {linkTarget} Evaluation Type: {evaluationType} {content}";
prefix = "U ";
break;
case "taskGroup":
format = "name={name} borderVisible={borderVisible}";
break;
case "BoolVarInputItem":
format = "varInputLabel={varInputLabel} Data Point: {varInputDataPoint}";
break;
case "TextVarInputItem":
format = "varInputLabel={varInputLabel} Data Point: {varInputDataPoint}";
break;
case "ovationGraphic":
format = "title={title} Diagram Number: {diagramNumber}";
break;
case "ovationGroupTrend":
format = "name={name} description={description}";
break;
case "controller":
format = "controller - Unknown";
break;
case "and":
format = "and id={id}";
break;
case "BigOverview":
format = "BigOverview grossStep={grossStep} number={number} id={id}";
break;
case "BovActionStep":
format = "column={column} number={number} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovCheckBox":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovIfStep":
format = "column={column} number={number} linkTarget={linkTarget} group={group} id={id} name={name} label={label} rightTarget={rightTarget} {content}";
break;
case "BovMessageBox":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovProcedureLink":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovStepInLink":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "BovStepOutLink":
format = "column={column} linkTarget={linkTarget} group={group} id={id} name={name} label={label} {content}";
break;
case "descr":
case "esinfo":
case "esproj":
case "esprop":
case "private":
case "pwg":
case "pwt":
case "revbase":
case "systemtest":
format = "";
break;
case "eq":
case "gt":
case "gte":
case "lt":
case "lte":
case "not":
case "or":
format = "id={id}";
break;
case "fcase":
case "tcase":
format = "rst={rst}";
break;
case "logic":
format = "id={id} number={number}";
break;
case "ovationSingleTrend":
format = "description={description} number={number} id={id} name={name}";
break;
case "prop":
format = "type={type} value={value} name={name}";
break;
case "TextVarInputInstruction":
format = "taskDescription={taskDescription} varInputLabel={varinputLabel} number={number} {content}";
break;
case "utest":
format = "tested={tested}";
break;
case "var":
format = "var_type={var_type} id={id} name={name} number={number}";
break;
case "const":
format = "var_type={var_type} id={id} value={value}";
break;
}
sw.Write(string.Format("\r\n{0}{1}{2} ", prefix, "".PadRight(level, ' ').Replace(" ", "| "), xe.Name));
sw.Write(ReplaceAllAttributes2(format, xe, level, prefix));
}
private string ReplaceAllAttributes2(string format, XmlElement xe, int level, string prefix)
{
MatchCollection m;
while ((m = regFixAttributes.Matches(format)).Count > 0)
{
string part1 = format.Substring(0, m[0].Groups[1].Index);
string part3 = format.Substring(m[0].Groups[1].Index + m[0].Groups[1].Length);
string att = m[0].Groups[1].Value.Replace("{", "").Replace("}", "");
XmlAttribute xa = xe.Attributes[att];
//if (xa == null)
// Console.WriteLine(xe.OuterXml);
string part2;
if (xa != null)
part2 = xe.Attributes[att].Value; //GetAttribute(xe, att);
else
part2 = "null";
if (part2 == string.Empty) part2 = "empty";
if (att == "content")
{
if (!part2.Contains("<"))
{
part2 = "<html><p>" + part2 + "</p></html>";
}
XmlDocument xd = new XmlDocument();
xd.LoadXml(cleanupHTML(part2,1));
part2 = GetStructurePath(xd.DocumentElement,false);
part2 = part2.Replace("\n", string.Format("\r\n {0} ", "".PadRight(level).Replace(" ", "| ")));
}
format = part1 + part2 + part3;
}
return format;
}
Dictionary<string, int> _VerbList;
private void btnVerbs_Click(object sender, EventArgs e)
{
_VerbList = new Dictionary<string, int>();
tbResults.Clear();
FileInfo fi = new FileInfo(tbFile.Text);
pbProcs.Maximum = fi.Directory.GetFiles("*.xml").Count();
pbProcs.Value = 0;
foreach (FileInfo chld in fi.Directory.GetFiles("*.xml"))
{
FindVerbs(chld.FullName);
pbProcs.Value++;
Application.DoEvents();
}
tbResults.Clear();
ShowVerbs();
}
private void ShowVerbs()
{
foreach (string key in _VerbList.Keys)
tbResults.AppendText(string.Format("{0}\t\"{1}\"\r\n",_VerbList[key], key));
}
private void FindVerbs(string fileName)
{
LoadXml(fileName, null);
//Find Content Attributes
FindVerbs(MyXMLDoc.DocumentElement);
}
private void FindVerbs(XmlElement xe)
{
FindVerbContent(xe);
foreach (XmlNode xn in xe.ChildNodes)
{
if (xn is XmlElement)
FindVerbs(xn as XmlElement);
}
}
Regex _regFindSpan = new Regex("<span style=\" font-weight:600;\">([A-Z]+)</span>", RegexOptions.Compiled);
private void FindVerbContent(XmlElement xn)
{
if (xn.Attributes["content"] != null)
{
string xml = xn.Attributes["content"].Value;
if (xml == string.Empty) return;
if (xml.Replace(" ", "") == xn.Name) return;
//if (xml.Contains("font-weight:600")) Console.WriteLine("here");
MatchCollection mc = _regFindSpan.Matches(xml);
if (mc.Count == 0) return;
foreach (Match m in mc)
if (_VerbList.ContainsKey(m.Groups[1].Value))
_VerbList[m.Groups[1].Value]++;
else
_VerbList.Add(m.Groups[1].Value,1);
}
}
private SortedDictionary<string, int> _DicFigureUsage;
private void btnFigures_Click(object sender, EventArgs e)
{
_DicFigureUsage = new SortedDictionary<string, int>();
tbResults.Clear();
FileInfo fi = new FileInfo(tbFile.Text);
pbProcs.Maximum = fi.Directory.GetFiles("*.xml").Count();
pbProcs.Value = 0;
// Loop through XML Files
foreach (FileInfo chld in fi.Directory.GetFiles("*.xml"))
{
FindImages(chld.FullName);
pbProcs.Value++;
Application.DoEvents();
}
ShowFigures();
}
private void ShowFigures()
{
tbResults.AppendText("\r\n\r\n**** MultipleOccurences ****\r\n\r\n");
foreach (string key in _DicFigureUsage.Keys)
if(_DicFigureUsage[key]>1)
tbResults.AppendText(string.Format("{0}\t{1}\r\n", _DicFigureUsage[key], key));
}
private void FindImages(string fileName)
{
LoadXml(fileName, null);
//Find Content Attributes
FindImages(MyXMLDoc.DocumentElement, GetProcedureNumber(fileName));
}
private void FindImages(XmlElement xe, string procname)
{
FindImageContent(xe, procname);
foreach (XmlNode xn in xe.ChildNodes)
{
if (xn is XmlElement)
FindImages(xn as XmlElement, procname);
}
}
//Regex _regFindImage = new Regex("<img src=([A-Z]+)</span>", RegexOptions.Compiled);
private void FindImageContent(XmlElement xn, string procname)
{
if (xn.Attributes["content"] != null)
{
string xml = cleanupHTML(xn.Attributes["content"].Value, 0);
if (xml == string.Empty) return;
if (xml.Replace(" ", "") == xn.Name) return;
if (!xml.Contains("<img")) return;
XmlDocument xd = new XmlDocument();
xd.LoadXml(xml);
XmlNodeList xl = xd.SelectNodes("//img");
foreach (XmlNode xnn in xl)
{
Console.WriteLine("\"{0}\"\t\"{1}\"\t\"{2}\"", procname, xnn.Attributes["src"].Value,GetPath(xn));
string key = string.Format("\"{0}\"\t\"{1}\"", procname, GetPath(xn));
//if (_DicFigureUsage.ContainsKey(key))
// _DicFigureUsage[key]++;
//else
// _DicFigureUsage.Add(key, 1);
}
}
}
private static string GetPath(XmlNode xn)
{
switch (xn.Name)
{
case "GrossStep":
return xn.Attributes["number"].Value + " " + xn.Attributes["name"].Value;
case "Step":
return GetPath(xn.ParentNode) + ":Step " + xn.Attributes["number"].Value + " " + xn.Attributes["name"].Value + ":";
default:
{
string siblings = GetSiblings(xn);
return GetPath(xn.ParentNode) + ":" + xn.Name + (siblings == null? "" : "(" + siblings + ")" );
}
}
}
private static string GetSiblings(XmlNode xn)
{
SortedDictionary<string,string> siblings = new SortedDictionary<string,string>();
XmlNode xp = xn.PreviousSibling;
while (xp != null)
{
string key = xp.Name;
if (!siblings.ContainsKey(key))
siblings.Add(key, ShortVersion(key));
xp = xp.PreviousSibling;
}
XmlNode xx = xn.NextSibling;
while (xx != null)
{
string key = xx.Name;
if (!siblings.ContainsKey(key))
siblings.Add(key, ShortVersion(key));
xx = xx.NextSibling;
}
string results = "";
foreach (string ky in siblings.Keys)
results += siblings[ky];
if (results == "") return null;
return results;
}
private static string ShortVersion(string key)
{
switch (key)
{
case "NoteInstruction":
return "N";
case "CautionInstruction":
return "C";
case "Contingency":
return "*";
case "UnitaryInstruction":
return "U";
case "BinaryInstruction":
return "B";
case "JoinInstruction":
return "J";
case "UnitaryContingencyCallInstruction":
return "R";
default:
return string.Format("[{0}]", key);
}
}
private void btnTables_Click(object sender, EventArgs e)
{
//Loop through content containing table(s) under td.
tbResults.Clear();
FileInfo fi = new FileInfo(tbFile.Text);
pbProcs.Maximum = fi.Directory.GetFiles("*.xml").Count();
pbProcs.Value = 0;
// Loop through XML Files
foreach (FileInfo chld in fi.Directory.GetFiles("*.xml"))
{
FindTables(chld.FullName);
pbProcs.Value++;
Application.DoEvents();
}
ShowTables();
}
private void ShowTables()
{
//throw new NotImplementedException();
}
private void FindTables(string fileName)
{
LoadXml(fileName, null);
//Find Content Attributes
FindTables(MyXMLDoc.DocumentElement, GetProcedureNumber(fileName));
}
private void FindTables(XmlElement xe, string procNum)
{
FindTableContent(xe, procNum);
foreach (XmlNode xn in xe.ChildNodes)
{
if (xn is XmlElement)
FindTables(xn as XmlElement, procNum);
}
}
private void FindTableContent(XmlElement xn, string procNum)
{
if (xn.Attributes["content"] != null)
{
string xml = cleanupHTML(xn.Attributes["content"].Value, 0);
if (xml == string.Empty) return;
if (xml.Replace(" ", "") == xn.Name) return;
if (!xml.Contains("<table")) return;
XmlDocument xd = new XmlDocument();
xd.LoadXml(xml.Replace("&","&amp;"));
XmlNodeList xl = xd.SelectNodes("//table");
foreach (XmlNode xnn in xl)
{
if(xnn.ParentNode.Name == "td")
Console.WriteLine("\"TWT\"\t\"{0}\"\t\"{1}\"\t\"{2}\"\t{3}\t{4}\t{5}\t{6}", procNum, GetPath(xn), GetPath2(xnn), xnn.Name,GetNext(xnn), GetPrevious(xnn), xnn.ParentNode.Name);
else
Console.WriteLine("\"TBL\"\t\"{0}\"\t\"{1}\"\t\"{2}\"\t{3}\t{4}\t{5}\t{6}", procNum, GetPath(xn), GetPath2(xnn), xnn.Name,GetNext(xnn), GetPrevious(xnn), xnn.ParentNode.Name);
}
}
}
private object GetPrevious(XmlNode xnn)
{
if (xnn.PreviousSibling != null) return xnn.PreviousSibling.Name;
return "No Previous";
}
private object GetNext(XmlNode xnn)
{
if (xnn.NextSibling != null) return xnn.NextSibling.Name;
return "No Next";
}
private static string GetPath2(XmlNode xn)
{
if (xn == null) return "";
else return GetPath2(xn.ParentNode) + ":" + xn.Name;
}
private void FindFigures(XmlElement xe, string procNum)
{
FindImageContent(xe, procNum);
foreach (XmlNode xn in xe.ChildNodes)
{
if (xn is XmlElement)
FindImages(xn as XmlElement, procNum);
}
}
private void FindFigureContent(XmlElement xn, string procname)
{
if (xn.Attributes["content"] != null)
{
string xml = cleanupHTML(xn.Attributes["content"].Value, 0);
if (xml == string.Empty) return;
if (xml.Replace(" ", "") == xn.Name) return;
if (!xml.Contains("<table")) return;
XmlDocument xd = new XmlDocument();
xd.LoadXml(xml);
XmlNodeList xl = xd.SelectNodes("//table");
foreach (XmlNode xnn in xl)
{
Console.WriteLine("\"{0}\"\t\"{1}\"\t\"{2}\"", procname, GetPath(xn),xnn.Name);
}
}
}
private void bntTable2_Click(object sender, EventArgs e)
{
VlnFlexGrid fg = new VlnFlexGrid();
StepRTB rtb = new StepRTB();
this.Controls.Add(fg);
fg.Location = tbResults.Location;
fg.Size = tbResults.Size;
fg.Rows.Count = 5;
fg.Cols.Count = 5;
fg.BringToFront();
;
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
{
rtb.Text = string.Format("{0},{1}", i, j);
fg[i, j] = rtb.Rtf;
fg.MyBorders.HorizontalLines[i, j] = GridLinePattern.Single;
fg.MyBorders.VerticalLines[i, j] = GridLinePattern.Single;
}
CellRange cr = new CellRange();
cr.c1 = 0;
cr.c2 = 4;
cr.r1 = 0;
cr.r2 = 4;
fg.SetBorders(cr, GridLinePattern.Single, GridLinePattern.Single, GridLinePattern.Single, GridLinePattern.Single, GridLinePattern.Single, GridLinePattern.Single);
fg.Refresh();
Application.DoEvents();
Console.WriteLine(fg.GetXMLData());
XmlDocument xd = new XmlDocument();
using (StringReader sr = new StringReader(xmlSample1))
{
fg.ReadXml(sr);
sr.Close();
}
}
private static string _ProcNum;
private void btnStepOrNo_Click(object sender, EventArgs e)
{
// start by doing one then expand to all
tbResults.Clear();
tbResults.AppendText("\"ProcNum\"\t\"Section\"\t\"Title\"\t\"Step\"\t\"Text\"" +
"\t\"Tables\"\t\"Images\"\t\"Style\"\t\"LastStyle\"\t\"NextStyle\"\t\"Notes\"\t\"Cautions\"\t\"Warnings\"" +
"\t\"Contingency\"\t\"Binary\"\t\"Join\"\t\"Note\"\t\"Caution\"\t\"Unitary\"\r\n");
FileInfo fi = new FileInfo(tbFile.Text);
pbProcs.Maximum = fi.Directory.GetFiles("*.xml").Count();
pbProcs.Value = 0;
foreach (FileInfo chld in fi.Directory.GetFiles("*.xml"))
{
LoadXml(chld.FullName, null);
_ProcNum = GetProcedureNumber(chld.FullName);
StepOrNo(MyXMLDoc.DocumentElement);
pbProcs.Value++;
Application.DoEvents();
}
}
private string _LastSectNo = "";
private string _LastStyle="";
private void StepOrNo(XmlNode xn)
{
if (xn.Name == "GrossStep" || xn.Name =="procedure")
{
foreach (XmlNode xc in xn.ChildNodes)
StepOrNo(xc);
}
else if (xn.Name == "Step")
{
string sectNo = _ProcNum + xn.ParentNode.Attributes["number"].Value;
string style = GetSectionStyle(xn);
if (sectNo != _LastSectNo)
_LastStyle = "";
XmlNode nn = xn.NextSibling;
while (nn != null && nn.Name == "esinfo")
nn = nn.NextSibling;
string nextStyle = "";
if(nn != null)
nextStyle = GetSectionStyle(nn);
//if (xn.ParentNode.Attributes["number"].Value == "IV") Console.WriteLine("here");
tbResults.AppendText(string.Format("\"{0}\"\t\"{1}\"\t\"{2}\"\t\"{3}\"\t\"{4}\"" +
"\t\"{5}\"\t\"{6}\"\t\"{7}\"\t\"{8}\"\t\"{9}\"\t\"{10}\"\t\"{11}\"\t\"{12}\"" +
"\t\"{13}\"\t\"{14}\"\t\"{15}\"\t\"{16}\"\t\"{17}\"\t\"{18}\"\r\n", _ProcNum
, xn.ParentNode.Attributes["number"].Value, xn.ParentNode.Attributes["name"].Value
, xn.Attributes["number"].Value, xn.Attributes["name"].Value
,GetContainsTable(xn),GetContainsImage(xn),style,_LastStyle, nextStyle
,GetContains(xn,"NOTE"),GetContains(xn,"CAUTION"),GetContains(xn,"WARNING")
, GetContainsNode(xn, "Contingency"), GetContainsNode(xn, "BinaryI"), GetContainsNode(xn, "JoinI")
, GetContainsNode(xn, "NoteI"), GetContainsNode(xn, "CautionI"), GetContainsNode(xn, "UnitaryI")));
_LastStyle = style;
_LastSectNo = sectNo;
}
}
private string GetContainsNode(XmlNode xn, string lookfor)
{
if (xn.Name.StartsWith(lookfor)) return lookfor;
foreach (XmlNode xc in xn.ChildNodes)
if (GetContainsNode(xc, lookfor) != null) return lookfor;
return null;
}
private string GetContains(XmlNode xn, string typ)
{
string retval = "";
if (xn.InnerXml.Contains(typ)) retval = typ.ToLower();
foreach (XmlNode xc in xn.ChildNodes)
{
if (xc.Name == "NoteInstruction" || xc.Name == "CautionInstruction")
if (FirstTextIsType(xc, typ)) return typ;
else return retval;
}
return retval;
}
private static bool FirstTextIsType(XmlNode xn, string typ)
{
XmlAttribute xa = xn.Attributes["content"];
string xmlbase = xa.Value;
xmlbase = Regex.Replace(xmlbase, "<![^>]+>[\r\n]*", "");
xmlbase = Regex.Replace(xmlbase, " style=\"\" style=\"", " style=\"");
string pat = " style=\\\"([^\"]+)\\\" style=\\\"";
xmlbase = Regex.Replace(xmlbase, pat, " style=\"$1");
XmlDocument xd = new XmlDocument();
//TODO 20180913 0644 Not XML
if (!xmlbase.Contains("<")) return false;
xd.LoadXml(xmlbase);
return FirstTextIsType1(xd.DocumentElement, typ);
}
private static bool FirstTextIsType1(XmlNode xn, string typ)
{
foreach (XmlNode xc in xn.ChildNodes)
{
if (xc is XmlText)
{
if ((xc as XmlText).Value.Contains(typ))
return true;
return false;
}
if (xc.Name == "body" || xc.Name == "p" || xc.Name == "li" || xc.Name == "span")
return FirstTextIsType1(xc, typ);
}
return false;
}
private static string GetSectionStyle(XmlNode xn)
{
foreach (XmlNode xc in xn.ChildNodes)
if (xc.Name == "BinaryInstruction" || xc.Name == "Contingency " || xc.Name=="UnitaryContingencyCallInstruction" || countChildNodes(xc)>0)
if(xc.Name != "esinfo") return "Substeps";
bool hasFreeForm = false;
bool hasSpecificNotes = false;
bool hasUnitary = false;
foreach (XmlNode xc in xn.ChildNodes)
{
if (xc.Name == "NoteInstruction" || xc.Name == "CautionInstruction")
{
if (FirstTextIsType(xc, "NOTE") || FirstTextIsType(xc, "CAUTION") || FirstTextIsType(xc, "WARNING"))
{
hasSpecificNotes = true;
}
else
hasFreeForm = true;
}
if (xc.Name == "UnitaryInstruction")
hasUnitary = true;
}
if (hasFreeForm) return "Free Form";
if (hasUnitary) return "Step or Free Form";
return hasSpecificNotes ? "Specific Notes" : "Unknown";
}
private static int countChildNodes(XmlNode xn)
{
if (xn.ChildNodes.Count == 0) return 0;
int retval = 0;
foreach (XmlNode xc in xn.ChildNodes)
{
if (xc.Name.EndsWith("Instruction") || xc.Name =="Contingency") retval++;
retval += countChildNodes(xc);
}
//if (retval > 0 && xn.Name == "NoteInstruction") Console.WriteLine("here");
return retval;
}
private object GetContainsImage(XmlNode xn)
{
if (xn.InnerXml.Contains("&lt;img ")) return "Image";
return "";
}
private object GetContainsTable(XmlNode xn)
{
if (xn.InnerXml.Contains("&lt;table ")) return "Table";
return "";
}
}
public class RegexReplace
{
private string _Pattern;
public string Pattern
{
get { return _Pattern; }
set { _Pattern = value; }
}
private string _Replace;
public string Replace
{
get { return _Replace; }
set { _Replace = value; }
}
private Regex _RegEx;
public Regex RegEx
{
get
{
if (_RegEx == null)
_RegEx = new Regex(Pattern, RegexOptions.Compiled);
return _RegEx;
}
}
public RegexReplace(string pattern, string replace)
{
_Pattern = pattern;
_Replace = replace;
}
public string DoReplace(string str)
{
return RegEx.Replace(str, Replace);
}
}
public class StepLookup : SortedDictionary<string, StepInfo>
{
public StepInfo this[int i]
{
get
{
if (this.ContainsKey(i.ToString())) return base[i.ToString()];
return null;
}
set
{
if (i > this.Count)
throw new Exception("Gap in Stack");
if (value == null)
throw new Exception("Null StepInfo");
//if (value.MyHLS.Ordinal==5 && (value.IsNote || value.IsCaution ))
// Volian.Base.Library.vlnStackTrace.ShowStackLocal(2,5,"=====> Adding Caution or Note on Step 5 {0}",value);
if (this.ContainsKey(i.ToString()))
{
base[i.ToString()] = value;
while (this.ContainsKey((i + 1).ToString()))
base.Remove((base.Count - 1).ToString());
}
else base.Add(i.ToString(), value);
//ListMySteps("Set ", this);
}
}
public void AddOne(StepInfo previousStep)
{
this[this.Count] = previousStep;
}
private static void ListMySteps(string str, StepLookup mySteps)
{
int i = 0;
foreach (string key in mySteps.Keys)
{
if (key != i.ToString())
Console.WriteLine("{0} {1} {2} {3}", str, i, key, mySteps[key].DisplayText);
i++;
}
}
}
public class StepText
{
private string _OriginalText;
public string OriginalText
{
get { return _OriginalText; }
set { _OriginalText = value; }
}
private int _Indent=0;
public int Indent
{
get { return _Indent; }
set { _Indent = value; }
}
private string _Tab=string.Empty;
public string Tab
{
get { return _Tab; }
set { _Tab = value; }
}
private string _Text;
public string Text
{
get { return _Text; }
set { _Text = value; }
}
public StepText()
{
}
private static Regex reg_SplitText = new Regex(@"^(([\t ]*)([a-z1-9A-Z][0-9]*[\.\)](?= |[^S0-9])|\*|)( *))((?![0-9]+\.[0-9]+ )[0-9A-Za-z][^\r\n]*)");
private static Regex reg_SplitText1 = new Regex(@"([\t ]*)([1-9][0-9]*\.[0-9]+(?= *(Manually )?[A-Z]))( *)([^\r\n]+)");
public StepText(string str)
{
OriginalText = str;
//if (str.Contains("\\u9679?"))
// Console.WriteLine("here");
if (str.Trim().StartsWith("T.S."))
{
Tab = "";
Indent = str.Length - str.TrimStart().Length;
Text = str.Substring(Indent);
}
//if (str.Contains("3.1") || str.Contains("1.1") || str.Contains("Line up the valves for manual operation"))
// Console.WriteLine("here");
Match m = reg_SplitText.Match(str.Replace("\\u9679?", "*"));
if (m.Success)
{
Tab = m.Groups[3].Value;
Indent = m.Groups[2].Length + Tab.Length + m.Groups[4].Length;
Text = m.Groups[5].Value;
//if (Text.Contains("OR") || Text.Contains("AND"))
// Console.WriteLine("here");
}
else
{
m = reg_SplitText1.Match(str.Replace("\\u9679?", "*"));
if (m.Success)
{
Tab = m.Groups[1].Value;
Indent = m.Groups[1].Length + Tab.Length + m.Groups[4].Length;
Text = m.Groups[5].Value;
}
else
{
Tab = "";
Indent = str.Length - str.TrimStart().Length;
Text = str.Substring(Indent);
}
}
//if(Regex.IsMatch(Text,@"^[1-9a-zA-Z][.\)]"))
// Console.WriteLine(Text);
}
public override string ToString()
{
return string.Format("{0} {1} {2}",Indent,Tab,Text);
}
}
public class Node
{
private static SortedList<string, Node> _AllNodes = new SortedList<string, Node>();
public static SortedList<string, Node> AllNodes
{
get { return Node._AllNodes; }
set { Node._AllNodes = value; }
}
public static void Reset()
{
_AllNodes = new SortedList<string, Node>();
}
private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
private List<string> _Children = new List<string>();
public List<string> Children
{
get { return _Children; }
set { _Children = value; }
}
private Attributes _Attributes = new Attributes();
public Attributes Attributes
{
get { return _Attributes; }
set { _Attributes = value; }
}
private bool _HasText = false;
public bool HasText
{
get { return _HasText; }
set { _HasText = value; }
}
public Node(XmlElement xe)
{
_AllNodes.Add(xe.Name, this);
}
public static void Add(XmlElement xe)
{
BuildList(xe);
}
private static void BuildList(XmlElement xe)
{
Node nd;
if (!_AllNodes.ContainsKey(xe.Name))
nd = new Node(xe);
else
nd = _AllNodes[xe.Name];
AdjustChildren(nd, xe.ChildNodes);
AdjustAttributes(nd, xe.Attributes);
foreach (XmlNode ch in xe.ChildNodes)
// ChildNodes can contain XmlText as well as XmlElement nodes
if (ch is XmlElement)
BuildList(ch as XmlElement);
}
private static void AdjustAttributes(Node nd, XmlAttributeCollection xmlAttributeCollection)
{
foreach (XmlAttribute xa in xmlAttributeCollection)
AdjustAttribute(nd, xa);
}
private static void AdjustAttribute(Node nd, XmlAttribute xa)
{
nd.Attributes.Add(xa);
}
private static void AdjustChildren(Node nd, XmlNodeList xmlNodeList)
{
foreach (XmlNode ne in xmlNodeList)
{
// XmlNodeList can contain XmlText as well as XmlElement nodes
if (ne is XmlElement)
{
if (!nd.Children.Contains((ne as XmlElement).Name))
nd.Children.Add((ne as XmlElement).Name);
}
else if (ne is XmlText)
nd.HasText = true;
else
Console.WriteLine("Not Expected {0}", ne.GetType().FullName);
}
}
}
public class Attributes : Dictionary<string, Attribute>
{
public void Add(XmlAttribute xa)
{
if (!this.ContainsKey(xa.Name))
base.Add(xa.Name, new Attribute(xa));
else
{
Attribute att = this[xa.Name];
att.Count++;
att.MinValue = string.Compare(att.MinValue, xa.Value) > 0 ? xa.Value : att.MinValue;
att.MaxValue = string.Compare(att.MinValue, xa.Value) < 0 ? xa.Value : att.MaxValue;
}
}
}
public class Attribute
{
public Attribute(XmlAttribute xa)
{
_Name = xa.Name;
_MinValue = xa.Value;
_MaxValue = xa.Value;
_Count = 1;
}
private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
private string _MinValue;
public string MinValue
{
get { return _MinValue; }
set { _MinValue = value; }
}
private string _MaxValue;
public string MaxValue
{
get { return _MaxValue; }
set { _MaxValue = value; }
}
private int _Count = 0;
public int Count
{
get { return _Count; }
set { _Count = value; }
}
}
}