~halega/+junk/sharpdevelop

« back to all changes in this revision

Viewing changes to src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Xshd/SaveXshdVisitor.cs

  • Committer: sk
  • Date: 2011-09-10 05:17:57 UTC
  • Revision ID: halega@halega.com-20110910051757-qfouz1llya9m6boy
4.1.0.7915 Release Candidate 1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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)
 
3
 
 
4
using System;
 
5
using System.Linq;
 
6
using System.Xml;
 
7
 
 
8
namespace ICSharpCode.AvalonEdit.Highlighting.Xshd
 
9
{
 
10
        /// <summary>
 
11
        /// Xshd visitor implementation that saves an .xshd file as XML.
 
12
        /// </summary>
 
13
        public sealed class SaveXshdVisitor : IXshdVisitor
 
14
        {
 
15
                /// <summary>
 
16
                /// XML namespace for XSHD.
 
17
                /// </summary>
 
18
                public const string Namespace = V2Loader.Namespace;
 
19
                
 
20
                XmlWriter writer;
 
21
                
 
22
                /// <summary>
 
23
                /// Creates a new SaveXshdVisitor instance.
 
24
                /// </summary>
 
25
                public SaveXshdVisitor(XmlWriter writer)
 
26
                {
 
27
                        if (writer == null)
 
28
                                throw new ArgumentNullException("writer");
 
29
                        this.writer = writer;
 
30
                }
 
31
                
 
32
                /// <summary>
 
33
                /// Writes the specified syntax definition.
 
34
                /// </summary>
 
35
                public void WriteDefinition(XshdSyntaxDefinition definition)
 
36
                {
 
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()));
 
44
                        
 
45
                        definition.AcceptElements(this);
 
46
                        
 
47
                        writer.WriteEndElement();
 
48
                }
 
49
                
 
50
                object IXshdVisitor.VisitRuleSet(XshdRuleSet ruleSet)
 
51
                {
 
52
                        writer.WriteStartElement("RuleSet", Namespace);
 
53
                        
 
54
                        if (ruleSet.Name != null)
 
55
                                writer.WriteAttributeString("name", ruleSet.Name);
 
56
                        WriteBoolAttribute("ignoreCase", ruleSet.IgnoreCase);
 
57
                        
 
58
                        ruleSet.AcceptElements(this);
 
59
                        
 
60
                        writer.WriteEndElement();
 
61
                        return null;
 
62
                }
 
63
                
 
64
                void WriteBoolAttribute(string attributeName, bool? value)
 
65
                {
 
66
                        if (value != null) {
 
67
                                writer.WriteAttributeString(attributeName, value.Value ? "true" : "false");
 
68
                        }
 
69
                }
 
70
                
 
71
                void WriteRuleSetReference(XshdReference<XshdRuleSet> ruleSetReference)
 
72
                {
 
73
                        if (ruleSetReference.ReferencedElement != null) {
 
74
                                if (ruleSetReference.ReferencedDefinition != null)
 
75
                                        writer.WriteAttributeString("ruleSet", ruleSetReference.ReferencedDefinition + "/" + ruleSetReference.ReferencedElement);
 
76
                                else
 
77
                                        writer.WriteAttributeString("ruleSet", ruleSetReference.ReferencedElement);
 
78
                        }
 
79
                }
 
80
                
 
81
                void WriteColorReference(XshdReference<XshdColor> color)
 
82
                {
 
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);
 
88
                                else
 
89
                                        writer.WriteAttributeString("color", color.ReferencedElement);
 
90
                        }
 
91
                }
 
92
                
 
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)
 
95
                {
 
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());
 
104
                }
 
105
                
 
106
                object IXshdVisitor.VisitColor(XshdColor color)
 
107
                {
 
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();
 
115
                        return null;
 
116
                }
 
117
                
 
118
                object IXshdVisitor.VisitKeywords(XshdKeywords keywords)
 
119
                {
 
120
                        writer.WriteStartElement("Keywords", Namespace);
 
121
                        WriteColorReference(keywords.ColorReference);
 
122
                        foreach (string word in keywords.Words) {
 
123
                                writer.WriteElementString("Word", Namespace, word);
 
124
                        }
 
125
                        writer.WriteEndElement();
 
126
                        return null;
 
127
                }
 
128
                
 
129
                object IXshdVisitor.VisitSpan(XshdSpan span)
 
130
                {
 
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);
 
138
                        if (span.Multiline)
 
139
                                writer.WriteAttributeString("multiline", "true");
 
140
                        
 
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);
 
145
                        
 
146
                        if (span.RuleSetReference.InlineElement != null)
 
147
                                span.RuleSetReference.InlineElement.AcceptVisitor(this);
 
148
                        
 
149
                        writer.WriteEndElement();
 
150
                        return null;
 
151
                }
 
152
                
 
153
                void WriteBeginEndElement(string elementName, string regex, XshdReference<XshdColor> colorReference)
 
154
                {
 
155
                        if (regex != null) {
 
156
                                writer.WriteStartElement(elementName, Namespace);
 
157
                                WriteColorReference(colorReference);
 
158
                                writer.WriteString(regex);
 
159
                                writer.WriteEndElement();
 
160
                        }
 
161
                }
 
162
                
 
163
                object IXshdVisitor.VisitImport(XshdImport import)
 
164
                {
 
165
                        writer.WriteStartElement("Import", Namespace);
 
166
                        WriteRuleSetReference(import.RuleSetReference);
 
167
                        writer.WriteEndElement();
 
168
                        return null;
 
169
                }
 
170
                
 
171
                object IXshdVisitor.VisitRule(XshdRule rule)
 
172
                {
 
173
                        writer.WriteStartElement("Rule", Namespace);
 
174
                        WriteColorReference(rule.ColorReference);
 
175
                        
 
176
                        writer.WriteString(rule.Regex);
 
177
                        
 
178
                        writer.WriteEndElement();
 
179
                        return null;
 
180
                }
 
181
        }
 
182
}