public async Task <PreviewResult> Preview(PrintingPreviewTemplate template, PrintArguments args, CancellationToken cancellation) { await Initialize(cancellation); var parameters = template.Parameters?.Select(e => new AbstractParameter(e.Key, e.Control)); var abstractTemplate = new AbstractPrintingTemplate(template.Body, template.DownloadName, template.Context, parameters); var(body, downloadName) = await PrintImpl(abstractTemplate, args, cancellation); return(new PreviewResult(body, downloadName)); }
private async Task <(string body, string fileName)> PrintImpl(AbstractPrintingTemplate template, PrintArguments args, CancellationToken cancellation) { // (1) The templates var nameP = new TemplatePlanLeaf(template.DownloadName, TemplateLanguage.Text); var bodyP = new TemplatePlanLeaf(template.Body, TemplateLanguage.Html); TemplatePlan plan = new TemplatePlanTuple(nameP, bodyP); if (!string.IsNullOrWhiteSpace(template.Context)) { plan = new TemplatePlanDefine("$", template.Context, plan); } // (2) Functions + Variables var globalFunctions = new Dictionary <string, EvaluationFunction>(); var localFunctions = new Dictionary <string, EvaluationFunction>(); var globalVariables = new Dictionary <string, EvaluationVariable>(); var localVariables = BaseUtil.CustomLocalVariables(args, template.Parameters?.Select(e => e.Key)); await FactBehavior.SetPrintingFunctions(localFunctions, globalFunctions, cancellation); await FactBehavior.SetPrintingVariables(localVariables, globalVariables, cancellation); // (3) Generate output CultureInfo culture = GetCulture(args.Culture); var genArgs = new TemplateArguments(globalFunctions, globalVariables, localFunctions, localVariables, culture: culture); await _templateService.GenerateFromPlan(plan : plan, args : genArgs, cancellation : cancellation); var downloadName = nameP.Outputs[0]; var body = bodyP.Outputs[0]; // Use a default download name if none is provided if (string.IsNullOrWhiteSpace(downloadName)) { downloadName = "File.html"; } if (!downloadName.ToLower().EndsWith(".html")) { downloadName += ".html"; } // Return as a file return(new(body, downloadName)); }