/// <summary> /// Static class constructor /// </summary> static DefaultHighlightingManager() { var defaultManager = new DefaultHighlightingManager(); var theme = new HLTheme("Dark", "Light", "Dark", HL_THEMES_NAMESPACE_ROOT, "Dark.xshtd", defaultManager); defaultManager.ThemedHighlightingAdd(theme.Key, theme); theme = new HLTheme("Light", HL_GENERIC_NAMESPACE_ROOT, "Light"); defaultManager.ThemedHighlightingAdd(theme.Key, theme); // Setup default theme without registration of Highlightings defaultManager.SetCurrentThemeInternal(theme.Key); theme = new HLTheme("TrueBlue", "Light", "True Blue", HL_THEMES_NAMESPACE_ROOT, "TrueBlue.xshtd", defaultManager); defaultManager.ThemedHighlightingAdd(theme.Key, theme); theme = new HLTheme("VS2019_Dark", "Light", "VS2019 Dark", HL_THEMES_NAMESPACE_ROOT, "VS2019_Dark.xshtd", defaultManager); defaultManager.ThemedHighlightingAdd(theme.Key, theme); HLResources.RegisterBuiltInHighlightings(defaultManager, defaultManager.CurrentTheme); Instance = defaultManager; }
Func <IHighlightingDefinition> LoadHighlighting(IHLTheme theme, string name, string resourceName) { Func <IHighlightingDefinition> func = delegate { ICSharpCode.AvalonEdit.Highlighting.Xshd.XshdSyntaxDefinition xshd; using (Stream s = HLResources.OpenStream(GetPrefix(CurrentTheme.HLBaseKey), resourceName)) { using (XmlTextReader reader = new XmlTextReader(s)) { // in release builds, skip validating the built-in highlightings xshd = HighlightingLoader.LoadXshd(reader, true); } } var hlTheme = theme.HlTheme; SyntaxDefinition themedHighlights = null; if (hlTheme != null) { themedHighlights = hlTheme.GetNamedSyntaxDefinition(name); } return(HighlightingLoader.Load(themedHighlights, xshd, this)); }; return(func); }
/// <summary> /// Static class constructor /// </summary> static DefaultHighlightingManager() { var defaultManager = new DefaultHighlightingManager(); var themeNamespace = Assembly.GetExecutingAssembly().GetManifestResourceNames().First(name => name.EndsWith(FilenameXmldocXshd)); foreach (var resourceName in Assembly.GetExecutingAssembly().GetManifestResourceNames()) { if (!resourceName.EndsWith(ExtensionXshtd)) { continue; } var split = resourceName.Split('.'); var name = split[split.Length - 2]; var filename = string.Join(".", split, split.Length - 2, 2); var ns = resourceName.Remove(resourceName.Length - (split[split.Length - 1].Length + split[split.Length - 2].Length) - 2); var theme = new HLTheme(name, LightThemeName, name, ns, filename, defaultManager); defaultManager.ThemedHighlightingAdd(theme.Key, theme); } themeNamespace = themeNamespace.Remove(themeNamespace.Length - FilenameXmldocXshd.Length - 1); defaultManager.ThemedHighlightingAdd(LightThemeName, new HLTheme(LightThemeName, themeNamespace, LightThemeName)); defaultManager.SetCurrentThemeInternal(LightThemeName); HLResources.RegisterBuiltInHighlightings(defaultManager, defaultManager.CurrentTheme); Instance = defaultManager; }
/// <summary> /// Registering a built-in highlighting including highlighting themes (if any). /// </summary> /// <param name="theme"></param> /// <param name="name"></param> /// <param name="extensions"></param> /// <param name="resourceName"></param> internal void RegisterHighlighting(IHLTheme theme, string name, string[] extensions, string resourceName) { try { #if DEBUG // don't use lazy-loading in debug builds, show errors immediately ICSharpCode.AvalonEdit.Highlighting.Xshd.XshdSyntaxDefinition xshd; using (Stream s = HLResources.OpenStream(GetPrefix(CurrentTheme.HLBaseKey), resourceName)) { using (XmlTextReader reader = new XmlTextReader(s)) { xshd = HighlightingLoader.LoadXshd(reader, false); } } Debug.Assert(name == xshd.Name); if (extensions != null) { Debug.Assert(System.Linq.Enumerable.SequenceEqual(extensions, xshd.Extensions)); } else { Debug.Assert(xshd.Extensions.Count == 0); } var hlTheme = theme.HlTheme; SyntaxDefinition themedHighlights = null; if (hlTheme != null) { themedHighlights = hlTheme.GetNamedSyntaxDefinition(name); } // round-trip xshd: // string resourceFileName = Path.Combine(Path.GetTempPath(), resourceName); // using (XmlTextWriter writer = new XmlTextWriter(resourceFileName, System.Text.Encoding.UTF8)) { // writer.Formatting = Formatting.Indented; // new Xshd.SaveXshdVisitor(writer).WriteDefinition(xshd); // } // using (FileStream fs = File.Create(resourceFileName + ".bin")) { // new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter().Serialize(fs, xshd); // } // using (FileStream fs = File.Create(resourceFileName + ".compiled")) { // new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter().Serialize(fs, Xshd.HighlightingLoader.Load(xshd, this)); // } base.RegisterHighlighting(name, extensions, HighlightingLoader.Load(themedHighlights, xshd, this)); #else base.RegisterHighlighting(name, extensions, LoadHighlighting(theme, name, resourceName)); #endif } catch (HighlightingDefinitionInvalidException ex) { throw new InvalidOperationException("The built-in highlighting '" + name + "' is invalid.", ex); } }
/// <summary> /// Converts a XSHTD reference from namespace prefix and themename /// into a <see cref="XhstdThemeDefinition"/> object and returns it. /// </summary> /// <param name="hLPrefix"></param> /// <param name="hLThemeName"></param> /// <returns></returns> public XhstdThemeDefinition ResolveHighLightingTheme(string hLPrefix, string hLThemeName) { if (string.IsNullOrEmpty(hLPrefix) || string.IsNullOrEmpty(hLThemeName)) { return(null); } using (Stream s = HLResources.OpenStream(hLPrefix, hLThemeName)) { using (XmlTextReader reader = new XmlTextReader(s)) { return(HighlightingThemeLoader.LoadXshd(reader, false)); } } }
/// <summary> /// Sets the current highlighting based on the name of the given highöighting theme. /// (eg: WPF APP Theme 'TrueBlue' -> Resolve highlighting 'C#' to 'TrueBlue'->'C#') /// /// Throws an <see cref="IndexOutOfRangeException"/> if the WPF APP theme is not known. /// </summary> /// <param name="themeNameKey"></param> public void SetCurrentTheme(string themeNameKey) { SetCurrentThemeInternal(themeNameKey); HLResources.RegisterBuiltInHighlightings(DefaultHighlightingManager.Instance, CurrentTheme); }