mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-09-23 12:53:33 +08:00

- Page edit actions changed over to use id instead of slug (others should follow suit since slug uniqueness is only guaranteed among published content items...where applicable, there is no notion of a "published" blog) --HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4045722
55 lines
2.0 KiB
C#
55 lines
2.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using Orchard.Core.Common.Models;
|
|
|
|
namespace Orchard.Core.Common.Services {
|
|
public class RoutableService : IRoutableService {
|
|
public void FillSlug<TModel>(TModel model) where TModel : RoutableAspect {
|
|
if (!string.IsNullOrEmpty(model.Slug) || string.IsNullOrEmpty(model.Title))
|
|
return;
|
|
|
|
var slug = model.Title;
|
|
var dissallowed = new Regex(@"[/:?#\[\]@!$&'()*+,;=\s]+");
|
|
|
|
slug = dissallowed.Replace(slug, "-");
|
|
slug = slug.Trim('-');
|
|
|
|
if (slug.Length > 1000)
|
|
slug = slug.Substring(0, 1000);
|
|
|
|
model.Slug = slug;
|
|
}
|
|
|
|
public void FillSlug<TModel>(TModel model, Func<string, string> generateSlug) where TModel : RoutableAspect {
|
|
if (!string.IsNullOrEmpty(model.Slug) || string.IsNullOrEmpty(model.Title))
|
|
return;
|
|
|
|
model.Slug = generateSlug(model.Title);
|
|
}
|
|
|
|
|
|
|
|
public string GenerateUniqueSlug(string slugCandidate, IEnumerable<string> existingSlugs) {
|
|
int? version = existingSlugs
|
|
.Select(s => {
|
|
int v;
|
|
string[] slugParts = s.Split(new[] { slugCandidate }, StringSplitOptions.RemoveEmptyEntries);
|
|
if (slugParts.Length == 0) {
|
|
return 2;
|
|
}
|
|
|
|
return int.TryParse(slugParts[0].TrimStart('-'), out v)
|
|
? (int?) ++v
|
|
: null;
|
|
})
|
|
.OrderBy(i => i)
|
|
.LastOrDefault();
|
|
|
|
return version != null
|
|
? string.Format("{0}-{1}", slugCandidate, version)
|
|
: slugCandidate;
|
|
}
|
|
}
|
|
} |