Add initial docs

This commit is contained in:
Patrik Svensson
2020-08-27 13:57:25 +02:00
committed by Patrik Svensson
parent decb887b0a
commit f1912b1d44
117 changed files with 9290 additions and 0 deletions

38
docs/src/Constants.cs Normal file
View File

@ -0,0 +1,38 @@
namespace Docs
{
public static class Constants
{
public const string NoContainer = nameof(NoContainer);
public const string NoSidebar = nameof(NoSidebar);
public const string Topic = nameof(Topic);
public const string EditLink = nameof(EditLink);
public const string Description = nameof(Description);
public const string Hidden = nameof(Hidden);
public static class Colors
{
public const string Url = "https://raw.githubusercontent.com/spectresystems/spectre.console/main/resources/scripts/Generator/Data/colors.json";
public const string Root = "COLORS_ROOT";
}
public static class Site
{
public const string Owner = "SITE_OWNER";
public const string Repository = "SITE_REPOSITORY";
public const string Branch = "SITE_BRANCH";
}
public static class Deployment
{
public const string GitHubToken = "GITHUB_TOKEN";
public const string TargetBranch = "DEPLOYMENT_TARGET_BRANCH";
}
public static class Sections
{
public const string Splash = nameof(Splash);
public const string Sidebar = nameof(Sidebar);
public const string Subtitle = nameof(Subtitle);
}
}
}

View File

@ -0,0 +1,30 @@
using Statiq.App;
using Statiq.Common;
using System.Collections.Generic;
using System.Linq;
namespace Docs
{
public static class BootstrapperExtensions
{
public static Bootstrapper ConfigureSite(this Bootstrapper bootstrapper, string owner, string repo, string branch)
{
if (bootstrapper != null)
{
bootstrapper.AddSetting(Constants.Site.Owner, owner);
bootstrapper.AddSetting(Constants.Site.Repository, repo);
bootstrapper.AddSetting(Constants.Site.Branch, branch);
}
return bootstrapper;
}
public static Bootstrapper ConfigureDeployment(this Bootstrapper bootstrapper, string deployBranch)
{
if (bootstrapper != null)
{
bootstrapper.AddSetting(Constants.Deployment.TargetBranch, deployBranch);
}
return bootstrapper;
}
}
}

View File

@ -0,0 +1,33 @@
using Statiq.Common;
using System.Collections.Generic;
using System.Linq;
namespace Docs
{
public static class DocumentExtensions
{
public static string GetDescription(this IDocument document)
{
return document?.GetString(Constants.Description, string.Empty) ?? string.Empty;
}
public static bool HasVisibleChildren(this IDocument document)
{
if (document != null)
{
return document.HasChildren() && document.GetChildren().Any(x => x.IsVisible());
}
return false;
}
public static bool IsVisible(this IDocument document)
{
return !document.GetBool(Constants.Hidden, false);
}
public static IEnumerable<IDocument> OnlyVisible(this IEnumerable<IDocument> source)
{
return source.Where(x => x.IsVisible());
}
}
}

View File

@ -0,0 +1,10 @@
namespace Docs
{
public static class StringExtensions
{
public static bool IsNotEmpty(this string source)
{
return !string.IsNullOrWhiteSpace(source);
}
}
}

92
docs/src/Models/Color.cs Normal file
View File

@ -0,0 +1,92 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
namespace Docs.Models
{
public sealed class Color
{
public int Number { get; set; }
public string Hex { get; set; }
public string Name { get; set; }
public Rgb Rgb { get; set; }
public string ClrName { get; set; }
public int R => Rgb.R;
public int G => Rgb.G;
public int B => Rgb.B;
private static Dictionary<int, string> ClrNames { get; } = new Dictionary<int, string>
{
{ 0, "Black" },
{ 1, "DarkRed" },
{ 2, "DarkGreen" },
{ 3, "DarkYellow" },
{ 4, "DarkBlue" },
{ 5, "DarkMagenta" },
{ 6, "DarkCyan" },
{ 7, "Gray" },
{ 8, "DarkGray" },
{ 9, "Red" },
{ 10, "Green" },
{ 11, "Yellow" },
{ 12, "Blue" },
{ 13, "Magenta" },
{ 14, "Cyan" },
{ 15, "White" },
};
public static IEnumerable<Color> Parse(string json)
{
var source = JsonConvert.DeserializeObject<List<Color>>(json);
var check = new Dictionary<string, Color>(StringComparer.OrdinalIgnoreCase);
foreach (var color in source.OrderBy(c => c.Number))
{
if (ClrNames.TryGetValue(color.Number, out var clrName))
{
color.ClrName = clrName;
}
else
{
color.ClrName = string.Empty;
}
if (!check.ContainsKey(color.Name))
{
check.Add(color.Name, color);
}
else
{
var newName = (string)null;
for (int i = 1; i < 100; i++)
{
if (!check.ContainsKey($"{color.Name}_{i}"))
{
newName = $"{color.Name}_{i}";
break;
}
}
if (newName == null)
{
throw new InvalidOperationException("Impossible!");
}
check.Add(newName, color);
color.Name = newName;
}
}
return source;
}
}
public sealed class Rgb
{
public int R { get; set; }
public int G { get; set; }
public int B { get; set; }
}
}

