void PushCurWord(IDocument document, ref HighlightColor markNext, ArrayList words) { //Need to look through the next prev logic. if (currentLength > 0) { if (words.Count > 0 && activeRuleSet != null) { TextWord prevWord = null; int pInd = words.Count - 1; while (pInd >= 0) { if (!((TextWord)words[pInd]).IsWhiteSpace) { prevWord = (TextWord)words[pInd]; if (prevWord.HasDefaultColor) { PrevMarker marker = (PrevMarker)activeRuleSet.PrevMarkers[document, currentLine, currentOffset, currentLength]; if (marker != null) { prevWord.HighlightColor = marker.Color; } } break; } pInd--; } } if (inSpan) { HighlightColor c = null; bool hasDefaultColor = true; if (activeSpan.Rule == null) { c = activeSpan.Color; } else { c = GetColor(activeRuleSet, document, currentLine, currentOffset, currentLength); hasDefaultColor = false; } if (c == null) { c = activeSpan.Color; if (c.Color == Color.Transparent) { c = GetEnvironmentColorForName("Default"); } hasDefaultColor = true; } words.Add(new TextWord(document, currentLine, currentOffset, currentLength, markNext != null ? markNext : c, hasDefaultColor)); } else { HighlightColor c = markNext != null ? markNext : GetColor(activeRuleSet, document, currentLine, currentOffset, currentLength); if (c == null) { words.Add(new TextWord(document, currentLine, currentOffset, currentLength, GetEnvironmentColorForName("Default"), true)); } else { words.Add(new TextWord(document, currentLine, currentOffset, currentLength, c, false)); } } if (activeRuleSet != null) { NextMarker nextMarker = (NextMarker)activeRuleSet.NextMarkers[document, currentLine, currentOffset, currentLength]; if (nextMarker != null) { if (nextMarker.MarkMarker && words.Count > 0) { TextWord prevword = ((TextWord)words[words.Count - 1]); prevword.HighlightColor = nextMarker.Color; } markNext = nextMarker.Color; } else { markNext = null; } } currentOffset += currentLength; currentLength = 0; } }
//每个RuleSet节点的样子:<RuleSet ignorecase = "false">......</RuleSet> public HighlightRuleSet(XmlElement el) { if (el.Attributes["name"] != null) { Name = el.Attributes["name"].InnerText; } if (el.Attributes["noescapesequences"] != null) { noEscapeSequences = Boolean.Parse(el.Attributes["noescapesequences"].InnerText); } if (el.Attributes["reference"] != null) { reference = el.Attributes["reference"].InnerText; } if (el.Attributes["ignorecase"] != null) { ignoreCase = Boolean.Parse(el.Attributes["ignorecase"].InnerText); } for (int i = 0; i < Delimiters.Length; ++i) { Delimiters[i] = false; } if (el["Delimiters"] != null) { string delimiterString = el["Delimiters"].InnerText; foreach (char ch in delimiterString) { Delimiters[(int)ch] = true;//将当前字符置为分隔符. } } XmlNodeList nodes = null; //以下是初始化Span. nodes = el.GetElementsByTagName("Span"); foreach (XmlElement el2 in nodes) { Spans.Add(new Span(el2)); } keyWords = new LookupTable(!IgnoreCase); prevMarkers = new LookupTable(!IgnoreCase); nextMarkers = new LookupTable(!IgnoreCase); //以下是初始化KeyWords. nodes = el.GetElementsByTagName("KeyWords"); foreach (XmlElement el2 in nodes) { HighlightColor color = new HighlightColor(el2); XmlNodeList keys = el2.GetElementsByTagName("Key"); foreach (XmlElement node in keys) { keyWords[node.Attributes["word"].InnerText] = color;//为每个关键字都赋予一个HighLightColor对象. } } //每个MarkPrevious节点的样子: //<MarkPrevious bold = "true" italic = "false" color = "MidnightBlue">(</MarkPrevious> nodes = el.GetElementsByTagName("MarkPrevious"); foreach (XmlElement el2 in nodes) { PrevMarker prev = new PrevMarker(el2); prevMarkers[prev.What] = prev; } //每个MarkFollowing节点的样子和MarkFollowing的样子完全一样. nodes = el.GetElementsByTagName("MarkFollowing"); foreach (XmlElement el2 in nodes) { NextMarker next = new NextMarker(el2); nextMarkers[next.What] = next; } }
//每个RuleSet节点的样子:<RuleSet ignorecase = "false">......</RuleSet> public HighlightRuleSet(XmlElement el) { if (el.Attributes["name"] != null) { Name = el.Attributes["name"].InnerText; } if (el.Attributes["noescapesequences"] != null) { noEscapeSequences = Boolean.Parse(el.Attributes["noescapesequences"].InnerText); } if (el.Attributes["reference"] != null) { reference = el.Attributes["reference"].InnerText; } if (el.Attributes["ignorecase"] != null) { ignoreCase = Boolean.Parse(el.Attributes["ignorecase"].InnerText); } for (int i = 0; i < Delimiters.Length; ++i) { Delimiters[i] = false; } if (el["Delimiters"] != null) { string delimiterString = el["Delimiters"].InnerText; foreach (char ch in delimiterString) { Delimiters[(int)ch] = true; //将当前字符置为分隔符. } } XmlNodeList nodes = null; //以下是初始化Span. nodes = el.GetElementsByTagName("Span"); foreach (XmlElement el2 in nodes) { Spans.Add(new Span(el2)); } keyWords = new LookupTable(!IgnoreCase); prevMarkers = new LookupTable(!IgnoreCase); nextMarkers = new LookupTable(!IgnoreCase); //以下是初始化KeyWords. nodes = el.GetElementsByTagName("KeyWords"); foreach (XmlElement el2 in nodes) { HighlightColor color = new HighlightColor(el2); XmlNodeList keys = el2.GetElementsByTagName("Key"); foreach (XmlElement node in keys) { keyWords[node.Attributes["word"].InnerText] = color; //为每个关键字都赋予一个HighLightColor对象. } } //每个MarkPrevious节点的样子: //<MarkPrevious bold = "true" italic = "false" color = "MidnightBlue">(</MarkPrevious> nodes = el.GetElementsByTagName("MarkPrevious"); foreach (XmlElement el2 in nodes) { PrevMarker prev = new PrevMarker(el2); prevMarkers[prev.What] = prev; } //每个MarkFollowing节点的样子和MarkFollowing的样子完全一样. nodes = el.GetElementsByTagName("MarkFollowing"); foreach (XmlElement el2 in nodes) { NextMarker next = new NextMarker(el2); nextMarkers[next.What] = next; } }