/// <summary> /// Renders the specified context. /// </summary> /// <param name="context">The context.</param> /// <param name="result">The result.</param> public override void OnRender(ILavaRenderContext context, TextWriter result) { var engine = context.GetService <ILavaEngine>(); var tags = engine.GetRegisteredElements(); if (!tags.Any()) { return; } var tagList = new StringBuilder(); tagList.Append("<strong>Lava Tag List</strong>"); tagList.Append("<ul>"); foreach (var kvp in tags.OrderBy(t => t.Key)) { var tag = kvp.Value; var tagName = LavaUtilityHelper.GetShortcodeNameFromLiquidElementName(tag.Name); tagList.Append($"<li>{tagName} - {tag.SystemTypeName}</li>"); } tagList.Append("</ul>"); result.Write(tagList.ToString()); base.OnRender(context, result); }
/// <summary> /// Merges the lava. /// </summary> /// <param name="lavaTemplate">The lava template.</param> /// <param name="context">The context.</param> /// <returns></returns> private string MergeLava(string lavaTemplate, ILavaRenderContext context) { // Resolve the Lava template contained in this block in a new context. var engine = context.GetService <ILavaEngine>(); var newContext = engine.NewRenderContext(); newContext.SetMergeFields(context.GetMergeFields()); newContext.SetInternalFields(context.GetInternalFields()); // Resolve the inner template. var result = engine.RenderTemplate(lavaTemplate, LavaRenderParameters.WithContext(newContext)); return(result.Text); }
/// <summary> /// Processes the Lava code in the source string. /// </summary> /// <param name="input">The lava source to process.</param> /// <example><![CDATA[ /// {% capture lava %}{% raw %}{% assign test = "hello" %}{{ test }}{% endraw %}{% endcapture %} /// {{ lava | RunLava }} /// ]]></example> public static string RunLava(ILavaRenderContext context, object input) { if (input == null) { return(null); } // Perform a safety check to avoid an unrecoverable recursion. // To minimize the resource impact of an unintentional infinite loop, this mechanism could be replaced with more specific recursion tracking in the Lava context. System.Runtime.CompilerServices.RuntimeHelpers.EnsureSufficientExecutionStack(); var engine = context.GetService <ILavaEngine>(); var result = engine.RenderTemplate(input.ToString(), new LavaRenderParameters { Context = context }); return(result.Text); }
/// <summary> /// Renders the specified context. /// </summary> /// <param name="context">The context.</param> /// <param name="result">The result.</param> public override void OnRender(ILavaRenderContext context, TextWriter result) { var rockContext = LavaHelper.GetRockContextFromLavaContext(context); // Get enabled security commands _enabledSecurityCommands = context.GetEnabledCommands().JoinStrings(","); using (TextWriter writer = new StringWriter()) { bool filterProvided = false; base.OnRender(context, writer); var parms = ParseMarkup(_markup, context); var lookAheadDays = parms[LOOK_AHEAD_DAYS].AsInteger(); var scheduleCategoryId = parms[SCHEDULE_CATEGORY_ID].AsIntegerOrNull(); var asAtDate = parms[AS_AT_DATE].AsDateTime(); var now = asAtDate ?? RockDateTime.Now; var scheduleIds = new List <int>(); var requestedSchedules = parms[SCHEDULE_ID].StringToIntList(); var schedulesQry = new ScheduleService(rockContext).Queryable().AsNoTracking() .Where(s => s.IsActive == true); if (requestedSchedules.Count() > 0) { schedulesQry = schedulesQry.Where(s => requestedSchedules.Contains(s.Id)); filterProvided = true; } if (scheduleCategoryId.HasValue) { schedulesQry = schedulesQry.Where(s => s.CategoryId == scheduleCategoryId.Value); filterProvided = true; } // If neither a schedule id nor a schedule category id was provided stop if (!filterProvided) { return; } // Get the schedules are order them by the next start time var schedules = schedulesQry.ToList() .Where(s => s.GetNextStartDateTime(now) != null) .OrderBy(s => s.GetNextStartDateTime(now)); if (schedules.Count() == 0) { return; } var nextSchedule = schedules.FirstOrDefault(); var nextStartDateTime = nextSchedule.GetNextStartDateTime(now); var isLive = false; DateTime?occurrenceEndDateTime = null; // Determine if we're live if (nextSchedule.WasScheduleActive(now)) { isLive = true; var occurrences = nextSchedule.GetICalOccurrences(now, now.AddDays(lookAheadDays)).Take(2); var activeOccurrence = occurrences.FirstOrDefault(); occurrenceEndDateTime = (DateTime)activeOccurrence.Period.EndTime.Value; // Set the next occurrence to be the literal next occurrence (vs the current occurrence) nextStartDateTime = null; if (occurrences.Count() > 1) { nextStartDateTime = occurrences.Last().Period.EndTime.Value; } } // Determine when not to show the content if ((parms[SHOW_WHEN] == "notlive" && isLive) || (parms[SHOW_WHEN] == "live" && !isLive)) { return; } // Check role membership var roleId = parms[ROLE_ID].AsIntegerOrNull(); if (roleId.HasValue) { var currentPerson = GetCurrentPerson(context); var isInRole = new GroupMemberService(rockContext).Queryable() .Where(m => m.GroupId == roleId && m.PersonId == currentPerson.Id ) .Any(); if (!isInRole) { return; } } var mergeFields = context.GetMergeFields(); mergeFields.Add("NextOccurrenceDateTime", nextStartDateTime); mergeFields.Add("OccurrenceEndDateTime", occurrenceEndDateTime); mergeFields.Add("Schedule", nextSchedule); mergeFields.Add("IsLive", isLive); var engine = context.GetService <ILavaEngine>(); var renderContext = engine.NewRenderContext(mergeFields, _enabledSecurityCommands.SplitDelimitedValues()); var results = engine.RenderTemplate(_blockMarkup.ToString(), LavaRenderParameters.WithContext(renderContext)); result.Write(results.Text.Trim()); } }