/// <summary> /// Renders a tokens representation if the value (or interpolated value result) /// 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 the token if the resolved value is not truthy</returns> public string Render(Writer writer, Context context, IDictionary<string, string> partials, string originalTemplate) { var value = context.Lookup(Value); value = InterpolateLambdaValueIfPossible(value, writer, context, partials); return !context.IsTruthyValue(value) ? writer.RenderTokens(ChildTokens, context, partials, originalTemplate) : null; }
/// <summary> /// Renders a named partial template if one exists with the given context /// </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 partial template</returns> public string Render(Writer writer, Context context, IDictionary<string, string> partials, string originalTemplate) { var value = partials != null && partials.ContainsKey(Value) ? partials[Value] : null; if (value == null && context.Registry.PartialTemplateLoader != null) { value = context.Registry.PartialTemplateLoader.Load(Value); } return value != null ? writer.RenderTokens(writer.Parse(value), context, partials, value) : null; }
/// <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(); }