42
42
static Dictionary<string, ISyntaxModeProvider> syntaxModes = new Dictionary<string, ISyntaxModeProvider> ();
43
43
static Dictionary<string, ColorScheme> styles = new Dictionary<string, ColorScheme> ();
44
static Dictionary<string, IXmlProvider> syntaxModeLookup = new Dictionary<string, IXmlProvider> ();
45
static Dictionary<string, IXmlProvider> styleLookup = new Dictionary<string, IXmlProvider> ();
44
static Dictionary<string, IStreamProvider> syntaxModeLookup = new Dictionary<string, IStreamProvider> ();
45
static Dictionary<string, IStreamProvider> styleLookup = new Dictionary<string, IStreamProvider> ();
46
46
static Dictionary<string, string> isLoadedFromFile = new Dictionary<string, string> ();
48
48
public static string[] Styles {
75
75
syntaxModes[mimeType] = modeProvider;
78
public static ColorScheme GetColorStyle (Gtk.Style widgetStyle, string name)
78
public static ColorScheme GetColorStyle (string name)
80
80
if (styles.ContainsKey (name))
81
81
return styles [name];
82
82
if (styleLookup.ContainsKey (name)) {
84
return GetColorStyle (widgetStyle, name);
84
return GetColorStyle (name);
86
return GetColorStyle (widgetStyle, "Default");
86
return GetColorStyle ("Default");
89
public static IXmlProvider GetProvider (SyntaxMode mode)
89
public static IStreamProvider GetProvider (SyntaxMode mode)
91
91
foreach (string mimeType in mode.MimeType.Split (';')) {
92
92
if (syntaxModeLookup.ContainsKey (mimeType))
107
107
if (!styleLookup.ContainsKey (name))
108
108
throw new System.ArgumentException ("Style " + name + " not found", "name");
109
XmlReader reader = styleLookup [name].Open ();
109
var provider = styleLookup [name];
110
var stream = provider.Open ();
111
styles [name] = ColorScheme.LoadFrom (reader);
112
if (provider is UrlStreamProvider) {
113
var usp = provider as UrlStreamProvider;
114
if (usp.Url.EndsWith (".vssettings", StringComparison.Ordinal)) {
115
styles [name] = ColorScheme.Import (usp.Url, stream);
117
styles [name] = ColorScheme.LoadFrom (stream);
120
styles [name] = ColorScheme.LoadFrom (stream);
112
122
} catch (Exception e) {
113
123
throw new IOException ("Error while loading style :" + name, e);
263
272
var span = lineSegment.StartSpan;
264
273
if (span == null)
266
var spanStack = span.Clone ();
267
SyntaxMode.SpanParser parser = mode.CreateSpanParser(null, spanStack);
276
var spanStack = span.Clone ();
278
SyntaxMode.SpanParser parser = mode.CreateSpanParser(null, spanStack);
268
280
foreach (var line in doc.GetLinesStartingAt (startLine)) {
269
281
if (line == null)
271
284
if (line.Offset > endOffset) {
272
285
span = line.StartSpan;
273
286
if (span == null)
275
bool equal = span.Equals(spanStack);
280
line.StartSpan = spanStack.Clone();
281
parser.ParseSpans(line.Offset, line.LengthIncludingDelimiter);
282
while (spanStack.Count > 0 && !EndsWithContinuation(spanStack.Peek(), line))
289
bool equal = span.Equals(spanStack);
299
line.StartSpan = spanStack.Clone();
301
parser.ParseSpans(line.Offset, line.LengthIncludingDelimiter);
303
while (spanStack.Count > 0 && !EndsWithContinuation(spanStack.Peek(), line))
285
309
} catch (Exception e) {
286
310
Console.WriteLine ("Syntax highlighting exception:" + e);
355
static string Scan (XmlReader reader, string attribute)
379
static string Scan (Stream stream, string attribute)
381
var reader = XmlReader.Create (stream);
357
382
while (reader.Read () && !reader.IsStartElement ())
359
384
return reader.GetAttribute (attribute);
362
public static bool IsValidStyle (string fileName)
364
if (!fileName.EndsWith ("Style.xml"))
367
using (XmlTextReader reader = new XmlTextReader (fileName)) {
368
string styleName = Scan (reader, Style.NameAttribute);
369
return !String.IsNullOrEmpty (styleName);
371
} catch (Exception) {
376
387
public static List<ValidationEventArgs> ValidateStyleFile (string fileName)
378
389
List<ValidationEventArgs> result = new List<ValidationEventArgs> ();
379
XmlReaderSettings settings = new XmlReaderSettings ();
380
settings.ValidationType = ValidationType.Schema;
381
settings.ValidationEventHandler += delegate(object sender, ValidationEventArgs e) {
384
settings.Schemas.Add (null, new XmlTextReader (typeof(SyntaxModeService).Assembly.GetManifestResourceStream ("Styles.xsd")));
386
using (XmlReader reader = XmlReader.Create (fileName, settings)) {
387
while (reader.Read ())
395
393
public static bool IsValidSyntaxMode (string fileName)
397
if (!fileName.EndsWith ("SyntaxMode.xml"))
395
if (!fileName.EndsWith ("SyntaxMode.xml", StringComparison.Ordinal))
400
using (XmlTextReader reader = new XmlTextReader (fileName)) {
401
string mimeTypes = Scan (reader, SyntaxMode.MimeTypesAttribute);
398
using (var stream = File.OpenRead (fileName)) {
399
string mimeTypes = Scan (stream, SyntaxMode.MimeTypesAttribute);
402
400
return !String.IsNullOrEmpty (mimeTypes);
404
402
} catch (Exception) {
409
407
public static void LoadStylesAndModes (string path)
411
409
foreach (string file in Directory.GetFiles (path)) {
412
if (!file.EndsWith (".xml"))
414
if (file.EndsWith ("SyntaxMode.xml")) {
415
using (XmlTextReader reader = new XmlTextReader (file)) {
416
string mimeTypes = Scan (reader, SyntaxMode.MimeTypesAttribute);
417
foreach (string mimeType in mimeTypes.Split (';')) {
418
syntaxModeLookup [mimeType] = new UrlXmlProvider (file);
410
if (file.EndsWith (".xml", StringComparison.Ordinal)) {
411
using (var stream = File.OpenRead (file)) {
412
string mimeTypes = Scan (stream, SyntaxMode.MimeTypesAttribute);
413
if (!string.IsNullOrEmpty (mimeTypes)) {
414
foreach (string mimeType in mimeTypes.Split (';')) {
415
syntaxModeLookup [mimeType] = new UrlStreamProvider (file);
421
} else if (file.EndsWith ("Style.xml")) {
422
using (XmlTextReader reader = new XmlTextReader (file)) {
423
string styleName = Scan (reader, ColorScheme.NameAttribute);
424
styleLookup [styleName] = new UrlXmlProvider (file);
419
} else if (file.EndsWith (".json", StringComparison.Ordinal)) {
420
using (var stream = File.OpenRead (file)) {
421
string styleName = ScanStyle (stream);
422
styleLookup [styleName] = new UrlStreamProvider (file);
423
isLoadedFromFile [styleName] = file;
425
} else if (file.EndsWith (".vssettings", StringComparison.Ordinal)) {
426
using (var stream = File.OpenRead (file)) {
427
string styleName = Path.GetFileNameWithoutExtension (file);
428
styleLookup [styleName] = new UrlStreamProvider (file);
425
429
isLoadedFromFile [styleName] = file;
430
435
public static void LoadStylesAndModes (Assembly assembly)
432
437
foreach (string resource in assembly.GetManifestResourceNames ()) {
433
if (!resource.EndsWith (".xml"))
435
if (resource.EndsWith ("SyntaxMode.xml")) {
436
using (Stream stream = assembly.GetManifestResourceStream (resource))
437
using (XmlTextReader reader = new XmlTextReader (stream)) {
438
string mimeTypes = Scan (reader, SyntaxMode.MimeTypesAttribute);
439
ResourceXmlProvider provider = new ResourceXmlProvider (assembly, resource);
438
if (resource.EndsWith ("SyntaxMode.xml", StringComparison.Ordinal)) {
439
using (Stream stream = assembly.GetManifestResourceStream (resource)) {
440
string mimeTypes = Scan (stream, SyntaxMode.MimeTypesAttribute);
441
ResourceStreamProvider provider = new ResourceStreamProvider (assembly, resource);
440
442
foreach (string mimeType in mimeTypes.Split (';')) {
441
443
syntaxModeLookup [mimeType] = provider;
444
} else if (resource.EndsWith ("Style.xml")) {
445
using (Stream stream = assembly.GetManifestResourceStream (resource))
446
using (XmlTextReader reader = new XmlTextReader (stream)) {
447
string styleName = Scan (reader, ColorScheme.NameAttribute);
448
styleLookup [styleName] = new ResourceXmlProvider (assembly, resource);
446
} else if (resource.EndsWith ("Style.json", StringComparison.Ordinal)) {
447
using (Stream stream = assembly.GetManifestResourceStream (resource)) {
448
string styleName = ScanStyle (stream);
449
styleLookup [styleName] = new ResourceStreamProvider (assembly, resource);
454
public static void AddSyntaxMode (IXmlProvider provider)
456
using (XmlReader reader = provider.Open ()) {
454
static System.Text.RegularExpressions.Regex nameRegex = new System.Text.RegularExpressions.Regex ("\\s*\"name\"\\s*:\\s*\"(.*)\"\\s*,");
456
static string ScanStyle (Stream stream)
458
var file = new StreamReader (stream);
460
var nameLine = file.ReadLine ();
461
var match = nameRegex.Match (nameLine);
464
return match.Groups[1].Value;
467
public static void AddSyntaxMode (IStreamProvider provider)
469
using (var reader = provider.Open ()) {
457
470
string mimeTypes = Scan (reader, SyntaxMode.MimeTypesAttribute);
458
471
foreach (string mimeType in mimeTypes.Split (';')) {
459
472
syntaxModeLookup [mimeType] = provider;
476
489
isLoadedFromFile [style.Name] = fileName;
477
490
styles [style.Name] = style;
479
public static void AddStyle (IXmlProvider provider)
493
public static void AddStyle (IStreamProvider provider)
481
using (XmlReader reader = provider.Open ()) {
482
string styleName = Scan (reader, ColorScheme.NameAttribute);
495
using (var stream = provider.Open ()) {
496
string styleName = ScanStyle (stream);
483
497
styleLookup [styleName] = provider;
486
public static void RemoveStyle (IXmlProvider provider)
501
public static void RemoveStyle (IStreamProvider provider)
488
using (XmlReader reader = provider.Open ()) {
489
string styleName = Scan (reader, ColorScheme.NameAttribute);
503
using (var stream = provider.Open ()) {
504
string styleName = ScanStyle (stream);
490
505
styleLookup.Remove (styleName);
498
513
semanticRules.Add (Tuple.Create (mime, ruleName, rule));
516
public static ColorScheme DefaultColorStyle {
518
return GetColorStyle ("Default");
501
522
static SyntaxModeService ()
503
524
StartUpdateThread ();
504
525
LoadStylesAndModes (typeof(SyntaxModeService).Assembly);
505
SyntaxModeService.AddSemanticRule ("text/x-csharp", "Comment", new HighlightUrlSemanticRule ("comment"));
506
SyntaxModeService.AddSemanticRule ("text/x-csharp", "XmlDocumentation", new HighlightUrlSemanticRule ("comment"));
507
SyntaxModeService.AddSemanticRule ("text/x-csharp", "String", new HighlightUrlSemanticRule ("string"));
526
SyntaxModeService.AddSemanticRule ("text/x-csharp", "Comment", new HighlightUrlSemanticRule ("Comment(Line)"));
527
SyntaxModeService.AddSemanticRule ("text/x-csharp", "XmlDocumentation", new HighlightUrlSemanticRule ("Comment(Doc)"));
528
SyntaxModeService.AddSemanticRule ("text/x-csharp", "String", new HighlightUrlSemanticRule ("String"));
509
530
InstallSyntaxMode ("text/x-jay", new SyntaxModeProvider (doc => new JaySyntaxMode (doc)));