550 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			550 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.ComponentModel;
 | |
| using System.Data;
 | |
| using System.Drawing;
 | |
| using System.Linq;
 | |
| using System.Text;
 | |
| using System.Threading.Tasks;
 | |
| using System.Windows.Forms;
 | |
| using System.IO;
 | |
| using System.Xml;
 | |
| using System.Text.RegularExpressions;
 | |
| using VEPROMS.CSLA.Library;
 | |
| using log4net;
 | |
| using Volian.Controls.Library;
 | |
| using C1.Win.C1FlexGrid;
 | |
| using System.Data.SqlClient;
 | |
| 
 | |
| 
 | |
| namespace ConvertLocalAlarms
 | |
| {
 | |
| 	public partial class frmConvertLocalAlarms : Form
 | |
| 	{
 | |
| 		string lastLine = "";
 | |
| 		//private void SaveProcedure(string text, string procNumber, string procTitle, int serialNo)
 | |
| 		private void SaveProcedure(string text, string procNumber, string procTitle, DocVersionInfo dvi)
 | |
| 		{
 | |
| 			Console.WriteLine("===> ARP: {0}, AppContext: {1}", dvi.MyFolder.Name, procNumber);
 | |
| 			//  Add Procedure Number and Title
 | |
| 			ItemInfo prev = null;
 | |
| 			//if (serialNo == 999999)
 | |
| 			prev = dvi.MyItem == null ? null : dvi.MyItem.LastSibling;
 | |
| 			//else
 | |
| 			//{
 | |
| 			//	prev = FindPrevious(dicSerialNo, serialNo);
 | |
| 			//}
 | |
| 			using (Procedure prc = Procedure.MakeProcedure(dvi, prev, procNumber, procTitle, 0))
 | |
| 			{
 | |
| 				ProcedureInfo prci = ProcedureInfo.Get(prc.ItemID);
 | |
| 				// dicSerialNo.Add(serialNo, prci);
 | |
| 				// Console.WriteLine("{0},{1}", serialNo, prci.ShortPath);
 | |
| 				// Add Section
 | |
| 				using (Section sec = Section.MakeSection(prci, null, null, "Procedure Content", 10000))
 | |
| 				{
 | |
| 					sec.SectionConfig.Section_ColumnMode = SectionConfig.SectionColumnMode.One;
 | |
| 					sec.SectionConfig.Section_Pagination = SectionConfig.SectionPagination.Separate;
 | |
| 					sec.Save();
 | |
| 					SectionInfo seci = SectionInfo.Get(sec.ItemID);
 | |
| 					// TODO: Add High Level Steps
 | |
| 					// TODO: Add Substeps
 | |
| 					MemoryStream ms = GetMemoryStream(text);
 | |
| 					Queue<string> qRead = new Queue<string>();
 | |
| 					using (StreamReader sr = new StreamReader(ms))
 | |
| 						fillQueue(qRead, sr);
 | |
| 					Dictionary<int, ItemInfo> lookup = new Dictionary<int, ItemInfo>();
 | |
| 					lookup.Add(0, prci);
 | |
| 					lookup.Add(1, seci);
 | |
| 					int level = 2;
 | |
| 					int type = 20001;
 | |
| 					int lastLevel = 2;
 | |
| 					int lastType = 0;
 | |
| 					int lastIndent = 0;
 | |
| 					int extra = 0;
 | |
| 					string lastTab = "";
 | |
| 					int? DeQueueType = null;
 | |
| 					E_FromType myFromType = E_FromType.Step;
 | |
| 					Queue<string> enQueue = null;
 | |
| 					Queue<string> deQueue = null;
 | |
| 					int deQueueLevel = 0;
 | |
| 					int deQueueLevelLast = 0;
 | |
| 					bool wasFromQueue;
 | |
| 					bool firstQueue = false;
 | |
| 					ItemInfo deQueueItem = null;
 | |
| 					bool saveDeQueueInfo = false;
 | |
| 					bool isTable = false;
 | |
| 					bool lastWasTable = false;
 | |
| 					string tableText = null;
 | |
| 					string tab = "";
 | |
| 					bool strangeBullet = false;
 | |
| 					bool lastNoteHadBullet = false;
 | |
| 					while (qRead.Count > 0 || deQueue != null)
 | |
| 					{
 | |
| 						string lineText;
 | |
| 						tableText = null;
 | |
| 						if (deQueue != null)
 | |
| 						{
 | |
| 							wasFromQueue = true;
 | |
| 							extra = 1;
 | |
| 							lineText = deQueue.Dequeue();
 | |
| 							if (deQueue.Count == 0)
 | |
| 								deQueue = null;
 | |
| 							if (lineText=="<NOTE>")
 | |
| 							{
 | |
| 								DeQueueType = 20007;
 | |
| 							}
 | |
| 							if (lineText=="<CAUTION>")
 | |
| 							{
 | |
| 								DeQueueType = 20006;
 | |
| 							}
 | |
| 							if (lineText=="<WARNING>")
 | |
| 							{
 | |
| 								DeQueueType = 20020;
 | |
| 							}
 | |
| 							if (deQueue != null)
 | |
| 							{
 | |
| 								if (deQueue.Count > 0)
 | |
| 									lineText = deQueue.Dequeue();
 | |
| 								if (deQueue.Count == 0)
 | |
| 									deQueue = null;
 | |
| 							}
 | |
| 							if (lastNoteHadBullet && lineText.Contains("\u2022"))
 | |
| 								DeQueueType = lastType;
 | |
| 						}
 | |
| 						else
 | |
| 						{
 | |
| 							wasFromQueue = false;
 | |
| 							DeQueueType = null;
 | |
| 							extra = 0;
 | |
| 							string findend = "";
 | |
| 							while (Regex.IsMatch(qRead.Peek(), "<(NOTE|CAUTION|WARNING)>(.*)"))
 | |
| 							{
 | |
| 								if (enQueue == null) enQueue = new Queue<string>();
 | |
| 								lineText = qRead.Dequeue();
 | |
| 								string sType = Regex.Replace(lineText, "^<(NOTE|CAUTION|WARNING)>(.*)$", "$1");
 | |
| 								lineText = Regex.Replace(lineText, "^<(NOTE|CAUTION|WARNING)>(.*)$", "$2");
 | |
| 								findend = string.Format("</{0}>", sType);
 | |
| 								enQueue.Enqueue(string.Format("<{0}>", sType));
 | |
| 								while (!lineText.Contains(findend))
 | |
| 								{
 | |
| 									enQueue.Enqueue(lineText);//.Replace("\u2022","").Trim());
 | |
| 									lineText = qRead.Dequeue().Trim();
 | |
| 								}
 | |
| 								lineText = lineText.Replace(findend, "");
 | |
| 								enQueue.Enqueue(lineText); //.Replace("\u2022", "").Trim());
 | |
| 							}
 | |
| 							lineText = qRead.Dequeue().TrimEnd(" ".ToCharArray());
 | |
| 							//string append = qRead.Peek();
 | |
| 							//lineText = qRead.Dequeue().Trim();
 | |
| 							if (lineText == ">") lineText = lineText.Replace(">", "");
 | |
| 							else lineText = lineText.Replace("<", "<").Replace(">", ">");
 | |
| 							//}
 | |
| 							HasSpecialCharacters(lineText);
 | |
| 							if (lineText.StartsWith("<table>"))
 | |
| 							{
 | |
| 								while (!lineText.Contains("</table>"))
 | |
| 								{
 | |
| 									lineText += " " + qRead.Dequeue();
 | |
| 									lineText = Regex.Replace(lineText, "</table>.*", "</table>");
 | |
| 								}
 | |
| 								XmlDocument xd = new XmlDocument();
 | |
| 								xd.LoadXml(lineText);
 | |
| 								LoadTable2(xd.DocumentElement, null, 0);
 | |
| 								isTable = true;
 | |
| 								if (!lastWasTable) level = lastLevel + 1;
 | |
| 								else level = lastLevel;
 | |
| 								type = 20008;
 | |
| 								tableText = GetTableText();
 | |
| 								//StringBuilder  sbxml= new StringBuilder();
 | |
| 								//using(StringWriter sw = new StringWriter(sbxml))
 | |
| 								//	_MyFlexGrid.WriteXml(sw);
 | |
| 								//using(StringReader sr= new StringReader(sbxml.ToString()))
 | |
| 								//	_MyFlexGrid.ReadXml(sr);
 | |
| 								//Application.DoEvents();
 | |
| 							}
 | |
| 							else lineText = Regex.Replace(lineText, "<[^<>]+>", "");
 | |
| 						}
 | |
| 						if (lineText.Replace("\t", "").Replace(" ", "") != "")
 | |
| 							lastLine = lineText;
 | |
| 						Match m = Regex.Match(lineText.Replace('\xFFFD', '\x2022'), @"^(\t*)([1-9][0-9]*\.0|[1-9][0-9]*\.[1-9][0-9]*|[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*|[A-Z]\.|\u2022|)([\t ]+)([^\u2022]*)$", RegexOptions.Multiline);
 | |
| 						if (m.Groups[4].Value != "")
 | |
| 						{
 | |
| 							tab = m.Groups[2].Value;
 | |
| 							int indent = m.Groups[1].Value.Length;
 | |
| 							if (isTable)
 | |
| 							{
 | |
| 								// do nothing
 | |
| 								if (lastWasTable)
 | |
| 									level = lastLevel;
 | |
| 								else
 | |
| 									level = 1 + lastLevel;
 | |
| 								type = 20008;
 | |
| 								myFromType = E_FromType.Table;
 | |
| 							}
 | |
| 							else if (indent == 0 && tab.EndsWith(".0")) // High Level Step
 | |
| 							{
 | |
| 								level = 2;
 | |
| 								type = 20002;
 | |
| 							}
 | |
| 							else if (Regex.IsMatch(tab, "[1-9][0-9]*\\.[1-9][0-9]*\\.[1-9][0-9]*")) // Sub-Substep
 | |
| 							{
 | |
| 								level = 4;
 | |
| 								type = 20001;
 | |
| 							}
 | |
| 							else if (Regex.IsMatch(tab, "[1-9][0-9]*\\.[1-9][0-9]*")) // Substep
 | |
| 							{
 | |
| 								level = 3;
 | |
| 								type = 20001;
 | |
| 							}
 | |
| 							else if (Regex.IsMatch(tab, "[A-Z]\\.")) // Sub-Substep
 | |
| 							{
 | |
| 								level = 5;
 | |
| 								type = 20001;
 | |
| 							}
 | |
| 							else if (tab == "") // Paragraph
 | |
| 							{
 | |
| 								//Console.WriteLine("Type = 20024, deQueueuType= {0} Level = {1}", DeQueueType, level);
 | |
| 								level = lastLevel + 1;
 | |
| 								type = 20024;
 | |
| 							}
 | |
| 							else if (tab == "\u2022")//bullet
 | |
| 							{
 | |
| 								if (firstQueue)
 | |
| 									level = lastLevel + 1;
 | |
| 								else if (lastTab == "\u2022")
 | |
| 									level = lastLevel;
 | |
| 								else
 | |
| 									if (lastType == 20007 && lastTab == "")
 | |
| 										level = lastLevel + 1;
 | |
| 									else
 | |
| 									{
 | |
| 										level = indent + 3;
 | |
| 										strangeBullet = true;
 | |
| 									}
 | |
| 								type = 20004;
 | |
| 								if (Regex.IsMatch(m.Groups[4].Value, "^[0-9]"))
 | |
| 									type = 20011;
 | |
| 							}
 | |
| 							else if (tab == "\u25CB")//bullet
 | |
| 							{
 | |
| 								level = indent + 4;
 | |
| 								type = 20004;
 | |
| 								if (Regex.IsMatch(m.Groups[4].Value, "^[0-9]"))
 | |
| 									type = 20011;
 | |
| 							}
 | |
| 							//while (level < lastLevel)
 | |
| 							//	lookup.Remove(lastLevel--);
 | |
| 							if (firstQueue && deQueueLevelLast > 0) level = deQueueLevelLast + 1;
 | |
| 							while (level < lookup.Count - 1)
 | |
| 								lookup.Remove(lookup.Count - 1);
 | |
| 							lastTab = tab;
 | |
| 							lastLevel = level;
 | |
| 							//lastIndent = indent;
 | |
| 							lastWasTable = isTable;
 | |
| 							deQueueLevelLast = deQueueLevel;
 | |
| 						}
 | |
| 						if (deQueue == null && enQueue != null)
 | |
| 						{
 | |
| 							deQueue = enQueue;
 | |
| 							saveDeQueueInfo = true;
 | |
| 							enQueue = null;
 | |
| 						}
 | |
| 						int newType = DeQueueType ?? (isTable ? 20008 : type);
 | |
| 						if (DeQueueType != null)
 | |
| 						{
 | |
| 							myFromType = E_FromType.Note;
 | |
| 							level = 3;
 | |
| 							if(deQueue!=null)
 | |
| 								Console.WriteLine("Multiple NoteLines");
 | |
| 							if (tab == "\u2022")
 | |
| 								lastNoteHadBullet = true;
 | |
| 						}
 | |
| 						lastType = newType;
 | |
| 						if (enQueue == null)
 | |
| 						{
 | |
| 							if (lookup.Count < level)
 | |
| 							{
 | |
| 								using (Step stp = (lookup[lookup.Count - 1] as StepInfo).Get())
 | |
| 								{
 | |
| 									Annotation.MakeAnnotation(stp, AnnotationType.GetByNameOrCreate("Conversion Error"), null, GetAnnotationText2(lineText), null);
 | |
| 								}
 | |
| 							}
 | |
| 							else if (lookup.Count == level)
 | |
| 							{  // Make new Step Type Child
 | |
| 								using (Step stp = Step.MakeStep(lookup[level - 1], null, null, tableText ?? m.Groups[4].Value, newType, myFromType))
 | |
| 								{
 | |
| 									if (strangeBullet)
 | |
| 										Annotation.MakeAnnotation(stp, AnnotationType.GetByNameOrCreate("Conversion Error"), null, "Strange Bullet", null);
 | |
| 									ItemInfo myItem = StepInfo.Get(stp.ItemID);
 | |
| 									if (isTable)
 | |
| 									{
 | |
| 										Grid.MakeGrid(stp.MyContent, _MyFlexGrid.GetXMLData(), "");
 | |
| 										String footnote = GetFootNote(ms, qRead);
 | |
| 										if (footnote.Length > 0) // Make Table FootNote
 | |
| 											Step.MakeStep(myItem, null, null, footnote, 20024, E_FromType.Step);
 | |
| 									}
 | |
| 									isTable = false;
 | |
| 									lookup.Add(level, myItem);
 | |
| 									//Console.WriteLine("+++B tab = {0}, Lookup.Count = {1}, Level = {2}",tab, lookup.Count, level);
 | |
| 									//Console.WriteLine("+++A tab = {0}, Lookup.Count = {1}, Level = {2}",tab, lookup.Count, level);
 | |
| 									if (saveDeQueueInfo)
 | |
| 									{
 | |
| 										deQueueLevel = level;
 | |
| 										deQueueItem = lookup[level];
 | |
| 										saveDeQueueInfo = false;
 | |
| 									}
 | |
| 									if (firstQueue) firstQueue = false;
 | |
| 
 | |
| 								}
 | |
| 							}
 | |
| 							else
 | |
| 							{ // MakeConfig Next Child
 | |
| 								int previousType = ((int)lookup[level].MyContent.Type);
 | |
| 								if (firstQueue && DeQueueType != null)
 | |
| 								{
 | |
| 									previousType = (int)DeQueueType;
 | |
| 									level = deQueueLevel + 1;
 | |
| 								}
 | |
| 								using (Step stp = Step.MakeStep(lookup[level - 1], lookup[level], null, tableText ?? m.Groups[4].Value, previousType, myFromType))
 | |
| 								{
 | |
| 									Annotation.MakeAnnotation(stp, AnnotationType.GetByNameOrCreate("Conversion Error"), null, string.Format("Type Change {0} to {1}", newType, ((int)lookup[level].MyContent.Type)), null);
 | |
| 									if (strangeBullet)
 | |
| 										Annotation.MakeAnnotation(stp, AnnotationType.GetByNameOrCreate("Conversion Error"), null, "Strange Bullet", null);
 | |
| 									strangeBullet = false;
 | |
| 									ItemInfo myItem = StepInfo.Get(stp.ItemID);
 | |
| 									if (isTable)
 | |
| 									{
 | |
| 										Grid.MakeGrid(stp.MyContent, _MyFlexGrid.GetXMLData(), "");
 | |
| 										String footnote = GetFootNote(ms, qRead);
 | |
| 										if (footnote.Length > 0)// Make Table Footnote
 | |
| 											Step.MakeStep(myItem, null, null, footnote, 20024, E_FromType.Step);
 | |
| 									}
 | |
| 									isTable = false;
 | |
| 									//Console.WriteLine(">>> tab = {0}, Lookup.Count = {1}, Level = {2}", tab, lookup.Count, level);
 | |
| 									lookup[level] = myItem;
 | |
| 									if (saveDeQueueInfo)
 | |
| 									{
 | |
| 										deQueueLevel = level;
 | |
| 										deQueueItem = lookup[level];
 | |
| 										saveDeQueueInfo = false;
 | |
| 									}
 | |
| 									if (firstQueue) firstQueue = false;
 | |
| 								}
 | |
| 							}
 | |
| 							myFromType = E_FromType.Step;
 | |
| 							if (deQueue == null && deQueueItem != null)
 | |
| 							{
 | |
| 								level = deQueueLevel;
 | |
| 								while (level < lookup.Count)
 | |
| 									lookup.Remove(lookup.Count - 1);
 | |
| 								lookup[level] = deQueueItem;
 | |
| 								deQueueItem = null;
 | |
| 								DeQueueType = null;
 | |
| 							}
 | |
| 						}
 | |
| 						//else
 | |
| 						//{
 | |
| 						//	enQueue.Enqueue(lineText);
 | |
| 						//}
 | |
| 						DeQueueType = null;
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			if (runOne) MessageBox.Show("Done", "Converted");
 | |
| 		}
 | |
| 
 | |
| 		private ItemInfo FindLocation(ItemInfo myItem, string procNumber)
 | |
| 		{
 | |
| 			while (myItem != null)
 | |
| 			{
 | |
| 				if (myItem.DisplayNumber.CompareTo(procNumber) >= 0)
 | |
| 					return myItem.MyPrevious;
 | |
| 				myItem = myItem.NextItem;
 | |
| 			}
 | |
| 			return myItem;
 | |
| 		}
 | |
| 		private string MakeConfig(string fmt, params string [] args)
 | |
| 		{
 | |
| 			string [] atts = new string[args.Length];
 | |
| 			args.CopyTo(atts,0);
 | |
| 			for(int i=0; i<atts.Length; i++)
 | |
| 				atts[i] = atts[i].Replace("&","&").Replace("<","<").Replace(">",">");
 | |
| 			return string.Format(fmt, atts);
 | |
| 		}
 | |
| 		private void fillQueue(Queue<string> qread, StreamReader sr)
 | |
| 		{
 | |
| 			while(sr.Peek() > 0)
 | |
| 				qread.Enqueue(sr.ReadLine());
 | |
| 								}
 | |
| 		//public string NextLine
 | |
| 		//{
 | |
| 		//	get { return _NextLine; }
 | |
| 		//	set { _NextLine = value; }
 | |
| 		//}
 | |
| 		private string GetFootNote(MemoryStream ms, Queue<string> qRead)
 | |
| 		{
 | |
| 			string sep = "";
 | |
| 			StringBuilder sb = new StringBuilder();
 | |
| 			while(qRead.Count > 0)
 | |
| 			{
 | |
| 				// Read a line at a time
 | |
| 				string str = qRead.Peek();
 | |
| 				str = Regex.Replace(str, "<[^<>]+>", "").Trim(" \t".ToCharArray()).Replace(">", "");
 | |
| 				str = str.Replace('\x25CB', 'o').Replace("\u2022", "\\u9679?");
 | |
| 				//str = str.Replace('\x25CB', 'o').Replace("\u2022", "\\u7?");
 | |
| 				// If Text begins with number then
 | |
| 				if(Regex.IsMatch(str,"[0-9].*") || str.StartsWith("<table>"))
 | |
| 					return sb.ToString();
 | |
| 				//append string
 | |
| 				if (sb.ToString() != "" || str != "")
 | |
| 				{
 | |
| 					sep = "\r\n";
 | |
| 				}
 | |
| 				sb.Append(sep + qRead.Dequeue());
 | |
| 							}
 | |
| 			return sb.ToString();
 | |
| 						}
 | |
| 		private void ProcessChars(string str)
 | |
| 		{
 | |
| 			foreach (char c in str)
 | |
| 			{
 | |
| 				if (c < 0x20 || c > 0x7F)
 | |
| 					Console.WriteLine("{0:X4}", (int)c);
 | |
| 					}
 | |
| 				}
 | |
| 		public void ResetSpecial()
 | |
| 		{
 | |
| 			FoundSpecial = new List<char>();
 | |
| 		}
 | |
| 		List<char> FoundSpecial = new List<char>();
 | |
| 		private void HasSpecialCharacters(string lineText)
 | |
| 		{
 | |
| 			StringBuilder sb = new StringBuilder();
 | |
| 			foreach (char c in lineText)
 | |
| 			{
 | |
| 				if ((c < 0x20 || c > 0x7F) && !FoundSpecial.Contains(c))
 | |
| 				{
 | |
| 					Console.WriteLine("*** Special Character {0:X4}", (int)c);
 | |
| 					FoundSpecial.Add(c);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		//private static string GetAnnotationText(string fileName)
 | |
| 		//{
 | |
| 		//	return string.Format("FileName:{0}\r\nShortName:{1}\r\nFullName:{2}\r\nSystem:{3}\r\nPNSNo:{4}\r\nRelatedFunction:{5}" , 
 | |
| 		//		fileName,ShortName,FullName,ApSystem,PNSNo ,RelatedFunction);
 | |
| 		//}
 | |
| 		private static string GetAnnotationText2(string lineText)
 | |
| 		{
 | |
| 			//return string.Format("LineText:{0}\r\nShortName:{1}\r\nFullName:{2}\r\nSystem:{3}\r\nPNSNo:{4}\r\nRelatedFunction:{5}",
 | |
| 			//	lineText, ShortName, FullName, apSystem, PNSNo, RelatedFunction);
 | |
| 			return string.Format("LineText:{0}",
 | |
| 				lineText);
 | |
| 		}
 | |
| 		//private void fillQueue(Queue<string> qread, StreamReader sr)
 | |
| 		//{
 | |
| 		//	while (sr.Peek() > 0)
 | |
| 		//		qread.Enqueue(sr.ReadLine());
 | |
| 		//}
 | |
| 		//private string _NextLine;
 | |
| 
 | |
| 		//public string NextLine
 | |
| 		//{
 | |
| 		//	get { return _NextLine; }
 | |
| 		//	set { _NextLine = value; }
 | |
| 		//}
 | |
| 		//private string GetFootNote(MemoryStream ms, Queue<string> qRead)
 | |
| 		//{
 | |
| 		//	string sep = "";
 | |
| 		//	StringBuilder sb = new StringBuilder();
 | |
| 		//	while (qRead.Count > 0)
 | |
| 		//	{
 | |
| 		//		// Read a line at a time
 | |
| 		//		string str = qRead.Peek();
 | |
| 		//		str = Regex.Replace(str, "<[^<>]+>", "").Trim(" \t".ToCharArray()).Replace(">", "");
 | |
| 		//		str = str.Replace('\x25CB', 'o').Replace("\u2022", "\\u9679?");
 | |
| 		//		//str = str.Replace('\x25CB', 'o').Replace("\u2022", "\\u7?");
 | |
| 		//		// If Text begins with number then
 | |
| 		//		if (Regex.IsMatch(str, "[0-9].*") || str.StartsWith("<table>"))
 | |
| 		//			return sb.ToString();
 | |
| 		//		//append string
 | |
| 		//		if (sb.ToString() != "" || str != "")
 | |
| 		//		{
 | |
| 		//			sep = "\r\n";
 | |
| 		//		}
 | |
| 		//		sb.Append(sep + qRead.Dequeue());
 | |
| 		//	}
 | |
| 		//	return sb.ToString();
 | |
| 		//}
 | |
| 
 | |
| 		//private void ProcessChars(string str)
 | |
| 		//{
 | |
| 		//	foreach (char c in str)
 | |
| 		//	{
 | |
| 		//		if (c < 0x20 || c > 0x7F)
 | |
| 		//			Console.WriteLine("{0:X4}", (int)c);
 | |
| 		//	}
 | |
| 		//}
 | |
| 		//public void ResetSpecial()
 | |
| 		//{
 | |
| 		//	FoundSpecial = new List<char>();
 | |
| 		//}
 | |
| 		//List<char> FoundSpecial = new List<char>();
 | |
| 		//private void HasSpecialCharacters(string lineText)
 | |
| 		//{
 | |
| 		//	StringBuilder sb = new StringBuilder();
 | |
| 		//	foreach (char c in lineText)
 | |
| 		//	{
 | |
| 		//		if ((c < 0x20 || c > 0x7F) && !FoundSpecial.Contains(c))
 | |
| 		//		{
 | |
| 		//			Console.WriteLine("*** Special Character {0:X4}", (int)c);
 | |
| 		//			FoundSpecial.Add(c);
 | |
| 		//		}
 | |
| 		//	}
 | |
| 		//}
 | |
| 	}
 | |
| 	public class StepLookup : SortedDictionary<string, StepInfo>
 | |
| 	{
 | |
| 		public StepInfo this[int i]
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				if (this.ContainsKey(i.ToString())) return base[i.ToString()];
 | |
| 				return null;
 | |
| 			}
 | |
| 			set
 | |
| 			{
 | |
| 				if (i > this.Count)
 | |
| 					throw new Exception("Gap in Stack");
 | |
| 				if (value == null)
 | |
| 					throw new Exception("Null StepInfo");
 | |
| 				//if (value.MyHLS.Ordinal==5 && (value.IsNote || value.IsCaution ))
 | |
| 				//	Volian.Base.Library.vlnStackTrace.ShowStackLocal(2,5,"=====> Adding Caution or Note on Step 5 {0}",value);
 | |
| 				if (this.ContainsKey(i.ToString()))
 | |
| 				{
 | |
| 					base[i.ToString()] = value;
 | |
| 					while (this.ContainsKey((i + 1).ToString()))
 | |
| 						base.Remove((base.Count - 1).ToString());
 | |
| 				}
 | |
| 				else base.Add(i.ToString(), value);
 | |
| 				//ListMySteps("Set ", this);
 | |
| 			}
 | |
| 		}
 | |
| 		public void AddOne(StepInfo previousStep)
 | |
| 		{
 | |
| 			this[this.Count] = previousStep;
 | |
| 		}
 | |
| 		private static void ListMySteps(string str, StepLookup mySteps)
 | |
| 		{
 | |
| 			int i = 0;
 | |
| 			foreach (string key in mySteps.Keys)
 | |
| 			{
 | |
| 				if (key != i.ToString())
 | |
| 					Console.WriteLine("{0} {1} {2} {3}", str, i, key, mySteps[key].DisplayText);
 | |
| 				i++;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |