diff --git a/src/MfGames.Nitride.Markdown/MakeSingleLinkListItems.cs b/src/MfGames.Nitride.Markdown/MakeSingleLinkListItems.cs
new file mode 100644
index 0000000..85ab750
--- /dev/null
+++ b/src/MfGames.Nitride.Markdown/MakeSingleLinkListItems.cs
@@ -0,0 +1,103 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+
+using MfGames.Gallium;
+using MfGames.Nitride.Contents;
+using MfGames.Nitride.Slugs;
+
+namespace MfGames.Nitride.Markdown;
+
+///
+/// An operation that turns list items that starts with a link into a single
+/// link for the entire list item, even if there are additional links in the
+/// list.
+///
+public class MakeSingleLinkListItems : IOperation
+{
+ private readonly ISlugConverter slugs;
+
+ public MakeSingleLinkListItems(ISlugConverter slugs)
+ {
+ this.slugs = slugs;
+ }
+
+ ///
+ public IEnumerable Run(IEnumerable input)
+ {
+ return input
+ .SelectManyEntity(
+ x => x
+ .Select(this.MakeSingleLinkLists));
+ }
+
+ ///
+ /// This turns all links that start with a link into a single link while
+ /// removing all trailing links within the line. This is to simplify the
+ /// rendering of the link on page.
+ ///
+ private Entity MakeSingleLinkLists(Entity entity)
+ {
+ string content = entity.GetText()!;
+
+ string output = Regex.Replace(
+ content,
+ @"- \[\[(?[^\]]+?)\]\](?[^\n]+)\n",
+ match =>
+ {
+ string wiki = match.Groups["label"].ToString();
+ string path = string.Format(
+ "/{0}/",
+ this.slugs.ToSlug(wiki.Split('|').First()));
+ string label = wiki.Split('|').Last();
+ string after = match.Groups["post"].ToString();
+ string post = this.RemoveLinks(after);
+ string value = $"- [{label}{post}]({path})\n";
+
+ return value;
+ });
+
+ output = Regex.Replace(
+ output,
+ @"- \[(?[^\]]+?)\]\((?[^\)]+?)\)(?[^\n]+)\n",
+ match =>
+ {
+ string label = match.Groups["label"].ToString();
+ string path = match.Groups["path"].ToString();
+ string after = match.Groups["post"].ToString();
+ string post = this.RemoveLinks(after);
+ string value = $"- [{label}{post}]({path})\n";
+
+ return value;
+ });
+
+ return entity.SetTextContent(output);
+ }
+
+ ///
+ /// Removes a normal link and replaces it with the text.
+ ///
+ private string RemoveLinks(string input)
+ {
+ string output = Regex.Replace(
+ input,
+ @"\[\[(?[^\]]+)\]\]",
+ match =>
+ {
+ string link1 = match.Groups["label"].ToString();
+ string path1 = string.Format(
+ "/{0}/",
+ this.slugs.ToSlug(link1.Split('|').First()));
+ string label1 = link1.Split('|').Last();
+
+ return label1;
+ });
+
+ output = Regex.Replace(
+ output,
+ @"\[(?[^\]]+)\]\([^)]+\)",
+ match => match.Groups["label"].ToString());
+
+ return output;
+ }
+}
diff --git a/src/MfGames.Nitride.Markdown/MfGames.Nitride.Markdown.csproj b/src/MfGames.Nitride.Markdown/MfGames.Nitride.Markdown.csproj
index c8928df..1423891 100644
--- a/src/MfGames.Nitride.Markdown/MfGames.Nitride.Markdown.csproj
+++ b/src/MfGames.Nitride.Markdown/MfGames.Nitride.Markdown.csproj
@@ -12,6 +12,7 @@
+
diff --git a/tests/MfGames.Nitride.Markdown.Tests/MakeSingleLinkListItemsTests.cs b/tests/MfGames.Nitride.Markdown.Tests/MakeSingleLinkListItemsTests.cs
new file mode 100644
index 0000000..bfde40f
--- /dev/null
+++ b/tests/MfGames.Nitride.Markdown.Tests/MakeSingleLinkListItemsTests.cs
@@ -0,0 +1,100 @@
+using System.Collections.Generic;
+using System.Linq;
+
+using MfGames.Gallium;
+using MfGames.Nitride.Contents;
+using MfGames.Nitride.Markdown;
+using MfGames.Nitride.Tests;
+using MfGames.TestSetup;
+
+using Xunit;
+using Xunit.Abstractions;
+
+namespace MfGames.Nitride.Slugs.Tests;
+
+///
+/// Tests the functionality of the WriteFiles().
+///
+public class MakeSingleLinkListItemsTests : TestBase
+{
+ public MakeSingleLinkListItemsTests(ITestOutputHelper output)
+ : base(output)
+ {
+ }
+
+ [Fact]
+ public void AlreadyFullMarkdownLink()
+ {
+ using MarkdownTestContext context = this.CreateContext();
+
+ List input = new()
+ {
+ new Entity()
+ .Set(IsMarkdown.Instance)
+ .SetTextContent("- [Empty](link)"),
+ };
+ MakeSingleLinkListItems?
+ op = context.Resolve();
+ IEnumerable output = op.Run(input);
+ string content = output.First().GetText()!.Trim();
+
+ Assert.Equal("- [Empty](link)", content);
+ }
+
+ [Fact]
+ public void ExtendSingleMarkdownLink()
+ {
+ using MarkdownTestContext context = this.CreateContext();
+
+ List input = new()
+ {
+ new Entity()
+ .Set(IsMarkdown.Instance)
+ .SetTextContent("- [Empty](link) space"),
+ };
+ MakeSingleLinkListItems?
+ op = context.Resolve();
+ IEnumerable output = op.Run(input);
+ string content = output.First().GetText()!.Trim();
+
+ Assert.Equal("- [Empty space](link)", content);
+ }
+
+ [Fact]
+ public void NoLinksNoChange()
+ {
+ using MarkdownTestContext context = this.CreateContext();
+
+ List input = new()
+ {
+ new Entity()
+ .Set(IsMarkdown.Instance)
+ .SetTextContent("- Empty"),
+ };
+ MakeSingleLinkListItems?
+ op = context.Resolve();
+ IEnumerable output = op.Run(input);
+ string content = output.First().GetText()!.Trim();
+
+ Assert.Equal("- Empty", content);
+ }
+
+ [Fact]
+ public void RemoveSecondMarkdownLink()
+ {
+ using MarkdownTestContext context = this.CreateContext();
+
+ List input = new()
+ {
+ new Entity()
+ .Set(IsMarkdown.Instance)
+ .SetTextContent("- [Empty](link) [space](link2)"),
+ };
+ MakeSingleLinkListItems?
+ op = context.Resolve();
+ IEnumerable output = op.Run(input);
+ string content = output.First().GetText()!.Trim();
+
+ Assert.Equal("- [Empty space](link)", content);
+ }
+}
diff --git a/tests/MfGames.Nitride.Markdown.Tests/MarkdownTestContext.cs b/tests/MfGames.Nitride.Markdown.Tests/MarkdownTestContext.cs
new file mode 100644
index 0000000..1a706e3
--- /dev/null
+++ b/tests/MfGames.Nitride.Markdown.Tests/MarkdownTestContext.cs
@@ -0,0 +1,22 @@
+using Autofac;
+
+using MfGames.Nitride.Markdown;
+using MfGames.Nitride.Tests;
+
+namespace MfGames.Nitride.Slugs.Tests;
+
+public class MarkdownTestContext : NitrideTestContext
+{
+ ///
+ protected override void ConfigureContainer(ContainerBuilder builder)
+ {
+ base.ConfigureContainer(builder);
+ builder.RegisterModule();
+ builder.RegisterModule();
+
+ builder
+ .RegisterType()
+ .As()
+ .SingleInstance();
+ }
+}