private async Task NotifyUser(SummaryViewModel summary, RazorLightEngine razor, SmtpClient smtpClient) { if (!summary.Users.Any()) { Logger.Warn("Not sending user notification, no users to notify"); return; } string subjectTemplate = File.ReadAllText(Path.Combine(new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName, "Views", "UserSubject", "Template.cshtml")); string bodyTemplate = File.ReadAllText(Path.Combine(new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName, "Views", "UserBody", "Template.cshtml")); ExpandoObject viewBag = new { SonarUrl }.ToExpando(); foreach (UserViewModel model in summary.Users) { if (IgnoredRecipients.Contains(model.User.Key) || (RecipientFilter.Any() && !RecipientFilter.Contains(model.User.Key))) { Logger.Info($"Not sending mail to: {model.User.Key}, recipient ignored"); continue; } await DoSendMessage( smtpClient : smtpClient, recipient : model.User.EmailAddress, subject : (await razor.CompileRenderStringAsync("user-subject", subjectTemplate, model, viewBag).OnAnyThread()).Trim(), message : (await razor.CompileRenderStringAsync("user-body", bodyTemplate, model, viewBag).OnAnyThread()).Trim()).OnAnyThread(); } }
/// <summary> /// ソースを生成する /// </summary> /// <param name="model">モデル</param> /// <param name="engine">エンジン</param> /// <returns></returns> private async Task <List <dynamic> > GenerateSource(dynamic model, RazorLightEngine engine) { var generatedSource = new List <dynamic>(); for (int i = 0; i < model.RootList.Count; i++) { // 変数入れる model.General.Index = i.ToString(); // テンプレート読み込み var template = GetTemplate((string)model.RootList[i].RazorTemplate); // ソース生成 // 同じキーを指定すると登録したスクリプトを使いまわすことが出来るが、何故か2回目以降Unicodeにされるので毎回違うキーを使う。 var name = $"{model.RootList[i].Name + i}"; try { generatedSource.Add(await engine.CompileRenderStringAsync(name, template, model)); } catch (Exception e) { // 生成で何かエラーがあったらここ。 throw e; } } return(generatedSource); }
/// <summary> /// ソースを生成する /// 外部用 /// </summary> /// <param name="excel">Excel</param> /// <param name="engine">エンジン</param> /// <returns>[Name][生成結果]:Outが無かったらNull</returns> private async Task <Dictionary <string, string> > GenerateOut(Dictionary <string, List <List <string> > > excel, RazorLightEngine engine) { if (excel.ContainsKey("Out")) { // Outの入力を作成する dynamic model; model = RazorHelper.CreateOutModel(excel); var generatedSource = new Dictionary <string, string>(); for (int i = 0; i < model.RootList.Count; i++) { // 変数入れる model.General.Index = i.ToString(); // テンプレート読み込み var template = GetTemplate((string)model.RootList[i].RazorTemplate); // ソース生成 // 同じキーを指定すると登録したスクリプトを使いまわすことが出来るが、何故か2回目以降Unicodeにされるので毎回違うキーを使う。 generatedSource.Add((string)model.RootList[i].Name, await engine.CompileRenderStringAsync($"{model.RootList[i].Name}Out", template, model)); } // Outが無くても空ディクショナリを返す return(generatedSource); } return(null); }
public string Convert(dynamic data, string templateData, bool ifErrorTrySerializeAndDeserialize) { try { if (templateData == null || data == null) { return(string.Empty); } if (!templateData.Contains("#pragma warning disable")) { templateData = $"@{{#pragma warning disable}}\n@using System;@using System.Linq;@using System.Collections.Generic;\n{templateData}"; } if (RazorConfigSettings.RazorViolationStrings.Any(templateData.Contains)) { throw new RazorViolationException($"Invalid assembly reference"); } var result = engine.CompileRenderStringAsync(GetTemplateCachedId(templateData), templateData, data, (ExpandoObject)null).Result; _log.Debug($"RAZOR:\n{result}"); return(result); } catch (RazorViolationException re) { _log.Error($"Invalid assembly reference: \n{templateData}", re); _log.Debug($"Invalid assembly reference: {JsonConvert.SerializeObject(data)}\n\n{templateData}", re); throw; } catch (Exception e) { //TODO: Jdv See if netcore 3 version has this fixed if (ifErrorTrySerializeAndDeserialize && e.Message.Contains("definition")) // Workaround for missing member errors in razor { try { var dataUnboxed = JsonConvert.DeserializeObject <dynamic>(JsonConvert.SerializeObject(data)); return(Convert(dataUnboxed, templateData, false)); } catch (JsonSerializationException jsonEx) { if (jsonEx.Message.Contains("ManifestModule")) { _logParseError(data, templateData, e, false); throw new RazorParsingException(e.Message); } _logParseError(data, templateData, jsonEx, false); throw new RazorParsingException(jsonEx.Message); } catch (Exception innerException) { _logParseError(data, templateData, innerException); throw new RazorParsingException(innerException.Message); } } _logParseError(data, templateData, e); throw new RazorParsingException(e.Message); } }
public async Task <string> Transform(string content, string key, IContextModel model) { var html = Regex.Replace(content, @"^@page(\r\n|\r|\n)", ""); if (!string.IsNullOrEmpty(html)) { html = await m_RazorEngine.CompileRenderStringAsync( key, html, model); } return(html); }
public async Task <ICollection <KeyValuePair <string, object> > > Translate(RazorLightEngine templateEngine, Dictionary <string, string> translations, object model, string languageHint, string type) { var renderData = (ICollection <KeyValuePair <string, object> >) new ExpandoObject(); foreach (var item in translations) { var cacheKey = $"{item.Key}-{languageHint}-{type}"; var toAdd = new KeyValuePair <string, object>(item.Key, await templateEngine.CompileRenderStringAsync(cacheKey, item.Value, model)); renderData.Add(toAdd); } return(renderData); }
internal async Task CompileTemplates() { var templates = GetTemplates(); foreach (var template in templates) { var typeName = string.Concat("Email.Templates.Models.", template.Name); var type = Type.GetType(typeName); var instance = Activator.CreateInstance(type); await razorEngine.CompileRenderStringAsync(typeName, template.UnparsedTemplate, instance); } }
private async Task NotifySummary(SummaryViewModel summary, RazorLightEngine razor, SmtpClient smtpClient) { if (!SummaryRecipients.Any()) { Logger.Warn("Not sending summary, no recipients defined"); return; } string subjectTemplate = File.ReadAllText(Path.Combine(new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName, "Views", "SummarySubject", "Template.cshtml")); string bodyTemplate = File.ReadAllText(Path.Combine(new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName, "Views", "SummaryBody", "Template.cshtml")); ExpandoObject viewBag = new { SonarUrl }.ToExpando(); Logger.Info($"Preparing to send summary mail to: {SummaryRecipients.ToPrettyString()}"); foreach (string summaryRecipient in SummaryRecipients) { await DoSendMessage( smtpClient : smtpClient, recipient : summaryRecipient, subject : (await razor.CompileRenderStringAsync("summary-subject", subjectTemplate, summary, viewBag).OnAnyThread()).Trim(), message : (await razor.CompileRenderStringAsync("summary-body", bodyTemplate, summary, viewBag).OnAnyThread()).Trim()).OnAnyThread(); } }
protected async Task DoRazor <TModel>(TModel model, string viewLocation, string targetLocation, string cacheNameSuffix = null) { try { var name = GetType().Name + cacheNameSuffix; var sourceFileContents = File.ReadAllText(viewLocation); var generated = await Engine.CompileRenderStringAsync(name, sourceFileContents, model); WriteFormattedCsharpFile(targetLocation, generated); } catch (TemplateGenerationException e) { foreach (var d in e.Diagnostics) { Console.WriteLine(d.GetMessage()); } throw; } }
public async Task <string> MergeTemplate(Template template, Customer customer, EmailRecipient recipient, CancellationToken cancellationToken = default) { var model = new { Customer = customer, Recipient = recipient }; var cacheResult = _razorEngine.Handler.Cache.RetrieveTemplate(template.Id); if (cacheResult.Success) { _logger.LogDebug($"Found cached template for id {template.Id}"); var cachedTemplate = cacheResult.Template.TemplatePageFactory(); return(await _razorEngine.RenderTemplateAsync(cachedTemplate, model)); } return(await _razorEngine.CompileRenderStringAsync(template.Id, template.Body, model)); }
public async Task <string> ParseAsync <T>(string key, string template, T model) { return(await _engine.CompileRenderStringAsync(key, template, model)); }
public Task <string> RenderAsync <TModel>(string template, TModel model) { dynamic?viewBag = (model as IRazorModel)?.ViewBag; return(_engine.CompileRenderStringAsync <TModel>(GetTemplateKey(template), template, model, viewBag)); }
public Task <string> ParseAsync <T>(string template, T model, bool isHtml = true) { dynamic viewBag = (model as IViewBagModel)?.ViewBag; return(_engine.CompileRenderStringAsync <T>(GetHashString(template), template, model, viewBag)); }
public async Task <string> ProcessTemplateAsync(string name, string template, object model) { return(await _engine.CompileRenderStringAsync(name, template, model)); }
public async Task <RenderResult> RenderAsync(string path, object model, dynamic viewBag, RouteValueDictionary routevalues, string area, ViewType viewType) { var re = new RenderResult { Html = "", Status = 200 }; if (string.IsNullOrEmpty(path) || path.Equals("/")) { return(re); } var nomarlPath = path; try { if (routevalues != null && routevalues.ContainsKey("url")) { path = routevalues["url"].ToString(); } //只拿第一层路径 var entryPointName = path.Split('/').FirstOrDefault(); if (string.IsNullOrEmpty(entryPointName)) { return(re); } entryPointName = entryPointName.ToLowerInvariant(); var indexHtml = new FileModel(_hostingEnvironment, entryPointName, "index.html"); if (!indexHtml.IsExist) { return(re); } var jsonFile = new FileInfo(Path.Combine(_hostingEnvironment.WebRootPath, "appsettings.json")); if (jsonFile.Exists && (_appJsonLastWriteTime == null || _appJsonLastWriteTime != jsonFile.LastWriteTime)) { _appJsonLastWriteTime = jsonFile.LastWriteTime; try { this._appsettingsJson = Newtonsoft.Json.JsonConvert.DeserializeObject <Dictionary <string, string> >(CopyHelper.ReadAllText(jsonFile.FullName)); } catch (Exception e) { logger.Info(e.ToString()); } } var html = indexHtml.GetContent(); re.Html = html; var cacheKey = entryPointName + "_" + indexHtml.LastModifyTime.ToString("yyyMMddHHmmss"); var jsFileContent = new FileModel(_hostingEnvironment, entryPointName, "server.js"); dynamic serverJsResult = null; if (jsFileContent.IsExist) { var exports = engine .CommonJS() .RegisterInternalModule("server", typeof(Server)) .RunMain(jsFileContent.FilePath); try { var jsValue = exports.AsObject().Get("main").Invoke(new JsValue(nomarlPath)).ToString(); if (!string.IsNullOrEmpty(jsValue) && jsValue != "null" && jsValue != "undefined") { serverJsResult = JObject.Parse(jsValue); } } catch (Exception e) { logger.Error(e.ToString()); } } if (serverJsResult == null) { serverJsResult = new JObject(); } serverJsResult.Env = new JObject(); if (_appsettingsJson != null) { foreach (var jsonItem in _appsettingsJson) { serverJsResult.Env[jsonItem.Key] = jsonItem.Value; } } try { var cacheResult = _engine.Handler.Cache.RetrieveTemplate(cacheKey); if (cacheResult.Success) { var itemple = cacheResult.Template.TemplatePageFactory(); itemple.DisableEncoding = true; string result2 = await _engine.RenderTemplateAsync(itemple, serverJsResult); re.Html = result2; return(re); } string result = await _engine.CompileRenderStringAsync(cacheKey, html, serverJsResult); if (!cacheList.TryGetValue(entryPointName, out var oldCache)) { cacheList.TryAdd(entryPointName, cacheKey); } else { //之前有缓存了 就清掉 _engine.Handler.Cache.Remove(oldCache); cacheList[entryPointName] = cacheKey; } re.Html = result; } catch (Exception e) { logger.Error(e.ToString()); } } catch (Exception e1) { //ignore logger.Error(e1.ToString()); } return(re); }
public async Task <string> RenderAsync(HttpContext context) { var re = ""; var pathValue = context.Request.Path.Value !.ToString(); if (string.IsNullOrEmpty(pathValue) || pathValue.Equals("/")) { return(re); } var path = pathValue.Substring(1, pathValue.Length - 1); var nomarlPath = context.Request.GetDisplayUrl(); try { //只拿第一层路径 var entryPointName = path.Split('/').FirstOrDefault(); if (string.IsNullOrEmpty(entryPointName)) { return(re); } entryPointName = entryPointName.ToLowerInvariant(); var indexHtml = new FileModel(_hostingEnvironment, entryPointName, "index.html"); if (!indexHtml.IsExist) { return(re); } // 有 但是是文件的话 if (_contentTypeProvider.TryGetContentType(pathValue.ToLower(), out _)) { return(re); } CheckConfigRefresh(); CheckConfigRefresh(entryPointName); var html = indexHtml.GetContent(); re = html; var cacheKey = entryPointName + "_" + indexHtml.LastModifyTime.ToString("yyyMMddHHmmss"); var jsFileContent = new FileModel(_hostingEnvironment, entryPointName, "_server_.js"); dynamic serverJsResult = null; if (jsFileContent.IsExist) { var exports = engine .CommonJS() .RegisterInternalModule("server", typeof(PluginFactory)) .RunMain(jsFileContent.FilePath); try { var jsValue = exports.AsObject().Get("main").Invoke(new JsValue(nomarlPath)).ToString(); if (!string.IsNullOrEmpty(jsValue) && jsValue != "null" && jsValue != "undefined") { serverJsResult = JObject.Parse(jsValue); } } catch (Exception e) { logger.Error($"excute {ConfigHelper.ServerJsFile} fail:" + e.Message); } } if (serverJsResult == null) { serverJsResult = new JObject(); } serverJsResult.GlobalEnv = new JObject(); if (_appsettingsJson != null) { foreach (var jsonItem in _appsettingsJson) { serverJsResult.GlobalEnv[jsonItem.Key] = jsonItem.Value; } } serverJsResult.Env = new JObject(); if (_currentAppsettingsJson != null) { foreach (var jsonItem in _currentAppsettingsJson) { serverJsResult.Env[jsonItem.Key] = jsonItem.Value; } } try { var cacheResult = _engine.Handler.Cache.RetrieveTemplate(cacheKey); if (cacheResult.Success) { var itemple = cacheResult.Template.TemplatePageFactory(); itemple.DisableEncoding = true; string result2 = await _engine.RenderTemplateAsync(itemple, serverJsResult); re = result2; return(re); } string result = await _engine.CompileRenderStringAsync(cacheKey, html, serverJsResult); if (!cacheList.TryGetValue(entryPointName, out var oldCache)) { cacheList.TryAdd(entryPointName, cacheKey); } else { //之前有缓存了 就清掉 _engine.Handler.Cache.Remove(oldCache); cacheList[entryPointName] = cacheKey; } re = result; context.Response.Cookies.Append("spa_project", entryPointName); } catch (Exception e) { logger.Error(e.ToString()); } } catch (Exception e1) { //ignore logger.Error(e1.ToString()); } return(re); }