/// <summary> /// Returns the value or if a lambda the result of the lambda (or interpolated value result) /// </summary> /// <param name="value">the value to be checked and possibly interpolated</param> /// <param name="writer">The writer to write the token to</param> /// <param name="context">The context to discover values from</param> /// <param name="partials">The partial templates available to the token</param> /// <returns>The rendered result of the token</returns> public object InterpolateLambdaValueIfPossible(object value, Writer writer, Context context, IDictionary<string, string> partials) { var functionValueDynamic = value as Func<dynamic, object>; var functionValue = value as Func<object>; if (functionValueDynamic == null && functionValue == null) { return value; } object functionResult = functionValueDynamic != null ? functionValueDynamic.Invoke(context.View) : functionValue.Invoke(); var resultString = functionResult.ToString(); return resultString.Contains("{{") ? writer.Render(resultString, context, partials) : resultString; }
/// <summary> /// Returns the rendered result of all the child tokens of the section /// if the token value is truthy /// </summary> /// <param name="writer">The writer to write the token to</param> /// <param name="context">The context to discover values from</param> /// <param name="partials">The partial templates available to the token</param> /// <param name="originalTemplate">The original template</param> /// <returns>The rendered result of all the sections children</returns> public string Render(Writer writer, Context context, IDictionary<string, string> partials, string originalTemplate) { var buffer = new StringBuilder(); var value = context.Lookup(Value); if (!context.IsTruthyValue(value)) { return null; } if (value is IEnumerable && !EnumerableBlacklist.Any(x => x.IsInstanceOfType(value))) { var arrayValue = value as IEnumerable; foreach (var v in arrayValue) { buffer.Append(writer.RenderTokens(ChildTokens, context.Push(v), partials, originalTemplate)); } } else if (value is IEnumerator) { var enumeratorValue = value as IEnumerator; while (enumeratorValue.MoveNext()) { buffer.Append(writer.RenderTokens(ChildTokens, context.Push(enumeratorValue.Current), partials, originalTemplate)); } } else if (value is Func<dynamic, string, object> || value is Func<string, object>) { var functionDynamicValue = value as Func<dynamic, string, object>; var functionStringValue = value as Func<string, object>; var sectionContent = originalTemplate.Slice(End, ParentSectionEnd); value = functionDynamicValue != null ? functionDynamicValue.Invoke(context.View, sectionContent) : functionStringValue.Invoke(sectionContent); value = writer.Render(value.ToString(), context, partials, Tags); if (value != null) { buffer.Append(value); } } else if (value is IDictionary || value != null) { buffer.Append(writer.RenderTokens(ChildTokens, context.Push(value), partials, originalTemplate)); } return buffer.ToString(); }