Files
ZeroSpace/ZeroSpace/ZeroSpace.Web/Services/ZeroSpaceLinks.cs
T

54 lines
1.9 KiB
C#

using System.Text.RegularExpressions;
using ZeroSpace.Model;
namespace ZeroSpace.Web.Services;
public static partial class ZeroSpaceLinks
{
private static readonly IReadOnlyDictionary<string, string> SystemUrls = StarSystems.All
.ToDictionary(static system => system.Name, static system => $"/StarSystem/{system.Id}", StringComparer.OrdinalIgnoreCase);
private static readonly IReadOnlyDictionary<string, string> MasteryUrls = SystemMasteries.All
.ToDictionary(static mastery => mastery.Name, static mastery => $"/SystemMastery/{mastery.Id}", StringComparer.OrdinalIgnoreCase);
private static readonly IReadOnlyDictionary<string, string> ReferenceUrls = ReferenceCatalog.All
.ToDictionary(static item => item.Name, static item => item.CanonicalUrl, StringComparer.OrdinalIgnoreCase);
public static string? UrlFor(string name)
{
if (SystemUrls.TryGetValue(name, out var systemUrl))
{
return systemUrl;
}
if (MasteryUrls.TryGetValue(name, out var masteryUrl))
{
return masteryUrl;
}
return ReferenceUrls.TryGetValue(name, out var referenceUrl) ? referenceUrl : null;
}
public static string ResolveWikiLinks(string markdown)
{
return WikiLinkPattern().Replace(markdown, match =>
{
var name = match.Groups[1].Value.Trim();
var url = UrlFor(name);
return url is null ? name : $"[{name}]({url})";
});
}
public static string Humanize(string camelCase)
{
var spaced = CamelCasePattern().Replace(camelCase, " ");
return spaced.Length == 0 ? spaced : char.ToUpperInvariant(spaced[0]) + spaced[1..];
}
[GeneratedRegex(@"\[\[([^\]]+)\]\]")]
private static partial Regex WikiLinkPattern();
[GeneratedRegex("(?<=[a-z0-9])(?=[A-Z])")]
private static partial Regex CamelCasePattern();
}