Skip to content

Commit 3cdec11

Browse files
committed
Add shuffle filter.
1 parent da97735 commit 3cdec11

3 files changed

Lines changed: 33 additions & 0 deletions

File tree

Lombiq.HelpfulExtensions/Extensions/Liquid/Readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Adds various Liquid tags and filters. For more information about Liquid in Orcha
1212
- `is_not_empty`: Returns `true` if the input is not null and not empty.
1313
- `shapes_build_display: 'Summary'`: Behaves the same way as the built-in `shape_build_display` filter, except both the input and output are arrays for bulk operation (e.g. from queries).
1414
- `shapes_render`: Behaves the same way as the built-in `shape_render` filter, except both the input and output are arrays for bulk operation (e.g. from queries).
15+
- `shuffle`: If the input is an array, it returns a new array where the input's items are sorted in a random order.
1516

1617
### Array filter example
1718

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using Fluid;
2+
using Fluid.Values;
3+
using Lombiq.HelpfulLibraries.Common.Utilities;
4+
using OrchardCore.Liquid;
5+
using System.Linq;
6+
using System.Threading.Tasks;
7+
8+
namespace Lombiq.HelpfulExtensions.Extensions.Liquid.Services;
9+
10+
public class ShuffleFilter : ILiquidFilter
11+
{
12+
public ValueTask<FluidValue> ProcessAsync(
13+
FluidValue input,
14+
FilterArguments arguments,
15+
LiquidTemplateContext context)
16+
{
17+
if (input is not ArrayValue { Values: { Count: > 0 } values })
18+
{
19+
return ValueTask.FromResult(input);
20+
}
21+
22+
var random = new NonSecurityRandomizer();
23+
var shuffled = values
24+
.Select(item => (Item: item, Sort: random.Get()))
25+
.OrderBy(pair => pair.Sort)
26+
.Select(pair => pair.Item)
27+
.ToArray();
28+
29+
return FluidValue.Create(shuffled, context.Options);
30+
}
31+
}

Lombiq.HelpfulExtensions/Extensions/Liquid/Startup.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ public override void ConfigureServices(IServiceCollection services)
1515
services.AddLiquidParserTag<AssignArrayParserBlock>("assign_array");
1616
services.AddLiquidFilter<ShapesBuildDisplayFilter>("shapes_build_display");
1717
services.AddLiquidFilter<ShapesRenderFilter>("shapes_render");
18+
services.AddLiquidFilter<ShuffleFilter>("shuffle");
1819
}
1920
}

0 commit comments

Comments
 (0)