mirror of
				https://github.com/nsnail/spectre.console.git
				synced 2025-11-01 01:25:27 +08:00 
			
		
		
		
	Docs redesign (#728)
* Adding a dark mode * Adding reference for types to summary pages * Adding API Reference * Adding modifiers to methods/fields/etc * Minimizing files input * Caching a lot of the output pages * Cache only for each execution * Adding API references to existing docs
This commit is contained in:
		| @@ -6,12 +6,13 @@ | ||||
|     <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory> | ||||
|     <DefaultItemExcludes>$(DefaultItemExcludes);output\**;.gitignore</DefaultItemExcludes> | ||||
|     <NoWarn>MVC1000</NoWarn> | ||||
|     <MinVerSkip Condition="'$(Configuration)' == 'Debug'">true</MinVerSkip> | ||||
|     <MinVerSkip>true</MinVerSkip> | ||||
|   </PropertyGroup> | ||||
|  | ||||
|   <ItemGroup> | ||||
|     <Compile Remove="input\**" /> | ||||
|     <Compile Remove="sass\**" /> | ||||
|     <Compile Include="input\api\Sections\_ConstantValue.cshtml.cs" /> | ||||
|   </ItemGroup> | ||||
|  | ||||
|   <ItemGroup> | ||||
| @@ -33,8 +34,10 @@ | ||||
|  | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="Microsoft.Playwright" Version="1.13.0-next-1" /> | ||||
|  | ||||
|     <PackageReference Include="Statiq.Web" Version="1.0.0-beta.34" /> | ||||
|     <PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> | ||||
|     <PackageReference Include="Statiq.CodeAnalysis" Version="1.0.0-beta.56" /> | ||||
|     <PackageReference Include="Statiq.Common" Version="1.0.0-beta.56" /> | ||||
|     <PackageReference Include="Statiq.Web" Version="1.0.0-beta.42" /> | ||||
|     <PackageReference Include="MinVer" PrivateAssets="All" Version="2.3.1" /> | ||||
|   </ItemGroup> | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,9 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Threading.Tasks; | ||||
| using Docs.Extensions; | ||||
| using Docs.Shortcodes; | ||||
| using Docs.Utilities; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Statiq.App; | ||||
| using Statiq.Common; | ||||
| using Statiq.Core; | ||||
| @@ -15,14 +19,28 @@ namespace Docs | ||||
|                 .AddSetting(Keys.Host, "spectreconsole.net") | ||||
|                 .AddSetting(Keys.LinksUseHttps, true) | ||||
|                 .AddSetting(Constants.EditLink, ConfigureEditLink()) | ||||
|                 .AddSetting(Constants.SourceFiles, new List<string> | ||||
|                 { | ||||
|                     "../../src/Spectre.Console/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs", | ||||
|                     "../../src/Spectre.Console.ImageSharp/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs" | ||||
|                 }) | ||||
|                 .AddSetting(Constants.ExampleSourceFiles, new List<string> | ||||
|                     { | ||||
|                         "../../examples/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs", | ||||
|                     } | ||||
|                 ) | ||||
|                 .ConfigureServices(i => | ||||
|                 { | ||||
|                     i.AddSingleton(new TypeNameLinks()); | ||||
|                 }) | ||||
|                 .ConfigureSite("spectreconsole", "spectre.console", "main") | ||||
|                 .ConfigureDeployment(deployBranch: "docs") | ||||
|                  | ||||
|                 .AddShortcode("Children", typeof(ChildrenShortcode)) | ||||
|                 .AddShortcode("ColorTable", typeof(ColorTableShortcode)) | ||||
|                 .AddShortcode("EmojiTable", typeof(EmojiTableShortcode)) | ||||
|                 .AddShortcode("Alert", typeof(AlertShortcode)) | ||||
|                 .AddShortcode("AsciiCast", typeof(AsciiCastShortcode)) | ||||
|                 .AddShortcode("Example", typeof(ExampleSnippet)) | ||||
|                 .AddPipelines() | ||||
|                 .BuildPipeline( | ||||
| 			        "Bootstrap", | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| @{ | ||||
|     Layout = @"/_layout.cshtml"; | ||||
|     Layout = @"_layout.cshtml"; | ||||
| } | ||||
| @@ -1,137 +1,265 @@ | ||||
| @using Docs.Extensions | ||||
| @using Statiq.CodeAnalysis | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
|     <head> | ||||
|         <meta charset="utf-8"> | ||||
|         <meta http-equiv="X-UA-Compatible" content="IE=Edge"> | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
| <head> | ||||
|     <meta charset="utf-8"> | ||||
|     <meta http-equiv="X-UA-Compatible" content="IE=Edge"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|  | ||||
|         <link href="@Context.GetLink("/assets/styles.css")" rel="stylesheet" /> | ||||
|         <link rel="preconnect" href="https://fonts.gstatic.com" /> | ||||
|         <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;700&display=swap" rel="stylesheet" /> | ||||
|     <link href="@Context.GetLink("/assets/styles.css")" rel="stylesheet"/> | ||||
|     <link rel="preconnect" href="https://fonts.gstatic.com"/> | ||||
|     <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;700&display=swap" rel="stylesheet"/> | ||||
|  | ||||
|         <link rel="apple-touch-icon" sizes="180x180" href="@Context.GetLink("/assets/favicons/apple-touch-icon.png")"> | ||||
|         <link rel="icon" type="image/png" sizes="32x32" href="@Context.GetLink("/assets/favicons/favicon-32x32.png")"> | ||||
|         <link rel="icon" type="image/png" sizes="16x16" href="@Context.GetLink("/assets/favicons/favicon-16x16.png")"> | ||||
|     <link rel="apple-touch-icon" sizes="180x180" href="@Context.GetLink("/assets/favicons/apple-touch-icon.png")"> | ||||
|     <link rel="icon" type="image/png" sizes="32x32" href="@Context.GetLink("/assets/favicons/favicon-32x32.png")"> | ||||
|     <link rel="icon" type="image/png" sizes="16x16" href="@Context.GetLink("/assets/favicons/favicon-16x16.png")"> | ||||
|  | ||||
|         @{ | ||||
|             string title = Document.ContainsKey(Keys.Title) ? $"Spectre.Console - {Document.GetString(Keys.Title)}" : "Spectre.Console"; | ||||
|             string description = Document.ContainsKey(Constants.Description) ? Document.GetString(Constants.Description) : "Spectre.Console is a .NET Standard 2.0 library that makes it easier to create beautiful console applications"; | ||||
|             var card = Outputs.FirstOrDefault(i => i.GetString("DocId") == Model.Id.ToString()); | ||||
|             var urlBase = $"https://{Document.GetString(Keys.Host)}/"; | ||||
|         } | ||||
|         <title>@title</title> | ||||
|         <meta name="description" content="@description" /> | ||||
|  | ||||
|         @if(card != null){ | ||||
|             <meta name="twitter:card" content="summary_large_image" /> | ||||
|             <meta name="og:title" content="@title" /> | ||||
|             <meta name="og:description" content="@description" /> | ||||
|             <meta name="og:image" content="@(urlBase + card.Destination)" /> | ||||
|         } | ||||
|  | ||||
|     </head> | ||||
|     <body class="antialiased text-gray-600 min-h-full flex flex-col  bg-gray-50"> | ||||
|         <header class="flex-none text-sm font-medium bg-gradient-to-b from-gray-200 to-gray-100 ring-1 ring-gray-900 ring-opacity-5 shadow py-2 md:py-4"> | ||||
|             <nav class="flex flex-row container mx-auto items-center"> | ||||
|                 <a class="flex flex-row  items-center" href="@Context.GetLink("/")"> | ||||
|                     <img id="logo" class="w-auto h-10 md:h-12" height="48" width="48" src="@Context.GetLink("/assets/logo.svg")" alt="Spectre.Console"> | ||||
|                     <span class="text-lg md:text-2xl font-light ml-2 lg:ml-4 font-mono tracking-tighter">Spectre.Console</span> | ||||
|                 </a> | ||||
|                 <div class="ml-auto"> | ||||
|                     <ul class="flex flex-row"> | ||||
|                         <li> | ||||
|                             <a class="flex flex-row items-center text-red-700" href="https://github.com/sponsors/patriksvensson"> | ||||
|                                 <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor"> | ||||
|                                     <title>Sponsor</title> | ||||
|                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" /> | ||||
|                                 </svg> | ||||
|                                 <span class="hidden sm:block">Sponsor</span> | ||||
|                             </a> | ||||
|                         </li> | ||||
|                         <li class="ml-4"> | ||||
|                             <a class="flex flex-row items-center text-gray-600" href="https://github.com/spectreconsole/spectre.console"> | ||||
|                                 <svg role="img" class="h-6 w-6 mr-2"  stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> | ||||
|                                     <title>GitHub icon</title> | ||||
|                                     <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg> | ||||
|                                 <span class="hidden sm:block">GitHub</span> | ||||
|                             </a> | ||||
|                         </li> | ||||
|                     </ul> | ||||
|                 </div> | ||||
|             </nav> | ||||
|         </header> | ||||
|         <main class="container mx-auto pt-4 md:pt-8 w-full"> | ||||
|             <div class="flex flex-col-reverse lg:flex-row"> | ||||
|                 <nav class="flex-none font-light text-sm xl:text-base sm:mr-16 mt-8 pt-6 lg:mt-0 lg:pt-0 border-t border-gray-300 lg:border-t-0"> | ||||
|                 @{ | ||||
|                     IDocument root = OutputPages["index.html"].First(); | ||||
|                     <div class="text-xl @(Document.IdEquals(root) ? "font-bold" : null)"> | ||||
|                             @if(root.ShowLink()) | ||||
|                             { | ||||
|                                 @Html.DocumentLink(root) | ||||
|                             } | ||||
|                             else | ||||
|                             { | ||||
|                                 @root.GetTitle() | ||||
|                             } | ||||
|                     </div> | ||||
|  | ||||
|                     @foreach (IDocument document in OutputPages.GetChildrenOf(root).OrderBy(i => i.GetInt("Order")).OnlyVisible()) | ||||
|                     { | ||||
|                         if(string.IsNullOrWhiteSpace(document.GetTitle())) | ||||
|                         { | ||||
|                             continue; | ||||
|                         } | ||||
|  | ||||
|                         DocumentList<IDocument> documentChildren = OutputPages.GetChildrenOf(document); | ||||
|                         <div class="text-blue-700 mt-4"> | ||||
|                             @if(document.ShowLink()) | ||||
|                             { | ||||
|                                 @Html.DocumentLink(document) | ||||
|                             } | ||||
|                             else | ||||
|                             { | ||||
|                                 @document.GetTitle() | ||||
|                             } | ||||
|                         </div> | ||||
|  | ||||
|                         @if (documentChildren.OnlyVisible().Any()) | ||||
|                         { | ||||
|                             <div class="ml-2 flex flex-row flex-wrap lg:flex-col border-separate"> | ||||
|                                 @foreach (IDocument child in documentChildren.OnlyVisible()) | ||||
|                                 { | ||||
|                                     <div class="mt-2 mr-4 @(Document.IdEquals(child) ? "font-bold" : null)"> | ||||
|                                         @Html.DocumentLink(child) | ||||
|                                     </div> | ||||
|                                 } | ||||
|                             </div> | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 </nav> | ||||
|                 <article class="flex-1 min-w-0"> | ||||
|                     <header class="text-gray-800 mb-4"> | ||||
|                         <h1 class="text-4xl font-extrabold">@(Document.GetString(Keys.Title) ?? Document.GetTitle())</h1> | ||||
|                         @RenderSection("subheading", required: false) | ||||
|                     </header> | ||||
|                     <div class="prose max-w-none prose-sm lg:prose lg:max-w-none 2xl:prose-xl 2xl:max-w-none text-gray-700 font-light"> | ||||
|                         @RenderBody() | ||||
|                     </div> | ||||
|                 </article> | ||||
|             </div> | ||||
|         </main> | ||||
|  | ||||
|         <footer class="py-4 md:py-8 mt-8 bg-gray-100 text-sm border-t border-gray-200"> | ||||
|             <div class="container"> | ||||
|                 <div class="flex flex-row"> | ||||
|                     <span>© @DateTime.Today.Year Patrik Svensson, Phil Scott</span> | ||||
|                     <span class="ml-auto">@VersionUtilities.GetVersion()</span> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </footer> | ||||
|     @{ | ||||
|         string title = Document.ContainsKey(Keys.Title) ? $"Spectre.Console - {Document.GetString(Keys.Title)}" : "Spectre.Console"; | ||||
|         string description = Document.ContainsKey(Constants.Description) ? Document.GetString(Constants.Description) : "Spectre.Console is a .NET Standard 2.0 library that makes it easier to create beautiful console applications"; | ||||
|         var card = Context.FindCard(Model.Id); | ||||
|         var urlBase = $"https://{Document.GetString(Keys.Host)}/"; | ||||
|     } | ||||
|     <title>@title</title> | ||||
|     <meta name="description" content="@description"/> | ||||
|     <meta name="xref" content="@HtmlEncoder.Encode(Document.GetString(WebKeys.Xref))" /> | ||||
|  | ||||
|     @if (card != null) | ||||
|     { | ||||
|         <meta name="twitter:card" content="summary_large_image"/> | ||||
|         <meta name="og:title" content="@title"/> | ||||
|         <meta name="og:description" content="@description"/> | ||||
|         <meta name="og:image" content="@(urlBase + card)"/> | ||||
|     } | ||||
|  | ||||
|     <script> | ||||
|         if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) { | ||||
|             document.documentElement.classList.add('dark'); | ||||
|         } else { | ||||
|             document.documentElement.classList.remove('dark'); | ||||
|         } | ||||
|     </script> | ||||
|  | ||||
| </head> | ||||
| <body class="antialiased text-slate-800 dark:text-slate-200 bg-slate-100 dark:bg-slate-800 transition-colors min-h-full flex flex-col"> | ||||
| <header class="flex-none sticky top-0 z-40 text-sm font-medium bg-slate-200 backdrop-blur  dark:bg-slate-800 ring-1 ring-slate-900 dark:ring-slate-700 ring-opacity-5 shadow-lg py-2 md:py-4"> | ||||
|     <nav class="flex flex-row container mx-auto items-center"> | ||||
|         <a class="flex flex-row  items-center" href="@Context.GetLink("/")"> | ||||
|  | ||||
|  | ||||
|             <svg xmlns="http://www.w3.org/2000/svg" | ||||
|                  id="logo" class="w-auto h-10 md:h-12 fill-slate-700 dark:fill-slate-400 dark:stroke-slate-900" height="48" width="48" viewBox="0 0 1270.000000 1270.000000" | ||||
|                  preserveAspectRatio="xMidYMid meet"> | ||||
|                 <metadata> | ||||
|                     Created by potrace 1.16, written by Peter Selinger 2001-2019 | ||||
|                 </metadata> | ||||
|                 <g transform="translate(0.000000,1270.000000) scale(0.100000,-0.100000)"> | ||||
|                     <path d="M799 10610 c-199 -48 -354 -191 -414 -383 l-25 -78 0 -3084 0 -3084 | ||||
| 25 -79 c45 -141 155 -270 289 -335 124 -61 -80 -57 2819 -57 l2646 0 5 -43 c3 | ||||
| -23 8 -71 11 -105 13 -137 88 -334 179 -471 57 -85 187 -219 247 -254 25 -15 | ||||
| 76 -34 112 -43 87 -22 163 -7 246 46 120 78 195 211 234 411 l23 124 14 -55 | ||||
| c63 -263 172 -511 326 -741 94 -142 229 -291 313 -348 272 -185 583 -197 750 | ||||
| -30 66 67 84 109 89 215 4 90 4 91 -51 230 -108 276 -137 477 -122 868 l7 196 | ||||
| 77 0 c55 0 118 -11 229 -39 l154 -38 50 -84 c103 -172 221 -427 277 -599 38 | ||||
| -120 70 -274 86 -412 8 -75 21 -155 29 -178 37 -106 117 -199 220 -253 51 -26 | ||||
| 202 -35 283 -17 83 18 193 97 268 192 157 199 256 485 286 825 11 122 6 524 | ||||
| -7 583 -5 24 -1 26 62 43 64 16 67 16 80 0 39 -50 109 -215 149 -351 25 -85 | ||||
| 55 -174 67 -199 73 -156 261 -206 441 -117 65 32 110 70 159 135 128 169 178 | ||||
| 414 157 764 -8 143 -38 350 -55 376 -2 4 7 25 22 46 77 112 168 344 200 504 | ||||
| l16 86 87 28 c188 60 391 170 498 269 132 122 183 230 183 383 0 71 -5 98 -24 | ||||
| 138 -24 52 -82 112 -138 141 -52 28 -205 30 -378 5 -80 -11 -179 -23 -220 -27 | ||||
| l-75 -6 -29 56 c-33 65 -137 182 -211 236 -75 55 -156 94 -382 181 -110 43 | ||||
| -221 87 -245 100 -54 27 -92 69 -125 138 -25 52 -26 59 -20 180 4 69 16 200 | ||||
| 26 291 52 430 53 809 5 1170 -54 405 -249 740 -569 979 -136 102 -297 190 | ||||
| -419 231 l-36 12 0 433 c0 433 0 434 -25 512 -52 167 -171 292 -341 360 l-69 | ||||
| 28 -4215 2 c-2318 0 -4231 -3 -4251 -7z m8363 -1476 c417 -53 735 -193 962 | ||||
| -423 98 -98 155 -175 210 -282 84 -160 117 -292 141 -559 28 -313 17 -684 -30 | ||||
| -1025 -9 -60 -18 -164 -22 -230 -10 -208 22 -314 136 -452 76 -91 124 -118 | ||||
| 391 -218 307 -116 377 -155 450 -249 23 -31 41 -58 39 -60 -2 -2 -47 8 -99 21 | ||||
| -131 35 -268 36 -360 3 -132 -47 -248 -116 -364 -218 -163 -143 -516 -488 | ||||
| -703 -687 -350 -372 -504 -514 -701 -644 -348 -231 -878 -408 -1322 -442 -409 | ||||
| -31 -796 45 -1059 208 -111 69 -249 210 -292 298 -32 65 -34 76 -33 165 1 104 | ||||
| 23 178 85 287 75 131 137 194 430 441 181 152 251 295 250 511 -1 152 -16 223 | ||||
| -117 560 -35 117 -61 217 -58 222 3 5 20 9 38 9 55 0 217 31 261 50 53 23 103 | ||||
| 73 132 131 43 88 56 187 59 437 2 266 -1 258 91 292 108 40 254 21 330 -45 35 | ||||
| -30 35 -32 53 -170 41 -311 106 -484 206 -546 48 -29 168 -48 381 -59 188 -10 | ||||
| 432 -1 548 20 76 14 206 56 266 86 64 32 122 101 144 170 15 49 17 82 12 253 | ||||
| -5 198 -27 398 -52 482 -42 146 -125 221 -290 265 -57 15 -108 19 -268 19 | ||||
| l-197 0 0 45 c0 120 -37 255 -82 300 -76 77 -210 5 -291 -157 -31 -60 -67 | ||||
| -184 -67 -229 0 -27 -6 -34 -41 -50 -65 -29 -159 -98 -195 -144 -34 -43 -67 | ||||
| -119 -79 -181 l-6 -35 -57 28 c-114 57 -270 58 -379 2 -61 -31 -70 -21 -49 54 | ||||
| 33 118 16 442 -29 536 -38 79 -114 84 -188 12 -68 -66 -136 -230 -137 -330 l0 | ||||
| -29 -61 7 c-34 3 -93 6 -131 6 l-69 0 6 48 c14 97 56 282 84 368 155 475 486 | ||||
| 821 963 1008 108 42 308 94 430 110 62 9 124 17 138 20 76 11 479 5 592 -10z | ||||
| m-7029 -78 c18 -8 261 -243 569 -552 582 -584 560 -559 543 -651 -6 -33 -69 | ||||
| -101 -523 -557 -553 -554 -564 -564 -644 -551 -89 15 -151 110 -128 198 10 37 | ||||
| 65 95 463 495 l452 452 -472 473 c-414 414 -472 477 -478 510 -25 132 98 235 | ||||
| 218 183z m7169 -1405 c164 -57 201 -136 234 -502 37 -414 9 -486 -212 -558 | ||||
| -155 -50 -298 -64 -579 -57 -249 6 -398 23 -439 50 -95 62 -177 346 -180 621 | ||||
| -1 135 0 142 28 203 50 109 148 179 304 218 149 37 329 53 567 50 191 -2 216 | ||||
| -4 277 -25z m-2002 -174 c95 -34 118 -52 152 -114 52 -94 63 -159 62 -368 -1 | ||||
| -358 -44 -479 -187 -520 -146 -42 -612 -65 -727 -36 -153 38 -196 98 -226 316 | ||||
| -16 120 -31 487 -21 527 9 35 89 121 140 151 99 58 228 76 522 73 200 -2 214 | ||||
| -3 285 -29z m-1604 -443 c45 -33 67 -70 71 -121 5 -59 -25 -117 -77 -147 -35 | ||||
| -21 -47 -21 -980 -24 -520 -2 -964 0 -988 3 -57 8 -116 60 -130 115 -19 75 12 | ||||
| 146 78 182 34 17 75 18 1017 16 974 -3 982 -3 1009 -24z m5329 -2140 c66 -7 | ||||
| 173 -14 237 -14 103 0 146 5 247 26 24 5 24 5 18 -64 -15 -159 -89 -371 -180 | ||||
| -515 l-43 -68 -57 113 c-72 145 -160 261 -318 422 l-126 128 51 -7 c28 -3 105 | ||||
| -13 171 -21z m-812 -652 c53 -41 140 -115 193 -165 96 -91 224 -231 224 -245 | ||||
| 0 -5 -30 -18 -67 -30 -79 -25 -305 -84 -308 -80 -1 2 -12 53 -24 113 -28 135 | ||||
| -70 268 -127 402 -24 57 -44 106 -44 109 0 9 43 -20 153 -104z m-1173 -560 | ||||
| c-9 -4 -271 61 -315 78 -29 11 -28 12 79 55 59 24 111 46 114 49 3 3 33 -36 | ||||
| 67 -87 34 -50 59 -93 55 -95z"/> | ||||
|                 </g> | ||||
|             </svg> | ||||
|             <span class="text-lg md:text-2xl font-light ml-2 lg:ml-4 font-mono tracking-tighter">Spectre.Console</span> | ||||
|         </a> | ||||
|         <div class="ml-auto"> | ||||
|             <ul class="flex flex-row"> | ||||
|                 <li> | ||||
|                     <button aria-label="Toggle Dark Mode" class="mr-4 dark:text-yellow-300 stroke-1 opacity-80" onclick="swapTheme()"> | ||||
|                         <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"> | ||||
|                             <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/> | ||||
|                         </svg> | ||||
|                     </button> | ||||
|                 </li> | ||||
|                 <li> | ||||
|                     <a class="flex flex-row items-center text-rose-700 dark:text-rose-500" href="https://github.com/sponsors/patriksvensson"> | ||||
|                         <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-1" fill="none" viewBox="0 0 24 24" stroke="currentColor"> | ||||
|                             <title>Sponsor</title> | ||||
|                             <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"/> | ||||
|                         </svg> | ||||
|                         <span class="hidden sm:block">Sponsor</span> | ||||
|                     </a> | ||||
|                 </li> | ||||
|                 <li class="ml-4"> | ||||
|                     <a class="flex flex-row items-center text-gray-600 fill-slate-200 stroke-slate-800 fill-slate-900 dark:stroke-slate-500 dark:fill-slate-300 dark:text-slate-300" href="https://github.com/spectreconsole/spectre.console"> | ||||
|                         <svg role="img" class="h-6 w-6 mr-1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> | ||||
|                             <title>GitHub icon</title> | ||||
|                             <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/> | ||||
|                         </svg> | ||||
|                         <span class="hidden sm:block">GitHub</span> | ||||
|                     </a> | ||||
|                 </li> | ||||
|  | ||||
|             </ul> | ||||
|         </div> | ||||
|     </nav> | ||||
| </header> | ||||
| <main class="container mx-auto pt-8 w-full"> | ||||
|     <div class="flex flex-col-reverse lg:flex-row"> | ||||
|         <nav class="flex-none font-light text-sm xl:text-base sm:mr-16 mt-8 pt-6 lg:mt-0 lg:pt-0 lg:pb-10  border-t border-gray-300 lg:border-t-0"> | ||||
|             @{ | ||||
|                 var sidebar = Context.GetSidebar(); | ||||
|                 var root = sidebar.Node; | ||||
|                 <div class="text-xl @(Document.IdEquals(root) ? "font-bold" : null)"> | ||||
|                     @if (sidebar.ShowLink) | ||||
|                     { | ||||
|                         @Html.DocumentLink(root) | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         @sidebar.Title; | ||||
|                     } | ||||
|                 </div> | ||||
|  | ||||
|                 @foreach (var sidebarItem in sidebar.Leafs) | ||||
|                 { | ||||
|                     var document = sidebarItem.Node; | ||||
|                     if (string.IsNullOrWhiteSpace(sidebarItem.Title)) | ||||
|                     { | ||||
|                         continue; | ||||
|                     } | ||||
|  | ||||
|                     var documentChildren = sidebarItem.Leafs; | ||||
|                     <div class="text-teal-800 font-medium dark:text-teal-400 mt-4"> | ||||
|                         @if (sidebarItem.ShowLink) | ||||
|                         { | ||||
|                             @Html.DocumentLink(document) | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             @sidebarItem.Title; | ||||
|                         } | ||||
|                     </div> | ||||
|  | ||||
|                     @if (documentChildren.Any()) | ||||
|                     { | ||||
|                         <div class="ml-2 flex flex-row flex-wrap lg:flex-col border-separate"> | ||||
|                             @foreach (var childItem in documentChildren) | ||||
|                             { | ||||
|                                 var child = childItem.Node; | ||||
|                                 <div class="mt-2 mr-4 @(Document.IdEquals(child) ? "font-bold" : null)"> | ||||
|                                     @Html.DocumentLink(child) | ||||
|                                 </div> | ||||
|                             } | ||||
|                         </div> | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         </nav> | ||||
|         <article class="flex-1 min-w-0"> | ||||
|             <header class="text-slate-900 dark:text-slate-50 mb-4"> | ||||
|                 @RenderSection("header", required: false) | ||||
|                 @if (!IsSectionDefined("header")) | ||||
|                 { | ||||
|                     <h1 class="text-4xl font-extrabold">@(Document.GetString(Keys.Title) ?? Document.GetTitle())</h1> | ||||
|                 } | ||||
|  | ||||
|                 @RenderSection("subheading", required: false) | ||||
|             </header> | ||||
|             <div class="prose prose-slate dark:prose-invert max-w-full font-light lg:leading-loose"> | ||||
|                 @RenderBody() | ||||
|  | ||||
|                 @{ | ||||
|                     var referenceLinks = Model.GetList<string>(Constants.ApiReference); | ||||
|                     if (referenceLinks != null) | ||||
|                     { | ||||
|                         <h3>References</h3> | ||||
|                         <ul> | ||||
|                             @foreach (var link in referenceLinks) | ||||
|                             { | ||||
|                                 if (Context.TryGetXrefDocument(link, out var refDoc, out string error)) | ||||
|                                 { | ||||
|                                     <li> | ||||
|                                         @{ | ||||
|                                             var kind = refDoc.GetString(CodeAnalysisKeys.SpecificKind); | ||||
|                                             var prefix = string.Empty; | ||||
|                                             var containingType = @refDoc.GetDocument(CodeAnalysisKeys.ContainingType); | ||||
|                                             if (containingType != null) | ||||
|                                             { | ||||
|                                                 prefix = containingType.GetString(CodeAnalysisKeys.DisplayName) + "."; | ||||
|                                             } | ||||
|                                         } | ||||
|  | ||||
|                                         @if (!string.IsNullOrWhiteSpace(prefix)){ <span class="text-slate-600 dark:text-slate-400">@prefix</span>}@Html.DocumentLink(refDoc, refDoc.GetString(CodeAnalysisKeys.DisplayName) ?? refDoc.GetTitle()) <span class="ml-4 uppercase text-xs text-slate-700 dark:text-slate-400">@kind</span> | ||||
|                                     </li> | ||||
|                                 } | ||||
|                                 else | ||||
|                                 { | ||||
|                                     Context.LogWarning(Model, $"Error finding xref for {link} - {error}"); | ||||
|                                 } | ||||
|                             } | ||||
|                         </ul> | ||||
|                     } | ||||
|                 } | ||||
|             </div> | ||||
|         </article> | ||||
|     </div> | ||||
| </main> | ||||
|  | ||||
| <footer class="py-4 md:py-8 mt-8 bg-gray-100 dark:bg-slate-800 text-sm border-t border-gray-200 dark:border-slate-700"> | ||||
|     <div class="container"> | ||||
|         <div class="flex flex-row"> | ||||
|             <span>© @DateTime.Today.Year Patrik Svensson, Phil Scott</span> | ||||
|             <span class="ml-auto">@VersionUtilities.GetVersion()</span> | ||||
|         </div> | ||||
|     </div> | ||||
| </footer> | ||||
|  | ||||
|  | ||||
| <script> | ||||
|         // adapted from https://www.w3schools.com/howto/howto_js_filter_table.asp | ||||
|         function search(input, searchTarget, columnIndex) { | ||||
|             // Declare variables | ||||
| @@ -154,13 +282,25 @@ | ||||
|             } | ||||
|         } | ||||
|     </script> | ||||
|         <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/prism.min.js" integrity="sha512-YBk7HhgDZvBxmtOfUdvX0z8IH2d10Hp3aEygaMNhtF8fSOvBZ16D/1bXZTJV6ndk/L/DlXxYStP8jrF77v2MIg==" crossorigin="anonymous"></script> | ||||
| 	    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/plugins/autoloader/prism-autoloader.min.js" integrity="sha512-zc7WDnCM3aom2EziyDIRAtQg1mVXLdILE09Bo+aE1xk0AM2c2cVLfSW9NrxE5tKTX44WBY0Z2HClZ05ur9vB6A==" crossorigin="anonymous"></script> | ||||
|         <script src="@Context.GetLink("/assets/asciinema-player.js")"></script> | ||||
|         <script> | ||||
| <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/prism.min.js" integrity="sha512-YBk7HhgDZvBxmtOfUdvX0z8IH2d10Hp3aEygaMNhtF8fSOvBZ16D/1bXZTJV6ndk/L/DlXxYStP8jrF77v2MIg==" crossorigin="anonymous"></script> | ||||
| <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/plugins/autoloader/prism-autoloader.min.js" integrity="sha512-zc7WDnCM3aom2EziyDIRAtQg1mVXLdILE09Bo+aE1xk0AM2c2cVLfSW9NrxE5tKTX44WBY0Z2HClZ05ur9vB6A==" crossorigin="anonymous"></script> | ||||
| <script src="@Context.GetLink("/assets/asciinema-player.js")"></script> | ||||
| <script> | ||||
|             document.querySelectorAll('asciinema-player').forEach(cast => { | ||||
|                 AsciinemaPlayer.create(cast.attributes['src'].value, cast, {autoplay: true, fit: 'none', fontSize: 'inherit'}); | ||||
|             }); | ||||
|         </script> | ||||
|     </body> | ||||
|  | ||||
| <script> | ||||
|             function swapTheme(){ | ||||
|                 if (document.documentElement.classList.contains('dark')) { | ||||
|                     document.documentElement.classList.remove('dark'); | ||||
|                     localStorage.theme = 'light'; | ||||
|                 } else { | ||||
|                     document.documentElement.classList.add('dark'); | ||||
|                     localStorage.theme = 'dark'; | ||||
|                 } | ||||
|             } | ||||
|         </script> | ||||
| </body> | ||||
| </html> | ||||
| @@ -1,7 +1,7 @@ | ||||
| @inherits StatiqRazorPage<IDocument> | ||||
|  | ||||
| @{ | ||||
|     Layout = @"/_layout.cshtml"; | ||||
|     Layout = @"../../_layout.cshtml"; | ||||
| } | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										19
									
								
								docs/input/api/Kind/_Assembly.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								docs/input/api/Kind/_Assembly.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Docs.Pipelines | ||||
| @using Docs.Extensions | ||||
| @foreach (IGrouping<string, IDocument> typeGroup | ||||
|     in Outputs.FromPipeline(nameof(Api)) | ||||
|         .Where(x => x.GetBool(CodeAnalysisKeys.IsResult) | ||||
|                     && x.GetString(CodeAnalysisKeys.Kind) == "NamedType" | ||||
|                     && Document.IdEquals(x.GetDocument(CodeAnalysisKeys.ContainingAssembly))) | ||||
|         .GroupBy(x => x.GetString(CodeAnalysisKeys.SpecificKind)) | ||||
|         .OrderBy(x => x.Key)) | ||||
| { | ||||
|     <h2>@typeGroup.Key</h2> | ||||
|     @foreach (var type in typeGroup) | ||||
|     { | ||||
|         <ul> | ||||
|             <li>@Context.GetTypeLink(type)</li> | ||||
|         </ul> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										4
									
								
								docs/input/api/Kind/_Event.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								docs/input/api/Kind/_Event.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| @await Html.PartialAsync("../Sections/_Syntax.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Examples.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Remarks.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_SeeAlso.cshtml") | ||||
							
								
								
									
										9
									
								
								docs/input/api/Kind/_Field.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								docs/input/api/Kind/_Field.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| @await Html.PartialAsync("../Sections/_Summary.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Syntax.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_SymbolInfo.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Examples.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Remarks.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Attributes.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Parameters.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Value.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_SeeAlso.cshtml") | ||||
							
								
								
									
										10
									
								
								docs/input/api/Kind/_Method.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								docs/input/api/Kind/_Method.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| @await Html.PartialAsync("../Sections/_Summary.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Syntax.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_SymbolInfo.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Examples.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Remarks.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Attributes.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_TypeParameters.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Parameters.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_ReturnValue.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_SeeAlso.cshtml") | ||||
							
								
								
									
										15
									
								
								docs/input/api/Kind/_NamedType.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								docs/input/api/Kind/_NamedType.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| @await Html.PartialAsync("../Sections/_Summary.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Syntax.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_SymbolInfo.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Examples.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Remarks.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Attributes.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_TypeParameters.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Constructors.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Events.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Fields.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Properties.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Methods.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_ExtensionMethods.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Operators.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_SeeAlso.cshtml") | ||||
							
								
								
									
										25
									
								
								docs/input/api/Kind/_Namespace.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								docs/input/api/Kind/_Namespace.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Docs.Extensions | ||||
| @await Html.PartialAsync("../Sections/_Summary.cshtml") | ||||
| @{ | ||||
|     foreach (IGrouping<string, IDocument> typeGroup | ||||
|         in Document.GetDocuments(CodeAnalysisKeys.MemberTypes) | ||||
|             .Where(x => x.GetBool(CodeAnalysisKeys.IsResult) && x.GetString(CodeAnalysisKeys.Kind) == "NamedType") | ||||
|             .GroupBy(x => x.GetString(CodeAnalysisKeys.SpecificKind))) | ||||
|     { | ||||
|         <h3>@typeGroup.Key</h3> | ||||
|         <div class="doc-summary short-term"> | ||||
|             <div> | ||||
|                 <dl> | ||||
|                     @foreach (var type in typeGroup.OrderBy(x => x.GetString(CodeAnalysisKeys.DisplayName)).ToList()) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt>@Context.GetTypeLink(type)</dt> | ||||
|                             <dd>@Html.Raw(type.GetString(CodeAnalysisKeys.Summary))</dd> | ||||
|                         </div> | ||||
|                     } | ||||
|                 </dl> | ||||
|             </div> | ||||
|         </div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										9
									
								
								docs/input/api/Kind/_Property.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								docs/input/api/Kind/_Property.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| @await Html.PartialAsync("../Sections/_Summary.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Syntax.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_SymbolInfo.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Examples.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Remarks.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Attributes.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Parameters.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_Value.cshtml") | ||||
| @await Html.PartialAsync("../Sections/_SeeAlso.cshtml") | ||||
							
								
								
									
										26
									
								
								docs/input/api/Sections/_Attributes.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								docs/input/api/Sections/_Attributes.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Docs.Extensions | ||||
| @{ | ||||
|     IReadOnlyList<IDocument> attributes = Document.GetDocumentList(CodeAnalysisKeys.Attributes); | ||||
|     if (attributes?.Count > 0) | ||||
|     { | ||||
|         <h3>Attributes</h3> | ||||
|         <div class="doc-summary"> | ||||
|             <div> | ||||
|                 <dl> | ||||
|                     @foreach (var attribute in attributes) | ||||
|                     { | ||||
|                         var type = attribute.GetDocument(CodeAnalysisKeys.Type); | ||||
|  | ||||
|                         <div> | ||||
|                             <dt> | ||||
|                                 @Context.GetTypeLink(type) | ||||
|                             </dt> | ||||
|                             <dd>@Html.Raw(type.GetString(CodeAnalysisKeys.Summary))</dd> | ||||
|                         </div> | ||||
|                     } | ||||
|                 </dl> | ||||
|             </div> | ||||
|         </div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										22
									
								
								docs/input/api/Sections/_ConstantValue.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								docs/input/api/Sections/_ConstantValue.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Microsoft.AspNetCore.Html | ||||
| @if(Document.GetBool(CodeAnalysisKeys.HasConstantValue)) | ||||
| { | ||||
|     var constantValue = Document.Get(CodeAnalysisKeys.ConstantValue); | ||||
|  | ||||
|     <h3>Constant Value</h3> | ||||
|     <div class="doc-summary"> | ||||
|         <div> | ||||
|             <dl> | ||||
|  | ||||
|                 <div> | ||||
|  | ||||
|                     <dt> | ||||
|                         @(new HtmlString(constantValue?.ToString() ?? "null")) | ||||
|                     </dt> | ||||
|                     <dd>@(new HtmlString(constantValue?.GetType().Name ?? string.Empty))</dd> | ||||
|                 </div> | ||||
|             </dl> | ||||
|         </div> | ||||
|     </div> | ||||
| } | ||||
							
								
								
									
										6
									
								
								docs/input/api/Sections/_ConstantValue.cshtml.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								docs/input/api/Sections/_ConstantValue.cshtml.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| namespace Docs.input.api.Sections; | ||||
|  | ||||
| public class _ConstantValue_cshtml | ||||
| { | ||||
|      | ||||
| } | ||||
							
								
								
									
										29
									
								
								docs/input/api/Sections/_Constructors.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								docs/input/api/Sections/_Constructors.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Docs.Extensions | ||||
|  | ||||
| @{ | ||||
|     var constructors = Document.GetDocumentList(CodeAnalysisKeys.Constructors) | ||||
|         ?.Where(x => x.GetBool(CodeAnalysisKeys.IsResult)) | ||||
|         .OrderBy(x => x.GetString(CodeAnalysisKeys.DisplayName)) | ||||
|         .ToList(); | ||||
|  | ||||
|     if (constructors?.Count > 0) | ||||
|     { | ||||
|         <h3>Constructors</h3> | ||||
|         <div class="doc-summary"> | ||||
|             <div> | ||||
|                 <dl> | ||||
|                     @foreach (var constructor in constructors) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt> | ||||
|                                 @constructor.GetModifiers() @Context.GetTypeLink(constructor, false) | ||||
|                             </dt> | ||||
|                             <dd>@Html.Raw(constructor.GetString(CodeAnalysisKeys.Summary))</dd> | ||||
|                         </div> | ||||
|                     } | ||||
|                 </dl> | ||||
|             </div> | ||||
|         </div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										0
									
								
								docs/input/api/Sections/_DocumentList.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								docs/input/api/Sections/_DocumentList.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								docs/input/api/Sections/_Events.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								docs/input/api/Sections/_Events.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										9
									
								
								docs/input/api/Sections/_Examples.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								docs/input/api/Sections/_Examples.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @{ | ||||
|     var examples = Document.GetString(CodeAnalysisKeys.Example); | ||||
|     if (!examples.IsNullOrWhiteSpace()) | ||||
|     { | ||||
|         <h3>Examples</h3> | ||||
|         <div>@Html.Raw(examples)</div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										40
									
								
								docs/input/api/Sections/_ExtensionMethods.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								docs/input/api/Sections/_ExtensionMethods.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Docs.Extensions | ||||
| @using Microsoft.CodeAnalysis | ||||
|  | ||||
| @{ | ||||
|     var modelSymbol = Document.Get<ITypeSymbol>(CodeAnalysisKeys.Symbol); | ||||
|     IReadOnlyList<IDocument> methods = Document.GetDocumentList(CodeAnalysisKeys.ExtensionMethods) | ||||
|         ?.Where(x => x.GetBool(CodeAnalysisKeys.IsResult)) | ||||
|         .OrderBy(x => x.GetString(CodeAnalysisKeys.DisplayName)) | ||||
|         .ToList(); | ||||
|  | ||||
|     if (methods?.Count > 0) | ||||
|     { | ||||
|         <h3>Extension Methods</h3> | ||||
|         <div class="doc-summary"> | ||||
|             <div> | ||||
|                 <dl> | ||||
|                     @foreach (var method in methods) | ||||
|                     { | ||||
|                         ISymbol reducedSymbol = method.Get<IMethodSymbol>(CodeAnalysisKeys.Symbol)?.ReduceExtensionMethod(modelSymbol); | ||||
|                         string reducedName = reducedSymbol?.ToDisplayString(new SymbolDisplayFormat( | ||||
|                             typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypes, | ||||
|                             genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters, | ||||
|                             parameterOptions: SymbolDisplayParameterOptions.IncludeType, | ||||
|                             memberOptions: SymbolDisplayMemberOptions.IncludeParameters, | ||||
|                             miscellaneousOptions: SymbolDisplayMiscellaneousOptions.UseSpecialTypes)); | ||||
|  | ||||
|                         <div> | ||||
|                             <dt> | ||||
|                                 @method.GetModifiers(skipStatic:true) @method.GetDocument(CodeAnalysisKeys.ReturnType).GetString(CodeAnalysisKeys.DisplayName) @Context.GetTypeLink(method,reducedName, false) | ||||
|                             </dt> | ||||
|                             <dd>@Html.Raw(method.GetString(CodeAnalysisKeys.Summary))</dd> | ||||
|                         </div> | ||||
|                     } | ||||
|  | ||||
|                 </dl> | ||||
|             </div> | ||||
|         </div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										59
									
								
								docs/input/api/Sections/_Fields.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								docs/input/api/Sections/_Fields.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Microsoft.AspNetCore.Html | ||||
| @using Docs.Extensions | ||||
| @{ | ||||
|     var isEnum = Document.GetString(CodeAnalysisKeys.SpecificKind) == "Enum"; | ||||
|     IReadOnlyList<IDocument> fields; | ||||
|     if (isEnum) | ||||
|     { | ||||
|         fields = Document.GetDocumentList(CodeAnalysisKeys.Members)?.Where(x => x.GetBool(CodeAnalysisKeys.IsResult) && x.GetString(CodeAnalysisKeys.Kind) == "Field") | ||||
|             .OrderBy(x => x.Get(CodeAnalysisKeys.ConstantValue) as int? ?? 0) | ||||
|             .ToList(); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         fields = Document.GetDocumentList(CodeAnalysisKeys.Members)?.Where(x => x.GetBool(CodeAnalysisKeys.IsResult) && x.GetString(CodeAnalysisKeys.Kind) == "Field") | ||||
|             .OrderBy(x => x.GetString(CodeAnalysisKeys.DisplayName)) | ||||
|             .ToList(); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     if (fields?.Count > 0) | ||||
|     { | ||||
|         <h3>Fields</h3> | ||||
|         <div class="doc-summary"> | ||||
|             <div> | ||||
|                 <dl> | ||||
|                     @foreach (var field in fields) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt> | ||||
|  | ||||
|                                 <div class="flex flex-row"> | ||||
|                                     <div class="w-4/5"> | ||||
|                                         @if (isEnum) | ||||
|                                         { | ||||
|                                             @Context.GetTypeLink(field, false) | ||||
|                                         } | ||||
|                                         else | ||||
|                                         { | ||||
|                                             @field.GetModifiers() @Context.GetTypeLink(field.GetDocument(CodeAnalysisKeys.Type)) | ||||
|                                             @Context.GetTypeLink(field, false) | ||||
|                                         } | ||||
|                                     </div> | ||||
|                                     <div> | ||||
|                                         @(field.GetBool(CodeAnalysisKeys.HasConstantValue) ? new HtmlString(field.Get(CodeAnalysisKeys.ConstantValue)?.ToString() ?? "null") : new HtmlString(string.Empty)) | ||||
|                                     </div> | ||||
|                                 </div> | ||||
|                             </dt> | ||||
|                             <dd> | ||||
|                                 @Html.Raw(field.GetString(CodeAnalysisKeys.Summary)) | ||||
|                             </dd> | ||||
|                         </div> | ||||
|                     } | ||||
|                 </dl> | ||||
|             </div> | ||||
|  | ||||
|         </div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										30
									
								
								docs/input/api/Sections/_Methods.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								docs/input/api/Sections/_Methods.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Docs.Extensions | ||||
|  | ||||
| @{ | ||||
|     IReadOnlyList<IDocument> methods = Model.GetDocumentList(CodeAnalysisKeys.Members) | ||||
|         ?.Where(x => x.GetBool(CodeAnalysisKeys.IsResult) && x.GetString(CodeAnalysisKeys.Kind) == "Method") | ||||
|         .OrderBy(x => x.GetString(CodeAnalysisKeys.DisplayName)) | ||||
|         .ToList(); | ||||
|  | ||||
|     if (methods?.Count > 0) | ||||
|     { | ||||
|         <h3>Methods</h3> | ||||
|         <div class="doc-summary"> | ||||
|             <div> | ||||
|                 <dl> | ||||
|                     @foreach (var method in methods) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt> | ||||
|                                 @method.GetModifiers() @method.GetDocument(CodeAnalysisKeys.ReturnType).GetString(CodeAnalysisKeys.DisplayName) @Context.GetTypeLink(method, false) | ||||
|                             </dt> | ||||
|                             <dd>@Html.Raw(method.GetString(CodeAnalysisKeys.Summary))</dd> | ||||
|                         </div> | ||||
|                     } | ||||
|  | ||||
|                 </dl> | ||||
|             </div> | ||||
|         </div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										0
									
								
								docs/input/api/Sections/_Operators.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								docs/input/api/Sections/_Operators.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										25
									
								
								docs/input/api/Sections/_Parameters.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								docs/input/api/Sections/_Parameters.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Docs.Extensions | ||||
| @{ | ||||
|     var parameters = Model.GetDocumentList(CodeAnalysisKeys.Parameters); | ||||
|     var paramComments = Model.GetList<ReferenceComment>(CodeAnalysisKeys.Params); | ||||
|     if (parameters?.Count > 0) | ||||
|     { | ||||
|         <h3>Parameters</h3> | ||||
|         <div class="doc-summary"> | ||||
|         <div> | ||||
|             <dl> | ||||
|                 @foreach (var parameter in parameters) | ||||
|                 { | ||||
|                     <div> | ||||
|                         <dt> | ||||
|                             @Context.GetTypeLink(parameter.GetDocument(CodeAnalysisKeys.Type)) <span class="identifier">@parameter.GetString(CodeAnalysisKeys.Name)</span> | ||||
|                         </dt> | ||||
|                         <dd>@Html.Raw(paramComments?.Where(x => x.Name.Equals(parameter.GetString(CodeAnalysisKeys.Name))).Select(x => x.Html).FirstOrDefault()) </dd> | ||||
|                     </div> | ||||
|                 } | ||||
|             </dl> | ||||
|         </div> | ||||
|         </div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										30
									
								
								docs/input/api/Sections/_Properties.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								docs/input/api/Sections/_Properties.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Docs.Extensions | ||||
| @{ | ||||
|     IReadOnlyList<IDocument> properties = Model.GetDocumentList(CodeAnalysisKeys.Members) | ||||
|         ?.Where(x => x.GetBool(CodeAnalysisKeys.IsResult) && x.GetString(CodeAnalysisKeys.Kind) == "Property") | ||||
|         .OrderBy(x => x.GetString(CodeAnalysisKeys.DisplayName)) | ||||
|         .ToList(); | ||||
|  | ||||
|     if (properties?.Count > 0) | ||||
|     { | ||||
|         <h3>Properties</h3> | ||||
|  | ||||
|         <div class="doc-summary"> | ||||
|  | ||||
|             <div> | ||||
|                 <dl> | ||||
|                     @foreach (var property in properties) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt> | ||||
|                                 @property.GetModifiers() @property.GetDocument(CodeAnalysisKeys.Type).GetString(CodeAnalysisKeys.DisplayName) @Context.GetTypeLink(property, false) | ||||
|                             </dt> | ||||
|                             <dd>@Html.Raw(property.GetString(CodeAnalysisKeys.Summary))</dd> | ||||
|                         </div> | ||||
|                     } | ||||
|                 </dl> | ||||
|             </div> | ||||
|         </div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										9
									
								
								docs/input/api/Sections/_Remarks.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								docs/input/api/Sections/_Remarks.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @{ | ||||
|     var remarks = Document.GetString(CodeAnalysisKeys.Remarks); | ||||
|     if (!remarks.IsNullOrWhiteSpace()) | ||||
|     { | ||||
|         <h3>Remarks</h3> | ||||
|         <div>@Html.Raw(remarks)</div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										23
									
								
								docs/input/api/Sections/_ReturnValue.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								docs/input/api/Sections/_ReturnValue.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Docs.Extensions | ||||
| @{ | ||||
|     var returnType = Model.GetDocument(CodeAnalysisKeys.ReturnType); | ||||
|     var returns = Model.GetString(CodeAnalysisKeys.Returns); | ||||
|     if ((returnType != null && returnType.GetString(CodeAnalysisKeys.DisplayName) != "void") || !string.IsNullOrWhiteSpace(returns)) | ||||
|     { | ||||
|         <h3>Returns</h3> | ||||
|         <div class="doc-summary"> | ||||
|             <div> | ||||
|                 <dl> | ||||
|                     <div> | ||||
|  | ||||
|                         <dt> | ||||
|                             @Context.GetTypeLink(returnType, false) | ||||
|                         </dt> | ||||
|                         <dd></dd> | ||||
|                     </div> | ||||
|                 </dl> | ||||
|             </div> | ||||
|         </div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										14
									
								
								docs/input/api/Sections/_SeeAlso.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								docs/input/api/Sections/_SeeAlso.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @{ | ||||
|     var seeAlso = Document.GetList<string>(CodeAnalysisKeys.SeeAlso); | ||||
|     if (seeAlso?.Count > 0) | ||||
|     { | ||||
|         <h3 id="SeeAlso">See Also</h3> | ||||
|         <ul> | ||||
|             @foreach (string seeAlsoComment in seeAlso) | ||||
|             { | ||||
|                 <li>@Html.Raw(seeAlsoComment)</li> | ||||
|             } | ||||
|         </ul> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										7
									
								
								docs/input/api/Sections/_Summary.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								docs/input/api/Sections/_Summary.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| @{ | ||||
|     var summary = Document.GetString("Summary"); | ||||
|     if (!summary.IsNullOrWhiteSpace()) | ||||
|     { | ||||
|         <div class="my-4 md:my-8">@Html.Raw(summary)</div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										131
									
								
								docs/input/api/Sections/_SymbolInfo.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								docs/input/api/Sections/_SymbolInfo.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,131 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Docs.Extensions | ||||
| @{ | ||||
|     var containingAssembly = Document.GetDocument(CodeAnalysisKeys.ContainingAssembly); | ||||
|     var containingNamespace = Document.GetDocument(CodeAnalysisKeys.ContainingNamespace); | ||||
|     var containingType = Document.GetDocument(CodeAnalysisKeys.ContainingType); | ||||
|     var type = Document.GetDocument(CodeAnalysisKeys.Type); | ||||
|     var overridden = Document.GetDocument(CodeAnalysisKeys.Overridden); | ||||
|     IReadOnlyList<IDocument> allInterfaces = Document.GetDocumentList(CodeAnalysisKeys.AllInterfaces); | ||||
|     IReadOnlyList<IDocument> baseTypes = Document.GetDocumentList(CodeAnalysisKeys.BaseTypes)? | ||||
|         .Where(i => !i.GetString(CodeAnalysisKeys.QualifiedName).Equals("System.Object")) | ||||
|         .Reverse() | ||||
|         .ToList(); | ||||
|     IReadOnlyList<IDocument> derivedTypes = Document.GetDocumentList(CodeAnalysisKeys.DerivedTypes); | ||||
|     IReadOnlyList<IDocument> implementingTypes = Document.GetDocumentList(CodeAnalysisKeys.ImplementingTypes); | ||||
|     if (containingAssembly is object | ||||
|         || containingNamespace is object | ||||
|         || allInterfaces?.Count > 0 | ||||
|         || baseTypes?.Count > 0 | ||||
|         || derivedTypes?.Count > 0 | ||||
|         || implementingTypes?.Count > 0) | ||||
|     { | ||||
|         <div class="doc-summary tiny-term"> | ||||
|             <div> | ||||
|                 <dl> | ||||
|  | ||||
|                     @if (containingAssembly != null) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt>Assembly</dt> | ||||
|                             <dd>containingAssembly</dd> | ||||
|                         </div> | ||||
|                     } | ||||
|  | ||||
|                     @if (containingNamespace != null) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt>Namespace</dt> | ||||
|                             <dd>@Context.GetTypeLink(containingNamespace)</dd> | ||||
|                         </div> | ||||
|                     } | ||||
|  | ||||
|                     @if (containingType != null) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt>Containing Type</dt> | ||||
|                             <dd>@Context.GetTypeLink(containingType)</dd> | ||||
|                         </div> | ||||
|                     } | ||||
|  | ||||
|                     @if (overridden != null) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt>Overridden</dt> | ||||
|                             <dd>@Context.GetTypeLink(overridden)</dd> | ||||
|                         </div> | ||||
|                     } | ||||
|  | ||||
|                     @if (allInterfaces?.Count > 0) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt>Interfaces</dt> | ||||
|                             <dd> | ||||
|                                 <ul class="list-unstyled"> | ||||
|                                     @foreach (var interfaceDocument in allInterfaces) | ||||
|                                     { | ||||
|                                         <li>@Context.GetTypeLink(interfaceDocument)</li> | ||||
|                                     } | ||||
|                                 </ul> | ||||
|                             </dd> | ||||
|                         </div> | ||||
|                     } | ||||
|  | ||||
|                     @if (baseTypes?.Count > 0) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt>Base Types</dt> | ||||
|                             <dd> | ||||
|                                 <ul class="list-unstyled"> | ||||
|                                     @foreach (var baseType in baseTypes) | ||||
|                                     { | ||||
|                                         <li>@Context.GetTypeLink(baseType)</li> | ||||
|                                     } | ||||
|                                 </ul> | ||||
|                             </dd> | ||||
|                         </div> | ||||
|                     } | ||||
|  | ||||
|                     @if (derivedTypes?.Count > 0) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt>Derived Types</dt> | ||||
|                             <dd> | ||||
|                                 <ul class="list-unstyled"> | ||||
|                                     @foreach (var derivedType in derivedTypes) | ||||
|                                     { | ||||
|                                         <li>@Context.GetTypeLink(derivedType)</li> | ||||
|                                     } | ||||
|                                 </ul> | ||||
|                             </dd> | ||||
|                         </div> | ||||
|                     } | ||||
|  | ||||
|                     @if (implementingTypes?.Count > 0) | ||||
|  | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt>Implementing Types</dt> | ||||
|                             <dd> | ||||
|                                 <ul class="list-unstyled"> | ||||
|                                     @foreach (var implementingType in implementingTypes) | ||||
|                                     { | ||||
|                                         <li>@Context.GetTypeLink(implementingType)</li> | ||||
|                                     } | ||||
|                                 </ul> | ||||
|                             </dd> | ||||
|                         </div> | ||||
|                     } | ||||
|  | ||||
|                     @if (type != null) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt>@Document.GetString(CodeAnalysisKeys.Kind) Type</dt> | ||||
|                             <dd>@Context.GetTypeLink(type)</dd> | ||||
|                         </div> | ||||
|                     } | ||||
|                 </dl> | ||||
|             </div> | ||||
|         </div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										8
									
								
								docs/input/api/Sections/_Syntax.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								docs/input/api/Sections/_Syntax.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @{ | ||||
|     string syntax = Document.GetString(CodeAnalysisKeys.Syntax); | ||||
|     if (!syntax.IsNullOrWhiteSpace()) | ||||
|     { | ||||
|         <pre class="language-csharp"><code class="language-csharp">@syntax</code></pre> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										26
									
								
								docs/input/api/Sections/_TypeParameters.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								docs/input/api/Sections/_TypeParameters.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
|  | ||||
| @{ | ||||
|     var typeParameters = Model.GetDocumentList(CodeAnalysisKeys.TypeParameters); | ||||
|     var typeParams = Model.GetList<ReferenceComment>(CodeAnalysisKeys.TypeParams); | ||||
|  | ||||
|     if (typeParameters?.Count > 0) | ||||
|     { | ||||
|         <h3>Parameters</h3> | ||||
|         <div class="doc-summary"> | ||||
|             <div> | ||||
|                 <dl> | ||||
|                     @foreach (var typeParam in typeParameters) | ||||
|                     { | ||||
|                         <div> | ||||
|                             <dt> | ||||
|                                 <code>@typeParam.GetString(CodeAnalysisKeys.Name)</code> | ||||
|                             </dt> | ||||
|                             <dd>@Html.Raw(typeParams?.Where(x => x.Name.Equals(typeParam.GetString(CodeAnalysisKeys.Name))).Select(x => x.Html).FirstOrDefault()) </dd> | ||||
|                         </div> | ||||
|                     } | ||||
|                 </dl> | ||||
|             </div> | ||||
|         </div> | ||||
|     } | ||||
| } | ||||
							
								
								
									
										12
									
								
								docs/input/api/Sections/_Value.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								docs/input/api/Sections/_Value.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Docs.Extensions | ||||
| @{ | ||||
|     IDocument type = Document.GetDocument(CodeAnalysisKeys.Type); | ||||
|     string value = Document.GetString(CodeAnalysisKeys.Value); | ||||
| } | ||||
|  | ||||
| @if (type is object && !string.IsNullOrWhiteSpace(value)) | ||||
| { | ||||
|     <p>@Context.GetTypeLink(type)</p> | ||||
|     <p>@Html.Raw(value)</p> | ||||
| } | ||||
							
								
								
									
										48
									
								
								docs/input/api/_layout.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								docs/input/api/_layout.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| @using Statiq.CodeAnalysis | ||||
| @using Docs.Extensions | ||||
| @inherits StatiqRazorPage<IDocument> | ||||
|  | ||||
| @{ | ||||
|     Layout = @"../_layout.cshtml"; | ||||
| } | ||||
|  | ||||
| @section header{ | ||||
|     <h1 class="text-4xl align-baseline font-extrabold"> | ||||
|         @Document.GetString(CodeAnalysisKeys.DisplayName) <span class="text-2xl text-uppercase text-sky-600 dark:text-sky-400">@Document.GetString(CodeAnalysisKeys.SpecificKind)</span> | ||||
|     </h1> | ||||
|  | ||||
|     <nav class="flex mt-2" aria-label="Breadcrumb"> | ||||
|         <ol class="flex flex-col sm:flex-row sm:items-center space-x-2 lg:space-x-3"> | ||||
|             @{ | ||||
|                 var isFirst = true; | ||||
|             } | ||||
|             @foreach (var parent in Context.GetExecutionCache("sidebar", ctx => ctx.OutputPages).GetAncestorsOf(Document, Document.IdEquals(Model)).Reverse().Skip(1)) | ||||
|             { | ||||
|                 <li> | ||||
|                     <div class="flex items-center"> | ||||
|                         @if (isFirst) | ||||
|                         { | ||||
|                             isFirst = false; | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             <svg class="flex-shrink-0 h-5 w-5 mr-2 lg:mr-3 text-slate-400 dark:text-slate-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"> | ||||
|                                 <path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd"/> | ||||
|                             </svg> | ||||
|                         } | ||||
|  | ||||
|                         <span class="font-light text-sm text-slate-600 dark:text-slate-300" >@Html.DocumentLink(parent, parent.GetString(WebKeys.Title, parent.GetTitle()))</span> | ||||
|                     </div> | ||||
|                 </li> | ||||
|             } | ||||
|         </ol> | ||||
|     </nav> | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| @await Html.PartialAsync($"Kind/_{Model.GetString(CodeAnalysisKeys.Kind)}.cshtml", Model) | ||||
|  | ||||
| @{ | ||||
|     IgnoreBody(); | ||||
| } | ||||
							
								
								
									
										11
									
								
								docs/input/api/index.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								docs/input/api/index.cshtml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| Title: API Reference | ||||
| Order: 10000 | ||||
| --- | ||||
| <p>The Spectre.Console API reference is organized by namespace. Each namespace has one or more classes for working with Console applications.</p> | ||||
|  | ||||
| <ul> | ||||
|     @foreach (var child in OutputPages.GetChildrenOf(Document).OrderBy(i => i.GetTitle())) | ||||
|     { | ||||
|         <li>@Html.DocumentLink(child)</li> | ||||
|     } | ||||
| </ul> | ||||
| @@ -1,7 +1,6 @@ | ||||
| Title: Appendix | ||||
| Order: 100 | ||||
| --- | ||||
|  | ||||
| <h1>Sections</h1> | ||||
|  | ||||
| <ul> | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| {"version": 2, "width": 122, "height": 12, "title": "custom-colors-exception (plain)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[37mInvalidOperationException\u001B[0m: \u001B[37mWhaaat?\u001B[0m\r\n     \u001B[37mInvalidCredentialException\u001B[0m: \u001B[37mThe credentials are invalid.\u001B[0m                                                           \r\n       \u001B[37mat\u001B[0m \u001B[31mvoid\u001B[0m \u001B[31mCheckCredentials\u001B[0m\u001B[37m(\u001B[0m\u001B[31mint\u001B[0m \u001B[37mqux\u001B[0m, \u001B[31mstring[,]\u001B[0m \u001B[37mcorgi)\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=1042481981;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[31mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[37m75\u001B[0m                                           \r\n       \u001B[37mat\u001B[0m \u001B[31mvoid\u001B[0m \u001B[31mDoMagic\u001B[0m\u001B[37m(\u001B[0m\u001B[31mint\u001B[0m \u001B[37mfoo\u001B[0m, \u001B[31mstring[,]\u001B[0m \u001B[37mbar)\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=23697541;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[31mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[37m65\u001B[0m                                                      \r\n  \u001B[37mat\u001B[0m \u001B[31mvoid\u001B[0m \u001B[31mDoMagic\u001B[0m\u001B[37m(\u001B[0m\u001B[31mint\u001B[0m \u001B[37mfoo\u001B[0m, \u001B[31mstring[,]\u001B[0m \u001B[37mbar)\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=859179850;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[31mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[37m69\u001B[0m                                                           \r\n  \u001B[37mat\u001B[0m \u001B[31mctor\u001B[0m\u001B[37m()\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=835958343;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[31mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[37m19\u001B[0m                                                                                         \r\n"] | ||||
| {"version": 2, "width": 102, "height": 12, "title": "custom-colors-exception (plain)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[37mInvalidOperationException\u001B[0m: \u001B[37mWhaaat?\u001B[0m\r\n     \u001B[37mInvalidCredentialException\u001B[0m: \u001B[37mThe credentials are invalid.\u001B[0m                                       \r\n       \u001B[37mat\u001B[0m \u001B[31mvoid\u001B[0m \u001B[31mCheckCredentials\u001B[0m\u001B[37m(\u001B[0m\u001B[31mint\u001B[0m \u001B[37mqux\u001B[0m, \u001B[31mstring[,]\u001B[0m \u001B[37mcorgi)\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=496927177;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[31mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[37m76\u001B[0m                       \r\n       \u001B[37mat\u001B[0m \u001B[31mvoid\u001B[0m \u001B[31mDoMagic\u001B[0m\u001B[37m(\u001B[0m\u001B[31mint\u001B[0m \u001B[37mfoo\u001B[0m, \u001B[31mstring[,]\u001B[0m \u001B[37mbar)\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=260293059;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[31mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[37m66\u001B[0m                                  \r\n  \u001B[37mat\u001B[0m \u001B[31mvoid\u001B[0m \u001B[31mDoMagic\u001B[0m\u001B[37m(\u001B[0m\u001B[31mint\u001B[0m \u001B[37mfoo\u001B[0m, \u001B[31mstring[,]\u001B[0m \u001B[37mbar)\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=311730381;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[31mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[37m70\u001B[0m                                       \r\n  \u001B[37mat\u001B[0m \u001B[31mctor\u001B[0m\u001B[37m()\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=661850274;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[31mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[37m20\u001B[0m                                                                     \r\n"] | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| {"version": 2, "width": 122, "height": 12, "title": "custom-colors-exception (rich)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[38;5;8mInvalidOperationException\u001B[0m: \u001B[38;5;15mWhaaat?\u001B[0m\r\n     \u001B[38;5;8mInvalidCredentialException\u001B[0m: \u001B[38;5;15mThe credentials are invalid.\u001B[0m                                                           \r\n       \u001B[38;5;8mat\u001B[0m \u001B[38;5;9mvoid\u001B[0m \u001B[38;5;9mCheckCredentials\u001B[0m\u001B[38;5;230m(\u001B[0m\u001B[38;5;9mint\u001B[0m \u001B[38;5;230mqux\u001B[0m, \u001B[38;5;9mstring[,]\u001B[0m \u001B[38;5;230mcorgi)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=794652377;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[38;5;9mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;230m75\u001B[0m                                           \r\n       \u001B[38;5;8mat\u001B[0m \u001B[38;5;9mvoid\u001B[0m \u001B[38;5;9mDoMagic\u001B[0m\u001B[38;5;230m(\u001B[0m\u001B[38;5;9mint\u001B[0m \u001B[38;5;230mfoo\u001B[0m, \u001B[38;5;9mstring[,]\u001B[0m \u001B[38;5;230mbar)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=1790687506;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[38;5;9mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;230m65\u001B[0m                                                      \r\n  \u001B[38;5;8mat\u001B[0m \u001B[38;5;9mvoid\u001B[0m \u001B[38;5;9mDoMagic\u001B[0m\u001B[38;5;230m(\u001B[0m\u001B[38;5;9mint\u001B[0m \u001B[38;5;230mfoo\u001B[0m, \u001B[38;5;9mstring[,]\u001B[0m \u001B[38;5;230mbar)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=1362560761;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[38;5;9mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;230m69\u001B[0m                                                           \r\n  \u001B[38;5;8mat\u001B[0m \u001B[38;5;9mctor\u001B[0m\u001B[38;5;230m()\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=618029590;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[38;5;9mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;230m19\u001B[0m                                                                                         \r\n"] | ||||
| {"version": 2, "width": 102, "height": 12, "title": "custom-colors-exception (rich)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[38;5;8mInvalidOperationException\u001B[0m: \u001B[38;5;15mWhaaat?\u001B[0m\r\n     \u001B[38;5;8mInvalidCredentialException\u001B[0m: \u001B[38;5;15mThe credentials are invalid.\u001B[0m                                       \r\n       \u001B[38;5;8mat\u001B[0m \u001B[38;5;9mvoid\u001B[0m \u001B[38;5;9mCheckCredentials\u001B[0m\u001B[38;5;230m(\u001B[0m\u001B[38;5;9mint\u001B[0m \u001B[38;5;230mqux\u001B[0m, \u001B[38;5;9mstring[,]\u001B[0m \u001B[38;5;230mcorgi)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=960633358;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[38;5;9mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;230m76\u001B[0m                       \r\n       \u001B[38;5;8mat\u001B[0m \u001B[38;5;9mvoid\u001B[0m \u001B[38;5;9mDoMagic\u001B[0m\u001B[38;5;230m(\u001B[0m\u001B[38;5;9mint\u001B[0m \u001B[38;5;230mfoo\u001B[0m, \u001B[38;5;9mstring[,]\u001B[0m \u001B[38;5;230mbar)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=93980157;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[38;5;9mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;230m66\u001B[0m                                  \r\n  \u001B[38;5;8mat\u001B[0m \u001B[38;5;9mvoid\u001B[0m \u001B[38;5;9mDoMagic\u001B[0m\u001B[38;5;230m(\u001B[0m\u001B[38;5;9mint\u001B[0m \u001B[38;5;230mfoo\u001B[0m, \u001B[38;5;9mstring[,]\u001B[0m \u001B[38;5;230mbar)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=293733654;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[38;5;9mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;230m70\u001B[0m                                       \r\n  \u001B[38;5;8mat\u001B[0m \u001B[38;5;9mctor\u001B[0m\u001B[38;5;230m()\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=762297770;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[38;5;9mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;230m20\u001B[0m                                                                     \r\n"] | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| {"version": 2, "width": 122, "height": 12, "title": "default-exception (plain)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[37mSystem.\u001B[0m\u001B[37mInvalidOperationException\u001B[0m: \u001B[1;31mWhaaat?\u001B[0m\r\n     \u001B[37mSystem.Security.Authentication.\u001B[0m\u001B[37mInvalidCredentialException\u001B[0m: \u001B[1;31mThe credentials are invalid.\u001B[0m                            \r\n       \u001B[37mat\u001B[0m \u001B[34mvoid\u001B[0m \u001B[37mGenerator.Commands.Samples.Exceptions.\u001B[0m\u001B[37mCheckCredentials\u001B[0m\u001B[37m(\u001B[0m\u001B[34mint\u001B[0m \u001B[37mqux\u001B[0m, \u001B[34mstring[,]\u001B[0m \u001B[37mcorgi)\u001B[0m \u001B[37min\u001B[0m \u001B[1;37mExceptions.cs\u001B[0m\u001B[37m:\u001B[0m\u001B[34m75\u001B[0m     \r\n       \u001B[37mat\u001B[0m \u001B[34mvoid\u001B[0m \u001B[37mGenerator.Commands.Samples.Exceptions.\u001B[0m\u001B[37mDoMagic\u001B[0m\u001B[37m(\u001B[0m\u001B[34mint\u001B[0m \u001B[37mfoo\u001B[0m, \u001B[34mstring[,]\u001B[0m \u001B[37mbar)\u001B[0m \u001B[37min\u001B[0m \u001B[1;37mExceptions.cs\u001B[0m\u001B[37m:\u001B[0m\u001B[34m65\u001B[0m                \r\n  \u001B[37mat\u001B[0m \u001B[34mvoid\u001B[0m \u001B[37mGenerator.Commands.Samples.Exceptions.\u001B[0m\u001B[37mDoMagic\u001B[0m\u001B[37m(\u001B[0m\u001B[34mint\u001B[0m \u001B[37mfoo\u001B[0m, \u001B[34mstring[,]\u001B[0m \u001B[37mbar)\u001B[0m \u001B[37min\u001B[0m \u001B[1;37mExceptions.cs\u001B[0m\u001B[37m:\u001B[0m\u001B[34m69\u001B[0m                     \r\n  \u001B[37mat\u001B[0m \u001B[37mGenerator.Commands.Samples.Exceptions.BaseExceptionSample..\u001B[0m\u001B[37mctor\u001B[0m\u001B[37m()\u001B[0m \u001B[37min\u001B[0m \u001B[1;37mExceptions.cs\u001B[0m\u001B[37m:\u001B[0m\u001B[34m19\u001B[0m                              \r\n"] | ||||
| {"version": 2, "width": 102, "height": 12, "title": "default-exception (plain)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[37mSystem.\u001B[0m\u001B[37mInvalidOperationException\u001B[0m: \u001B[1;31mWhaaat?\u001B[0m\r\n     \u001B[37mSystem.Security.Authentication.\u001B[0m\u001B[37mInvalidCredentialException\u001B[0m: \u001B[1;31mThe credentials are invalid.\u001B[0m        \r\n       \u001B[37mat\u001B[0m \u001B[34mvoid\u001B[0m \u001B[37mSamples.Exceptions.\u001B[0m\u001B[37mCheckCredentials\u001B[0m\u001B[37m(\u001B[0m\u001B[34mint\u001B[0m \u001B[37mqux\u001B[0m, \u001B[34mstring[,]\u001B[0m \u001B[37mcorgi)\u001B[0m \u001B[37min\u001B[0m \u001B[1;37mExceptions.cs\u001B[0m\u001B[37m:\u001B[0m\u001B[34m76\u001B[0m    \r\n       \u001B[37mat\u001B[0m \u001B[34mvoid\u001B[0m \u001B[37mSamples.Exceptions.\u001B[0m\u001B[37mDoMagic\u001B[0m\u001B[37m(\u001B[0m\u001B[34mint\u001B[0m \u001B[37mfoo\u001B[0m, \u001B[34mstring[,]\u001B[0m \u001B[37mbar)\u001B[0m \u001B[37min\u001B[0m \u001B[1;37mExceptions.cs\u001B[0m\u001B[37m:\u001B[0m\u001B[34m66\u001B[0m               \r\n  \u001B[37mat\u001B[0m \u001B[34mvoid\u001B[0m \u001B[37mSamples.Exceptions.\u001B[0m\u001B[37mDoMagic\u001B[0m\u001B[37m(\u001B[0m\u001B[34mint\u001B[0m \u001B[37mfoo\u001B[0m, \u001B[34mstring[,]\u001B[0m \u001B[37mbar)\u001B[0m \u001B[37min\u001B[0m \u001B[1;37mExceptions.cs\u001B[0m\u001B[37m:\u001B[0m\u001B[34m70\u001B[0m                    \r\n  \u001B[37mat\u001B[0m \u001B[37mSamples.Exceptions.BaseExceptionSample..\u001B[0m\u001B[37mctor\u001B[0m\u001B[37m()\u001B[0m \u001B[37min\u001B[0m \u001B[1;37mExceptions.cs\u001B[0m\u001B[37m:\u001B[0m\u001B[34m20\u001B[0m                             \r\n"] | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| {"version": 2, "width": 122, "height": 12, "title": "default-exception (rich)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[38;5;7mSystem.\u001B[0m\u001B[38;5;15mInvalidOperationException\u001B[0m: \u001B[1;38;5;9mWhaaat?\u001B[0m\r\n     \u001B[38;5;7mSystem.Security.Authentication.\u001B[0m\u001B[38;5;15mInvalidCredentialException\u001B[0m: \u001B[1;38;5;9mThe credentials are invalid.\u001B[0m                            \r\n       \u001B[38;5;8mat\u001B[0m \u001B[38;5;12mvoid\u001B[0m \u001B[38;5;7mGenerator.Commands.Samples.Exceptions.\u001B[0m\u001B[38;5;11mCheckCredentials\u001B[0m\u001B[38;5;7m(\u001B[0m\u001B[38;5;12mint\u001B[0m \u001B[38;5;7mqux\u001B[0m, \u001B[38;5;12mstring[,]\u001B[0m \u001B[38;5;7mcorgi)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m75\u001B[0m     \r\n       \u001B[38;5;8mat\u001B[0m \u001B[38;5;12mvoid\u001B[0m \u001B[38;5;7mGenerator.Commands.Samples.Exceptions.\u001B[0m\u001B[38;5;11mDoMagic\u001B[0m\u001B[38;5;7m(\u001B[0m\u001B[38;5;12mint\u001B[0m \u001B[38;5;7mfoo\u001B[0m, \u001B[38;5;12mstring[,]\u001B[0m \u001B[38;5;7mbar)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m65\u001B[0m                \r\n  \u001B[38;5;8mat\u001B[0m \u001B[38;5;12mvoid\u001B[0m \u001B[38;5;7mGenerator.Commands.Samples.Exceptions.\u001B[0m\u001B[38;5;11mDoMagic\u001B[0m\u001B[38;5;7m(\u001B[0m\u001B[38;5;12mint\u001B[0m \u001B[38;5;7mfoo\u001B[0m, \u001B[38;5;12mstring[,]\u001B[0m \u001B[38;5;7mbar)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m69\u001B[0m                     \r\n  \u001B[38;5;8mat\u001B[0m \u001B[38;5;7mGenerator.Commands.Samples.Exceptions.BaseExceptionSample..\u001B[0m\u001B[38;5;11mctor\u001B[0m\u001B[38;5;7m()\u001B[0m \u001B[38;5;8min\u001B[0m \u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m19\u001B[0m                              \r\n"] | ||||
| {"version": 2, "width": 102, "height": 12, "title": "default-exception (rich)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[38;5;7mSystem.\u001B[0m\u001B[38;5;15mInvalidOperationException\u001B[0m: \u001B[1;38;5;9mWhaaat?\u001B[0m\r\n     \u001B[38;5;7mSystem.Security.Authentication.\u001B[0m\u001B[38;5;15mInvalidCredentialException\u001B[0m: \u001B[1;38;5;9mThe credentials are invalid.\u001B[0m        \r\n       \u001B[38;5;8mat\u001B[0m \u001B[38;5;12mvoid\u001B[0m \u001B[38;5;7mSamples.Exceptions.\u001B[0m\u001B[38;5;11mCheckCredentials\u001B[0m\u001B[38;5;7m(\u001B[0m\u001B[38;5;12mint\u001B[0m \u001B[38;5;7mqux\u001B[0m, \u001B[38;5;12mstring[,]\u001B[0m \u001B[38;5;7mcorgi)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m76\u001B[0m    \r\n       \u001B[38;5;8mat\u001B[0m \u001B[38;5;12mvoid\u001B[0m \u001B[38;5;7mSamples.Exceptions.\u001B[0m\u001B[38;5;11mDoMagic\u001B[0m\u001B[38;5;7m(\u001B[0m\u001B[38;5;12mint\u001B[0m \u001B[38;5;7mfoo\u001B[0m, \u001B[38;5;12mstring[,]\u001B[0m \u001B[38;5;7mbar)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m66\u001B[0m               \r\n  \u001B[38;5;8mat\u001B[0m \u001B[38;5;12mvoid\u001B[0m \u001B[38;5;7mSamples.Exceptions.\u001B[0m\u001B[38;5;11mDoMagic\u001B[0m\u001B[38;5;7m(\u001B[0m\u001B[38;5;12mint\u001B[0m \u001B[38;5;7mfoo\u001B[0m, \u001B[38;5;12mstring[,]\u001B[0m \u001B[38;5;7mbar)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m70\u001B[0m                    \r\n  \u001B[38;5;8mat\u001B[0m \u001B[38;5;7mSamples.Exceptions.BaseExceptionSample..\u001B[0m\u001B[38;5;11mctor\u001B[0m\u001B[38;5;7m()\u001B[0m \u001B[38;5;8min\u001B[0m \u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m20\u001B[0m                             \r\n"] | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| {"version": 2, "width": 122, "height": 24, "title": "figlet (plain)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[31m  _               __   _               _   _                              _ \u001B[0m                                            \r\n\u001B[31m | |       ___   / _| | |_      __ _  | | (_)   __ _   _ __     ___    __| |\u001B[0m                                            \r\n\u001B[31m | |      / _ \\ | |_  | __|    / _\u0060 | | | | |  / _\u0060 | | \u0027_ \\   / _ \\  / _\u0060 |\u001B[0m                                            \r\n\u001B[31m | |___  |  __/ |  _| | |_    | (_| | | | | | | (_| | | | | | |  __/ | (_| |\u001B[0m                                            \r\n\u001B[31m |_____|  \\___| |_|    \\__|    \\__,_| |_| |_|  \\__, | |_| |_|  \\___|  \\__,_|\u001B[0m                                            \r\n\u001B[31m                                               |___/                        \u001B[0m                                            \r\n"] | ||||
| [0, "o", "                               \u001B[32m   ____                  _                              _ \u001B[0m                               \r\n                               \u001B[32m  / ___|   ___   _ __   | |_    ___   _ __    ___    __| |\u001B[0m                               \r\n                               \u001B[32m | |      / _ \\ | \u0027_ \\  | __|  / _ \\ | \u0027__|  / _ \\  / _\u0060 |\u001B[0m                               \r\n                               \u001B[32m | |___  |  __/ | | | | | |_  |  __/ | |    |  __/ | (_| |\u001B[0m                               \r\n                               \u001B[32m  \\____|  \\___| |_| |_|  \\__|  \\___| |_|     \\___|  \\__,_|\u001B[0m                               \r\n                               \u001B[32m                                                          \u001B[0m                               \r\n"] | ||||
| [0, "o", "                                     \u001B[34m  ____    _           _       _               _   _                              _ \u001B[0m\r\n                                     \u001B[34m |  _ \\  (_)   __ _  | |__   | |_      __ _  | | (_)   __ _   _ __     ___    __| |\u001B[0m\r\n                                     \u001B[34m | |_) | | |  / _\u0060 | | \u0027_ \\  | __|    / _\u0060 | | | | |  / _\u0060 | | \u0027_ \\   / _ \\  / _\u0060 |\u001B[0m\r\n                                     \u001B[34m |  _ \u003C  | | | (_| | | | | | | |_    | (_| | | | | | | (_| | | | | | |  __/ | (_| |\u001B[0m\r\n                                     \u001B[34m |_| \\_\\ |_|  \\__, | |_| |_|  \\__|    \\__,_| |_| |_|  \\__, | |_| |_|  \\___|  \\__,_|\u001B[0m\r\n                                     \u001B[34m              |___/                                   |___/                        \u001B[0m\r\n"] | ||||
| {"version": 2, "width": 102, "height": 24, "title": "figlet (plain)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[31m  _               __   _               _   _                              _ \u001B[0m                        \r\n\u001B[31m | |       ___   / _| | |_      __ _  | | (_)   __ _   _ __     ___    __| |\u001B[0m                        \r\n\u001B[31m | |      / _ \\ | |_  | __|    / _\u0060 | | | | |  / _\u0060 | | \u0027_ \\   / _ \\  / _\u0060 |\u001B[0m                        \r\n\u001B[31m | |___  |  __/ |  _| | |_    | (_| | | | | | | (_| | | | | | |  __/ | (_| |\u001B[0m                        \r\n\u001B[31m |_____|  \\___| |_|    \\__|    \\__,_| |_| |_|  \\__, | |_| |_|  \\___|  \\__,_|\u001B[0m                        \r\n\u001B[31m                                               |___/                        \u001B[0m                        \r\n"] | ||||
| [0.016, "o", "                     \u001B[32m   ____                  _                              _ \u001B[0m                     \r\n                     \u001B[32m  / ___|   ___   _ __   | |_    ___   _ __    ___    __| |\u001B[0m                     \r\n                     \u001B[32m | |      / _ \\ | \u0027_ \\  | __|  / _ \\ | \u0027__|  / _ \\  / _\u0060 |\u001B[0m                     \r\n                     \u001B[32m | |___  |  __/ | | | | | |_  |  __/ | |    |  __/ | (_| |\u001B[0m                     \r\n                     \u001B[32m  \\____|  \\___| |_| |_|  \\__|  \\___| |_|     \\___|  \\__,_|\u001B[0m                     \r\n                     \u001B[32m                                                          \u001B[0m                     \r\n"] | ||||
| [0.016, "o", "                 \u001B[34m  ____    _           _       _               _   _                              _ \u001B[0m\r\n                 \u001B[34m |  _ \\  (_)   __ _  | |__   | |_      __ _  | | (_)   __ _   _ __     ___    __| |\u001B[0m\r\n                 \u001B[34m | |_) | | |  / _\u0060 | | \u0027_ \\  | __|    / _\u0060 | | | | |  / _\u0060 | | \u0027_ \\   / _ \\  / _\u0060 |\u001B[0m\r\n                 \u001B[34m |  _ \u003C  | | | (_| | | | | | | |_    | (_| | | | | | | (_| | | | | | |  __/ | (_| |\u001B[0m\r\n                 \u001B[34m |_| \\_\\ |_|  \\__, | |_| |_|  \\__|    \\__,_| |_| |_|  \\__, | |_| |_|  \\___|  \\__,_|\u001B[0m\r\n                 \u001B[34m              |___/                                   |___/                        \u001B[0m\r\n"] | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| {"version": 2, "width": 122, "height": 24, "title": "figlet (rich)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[38;5;9m  _               __   _               _   _                              _ \u001B[0m                                            \r\n\u001B[38;5;9m | |       ___   / _| | |_      __ _  | | (_)   __ _   _ __     ___    __| |\u001B[0m                                            \r\n\u001B[38;5;9m | |      / _ \\ | |_  | __|    / _\u0060 | | | | |  / _\u0060 | | \u0027_ \\   / _ \\  / _\u0060 |\u001B[0m                                            \r\n\u001B[38;5;9m | |___  |  __/ |  _| | |_    | (_| | | | | | | (_| | | | | | |  __/ | (_| |\u001B[0m                                            \r\n\u001B[38;5;9m |_____|  \\___| |_|    \\__|    \\__,_| |_| |_|  \\__, | |_| |_|  \\___|  \\__,_|\u001B[0m                                            \r\n\u001B[38;5;9m                                               |___/                        \u001B[0m                                            \r\n"] | ||||
| [0, "o", "                               \u001B[38;5;2m   ____                  _                              _ \u001B[0m                               \r\n                               \u001B[38;5;2m  / ___|   ___   _ __   | |_    ___   _ __    ___    __| |\u001B[0m                               \r\n                               \u001B[38;5;2m | |      / _ \\ | \u0027_ \\  | __|  / _ \\ | \u0027__|  / _ \\  / _\u0060 |\u001B[0m                               \r\n                               \u001B[38;5;2m | |___  |  __/ | | | | | |_  |  __/ | |    |  __/ | (_| |\u001B[0m                               \r\n                               \u001B[38;5;2m  \\____|  \\___| |_| |_|  \\__|  \\___| |_|     \\___|  \\__,_|\u001B[0m                               \r\n                               \u001B[38;5;2m                                                          \u001B[0m                               \r\n"] | ||||
| [0, "o", "                                     \u001B[38;5;12m  ____    _           _       _               _   _                              _ \u001B[0m\r\n                                     \u001B[38;5;12m |  _ \\  (_)   __ _  | |__   | |_      __ _  | | (_)   __ _   _ __     ___    __| |\u001B[0m\r\n                                     \u001B[38;5;12m | |_) | | |  / _\u0060 | | \u0027_ \\  | __|    / _\u0060 | | | | |  / _\u0060 | | \u0027_ \\   / _ \\  / _\u0060 |\u001B[0m\r\n                                     \u001B[38;5;12m |  _ \u003C  | | | (_| | | | | | | |_    | (_| | | | | | | (_| | | | | | |  __/ | (_| |\u001B[0m\r\n                                     \u001B[38;5;12m |_| \\_\\ |_|  \\__, | |_| |_|  \\__|    \\__,_| |_| |_|  \\__, | |_| |_|  \\___|  \\__,_|\u001B[0m\r\n                                     \u001B[38;5;12m              |___/                                   |___/                        \u001B[0m\r\n"] | ||||
| {"version": 2, "width": 102, "height": 24, "title": "figlet (rich)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[38;5;9m  _               __   _               _   _                              _ \u001B[0m                        \r\n\u001B[38;5;9m | |       ___   / _| | |_      __ _  | | (_)   __ _   _ __     ___    __| |\u001B[0m                        \r\n\u001B[38;5;9m | |      / _ \\ | |_  | __|    / _\u0060 | | | | |  / _\u0060 | | \u0027_ \\   / _ \\  / _\u0060 |\u001B[0m                        \r\n\u001B[38;5;9m | |___  |  __/ |  _| | |_    | (_| | | | | | | (_| | | | | | |  __/ | (_| |\u001B[0m                        \r\n\u001B[38;5;9m |_____|  \\___| |_|    \\__|    \\__,_| |_| |_|  \\__, | |_| |_|  \\___|  \\__,_|\u001B[0m                        \r\n\u001B[38;5;9m                                               |___/                        \u001B[0m                        \r\n"] | ||||
| [0, "o", "                     \u001B[38;5;2m   ____                  _                              _ \u001B[0m                     \r\n                     \u001B[38;5;2m  / ___|   ___   _ __   | |_    ___   _ __    ___    __| |\u001B[0m                     \r\n                     \u001B[38;5;2m | |      / _ \\ | \u0027_ \\  | __|  / _ \\ | \u0027__|  / _ \\  / _\u0060 |\u001B[0m                     \r\n                     \u001B[38;5;2m | |___  |  __/ | | | | | |_  |  __/ | |    |  __/ | (_| |\u001B[0m                     \r\n                     \u001B[38;5;2m  \\____|  \\___| |_| |_|  \\__|  \\___| |_|     \\___|  \\__,_|\u001B[0m                     \r\n                     \u001B[38;5;2m                                                          \u001B[0m                     \r\n"] | ||||
| [0, "o", "                 \u001B[38;5;12m  ____    _           _       _               _   _                              _ \u001B[0m\r\n                 \u001B[38;5;12m |  _ \\  (_)   __ _  | |__   | |_      __ _  | | (_)   __ _   _ __     ___    __| |\u001B[0m\r\n                 \u001B[38;5;12m | |_) | | |  / _\u0060 | | \u0027_ \\  | __|    / _\u0060 | | | | |  / _\u0060 | | \u0027_ \\   / _ \\  / _\u0060 |\u001B[0m\r\n                 \u001B[38;5;12m |  _ \u003C  | | | (_| | | | | | | |_    | (_| | | | | | | (_| | | | | | |  __/ | (_| |\u001B[0m\r\n                 \u001B[38;5;12m |_| \\_\\ |_|  \\__, | |_| |_|  \\__|    \\__,_| |_| |_|  \\__, | |_| |_|  \\___|  \\__,_|\u001B[0m\r\n                 \u001B[38;5;12m              |___/                                   |___/                        \u001B[0m\r\n"] | ||||
|  | ||||
|   | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -1,3 +1,3 @@ | ||||
| {"version": 2, "width": 122, "height": 12, "title": "shortened-exception (plain)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[37mInvalidOperationException\u001B[0m: \u001B[1;31mWhaaat?\u001B[0m\r\n     \u001B[37mInvalidCredentialException\u001B[0m: \u001B[1;31mThe credentials are invalid.\u001B[0m                                                           \r\n       \u001B[37mat\u001B[0m \u001B[34mvoid\u001B[0m \u001B[37mCheckCredentials\u001B[0m\u001B[37m(\u001B[0m\u001B[34mint\u001B[0m \u001B[37mqux\u001B[0m, \u001B[34mstring[,]\u001B[0m \u001B[37mcorgi)\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=17125006;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;37mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[34m75\u001B[0m                                           \r\n       \u001B[37mat\u001B[0m \u001B[34mvoid\u001B[0m \u001B[37mDoMagic\u001B[0m\u001B[37m(\u001B[0m\u001B[34mint\u001B[0m \u001B[37mfoo\u001B[0m, \u001B[34mstring[,]\u001B[0m \u001B[37mbar)\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=1265662737;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;37mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[34m65\u001B[0m                                                      \r\n  \u001B[37mat\u001B[0m \u001B[34mvoid\u001B[0m \u001B[37mDoMagic\u001B[0m\u001B[37m(\u001B[0m\u001B[34mint\u001B[0m \u001B[37mfoo\u001B[0m, \u001B[34mstring[,]\u001B[0m \u001B[37mbar)\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=727179011;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;37mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[34m69\u001B[0m                                                           \r\n  \u001B[37mat\u001B[0m \u001B[37mctor\u001B[0m\u001B[37m()\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=276367595;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;37mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[34m19\u001B[0m                                                                                         \r\n"] | ||||
| {"version": 2, "width": 102, "height": 12, "title": "shortened-exception (plain)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[37mInvalidOperationException\u001B[0m: \u001B[1;31mWhaaat?\u001B[0m\r\n     \u001B[37mInvalidCredentialException\u001B[0m: \u001B[1;31mThe credentials are invalid.\u001B[0m                                       \r\n       \u001B[37mat\u001B[0m \u001B[34mvoid\u001B[0m \u001B[37mCheckCredentials\u001B[0m\u001B[37m(\u001B[0m\u001B[34mint\u001B[0m \u001B[37mqux\u001B[0m, \u001B[34mstring[,]\u001B[0m \u001B[37mcorgi)\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=418863998;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;37mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[34m76\u001B[0m                       \r\n       \u001B[37mat\u001B[0m \u001B[34mvoid\u001B[0m \u001B[37mDoMagic\u001B[0m\u001B[37m(\u001B[0m\u001B[34mint\u001B[0m \u001B[37mfoo\u001B[0m, \u001B[34mstring[,]\u001B[0m \u001B[37mbar)\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=1618669281;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;37mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[34m66\u001B[0m                                  \r\n  \u001B[37mat\u001B[0m \u001B[34mvoid\u001B[0m \u001B[37mDoMagic\u001B[0m\u001B[37m(\u001B[0m\u001B[34mint\u001B[0m \u001B[37mfoo\u001B[0m, \u001B[34mstring[,]\u001B[0m \u001B[37mbar)\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=112095567;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;37mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[34m70\u001B[0m                                       \r\n  \u001B[37mat\u001B[0m \u001B[37mctor\u001B[0m\u001B[37m()\u001B[0m \u001B[37min\u001B[0m \u001B]8;id=1341248185;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;37mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[37m:\u001B[0m\u001B[34m20\u001B[0m                                                                     \r\n"] | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| {"version": 2, "width": 122, "height": 12, "title": "shortened-exception (rich)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[38;5;15mInvalidOperationException\u001B[0m: \u001B[1;38;5;9mWhaaat?\u001B[0m\r\n     \u001B[38;5;15mInvalidCredentialException\u001B[0m: \u001B[1;38;5;9mThe credentials are invalid.\u001B[0m                                                           \r\n       \u001B[38;5;8mat\u001B[0m \u001B[38;5;12mvoid\u001B[0m \u001B[38;5;11mCheckCredentials\u001B[0m\u001B[38;5;7m(\u001B[0m\u001B[38;5;12mint\u001B[0m \u001B[38;5;7mqux\u001B[0m, \u001B[38;5;12mstring[,]\u001B[0m \u001B[38;5;7mcorgi)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=339131903;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m75\u001B[0m                                           \r\n       \u001B[38;5;8mat\u001B[0m \u001B[38;5;12mvoid\u001B[0m \u001B[38;5;11mDoMagic\u001B[0m\u001B[38;5;7m(\u001B[0m\u001B[38;5;12mint\u001B[0m \u001B[38;5;7mfoo\u001B[0m, \u001B[38;5;12mstring[,]\u001B[0m \u001B[38;5;7mbar)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=619495582;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m65\u001B[0m                                                      \r\n  \u001B[38;5;8mat\u001B[0m \u001B[38;5;12mvoid\u001B[0m \u001B[38;5;11mDoMagic\u001B[0m\u001B[38;5;7m(\u001B[0m\u001B[38;5;12mint\u001B[0m \u001B[38;5;7mfoo\u001B[0m, \u001B[38;5;12mstring[,]\u001B[0m \u001B[38;5;7mbar)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=262041026;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m69\u001B[0m                                                           \r\n  \u001B[38;5;8mat\u001B[0m \u001B[38;5;11mctor\u001B[0m\u001B[38;5;7m()\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=511470544;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m19\u001B[0m                                                                                         \r\n"] | ||||
| {"version": 2, "width": 102, "height": 12, "title": "shortened-exception (rich)", "env": {"TERM": "Spectre.Console"}} | ||||
| [0, "o", "\u001B[38;5;15mInvalidOperationException\u001B[0m: \u001B[1;38;5;9mWhaaat?\u001B[0m\r\n     \u001B[38;5;15mInvalidCredentialException\u001B[0m: \u001B[1;38;5;9mThe credentials are invalid.\u001B[0m                                       \r\n       \u001B[38;5;8mat\u001B[0m \u001B[38;5;12mvoid\u001B[0m \u001B[38;5;11mCheckCredentials\u001B[0m\u001B[38;5;7m(\u001B[0m\u001B[38;5;12mint\u001B[0m \u001B[38;5;7mqux\u001B[0m, \u001B[38;5;12mstring[,]\u001B[0m \u001B[38;5;7mcorgi)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=248520178;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m76\u001B[0m                       \r\n       \u001B[38;5;8mat\u001B[0m \u001B[38;5;12mvoid\u001B[0m \u001B[38;5;11mDoMagic\u001B[0m\u001B[38;5;7m(\u001B[0m\u001B[38;5;12mint\u001B[0m \u001B[38;5;7mfoo\u001B[0m, \u001B[38;5;12mstring[,]\u001B[0m \u001B[38;5;7mbar)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=122011838;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m66\u001B[0m                                  \r\n  \u001B[38;5;8mat\u001B[0m \u001B[38;5;12mvoid\u001B[0m \u001B[38;5;11mDoMagic\u001B[0m\u001B[38;5;7m(\u001B[0m\u001B[38;5;12mint\u001B[0m \u001B[38;5;7mfoo\u001B[0m, \u001B[38;5;12mstring[,]\u001B[0m \u001B[38;5;7mbar)\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=732431604;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m70\u001B[0m                                       \r\n  \u001B[38;5;8mat\u001B[0m \u001B[38;5;11mctor\u001B[0m\u001B[38;5;7m()\u001B[0m \u001B[38;5;8min\u001B[0m \u001B]8;id=1471369749;file://phil-adler/R:/phil-scott/spectre.console/resources/scripts/Generator/Commands/AsciiCast/Samples/Exceptions.cs\u001B\\\u001B[1;38;5;11mExceptions.cs\u001B[0m\u001B]8;;\u001B\\\u001B[38;5;8m:\u001B[0m\u001B[38;5;12m20\u001B[0m                                                                     \r\n"] | ||||
|  | ||||
|   | ||||
| @@ -7,8 +7,7 @@ | ||||
| <metadata> | ||||
| Created by potrace 1.16, written by Peter Selinger 2001-2019 | ||||
| </metadata> | ||||
| <g transform="translate(0.000000,1270.000000) scale(0.100000,-0.100000)" | ||||
| fill="#000000" stroke="none"> | ||||
| <g transform="translate(0.000000,1270.000000) scale(0.100000,-0.100000)"> | ||||
| <path d="M799 10610 c-199 -48 -354 -191 -414 -383 l-25 -78 0 -3084 0 -3084 | ||||
| 25 -79 c45 -141 155 -270 289 -335 124 -61 -80 -57 2819 -57 l2646 0 5 -43 c3 | ||||
| -23 8 -71 11 -105 13 -137 88 -334 179 -471 57 -85 187 -219 247 -254 25 -15 | ||||
|   | ||||
| Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.5 KiB | 
| @@ -1,6 +1,4 @@ | ||||
|  | ||||
| @inherits StatiqRazorPage<IDocument> | ||||
| @model IDocument | ||||
|  | ||||
| @{ | ||||
|     var older = Model.GetDocument(Keys.Next); | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| @inherits StatiqRazorPage<IEnumerable<IDocument>> | ||||
| @foreach (var post in Model) | ||||
| @foreach (var post in Model ?? Array.Empty<IDocument>()) | ||||
| { | ||||
|     <div> | ||||
|         <h3 class="mb-0"><a href="@Context.GetLink(post)">@post.GetString("Title")</a></h3> | ||||
| @@ -19,7 +19,7 @@ | ||||
|             @if (category != null) { | ||||
|                 var categoryUrl = @Context.GetLink($"blog/{NormalizedPath.OptimizeFileName(category)}/index.html"); | ||||
|                 <span> | ||||
|                     to <a class="text-blue-800 underline" href="@categoryUrl"> | ||||
|                     to <a href="@categoryUrl"> | ||||
|                         @category | ||||
|                     </a> | ||||
|                 </span> | ||||
|   | ||||
| @@ -20,7 +20,7 @@ | ||||
|     } | ||||
|     @if (category != null) { | ||||
|         <span> | ||||
|             to <a class="text-blue-800 underline" href="@Context.GetLink($"blog/{NormalizedPath.OptimizeFileName(@category)}/index.html")"> | ||||
|             to <a href="@Context.GetLink($"blog/{NormalizedPath.OptimizeFileName(@category)}/index.html")"> | ||||
|                 @category | ||||
|             </a> | ||||
|         </span> | ||||
|   | ||||
| @@ -1,6 +1,9 @@ | ||||
| Title: CommandApp | ||||
| Order: 2 | ||||
| Description: "**CommandApp** is the entry point for a *Spectre.Console.Cli* command line application. It is used to configure the settings and commands used for execution of the application." | ||||
| Reference: | ||||
|     - T:Spectre.Console.Cli.CommandApp | ||||
|     - T:Spectre.Console.Cli.CommandApp`1 | ||||
| --- | ||||
|  | ||||
| `CommandApp` is the entry point for a `Spectre.Console.Cli` command line application. It is used to configure the settings and commands used for execution of the application. Most `Spectre.Console.Cli` applications will need to specify a custom configuration using the `Configure` method. | ||||
|   | ||||
| @@ -1,9 +1,12 @@ | ||||
| Title: Creating Commands | ||||
| Order: 6 | ||||
| Description: "How to create commands for *Spectre.Console.Cli*" | ||||
| Reference: | ||||
|     - T:Spectre.Console.Cli.AsyncCommand`1 | ||||
|     - T:Spectre.Console.Cli.Command`1 | ||||
| --- | ||||
|  | ||||
| Commands in `Spectre.Console.Cli` are defined by creating a class that inherits from either `Spectre.Console.Cli.Command<TSettings>` or `Spectre.Console.Cli.AsyncCommand<TSettings>`. `Command<TSettings>` must implement an `Execute` method that returns an int where as `AsyncCommand<TSettings>` must implement `ExecuteAsync`  returning `Task<int>`. | ||||
| Commands in `Spectre.Console.Cli` are defined by creating a class that inherits from either `Command<TSettings>` or `AsyncCommand<TSettings>`. `Command<TSettings>` must implement an `Execute` method that returns an int where as `AsyncCommand<TSettings>` must implement `ExecuteAsync`  returning `Task<int>`. | ||||
|  | ||||
| ```csharp | ||||
| public class HelloCommand : Command<HelloCommand.Settings> | ||||
|   | ||||
| @@ -1,6 +1,10 @@ | ||||
| Title: Specifying Settings | ||||
| Order: 5 | ||||
| Description: "How to define command line argument settings for your *Spectre.Console.Cli* Commands" | ||||
| Reference:  | ||||
|     - T:Spectre.Console.Cli.CommandSettings | ||||
|     - T:Spectre.Console.Cli.CommandArgumentAttribute | ||||
|     - T:Spectre.Console.Cli.CommandOptionAttribute | ||||
| --- | ||||
|  | ||||
| Settings for `Spectre.Console.Cli` commands are defined via classes that inherit from `CommandSettings`. Attributes are used to indicate how the parser interprets the command line arguments and create a runtime instance of the settings to be used. | ||||
|   | ||||
| @@ -4,6 +4,10 @@ Description: "Exceptions aren't always readable when viewed in the terminal. You | ||||
| Highlights: | ||||
|     - Color coded output. | ||||
|     - Shorten long identifiers and paths. | ||||
| Reference: | ||||
|     - M:Spectre.Console.AnsiConsole.WriteException(System.Exception,Spectre.Console.ExceptionFormats) | ||||
|     - M:Spectre.Console.AnsiConsole.WriteException(System.Exception,Spectre.Console.ExceptionSettings) | ||||
|  | ||||
| --- | ||||
|  | ||||
| Exceptions aren't always readable when viewed in the terminal.   | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| Title: Welcome | ||||
| Title: Welcome! | ||||
| Description: Spectre.Console is a .NET Standard 2.0 library that makes it easier to create beautiful console applications. | ||||
| Order: 0 | ||||
| --- | ||||
|   | ||||
| @@ -4,13 +4,15 @@ Description: "*Spectre.Console* can update arbitrary widgets in-place." | ||||
| Highlights: | ||||
|     - Update tables or graphs with new updates. | ||||
|     - Create a custom progress bar that extends the existing control. | ||||
| Reference:  | ||||
|     - T:Spectre.Console.LiveDisplay | ||||
|     - M:Spectre.Console.AnsiConsole.Live(Spectre.Console.Rendering.IRenderable) | ||||
| --- | ||||
|  | ||||
| Spectre.Console can update arbitrary widgets in-place. | ||||
| Spectre.Console can update arbitrary widgets in-place using the [Live Display](xref:T:Spectre.Console.LiveDisplay) widget. | ||||
|  | ||||
| <?# AsciiCast cast="live" /?> | ||||
|  | ||||
|  | ||||
| <?# Alert ?> | ||||
|   The live display is not  | ||||
|   thread safe, and using it together with other interactive components such as  | ||||
|   | ||||
| @@ -6,6 +6,9 @@ Highlights: | ||||
|     - Custom styling of progress bars. | ||||
|     - Multiple predefined columns such as Throughput, Estimated Time Remaining, and more. | ||||
|     - Fallback for non-interactive consoles such as CI runners. | ||||
| Reference:  | ||||
|     - T:Spectre.Console.Progress | ||||
|     - M:Spectre.Console.AnsiConsole.Progress | ||||
| --- | ||||
|  | ||||
| Spectre.Console can display information about long running tasks in the console.  | ||||
|   | ||||
| @@ -5,6 +5,9 @@ Description: "*Spectre.Console* can display information about long running tasks | ||||
| Highlights:  | ||||
|     - Custom spinner control for running tasks. | ||||
|     - Fallback for non-interactive consoles such as CI runners. | ||||
| Reference: | ||||
|     - T:Spectre.Console.Status | ||||
|     - M:Spectre.Console.AnsiConsole.Status | ||||
| --- | ||||
|  | ||||
| Spectre.Console can display information about long running tasks in the console.  | ||||
|   | ||||
| @@ -5,6 +5,10 @@ Highlights: | ||||
|  - Easily add *color*. | ||||
|  - Add hyperlinks to for supported terminals. | ||||
|  - Emoji 🚀 parsing. | ||||
| Reference: | ||||
|  - M:Spectre.Console.AnsiConsole.Markup(System.String) | ||||
|  - M:Spectre.Console.AnsiConsole.MarkupLine(System.String) | ||||
|  - T:Spectre.Console.Markup | ||||
| --- | ||||
|  | ||||
| The `Markup` class allows you to output rich text to the console. | ||||
|   | ||||
| @@ -12,8 +12,7 @@ one or many items from a provided list. | ||||
|  | ||||
| <?# AsciiCast cast="multi-selection" /?> | ||||
|  | ||||
| <?# Alert ?> The use of prompts  | ||||
|   insides status or progress displays is not supported. | ||||
| <?# Alert ?> The use of prompts inside status or progress displays is not supported. | ||||
| <?#/ Alert ?> | ||||
|  | ||||
| ## Usage | ||||
|   | ||||
| @@ -1,6 +1,9 @@ | ||||
| Title: Selection | ||||
| Order: 1 | ||||
| Description: "The **SelectionPrompt** can be used when you want the user to select a single item from a provided list." | ||||
| Reference:  | ||||
|     - T:Spectre.Console.SelectionPrompt`1 | ||||
|     - M:Spectre.Console.AnsiConsole.Prompt``1(Spectre.Console.IPrompt{``0}) | ||||
| --- | ||||
|  | ||||
| The `SelectionPrompt` can be used when you want the user to select | ||||
|   | ||||
| @@ -21,26 +21,15 @@ you can use the `Prompt<TResult>`. | ||||
|  | ||||
| ## Confirmation | ||||
|  | ||||
| ```csharp | ||||
| if (!AnsiConsole.Confirm("Run example?")) | ||||
| { | ||||
|     return; | ||||
| } | ||||
| ``` | ||||
| <?# Example symbol="M:Prompt.Program.AskConfirmation" project="Prompt" /?> | ||||
|  | ||||
| ```text | ||||
| Run example? [y/n] (y): _ | ||||
| Run prompt example? [y/n] (y): _ | ||||
| ``` | ||||
|  | ||||
| ## Simple | ||||
|  | ||||
| ```csharp | ||||
| // Ask for the user's name | ||||
| string name = AnsiConsole.Ask<string>("What's your [green]name[/]?"); | ||||
|  | ||||
| // Ask for the user's age | ||||
| int age = AnsiConsole.Ask<int>("What's your [green]age[/]?"); | ||||
| ``` | ||||
| <?# Example symbol="M:Prompt.Program.AskName" project="Prompt" /?> | ||||
|  | ||||
| ```text | ||||
| What's your name? Patrik | ||||
| @@ -49,15 +38,7 @@ What's your age? 37 | ||||
|  | ||||
| ## Choices | ||||
|  | ||||
| ```csharp | ||||
| var fruit = AnsiConsole.Prompt( | ||||
|     new TextPrompt<string>("What's your [green]favorite fruit[/]?") | ||||
|         .InvalidChoiceMessage("[red]That's not a valid fruit[/]") | ||||
|         .DefaultValue("Orange") | ||||
|         .AddChoice("Apple") | ||||
|         .AddChoice("Banana") | ||||
|         .AddChoice("Orange")); | ||||
| ``` | ||||
| <?# Example symbol="M:Prompt.Program.AskFruit" project="Prompt" /?> | ||||
|  | ||||
| ```text | ||||
| What's your favorite fruit? [Apple/Banana/Orange] (Orange): _ | ||||
| @@ -65,19 +46,7 @@ What's your favorite fruit? [Apple/Banana/Orange] (Orange): _ | ||||
|  | ||||
| ## Validation | ||||
|  | ||||
| ```csharp | ||||
| var age = AnsiConsole.Prompt( | ||||
|     new TextPrompt<int>("What's the secret number?") | ||||
|         .Validate(age => | ||||
|         { | ||||
|             return age switch | ||||
|             { | ||||
|                 < 99 => ValidationResult.Error("[red]Too low[/]"), | ||||
|                 > 99 => ValidationResult.Error("[red]Too high[/]"), | ||||
|                 _ => ValidationResult.Success(), | ||||
|             }; | ||||
|         })); | ||||
| ``` | ||||
| <?# Example symbol="M:Prompt.Program.AskAge" project="Prompt" /?> | ||||
|  | ||||
| ```text | ||||
| What's the secret number? 32 | ||||
| @@ -89,12 +58,8 @@ What's the secret number? _ | ||||
|  | ||||
| ## Secrets | ||||
|  | ||||
| ```csharp | ||||
| var password = AnsiConsole.Prompt( | ||||
|     new TextPrompt<string>("Enter [green]password[/]") | ||||
|         .PromptStyle("red") | ||||
|         .Secret()); | ||||
| ``` | ||||
| <?# Example symbol="M:Prompt.Program.AskPassword" project="Prompt" /?> | ||||
|  | ||||
|  | ||||
| ```text | ||||
| Enter password: ************_ | ||||
| @@ -102,11 +67,7 @@ Enter password: ************_ | ||||
|  | ||||
| ## Optional | ||||
|  | ||||
| ```csharp | ||||
| var color = AnsiConsole.Prompt( | ||||
|     new TextPrompt<string>("[grey][[Optional]][/] [green]Favorite color[/]?") | ||||
|         .AllowEmpty()); | ||||
| ``` | ||||
| <?# Example symbol="M:Prompt.Program.AskColor" project="Prompt" /?> | ||||
|  | ||||
| ```text | ||||
| [Optional] Favorite color? _ | ||||
|   | ||||
| @@ -1,17 +1,15 @@ | ||||
| const defaultTheme = require("tailwindcss/defaultTheme"); | ||||
| const colors = require("tailwindcss/colors"); | ||||
|  | ||||
| module.exports = { | ||||
|     purge: ["./output/**/*.html"], | ||||
|     mode: 'jit', | ||||
|     darkMode: false, // or 'media' or 'class' | ||||
|     content: ["./output/**/*.html"], | ||||
|     darkMode: "class", | ||||
|     theme: { | ||||
|         extend: { | ||||
|             fontFamily: { | ||||
|                 sans: ["Poppins", ...defaultTheme.fontFamily.sans], | ||||
|                 mono: ["ui-monospace", "Cascadia Mono", "Cascadia Code", "Menlo", "Consolas", "Liberation Mono", "Lucida Console", "WebCascadiaMonoPL", "monospace"], | ||||
|             }, | ||||
|             container: { | ||||
|             container: ({theme}) => ({ | ||||
|                 center: true, | ||||
|                 padding: { | ||||
|                     DEFAULT: "2rem", | ||||
| @@ -20,35 +18,61 @@ module.exports = { | ||||
|                     xl: "5rem", | ||||
|                     "2xl": "6rem", | ||||
|                 }, | ||||
|             }, | ||||
|                 screens: { | ||||
|                     sm: theme("spacing.full"), | ||||
|                     md: theme("spacing.full"), | ||||
|                     lg: "1280px", | ||||
|                     xl: "1400px", | ||||
|                 }, | ||||
|             }), | ||||
|             typography: (theme) => ({ | ||||
|                 DEFAULT: { | ||||
|                     css: { | ||||
|                         color: defaultTheme.colors.gray[900], | ||||
|                         a: { | ||||
|                             color: defaultTheme.colors.blue[700], | ||||
|                             fontWeight: defaultTheme.fontWeight.normal, | ||||
|                             "&:hover": { | ||||
|                                 color: defaultTheme.colors.blue[600], | ||||
|                             }, | ||||
|                         h2: { | ||||
|                             marginTop: '1.4em', | ||||
|                             marginBottom: `.2em`, | ||||
|                         }, | ||||
|                         "pre code": { | ||||
|                             fontWeight: defaultTheme.fontWeight.light, | ||||
|                         h3: { | ||||
|                             marginTop: '2.4em', | ||||
|                             lineHeight: '1.4', | ||||
|                         }, | ||||
|                         pre: { | ||||
|                             fontWeight: theme("fontWeight.light"), | ||||
|                             borderRadius: theme('borderRadius.xl'), | ||||
|                             borderWidth: '1px', | ||||
|                             borderColor: theme('colors.slate.700'), | ||||
|                             color: theme('colors.slate.50'), | ||||
|                             boxShadow: theme('boxShadow.md'), | ||||
|                             lineHeight: '1.3', | ||||
|                         }, | ||||
|                         'p + pre, p + asciinema-player pre': { | ||||
|                             marginTop: `${-4 / 14}em`, | ||||
|                         }, | ||||
|                         'pre + pre': { | ||||
|                             marginTop: `${-16 / 14}em`, | ||||
|                         }, | ||||
|                         code: { | ||||
|                             color: defaultTheme.colors.blue[900], | ||||
|                             fontWeight: defaultTheme.fontWeight.normal, | ||||
|                             fontWeight: theme("fontWeight.normal"), | ||||
|                             fontSize: 'inherit', | ||||
|                         }, | ||||
|  | ||||
|                         "code::before": { | ||||
|                             content: " ", | ||||
|                         }, | ||||
|                         "code::after": { | ||||
|                             content: " ", | ||||
|                         }, | ||||
|                         h2: { | ||||
|                             marginTop: "1em", | ||||
|                             marginBottom: ".5em" | ||||
|                         } | ||||
|                         td: { | ||||
|                             overflowWrap: "anywhere", | ||||
|                         }, | ||||
|                         a: { | ||||
|                             fontWeight: theme('fontWeight.light'), | ||||
|                             textDecoration: 'none', | ||||
|                             borderBottom: `1px solid ${theme('colors.teal.600')}`, | ||||
|                         }, | ||||
|                         'a:hover': { | ||||
|                             borderBottomWidth: '2px', | ||||
|                         }, | ||||
|                     }, | ||||
|                 }, | ||||
|             }), | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -5,6 +5,8 @@ Highlights: | ||||
|     - Custom colors | ||||
|     - Labels | ||||
|     - Use your own data with a converter. | ||||
| Reference: T:Spectre.Console.BarChart | ||||
|      | ||||
| --- | ||||
|  | ||||
| Use `BarChart` to render bar charts to the console. | ||||
|   | ||||
| @@ -6,6 +6,8 @@ Highlights: | ||||
|     - Include highlighted events. | ||||
|     - Culture aware. | ||||
|     - Custom headers. | ||||
| Reference: T:Spectre.Console.Calendar | ||||
|  | ||||
| --- | ||||
|  | ||||
| The `Calendar` is used to render a calendar to the terminal. | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| Title: Canvas Image | ||||
| Order: 70 | ||||
| Description: "Use *ImageSharp* to parse images and render them as Ascii art to the console." | ||||
| Reference: T:Spectre.Console.CanvasImage | ||||
| --- | ||||
|  | ||||
| To add [ImageSharp](https://github.com/SixLabors/ImageSharp) superpowers to  | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| Title: Canvas | ||||
| Order: 60 | ||||
| Description: "**Canvas** is a widget that allows you to render arbitrary pixels to the console." | ||||
| Reference: T:Spectre.Console.Canvas | ||||
| --- | ||||
|  | ||||
| `Canvas` is a widget that allows you to render arbitrary "pixels"  | ||||
|   | ||||
| @@ -2,6 +2,7 @@ Title: Figlet | ||||
| Order: 50 | ||||
| RedirectFrom: figlet | ||||
| Description: "*Spectre.Console* can render FIGlet text by using the **FigletText** class." | ||||
| Reference: T:Spectre.Console.FigletText | ||||
| --- | ||||
|  | ||||
| Spectre.Console can render [FIGlet](http://www.figlet.org/) text by using the `FigletText` class. | ||||
|   | ||||
| @@ -5,6 +5,7 @@ Description: "The **Rule** class is used to render a horizontal rule (line) to t | ||||
| Highlights: | ||||
|     - Custom colors for line and title. | ||||
|     - Specify left, center or right aligned title. | ||||
| Reference: T:Spectre.Console.Rule | ||||
|  | ||||
| --- | ||||
|  | ||||
|   | ||||
| @@ -2,6 +2,7 @@ Title: Table | ||||
| Order: 0 | ||||
| RedirectFrom: tables | ||||
| Description: "Tables are a perfect way of displaying tabular data in a terminal. *Spectre.Console* is super smart about rendering tables and will adjust all columns to fit whatever is inside them." | ||||
| Reference: T:Spectre.Console.Table | ||||
| --- | ||||
|  | ||||
| Tables are a perfect way of displaying tabular data in a terminal. | ||||
|   | ||||
| @@ -4,6 +4,8 @@ Description: "The **Tree** widget can be used to render hierarchical data." | ||||
| Highlights: | ||||
|     - Custom colors and styles for guidelines. | ||||
|     - Include any *Spectre.Console* widgets as child nodes. | ||||
| Reference: T:Spectre.Console.Tree | ||||
|  | ||||
| --- | ||||
|  | ||||
| The `Tree` widget can be used to render hierarchical data. | ||||
|   | ||||
							
								
								
									
										1154
									
								
								docs/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1154
									
								
								docs/package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -4,7 +4,7 @@ | ||||
|   "description": "Docs for Spectre.Console", | ||||
|   "main": "index.js", | ||||
|   "scripts": { | ||||
|     "build:tailwind": "tailwind build ./input/tailwind.css  -c ./input/tailwind.config.js  -o ./output/assets/styles.css", | ||||
|     "build:tailwind": "tailwind build -i ./input/tailwind.css  -c ./input/tailwind.config.js  -o ./output/assets/styles.css", | ||||
|     "build": "cross-env NODE_ENV=production dotnet run -- -o public" | ||||
|   }, | ||||
|   "repository": { | ||||
| @@ -12,14 +12,14 @@ | ||||
|   }, | ||||
|   "license": "MIT", | ||||
|   "devDependencies": { | ||||
|     "@tailwindcss/forms": "^0.3.4", | ||||
|     "@tailwindcss/typography": "^0.4.1", | ||||
|     "asciinema-player": "^3.0.0-rc.1", | ||||
|     "@tailwindcss/forms": "^0.4.0", | ||||
|     "@tailwindcss/typography": "^0.5.1", | ||||
|     "asciinema-player": "^3.0.0-beta.4", | ||||
|     "autoprefixer": "^10.4.0", | ||||
|     "cross-env": "^7.0.3", | ||||
|     "playwright": "^1.16.3", | ||||
|     "playwright": "^1.18.1", | ||||
|     "postcss": "^8.4.4", | ||||
|     "postcss-cli": "^8.3.1", | ||||
|     "tailwindcss": "^2.2.19" | ||||
|     "tailwindcss": "^3.0.19" | ||||
|   } | ||||
| } | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -2,14 +2,26 @@ namespace Docs | ||||
| { | ||||
|     public static class Constants | ||||
|     { | ||||
|         public const string NoContainer = nameof(NoContainer); | ||||
|         public const string NoSidebar = nameof(NoSidebar); | ||||
|         public const string NoLink = nameof(NoLink); | ||||
|         public const string Topic = nameof(Topic); | ||||
|         public const string EditLink = nameof(EditLink); | ||||
|         public const string Description = nameof(Description); | ||||
|         public const string Hidden = nameof(Hidden); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Indicates where to locate source files for the API documentation. | ||||
|         /// By default the globbing pattern "src/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs" | ||||
|         /// is used which searches for all "*.cs" files at any depth under a "src" folder | ||||
|         /// but not under "bin", "obj", "packages" or "Tests" folders. You can specify | ||||
|         /// your own globbing pattern (or more than one globbing pattern) if your source | ||||
|         /// files are found elsewhere. | ||||
|         /// </summary> | ||||
|         /// <type><see cref="string"/> or <c>IEnumerable<string></c></type> | ||||
|         public const string SourceFiles = nameof(SourceFiles); | ||||
|  | ||||
|         public const string ExampleSourceFiles = nameof(ExampleSourceFiles); | ||||
|  | ||||
|         public const string ApiReference = "Reference"; | ||||
|  | ||||
|         public static class Emojis | ||||
|         { | ||||
|             public const string Root = "EMOJIS_ROOT"; | ||||
| @@ -33,12 +45,5 @@ namespace Docs | ||||
|             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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,9 +1,7 @@ | ||||
| using Statiq.App; | ||||
| using Statiq.Common; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
|  | ||||
| namespace Docs | ||||
| namespace Docs.Extensions | ||||
| { | ||||
|     public static class BootstrapperExtensions | ||||
|     { | ||||
|   | ||||
| @@ -1,8 +1,9 @@ | ||||
| using Statiq.Common; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using Statiq.CodeAnalysis; | ||||
| using Statiq.Common; | ||||
|  | ||||
| namespace Docs | ||||
| namespace Docs.Extensions | ||||
| { | ||||
|     public static class DocumentExtensions | ||||
|     { | ||||
| @@ -25,5 +26,40 @@ namespace Docs | ||||
|         { | ||||
|             return source.Where(x => x.IsVisible()); | ||||
|         } | ||||
|  | ||||
|         public static string GetModifiers(this IDocument document) => document.GetModifiers(false); | ||||
|  | ||||
|         public static string GetModifiers(this IDocument document, bool skipStatic) | ||||
|         { | ||||
|             var modifiers = new List<string>(); | ||||
|             var accessibility = document.GetString(CodeAnalysisKeys.Accessibility).ToLower(); | ||||
|             if (accessibility != "public") | ||||
|             { | ||||
|                 modifiers.Add(accessibility); | ||||
|             } | ||||
|  | ||||
|             // for some things, like ExtensionMethods, static will always be set. | ||||
|             if (!skipStatic && document.GetBool(CodeAnalysisKeys.IsStatic)) | ||||
|             { | ||||
|                 modifiers.Add("static"); | ||||
|             } | ||||
|  | ||||
|             if (document.GetBool(CodeAnalysisKeys.IsVirtual)) | ||||
|             { | ||||
|                 modifiers.Add("virtual"); | ||||
|             } | ||||
|  | ||||
|             if (document.GetBool(CodeAnalysisKeys.IsAbstract)) | ||||
|             { | ||||
|                 modifiers.Add("abstract"); | ||||
|             } | ||||
|  | ||||
|             if (document.GetBool(CodeAnalysisKeys.IsOverride)) | ||||
|             { | ||||
|                 modifiers.Add("override"); | ||||
|             } | ||||
|  | ||||
|             return string.Join(' ', modifiers); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
							
								
								
									
										228
									
								
								docs/src/Extensions/IExecutionContextExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										228
									
								
								docs/src/Extensions/IExecutionContextExtensions.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,228 @@ | ||||
| using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.Collections.Immutable; | ||||
| using System.Linq; | ||||
| using System.Net; | ||||
| using Docs.Pipelines; | ||||
| using Microsoft.AspNetCore.Html; | ||||
| using Statiq.CodeAnalysis; | ||||
| using Statiq.Common; | ||||
|  | ||||
| namespace Docs.Extensions; | ||||
|  | ||||
| public static class IExecutionContextExtensions | ||||
| { | ||||
|     private static readonly object _executionCacheLock = new(); | ||||
|     private static readonly ConcurrentDictionary<string, object> _executionCache = new(); | ||||
|     private static Guid _lastExecutionId = Guid.Empty; | ||||
|  | ||||
|     public record SidebarItem(IDocument Node, string Title, bool ShowLink, ImmutableList<SidebarItem> Leafs); | ||||
|  | ||||
|     public static bool TryGetCommentIdDocument(this IExecutionContext context, string commentId, out IDocument document, | ||||
|         out string error) | ||||
|     { | ||||
|         context.ThrowIfNull(nameof(context)); | ||||
|  | ||||
|         if (string.IsNullOrWhiteSpace(commentId)) | ||||
|         { | ||||
|             document = default; | ||||
|             error = default; | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         var documents = context.GetExecutionCache(nameof(TryGetCommentIdDocument), ctx => ctx.Outputs.FromPipeline(nameof(ExampleSyntax)).Flatten()); | ||||
|  | ||||
|         var matches = documents | ||||
|             .Where(x => x.GetString(CodeAnalysisKeys.CommentId)?.Equals(commentId, StringComparison.OrdinalIgnoreCase) == true) | ||||
|             .ToImmutableDocumentArray(); | ||||
|  | ||||
|         if (matches.Length == 1) | ||||
|         { | ||||
|             document = matches[0]; | ||||
|             error = default; | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         document = default; | ||||
|         error = matches.Length > 1 | ||||
|             ? $"Multiple ambiguous matching documents found for commentId \"{commentId}\"" | ||||
|             : $"Couldn't find document with xref \"{commentId}\""; | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     public static T GetExecutionCache<T>(this IExecutionContext context, string key, Func<IExecutionContext, T> getter) | ||||
|     { | ||||
|         lock (_executionCacheLock) | ||||
|         { | ||||
|             if (_lastExecutionId != context.ExecutionId) | ||||
|             { | ||||
|                 _executionCache.Clear(); | ||||
|                 _lastExecutionId = context.ExecutionId; | ||||
|             } | ||||
|  | ||||
|             return (T)_executionCache.GetOrAdd(key, valueFactory: _ => getter.Invoke(context)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static NormalizedPath FindCard(this IExecutionContext context, Guid docId) | ||||
|     { | ||||
|         var cardLookups = context.GetExecutionCache(nameof(FindCard), ctx => | ||||
|         { | ||||
|             return ctx.Outputs | ||||
|                 .Select(i => new { DocId = i.GetString("DocId"), Destination = i.Destination }) | ||||
|                 .Where(i => i.DocId != null) | ||||
|                 .ToDictionary(i => i.DocId, i => i.Destination); | ||||
|         }); | ||||
|  | ||||
|         return !cardLookups.ContainsKey(docId.ToString()) ? null : cardLookups[docId.ToString()]; | ||||
|     } | ||||
|  | ||||
|     public static SidebarItem GetSidebar(this IExecutionContext context) | ||||
|     { | ||||
|         return context.GetExecutionCache(nameof(GetSidebar), ctx => | ||||
|         { | ||||
|             var outputPages = ctx.OutputPages; | ||||
|             var root = outputPages["index.html"][0]; | ||||
|             var children = outputPages | ||||
|                 .GetChildrenOf(root) | ||||
|                 .OrderBy(i => i.GetInt("Order")) | ||||
|                 .OnlyVisible().Select(child => | ||||
|                 { | ||||
|                     var showLink = child.ShowLink(); | ||||
|                     var children = outputPages | ||||
|                         .GetChildrenOf(child) | ||||
|                         .OnlyVisible() | ||||
|                         .Select(subChild => | ||||
|                             new SidebarItem(subChild, subChild.GetTitle(), true, ImmutableList<SidebarItem>.Empty)) | ||||
|                         .ToImmutableList(); | ||||
|  | ||||
|                     return new SidebarItem(child, child.GetTitle(), showLink, children); | ||||
|                 }).ToImmutableList(); | ||||
|  | ||||
|             return new SidebarItem(root, root.GetTitle(), false, children); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     public static HtmlString GetTypeLink(this IExecutionContext context, IDocument document) => | ||||
|         context.GetTypeLink(document, null, true); | ||||
|  | ||||
|     public static HtmlString GetTypeLink(this IExecutionContext context, IDocument document, bool linkTypeArguments) => | ||||
|         context.GetTypeLink(document, null, linkTypeArguments); | ||||
|  | ||||
|     public static HtmlString GetTypeLink(this IExecutionContext context, IDocument document, string name) => | ||||
|         context.GetTypeLink(document, name, true); | ||||
|  | ||||
|     public static HtmlString GetTypeLink(this IExecutionContext context, IDocument document, string name, | ||||
|         bool linkTypeArguments) | ||||
|     { | ||||
|         name ??= document.GetString(CodeAnalysisKeys.DisplayName); | ||||
|  | ||||
|         // Link nullable types to their type argument | ||||
|         if (document.GetString(CodeAnalysisKeys.Name) == "Nullable") | ||||
|         { | ||||
|             var nullableType = document.GetDocumentList(CodeAnalysisKeys.TypeArguments)?.FirstOrDefault(); | ||||
|             if (nullableType != null) | ||||
|             { | ||||
|                 return context.GetTypeLink(nullableType, name); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // If it wasn't nullable, format the name | ||||
|         name = context.GetFormattedHtmlName(name); | ||||
|  | ||||
|         // Link the type and type parameters separately for generic types | ||||
|         IReadOnlyList<IDocument> typeArguments = document.GetDocumentList(CodeAnalysisKeys.TypeArguments); | ||||
|         if (typeArguments?.Count > 0) | ||||
|         { | ||||
|             // Link to the original definition of the generic type | ||||
|             document = document.GetDocument(CodeAnalysisKeys.OriginalDefinition) ?? document; | ||||
|  | ||||
|             if (linkTypeArguments) | ||||
|             { | ||||
|                 // Get the type argument positions | ||||
|                 var begin = name.IndexOf("<wbr><", StringComparison.Ordinal) + 9; | ||||
|                 var openParen = name.IndexOf("><wbr>(", StringComparison.Ordinal); | ||||
|                 var end = name.LastIndexOf("><wbr>", openParen == -1 ? name.Length : openParen, | ||||
|                     StringComparison.Ordinal); // Don't look past the opening paren if there is one | ||||
|  | ||||
|                 if (begin == -1 || end == -1) | ||||
|                 { | ||||
|                     return new HtmlString(name); | ||||
|                 } | ||||
|  | ||||
|                 // Remove existing type arguments and insert linked type arguments (do this first to preserve original indexes) | ||||
|                 name = name | ||||
|                     .Remove(begin, end - begin) | ||||
|                     .Insert(begin, | ||||
|                         string.Join(", <wbr>", typeArguments.Select(x => context.GetTypeLink(x, true).Value))); | ||||
|  | ||||
|                 // Insert the link for the type | ||||
|                 if (!document.Destination.IsNullOrEmpty) | ||||
|                 { | ||||
|                     name = name.Insert(begin - 9, "</a>").Insert(0, $"<a href=\"{context.GetLink(document)}\">"); | ||||
|                 } | ||||
|  | ||||
|                 return new HtmlString(name); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // If it's a type parameter, create an anchor link to the declaring type's original definition | ||||
|         if (document.GetString(CodeAnalysisKeys.Kind) == "TypeParameter") | ||||
|         { | ||||
|             var declaringType = document.GetDocument(CodeAnalysisKeys.DeclaringType) | ||||
|                 ?.GetDocument(CodeAnalysisKeys.OriginalDefinition); | ||||
|             if (declaringType != null) | ||||
|             { | ||||
|                 return new HtmlString(declaringType.Destination.IsNullOrEmpty | ||||
|                     ? name | ||||
|                     : $"<a href=\"{context.GetLink(declaringType)}#typeparam-{document["Name"]}\">{name}</a>"); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return new HtmlString(document.Destination.IsNullOrEmpty | ||||
|             ? name | ||||
|             : $"<a href=\"{context.GetLink(document)}\">{name}</a>"); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Formats a symbol or other name by encoding HTML characters and | ||||
|     /// adding HTML break elements as appropriate. | ||||
|     /// </summary> | ||||
|     /// <param name="context">The execution context.</param> | ||||
|     /// <param name="name">The name to format.</param> | ||||
|     /// <returns>The name formatted for use in HTML.</returns> | ||||
|     public static string GetFormattedHtmlName(this IExecutionContext context, string name) | ||||
|     { | ||||
|         if (name == null) | ||||
|         { | ||||
|             return string.Empty; | ||||
|         } | ||||
|  | ||||
|         // Encode and replace .()<> with word break opportunities | ||||
|         name = WebUtility.HtmlEncode(name) | ||||
|             .Replace(".", "<wbr>.") | ||||
|             .Replace("(", "<wbr>(") | ||||
|             .Replace(")", ")<wbr>") | ||||
|             .Replace(", ", ", <wbr>") | ||||
|             .Replace("<", "<wbr><") | ||||
|             .Replace(">", "><wbr>"); | ||||
|  | ||||
|         // Add additional break opportunities in long un-broken segments | ||||
|         var segments = name.Split(new[] { "<wbr>" }, StringSplitOptions.None).ToList(); | ||||
|         var replaced = false; | ||||
|         for (var c = 0; c < segments.Count; c++) | ||||
|         { | ||||
|             if (segments[c].Length > 20) | ||||
|             { | ||||
|                 segments[c] = new string(segments[c] | ||||
|                     .SelectMany( | ||||
|                         (x, i) => char.IsUpper(x) && i != 0 ? new[] { '<', 'w', 'b', 'r', '>', x } : new[] { x }) | ||||
|                     .ToArray()); | ||||
|                 replaced = true; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return replaced ? string.Join("<wbr>", segments) : name; | ||||
|     } | ||||
| } | ||||
| @@ -1,4 +1,4 @@ | ||||
| namespace Docs | ||||
| namespace Docs.Extensions | ||||
| { | ||||
|     public static class StringExtensions | ||||
|     { | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
| using Newtonsoft.Json; | ||||
|  | ||||
| namespace Docs.Models | ||||
|   | ||||
							
								
								
									
										151
									
								
								docs/src/Pipelines/CodePipeline.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								docs/src/Pipelines/CodePipeline.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,151 @@ | ||||
| using System.Linq; | ||||
| using System.Net; | ||||
| using Docs.Utilities; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Statiq.CodeAnalysis; | ||||
| using Statiq.Common; | ||||
| using Statiq.Core; | ||||
| using Statiq.Web; | ||||
| using Statiq.Web.Pipelines; | ||||
|  | ||||
| namespace Docs.Pipelines; | ||||
|  | ||||
|  | ||||
|  | ||||
| /// <summary> | ||||
| /// Loads source files. | ||||
| /// </summary> | ||||
| public class Code : Pipeline | ||||
| { | ||||
|     public Code() | ||||
|     { | ||||
|         InputModules = new ModuleList( | ||||
|             new ReadFiles( | ||||
|                 Config.FromSettings(settings | ||||
|                     => settings.GetList<string>(Constants.SourceFiles).AsEnumerable()))); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /// <summary> | ||||
| /// Loads source files. | ||||
| /// </summary> | ||||
| public class ExampleCode : Pipeline | ||||
| { | ||||
|     public ExampleCode() | ||||
|     { | ||||
|         Dependencies.Add(nameof(Code)); | ||||
|  | ||||
|         InputModules = new ModuleList( | ||||
|             new ReadFiles( | ||||
|                 Config.FromSettings(settings | ||||
|                     => settings.GetList<string>(Constants.ExampleSourceFiles).AsEnumerable()))); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /// <summary> | ||||
| /// Uses Roslyn to analyze any source files loaded in the previous | ||||
| /// pipeline along with any specified assemblies. This pipeline | ||||
| /// results in documents that represent Roslyn symbols. | ||||
| /// </summary> | ||||
| public class ExampleSyntax : Pipeline | ||||
| { | ||||
|     public ExampleSyntax() | ||||
|     { | ||||
|         Dependencies.Add(nameof(ExampleCode)); | ||||
|         DependencyOf.Add(nameof(Content)); | ||||
|  | ||||
|         ProcessModules = new ModuleList | ||||
|         { | ||||
|             new ConcatDocuments(nameof(Code)), | ||||
|             new ConcatDocuments(nameof(ExampleCode)), | ||||
|             new CacheDocuments( | ||||
|                 new AnalyzeCSharp() | ||||
|                     .WhereNamespaces(true) | ||||
|                     .WherePublic() | ||||
|                     .WithCssClasses("code", "cs") | ||||
|                     .WithDestinationPrefix("syntax") | ||||
|                     .WithAssemblySymbols() | ||||
|                     // we need to load Spectre.Console for compiling, but we don't need to process it in Statiq | ||||
|                     .WhereNamespaces(i => !i.StartsWith("Spectre.Console")) | ||||
|                     .WithImplicitInheritDoc(false), | ||||
|                 new ExecuteConfig(Config.FromDocument((doc, _) => | ||||
|                 { | ||||
|                     // Add metadata | ||||
|                     var metadataItems = new MetadataItems | ||||
|                     { | ||||
|                         // Calculate an xref that includes a "api-" prefix to avoid collisions | ||||
|                         { WebKeys.Xref, "syntax-" + doc.GetString(CodeAnalysisKeys.CommentId) }, | ||||
|                     }; | ||||
|  | ||||
|                     var contentProvider = doc.ContentProvider; | ||||
|                     return doc.Clone(metadataItems, contentProvider); | ||||
|                 }))).WithoutSourceMapping() | ||||
|         }; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /// <summary> | ||||
| /// Generates API documentation pipeline. | ||||
| /// </summary> | ||||
| public class Api : Pipeline | ||||
| { | ||||
|     public Api() | ||||
|     { | ||||
|         Dependencies.Add(nameof(Code)); | ||||
|         DependencyOf.Add(nameof(Content)); | ||||
|  | ||||
|         ProcessModules = new ModuleList | ||||
|         { | ||||
|             new ConcatDocuments(nameof(Code)), | ||||
|             new CacheDocuments( | ||||
|                 new AnalyzeCSharp() | ||||
|                     .WhereNamespaces(ns => ns.StartsWith("Spectre.Console") && !ns.Contains("Analyzer") && | ||||
|                                            !ns.Contains("Testing") && !ns.Contains("Examples")) | ||||
|                     .WherePublic(true) | ||||
|                     .WithCssClasses("code", "cs") | ||||
|                     .WithDestinationPrefix("api") | ||||
|                     .WithAssemblySymbols() | ||||
|                     .WithImplicitInheritDoc(false), | ||||
|                 new ExecuteConfig(Config.FromDocument((doc, ctx) => | ||||
|                 { | ||||
|                     // Calculate a type name to link lookup for auto linking | ||||
|                     string name = null; | ||||
|  | ||||
|                     var kind = doc.GetString(CodeAnalysisKeys.Kind); | ||||
|                     switch (kind) | ||||
|                     { | ||||
|                         case "NamedType": | ||||
|                             name = doc.GetString(CodeAnalysisKeys.DisplayName); | ||||
|                             break; | ||||
|                         case "Method": | ||||
|                             var containingType = doc.GetDocument(CodeAnalysisKeys.ContainingType); | ||||
|                             if (containingType != null) | ||||
|                             { | ||||
|                                 name = | ||||
|                                     $"{containingType.GetString(CodeAnalysisKeys.DisplayName)}.{doc.GetString(CodeAnalysisKeys.DisplayName)}"; | ||||
|                             } | ||||
|                             break; | ||||
|                     } | ||||
|  | ||||
|                     if (name != null) | ||||
|                     { | ||||
|                         var typeNameLinks = ctx.GetRequiredService<TypeNameLinks>(); | ||||
|                         typeNameLinks.Links.AddOrUpdate(WebUtility.HtmlEncode(name), ctx.GetLink(doc), | ||||
|                             (_, _) => string.Empty); | ||||
|                     } | ||||
|  | ||||
|                     // Add metadata | ||||
|                     var metadataItems = new MetadataItems | ||||
|                     { | ||||
|                         { WebKeys.Xref, doc.GetString(CodeAnalysisKeys.CommentId) }, | ||||
|                         { WebKeys.Layout, "api/_layout.cshtml" }, | ||||
|                         { Constants.Hidden, true } | ||||
|                     }; | ||||
|  | ||||
|                     var contentProvider = doc.ContentProvider.CloneWithMediaType(MediaTypes.Html); | ||||
|                     metadataItems.Add(WebKeys.ContentType, ContentType.Content); | ||||
|                     return doc.Clone(metadataItems, contentProvider); | ||||
|                 }))).WithoutSourceMapping() | ||||
|         }; | ||||
|     } | ||||
| } | ||||
| @@ -1,5 +1,3 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using Docs.Models; | ||||
| using Statiq.Common; | ||||
| @@ -14,7 +12,7 @@ namespace Docs.Pipelines | ||||
|             InputModules = new ModuleList | ||||
|             { | ||||
|                 new ExecuteConfig( | ||||
|                     Config.FromContext(ctx => { | ||||
|                     Config.FromContext(_ => { | ||||
|                         return new ReadWeb(Constants.Colors.Url); | ||||
|                     })) | ||||
|             }; | ||||
| @@ -22,7 +20,7 @@ namespace Docs.Pipelines | ||||
|             ProcessModules = new ModuleList | ||||
|             { | ||||
|                 new ExecuteConfig( | ||||
|                     Config.FromDocument(async (doc, ctx) => | ||||
|                     Config.FromDocument(async (doc, _) => | ||||
|                     { | ||||
|                         var data = Color.Parse(await doc.GetContentStringAsync()).ToList(); | ||||
|                         return data.ToDocument(Constants.Colors.Root); | ||||
|   | ||||
| @@ -1,10 +1,9 @@ | ||||
| using Statiq.Common; | ||||
| using Statiq.Core; | ||||
| using Statiq.Web.GitHub; | ||||
|  | ||||
| namespace Docs.Pipelines | ||||
| { | ||||
|     public class DeploymentPipeline : Pipeline | ||||
|     public class DeploymentPipeline : Statiq.Core.Pipeline | ||||
|     { | ||||
|         public DeploymentPipeline() | ||||
|         { | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
| using System.Collections.Generic; | ||||
| using Docs.Models; | ||||
| using Docs.Modules; | ||||
| using Statiq.Common; | ||||
| @@ -13,7 +12,7 @@ namespace Docs.Pipelines | ||||
|             InputModules = new ModuleList | ||||
|             { | ||||
|                 new ExecuteConfig( | ||||
|                     Config.FromContext(ctx => { | ||||
|                     Config.FromContext(_ => { | ||||
|                         return new ReadEmbedded( | ||||
|                             typeof(EmojiPipeline).Assembly, | ||||
|                             "Docs/src/Data/emojis.json"); | ||||
| @@ -23,7 +22,7 @@ namespace Docs.Pipelines | ||||
|             ProcessModules = new ModuleList | ||||
|             { | ||||
|                 new ExecuteConfig( | ||||
|                     Config.FromDocument(async (doc, ctx) => | ||||
|                     Config.FromDocument(async (doc, _) => | ||||
|                     { | ||||
|                         var data = Emoji.Parse(await doc.GetContentStringAsync()); | ||||
|                         return data.ToDocument(Constants.Emojis.Root); | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| using System.Collections.Generic; | ||||
| using Statiq.Common; | ||||
| using System.Xml.Linq; | ||||
|  | ||||
| namespace Docs.Shortcodes | ||||
| { | ||||
| @@ -8,7 +7,6 @@ namespace Docs.Shortcodes | ||||
|     { | ||||
|         public override ShortcodeResult Execute(KeyValuePair<string, string>[] args, string content, IDocument document, IExecutionContext context) | ||||
|         { | ||||
|  | ||||
|             return $"<div class=\"alert-warning\">{content}</div>"; | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| using System.Collections.Generic; | ||||
| using Statiq.Common; | ||||
| using System.Xml.Linq; | ||||
| using Docs.Extensions; | ||||
|  | ||||
| namespace Docs.Shortcodes | ||||
| { | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using Statiq.Common; | ||||
| @@ -10,8 +9,6 @@ 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. | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using Statiq.Common; | ||||
| @@ -31,7 +30,6 @@ namespace Docs.Shortcodes | ||||
|  | ||||
|             foreach (var emoji in emojis) | ||||
|             { | ||||
|                 var code = emoji.Code.Replace("U+0000", "U+").Replace("U+000", "U+"); | ||||
|                 var icon = $"&#x{emoji.Code.Replace("U+", string.Empty)};"; | ||||
|  | ||||
|                 var row = new XElement("tr", new XAttribute("class", "search-row")); | ||||
|   | ||||
							
								
								
									
										43
									
								
								docs/src/Shortcodes/ExampleSnippet.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								docs/src/Shortcodes/ExampleSnippet.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Threading.Tasks; | ||||
| using Docs.Extensions; | ||||
| using Docs.Utilities; | ||||
| using Microsoft.CodeAnalysis; | ||||
| using Statiq.CodeAnalysis; | ||||
| using Statiq.Common; | ||||
|  | ||||
| namespace Docs.Shortcodes; | ||||
|  | ||||
| public class ExampleSnippet : Shortcode | ||||
| { | ||||
|     protected const string Solution = nameof(Solution); | ||||
|     protected const string Project = nameof(Project); | ||||
|     protected const string Symbol = nameof(Symbol); | ||||
|     protected const string BodyOnly = nameof(BodyOnly); | ||||
|  | ||||
|     public override async Task<ShortcodeResult> ExecuteAsync(KeyValuePair<string, string>[] args, string content, | ||||
|         IDocument document, IExecutionContext context) | ||||
|     { | ||||
|         var props = args.ToDictionary(Solution, Project, Symbol, BodyOnly); | ||||
|         var symbolName = props.GetString(Symbol); | ||||
|         var bodyOnly = props.Get<bool?>(BodyOnly) ?? symbolName.StartsWith("m:", StringComparison.InvariantCultureIgnoreCase); | ||||
|  | ||||
|         if (!context.TryGetCommentIdDocument(symbolName, out var apiDocument, out _)) | ||||
|         { | ||||
|             return string.Empty; | ||||
|         } | ||||
|  | ||||
|         var options = HighlightService.HighlightOption.All; | ||||
|         if (bodyOnly) | ||||
|         { | ||||
|             options = HighlightService.HighlightOption.Body; | ||||
|         } | ||||
|  | ||||
|         var comp =  apiDocument.Get<Compilation>(CodeAnalysisKeys.Compilation); | ||||
|         var symbol = apiDocument.Get<ISymbol>(CodeAnalysisKeys.Symbol); | ||||
|         var highlightElement = await HighlightService.Highlight(comp, symbol, options); | ||||
|         ShortcodeResult shortcodeResult = $"<pre><code>{highlightElement}</code></pre>"; | ||||
|         return shortcodeResult; | ||||
|     } | ||||
| } | ||||
| @@ -1,6 +1,5 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.AspNetCore.Mvc.RazorPages; | ||||
| using Microsoft.Extensions.Logging; | ||||
|  | ||||
| namespace Docs.SocialCards{ | ||||
|     public class SocialCardModel : PageModel | ||||
| @@ -17,13 +16,6 @@ namespace Docs.SocialCards{ | ||||
|         [BindProperty(Name = "footer", SupportsGet = true)] | ||||
|         public string Footer { get; set; } | ||||
|  | ||||
|         private readonly ILogger<SocialCardModel> _logger; | ||||
|  | ||||
|         public SocialCardModel(ILogger<SocialCardModel> logger) | ||||
|         { | ||||
|             _logger = logger; | ||||
|         } | ||||
|  | ||||
|         public void OnGet() | ||||
|         { | ||||
|         } | ||||
|   | ||||
							
								
								
									
										234
									
								
								docs/src/Utilities/HighlightService.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								docs/src/Utilities/HighlightService.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,234 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.CodeAnalysis; | ||||
| using Microsoft.CodeAnalysis.Classification; | ||||
| using Microsoft.CodeAnalysis.CSharp; | ||||
| using Microsoft.CodeAnalysis.CSharp.Syntax; | ||||
| using Microsoft.CodeAnalysis.Text; | ||||
|  | ||||
| namespace Docs.Utilities; | ||||
|  | ||||
| internal static class HighlightService | ||||
| { | ||||
|     internal enum HighlightOption | ||||
|     { | ||||
|         All, | ||||
|         Body | ||||
|     } | ||||
|  | ||||
|     private static readonly AdhocWorkspace _emptyWorkspace = new(); | ||||
|  | ||||
|     public static async Task<string> Highlight(Compilation compilation, ISymbol symbol, HighlightOption option = HighlightOption.All) | ||||
|     { | ||||
|         var syntaxReference = symbol.DeclaringSyntaxReferences.FirstOrDefault(); | ||||
|         if (syntaxReference == null) | ||||
|         { | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         var syntax = await syntaxReference.GetSyntaxAsync(); | ||||
|         var indent = GetIndent(syntax.GetLeadingTrivia()); | ||||
|         var model = compilation.GetSemanticModel(syntaxReference.SyntaxTree); | ||||
|  | ||||
|         var methodWithBodySyntax = syntax as BaseMethodDeclarationSyntax; | ||||
|  | ||||
|         TextSpan textSpan; | ||||
|         switch (option) | ||||
|         { | ||||
|             case HighlightOption.Body when methodWithBodySyntax is { Body: { } }: | ||||
|                 { | ||||
|                     syntax = methodWithBodySyntax.Body; | ||||
|                     indent = GetIndent(methodWithBodySyntax.Body.Statements.First().GetLeadingTrivia()); | ||||
|                     textSpan = TextSpan.FromBounds(syntax.Span.Start + 1, syntax.Span.End - 1); | ||||
|                     break; | ||||
|                 } | ||||
|             case HighlightOption.Body when methodWithBodySyntax is { ExpressionBody: { } }: | ||||
|                 { | ||||
|                     syntax = methodWithBodySyntax.ExpressionBody; | ||||
|                     textSpan = syntax.Span; | ||||
|                     break; | ||||
|                 } | ||||
|             case HighlightOption.All: | ||||
|             default: | ||||
|                 textSpan = syntax.Span; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         var text = await syntaxReference.SyntaxTree.GetTextAsync(); | ||||
|         // we need a workspace, but it seems it is only used to resolve a few services and nothing else so an empty one will suffice | ||||
|         return HighlightElement(_emptyWorkspace, model, text, textSpan, indent); | ||||
|     } | ||||
|  | ||||
|     private static int GetIndent(SyntaxTriviaList leadingTrivia) | ||||
|     { | ||||
|         var whitespace = leadingTrivia.FirstOrDefault(i => i.Kind() == SyntaxKind.WhitespaceTrivia); | ||||
|         return whitespace == default ? 0 : whitespace.Span.Length; | ||||
|     } | ||||
|  | ||||
|     private static string HighlightElement(Workspace workspace, SemanticModel semanticModel, SourceText fullSourceText, | ||||
|         TextSpan textSpan, int indent) | ||||
|     { | ||||
|  | ||||
|         var classifiedSpans = Classifier.GetClassifiedSpans(semanticModel, textSpan, workspace); | ||||
|         return HighlightElement(classifiedSpans, fullSourceText, indent); | ||||
|     } | ||||
|  | ||||
|     private static string HighlightElement(IEnumerable<ClassifiedSpan> classifiedSpans, SourceText fullSourceText, int indent) | ||||
|     { | ||||
|  | ||||
|         var ranges = classifiedSpans.Select(classifiedSpan => | ||||
|             new Range(classifiedSpan.ClassificationType, classifiedSpan.TextSpan, fullSourceText)).ToList(); | ||||
|  | ||||
|         // the classified text won't include the whitespace so we need to add to fill in those gaps. | ||||
|         ranges = FillGaps(fullSourceText, ranges).ToList(); | ||||
|  | ||||
|         var sb = new StringBuilder(); | ||||
|  | ||||
|         foreach (var range in ranges) | ||||
|         { | ||||
|             var cssClass = ClassificationTypeToPrismClass(range.ClassificationType); | ||||
|             if (string.IsNullOrWhiteSpace(cssClass)) | ||||
|             { | ||||
|                 sb.Append(range.Text); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 // include the prism css class but also include the roslyn classification. | ||||
|                 sb.Append( | ||||
|                     $"<span class=\"token {cssClass} roslyn-{range.ClassificationType.Replace(" ", "-")}\">{range.Text}</span>"); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // there might be a way to do this with roslyn, but for now we'll just normalize everything off of the length of the | ||||
|         // leading trivia of the element we are looking at. | ||||
|         var indentString = new string(' ', indent); | ||||
|         var allLines = sb.ToString() | ||||
|             .ReplaceLineEndings() | ||||
|             .Split(Environment.NewLine) | ||||
|             .Select(i => i.StartsWith(indentString) == false ? i : i[indent..]); | ||||
|  | ||||
|         return string.Join(Environment.NewLine, allLines); | ||||
|     } | ||||
|  | ||||
|     private static string ClassificationTypeToPrismClass(string rangeClassificationType) | ||||
|     { | ||||
|         if (rangeClassificationType == null) | ||||
|             return string.Empty; | ||||
|  | ||||
|         switch (rangeClassificationType) | ||||
|         { | ||||
|             case ClassificationTypeNames.Identifier: | ||||
|                 return "symbol"; | ||||
|             case ClassificationTypeNames.LocalName: | ||||
|                 return "variable"; | ||||
|             case ClassificationTypeNames.ParameterName: | ||||
|             case ClassificationTypeNames.PropertyName: | ||||
|             case ClassificationTypeNames.EnumMemberName: | ||||
|             case ClassificationTypeNames.FieldName: | ||||
|                 return "property"; | ||||
|             case ClassificationTypeNames.ClassName: | ||||
|             case ClassificationTypeNames.StructName: | ||||
|             case ClassificationTypeNames.RecordClassName: | ||||
|             case ClassificationTypeNames.RecordStructName: | ||||
|             case ClassificationTypeNames.InterfaceName: | ||||
|             case ClassificationTypeNames.DelegateName: | ||||
|             case ClassificationTypeNames.EnumName: | ||||
|             case ClassificationTypeNames.ModuleName: | ||||
|             case ClassificationTypeNames.TypeParameterName: | ||||
|                 return "title.class"; | ||||
|             case ClassificationTypeNames.MethodName: | ||||
|             case ClassificationTypeNames.ExtensionMethodName: | ||||
|                 return "title.function"; | ||||
|             case ClassificationTypeNames.Comment: | ||||
|                 return "comment"; | ||||
|             case ClassificationTypeNames.Keyword: | ||||
|             case ClassificationTypeNames.ControlKeyword: | ||||
|             case ClassificationTypeNames.PreprocessorKeyword: | ||||
|                 return "keyword"; | ||||
|             case ClassificationTypeNames.StringLiteral: | ||||
|             case ClassificationTypeNames.VerbatimStringLiteral: | ||||
|                 return "string"; | ||||
|             case ClassificationTypeNames.NumericLiteral: | ||||
|                 return "number"; | ||||
|             case ClassificationTypeNames.Operator: | ||||
|             case ClassificationTypeNames.StringEscapeCharacter: | ||||
|                 return "operator"; | ||||
|             case ClassificationTypeNames.Punctuation: | ||||
|                 return "punctuation"; | ||||
|             case ClassificationTypeNames.StaticSymbol: | ||||
|                 return string.Empty; | ||||
|             case ClassificationTypeNames.XmlDocCommentComment: | ||||
|             case ClassificationTypeNames.XmlDocCommentDelimiter: | ||||
|             case ClassificationTypeNames.XmlDocCommentName: | ||||
|             case ClassificationTypeNames.XmlDocCommentText: | ||||
|             case ClassificationTypeNames.XmlDocCommentAttributeName: | ||||
|             case ClassificationTypeNames.XmlDocCommentAttributeQuotes: | ||||
|             case ClassificationTypeNames.XmlDocCommentAttributeValue: | ||||
|             case ClassificationTypeNames.XmlDocCommentEntityReference: | ||||
|             case ClassificationTypeNames.XmlDocCommentProcessingInstruction: | ||||
|             case ClassificationTypeNames.XmlDocCommentCDataSection: | ||||
|                 return "comment"; | ||||
|             default: | ||||
|                 return rangeClassificationType.Replace(" ", "-"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static IEnumerable<Range> FillGaps(SourceText text, IList<Range> ranges) | ||||
|     { | ||||
|         const string WhitespaceClassification = null; | ||||
|         var current = ranges.First().TextSpan.Start; | ||||
|         var end = ranges.Last().TextSpan.End; | ||||
|         Range previous = null; | ||||
|  | ||||
|         foreach (var range in ranges) | ||||
|         { | ||||
|             var start = range.TextSpan.Start; | ||||
|             if (start > current) | ||||
|             { | ||||
|                 yield return new Range(WhitespaceClassification, TextSpan.FromBounds(current, start), text); | ||||
|             } | ||||
|  | ||||
|             if (previous == null || range.TextSpan != previous.TextSpan) | ||||
|             { | ||||
|                 yield return range; | ||||
|             } | ||||
|  | ||||
|             previous = range; | ||||
|             current = range.TextSpan.End; | ||||
|         } | ||||
|  | ||||
|         if (current < end) | ||||
|         { | ||||
|             yield return new Range(WhitespaceClassification, TextSpan.FromBounds(current, end), text); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private class Range | ||||
|     { | ||||
|         private ClassifiedSpan ClassifiedSpan { get; } | ||||
|         public string Text { get; } | ||||
|  | ||||
|         public Range(string classification, TextSpan span, SourceText text) : | ||||
|             this(classification, span, text.GetSubText(span).ToString()) | ||||
|         { | ||||
|         } | ||||
|  | ||||
|         private Range(string classification, TextSpan span, string text) : | ||||
|             this(new ClassifiedSpan(classification, span), text) | ||||
|         { | ||||
|         } | ||||
|  | ||||
|         private Range(ClassifiedSpan classifiedSpan, string text) | ||||
|         { | ||||
|             ClassifiedSpan = classifiedSpan; | ||||
|             Text = text; | ||||
|         } | ||||
|  | ||||
|         public string ClassificationType => ClassifiedSpan.ClassificationType; | ||||
|  | ||||
|         public TextSpan TextSpan => ClassifiedSpan.TextSpan; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										8
									
								
								docs/src/Utilities/TypeNameLinks.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								docs/src/Utilities/TypeNameLinks.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| using System.Collections.Concurrent; | ||||
|  | ||||
| namespace Docs.Utilities; | ||||
|  | ||||
| public class TypeNameLinks | ||||
| { | ||||
|     public ConcurrentDictionary<string, string> Links { get; } = new ConcurrentDictionary<string, string>(); | ||||
| } | ||||
| @@ -1,8 +1,5 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Diagnostics; | ||||
| using System.Reflection; | ||||
| using System.Text; | ||||
|  | ||||
| namespace Docs.Utilities | ||||
| { | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| using System.ComponentModel; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples; | ||||
| namespace Delegates; | ||||
|  | ||||
| public static partial class Program | ||||
| { | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| using Spectre.Console; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples; | ||||
| namespace Delegates; | ||||
|  | ||||
| public static partial class Program | ||||
| { | ||||
|   | ||||
| @@ -2,7 +2,7 @@ using System.ComponentModel; | ||||
| using Demo.Utilities; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Demo.Commands; | ||||
| namespace Demo.Commands.Add; | ||||
|  | ||||
| [Description("Add a NuGet package reference to the project.")] | ||||
| public sealed class AddPackageCommand : Command<AddPackageCommand.Settings> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ using System.ComponentModel; | ||||
| using Demo.Utilities; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Demo.Commands; | ||||
| namespace Demo.Commands.Add; | ||||
|  | ||||
| public sealed class AddReferenceCommand : Command<AddReferenceCommand.Settings> | ||||
| { | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| using System.ComponentModel; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Demo.Commands; | ||||
| namespace Demo.Commands.Add; | ||||
|  | ||||
| public abstract class AddSettings : CommandSettings | ||||
| { | ||||
|   | ||||
| @@ -2,7 +2,7 @@ using System.ComponentModel; | ||||
| using Demo.Utilities; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Demo.Commands; | ||||
| namespace Demo.Commands.Run; | ||||
|  | ||||
| [Description("Build and run a .NET project output.")] | ||||
| public sealed class RunCommand : Command<RunCommand.Settings> | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 Phil Scott
					Phil Scott