예제 #1
0
 public object VisitSpan(XshdSpan span)
 {
     span.BeginColorReference.AcceptVisitor(this);
     span.SpanColorReference.AcceptVisitor(this);
     span.EndColorReference.AcceptVisitor(this);
     return(span.RuleSetReference.AcceptVisitor(this));
 }
예제 #2
0
        object IXshdVisitor.VisitSpan(XshdSpan span)
        {
            _writer.WriteStartElement("Span", Namespace);
            WriteColorReference(span.SpanColorReference);
            if (span.BeginRegexType == XshdRegexType.Default && span.BeginRegex != null)
            {
                _writer.WriteAttributeString("begin", span.BeginRegex);
            }
            if (span.EndRegexType == XshdRegexType.Default && span.EndRegex != null)
            {
                _writer.WriteAttributeString("end", span.EndRegex);
            }
            WriteRuleSetReference(span.RuleSetReference);
            if (span.Multiline)
            {
                _writer.WriteAttributeString("multiline", "true");
            }

            if (span.BeginRegexType == XshdRegexType.IgnorePatternWhitespace)
            {
                WriteBeginEndElement("Begin", span.BeginRegex, span.BeginColorReference);
            }
            if (span.EndRegexType == XshdRegexType.IgnorePatternWhitespace)
            {
                WriteBeginEndElement("End", span.EndRegex, span.EndColorReference);
            }

            span.RuleSetReference.InlineElement?.AcceptVisitor(this);

            _writer.WriteEndElement();
            return(null);
        }
예제 #3
0
        private static XshdSpan ParseSpan(XmlReader reader)
        {
            var span = new XshdSpan();

            SetPosition(span, reader);
            span.BeginRegex         = reader.GetAttribute("begin");
            span.EndRegex           = reader.GetAttribute("end");
            span.Multiline          = reader.GetBoolAttribute("multiline") ?? false;
            span.SpanColorReference = ParseColorReference(reader);
            span.RuleSetReference   = ParseRuleSetReference(reader);
            if (!reader.IsEmptyElement)
            {
                reader.Read();
                while (reader.NodeType != XmlNodeType.EndElement)
                {
                    Debug.Assert(reader.NodeType == XmlNodeType.Element);
                    switch (reader.Name)
                    {
                    case "Begin":
                        if (span.BeginRegex != null)
                        {
                            throw Error(reader, "Duplicate Begin regex");
                        }
                        span.BeginColorReference = ParseColorReference(reader);
                        span.BeginRegex          = reader.ReadElementContentAsString();
                        span.BeginRegexType      = XshdRegexType.IgnorePatternWhitespace;
                        break;

                    case "End":
                        if (span.EndRegex != null)
                        {
                            throw Error(reader, "Duplicate End regex");
                        }
                        span.EndColorReference = ParseColorReference(reader);
                        span.EndRegex          = reader.ReadElementContentAsString();
                        span.EndRegexType      = XshdRegexType.IgnorePatternWhitespace;
                        break;

                    case "RuleSet":
                        if (span.RuleSetReference.ReferencedElement != null)
                        {
                            throw Error(reader, "Cannot specify both inline RuleSet and RuleSet reference");
                        }
                        span.RuleSetReference = new XshdReference <XshdRuleSet>(ParseRuleSet(reader));
                        reader.Read();
                        break;

                    default:
                        throw new NotSupportedException("Unknown element " + reader.Name);
                    }
                }
            }
            return(span);
        }
예제 #4
0
            public object VisitSpan(XshdSpan span)
            {
                var endRegex = span.EndRegex;

                if (string.IsNullOrEmpty(span.BeginRegex) && string.IsNullOrEmpty(span.EndRegex))
                {
                    throw Error(span, "Span has no start/end regex.");
                }
                if (!span.Multiline)
                {
                    if (endRegex == null)
                    {
                        endRegex = "$";
                    }
                    else if (span.EndRegexType == XshdRegexType.IgnorePatternWhitespace)
                    {
                        endRegex = "($|" + endRegex + "\n)";
                    }
                    else
                    {
                        endRegex = "($|" + endRegex + ")";
                    }
                }
                var wholeSpanColor = GetColor(span, span.SpanColorReference);

                return(new HighlightingSpan
                {
                    StartExpression = CreateRegex(span, span.BeginRegex, span.BeginRegexType),
                    EndExpression = CreateRegex(span, endRegex, span.EndRegexType),
                    RuleSet = GetRuleSet(span, span.RuleSetReference),
                    StartColor = GetColor(span, span.BeginColorReference),
                    SpanColor = wholeSpanColor,
                    EndColor = GetColor(span, span.EndColorReference),
                    SpanColorIncludesStart = true,
                    SpanColorIncludesEnd = true
                });
            }
예제 #5
0
        XshdSpan ImportSpan(XmlElement element)
        {
            XshdSpan span = new XshdSpan();

            if (element.HasAttribute("rule"))
            {
                span.RuleSetReference = new XshdReference <XshdRuleSet>(null, element.GetAttribute("rule"));
            }
            char escapeCharacter = ruleSetEscapeCharacter;

            if (element.HasAttribute("escapecharacter"))
            {
                escapeCharacter = element.GetAttribute("escapecharacter")[0];
            }
            span.Multiline = !(element.GetBoolAttribute("stopateol") ?? false);

            span.SpanColorReference = GetColorReference(element);

            span.BeginRegexType = XshdRegexType.IgnorePatternWhitespace;
            span.BeginRegex     = ImportRegex(element["Begin"].InnerText,
                                              element["Begin"].GetBoolAttribute("singleword") ?? false,
                                              element["Begin"].GetBoolAttribute("startofline"));
            span.BeginColorReference = GetColorReference(element["Begin"]);

            string endElementText = string.Empty;

            if (element["End"] != null)
            {
                span.EndRegexType = XshdRegexType.IgnorePatternWhitespace;
                endElementText    = element["End"].InnerText;
                span.EndRegex     = ImportRegex(endElementText,
                                                element["End"].GetBoolAttribute("singleword") ?? false,
                                                null);
                span.EndColorReference = GetColorReference(element["End"]);
            }

            if (escapeCharacter != '\0')
            {
                XshdRuleSet ruleSet = new XshdRuleSet();
                if (endElementText.Length == 1 && endElementText[0] == escapeCharacter)
                {
                    // ""-style escape
                    ruleSet.Elements.Add(new XshdSpan {
                        BeginRegex = Regex.Escape(endElementText + endElementText),
                        EndRegex   = ""
                    });
                }
                else
                {
                    // \"-style escape
                    ruleSet.Elements.Add(new XshdSpan {
                        BeginRegex = Regex.Escape(escapeCharacter.ToString()),
                        EndRegex   = "."
                    });
                }
                if (span.RuleSetReference.ReferencedElement != null)
                {
                    ruleSet.Elements.Add(new XshdImport {
                        RuleSetReference = span.RuleSetReference
                    });
                }
                span.RuleSetReference = new XshdReference <XshdRuleSet>(ruleSet);
            }
            return(span);
        }