예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }
예제 #4
0
        /// <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());
            }
        }