diff --git a/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs b/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs index 57e135981..890b9c26c 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs @@ -7,9 +7,11 @@ using System; using Jint; +using Jint.Native; using Jint.Native.Object; using Jint.Parser; using Jint.Runtime; +using Jint.Runtime.Interop; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Scripting.ContentWrapper; using Squidex.Infrastructure; @@ -150,11 +152,32 @@ namespace Squidex.Domain.Apps.Core.Scripting } engine.SetValue("ctx", contextInstance); - engine.SetValue("slugify", new Func(x => x.Slugify())); + + engine.SetValue("slugify", new ClrFunctionInstance(engine, Slugify)); return engine; } + private static JsValue Slugify(JsValue thisObject, JsValue[] arguments) + { + try + { + var stringInput = TypeConverter.ToString(arguments.At(0)); + var single = false; + + if (arguments.Length > 1) + { + single = TypeConverter.ToBoolean(arguments.At(1)); + } + + return stringInput.Slugify(null, single); + } + catch + { + return JsValue.Undefined; + } + } + private static void EnableDisallow(Engine engine) { engine.SetValue("disallow", new Action(message => diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs index 13acf8402..ac60cd8ff 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs @@ -147,16 +147,16 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting new NamedContentData() .AddField("title", new ContentFieldData() - .AddValue("iv", "Hello World")); + .AddValue("iv", "4 Häuser")); var expected = new NamedContentData() .AddField("title", new ContentFieldData() - .AddValue("iv", "Hello World")) + .AddValue("iv", "4 Häuser")) .AddField("slug", new ContentFieldData() - .AddValue("iv", "hello-world")); + .AddValue("iv", "4-haeuser")); var context = new ScriptContext { Data = content }; @@ -170,6 +170,36 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting Assert.Equal(expected, result); } + [Fact] + public void Should_slugify_value_with_single_char() + { + var content = + new NamedContentData() + .AddField("title", + new ContentFieldData() + .AddValue("iv", "4 Häuser")); + + var expected = + new NamedContentData() + .AddField("title", + new ContentFieldData() + .AddValue("iv", "4 Häuser")) + .AddField("slug", + new ContentFieldData() + .AddValue("iv", "4-hauser")); + + var context = new ScriptContext { Data = content }; + + var result = scriptEngine.Transform(context, @" + var data = ctx.data; + + data.slug = { iv: slugify(data.title.iv, true) }; + + replace(data);"); + + Assert.Equal(expected, result); + } + [Fact] public void Should_transform_content_and_return_with_execute_transform() {