示例#1
0
        /// <summary>
        /// Parses the snippets of a template
        /// </summary>
        /// <param name="template">Template to parse</param>
        /// <returns>List of found snippets</returns>
        private List <ExportTemplateSnippet> ParseSnippets(ExportTemplate template)
        {
            string snippetRegexFormat = string.Format("(\\s|^){0}\\.{1}\\.(.*?)\\.({2}|{3}|{4})", ExportConstants.ScribanExportSnippetsObjectKey, StandardMemberRenamer.Rename(nameof(ScribanExportSnippetsData.Snippets)),
                                                      StandardMemberRenamer.Rename(nameof(ScribanExportSnippet.InitialFunction)), StandardMemberRenamer.Rename(nameof(ScribanExportSnippet.AdditionalFunctions)),
                                                      StandardMemberRenamer.Rename(nameof(ScribanExportSnippet.AllFunctions)));
            Regex exportSnippetRegex = new Regex(snippetRegexFormat, RegexOptions.Multiline);

            Template parsedTemplate = Template.Parse(template.Code);

            List <ExportTemplateSnippet> snippets          = new List <ExportTemplateSnippet>();
            List <ScriptStatement>       statementsToCheck = ScribanStatementExtractor.ExtractPlainNonTextStatements(parsedTemplate);

            foreach (ScriptStatement curStatement in statementsToCheck)
            {
                if (curStatement is ScriptRawStatement)
                {
                    continue;
                }

                string          statement      = curStatement.ToString();
                MatchCollection snippetMatches = exportSnippetRegex.Matches(statement);
                if (!snippetMatches.Any())
                {
                    continue;
                }

                AddNewSnippets(snippets, snippetMatches);
            }

            return(snippets);
        }
        /// <summary>
        /// Parses the referenced include templates from a template
        /// </summary>
        /// <param name="template">Template to parse</param>
        /// <returns>List of referenced include</returns>
        private async Task <List <IncludeExportTemplateReference> > ParseIncludeTemplates(ExportTemplate template)
        {
            Template parsedTemplate = Template.Parse(template.Code);

            List <IncludeExportTemplateReference> includeTemplateRefs = new List <IncludeExportTemplateReference>();
            List <ScriptStatement> statementsToCheck = ScribanStatementExtractor.ExtractPlainNonTextStatements(parsedTemplate);

            foreach (ScriptStatement curStatement in statementsToCheck)
            {
                if (!(curStatement is ScriptExpressionStatement))
                {
                    continue;
                }

                ScriptExpressionStatement expressionStatement = (ScriptExpressionStatement)curStatement;
                if (expressionStatement.Expression == null || !(expressionStatement.Expression is ScriptFunctionCall))
                {
                    continue;
                }

                ScriptFunctionCall functionCall = (ScriptFunctionCall)expressionStatement.Expression;
                if (functionCall.Target == null || functionCall.Target.ToString() != "include")
                {
                    continue;
                }

                if (functionCall.Arguments.Count < 1)
                {
                    continue;
                }

                string templateName = functionCall.Arguments[0].ToString().Trim('\"').Trim('\'');
                IncludeExportTemplate existingTemplate = await _cachedDbAccess.GetIncludeTemplateByName(template.ProjectId, templateName);

                if (existingTemplate != null && !includeTemplateRefs.Any(e => e.IncludeTemplateId == existingTemplate.Id))
                {
                    includeTemplateRefs.Add(new IncludeExportTemplateReference {
                        IncludeTemplateId = existingTemplate.Id,
                        Name = existingTemplate.Name
                    });
                }
            }

            return(includeTemplateRefs);
        }