Hooking in Slugification in to Transliteration

This commit is contained in:
Nicholas Mayne
2014-08-25 20:55:11 +01:00
parent b3e0b76220
commit 360053fb10
9 changed files with 149 additions and 11 deletions

View File

@@ -7,7 +7,7 @@ using Orchard.UI.Admin;
namespace Orchard.Localization.Controllers {
[OrchardFeature("Orchard.Localization.Transliteration")]
[Admin]
[Admin, ValidateInput(false)]
public class TransliterationAdminController : Controller {
private readonly ITransliterationService _transliterationService;
@@ -36,5 +36,48 @@ namespace Orchard.Localization.Controllers {
return View(viewModel);
}
[HttpPost, ActionName("Create")]
public ActionResult CreatePost(CreateTransliterationViewModel viewModel) {
if (!ModelState.IsValid) {
return View(viewModel);
}
_transliterationService.Create(viewModel.CultureFrom, viewModel.CultureTo, viewModel.Rules);
return RedirectToAction("Index");
}
public ActionResult Edit(int id) {
var record = _transliterationService.Get(id);
var viewModel = new EditTransliterationViewModel {
Id = record.Id,
CultureFrom = record.CultureFrom,
CultureTo = record.CultureTo,
Rules = record.Rules
};
return View(viewModel);
}
[HttpPost, ActionName("Edit")]
public ActionResult EditPost(EditTransliterationViewModel viewModel) {
if (!ModelState.IsValid) {
return View(viewModel);
}
_transliterationService.Update(viewModel.Id, viewModel.CultureFrom, viewModel.CultureTo, viewModel.Rules);
return RedirectToAction("Index");
}
public ActionResult Remove(int id) {
_transliterationService.Remove(id);
return RedirectToAction("Index");
}
}
}

View File

@@ -94,10 +94,12 @@
<Compile Include="Services\LocalizationDateTimeFormatProvider.cs" />
<Compile Include="Services\LocalizationService.cs" />
<Compile Include="Services\TransliterationService.cs" />
<Compile Include="Services\TransliterationSlugEventHandler.cs" />
<Compile Include="ViewModels\AddLocalizationViewModel.cs" />
<Compile Include="ViewModels\ContentLocalizationsViewModel.cs" />
<Compile Include="ViewModels\EditLocalizationViewModel.cs" />
<Compile Include="ViewModels\CreateTransliterationViewModel.cs" />
<Compile Include="ViewModels\EditTransliterationViewModel.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="Module.txt" />
@@ -139,6 +141,10 @@
<Project>{9916839C-39FC-4CEB-A5AF-89CA7E87119F}</Project>
<Name>Orchard.Core</Name>
</ProjectReference>
<ProjectReference Include="..\Orchard.Autoroute\Orchard.Autoroute.csproj">
<Project>{66FCCD76-2761-47E3-8D11-B45D0001DDAA}</Project>
<Name>Orchard.Autoroute</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="web.config" />
@@ -152,6 +158,9 @@
<ItemGroup>
<Content Include="Views\TransliterationAdmin\Create.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\TransliterationAdmin\Edit.cshtml" />
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

View File

@@ -3,7 +3,11 @@ using Orchard.Localization.Models;
namespace Orchard.Localization.Services {
public interface ITransliterationService : IDependency {
string Convert(string value, int transliterationSpecificationId);
string Convert(string value, string cultureFrom);
IEnumerable<TransliterationSpecificationRecord> GetSpecifications();
void Create(string cultureFrom, string cultureTo, string rules);
void Update(int id, string cultureFrom, string cultureTo, string rules);
void Remove(int id);
TransliterationSpecificationRecord Get(int id);
}
}

View File

