/// <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();
            }
        }
Esempio n. 4
0
        /// <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);
        }