/// <summary> /// Creates a VsCodeSnippet from a Visual Studio code snippet object /// </summary> /// <param name="snippet"></param> /// <returns></returns> public static JetBrainsLiveTemplate FromVisualStudioCodeSnippet(VisualStudioSnippet snippet) { var jbTemplate = new JetBrainsLiveTemplate() { Shortcut = snippet.Shortcut.ToLowerInvariant(), Scope = snippet.Language ?? "csharp", Description = snippet.Description, Code = snippet.Code, Declarations = snippet.Declarations }; jbTemplate.Code = jbTemplate.Code.Replace("$end$", "$END$"); return(jbTemplate); }
/// <summary> /// Parses a Visual Studio snippet from string into a snippet object /// </summary> /// <param name="visualStudioSnippet"></param> /// <returns></returns> public static VisualStudioSnippet Parse(string visualStudioSnippet) { XElement el = XElement.Parse(visualStudioSnippet); var res = new XmlNamespaceManager(new NameTable()); res.AddNamespace("z", el.GetDefaultNamespace().NamespaceName); var header = el.XPathSelectElement("./z:CodeSnippet/z:Header", res); var snippet = el.XPathSelectElement("./z:CodeSnippet/z:Snippet", res); var declarations = el.XPathSelectElements("./z:CodeSnippet/z:Snippet/z:Declarations/z:Literal", res); var code = el.XPathSelectElement("./z:CodeSnippet/z:Snippet/z:Code", res); var vsSnippet = new VisualStudioSnippet() { Code = code.Value, Kind = code.Attribute("Kind")?.Value, Language = code.Attribute("Language")?.Value, Delimiter = code.Attribute("Delimiter")?.Value, Shortcut = header?.XPathSelectElement("./z:Shortcut", res)?.Value, Keywords = header?.XPathSelectElement("./z:Keywords", res)?.Value, Description = header?.XPathSelectElement("./z:Description", res)?.Value, Title = header?.XPathSelectElement("./z:Title", res)?.Value, Author = header?.XPathSelectElement("./z:Author", res)?.Value, HelpUrl = header?.XPathSelectElement("./z:HelpUrl", res)?.Value }; foreach (var decl in declarations) { var variable = new VisualStudioSnippetVariable(); variable.Id = decl.XPathSelectElement("z:ID", res)?.Value; variable.ToolTip = decl.XPathSelectElement("z:ToolTip", res)?.Value; variable.Default = decl.XPathSelectElement("z:Default", res)?.Value; var editValue = decl.Attribute("Editable")?.Value; if (editValue != null && editValue == "true") { variable.Editable = true; } vsSnippet.Declarations.Add(variable); } return(vsSnippet); }
/// <summary> /// Attaches a list of Visual Studio snippets to a root JSON instance /// </summary> /// <param name="folder">Folder to import</param> /// <param name="snippetPrefix">optional prefix to prepend to template names</param> /// <param name="recursive">search child folders if true</param> /// <returns></returns> public static void AddVisualStudioSnippets(string folder, string snippetPrefix = null, bool recursive = false) { if (!Directory.Exists(folder)) { throw new DirectoryNotFoundException("Snippet folder doesn't exist: " + folder); } var snippets = VisualStudioSnippet.ParseSnippetFolder(folder, recursive); if (snippets == null) { return; } foreach (var vsSnippet in snippets) { var jbCodeSnippet = FromVisualStudioCodeSnippet(vsSnippet); jbCodeSnippet.AddCSharpTemplate(); } }
/// <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); }