@@ -17,8 +17,8 @@ namespace Orchard.Localization.Services {
_transliterationRepository = transliterationRepository;
}
public string Convert(string value, int transliterationSpecificationId) {
var transliterationSpecification = _transliterationRepository.Get(transliterationSpecificationId);
public string Convert(string value, string cultureFrom) {
var transliterationSpecification = _transliterationRepository.Get(x => x.CultureFrom == cultureFrom);
if (transliterationSpecification == null) return value;
var specification = GetSpecification(transliterationSpecification);
@@ -38,6 +38,30 @@ namespace Orchard.Localization.Services {
return _transliterationRepository.Table.ToList();
}
public void Create(string cultureFrom, string cultureTo, string rules) {
_transliterationRepository.Create(new TransliterationSpecificationRecord {
CultureFrom = cultureFrom,
CultureTo = cultureTo,
Rules = rules
});
}
public void Update(int id, string cultureFrom, string cultureTo, string rules) {
var record = _transliterationRepository.Get(id);
record.CultureFrom = cultureFrom;
record.CultureTo = cultureTo;
record.Rules = rules;
_transliterationRepository.Update(record);
}
public void Remove(int id) {
_transliterationRepository.Delete(_transliterationRepository.Get(id));
}
public TransliterationSpecificationRecord Get(int id) {
return _transliterationRepository.Get(id);
}
private TransliteratorSpecification GetSpecification(TransliterationSpecificationRecord record) {
using (TextReader specificationReader = new StringReader(record.Rules)) {
return TransliteratorSpecification.FromSpecificationFile(specificationReader, fOnlyMetadata);

View File

@@ -0,0 +1,26 @@
using Orchard.Autoroute.Services;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Aspects;
using Orchard.Environment.Extensions;
namespace Orchard.Localization.Services {
[OrchardFeature("Orchard.Localization.Transliteration")]
public class TransliterationSlugEventHandler : ISlugEventHandler {
private readonly ITransliterationService _transliterationService;
public TransliterationSlugEventHandler(ITransliterationService transliterationService) {
_transliterationService = transliterationService;
}
public void FillingSlugFromTitle(FillSlugContext context) {
var localizationAspect = context.Content.As<ILocalizableAspect>();
if (localizationAspect == null) return;
context.Title = _transliterationService.Convert(context.Title, localizationAspect.Culture);
context.Adjusted = true;
}
public void FilledSlugFromTitle(FillSlugContext context) {
}
}
}

View File

@@ -0,0 +1,8 @@
namespace Orchard.Localization.ViewModels {
public class EditTransliterationViewModel {
public int Id { get; set; }
public string CultureFrom { get; set; }
public string CultureTo { get; set; }
public string Rules { get; set; }
}
}

View File

@@ -21,7 +21,7 @@
<label for="CultureTo">@T("To")</label>
@Html.DropDownList("CultureTo", new SelectList(cultures, "Name", "DisplayName", Model.CultureTo))
<textarea rows="25" cols="80" name="Rules">@value</textarea>
<textarea rows="25" cols="80" name="Rules" id="Rules">@value</textarea>
</fieldset>
<input class="button" type="submit" value="@T("Create")" />

View File

@@ -0,0 +1,24 @@
@using System.Globalization
@model Orchard.Localization.ViewModels.EditTransliterationViewModel
@{
Layout.Title = T("Edit Transliteration").Text;
var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
}
@using(Html.BeginFormAntiForgeryPost()) {
@Html.ValidationSummary()
<fieldset>
<label for="CultureFrom">@T("From")</label>
@Html.DropDownList("CultureFrom", new SelectList(cultures, "Name", "DisplayName", Model.CultureFrom))
<label for="CultureTo">@T("To")</label>
@Html.DropDownList("CultureTo", new SelectList(cultures, "Name", "DisplayName", Model.CultureTo))
<textarea rows="25" cols="80" name="Rules" id="Rules">@Model.Rules</textarea>
@Html.HiddenFor(x => x.Id)
</fieldset>
<input class="button" type="submit" value="@T("Save")" />
}

View File

@@ -10,7 +10,7 @@
@Html.ValidationSummary()
if (currentSpecifications.Any()) {
<div class="actions" style="margin-bottom: 15px;"><a class="add button primaryAction" href="#">@T("Create a new specification")</a></div>
<div class="actions" style="margin-bottom: 15px;"><a class="add button primaryAction" href="@Url.Action("Create", "TransliterationAdmin")">@T("Create a new specification")</a></div>
<table class="items">
<thead>
<tr>
@@ -21,21 +21,21 @@
</thead>
@foreach (var currentSpecification in currentSpecifications) {
CultureInfo cultureInfoFrom = CultureInfo.GetCultureInfo(currentSpecification.CultureFrom);
CultureInfo cultureInfoTo = CultureInfo.GetCultureInfo(currentSpecification.CultureTo);
CultureInfo cultureInfoFrom = string.IsNullOrWhiteSpace(currentSpecification.CultureFrom) ? CultureInfo.InvariantCulture : CultureInfo.GetCultureInfo(currentSpecification.CultureFrom);
CultureInfo cultureInfoTo = string.IsNullOrWhiteSpace(currentSpecification.CultureTo) ? CultureInfo.InvariantCulture : CultureInfo.GetCultureInfo(currentSpecification.CultureTo);
<tr>
<td>@cultureInfoFrom.DisplayName</td>
<td>@cultureInfoTo.DisplayName</td>
<td>
@*<a href="@Url.RemoveProviderConfiguration(currentProvider.Id)">@T("Remove")</a>*@
<a href="@Url.Action("Edit", "TransliterationAdmin", new { id = currentSpecification.Id})">@T("Edit")</a> |
<a href="@Url.Action("Remove", "TransliterationAdmin", new { id = currentSpecification.Id})">@T("Remove")</a>
</td>
</tr>
}
</table>
<span class="hint">@T("A provider identifier may not be shown if not supplied by an internal library. Also A key and secret are not required for every mechanism")</span>
}
else {
<p class="nospecifications">@T("There are no specifications registered. Why not <a href=\"{0}\">Create one</a>?", Url.Action("Create"))</p>
<p class="nospecifications">@T("There are no specifications registered. Why not <a href=\"{0}\">Create one</a>?", Url.Action("Create", "TransliterationAdmin"))</p>
}
}