Browse Source

AvalonEdit syntax highlighter: merge changes in V1 XML Schema, use atomic groups for the keyword regex.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3666 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 17 years ago
parent
commit
8281a3af0e
  1. 1
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/ModeV1.xsd
  2. 21
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/XmlHighlightingDefinition.cs

1
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources/ModeV1.xsd

@ -43,6 +43,7 @@ @@ -43,6 +43,7 @@
<xsd:element name="VRuler" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
<xsd:element name="InvalidLines" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
<xsd:element name="CaretMarker" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
<xsd:element name="CaretLine" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
<xsd:element name="LineNumbers" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>

21
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/XmlHighlightingDefinition.cs

@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
@ -174,13 +175,21 @@ namespace ICSharpCode.AvalonEdit.Highlighting.Xshd @@ -174,13 +175,21 @@ namespace ICSharpCode.AvalonEdit.Highlighting.Xshd
{
if (keywords.Words.Count == 0)
return Error(keywords, "Keyword group must not be empty.");
StringBuilder keyWordRegex = new StringBuilder(@"\b(");
for (int i = 0; i < keywords.Words.Count; i++) {
if (i > 0)
keyWordRegex.Append('|');
if (string.IsNullOrEmpty(keywords.Words[i]))
foreach (string keyword in keywords.Words) {
if (string.IsNullOrEmpty(keyword))
throw Error(keywords, "Cannot use empty string as keyword");
keyWordRegex.Append(Regex.Escape(keywords.Words[i]));
}
StringBuilder keyWordRegex = new StringBuilder(@"\b(?>");
// (?> = atomic group
// atomic groups increase matching performance, but we
// must ensure that the keywords are sorted correctly.
// "\b(?>in|int)\b" does not match "int" because the atomic group captures "in".
// To solve this, we are sorting the keywords by descending length.
int i = 0;
foreach (string keyword in keywords.Words.OrderByDescending(w=>w.Length)) {
if (i++ > 0)
keyWordRegex.Append('|');
keyWordRegex.Append(Regex.Escape(keyword));
}
keyWordRegex.Append(@")\b");
return new HighlightingRule {

Loading…
Cancel
Save