/// <summary>
        /// Fills the placeholders of a code
        /// </summary>
        /// <param name="code">Code to fill</param>
        /// <param name="data">Export Data</param>
        /// <returns>Filled Code</returns>
        public async Task <string> FillPlaceholders(string code, ExportObjectData data)
        {
            // Check Data
            if (!data.ExportData.ContainsKey(ExportConstants.ExportDataObject))
            {
                return(code);
            }

            KortistoNpc npc = data.ExportData[ExportConstants.ExportDataObject] as KortistoNpc;

            if (npc != null)
            {
                // Replace Dialog Placeholders
                return(await FillDialogPlaceholders(code, npc));
            }

            ExportDialogFunctionCode dialogFunction = data.ExportData[ExportConstants.ExportDataObject] as ExportDialogFunctionCode;

            if (dialogFunction != null)
            {
                // Replace Dialog Function
                GoNorthProject project = await _cachedDbAccess.GetUserProject();

                return(await RenderDialogFunction(project, dialogFunction));
            }

            return(code);
        }
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="dialogFunctionCode">Dialog function code</param>
 public ScribanExportDialogFunction(ExportDialogFunctionCode dialogFunctionCode)
 {
     if (dialogFunctionCode != null)
     {
         FunctionName      = dialogFunctionCode.FunctionName;
         Code              = dialogFunctionCode.Code;
         ParentPreviewText = dialogFunctionCode.ParentPreviewText;
     }
 }
        /// <summary>
        /// Renders a dialog function
        /// </summary>
        /// <param name="project">Current Project</param>
        /// <param name="functionCode">Function code to use</param>
        /// <returns>Rendered dialog function</returns>
        public async Task <string> RenderDialogFunction(GoNorthProject project, ExportDialogFunctionCode functionCode)
        {
            string renderedCode = (await _defaultTemplateProvider.GetDefaultTemplateByType(project.Id, TemplateType.TaleDialogFunction)).Code;

            renderedCode = ExportUtil.BuildPlaceholderRegex(Placeholder_FunctionName).Replace(renderedCode, functionCode.FunctionName);
            renderedCode = ExportUtil.BuildPlaceholderRegex(Placeholder_Function_ParentPreview).Replace(renderedCode, functionCode.ParentPreviewText);
            renderedCode = ExportUtil.BuildPlaceholderRegex(Placeholder_FunctionContent, ExportConstants.ListIndentPrefix).Replace(renderedCode, m => {
                return(ExportUtil.TrimEmptyLines(ExportUtil.IndentListTemplate(functionCode.Code, m.Groups[1].Value)));
            });

            return(renderedCode);
        }
        /// <summary>
        /// Collects the values for an export
        /// </summary>
        /// <param name="templateType">Template type</param>
        /// <param name="parsedTemplate">Parsed scriban template</param>
        /// <param name="scriptObject">Scriban script object to fill</param>
        /// <param name="data">Export Data</param>
        /// <returns>Task</returns>
        public override Task CollectValues(TemplateType templateType, Template parsedTemplate, ScriptObject scriptObject, ExportObjectData data)
        {
            ExportDialogFunctionCode inputFunction = data.ExportData[ExportConstants.ExportDataObject] as ExportDialogFunctionCode;

            if (inputFunction == null)
            {
                return(Task.CompletedTask);
            }

            scriptObject.AddOrUpdate(ExportConstants.ScribanDialogFunctionKey, new ScribanExportDialogFunction(inputFunction));
            return(Task.CompletedTask);
        }
        /// <summary>
        /// Renders a function for a list
        /// </summary>
        /// <param name="project">Current Project</param>
        /// <param name="functionCode">Function code to use</param>
        /// <returns>Function</returns>
        public async Task <string> RenderFunctionForList(GoNorthProject project, ExportDialogFunctionCode functionCode)
        {
            ExportTemplate functionTemplate = await _defaultTemplateProvider.GetDefaultTemplateByType(project.Id, TemplateType.TaleDialogFunction);

            ExportObjectData objectData = new ExportObjectData();

            objectData.ExportData.Add(ExportConstants.ExportDataObject, functionCode);

            ExportPlaceholderFillResult fillResult = await _templatePlaceholderResolver.FillPlaceholders(TemplateType.TaleDialogFunction, functionTemplate.Code, objectData, functionTemplate.RenderingEngine);

            _errorCollection.Merge(fillResult.Errors);

            return(fillResult.Code);
        }