/// <summary> /// Writes a set of snippets to Visual Studio Code Snippet File /// </summary> /// <param name="snippets"></param> /// <param name="snippetFile"></param> /// <param name="prefix">Optional prefix to assign snippet shortcuts and title</param> /// <param name="clearSnippetFile"></param> public static void ToFile(List <VisualStudioSnippet> snippets, string snippetFile, bool clearSnippetFile = false, string prefix = null) { snippetFile = Environment.ExpandEnvironmentVariables(snippetFile); if (clearSnippetFile && File.Exists(snippetFile)) { File.Delete(snippetFile); } JObject rootJson = null; if (File.Exists(snippetFile)) { using (StreamReader reader = new StreamReader(snippetFile)) { using (var tr = new JsonTextReader(reader)) { rootJson = JObject.Load(tr); } } //rootJson = rootJson.First as JObject; } else { rootJson = new JObject(); } foreach (var snippet in snippets) { var vsCodeSnippet = VsCodeSnippet.FromVisualStudioCodeSnippet(snippet); if (!string.IsNullOrEmpty(prefix)) { if (!vsCodeSnippet.Prefix.StartsWith(prefix, StringComparison.InvariantCultureIgnoreCase)) { vsCodeSnippet.Prefix = prefix + vsCodeSnippet.Prefix; } if (!vsCodeSnippet.Title.StartsWith(prefix, StringComparison.InvariantCultureIgnoreCase)) { vsCodeSnippet.Title = prefix + vsCodeSnippet.Title; } } vsCodeSnippet.AttachToJsonRoot(rootJson); } using (var sw = new StreamWriter(snippetFile)) { using (var jw = new JsonTextWriter(sw) { Formatting = Formatting.Indented, }) { rootJson.WriteTo(jw); } } }
/// <summary> /// Attaches a list of Visual Studio snippets to a root JSON instance /// </summary> /// <param name="snippets"></param> /// <param name="rootJson"></param> /// <returns></returns> public static JObject FromVisualStudioCodeSnippetList(List <VisualStudioSnippet> snippets, JObject rootJson = null) { if (rootJson == null) { rootJson = new JObject(); } foreach (var vsSnippet in snippets) { var vsCodeSnippet = VsCodeSnippet.FromVisualStudioCodeSnippet(vsSnippet); vsCodeSnippet.AttachToJsonRoot(rootJson); } return(rootJson); }
/// <summary> /// Creates a VsCodeSnippet from a Visual Studio code snippet object /// </summary> /// <param name="snippet"></param> /// <returns></returns> public static VsCodeSnippet FromVisualStudioCodeSnippet(VisualStudioSnippet snippet) { var vsCode = new VsCodeSnippet { Prefix = snippet.Shortcut.ToLowerInvariant(), Title = snippet.Title, Scope = snippet.Language ?? "plain,html,javascript,typescript,css", Description = snippet.Description }; int counter = 1; var delim = snippet.Delimiter ?? "$"; var code = snippet.Code; vsCode.Scope = vsCode.Scope.ToLowerInvariant(); // Fix up embedded references foreach (var dep in snippet.Declarations) { var id = dep.Id; var replace = delim + "{" + counter + "}"; if (!string.IsNullOrEmpty(dep.Default)) { replace = delim + "{" + counter + ":" + dep.Default + "}"; } code = code.Replace($"{delim}{id}{delim}", replace); counter++; } code = code.Replace($"{delim}end{delim}", "$0"); vsCode.Body = Utils.GetLines(code); return(vsCode); }