/// <summary> /// Renders a dialog step /// </summary> /// <param name="template">Export template</param> /// <param name="data">Dialog Step Data</param> /// <param name="npc">Npc object to which the dialog belongs</param> /// <param name="textNode">Text node to render</param> /// <returns>Dialog Step Render Result</returns> public async Task <ExportDialogStepRenderResult> RenderDialogStep(ExportTemplate template, ExportDialogData data, KortistoNpc npc, TextNode textNode) { ExportDialogStepRenderResult renderResult = new ExportDialogStepRenderResult(); Template parsedTemplate = ScribanParsingUtil.ParseTemplate(template.Code, _errorCollection); if (parsedTemplate == null) { return(renderResult); } _languageKeyGenerator.SetErrorCollection(_errorCollection); ScribanTextLine textLineData = BuildDialogRenderObject <ScribanTextLine>(data, data.Children.FirstOrDefault() != null ? data.Children.FirstOrDefault().Child : null, npc); textLineData.TextLine = ExportUtil.EscapeCharacters(textNode.Text, _exportSettings.EscapeCharacter, _exportSettings.CharactersNeedingEscaping, _exportSettings.NewlineCharacter); textLineData.UnescapedTextLine = textNode.Text; textLineData.TextLinePreview = ExportUtil.BuildTextPreview(textNode.Text); textLineData.IsPlayerLine = _isPlayerLine; TemplateContext context = BuildTemplateContext(textLineData); renderResult.StepCode = await parsedTemplate.RenderAsync(context); return(renderResult); }
/// <summary> /// Builds the template context for exporting /// </summary> /// <param name="textLineData">Textline data to export</param> /// <returns>Template context</returns> private TemplateContext BuildTemplateContext(ScribanTextLine textLineData) { ScriptObject exportObject = new ScriptObject(); exportObject.Add(TextLineKey, textLineData); exportObject.Add(ExportConstants.ScribanLanguageKeyName, _languageKeyGenerator); TemplateContext context = new TemplateContext(); context.TemplateLoader = new ScribanIncludeTemplateLoader(_exportCachedDbAccess, _errorCollection); context.PushGlobal(exportObject); return(context); }
/// <summary> /// Generates a language key from a call hierarchy /// </summary> /// <param name="templateContext">Template context</param> /// <param name="callerContext">Call context</param> /// <param name="callHierarchy">Call hierarchy</param> /// <returns>Language key</returns> private async ValueTask <object> GenerateLanguageKeyFromCallHierarchy(TemplateContext templateContext, ScriptNode callerContext, List <string> callHierarchy) { if (callHierarchy.Count < 2) { _errorCollection.AddCanNotGenerateLanguageKey(ScribanErrorUtil.FormatScribanSpan(callerContext.Span)); return("<<INVALID ARGUMENTS FOR LANGKEY>>"); } string objectNameValue = StandardMemberRenamer.Rename(nameof(ScribanFlexFieldObject.Name)); string fieldValue = StandardMemberRenamer.Rename(nameof(ScribanFlexFieldField.Value)); string unescapedFieldValue = StandardMemberRenamer.Rename(nameof(ScribanFlexFieldField.UnescapedValue)); string textLineValue = StandardMemberRenamer.Rename(nameof(ScribanTextLine.TextLine)); string choiceText = StandardMemberRenamer.Rename(nameof(ScribanChoiceOption.Text)); string addQuestText = StandardMemberRenamer.Rename(nameof(ScribanAddQuestTextActionData.Text)); string floatingTextData = StandardMemberRenamer.Rename(nameof(ScribanShowFloatingTextActionData.Text)); if (callHierarchy[callHierarchy.Count - 1] == objectNameValue || callHierarchy[callHierarchy.Count - 1] == fieldValue || callHierarchy[callHierarchy.Count - 1] == unescapedFieldValue) { ScriptNode parentObjectExpression = BuildParentObjectValueScriptExpression(callHierarchy); object parentObject = templateContext.Evaluate(parentObjectExpression); if (parentObject == null) { _errorCollection.AddCanNotGenerateLanguageKey(ScribanErrorUtil.FormatScribanSpan(callerContext.Span)); return("<<INVALID ARGUMENTS FOR LANGKEY>>"); } if (parentObject is ScribanFlexFieldObject) { ScribanFlexFieldObject langObject = (ScribanFlexFieldObject)parentObject; return(await _languageKeyGenerator.GetFlexFieldNameKey(langObject.Id, langObject.Name, langObject.ExportObjectType)); } else if (parentObject is ScribanFlexFieldField) { return(await GenerateFlexFieldLanguageKey(callerContext, (ScribanFlexFieldField)parentObject)); } } else if (callHierarchy[callHierarchy.Count - 1] == textLineValue) { ScriptNode parentObjectExpression = BuildParentObjectValueScriptExpression(callHierarchy); object parentObject = templateContext.Evaluate(parentObjectExpression); if (parentObject is ScribanTextLine) { ScribanTextLine textLine = (ScribanTextLine)parentObject; return(await _languageKeyGenerator.GetDialogTextLineKey(textLine.NodeObject.Id, textLine.NodeObject.Name, textLine.IsPlayerLine?ExportConstants.LanguageKeyTypePlayer : ExportConstants.LanguageKeyTypeNpc, textLine.NodeId, textLine.UnescapedTextLine)); } } else if (callHierarchy[callHierarchy.Count - 1] == choiceText || callHierarchy[callHierarchy.Count - 1] == addQuestText || callHierarchy[callHierarchy.Count - 1] == floatingTextData) { ScriptNode parentObjectExpression = BuildParentObjectValueScriptExpression(callHierarchy); object parentObject = templateContext.Evaluate(parentObjectExpression); if (parentObject is ScribanChoiceOption) { ScribanChoiceOption choiceOption = (ScribanChoiceOption)parentObject; return(await _languageKeyGenerator.GetDialogTextLineKey(choiceOption.ParentChoice.NodeObject.Id, choiceOption.ParentChoice.NodeObject.Name, ExportConstants.LanguageKeyTypeChoice, string.Format("{0}_{1}", choiceOption.ParentChoice.NodeId, choiceOption.Id), choiceOption.UnescapedText)); } else if (parentObject is ScribanAddQuestTextActionData) { ScribanAddQuestTextActionData addQuestTextData = (ScribanAddQuestTextActionData)parentObject; return(await _languageKeyGenerator.GetDialogTextLineKey(addQuestTextData.FlexFieldObject.Id, addQuestTextData.Quest.Name, ExportConstants.LanguageKeyTypeQuest, addQuestTextData.NodeStep.Id, addQuestTextData.UnescapedText)); } else if (parentObject is ScribanShowFloatingTextActionData) { ScribanShowFloatingTextActionData showFloatingTextData = (ScribanShowFloatingTextActionData)parentObject; string languageKeyType = ExportConstants.LanguageKeyTypeNpc; if (showFloatingTextData.TargetNpc != null && showFloatingTextData.TargetNpc.IsPlayer) { languageKeyType = ExportConstants.LanguageKeyTypePlayer; } return(await _languageKeyGenerator.GetDialogTextLineKey(showFloatingTextData.FlexFieldObject.Id, showFloatingTextData.FlexFieldObject.Name, languageKeyType, showFloatingTextData.NodeStep.Id, showFloatingTextData.UnescapedText)); } } _errorCollection.AddCanNotGenerateLanguageKey(ScribanErrorUtil.FormatScribanSpan(callerContext.Span)); return("<<UNSUPPORTED PROPERTY FOR LANGKEY>>"); }