1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
8
namespace ICSharpCode.AvalonEdit.Highlighting.Xshd
11
/// Xshd visitor implementation that saves an .xshd file as XML.
13
public sealed class SaveXshdVisitor : IXshdVisitor
16
/// XML namespace for XSHD.
18
public const string Namespace = V2Loader.Namespace;
23
/// Creates a new SaveXshdVisitor instance.
25
public SaveXshdVisitor(XmlWriter writer)
28
throw new ArgumentNullException("writer");
33
/// Writes the specified syntax definition.
35
public void WriteDefinition(XshdSyntaxDefinition definition)
37
if (definition == null)
38
throw new ArgumentNullException("definition");
39
writer.WriteStartElement("SyntaxDefinition", Namespace);
40
if (definition.Name != null)
41
writer.WriteAttributeString("name", definition.Name);
42
if (definition.Extensions != null)
43
writer.WriteAttributeString("extensions", string.Join(";", definition.Extensions.ToArray()));
45
definition.AcceptElements(this);
47
writer.WriteEndElement();
50
object IXshdVisitor.VisitRuleSet(XshdRuleSet ruleSet)
52
writer.WriteStartElement("RuleSet", Namespace);
54
if (ruleSet.Name != null)
55
writer.WriteAttributeString("name", ruleSet.Name);
56
WriteBoolAttribute("ignoreCase", ruleSet.IgnoreCase);
58
ruleSet.AcceptElements(this);
60
writer.WriteEndElement();
64
void WriteBoolAttribute(string attributeName, bool? value)
67
writer.WriteAttributeString(attributeName, value.Value ? "true" : "false");
71
void WriteRuleSetReference(XshdReference<XshdRuleSet> ruleSetReference)
73
if (ruleSetReference.ReferencedElement != null) {
74
if (ruleSetReference.ReferencedDefinition != null)
75
writer.WriteAttributeString("ruleSet", ruleSetReference.ReferencedDefinition + "/" + ruleSetReference.ReferencedElement);
77
writer.WriteAttributeString("ruleSet", ruleSetReference.ReferencedElement);
81
void WriteColorReference(XshdReference<XshdColor> color)
83
if (color.InlineElement != null) {
84
WriteColorAttributes(color.InlineElement);
85
} else if (color.ReferencedElement != null) {
86
if (color.ReferencedDefinition != null)
87
writer.WriteAttributeString("color", color.ReferencedDefinition + "/" + color.ReferencedElement);
89
writer.WriteAttributeString("color", color.ReferencedElement);
93
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase", Justification = "The file format requires lowercase, and all possible values are English-only")]
94
void WriteColorAttributes(XshdColor color)
96
if (color.Foreground != null)
97
writer.WriteAttributeString("foreground", color.Foreground.ToString());
98
if (color.Background != null)
99
writer.WriteAttributeString("background", color.Background.ToString());
100
if (color.FontWeight != null)
101
writer.WriteAttributeString("fontWeight", V2Loader.FontWeightConverter.ConvertToInvariantString(color.FontWeight.Value).ToLowerInvariant());
102
if (color.FontStyle != null)
103
writer.WriteAttributeString("fontStyle", V2Loader.FontStyleConverter.ConvertToInvariantString(color.FontStyle.Value).ToLowerInvariant());
106
object IXshdVisitor.VisitColor(XshdColor color)
108
writer.WriteStartElement("Color", Namespace);
109
if (color.Name != null)
110
writer.WriteAttributeString("name", color.Name);
111
WriteColorAttributes(color);
112
if (color.ExampleText != null)
113
writer.WriteAttributeString("exampleText", color.ExampleText);
114
writer.WriteEndElement();
118
object IXshdVisitor.VisitKeywords(XshdKeywords keywords)
120
writer.WriteStartElement("Keywords", Namespace);
121
WriteColorReference(keywords.ColorReference);
122
foreach (string word in keywords.Words) {
123
writer.WriteElementString("Word", Namespace, word);
125
writer.WriteEndElement();
129
object IXshdVisitor.VisitSpan(XshdSpan span)
131
writer.WriteStartElement("Span", Namespace);
132
WriteColorReference(span.SpanColorReference);
133
if (span.BeginRegexType == XshdRegexType.Default && span.BeginRegex != null)
134
writer.WriteAttributeString("begin", span.BeginRegex);
135
if (span.EndRegexType == XshdRegexType.Default && span.EndRegex != null)
136
writer.WriteAttributeString("end", span.EndRegex);
137
WriteRuleSetReference(span.RuleSetReference);
139
writer.WriteAttributeString("multiline", "true");
141
if (span.BeginRegexType == XshdRegexType.IgnorePatternWhitespace)
142
WriteBeginEndElement("Begin", span.BeginRegex, span.BeginColorReference);
143
if (span.EndRegexType == XshdRegexType.IgnorePatternWhitespace)
144
WriteBeginEndElement("End", span.EndRegex, span.EndColorReference);
146
if (span.RuleSetReference.InlineElement != null)
147
span.RuleSetReference.InlineElement.AcceptVisitor(this);
149
writer.WriteEndElement();
153
void WriteBeginEndElement(string elementName, string regex, XshdReference<XshdColor> colorReference)
156
writer.WriteStartElement(elementName, Namespace);
157
WriteColorReference(colorReference);
158
writer.WriteString(regex);
159
writer.WriteEndElement();
163
object IXshdVisitor.VisitImport(XshdImport import)
165
writer.WriteStartElement("Import", Namespace);
166
WriteRuleSetReference(import.RuleSetReference);
167
writer.WriteEndElement();
171
object IXshdVisitor.VisitRule(XshdRule rule)
173
writer.WriteStartElement("Rule", Namespace);
174
WriteColorReference(rule.ColorReference);
176
writer.WriteString(rule.Regex);
178
writer.WriteEndElement();