View File

@ -0,0 +1,14 @@
using System.Collections.Generic;
namespace Docs.Models
{
public sealed class ColorModel
{
public List<Color> Colors { get; set; }
public ColorModel(IEnumerable<Color> colors)
{
Colors = new List<Color>(colors);
}
}
}

View File

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Docs.Models;
using NJsonSchema;
using Statiq.Common;
using Statiq.Core;
namespace Docs.Pipelines
{
public class ColorsPipeline : Pipeline
{
public const string Url = "https://raw.githubusercontent.com/spectresystems/spectre.console/main/resources/scripts/Generator/Data/colors.json";
public ColorsPipeline()
{
InputModules = new ModuleList
{
new ExecuteConfig(
Config.FromContext(ctx => {
return new ReadWeb(Url);
}))
};
ProcessModules = new ModuleList
{
new ExecuteConfig(
Config.FromDocument(async (doc, ctx) =>
{
var colors = Color.Parse(await doc.GetContentStringAsync()).ToList();
var definitions = new List<IDocument> { colors.ToDocument(Constants.Colors.Root) };
return doc.Clone(new MetadataDictionary
{
[Constants.Colors.Root] = definitions
});
}))
};
}
}
}

View File

@ -0,0 +1,22 @@
using Statiq.Common;
using Statiq.Core;
using Statiq.Web.GitHub;
namespace Docs.Pipelines
{
public class DeploymentPipeline : Pipeline
{
public DeploymentPipeline()
{
Deployment = true;
OutputModules = new ModuleList
{
new DeployGitHubPages(
Config.FromSetting<string>(Constants.Site.Owner),
Config.FromSetting<string>(Constants.Site.Repository),
Config.FromSetting<string>(Constants.Deployment.GitHubToken))
.ToBranch(Config.FromSetting<string>(Constants.Deployment.TargetBranch))
};
}
}
}

View File

@ -0,0 +1,34 @@
using System.Collections.Generic;
using Statiq.Common;
using System.Xml.Linq;
namespace Docs.Shortcodes
{
public class ChildrenShortcode : SyncShortcode
{
public override ShortcodeResult Execute(KeyValuePair<string, string>[] args, string content, IDocument document, IExecutionContext context)
{
var ul = new XElement("ul", new XAttribute("class", "list-group"));
foreach (var child in document.GetChildren().OnlyVisible())
{
var li = new XElement("li", new XAttribute("class", "list-group-item"));
var link = new XElement("a", new XAttribute("href", child.GetLink()));
link.Add(child.GetTitle());
li.Add(link);
var description = child.GetDescription();
if (description.IsNotEmpty())
{
li.Add(new XElement("br"));
li.Add(new XElement("i", description));
}
ul.Add(li);
}
return ul.ToString();
}
}
}

View File

@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Linq;
using NJsonSchema;
using Statiq.Common;
using System.Xml.Linq;
using Docs.Pipelines;
using Docs.Models;
namespace Docs.Shortcodes
{
public class ColorTableShortcode : SyncShortcode
{
private const string ColorStyle = "display: inline-block;width: 60px; height: 15px;";
public override ShortcodeResult Execute(KeyValuePair<string, string>[] args, string content, IDocument document, IExecutionContext context)
{
// Get the definition.
var colors = context.Outputs
.FromPipeline(nameof(ColorsPipeline))
.First()
.GetChildren(Constants.Colors.Root)
.OfType<ObjectDocument<List<Color>>>()
.First().Object;
var table = new XElement("table", new XAttribute("class", "table"));
var header = new XElement("tr", new XAttribute("class", "color-row"));
header.Add(new XElement("th", ""));
header.Add(new XElement("th", "Name"));
header.Add(new XElement("th", "RGB"));
header.Add(new XElement("th", "Hex"));
header.Add(new XElement("th", "System.ConsoleColor"));
table.Add(header);
foreach (var color in colors)
{
var rep = new XElement("td",
new XElement("span",
new XAttribute("class", "color-representation"),
new XAttribute("style", $"background-color:{color.Hex};")));
var name = new XElement("td", new XElement("code", color.Name.ToLower()));
var rgb = new XElement("td", new XElement("code", $"{color.R},{color.G},{color.B}"));
var hex = new XElement("td", new XElement("code", color.Hex));
var clr = new XElement("td", new XElement("code", color.ClrName));
// Create row
var row = new XElement("tr");
row.Add(rep);
row.Add(name);
row.Add(rgb);
row.Add(hex);
row.Add(clr);
table.Add(row);
}
return table.ToString();
}
}
}