From 981a6c17c2a5f8ac08de95f65ee9d08c79a9ad57 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Fri, 28 Aug 2020 09:55:53 +0200 Subject: [PATCH] Word count V2 (#566) --- .../Schemas/SchemaExtensions.cs | 1 + .../GenerateEdmSchema/EdmSchemaExtensions.cs | 1 + .../GenerateEdmSchema/EdmTypeVisitor.cs | 2 +- .../JsonSchemaExtensions.cs | 1 + .../HandleRules/RuleEventFormatter.cs | 1 + .../HandleRules/RuleRegistry.cs | 2 +- .../Scripting/ExecutionContext.cs | 2 +- .../Extensions/StringJintExtension.cs | 2 +- .../Extensions/StringWordsJintExtension.cs | 5 +- .../Extensions/StringFluidExtension.cs | 2 +- .../Extensions/StringWordsFluidExtension.cs | 5 +- .../TextHelpers.cs | 40 - .../Visitors/FirstPascalPathExtension.cs | 2 +- .../Apps/Guards/GuardApp.cs | 1 + .../Apps/Indexes/AppsIndex.cs | 1 + .../Apps/Templates/Builders/SchemaBuilder.cs | 2 +- .../Assets/AssetSlug.cs | 2 +- .../Assets/Queries/AssetQueryParser.cs | 1 + .../Contents/ContentChangedTriggerHandler.cs | 1 + .../Contents/GraphQL/Types/Extensions.cs | 1 + .../Contents/Queries/ContentQueryParser.cs | 1 + .../Schemas/Guards/GuardSchema.cs | 1 + .../Schemas/Indexes/SchemasIndex.cs | 1 + .../EventSourcing/ProjectionClient.cs | 1 + .../Configuration/ConfigurationExtensions.cs | 1 + backend/src/Squidex.Infrastructure/Guard.cs | 1 + .../Log/Adapter/SemanticLogLogger.cs | 1 + .../Queries/PascalCasePathConverter.cs | 1 + .../Reflection/TypeNameBuilder.cs | 1 + .../Squidex.Infrastructure.csproj | 1 + .../StringExtensions.cs | 738 ------------------ .../Translations/LocalizedCompareAttribute.cs | 1 + .../Translations/LocalizedRequired.cs | 1 + .../Validation/AbsoluteUrlAttribute.cs | 1 + .../Squidex.Infrastructure/Validation/Not.cs | 1 + .../Squidex.Web/Services/StringLocalizer.cs | 1 + .../StringExtensionsTests.cs | 93 --- 37 files changed, 38 insertions(+), 883 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/SchemaExtensions.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/SchemaExtensions.cs index 97e720786..b444bbc65 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/SchemaExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/SchemaExtensions.cs @@ -9,6 +9,7 @@ using System; using System.Collections.Generic; using System.Linq; using Squidex.Infrastructure; +using Squidex.Text; namespace Squidex.Domain.Apps.Core.Schemas { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmSchemaExtensions.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmSchemaExtensions.cs index e8238b7d8..1bee2d459 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmSchemaExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmSchemaExtensions.cs @@ -8,6 +8,7 @@ using Microsoft.OData.Edm; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Infrastructure; +using Squidex.Text; namespace Squidex.Domain.Apps.Core.GenerateEdmSchema { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmTypeVisitor.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmTypeVisitor.cs index 4b1a75a5a..523a5fca5 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmTypeVisitor.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmTypeVisitor.cs @@ -7,7 +7,7 @@ using Microsoft.OData.Edm; using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Infrastructure; +using Squidex.Text; namespace Squidex.Domain.Apps.Core.GenerateEdmSchema { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs index 43a967a20..45e9bb204 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs @@ -8,6 +8,7 @@ using NJsonSchema; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Infrastructure; +using Squidex.Text; namespace Squidex.Domain.Apps.Core.GenerateJsonSchema { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs index f283ff06a..8abfe30a8 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs @@ -18,6 +18,7 @@ using Squidex.Domain.Apps.Core.Scripting; using Squidex.Domain.Apps.Core.Templates; using Squidex.Infrastructure; using Squidex.Infrastructure.Json; +using Squidex.Text; using ValueTaskSupplement; namespace Squidex.Domain.Apps.Core.HandleRules diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleRegistry.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleRegistry.cs index 7bb890577..6a0f6fab6 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleRegistry.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleRegistry.cs @@ -12,8 +12,8 @@ using System.Linq; using System.Reflection; using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules.EnrichedEvents; -using Squidex.Infrastructure; using Squidex.Infrastructure.Reflection; +using Squidex.Text; #pragma warning disable RECS0033 // Convert 'if' to '||' expression diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ExecutionContext.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ExecutionContext.cs index bad22c0af..226a13958 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ExecutionContext.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ExecutionContext.cs @@ -11,7 +11,7 @@ using System.Threading; using Jint; using Jint.Native; using Jint.Native.Object; -using Squidex.Infrastructure; +using Squidex.Text; namespace Squidex.Domain.Apps.Core.Scripting { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/StringJintExtension.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/StringJintExtension.cs index b5ddeaa57..aac6514c6 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/StringJintExtension.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/StringJintExtension.cs @@ -8,7 +8,7 @@ using System; using Jint; using Jint.Native; -using Squidex.Infrastructure; +using Squidex.Text; namespace Squidex.Domain.Apps.Core.Scripting.Extensions { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/StringWordsJintExtension.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/StringWordsJintExtension.cs index c355d88c2..c4679e49f 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/StringWordsJintExtension.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/StringWordsJintExtension.cs @@ -8,6 +8,7 @@ using System; using Jint; using Jint.Native; +using Squidex.Text; namespace Squidex.Domain.Apps.Core.Scripting.Extensions { @@ -17,7 +18,7 @@ namespace Squidex.Domain.Apps.Core.Scripting.Extensions { try { - return TextHelpers.WordCount(text); + return text.WordCount(); } catch { @@ -29,7 +30,7 @@ namespace Squidex.Domain.Apps.Core.Scripting.Extensions { try { - return TextHelpers.CharacterCount(text); + return text.CharacterCount(); } catch { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Templates/Extensions/StringFluidExtension.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Templates/Extensions/StringFluidExtension.cs index 585f8fe34..49a2aa4d7 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Templates/Extensions/StringFluidExtension.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Templates/Extensions/StringFluidExtension.cs @@ -8,7 +8,7 @@ using Fluid; using Fluid.Values; using Newtonsoft.Json; -using Squidex.Infrastructure; +using Squidex.Text; namespace Squidex.Domain.Apps.Core.Templates.Extensions { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Templates/Extensions/StringWordsFluidExtension.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Templates/Extensions/StringWordsFluidExtension.cs index 589008b56..75f5f235a 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Templates/Extensions/StringWordsFluidExtension.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Templates/Extensions/StringWordsFluidExtension.cs @@ -7,6 +7,7 @@ using Fluid; using Fluid.Values; +using Squidex.Text; namespace Squidex.Domain.Apps.Core.Templates.Extensions { @@ -14,12 +15,12 @@ namespace Squidex.Domain.Apps.Core.Templates.Extensions { private static readonly FilterDelegate WordCount = (input, arguments, context) => { - return FluidValue.Create(TextHelpers.WordCount(input.ToStringValue())); + return FluidValue.Create(input.ToStringValue().WordCount()); }; private static readonly FilterDelegate CharacterCount = (input, arguments, context) => { - return FluidValue.Create(TextHelpers.CharacterCount(input.ToStringValue())); + return FluidValue.Create(input.ToStringValue().CharacterCount()); }; public void RegisterGlobalTypes(IMemberAccessStrategy memberAccessStrategy) diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/TextHelpers.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/TextHelpers.cs index 0c8171b46..033f53d53 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/TextHelpers.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/TextHelpers.cs @@ -93,45 +93,5 @@ namespace Squidex.Domain.Apps.Core WriteTextTo(child, sb); } } - - public static int CharacterCount(string text) - { - var characterCount = 0; - - for (int i = 0; i < text.Length; i++) - { - if (char.IsLetter(text[i])) - { - characterCount++; - } - } - - return characterCount; - } - - public static int WordCount(string text) - { - var numWords = 0; - - for (int i = 1; i < text.Length; i++) - { - if (char.IsWhiteSpace(text[i - 1])) - { - var character = text[i]; - - if (char.IsLetterOrDigit(character) || char.IsPunctuation(character)) - { - numWords++; - } - } - } - - if (text.Length > 2) - { - numWords++; - } - - return numWords; - } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/Visitors/FirstPascalPathExtension.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/Visitors/FirstPascalPathExtension.cs index 84e670712..0b5ea499a 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/Visitors/FirstPascalPathExtension.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Assets/Visitors/FirstPascalPathExtension.cs @@ -6,8 +6,8 @@ // ========================================================================== using System.Linq; -using Squidex.Infrastructure; using Squidex.Infrastructure.Queries; +using Squidex.Text; namespace Squidex.Domain.Apps.Entities.MongoDb.Assets.Visitors { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardApp.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardApp.cs index fa2bcdfd5..f952b63a4 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardApp.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardApp.cs @@ -11,6 +11,7 @@ using Squidex.Domain.Apps.Entities.Apps.Plans; using Squidex.Infrastructure; using Squidex.Infrastructure.Translations; using Squidex.Infrastructure.Validation; +using Squidex.Text; namespace Squidex.Domain.Apps.Entities.Apps.Guards { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Indexes/AppsIndex.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Indexes/AppsIndex.cs index 456220b92..7cd694b26 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Indexes/AppsIndex.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Indexes/AppsIndex.cs @@ -20,6 +20,7 @@ using Squidex.Infrastructure.Security; using Squidex.Infrastructure.Translations; using Squidex.Infrastructure.Validation; using Squidex.Shared; +using Squidex.Text; namespace Squidex.Domain.Apps.Entities.Apps.Indexes { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/SchemaBuilder.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/SchemaBuilder.cs index cb2b0e886..a1bd59e64 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/SchemaBuilder.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/SchemaBuilder.cs @@ -9,7 +9,7 @@ using System; using System.Collections.Generic; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Entities.Schemas.Commands; -using Squidex.Infrastructure; +using Squidex.Text; namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetSlug.cs b/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetSlug.cs index b6075f583..36783f9c6 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetSlug.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetSlug.cs @@ -6,7 +6,7 @@ // ========================================================================== using System.Collections.Generic; -using Squidex.Infrastructure; +using Squidex.Text; namespace Squidex.Domain.Apps.Entities.Assets { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/AssetQueryParser.cs b/backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/AssetQueryParser.cs index 33fa44763..2a9d0e301 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/AssetQueryParser.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/AssetQueryParser.cs @@ -21,6 +21,7 @@ using Squidex.Infrastructure.Queries.Json; using Squidex.Infrastructure.Queries.OData; using Squidex.Infrastructure.Translations; using Squidex.Infrastructure.Validation; +using Squidex.Text; namespace Squidex.Domain.Apps.Entities.Assets.Queries { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentChangedTriggerHandler.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentChangedTriggerHandler.cs index e63133729..68e88867a 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentChangedTriggerHandler.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentChangedTriggerHandler.cs @@ -16,6 +16,7 @@ using Squidex.Domain.Apps.Events.Contents; using Squidex.Infrastructure; using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Reflection; +using Squidex.Text; namespace Squidex.Domain.Apps.Entities.Contents { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Extensions.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Extensions.cs index f752a6a77..39835928a 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Extensions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Extensions.cs @@ -11,6 +11,7 @@ using System.Threading.Tasks; using GraphQL.DataLoader; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Infrastructure; +using Squidex.Text; namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/ContentQueryParser.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/ContentQueryParser.cs index 90d58b3b5..1aaa73798 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/ContentQueryParser.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/ContentQueryParser.cs @@ -29,6 +29,7 @@ using Squidex.Infrastructure.Queries.Json; using Squidex.Infrastructure.Queries.OData; using Squidex.Infrastructure.Translations; using Squidex.Infrastructure.Validation; +using Squidex.Text; namespace Squidex.Domain.Apps.Entities.Contents.Queries { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchema.cs b/backend/src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchema.cs index ce8a2e618..d4d8c27cd 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchema.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchema.cs @@ -14,6 +14,7 @@ using Squidex.Domain.Apps.Entities.Schemas.Commands; using Squidex.Infrastructure; using Squidex.Infrastructure.Translations; using Squidex.Infrastructure.Validation; +using Squidex.Text; #pragma warning disable IDE0060 // Remove unused parameter #pragma warning disable IDE0059 // Unnecessary assignment of a value diff --git a/backend/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemasIndex.cs b/backend/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemasIndex.cs index 98d159cdd..04a485c07 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemasIndex.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemasIndex.cs @@ -17,6 +17,7 @@ using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Log; using Squidex.Infrastructure.Translations; using Squidex.Infrastructure.Validation; +using Squidex.Text; namespace Squidex.Domain.Apps.Entities.Schemas.Indexes { diff --git a/backend/src/Squidex.Infrastructure.GetEventStore/EventSourcing/ProjectionClient.cs b/backend/src/Squidex.Infrastructure.GetEventStore/EventSourcing/ProjectionClient.cs index 3136d7f0d..51a2e8368 100644 --- a/backend/src/Squidex.Infrastructure.GetEventStore/EventSourcing/ProjectionClient.cs +++ b/backend/src/Squidex.Infrastructure.GetEventStore/EventSourcing/ProjectionClient.cs @@ -14,6 +14,7 @@ using System.Threading.Tasks; using EventStore.ClientAPI; using EventStore.ClientAPI.Exceptions; using EventStore.ClientAPI.Projections; +using Squidex.Text; namespace Squidex.Infrastructure.EventSourcing { diff --git a/backend/src/Squidex.Infrastructure/Configuration/ConfigurationExtensions.cs b/backend/src/Squidex.Infrastructure/Configuration/ConfigurationExtensions.cs index 4c86b80a0..6b6d1691a 100644 --- a/backend/src/Squidex.Infrastructure/Configuration/ConfigurationExtensions.cs +++ b/backend/src/Squidex.Infrastructure/Configuration/ConfigurationExtensions.cs @@ -8,6 +8,7 @@ using System.Globalization; using System.Linq; using Squidex.Infrastructure; +using Squidex.Text; namespace Microsoft.Extensions.Configuration { diff --git a/backend/src/Squidex.Infrastructure/Guard.cs b/backend/src/Squidex.Infrastructure/Guard.cs index 282e1a0aa..c0b66b734 100644 --- a/backend/src/Squidex.Infrastructure/Guard.cs +++ b/backend/src/Squidex.Infrastructure/Guard.cs @@ -12,6 +12,7 @@ using System.IO; using System.Linq; using System.Runtime.CompilerServices; using Squidex.Infrastructure.Validation; +using Squidex.Text; namespace Squidex.Infrastructure { diff --git a/backend/src/Squidex.Infrastructure/Log/Adapter/SemanticLogLogger.cs b/backend/src/Squidex.Infrastructure/Log/Adapter/SemanticLogLogger.cs index 8bf1ee07f..26deb73fe 100644 --- a/backend/src/Squidex.Infrastructure/Log/Adapter/SemanticLogLogger.cs +++ b/backend/src/Squidex.Infrastructure/Log/Adapter/SemanticLogLogger.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; using Microsoft.Extensions.Logging; +using Squidex.Text; namespace Squidex.Infrastructure.Log.Adapter { diff --git a/backend/src/Squidex.Infrastructure/Queries/PascalCasePathConverter.cs b/backend/src/Squidex.Infrastructure/Queries/PascalCasePathConverter.cs index 4bbb67ff1..4fae9488b 100644 --- a/backend/src/Squidex.Infrastructure/Queries/PascalCasePathConverter.cs +++ b/backend/src/Squidex.Infrastructure/Queries/PascalCasePathConverter.cs @@ -6,6 +6,7 @@ // ========================================================================== using System.Linq; +using Squidex.Text; namespace Squidex.Infrastructure.Queries { diff --git a/backend/src/Squidex.Infrastructure/Reflection/TypeNameBuilder.cs b/backend/src/Squidex.Infrastructure/Reflection/TypeNameBuilder.cs index 900bc4dbd..79612da42 100644 --- a/backend/src/Squidex.Infrastructure/Reflection/TypeNameBuilder.cs +++ b/backend/src/Squidex.Infrastructure/Reflection/TypeNameBuilder.cs @@ -6,6 +6,7 @@ // ========================================================================== using System; +using Squidex.Text; namespace Squidex.Infrastructure.Reflection { diff --git a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj index 41f669756..94eb9a6bc 100644 --- a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj +++ b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj @@ -37,6 +37,7 @@ + diff --git a/backend/src/Squidex.Infrastructure/StringExtensions.cs b/backend/src/Squidex.Infrastructure/StringExtensions.cs index 34461cbb7..72f328b3c 100644 --- a/backend/src/Squidex.Infrastructure/StringExtensions.cs +++ b/backend/src/Squidex.Infrastructure/StringExtensions.cs @@ -6,532 +6,17 @@ // ========================================================================== using System; -using System.Collections.Generic; using System.Globalization; using System.Linq; -using System.Text; using System.Text.RegularExpressions; namespace Squidex.Infrastructure { public static class StringExtensions { - private const char NullChar = (char)0; - - private static readonly Regex SlugRegex = new Regex("^[a-z0-9]+(\\-[a-z0-9]+)*$", RegexOptions.Compiled); private static readonly Regex EmailRegex = new Regex(@"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-||_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+([a-z]+|\d|-|\.{0,1}|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])?([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex PropertyNameRegex = new Regex("^[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*$", RegexOptions.Compiled); - private static readonly Dictionary LowerCaseDiacritics; - private static readonly Dictionary Diacritics = new Dictionary - { - ['$'] = "dollar", - ['%'] = "percent", - ['&'] = "and", - ['<'] = "less", - ['>'] = "greater", - ['|'] = "or", - ['¢'] = "cent", - ['£'] = "pound", - ['¤'] = "currency", - ['¥'] = "yen", - ['©'] = "(c)", - ['ª'] = "a", - ['®'] = "(r)", - ['º'] = "o", - ['À'] = "A", - ['Á'] = "A", - ['Â'] = "A", - ['Ã'] = "A", - ['Ä'] = "AE", - ['Å'] = "A", - ['Æ'] = "AE", - ['Ç'] = "C", - ['Ə'] = "E", - ['È'] = "E", - ['É'] = "E", - ['Ê'] = "E", - ['Ë'] = "E", - ['Ì'] = "I", - ['Í'] = "I", - ['Î'] = "I", - ['Ï'] = "I", - ['Ð'] = "D", - ['Ñ'] = "N", - ['Ò'] = "O", - ['Ó'] = "O", - ['Ô'] = "O", - ['Õ'] = "O", - ['Ö'] = "OE", - ['Ø'] = "O", - ['Ù'] = "U", - ['Ú'] = "U", - ['Û'] = "U", - ['Ü'] = "UE", - ['Ý'] = "Y", - ['Þ'] = "TH", - ['ß'] = "ss", - ['à'] = "a", - ['á'] = "a", - ['â'] = "a", - ['ã'] = "a", - ['ä'] = "ae", - ['å'] = "a", - ['æ'] = "ae", - ['ç'] = "c", - ['ə'] = "e", - ['è'] = "e", - ['é'] = "e", - ['ê'] = "e", - ['ë'] = "e", - ['ì'] = "i", - ['í'] = "i", - ['î'] = "i", - ['ï'] = "i", - ['ð'] = "d", - ['ñ'] = "n", - ['ò'] = "o", - ['ó'] = "o", - ['ô'] = "o", - ['õ'] = "o", - ['ö'] = "oe", - ['ø'] = "o", - ['ù'] = "u", - ['ú'] = "u", - ['û'] = "u", - ['ü'] = "ue", - ['ý'] = "y", - ['þ'] = "th", - ['ÿ'] = "y", - ['Ā'] = "A", - ['ā'] = "a", - ['Ă'] = "A", - ['ă'] = "a", - ['Ą'] = "A", - ['ą'] = "a", - ['Ć'] = "C", - ['ć'] = "c", - ['Č'] = "C", - ['č'] = "c", - ['Ď'] = "D", - ['ď'] = "d", - ['Đ'] = "DJ", - ['đ'] = "dj", - ['Ē'] = "E", - ['ē'] = "e", - ['Ė'] = "E", - ['ė'] = "e", - ['Ę'] = "e", - ['ę'] = "e", - ['Ě'] = "E", - ['ě'] = "e", - ['Ğ'] = "G", - ['ğ'] = "g", - ['Ģ'] = "G", - ['ģ'] = "g", - ['Ĩ'] = "I", - ['ĩ'] = "i", - ['Ī'] = "i", - ['ī'] = "i", - ['Į'] = "I", - ['į'] = "i", - ['İ'] = "I", - ['ı'] = "i", - ['Ķ'] = "k", - ['ķ'] = "k", - ['Ļ'] = "L", - ['ļ'] = "l", - ['Ľ'] = "L", - ['ľ'] = "l", - ['Ł'] = "L", - ['ł'] = "l", - ['Ń'] = "N", - ['ń'] = "n", - ['Ņ'] = "N", - ['ņ'] = "n", - ['Ň'] = "N", - ['ň'] = "n", - ['Ő'] = "O", - ['ő'] = "o", - ['Œ'] = "OE", - ['œ'] = "oe", - ['Ŕ'] = "R", - ['ŕ'] = "r", - ['Ř'] = "R", - ['ř'] = "r", - ['Ś'] = "S", - ['ś'] = "s", - ['Ş'] = "S", - ['ş'] = "s", - ['Š'] = "S", - ['š'] = "s", - ['Ţ'] = "T", - ['ţ'] = "t", - ['Ť'] = "T", - ['ť'] = "t", - ['Ũ'] = "U", - ['ũ'] = "u", - ['Ū'] = "u", - ['ū'] = "u", - ['Ů'] = "U", - ['ů'] = "u", - ['Ű'] = "U", - ['ű'] = "u", - ['Ų'] = "U", - ['ų'] = "u", - ['Ź'] = "Z", - ['ź'] = "z", - ['Ż'] = "Z", - ['ż'] = "z", - ['Ž'] = "Z", - ['ž'] = "z", - ['ƒ'] = "f", - ['Ơ'] = "O", - ['ơ'] = "o", - ['Ư'] = "U", - ['ư'] = "u", - ['Lj'] = "LJ", - ['lj'] = "lj", - ['Nj'] = "NJ", - ['nj'] = "nj", - ['Ș'] = "S", - ['ș'] = "s", - ['Ț'] = "T", - ['ț'] = "t", - ['˚'] = "o", - ['Ά'] = "A", - ['Έ'] = "E", - ['Ή'] = "H", - ['Ί'] = "I", - ['Ό'] = "O", - ['Ύ'] = "Y", - ['Ώ'] = "W", - ['ΐ'] = "i", - ['Α'] = "A", - ['Β'] = "B", - ['Γ'] = "G", - ['Δ'] = "D", - ['Ε'] = "E", - ['Ζ'] = "Z", - ['Η'] = "H", - ['Θ'] = "8", - ['Ι'] = "I", - ['Κ'] = "K", - ['Λ'] = "L", - ['Μ'] = "M", - ['Ν'] = "N", - ['Ξ'] = "3", - ['Ο'] = "O", - ['Π'] = "P", - ['Ρ'] = "R", - ['Σ'] = "S", - ['Τ'] = "T", - ['Υ'] = "Y", - ['Φ'] = "F", - ['Χ'] = "X", - ['Ψ'] = "PS", - ['Ω'] = "W", - ['Ϊ'] = "I", - ['Ϋ'] = "Y", - ['ά'] = "a", - ['έ'] = "e", - ['ή'] = "h", - ['ί'] = "i", - ['ΰ'] = "y", - ['α'] = "a", - ['β'] = "b", - ['γ'] = "g", - ['δ'] = "d", - ['ε'] = "e", - ['ζ'] = "z", - ['η'] = "h", - ['θ'] = "8", - ['ι'] = "i", - ['κ'] = "k", - ['λ'] = "l", - ['μ'] = "m", - ['ν'] = "n", - ['ξ'] = "3", - ['ο'] = "o", - ['π'] = "p", - ['ρ'] = "r", - ['ς'] = "s", - ['σ'] = "s", - ['τ'] = "t", - ['υ'] = "y", - ['φ'] = "f", - ['χ'] = "x", - ['ψ'] = "ps", - ['ω'] = "w", - ['ϊ'] = "i", - ['ϋ'] = "y", - ['ό'] = "o", - ['ύ'] = "y", - ['ώ'] = "w", - ['Ё'] = "Yo", - ['Ђ'] = "DJ", - ['Є'] = "Ye", - ['І'] = "I", - ['Ї'] = "Yi", - ['Ј'] = "J", - ['Љ'] = "LJ", - ['Њ'] = "NJ", - ['Ћ'] = "C", - ['Џ'] = "DZ", - ['А'] = "A", - ['Б'] = "B", - ['В'] = "V", - ['Г'] = "G", - ['Д'] = "D", - ['Е'] = "E", - ['Ж'] = "Zh", - ['З'] = "Z", - ['И'] = "I", - ['Й'] = "J", - ['К'] = "K", - ['Л'] = "L", - ['М'] = "M", - ['Н'] = "N", - ['О'] = "O", - ['П'] = "P", - ['Р'] = "R", - ['С'] = "S", - ['Т'] = "T", - ['У'] = "U", - ['Ф'] = "F", - ['Х'] = "H", - ['Ц'] = "C", - ['Ч'] = "Ch", - ['Ш'] = "Sh", - ['Щ'] = "Sh", - ['Ъ'] = "U", - ['Ы'] = "Y", - ['Ь'] = "b", - ['Э'] = "E", - ['Ю'] = "Yu", - ['Я'] = "Ya", - ['а'] = "a", - ['б'] = "b", - ['в'] = "v", - ['г'] = "g", - ['д'] = "d", - ['е'] = "e", - ['ж'] = "zh", - ['з'] = "z", - ['и'] = "i", - ['й'] = "j", - ['к'] = "k", - ['л'] = "l", - ['м'] = "m", - ['н'] = "n", - ['о'] = "o", - ['п'] = "p", - ['р'] = "r", - ['с'] = "s", - ['т'] = "t", - ['у'] = "u", - ['ф'] = "f", - ['х'] = "h", - ['ц'] = "c", - ['ч'] = "ch", - ['ш'] = "sh", - ['щ'] = "sh", - ['ъ'] = "u", - ['ы'] = "y", - ['ь'] = "s", - ['э'] = "e", - ['ю'] = "yu", - ['я'] = "ya", - ['ё'] = "yo", - ['ђ'] = "dj", - ['є'] = "ye", - ['і'] = "i", - ['ї'] = "yi", - ['ј'] = "j", - ['љ'] = "lj", - ['њ'] = "nj", - ['ћ'] = "c", - ['џ'] = "dz", - ['Ґ'] = "G", - ['ґ'] = "g", - ['฿'] = "baht", - ['ა'] = "a", - ['ბ'] = "b", - ['გ'] = "g", - ['დ'] = "d", - ['ე'] = "e", - ['ვ'] = "v", - ['ზ'] = "z", - ['თ'] = "t", - ['ი'] = "i", - ['კ'] = "k", - ['ლ'] = "l", - ['მ'] = "m", - ['ნ'] = "n", - ['ო'] = "o", - ['პ'] = "p", - ['ჟ'] = "zh", - ['რ'] = "r", - ['ს'] = "s", - ['ტ'] = "t", - ['უ'] = "u", - ['ფ'] = "f", - ['ქ'] = "k", - ['ღ'] = "gh", - ['ყ'] = "q", - ['შ'] = "sh", - ['ჩ'] = "ch", - ['ც'] = "ts", - ['ძ'] = "dz", - ['წ'] = "ts", - ['ჭ'] = "ch", - ['ხ'] = "kh", - ['ჯ'] = "j", - ['ჰ'] = "h", - ['ẞ'] = "SS", - ['Ạ'] = "A", - ['ạ'] = "a", - ['Ả'] = "A", - ['ả'] = "a", - ['Ấ'] = "A", - ['ấ'] = "a", - ['Ầ'] = "A", - ['ầ'] = "a", - ['Ẩ'] = "A", - ['ẩ'] = "a", - ['Ẫ'] = "A", - ['ẫ'] = "a", - ['Ậ'] = "A", - ['ậ'] = "a", - ['Ắ'] = "A", - ['ắ'] = "a", - ['Ằ'] = "A", - ['ằ'] = "a", - ['Ẳ'] = "A", - ['ẳ'] = "a", - ['Ẵ'] = "A", - ['ẵ'] = "a", - ['Ặ'] = "A", - ['ặ'] = "a", - ['Ẹ'] = "E", - ['ẹ'] = "e", - ['Ẻ'] = "E", - ['ẻ'] = "e", - ['Ẽ'] = "E", - ['ẽ'] = "e", - ['Ế'] = "E", - ['ế'] = "e", - ['Ề'] = "E", - ['ề'] = "e", - ['Ể'] = "E", - ['ể'] = "e", - ['Ễ'] = "E", - ['ễ'] = "e", - ['Ệ'] = "E", - ['ệ'] = "e", - ['Ỉ'] = "I", - ['ỉ'] = "i", - ['Ị'] = "I", - ['ị'] = "i", - ['Ọ'] = "O", - ['ọ'] = "o", - ['Ỏ'] = "O", - ['ỏ'] = "o", - ['Ố'] = "O", - ['ố'] = "o", - ['Ồ'] = "O", - ['ồ'] = "o", - ['Ổ'] = "O", - ['ổ'] = "o", - ['Ỗ'] = "O", - ['ỗ'] = "o", - ['Ộ'] = "O", - ['ộ'] = "o", - ['Ớ'] = "O", - ['ớ'] = "o", - ['Ờ'] = "O", - ['ờ'] = "o", - ['Ở'] = "O", - ['ở'] = "o", - ['Ỡ'] = "O", - ['ỡ'] = "o", - ['Ợ'] = "O", - ['ợ'] = "o", - ['Ụ'] = "U", - ['ụ'] = "u", - ['Ủ'] = "U", - ['ủ'] = "u", - ['Ứ'] = "U", - ['ứ'] = "u", - ['Ừ'] = "U", - ['ừ'] = "u", - ['Ử'] = "U", - ['ử'] = "u", - ['Ữ'] = "U", - ['ữ'] = "u", - ['Ự'] = "U", - ['ự'] = "u", - ['Ỳ'] = "Y", - ['ỳ'] = "y", - ['Ỵ'] = "Y", - ['ỵ'] = "y", - ['Ỷ'] = "Y", - ['ỷ'] = "y", - ['Ỹ'] = "Y", - ['ỹ'] = "y", - ['‘'] = "\'", - ['’'] = "\'", - ['“'] = "\\\"", - ['”'] = "\\\"", - ['†'] = "+", - ['•'] = "*", - ['…'] = "...", - ['₠'] = "ecu", - ['₢'] = "cruzeiro", - ['₣'] = "french franc", - ['₤'] = "lira", - ['₥'] = "mill", - ['₦'] = "naira", - ['₧'] = "peseta", - ['₨'] = "rupee", - ['₩'] = "won", - ['₪'] = "new shequel", - ['₫'] = "dong", - ['€'] = "euro", - ['₭'] = "kip", - ['₮'] = "tugrik", - ['₯'] = "drachma", - ['₰'] = "penny", - ['₱'] = "peso", - ['₲'] = "guarani", - ['₳'] = "austral", - ['₴'] = "hryvnia", - ['₵'] = "cedi", - ['₹'] = "indian rupee", - ['₽'] = "russian ruble", - ['₿'] = "bitcoin", - ['℠'] = "sm", - ['™'] = "tm", - ['∂'] = "d", - ['∆'] = "delta", - ['∑'] = "sum", - ['∞'] = "infinity", - ['♥'] = "love", - ['元'] = "yuan", - ['円'] = "yen", - ['﷼'] = "rial" - }; - - static StringExtensions() - { - LowerCaseDiacritics = Diacritics.ToDictionary(x => x.Key, x => x.Value.ToLowerInvariant()); - } - - public static bool IsSlug(this string? value) - { - return value != null && SlugRegex.IsMatch(value); - } - public static bool IsEmail(this string? value) { return value != null && EmailRegex.IsMatch(value); @@ -547,229 +32,6 @@ namespace Squidex.Infrastructure return !string.IsNullOrWhiteSpace(value) ? value.Trim() : fallback; } - public static string ToPascalCase(this string value) - { - if (value.Length == 0) - { - return string.Empty; - } - - var sb = new StringBuilder(value.Length); - - var last = NullChar; - var length = 0; - - for (var i = 0; i < value.Length; i++) - { - var c = value[i]; - - if (c == '-' || c == '_' || c == ' ') - { - if (last != NullChar) - { - sb.Append(char.ToUpperInvariant(last)); - } - - last = NullChar; - length = 0; - } - else - { - if (length > 1) - { - sb.Append(c); - } - else if (length == 0) - { - last = c; - } - else - { - sb.Append(char.ToUpperInvariant(last)); - sb.Append(c); - - last = NullChar; - } - - length++; - } - } - - if (last != NullChar) - { - sb.Append(char.ToUpperInvariant(last)); - } - - return sb.ToString(); - } - - public static string ToKebabCase(this string value) - { - if (value.Length == 0) - { - return string.Empty; - } - - var sb = new StringBuilder(value.Length); - - var length = 0; - - for (var i = 0; i < value.Length; i++) - { - var c = value[i]; - - if (c == '-' || c == '_' || c == ' ') - { - length = 0; - } - else - { - if (length > 0) - { - sb.Append(char.ToLowerInvariant(c)); - } - else - { - if (sb.Length > 0) - { - sb.Append('-'); - } - - sb.Append(char.ToLowerInvariant(c)); - } - - length++; - } - } - - return sb.ToString(); - } - - public static string ToCamelCase(this string value) - { - if (value.Length == 0) - { - return string.Empty; - } - - var sb = new StringBuilder(value.Length); - - var last = NullChar; - var length = 0; - - for (var i = 0; i < value.Length; i++) - { - var c = value[i]; - - if (c == '-' || c == '_' || c == ' ') - { - if (last != NullChar) - { - if (sb.Length > 0) - { - sb.Append(char.ToUpperInvariant(last)); - } - else - { - sb.Append(char.ToLowerInvariant(last)); - } - } - - last = NullChar; - length = 0; - } - else - { - if (length > 1) - { - sb.Append(c); - } - else if (length == 0) - { - last = c; - } - else - { - if (sb.Length > 0) - { - sb.Append(char.ToUpperInvariant(last)); - } - else - { - sb.Append(char.ToLowerInvariant(last)); - } - - sb.Append(c); - - last = NullChar; - } - - length++; - } - } - - if (last != NullChar) - { - if (sb.Length > 0) - { - sb.Append(char.ToUpperInvariant(last)); - } - else - { - sb.Append(char.ToLowerInvariant(last)); - } - } - - return sb.ToString(); - } - - public static string Slugify(this string value, ISet? preserveHash = null, bool singleCharDiactric = false, char separator = '-') - { - var result = new StringBuilder(value.Length); - - var lastChar = (char)0; - - for (var i = 0; i < value.Length; i++) - { - var character = value[i]; - - if (preserveHash?.Contains(character) == true) - { - result.Append(character); - } - else if (char.IsLetter(character) || char.IsNumber(character)) - { - lastChar = character; - - var lower = char.ToLowerInvariant(character); - - if (LowerCaseDiacritics.TryGetValue(character, out var replacement)) - { - if (singleCharDiactric && replacement.Length == 2) - { - result.Append(replacement[0]); - } - else - { - result.Append(replacement); - } - } - else - { - result.Append(lower); - } - } - else if ((i < value.Length - 1) && (i > 0 && lastChar != separator)) - { - lastChar = separator; - - result.Append(separator); - } - } - - return result.ToString().Trim(separator); - } - public static string BuildFullUrl(this string baseUrl, string path, bool trailingSlash = false) { Guard.NotNull(path, nameof(path)); diff --git a/backend/src/Squidex.Infrastructure/Translations/LocalizedCompareAttribute.cs b/backend/src/Squidex.Infrastructure/Translations/LocalizedCompareAttribute.cs index e3ac39ebd..1be871b67 100644 --- a/backend/src/Squidex.Infrastructure/Translations/LocalizedCompareAttribute.cs +++ b/backend/src/Squidex.Infrastructure/Translations/LocalizedCompareAttribute.cs @@ -6,6 +6,7 @@ // ========================================================================== using System.ComponentModel.DataAnnotations; +using Squidex.Text; namespace Squidex.Infrastructure.Translations { diff --git a/backend/src/Squidex.Infrastructure/Translations/LocalizedRequired.cs b/backend/src/Squidex.Infrastructure/Translations/LocalizedRequired.cs index c5bb084ef..542602535 100644 --- a/backend/src/Squidex.Infrastructure/Translations/LocalizedRequired.cs +++ b/backend/src/Squidex.Infrastructure/Translations/LocalizedRequired.cs @@ -7,6 +7,7 @@ using System; using System.ComponentModel.DataAnnotations; +using Squidex.Text; namespace Squidex.Infrastructure.Translations { diff --git a/backend/src/Squidex.Infrastructure/Validation/AbsoluteUrlAttribute.cs b/backend/src/Squidex.Infrastructure/Validation/AbsoluteUrlAttribute.cs index 809ca40a1..24089e5d7 100644 --- a/backend/src/Squidex.Infrastructure/Validation/AbsoluteUrlAttribute.cs +++ b/backend/src/Squidex.Infrastructure/Validation/AbsoluteUrlAttribute.cs @@ -8,6 +8,7 @@ using System; using System.ComponentModel.DataAnnotations; using Squidex.Infrastructure.Translations; +using Squidex.Text; namespace Squidex.Infrastructure.Validation { diff --git a/backend/src/Squidex.Infrastructure/Validation/Not.cs b/backend/src/Squidex.Infrastructure/Validation/Not.cs index e861eddf9..a5600295a 100644 --- a/backend/src/Squidex.Infrastructure/Validation/Not.cs +++ b/backend/src/Squidex.Infrastructure/Validation/Not.cs @@ -7,6 +7,7 @@ using System.Runtime.CompilerServices; using Squidex.Infrastructure.Translations; +using Squidex.Text; namespace Squidex.Infrastructure.Validation { diff --git a/backend/src/Squidex.Web/Services/StringLocalizer.cs b/backend/src/Squidex.Web/Services/StringLocalizer.cs index 1ca5c53c7..78b758ce9 100644 --- a/backend/src/Squidex.Web/Services/StringLocalizer.cs +++ b/backend/src/Squidex.Web/Services/StringLocalizer.cs @@ -12,6 +12,7 @@ using System.Linq; using Microsoft.Extensions.Localization; using Squidex.Infrastructure; using Squidex.Infrastructure.Translations; +using Squidex.Text; namespace Squidex.Web.Services { diff --git a/backend/tests/Squidex.Infrastructure.Tests/StringExtensionsTests.cs b/backend/tests/Squidex.Infrastructure.Tests/StringExtensionsTests.cs index 07d249e06..a149a60e6 100644 --- a/backend/tests/Squidex.Infrastructure.Tests/StringExtensionsTests.cs +++ b/backend/tests/Squidex.Infrastructure.Tests/StringExtensionsTests.cs @@ -5,7 +5,6 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using System.Collections.Generic; using Xunit; namespace Squidex.Infrastructure @@ -33,98 +32,6 @@ namespace Squidex.Infrastructure Assert.Equal("fallback", value.Or("fallback")); } - [Theory] - [InlineData("", "")] - [InlineData("m", "m")] - [InlineData("m y", "m-y")] - [InlineData("M Y", "m-y")] - [InlineData("M_Y", "m-y")] - [InlineData("M_Y ", "m-y")] - public void Should_convert_to_kebap_case(string input, string output) - { - Assert.Equal(output, input.ToKebabCase()); - } - - [Theory] - [InlineData("", "")] - [InlineData("m", "M")] - [InlineData("m-y", "MY")] - [InlineData("my", "My")] - [InlineData("myProperty ", "MyProperty")] - [InlineData("my property", "MyProperty")] - [InlineData("my_property", "MyProperty")] - [InlineData("my-property", "MyProperty")] - public void Should_convert_to_pascal_case(string input, string output) - { - Assert.Equal(output, input.ToPascalCase()); - } - - [Theory] - [InlineData("", "")] - [InlineData("M", "m")] - [InlineData("My", "my")] - [InlineData("M-y", "mY")] - [InlineData("MyProperty ", "myProperty")] - [InlineData("My property", "myProperty")] - [InlineData("My_property", "myProperty")] - [InlineData("My-property", "myProperty")] - public void Should_convert_to_camel_case(string input, string output) - { - Assert.Equal(output, input.ToCamelCase()); - } - - [Theory] - [InlineData("Hello World", '-', "hello-world")] - [InlineData("Hello/World", '-', "hello-world")] - [InlineData("Hello World", '_', "hello_world")] - [InlineData("Hello/World", '_', "hello_world")] - [InlineData("Hello World ", '_', "hello_world")] - [InlineData("Hello World-", '_', "hello_world")] - [InlineData("Hello/World_", '_', "hello_world")] - public void Should_replace_special_characters_with_sepator_when_slugifying(string input, char separator, string output) - { - Assert.Equal(output, input.Slugify(separator: separator)); - } - - [Theory] - [InlineData("ö", "oe")] - [InlineData("ü", "ue")] - [InlineData("ä", "ae")] - public void Should_replace_multi_char_diacritics_when_slugifying(string input, string output) - { - Assert.Equal(output, input.Slugify()); - } - - [Theory] - [InlineData("ö", "o")] - [InlineData("ü", "u")] - [InlineData("ä", "a")] - public void Should_not_replace_multi_char_diacritics_when_slugifying(string input, string output) - { - Assert.Equal(output, input.Slugify(singleCharDiactric: true)); - } - - [Theory] - [InlineData("Físh", "fish")] - [InlineData("źish", "zish")] - [InlineData("żish", "zish")] - [InlineData("fórm", "form")] - [InlineData("fòrm", "form")] - [InlineData("fårt", "fart")] - public void Should_replace_single_char_diacritics_when_slugifying(string input, string output) - { - Assert.Equal(output, input.Slugify()); - } - - [Theory] - [InlineData("Hello my&World ", '_', "hello_my&world")] - [InlineData("Hello my&World-", '_', "hello_my&world")] - [InlineData("Hello my/World_", '_', "hello_my/world")] - public void Should_keep_characters_when_slugifying(string input, char separator, string output) - { - Assert.Equal(output, input.Slugify(new HashSet { '&', '/' }, false, separator)); - } - [Fact] public void Should_provide_value() {