#18787 : slugify function

Work Item: 18787
This commit is contained in:
Codinlab
2015-02-08 13:00:29 +00:00
committed by agriffard
parent efc573992c
commit 46fd3d22f0
2 changed files with 77 additions and 8 deletions

View File

@@ -35,12 +35,42 @@ namespace Orchard.Tests.Modules.Autoroute {
[Test]
public void ShouldMakeSureFunkycharactersAndHyphansOnlyReturnSingleHyphan() {
Assert.That(_slugService.Slugify("a-%-.d"), Is.EqualTo("a-d"));
Assert.That(_slugService.Slugify("«a»-%-.d"), Is.EqualTo("a-d"));
}
[Test]
public void ShouldConvertToLowercase() {
Assert.That(_slugService.Slugify("ABCDE"), Is.EqualTo("abcde"));
}
[Test]
public void ShouldRemoveDiacritics() {
Assert.That(_slugService.Slugify("àçéïôù"), Is.EqualTo("aceiou"));
}
[Test]
public void ShouldPreserveCyrilicCharacters() {
Assert.That(_slugService.Slugify("джинсы_клеш"), Is.EqualTo("джинсы_клеш"));
}
[Test]
public void ShouldPreserveHebrewCharacters() {
Assert.That(_slugService.Slugify(וות_אורצ_רד"), Is.EqualTo(וות_אורצ_רד"));
}
[Test]
public void ShouldPreserveChineseCharacters() {
Assert.That(_slugService.Slugify("调度模块允许后台任务调度"), Is.EqualTo("调度模块允许后台任务调度"));
}
[Test]
public void ShouldPreserveArabicCharacters() {
Assert.That(_slugService.Slugify("فريق_الاورشارد"), Is.EqualTo("فريق_الاورشارد"));
}
[Test]
public void ShouldPreserveJapaneseCharacters() {
Assert.That(_slugService.Slugify("不正なコンテナ"), Is.EqualTo("不正なコンテナ"));
}
}
}

View File

@@ -2,6 +2,8 @@
using System.Text.RegularExpressions;
using Orchard.Utility.Extensions;
using System;
using System.Text;
using System.Globalization;
namespace Orchard.Autoroute.Services {
@@ -26,19 +28,56 @@ namespace Orchard.Autoroute.Services {
_slugEventHandler.FillingSlugFromTitle(slugContext);
if (!slugContext.Adjusted) {
string stFormKD = slugContext.Title.ToLower().Normalize(NormalizationForm.FormKD);
var sb = new StringBuilder();
var disallowed = new Regex(@"[/:?#\[\]@!$&'()*+,.;=\s\""\<\>\\\|%]+");
foreach (char t in stFormKD) {
// Allowed symbols
if (t == '-' || t == '_' || t == '~') {
sb.Append(t);
continue;
}
var cleanedSlug = disallowed.Replace(slugContext.Title, "-").Trim('-','.');
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(t);
switch (uc) {
case UnicodeCategory.LowercaseLetter:
case UnicodeCategory.OtherLetter:
case UnicodeCategory.DecimalDigitNumber:
// Keep letters and digits
sb.Append(t);
break;
case UnicodeCategory.NonSpacingMark:
// Remove diacritics
break;
default:
// Replace all other chars with dash
sb.Append('-');
break;
}
}
slugContext.Slug = Regex.Replace(cleanedSlug, @"\-{2,}", "-");
slugContext.Slug = sb.ToString().Normalize(NormalizationForm.FormC);
if (slugContext.Slug.Length > 1000)
slugContext.Slug = slugContext.Slug.Substring(0, 1000).Trim('-', '.');
// Simplifies dash groups
for (int i = 0; i < slugContext.Slug.Length - 1; i++) {
if (slugContext.Slug[i] == '-') {
int j = 0;
while (i + j + 1 < slugContext.Slug.Length && slugContext.Slug[i + j + 1] == '-') {
j++;
}
if (j > 0) {
slugContext.Slug = slugContext.Slug.Remove(i + 1, j);
}
}
}
slugContext.Slug = StringExtensions.RemoveDiacritics(slugContext.Slug.ToLower());
if (slugContext.Slug.Length > 1000) {
slugContext.Slug = slugContext.Slug.Substring(0, 1000);
}
slugContext.Slug = slugContext.Slug.Trim('-', '_', '.');
}
_slugEventHandler.FilledSlugFromTitle(slugContext);
return slugContext.Slug;