public IRawString htmlDump(TemplateScopeContext scope, object target, object scopeOptions) { var scopedParams = scope.AssertOptions(nameof(htmlDump), scopeOptions); var depth = scopedParams.TryGetValue("depth", out object oDepth) ? (int)oDepth : 0; var childDepth = scopedParams.TryGetValue("childDepth", out object oChildDepth) ? oChildDepth.ConvertTo <int>() : 1; scopedParams["depth"] = depth + 1; try { if (!isComplexType(target)) { return(GetScalarHtml(target).ToRawString()); } scopedParams.TryGetValue("captionIfEmpty", out object captionIfEmpty); scopedParams.TryGetValue("headerStyle", out object oHeaderStyle); scopedParams.TryGetValue("className", out object parentClass); scopedParams.TryGetValue("childClass", out object childClass); var headerStyle = oHeaderStyle as string ?? "splitCase"; var className = ((depth < childDepth ? parentClass : childClass ?? parentClass) ?? Context.Args[TemplateConstants.DefaultTableClassName]).ToString(); if (target is IEnumerable e) { var objs = e.Map(x => x); var isEmpty = objs.Count == 0; if (isEmpty && captionIfEmpty == null) { return(RawString.Empty); } var first = !isEmpty ? objs[0] : null; if (first is IDictionary) { return(htmlList(scope, target, scopeOptions)); } var sb = StringBuilderCacheAlt.Allocate(); sb.Append("<table"); if (scopedParams.TryGetValue("id", out object id)) { sb.Append(" id=\"").Append(id).Append("\""); } if (className != null) { sb.Append(" class=\"").Append(className).Append("\""); } sb.Append(">"); scopedParams.TryGetValue("caption", out object caption); if (isEmpty) { caption = captionIfEmpty; } if (caption != null) { sb.Append("<caption>").Append(caption.ToString().HtmlEncode()).Append("</caption>"); } if (!isEmpty) { sb.Append("<tbody>"); if (first is KeyValuePair <string, object> ) { foreach (var o in objs) { if (o is KeyValuePair <string, object> kvp) { sb.Append("<tr>"); sb.Append("<th>"); sb.Append(Context.DefaultFilters?.textStyle(kvp.Key, headerStyle)?.HtmlEncode()); sb.Append("</th>"); sb.Append("<td>"); if (!isComplexType(kvp.Value)) { sb.Append(GetScalarHtml(kvp.Value)); } else { var body = htmlDump(scope, kvp.Value, scopeOptions); sb.Append(body.ToRawString()); } sb.Append("</td>"); sb.Append("</tr>"); } } } else if (!isComplexType(first)) { foreach (var o in objs) { sb.Append("<tr>"); sb.Append("<td>"); sb.Append(GetScalarHtml(o)); sb.Append("</td>"); sb.Append("</tr>"); } } else { if (objs.Count > 1) { var rows = objs.Map(x => x.ToObjectDictionary()); sb.Append("<tr>"); sb.Append("<td>"); var list = htmlList(scope, rows, scopeOptions); sb.Append(list.ToRawString()); sb.Append("</td>"); sb.Append("</tr>"); } else { foreach (var o in objs) { sb.Append("<tr>"); if (!isComplexType(o)) { sb.Append("<td>"); sb.Append(GetScalarHtml(o)); sb.Append("</td>"); } else { sb.Append("<td>"); var body = htmlDump(scope, o, scopeOptions); sb.Append(body.ToRawString()); sb.Append("</td>"); } sb.Append("</tr>"); } } } sb.Append("</tbody>"); } sb.Append("</table>"); var html = StringBuilderCacheAlt.ReturnAndFree(sb); return(html.ToRawString()); } return(htmlDump(scope, target.ToObjectDictionary(), scopeOptions)); } finally { scopedParams["depth"] = depth; } }
public object throwUnauthorizedAccessException(TemplateScopeContext scope, string message, object options) => new UnauthorizedAccessException(message).InStopFilter(scope, options);
public object throwOptimisticConcurrencyException(TemplateScopeContext scope, string message, object options) => new Data.OptimisticConcurrencyException(message).InStopFilter(scope, options);
public object skipExecutingFiltersOnError(TemplateScopeContext scope) { scope.PageResult.SkipExecutingFiltersIfError = true; return(StopExecution.Value); }
public object throwNotSupportedException(TemplateScopeContext scope, string message) => new NotSupportedException(message).InStopFilter(scope, null);
public object ifThrowArgumentNullException(TemplateScopeContext scope, bool test, string paramName) => test ? new ArgumentNullException(paramName).InStopFilter(scope, null) : StopExecution.Value;
public object throwArgumentException(TemplateScopeContext scope, string message) => new ArgumentException(message).InStopFilter(scope, null);
public static Task WritePageAsync(this TemplateScopeContext scope) => scope.PageResult.WritePageAsync(scope.Page, scope);
public static TemplateScopeContext ScopeWithStream(this TemplateScopeContext scope, Stream stream) => new TemplateScopeContext(scope.PageResult, stream, scope.ScopedParams);
public IRawString htmlErrorDebug(TemplateScopeContext scope) => htmlErrorDebug(scope, scope.PageResult.LastFilterError);
[HandleUnknownValue] public IRawString htmlErrorDebug(TemplateScopeContext scope, object ex) => htmlErrorDebug(scope, ex as Exception ?? scope.PageResult.LastFilterError, ex as Dictionary <string, object>);
public IRawString htmlErrorMessage(TemplateScopeContext scope) => htmlErrorMessage(scope.PageResult.LastFilterError);
[HandleUnknownValue] public IRawString htmlError(TemplateScopeContext scope, Exception ex, object options) => Context.DebugMode ? htmlErrorDebug(scope, ex, options) : htmlErrorMessage(ex, options);
[HandleUnknownValue] public IRawString htmlError(TemplateScopeContext scope, Exception ex) => htmlError(scope, ex, null);
public object ifThrowArgumentException(TemplateScopeContext scope, bool test, string message, string paramName, object options) => test ? new ArgumentException(message, paramName).InStopFilter(scope, options) : StopExecution.Value;
public static async Task WritePageAsync(this TemplateScopeContext scope, TemplatePage page, TemplateCodePage codePage, Dictionary <string, object> pageParams, CancellationToken token = default(CancellationToken)) { await scope.PageResult.WritePageAsync(page, codePage, scope.ScopeWithParams(pageParams), token); }
public object skipExecutingFiltersOnError(TemplateScopeContext scope, object ignoreTarget) => skipExecutingFiltersOnError(scope);
public static object EvaluateToken(this TemplateScopeContext scope, JsToken token) { var result = scope.PageResult.EvaluateToken(scope, token); return(result); }
public object throwArgumentNullExceptionIf(TemplateScopeContext scope, string paramName, bool test, object options) => test ? new ArgumentNullException(paramName).InStopFilter(scope, options) : StopExecution.Value;
public static object GetValue(this TemplateScopeContext scope, string name) { return(scope.PageResult.GetValue(name, scope)); }
public object throwArgumentException(TemplateScopeContext scope, string message, string options) => ifThrowArgumentException(scope, true, message, options);
public object assignError(TemplateScopeContext scope, string errorBinding) { scope.PageResult.AssignExceptionsTo = errorBinding; return(StopExecution.Value); }
public object throwArgumentNullException(TemplateScopeContext scope, string paramName, object options) => new ArgumentNullException(paramName).InStopFilter(scope, options);
public object ensureAnyArgsNotEmpty(TemplateScopeContext scope, object args) => ensureAnyArgsNotEmpty(scope, args, null);
public object throwNotImplementedException(TemplateScopeContext scope, string message, object options) => new NotImplementedException(message).InStopFilter(scope, options);
public object ifthrow(TemplateScopeContext scope, bool test, string message) => test ? new Exception(message).InStopFilter(scope, null) : StopExecution.Value;
public object throwFileNotFoundException(TemplateScopeContext scope, string message, object options) => new FileNotFoundException(message).InStopFilter(scope, options);
public object throwIf(TemplateScopeContext scope, string message, bool test, object options) => test ? new Exception(message).InStopFilter(scope, options) : StopExecution.Value;
public async Task <object> @throwAsync(TemplateScopeContext scope, string message, object options) { await Task.Yield(); return(new Exception(message).InStopFilter(scope, options)); }
public IRawString htmlList(TemplateScopeContext scope, object target, object scopeOptions) { if (target is IDictionary <string, object> single) { target = new[] { single } } ; var items = target.AssertEnumerable(nameof(htmlList)); var scopedParams = scope.AssertOptions(nameof(htmlList), scopeOptions); var depth = scopedParams.TryGetValue("depth", out object oDepth) ? (int)oDepth : 0; var childDepth = scopedParams.TryGetValue("childDepth", out object oChildDepth) ? oChildDepth.ConvertTo <int>() : 1; scopedParams["depth"] = depth + 1; try { scopedParams.TryGetValue("className", out object parentClass); scopedParams.TryGetValue("childClass", out object childClass); var className = ((depth < childDepth ? parentClass : childClass ?? parentClass) ?? Context.Args[TemplateConstants.DefaultTableClassName]).ToString(); scopedParams.TryGetValue("headerStyle", out object oHeaderStyle); scopedParams.TryGetValue("headerTag", out object oHeaderTag); scopedParams.TryGetValue("captionIfEmpty", out object captionIfEmpty); var headerTag = oHeaderTag as string ?? "th"; var headerStyle = oHeaderStyle as string ?? "splitCase"; var sbHeader = StringBuilderCache.Allocate(); var sbRows = StringBuilderCacheAlt.Allocate(); List <string> keys = null; foreach (var item in items) { if (item is IDictionary <string, object> d) { if (keys == null) { keys = d.Keys.ToList(); sbHeader.Append("<tr>"); foreach (var key in keys) { sbHeader.Append('<').Append(headerTag).Append('>'); sbHeader.Append(Context.DefaultFilters?.textStyle(key, headerStyle)?.HtmlEncode()); sbHeader.Append("</").Append(headerTag).Append('>'); } sbHeader.Append("</tr>"); } sbRows.Append("<tr>"); foreach (var key in keys) { var value = d[key]; sbRows.Append("<td>"); if (!isComplexType(value)) { sbRows.Append(GetScalarHtml(value)); } else { var htmlValue = htmlDump(scope, value, scopeOptions); sbRows.Append(htmlValue.ToRawString()); } sbRows.Append("</td>"); } sbRows.Append("</tr>"); } } var isEmpty = sbRows.Length == 0; if (isEmpty && captionIfEmpty == null) { return(RawString.Empty); } var htmlHeaders = StringBuilderCache.ReturnAndFree(sbHeader); var htmlRows = StringBuilderCacheAlt.ReturnAndFree(sbRows); var sb = StringBuilderCache.Allocate(); sb.Append("<table"); if (scopedParams.TryGetValue("id", out object id)) { sb.Append(" id=\"").Append(id).Append("\""); } if (!string.IsNullOrEmpty(className)) { sb.Append(" class=\"").Append(className).Append("\""); } sb.Append(">"); scopedParams.TryGetValue("caption", out object caption); if (isEmpty) { caption = captionIfEmpty; } if (caption != null) { sb.Append("<caption>").Append(caption.ToString().HtmlEncode()).Append("</caption>"); } if (htmlHeaders.Length > 0) { sb.Append("<thead>").Append(htmlHeaders).Append("</thead>"); } if (htmlRows.Length > 0) { sb.Append("<tbody>").Append(htmlRows).Append("</tbody>"); } sb.Append("</table>"); var html = StringBuilderCache.ReturnAndFree(sb); return(html.ToRawString()); } finally { scopedParams["depth"] = depth; } }