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 AllNodeTypes = new SortedList(); 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 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("
", "
\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) [^>]*?>([^<>]*)", RegexOptions.Compiled | RegexOptions.Singleline); private static Regex RegFixHTML = new Regex(".*<(p|li).*?>(.*).*", RegexOptions.Compiled | RegexOptions.Singleline); private static Regex RegFixHTMLbody = new Regex(".*(.*).*", RegexOptions.Compiled | RegexOptions.Singleline); private static Regex RegFindImage = new Regex(".*.*", 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("", RegexOptions.Compiled | RegexOptions.Singleline); private static Regex RegStripSpan2 = new Regex("", 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("]*>", RegexOptions.Compiled ), new Regex("]*>[^<]*", RegexOptions.Compiled ), new Regex("]*>", RegexOptions.Compiled ), //new Regex("]*>", RegexOptions.Compiled ), new Regex("]*>", RegexOptions.Compiled ), new Regex("

", RegexOptions.Compiled ), new Regex("]*>", RegexOptions.Compiled), //new Regex("]*>NOTE

", RegexOptions.Compiled), //new Regex("]*>CAUTION

", RegexOptions.Compiled), new Regex("]*>

", RegexOptions.Compiled), }; private static Regex regexFixPFrontPadding = new Regex("]*> +", RegexOptions.Compiled); private static Regex regexFixPRearPadding = new Regex(" +

", RegexOptions.Compiled); private static Regex regexFixLiFrontPadding = new Regex("]*> +", RegexOptions.Compiled); private static Regex regexFixLiRearPadding = new Regex(" +", RegexOptions.Compiled); private static Regex removeExtraReturns = new Regex("\r?\n(\r?\n)+", RegexOptions.Compiled); private static Regex RegFixMultipleULs = new Regex("[\r\n]*]+>", RegexOptions.Compiled | RegexOptions.Multiline); private static Regex RegFixMultipleOLs = new Regex("[\r\n]*]+>", 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(@"

[\r\n]*

THEN"," THEN")// Break - THEN }; private static string cleanupHTML(string html, int level) { //Console.WriteLine(html); //Console.WriteLine("END {0}",level); html = html.Replace("
", "\\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, "

"); //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, "

"); html = regexFixLiFrontPadding.Replace(html, "
  • "); html = regexFixLiRearPadding.Replace(html, "
  • "); 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(); } 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 = "
    "; 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 = "
    "; } 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 xl1 = new List(); 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 _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 _LastStepText = new Dictionary(); 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(""; } //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("

    ", "").Replace("

    ", "").Replace("
  • ", "\u25CF ").Replace("
  • ", "\r\n").Replace("", "") .Replace("", "").Replace(@"\line", "").Replace("","").TrimStart(" \r\n\t".ToCharArray()) .Replace(@"\u8209?", "\u2011").Replace(@"\u9679?", "\u25CF").Replace("
  • ", "\u25CF ").Replace("
  • ", "\u25CF "); str = Regex.Replace(str, "]+>", ""); str = Regex.Replace(str, "]+>", ""); 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 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(""); int startLocation = xmlbase.IndexOf(">", xmlbase.IndexOf(" 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 removeList = new List(); 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 _MyContingencies = new Dictionary(); public static Dictionary 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 (""); int i = 0; foreach (XmlNode xnog in xl) { sb.AppendFormat("", ++i); sb.AppendFormat("{0}", GetAttribute(xnog, "diagramNumber")); sb.AppendFormat("{0}", GetAttribute(xnog, "title")); sb.AppendFormat(""); } sb.AppendLine(""); 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 ="
    "; } 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 = "

    " + xml + "

    "; } XmlDocument xd = new XmlDocument(); xd.LoadXml(xml); //xml = xml.Replace("", ""); //vlnhtml myHTML = HtmlSerializer.StringDeserialize(xml); Node.Add(xd.DocumentElement); } } private Dictionary _DicHTMLStruct; public Dictionary DicHTMLStruct { get { return _DicHTMLStruct; } set { _DicHTMLStruct = value; } } private void btnHTML2_Click(object sender, EventArgs e) { DicHTMLStruct = new Dictionary(); 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(); } /// /// Show Count for each structure /// 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 = "

    " + xml + "

    "; } 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 = "

    " + part2 + "

    "; } 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 _VerbList; private void btnVerbs_Click(object sender, EventArgs e) { _VerbList = new Dictionary(); 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("([A-Z]+)", 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 _DicFigureUsage; private void btnFigures_Click(object sender, EventArgs e) { _DicFigureUsage = new SortedDictionary(); 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("", 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(" siblings = new SortedDictionary(); 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("]+>[\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("<img ")) return "Image"; return ""; } private object GetContainsTable(XmlNode xn) { if (xn.InnerXml.Contains("<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 { 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 _AllNodes = new SortedList(); public static SortedList AllNodes { get { return Node._AllNodes; } set { Node._AllNodes = value; } } public static void Reset() { _AllNodes = new SortedList(); } private string _Name; public string Name { get { return _Name; } set { _Name = value; } } private List _Children = new List(); public List 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 { 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; } } } }