diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs index 8a201fad36..34025e59b9 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs @@ -282,11 +282,14 @@ namespace ICSharpCode.AvalonEdit.Highlighting Debug.Assert(position == firstMatch.Index); if (firstMatch == endSpanMatch) { - PopColor(); // pop SpanColor HighlightingSpan poppedSpan = spanStack.Peek(); + if (!poppedSpan.SpanColorIncludesEnd) + PopColor(); // pop SpanColor PushColor(poppedSpan.EndColor); position = firstMatch.Index + firstMatch.Length; PopColor(); // pop EndColor + if (poppedSpan.SpanColorIncludesEnd) + PopColor(); // pop SpanColor spanStack = spanStack.Pop(); currentRuleSet = this.CurrentRuleSet; //FreeMatchArray(matches); @@ -312,10 +315,13 @@ namespace ICSharpCode.AvalonEdit.Highlighting currentRuleSet = this.CurrentRuleSet; storedMatchArrays.Push(matches); matches = AllocateMatchArray(currentRuleSet.Spans.Count); + if (newSpan.SpanColorIncludesStart) + PushColor(newSpan.SpanColor); PushColor(newSpan.StartColor); position = firstMatch.Index + firstMatch.Length; PopColor(); - PushColor(newSpan.SpanColor); + if (!newSpan.SpanColorIncludesStart) + PushColor(newSpan.SpanColor); } endSpanMatch = null; } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingSpan.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingSpan.cs index 4b2f71322b..b9552e5bbb 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingSpan.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingSpan.cs @@ -43,6 +43,18 @@ namespace ICSharpCode.AvalonEdit.Highlighting /// public HighlightingColor EndColor { get; set; } + /// + /// Gets/Sets whether the span color includes the start. + /// The default is false. + /// + public bool SpanColorIncludesStart { get; set; } + + /// + /// Gets/Sets whether the span color includes the end. + /// The default is false. + /// + public bool SpanColorIncludesEnd { get; set; } + /// public override string ToString() { diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/XmlHighlightingDefinition.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/XmlHighlightingDefinition.cs index a0525cc1e7..d8bae25056 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/XmlHighlightingDefinition.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/XmlHighlightingDefinition.cs @@ -317,22 +317,11 @@ namespace ICSharpCode.AvalonEdit.Highlighting.Xshd StartExpression = CreateRegex(span, span.BeginRegex, span.BeginRegexType), EndExpression = CreateRegex(span, endRegex, span.EndRegexType), RuleSet = GetRuleSet(span, span.RuleSetReference), - StartColor = MergeColor(wholeSpanColor, GetColor(span, span.BeginColorReference)), + StartColor = GetColor(span, span.BeginColorReference), SpanColor = wholeSpanColor, - EndColor = MergeColor(wholeSpanColor, GetColor(span, span.EndColorReference)), - }; - } - - static HighlightingColor MergeColor(HighlightingColor baseColor, HighlightingColor newColor) - { - if (baseColor == null) - return newColor; - if (newColor == null) - return baseColor; - return new HighlightingColor { - Foreground = newColor.Foreground ?? baseColor.Foreground, - FontWeight = newColor.FontWeight ?? baseColor.FontWeight, - FontStyle = newColor.FontStyle ?? baseColor.FontStyle, + EndColor = GetColor(span, span.EndColorReference), + SpanColorIncludesStart = true, + SpanColorIncludesEnd = true }; }