mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-05-05 00:52:51 +08:00
Compare commits
70 Commits
11cf298071
...
a46321c06b
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a46321c06b | ||
![]() |
29ab313bb9 | ||
![]() |
92daeb739d | ||
![]() |
43e9669395 | ||
![]() |
ab8384acf6 | ||
![]() |
b2689be3ed | ||
![]() |
835143d95f | ||
![]() |
8f2a859087 | ||
![]() |
2be8e8da4e | ||
![]() |
2a8810affd | ||
![]() |
e1d21e7e61 | ||
![]() |
c7c3ebdf57 | ||
![]() |
b67af32423 | ||
![]() |
10773a5625 | ||
![]() |
4802751357 | ||
![]() |
4515d89705 | ||
![]() |
be45494d6e | ||
![]() |
69689d2ba1 | ||
![]() |
aa9e5c48c6 | ||
![]() |
8d06daf355 | ||
![]() |
cecfdc386c | ||
![]() |
375a708c43 | ||
![]() |
574ead6d46 | ||
![]() |
a87277e859 | ||
![]() |
fdc03f2081 | ||
![]() |
3eb620a44e | ||
![]() |
bc88da8056 | ||
![]() |
00b9aecb4f | ||
![]() |
444dbed259 | ||
![]() |
a32dc8030b | ||
![]() |
75547b2436 | ||
![]() |
22d1cbe01f | ||
![]() |
7f8ed509bb | ||
![]() |
c70a8b8fc5 | ||
![]() |
b470af11f7 | ||
![]() |
23b160a3f5 | ||
![]() |
1345a6347a | ||
![]() |
78f3f80b17 | ||
![]() |
a55b80220d | ||
![]() |
f8a4b2271d | ||
![]() |
dba7ad0875 | ||
![]() |
322ed2efbb | ||
![]() |
156d254208 | ||
![]() |
3437130bf0 | ||
![]() |
32384f7b8d | ||
![]() |
32361d3f15 | ||
![]() |
b9d2d2df6d | ||
![]() |
8e44a83737 | ||
![]() |
fd69ad0b01 | ||
![]() |
753894de94 | ||
![]() |
dc2cb40b79 | ||
![]() |
511f798f0f | ||
![]() |
2081c0fd9a | ||
![]() |
96512f353f | ||
![]() |
56feea11a1 | ||
![]() |
45c24055fa | ||
![]() |
d56139756c | ||
![]() |
7af1eedca7 | ||
![]() |
6116af3844 | ||
![]() |
2cc6c457ad | ||
![]() |
f02b46107e | ||
![]() |
42fd801876 | ||
![]() |
bb72b44d60 | ||
![]() |
d79e6adc5f | ||
![]() |
64b9ef582d | ||
![]() |
a19c84e25a | ||
![]() |
d52d14e848 | ||
![]() |
a62e79992b | ||
![]() |
4f22f5b7c3 | ||
![]() |
20a2f727f7 |
3
.github/workflows/ci.yaml
vendored
3
.github/workflows/ci.yaml
vendored
@ -26,9 +26,8 @@ jobs:
|
|||||||
uses: actions/setup-dotnet@v4
|
uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: |
|
dotnet-version: |
|
||||||
6.0.x
|
|
||||||
7.0.x
|
|
||||||
8.0.x
|
8.0.x
|
||||||
|
9.0.x
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
shell: bash
|
shell: bash
|
||||||
|
3
.github/workflows/publish.yaml
vendored
3
.github/workflows/publish.yaml
vendored
@ -32,9 +32,8 @@ jobs:
|
|||||||
uses: actions/setup-dotnet@v4
|
uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: |
|
dotnet-version: |
|
||||||
6.0.x
|
|
||||||
7.0.x
|
|
||||||
8.0.x
|
8.0.x
|
||||||
|
9.0.x
|
||||||
|
|
||||||
- name: Publish
|
- name: Publish
|
||||||
shell: bash
|
shell: bash
|
||||||
|
2
.github/workflows/top-issues-dashboard.yml
vendored
2
.github/workflows/top-issues-dashboard.yml
vendored
@ -9,7 +9,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Top Issues action
|
- name: Top Issues action
|
||||||
uses: rickstaa/top-issues-action@v1.3.100
|
uses: rickstaa/top-issues-action@v1.3.101
|
||||||
env:
|
env:
|
||||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
|
23
README.fa.md
23
README.fa.md
@ -44,30 +44,13 @@ https://spectreconsole.net/
|
|||||||
|
|
||||||
<h2 id="examples">مثالها</h2>
|
<h2 id="examples">مثالها</h2>
|
||||||
|
|
||||||
برای بررسی `Spectre.Console` در عمل، ابزار سراسری
|
To see `Spectre.Console` in action, please see the
|
||||||
[dotnet-example](https://github.com/patriksvensson/dotnet-example)
|
[examples repository](https://github.com/spectreconsole/examples).
|
||||||
را نصب کنید.
|
|
||||||
|
|
||||||
<pre dir="ltr">
|
|
||||||
> dotnet tool restore
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
حالا شما میتوانید مثالهای موجود در این مخزن را لیست کنید:
|
|
||||||
|
|
||||||
<pre dir="ltr">
|
|
||||||
> dotnet example
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
و برای اجرای مثال:
|
|
||||||
|
|
||||||
<pre dir="ltr">
|
|
||||||
> dotnet example tables
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h2 id="license">مجوز</h2>
|
<h2 id="license">مجوز</h2>
|
||||||
|
|
||||||
<div dir="ltr">
|
<div dir="ltr">
|
||||||
Copyright © Patrik Svensson, Phil Scott
|
Copyright © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
همانطور که Spectre.Console تحت مجوز MIT ارائه شده است؛ برای کسب اطلاعات بیشتر به مجوز مراجعه کنید.
|
همانطور که Spectre.Console تحت مجوز MIT ارائه شده است؛ برای کسب اطلاعات بیشتر به مجوز مراجعه کنید.
|
||||||
|
23
README.md
23
README.md
@ -49,25 +49,8 @@ https://spectreconsole.net
|
|||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
To see `Spectre.Console` in action, install the
|
To see `Spectre.Console` in action, please see the
|
||||||
[dotnet-example](https://github.com/patriksvensson/dotnet-example)
|
[examples repository](https://github.com/spectreconsole/examples).
|
||||||
global tool.
|
|
||||||
|
|
||||||
```
|
|
||||||
> dotnet tool restore
|
|
||||||
```
|
|
||||||
|
|
||||||
Now you can list available examples in this repository:
|
|
||||||
|
|
||||||
```
|
|
||||||
> dotnet example
|
|
||||||
```
|
|
||||||
|
|
||||||
And to run an example:
|
|
||||||
|
|
||||||
```
|
|
||||||
> dotnet example tables
|
|
||||||
```
|
|
||||||
|
|
||||||
## Sponsors
|
## Sponsors
|
||||||
|
|
||||||
@ -100,7 +83,7 @@ This project is supported by the [.NET Foundation](https://dotnetfoundation.org)
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Copyright © Patrik Svensson, Phil Scott, Nils Andresen
|
Copyright © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray
|
||||||
|
|
||||||
`Spectre.Console` is provided as-is under the MIT license. For more information see LICENSE.
|
`Spectre.Console` is provided as-is under the MIT license. For more information see LICENSE.
|
||||||
|
|
||||||
|
@ -43,24 +43,8 @@ https://spectreconsole.net/
|
|||||||
|
|
||||||
## Exemplos
|
## Exemplos
|
||||||
|
|
||||||
Para ver o `Spectre.Console` em ação, instale a ferramenta global
|
To see `Spectre.Console` in action, please see the
|
||||||
[dotnet-example](https://github.com/patriksvensson/dotnet-example).
|
[examples repository](https://github.com/spectreconsole/examples).
|
||||||
|
|
||||||
```
|
|
||||||
> dotnet tool restore
|
|
||||||
```
|
|
||||||
|
|
||||||
Agora você pode listar os exemplos disponíveis neste repositório:
|
|
||||||
|
|
||||||
```
|
|
||||||
> dotnet example
|
|
||||||
```
|
|
||||||
|
|
||||||
E para executar um exemplo:
|
|
||||||
|
|
||||||
```
|
|
||||||
> dotnet example tables
|
|
||||||
```
|
|
||||||
|
|
||||||
## Patrocinadores
|
## Patrocinadores
|
||||||
|
|
||||||
@ -83,7 +67,7 @@ Eu estou muito agradecido.
|
|||||||
|
|
||||||
## Licença
|
## Licença
|
||||||
|
|
||||||
Copyright © Patrik Svensson, Phil Scott, Nils Andresen
|
Copyright © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray
|
||||||
|
|
||||||
Spectre.Console é fornecido no estado em que se encontra sob a licença do MIT. Para obter mais informações, consulte o arquivo [LICENSE](LICENSE.md).
|
Spectre.Console é fornecido no estado em que se encontra sob a licença do MIT. Para obter mais informações, consulte o arquivo [LICENSE](LICENSE.md).
|
||||||
|
|
||||||
|
21
README.zh.md
21
README.zh.md
@ -39,23 +39,8 @@ https://spectreconsole.net/
|
|||||||
|
|
||||||
## 例子
|
## 例子
|
||||||
|
|
||||||
如果想直接运行`Spectre.Console`的例子,则需要安装[dotnet-example](https://github.com/patriksvensson/dotnet-example)工具。
|
To see `Spectre.Console` in action, please see the
|
||||||
|
[examples repository](https://github.com/spectreconsole/examples).
|
||||||
```
|
|
||||||
> dotnet tool restore
|
|
||||||
```
|
|
||||||
|
|
||||||
然后你可以列出仓库里的所有例子:
|
|
||||||
|
|
||||||
```
|
|
||||||
> dotnet example
|
|
||||||
```
|
|
||||||
|
|
||||||
跑一个看看效果:
|
|
||||||
|
|
||||||
```
|
|
||||||
> dotnet example tables
|
|
||||||
```
|
|
||||||
|
|
||||||
## Sponsors
|
## Sponsors
|
||||||
|
|
||||||
@ -77,7 +62,7 @@ https://spectreconsole.net/
|
|||||||
|
|
||||||
## 开源许可
|
## 开源许可
|
||||||
|
|
||||||
版权所有 © Patrik Svensson, Phil Scott, Nils Andresen
|
版权所有 © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray
|
||||||
|
|
||||||
Spectre.Console 基于 MIT 协议提供。查看 LICENSE 文件了解更多信息。
|
Spectre.Console 基于 MIT 协议提供。查看 LICENSE 文件了解更多信息。
|
||||||
|
|
||||||
|
62
build.cake
62
build.cake
@ -35,41 +35,11 @@ Task("Build")
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
Task("Build-Analyzer")
|
|
||||||
.IsDependentOn("Build")
|
|
||||||
.Does(context =>
|
|
||||||
{
|
|
||||||
DotNetBuild("./src/Spectre.Console.Analyzer.sln", new DotNetBuildSettings {
|
|
||||||
Configuration = configuration,
|
|
||||||
Verbosity = DotNetVerbosity.Minimal,
|
|
||||||
NoLogo = true,
|
|
||||||
NoIncremental = context.HasArgument("rebuild"),
|
|
||||||
MSBuildSettings = new DotNetMSBuildSettings()
|
|
||||||
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Build-Examples")
|
|
||||||
.IsDependentOn("Build")
|
|
||||||
.Does(context =>
|
|
||||||
{
|
|
||||||
DotNetBuild("./examples/Examples.sln", new DotNetBuildSettings {
|
|
||||||
Configuration = configuration,
|
|
||||||
Verbosity = DotNetVerbosity.Minimal,
|
|
||||||
NoLogo = true,
|
|
||||||
NoIncremental = context.HasArgument("rebuild"),
|
|
||||||
MSBuildSettings = new DotNetMSBuildSettings()
|
|
||||||
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
Task("Test")
|
Task("Test")
|
||||||
.IsDependentOn("Build")
|
.IsDependentOn("Build")
|
||||||
.IsDependentOn("Build-Analyzer")
|
|
||||||
.IsDependentOn("Build-Examples")
|
|
||||||
.Does(context =>
|
.Does(context =>
|
||||||
{
|
{
|
||||||
DotNetTest("./test/Spectre.Console.Tests/Spectre.Console.Tests.csproj", new DotNetTestSettings {
|
DotNetTest("./src/Tests/Spectre.Console.Tests/Spectre.Console.Tests.csproj", new DotNetTestSettings {
|
||||||
Configuration = configuration,
|
Configuration = configuration,
|
||||||
Verbosity = DotNetVerbosity.Minimal,
|
Verbosity = DotNetVerbosity.Minimal,
|
||||||
NoLogo = true,
|
NoLogo = true,
|
||||||
@ -77,15 +47,7 @@ Task("Test")
|
|||||||
NoBuild = true,
|
NoBuild = true,
|
||||||
});
|
});
|
||||||
|
|
||||||
DotNetTest("./test/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj", new DotNetTestSettings {
|
DotNetTest("./src/Tests/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj", new DotNetTestSettings {
|
||||||
Configuration = configuration,
|
|
||||||
Verbosity = DotNetVerbosity.Minimal,
|
|
||||||
NoLogo = true,
|
|
||||||
NoRestore = true,
|
|
||||||
NoBuild = true,
|
|
||||||
});
|
|
||||||
|
|
||||||
DotNetTest("./test/Spectre.Console.Analyzer.Tests/Spectre.Console.Analyzer.Tests.csproj", new DotNetTestSettings {
|
|
||||||
Configuration = configuration,
|
Configuration = configuration,
|
||||||
Verbosity = DotNetVerbosity.Minimal,
|
Verbosity = DotNetVerbosity.Minimal,
|
||||||
NoLogo = true,
|
NoLogo = true,
|
||||||
@ -95,26 +57,15 @@ Task("Test")
|
|||||||
});
|
});
|
||||||
|
|
||||||
Task("Package")
|
Task("Package")
|
||||||
.IsDependentOn("Test")
|
//.IsDependentOn("Test")
|
||||||
.Does(context =>
|
.Does(context =>
|
||||||
{
|
{
|
||||||
context.DotNetPack($"./src/Spectre.Console.sln", new DotNetPackSettings {
|
context.DotNetPack($"./src/Spectre.Console.sln", new DotNetPackSettings {
|
||||||
Configuration = configuration,
|
Configuration = configuration,
|
||||||
Verbosity = DotNetVerbosity.Minimal,
|
Verbosity = DotNetVerbosity.Minimal,
|
||||||
NoLogo = true,
|
NoLogo = true,
|
||||||
NoRestore = true,
|
NoRestore = false,
|
||||||
NoBuild = true,
|
NoBuild = false,
|
||||||
OutputDirectory = "./.artifacts",
|
|
||||||
MSBuildSettings = new DotNetMSBuildSettings()
|
|
||||||
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
|
|
||||||
});
|
|
||||||
|
|
||||||
context.DotNetPack($"./src/Spectre.Console.Analyzer.sln", new DotNetPackSettings {
|
|
||||||
Configuration = configuration,
|
|
||||||
Verbosity = DotNetVerbosity.Minimal,
|
|
||||||
NoLogo = true,
|
|
||||||
NoRestore = true,
|
|
||||||
NoBuild = true,
|
|
||||||
OutputDirectory = "./.artifacts",
|
OutputDirectory = "./.artifacts",
|
||||||
MSBuildSettings = new DotNetMSBuildSettings()
|
MSBuildSettings = new DotNetMSBuildSettings()
|
||||||
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
|
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
|
||||||
@ -122,7 +73,7 @@ Task("Package")
|
|||||||
});
|
});
|
||||||
|
|
||||||
Task("Publish-NuGet")
|
Task("Publish-NuGet")
|
||||||
.WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions")
|
//.WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions")
|
||||||
.IsDependentOn("Package")
|
.IsDependentOn("Package")
|
||||||
.Does(context =>
|
.Does(context =>
|
||||||
{
|
{
|
||||||
@ -139,6 +90,7 @@ Task("Publish-NuGet")
|
|||||||
{
|
{
|
||||||
Source = "https://api.nuget.org/v3/index.json",
|
Source = "https://api.nuget.org/v3/index.json",
|
||||||
ApiKey = apiKey,
|
ApiKey = apiKey,
|
||||||
|
SkipDuplicate = true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -7,6 +7,11 @@
|
|||||||
<DefaultItemExcludes>$(DefaultItemExcludes);output\**;.gitignore</DefaultItemExcludes>
|
<DefaultItemExcludes>$(DefaultItemExcludes);output\**;.gitignore</DefaultItemExcludes>
|
||||||
<NoWarn>MVC1000</NoWarn>
|
<NoWarn>MVC1000</NoWarn>
|
||||||
<MinVerSkip>true</MinVerSkip>
|
<MinVerSkip>true</MinVerSkip>
|
||||||
|
<!--
|
||||||
|
Disable NuGetAudit for now, there is an in progress PR with Statiq regarding these packages,
|
||||||
|
but since since this is just a generator we are safe to ignore this for now.
|
||||||
|
-->
|
||||||
|
<NuGetAudit>false</NuGetAudit>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -33,13 +38,13 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.Playwright" Version="1.19.0" />
|
<PackageReference Include="Microsoft.Playwright" Version="1.49.0" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
<PackageReference Include="Statiq.CodeAnalysis" Version="1.0.0-beta.58" />
|
<PackageReference Include="Statiq.CodeAnalysis" Version="1.0.0-beta.72" />
|
||||||
<PackageReference Include="Statiq.Common" Version="1.0.0-beta.58" />
|
<PackageReference Include="Statiq.Common" Version="1.0.0-beta.72" />
|
||||||
<PackageReference Include="Statiq.Web" Version="1.0.0-beta.44" />
|
<PackageReference Include="Statiq.Web" Version="1.0.0-beta.60" />
|
||||||
<PackageReference Include="MinVer" PrivateAssets="All" Version="2.5.0" />
|
<PackageReference Include="MinVer" PrivateAssets="All" Version="6.0.0" />
|
||||||
<PackageReference Include="Statiq.Web.Netlify" Version="1.0.0-beta.44" />
|
<PackageReference Include="Statiq.Web.Netlify" Version="1.0.0-beta.60" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -23,8 +23,8 @@ namespace Docs
|
|||||||
{
|
{
|
||||||
"../../src/Spectre.Console/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
|
"../../src/Spectre.Console/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
|
||||||
"../../src/Spectre.Console.Cli/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
|
"../../src/Spectre.Console.Cli/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
|
||||||
"../../src/Spectre.Console.ImageSharp/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
|
"../../src/Extensions/Spectre.Console.ImageSharp/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
|
||||||
"../../src/Spectre.Console.Json/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs"
|
"../../src/Extensions/Spectre.Console.Json/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs"
|
||||||
})
|
})
|
||||||
.AddSetting(Constants.ExampleSourceFiles, new List<string>
|
.AddSetting(Constants.ExampleSourceFiles, new List<string>
|
||||||
{
|
{
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"isRoot": true,
|
"isRoot": true,
|
||||||
"tools": {
|
"tools": {
|
||||||
"microsoft.playwright.cli": {
|
"microsoft.playwright.cli": {
|
||||||
"version": "1.2.2",
|
"version": "1.2.3",
|
||||||
"commands": [
|
"commands": [
|
||||||
"playwright"
|
"playwright"
|
||||||
]
|
]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"sdk": {
|
"sdk": {
|
||||||
"version": "8.0.100",
|
"version": "9.0.100",
|
||||||
"rollForward": "latestFeature"
|
"rollForward": "latestFeature"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@ For all available spinners, see https://jsfiddle.net/sindresorhus/2eLtsbey/embed
|
|||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Spinners can be used with [Progress](xref:progress) and [Status](xref:status).
|
Spinners can be used with [Progress](xref:live-progress) and [Status](xref:live-status).
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
AnsiConsole.Status()
|
AnsiConsole.Status()
|
||||||
|
@ -6,6 +6,7 @@ Highlights:
|
|||||||
- Dim, Invert
|
- Dim, Invert
|
||||||
- Conceal, slowblink, rapidblink
|
- Conceal, slowblink, rapidblink
|
||||||
- Links
|
- Links
|
||||||
|
Xref: appendix-styles
|
||||||
---
|
---
|
||||||
|
|
||||||
Note that what styles that can be used is defined by the system or your terminal software, and may not appear as they should.
|
Note that what styles that can be used is defined by the system or your terminal software, and may not appear as they should.
|
||||||
@ -48,7 +49,7 @@ Note that what styles that can be used is defined by the system or your terminal
|
|||||||
<td>Shows text with a horizontal line through the center</td>
|
<td>Shows text with a horizontal line through the center</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>link</link></td>
|
<td><code>link</code></td>
|
||||||
<td>Creates a clickable link within text</td>
|
<td>Creates a clickable link within text</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
@ -96,6 +96,31 @@ Spectre.Console has an [analyzer](https://www.nuget.org/packages/Spectre.Console
|
|||||||
common errors in writing console output from above such as using multiple live rendering widgets simultaneously,
|
common errors in writing console output from above such as using multiple live rendering widgets simultaneously,
|
||||||
or using the static `AnsiConsole` class when `IAnsiConsole` is available.
|
or using the static `AnsiConsole` class when `IAnsiConsole` is available.
|
||||||
|
|
||||||
|
### Native AOT Support
|
||||||
|
|
||||||
|
Publishing your app as Native AOT with Spectre.Console produces an app that's self-contained and has been ahead-of-time (AOT) compiled to native code. Native AOT apps have faster startup time and smaller memory footprints. These apps can run on machines that don't have the .NET runtime installed.
|
||||||
|
|
||||||
|
To enable AOT support on your application, Add `<PublishAot>true</PublishAot>` to your project file.
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<PropertyGroup>
|
||||||
|
<PublishAot>true</PublishAot>
|
||||||
|
</PropertyGroup>
|
||||||
|
```
|
||||||
|
|
||||||
|
Current Spectre.Console support for AOT:
|
||||||
|
|
||||||
|
* ☑️ Spectre.Console
|
||||||
|
* ❌ Spectre.Console.Cli
|
||||||
|
* ☑️ Spectre.Console.Json
|
||||||
|
* ☑️ Spectre.Console.ImageSharp
|
||||||
|
|
||||||
|
Spectre.Console.Cli relies on reflection and discovering types at runtime, preventing it from currently supporting AOT.
|
||||||
|
|
||||||
|
Spectre.Console supports AOT, but with the following limitations
|
||||||
|
|
||||||
|
* `WriteException` will output a simple stacktrace and ignore any `ExceptionFormats` set.
|
||||||
|
|
||||||
### Configuring the Windows Terminal For Unicode and Emoji Support
|
### Configuring the Windows Terminal For Unicode and Emoji Support
|
||||||
|
|
||||||
Windows Terminal supports Unicode and Emoji. However, the shells such as Powershell and cmd.exe do not.
|
Windows Terminal supports Unicode and Emoji. However, the shells such as Powershell and cmd.exe do not.
|
||||||
|
@ -26,9 +26,9 @@ New features have been added, such as the ability to show separators between tab
|
|||||||
## Rendering
|
## Rendering
|
||||||
|
|
||||||
* Add .NET 8 support by [@patriksvensson](https://github.com/patriksvensson) in [#1367](https://github.com/spectreconsole/spectre.console/pull/1367)
|
* Add .NET 8 support by [@patriksvensson](https://github.com/patriksvensson) in [#1367](https://github.com/spectreconsole/spectre.console/pull/1367)
|
||||||
* Fixed render issue where writeline inside status caused corrupt output #415 #694 by [@fredrikbentzen](https://github.com/fredrikbentzen) in [#1132]([#1132](https://github.com/spectreconsole/spectre.console/pull/1132))
|
* Fixed render issue where writeline inside status caused corrupt output #415 #694 by [@fredrikbentzen](https://github.com/fredrikbentzen) in [#1132](https://github.com/spectreconsole/spectre.console/pull/1132))
|
||||||
* Relax the SDK requirements by rolling forward to the latest feature by [@0xced](https://github.com/0xced) in [#1237]([#1237](https://github.com/spectreconsole/spectre.console/pull/1237))
|
* Relax the SDK requirements by rolling forward to the latest feature by [@0xced](https://github.com/0xced) in [#1237](https://github.com/spectreconsole/spectre.console/pull/1237))
|
||||||
* Add fix to avoid exception on rows with no children by [@jeppevammenkristensen](https://github.com/jeppevammenkristensen) in [#1241]([#1241](https://github.com/spectreconsole/spectre.console/pull/1241))
|
* Add fix to avoid exception on rows with no children by [@jeppevammenkristensen](https://github.com/jeppevammenkristensen) in [#1241](https://github.com/spectreconsole/spectre.console/pull/1241))
|
||||||
* Set `end_of_line` to `LF` instead of `CRLF` by [@0xced](https://github.com/0xced) in [#1256](https://github.com/spectreconsole/spectre.console/pull/1256)
|
* Set `end_of_line` to `LF` instead of `CRLF` by [@0xced](https://github.com/0xced) in [#1256](https://github.com/spectreconsole/spectre.console/pull/1256)
|
||||||
* Fix `Rule` widget docs by [@tomaszprasolek](https://github.com/tomaszprasolek) in [#1257](https://github.com/spectreconsole/spectre.console/pull/1257)
|
* Fix `Rule` widget docs by [@tomaszprasolek](https://github.com/tomaszprasolek) in [#1257](https://github.com/spectreconsole/spectre.console/pull/1257)
|
||||||
* Added the missing columns-cast by [@nils](https://github.com/nils)-a in [#1294](https://github.com/spectreconsole/spectre.console/pull/1294)
|
* Added the missing columns-cast by [@nils](https://github.com/nils)-a in [#1294](https://github.com/spectreconsole/spectre.console/pull/1294)
|
||||||
@ -46,7 +46,7 @@ New features have been added, such as the ability to show separators between tab
|
|||||||
|
|
||||||
## CLI
|
## CLI
|
||||||
* Add async command unit tests by [@FrankRay78](https://github.com/FrankRay78) in [#1228](https://github.com/spectreconsole/spectre.console/pull/1228)
|
* Add async command unit tests by [@FrankRay78](https://github.com/FrankRay78) in [#1228](https://github.com/spectreconsole/spectre.console/pull/1228)
|
||||||
* Add support for async delegate by [@icalvo](https://github.com/icalvo) in [#1215]([#1215](https://github.com/spectreconsole/spectre.console/pull/1215))
|
* Add support for async delegate by [@icalvo](https://github.com/icalvo) in [#1215](https://github.com/spectreconsole/spectre.console/pull/1215))
|
||||||
* Remove unnecessary `[NotNull]` attributes by [@0xced](https://github.com/0xced) in [#1255](https://github.com/spectreconsole/spectre.console/pull/1255)
|
* Remove unnecessary `[NotNull]` attributes by [@0xced](https://github.com/0xced) in [#1255](https://github.com/spectreconsole/spectre.console/pull/1255)
|
||||||
* Allow custom help providers by [@FrankRay78](https://github.com/FrankRay78) in [#1259](https://github.com/spectreconsole/spectre.console/pull/1259)
|
* Allow custom help providers by [@FrankRay78](https://github.com/FrankRay78) in [#1259](https://github.com/spectreconsole/spectre.console/pull/1259)
|
||||||
* Specified details for settings for the argument vector by [@nils](https://github.com/nils)-a in [#1301](https://github.com/spectreconsole/spectre.console/pull/1301)
|
* Specified details for settings for the argument vector by [@nils](https://github.com/nils)-a in [#1301](https://github.com/spectreconsole/spectre.console/pull/1301)
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
@{
|
@{
|
||||||
Layout = @$"_layout.cshtml";
|
Layout = "_layout.cshtml";
|
||||||
}
|
}
|
@ -41,7 +41,7 @@ Removing all styling from help text is also possible, a good choice for ensuring
|
|||||||
config.Settings.HelpProviderStyles = null;
|
config.Settings.HelpProviderStyles = null;
|
||||||
```
|
```
|
||||||
|
|
||||||
See [Markup](../markup) for information about the use of markup in Spectre.Console, and [Styles](xref:styles) for a listing of supported styles.
|
See [Markup](../markup) for information about the use of markup in Spectre.Console, and [Styles](xref:appendix-styles) for a listing of supported styles.
|
||||||
|
|
||||||
## Custom help providers
|
## Custom help providers
|
||||||
|
|
||||||
@ -71,5 +71,5 @@ public static class Program
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
There is a working [example of a custom help provider](https://github.com/spectreconsole/spectre.console/tree/main/examples/Cli/Help) demonstrating this.
|
There is a working [example of a custom help provider](https://github.com/spectreconsole/examples/tree/main/examples/Cli/Help) demonstrating this.
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ var app = new CommandApp<DefaultCommand>(registrar);
|
|||||||
return app.Run(args);
|
return app.Run(args);
|
||||||
```
|
```
|
||||||
|
|
||||||
`TypeRegistrar` is a custom class that must be created by the user. This [example using `Microsoft.Extensions.DependencyInjection` as the container](https://github.com/spectreconsole/spectre.console/tree/main/examples/Cli/Injection) provides an example `TypeRegistrar` and `TypeResolver` that can be added to your application with small adjustments for your DI container.
|
`TypeRegistrar` is a custom class that must be created by the user. This [example using `Microsoft.Extensions.DependencyInjection` as the container](https://github.com/spectreconsole/examples/tree/main/examples/Cli/Injection) provides an example `TypeRegistrar` and `TypeResolver` that can be added to your application with small adjustments for your DI container.
|
||||||
|
|
||||||
Hint: If you do write your own implementation of `TypeRegistrar` and `TypeResolver` and you have some form of unit tests in place for your project,
|
Hint: If you do write your own implementation of `TypeRegistrar` and `TypeResolver` and you have some form of unit tests in place for your project,
|
||||||
there is a utility `TypeRegistrarBaseTests` available that can be used to ensure your implementations adhere to the required implementation. Simply call `TypeRegistrarBaseTests.RunAllTests()` and expect no `TypeRegistrarBaseTests.TestFailedException` to be thrown.
|
there is a utility `TypeRegistrarBaseTests` available that can be used to ensure your implementations adhere to the required implementation. Simply call `TypeRegistrarBaseTests.RunAllTests()` and expect no `TypeRegistrarBaseTests.TestFailedException` to be thrown.
|
||||||
@ -89,4 +89,4 @@ This provides an opportunity to modify the result and also to tear down any infr
|
|||||||
|
|
||||||
The `Intercept`-Method of each interceptor is run before the command is executed and the `InterceptResult`-Method is run after it. These are typically used for configuring logging or other infrastructure concerns.
|
The `Intercept`-Method of each interceptor is run before the command is executed and the `InterceptResult`-Method is run after it. These are typically used for configuring logging or other infrastructure concerns.
|
||||||
|
|
||||||
For an example of using the interceptor to configure logging, see the [Serilog demo](https://github.com/spectreconsole/spectre.console/tree/main/examples/Cli/Logging).
|
For an example of using the interceptor to configure logging, see the [Serilog demo](https://github.com/spectreconsole/examples/tree/main/examples/Cli/Logging).
|
@ -1,8 +1,8 @@
|
|||||||
Title: Composing Commands
|
Title: Composing Commands
|
||||||
RedirectFrom: introduction
|
RedirectFrom: introduction
|
||||||
Order: 8
|
Order: 8
|
||||||
Description: "The underlying philosophy behind *Spectre.Console.Cli* is to rely on the .NET type system to
|
Description: The underlying philosophy behind *Spectre.Console.Cli* is
|
||||||
declare the commands, but tie everything together via composition."
|
to rely on the .NET type system to declare the commands, but tie everything together via composition.
|
||||||
---
|
---
|
||||||
|
|
||||||
The underlying philosophy behind `Spectre.Console.Cli` is to rely on the .NET type system to
|
The underlying philosophy behind `Spectre.Console.Cli` is to rely on the .NET type system to
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Title: Introduction
|
Title: Introduction
|
||||||
Order: 1
|
Order: 1
|
||||||
Description: "*Spectre.Console.Cli* is a modern library for parsing command line arguments. While it's extremely
|
Description: "*Spectre.Console.Cli* is a modern library for parsing command line arguments. While it's extremely
|
||||||
opinionated in what it does, it tries to follow established industry conventions, and draws
|
opinionated in what it does, it tries to follow established industry conventions, and draws
|
||||||
its inspiration from applications you use everyday."
|
its inspiration from applications you use everyday."
|
||||||
---
|
---
|
||||||
|
|
||||||
`Spectre.Console.Cli` is a modern library for parsing command line arguments. While it's extremely
|
`Spectre.Console.Cli` is a modern library for parsing command line arguments. While it's extremely
|
||||||
|
@ -9,6 +9,7 @@ Highlights:
|
|||||||
Reference:
|
Reference:
|
||||||
- T:Spectre.Console.Progress
|
- T:Spectre.Console.Progress
|
||||||
- M:Spectre.Console.AnsiConsole.Progress
|
- M:Spectre.Console.AnsiConsole.Progress
|
||||||
|
Xref: live-progress
|
||||||
---
|
---
|
||||||
|
|
||||||
Spectre.Console can display information about long running tasks in the console.
|
Spectre.Console can display information about long running tasks in the console.
|
||||||
@ -85,6 +86,8 @@ AnsiConsole.Progress()
|
|||||||
new PercentageColumn(), // Percentage
|
new PercentageColumn(), // Percentage
|
||||||
new RemainingTimeColumn(), // Remaining time
|
new RemainingTimeColumn(), // Remaining time
|
||||||
new SpinnerColumn(), // Spinner
|
new SpinnerColumn(), // Spinner
|
||||||
|
new DownloadedColumn(), // Downloaded
|
||||||
|
new TransferSpeedColumn(), // Transfer speed
|
||||||
})
|
})
|
||||||
.Start(ctx =>
|
.Start(ctx =>
|
||||||
{
|
{
|
||||||
|
@ -8,6 +8,7 @@ Highlights:
|
|||||||
Reference:
|
Reference:
|
||||||
- T:Spectre.Console.Status
|
- T:Spectre.Console.Status
|
||||||
- M:Spectre.Console.AnsiConsole.Status
|
- M:Spectre.Console.AnsiConsole.Status
|
||||||
|
Xref: live-status
|
||||||
---
|
---
|
||||||
|
|
||||||
Spectre.Console can display information about long running tasks in the console.
|
Spectre.Console can display information about long running tasks in the console.
|
||||||
|
@ -27,6 +27,32 @@ you can use the `Prompt<TResult>`.
|
|||||||
Run prompt example? [y/n] (y): _
|
Run prompt example? [y/n] (y): _
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// Ask the user to confirm
|
||||||
|
var confirmation = AnsiConsole.Prompt(
|
||||||
|
new TextPrompt<bool>("Run prompt example?")
|
||||||
|
.AddChoice(true)
|
||||||
|
.AddChoice(false)
|
||||||
|
.DefaultValue(true)
|
||||||
|
.WithConverter(choice => choice ? "y" : "n"));
|
||||||
|
|
||||||
|
// Echo the confirmation back to the terminal
|
||||||
|
Console.WriteLine(confirmation ? "Confirmed" : "Declined");
|
||||||
|
```
|
||||||
|
|
||||||
|
Otherwise it is possible to use the `ConfirmationPrompt`
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// Ask the user to confirm
|
||||||
|
var confirmation = AnsiConsole.Prompt(
|
||||||
|
new ConfirmationPrompt("Run prompt example?"));
|
||||||
|
|
||||||
|
// Echo the confirmation back to the terminal
|
||||||
|
Console.WriteLine(confirmation ? "Confirmed" : "Declined");
|
||||||
|
```
|
||||||
|
|
||||||
## Simple
|
## Simple
|
||||||
|
|
||||||
<?# Example symbol="M:Prompt.Program.AskName" project="Prompt" /?>
|
<?# Example symbol="M:Prompt.Program.AskName" project="Prompt" /?>
|
||||||
@ -36,6 +62,30 @@ What's your name? Patrik
|
|||||||
What's your age? 37
|
What's your age? 37
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// Ask the user a couple of simple questions
|
||||||
|
var name = AnsiConsole.Prompt(
|
||||||
|
new TextPrompt<string>("What's your name?"));
|
||||||
|
var age = AnsiConsole.Prompt(
|
||||||
|
new TextPrompt<int>("What's your age?"));
|
||||||
|
|
||||||
|
// Echo the name and age back to the terminal
|
||||||
|
AnsiConsole.WriteLine($"So you're {name} and you're {age} years old");
|
||||||
|
```
|
||||||
|
|
||||||
|
Otherwise it is possible to use the `Ask` method
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// Ask the user a couple of simple questions
|
||||||
|
var name = AnsiConsole.Ask<string>("What's your name?");
|
||||||
|
var age = AnsiConsole.Ask<int>("What's your age?");
|
||||||
|
|
||||||
|
// Echo the name and age back to the terminal
|
||||||
|
AnsiConsole.WriteLine($"So you're {name} and you're {age} years old");
|
||||||
|
```
|
||||||
|
|
||||||
## Choices
|
## Choices
|
||||||
|
|
||||||
<?# Example symbol="M:Prompt.Program.AskFruit" project="Prompt" /?>
|
<?# Example symbol="M:Prompt.Program.AskFruit" project="Prompt" /?>
|
||||||
@ -44,6 +94,19 @@ What's your age? 37
|
|||||||
What's your favorite fruit? [Apple/Banana/Orange] (Orange): _
|
What's your favorite fruit? [Apple/Banana/Orange] (Orange): _
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// Ask for the user's favorite fruit
|
||||||
|
var fruit = AnsiConsole.Prompt(
|
||||||
|
new TextPrompt<string>("What's your favorite fruit?")
|
||||||
|
.AddChoices(["Apple", "Banana", "Orange"])
|
||||||
|
.DefaultValue("Orange"));
|
||||||
|
|
||||||
|
// Echo the fruit back to the terminal
|
||||||
|
Console.WriteLine($"I agree. {fruit} is tasty!");
|
||||||
|
```
|
||||||
|
|
||||||
## Validation
|
## Validation
|
||||||
|
|
||||||
<?# Example symbol="M:Prompt.Program.AskAge" project="Prompt" /?>
|
<?# Example symbol="M:Prompt.Program.AskAge" project="Prompt" /?>
|
||||||
@ -56,6 +119,23 @@ Too high
|
|||||||
What's the secret number? _
|
What's the secret number? _
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// Ask the user to guess the secret number
|
||||||
|
var number = AnsiConsole.Prompt(
|
||||||
|
new TextPrompt<int>("What's the secret number?")
|
||||||
|
.Validate((n) => n switch
|
||||||
|
{
|
||||||
|
< 50 => ValidationResult.Error("Too low"),
|
||||||
|
50 => ValidationResult.Success(),
|
||||||
|
> 50 => ValidationResult.Error("Too high"),
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Echo the user's success back to the terminal
|
||||||
|
Console.WriteLine($"Correct! The secret number is {number}.");
|
||||||
|
```
|
||||||
|
|
||||||
## Secrets
|
## Secrets
|
||||||
|
|
||||||
<?# Example symbol="M:Prompt.Program.AskPassword" project="Prompt" /?>
|
<?# Example symbol="M:Prompt.Program.AskPassword" project="Prompt" /?>
|
||||||
@ -65,6 +145,18 @@ What's the secret number? _
|
|||||||
Enter password: ************_
|
Enter password: ************_
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// Ask the user to enter the password
|
||||||
|
var password = AnsiConsole.Prompt(
|
||||||
|
new TextPrompt<string>("Enter password:")
|
||||||
|
.Secret());
|
||||||
|
|
||||||
|
// Echo the password back to the terminal
|
||||||
|
Console.WriteLine($"Your password is {password}");
|
||||||
|
```
|
||||||
|
|
||||||
## Masks
|
## Masks
|
||||||
|
|
||||||
<?# Example symbol="M:Prompt.Program.AskPasswordWithCustomMask" project="Prompt" /?>
|
<?# Example symbol="M:Prompt.Program.AskPasswordWithCustomMask" project="Prompt" /?>
|
||||||
@ -82,6 +174,18 @@ You can utilize a null character to completely hide input.
|
|||||||
Enter password: _
|
Enter password: _
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// Ask the user to enter the password
|
||||||
|
var password = AnsiConsole.Prompt(
|
||||||
|
new TextPrompt<string>("Enter password:")
|
||||||
|
.Secret('-'));
|
||||||
|
|
||||||
|
// Echo the password back to the terminal
|
||||||
|
Console.WriteLine($"Your password is {password}");
|
||||||
|
```
|
||||||
|
|
||||||
## Optional
|
## Optional
|
||||||
|
|
||||||
<?# Example symbol="M:Prompt.Program.AskColor" project="Prompt" /?>
|
<?# Example symbol="M:Prompt.Program.AskColor" project="Prompt" /?>
|
||||||
@ -89,3 +193,17 @@ Enter password: _
|
|||||||
```text
|
```text
|
||||||
[Optional] Favorite color? _
|
[Optional] Favorite color? _
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// Ask the user to enter the password
|
||||||
|
var color = AnsiConsole.Prompt(
|
||||||
|
new TextPrompt<string>("[[Optional]] Favorite color?")
|
||||||
|
.AllowEmpty());
|
||||||
|
|
||||||
|
// Echo the color back to the terminal
|
||||||
|
Console.WriteLine(string.IsNullOrWhiteSpace(color)
|
||||||
|
? "You're right, all colors are beautiful"
|
||||||
|
: $"I agree. {color} is a very beautiful color");
|
||||||
|
```
|
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
<div id="container">
|
<div id="container">
|
||||||
<div id="console">
|
<div id="console">
|
||||||
<div class="line"><span style="color:var(--brightBlack)">╭─</span><span style="color:var(--folder)"></span><span style="background-color:var(--folder);color:var(--black)"> ~/spectre.console</span><span style="color:var(--folder);background-color:var(--dotnet)"></span><span style="background-color:var(--blue)"> .NET 8.0 </span><span style="color:var(--dotnet);background-color:var(--git)"></span><span style="background-color:var(--git);color:var(--background)">  main </span><span style="color:var(--git)"></span></div>
|
<div class="line"><span style="color:var(--brightBlack)">╭─</span><span style="color:var(--folder)"></span><span style="background-color:var(--folder);color:var(--black)"> ~/spectre.console</span><span style="color:var(--folder);background-color:var(--dotnet)"></span><span style="background-color:var(--blue)"> .NET 9.0 </span><span style="color:var(--dotnet);background-color:var(--git)"></span><span style="background-color:var(--git);color:var(--background)">  main </span><span style="color:var(--git)"></span></div>
|
||||||
<div class="line"><span style="color:var(--brightBlack)">╰─</span> dotnet run</div>
|
<div class="line"><span style="color:var(--brightBlack)">╰─</span> dotnet run</div>
|
||||||
<div class="line"></div>
|
<div class="line"></div>
|
||||||
<div class="line">╭────────────────────────────────────────────────────────╮</div>
|
<div class="line">╭────────────────────────────────────────────────────────╮</div>
|
||||||
|
@ -58,21 +58,31 @@ internal static class HighlightService
|
|||||||
}
|
}
|
||||||
|
|
||||||
var text = await syntaxReference.SyntaxTree.GetTextAsync();
|
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);
|
// we need a document for the syntax highlighter, so create a temporary solution and project to hold it.
|
||||||
|
var workspace = new AdhocWorkspace();
|
||||||
|
var solution = workspace.CurrentSolution
|
||||||
|
.AddProject("TempProject", "TempProject", "C#")
|
||||||
|
.AddDocument("TempDocument", await syntaxReference.SyntaxTree.GetTextAsync());
|
||||||
|
|
||||||
|
var document = solution.Project.Documents.First();
|
||||||
|
|
||||||
|
var highlightElement = await HighlightElement(document, text, textSpan, indent);
|
||||||
|
return highlightElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int GetIndent(SyntaxTriviaList leadingTrivia)
|
private static int GetIndent(SyntaxTriviaList leadingTrivia)
|
||||||
{
|
{
|
||||||
var whitespace = leadingTrivia.FirstOrDefault(i => i.Kind() == SyntaxKind.WhitespaceTrivia);
|
var whitespace = leadingTrivia.FirstOrDefault(i => i.IsKind(SyntaxKind.WhitespaceTrivia));
|
||||||
return whitespace == default ? 0 : whitespace.Span.Length;
|
return whitespace == default ? 0 : whitespace.Span.Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string HighlightElement(Workspace workspace, SemanticModel semanticModel, SourceText fullSourceText,
|
private static async Task<string> HighlightElement(Document document,
|
||||||
|
SourceText fullSourceText,
|
||||||
TextSpan textSpan, int indent)
|
TextSpan textSpan, int indent)
|
||||||
{
|
{
|
||||||
|
|
||||||
var classifiedSpans = Classifier.GetClassifiedSpans(semanticModel, textSpan, workspace);
|
var classifiedSpans = await Classifier.GetClassifiedSpansAsync(document, textSpan);
|
||||||
return HighlightElement(classifiedSpans, fullSourceText, indent);
|
return HighlightElement(classifiedSpans, fullSourceText, indent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,17 +3,11 @@
|
|||||||
"isRoot": true,
|
"isRoot": true,
|
||||||
"tools": {
|
"tools": {
|
||||||
"cake.tool": {
|
"cake.tool": {
|
||||||
"version": "4.0.0",
|
"version": "5.0.0",
|
||||||
"commands": [
|
"commands": [
|
||||||
"dotnet-cake"
|
"dotnet-cake"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"dotnet-example": {
|
|
||||||
"version": "3.1.0",
|
|
||||||
"commands": [
|
|
||||||
"dotnet-example"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"verify.tool": {
|
"verify.tool": {
|
||||||
"version": "0.6.0",
|
"version": "0.6.0",
|
||||||
"commands": [
|
"commands": [
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
using System.ComponentModel;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Delegates;
|
|
||||||
|
|
||||||
public static partial class Program
|
|
||||||
{
|
|
||||||
public sealed class BarSettings : CommandSettings
|
|
||||||
{
|
|
||||||
[CommandOption("--count")]
|
|
||||||
[Description("The number of bars to print")]
|
|
||||||
[DefaultValue(3)]
|
|
||||||
public int Count { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
<ExampleName>Delegates</ExampleName>
|
|
||||||
<ExampleDescription>Demonstrates how to specify commands as delegates.</ExampleDescription>
|
|
||||||
<ExampleGroup>Cli</ExampleGroup>
|
|
||||||
<ExampleVisible>false</ExampleVisible>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,61 +0,0 @@
|
|||||||
using System.Threading.Tasks;
|
|
||||||
using Spectre.Console;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Delegates;
|
|
||||||
|
|
||||||
public static partial class Program
|
|
||||||
{
|
|
||||||
public static int Main(string[] args)
|
|
||||||
{
|
|
||||||
var app = new CommandApp();
|
|
||||||
app.Configure(config =>
|
|
||||||
{
|
|
||||||
config.AddDelegate("foo", Foo)
|
|
||||||
.WithDescription("Foos the bars");
|
|
||||||
|
|
||||||
config.AddDelegate<BarSettings>("bar", Bar)
|
|
||||||
.WithDescription("Bars the foos");
|
|
||||||
|
|
||||||
config.AddAsyncDelegate("fooAsync", FooAsync)
|
|
||||||
.WithDescription("Foos the bars asynchronously");
|
|
||||||
|
|
||||||
config.AddAsyncDelegate<BarSettings>("barAsync", BarAsync)
|
|
||||||
.WithDescription("Bars the foos asynchronously");
|
|
||||||
});
|
|
||||||
|
|
||||||
return app.Run(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int Foo(CommandContext context)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine("Foo");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int Bar(CommandContext context, BarSettings settings)
|
|
||||||
{
|
|
||||||
for (var index = 0; index < settings.Count; index++)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine("Bar");
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Task<int> FooAsync(CommandContext context)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine("Foo");
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Task<int> BarAsync(CommandContext context, BarSettings settings)
|
|
||||||
{
|
|
||||||
for (var index = 0; index < settings.Count; index++)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine("Bar");
|
|
||||||
}
|
|
||||||
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
using System.ComponentModel;
|
|
||||||
using Demo.Utilities;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Demo.Commands.Add;
|
|
||||||
|
|
||||||
[Description("Add a NuGet package reference to the project.")]
|
|
||||||
public sealed class AddPackageCommand : Command<AddPackageCommand.Settings>
|
|
||||||
{
|
|
||||||
public sealed class Settings : AddSettings
|
|
||||||
{
|
|
||||||
[CommandArgument(0, "<PACKAGENAME>")]
|
|
||||||
[Description("The package reference to add.")]
|
|
||||||
public string PackageName { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("-v|--version <VERSION>")]
|
|
||||||
[Description("The version of the package to add.")]
|
|
||||||
public string Version { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("-f|--framework <FRAMEWORK>")]
|
|
||||||
[Description("Add the reference only when targeting a specific framework.")]
|
|
||||||
public string Framework { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--no-restore")]
|
|
||||||
[Description("Add the reference without performing restore preview and compatibility check.")]
|
|
||||||
public bool NoRestore { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--source <SOURCE>")]
|
|
||||||
[Description("The NuGet package source to use during the restore.")]
|
|
||||||
public string Source { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--package-directory <PACKAGEDIR>")]
|
|
||||||
[Description("The directory to restore packages to.")]
|
|
||||||
public string PackageDirectory { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--interactive")]
|
|
||||||
[Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")]
|
|
||||||
public bool Interactive { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int Execute(CommandContext context, Settings settings)
|
|
||||||
{
|
|
||||||
SettingsDumper.Dump(settings);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
using System.ComponentModel;
|
|
||||||
using Demo.Utilities;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Demo.Commands.Add;
|
|
||||||
|
|
||||||
public sealed class AddReferenceCommand : Command<AddReferenceCommand.Settings>
|
|
||||||
{
|
|
||||||
public sealed class Settings : AddSettings
|
|
||||||
{
|
|
||||||
[CommandArgument(0, "<PROJECTPATH>")]
|
|
||||||
[Description("The package reference to add.")]
|
|
||||||
public string ProjectPath { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("-f|--framework <FRAMEWORK>")]
|
|
||||||
[Description("Add the reference only when targeting a specific framework.")]
|
|
||||||
public string Framework { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--interactive")]
|
|
||||||
[Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")]
|
|
||||||
public bool Interactive { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int Execute(CommandContext context, Settings settings)
|
|
||||||
{
|
|
||||||
SettingsDumper.Dump(settings);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
using System.ComponentModel;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Demo.Commands.Add;
|
|
||||||
|
|
||||||
public abstract class AddSettings : CommandSettings
|
|
||||||
{
|
|
||||||
[CommandArgument(0, "<PROJECT>")]
|
|
||||||
[Description("The project file to operate on. If a file is not specified, the command will search the current directory for one.")]
|
|
||||||
public string Project { get; set; }
|
|
||||||
}
|
|
@ -1,69 +0,0 @@
|
|||||||
using System.ComponentModel;
|
|
||||||
using Demo.Utilities;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Demo.Commands.Run;
|
|
||||||
|
|
||||||
[Description("Build and run a .NET project output.")]
|
|
||||||
public sealed class RunCommand : Command<RunCommand.Settings>
|
|
||||||
{
|
|
||||||
public sealed class Settings : CommandSettings
|
|
||||||
{
|
|
||||||
[CommandOption("-c|--configuration <CONFIGURATION>")]
|
|
||||||
[Description("The configuration to run for. The default for most projects is '[grey]Debug[/]'.")]
|
|
||||||
[DefaultValue("Debug")]
|
|
||||||
public string Configuration { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("-f|--framework <FRAMEWORK>")]
|
|
||||||
[Description("The target framework to run for. The target framework must also be specified in the project file.")]
|
|
||||||
public string Framework { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("-r|--runtime <RUNTIMEIDENTIFIER>")]
|
|
||||||
[Description("The target runtime to run for.")]
|
|
||||||
public string RuntimeIdentifier { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("-p|--project <PROJECTPATH>")]
|
|
||||||
[Description("The path to the project file to run (defaults to the current directory if there is only one project).")]
|
|
||||||
public string ProjectPath { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--launch-profile <LAUNCHPROFILE>")]
|
|
||||||
[Description("The name of the launch profile (if any) to use when launching the application.")]
|
|
||||||
public string LaunchProfile { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--no-launch-profile")]
|
|
||||||
[Description("Do not attempt to use [grey]launchSettings.json[/] to configure the application.")]
|
|
||||||
public bool NoLaunchProfile { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--no-build")]
|
|
||||||
[Description("Do not build the project before running. Implies [grey]--no-restore[/].")]
|
|
||||||
public bool NoBuild { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--interactive")]
|
|
||||||
[Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")]
|
|
||||||
public string Interactive { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--no-restore")]
|
|
||||||
[Description("Do not restore the project before building.")]
|
|
||||||
public bool NoRestore { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--verbosity <VERBOSITY>")]
|
|
||||||
[Description("Set the MSBuild verbosity level. Allowed values are q[grey]uiet[/], m[grey]inimal[/], n[grey]ormal[/], d[grey]etailed[/], and diag[grey]nostic[/].")]
|
|
||||||
[TypeConverter(typeof(VerbosityConverter))]
|
|
||||||
[DefaultValue(Verbosity.Normal)]
|
|
||||||
public Verbosity Verbosity { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--no-dependencies")]
|
|
||||||
[Description("Do not restore project-to-project references and only restore the specified project.")]
|
|
||||||
public bool NoDependencies { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--force")]
|
|
||||||
[Description("Force all dependencies to be resolved even if the last restore was successful. This is equivalent to deleting [grey]project.assets.json[/].")]
|
|
||||||
public bool Force { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int Execute(CommandContext context, Settings settings)
|
|
||||||
{
|
|
||||||
SettingsDumper.Dump(settings);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using Demo.Utilities;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Demo.Commands.Serve;
|
|
||||||
|
|
||||||
[Description("Launches a web server in the current working directory and serves all files in it.")]
|
|
||||||
public sealed class ServeCommand : Command<ServeCommand.Settings>
|
|
||||||
{
|
|
||||||
public sealed class Settings : CommandSettings
|
|
||||||
{
|
|
||||||
[CommandOption("-p|--port <PORT>")]
|
|
||||||
[Description("Port to use. Defaults to [grey]8080[/]. Use [grey]0[/] for a dynamic port.")]
|
|
||||||
public int Port { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("-o|--open-browser [BROWSER]")]
|
|
||||||
[Description("Open a web browser when the server starts. You can also specify which browser to use. If none is specified, the default one will be used.")]
|
|
||||||
public FlagValue<string> OpenBrowser { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int Execute(CommandContext context, Settings settings)
|
|
||||||
{
|
|
||||||
if (settings.OpenBrowser.IsSet)
|
|
||||||
{
|
|
||||||
var browser = settings.OpenBrowser.Value;
|
|
||||||
if (browser != null)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Open in {browser}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Open in default browser.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsDumper.Dump(settings);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
<ExampleName>Demo</ExampleName>
|
|
||||||
<ExampleDescription>Demonstrates the most common use cases of Spectre.Cli.</ExampleDescription>
|
|
||||||
<ExampleGroup>Cli</ExampleGroup>
|
|
||||||
<ExampleVisible>false</ExampleVisible>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\..\src\Spectre.Console.Cli\Spectre.Console.Cli.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,39 +0,0 @@
|
|||||||
using Demo.Commands;
|
|
||||||
using Demo.Commands.Add;
|
|
||||||
using Demo.Commands.Run;
|
|
||||||
using Demo.Commands.Serve;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Demo;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static int Main(string[] args)
|
|
||||||
{
|
|
||||||
var app = new CommandApp();
|
|
||||||
app.Configure(config =>
|
|
||||||
{
|
|
||||||
config.SetApplicationName("fake-dotnet");
|
|
||||||
config.ValidateExamples();
|
|
||||||
config.AddExample("run", "--no-build");
|
|
||||||
|
|
||||||
// Run
|
|
||||||
config.AddCommand<RunCommand>("run");
|
|
||||||
|
|
||||||
// Add
|
|
||||||
config.AddBranch<AddSettings>("add", add =>
|
|
||||||
{
|
|
||||||
add.SetDescription("Add a package or reference to a .NET project");
|
|
||||||
add.AddCommand<AddPackageCommand>("package");
|
|
||||||
add.AddCommand<AddReferenceCommand>("reference");
|
|
||||||
});
|
|
||||||
|
|
||||||
// Serve
|
|
||||||
config.AddCommand<ServeCommand>("serve")
|
|
||||||
.WithExample("serve", "-o", "firefox")
|
|
||||||
.WithExample("serve", "--port", "80", "-o", "firefox");
|
|
||||||
});
|
|
||||||
|
|
||||||
return app.Run(args);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Demo.Utilities;
|
|
||||||
|
|
||||||
public static class SettingsDumper
|
|
||||||
{
|
|
||||||
public static void Dump(CommandSettings settings)
|
|
||||||
{
|
|
||||||
var table = new Table().RoundedBorder();
|
|
||||||
table.AddColumn("[grey]Name[/]");
|
|
||||||
table.AddColumn("[grey]Value[/]");
|
|
||||||
|
|
||||||
var properties = settings.GetType().GetProperties();
|
|
||||||
foreach (var property in properties)
|
|
||||||
{
|
|
||||||
var value = property.GetValue(settings)
|
|
||||||
?.ToString()
|
|
||||||
?.Replace("[", "[[");
|
|
||||||
|
|
||||||
table.AddRow(
|
|
||||||
property.Name,
|
|
||||||
value ?? "[grey]null[/]");
|
|
||||||
}
|
|
||||||
|
|
||||||
AnsiConsole.Write(table);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Globalization;
|
|
||||||
|
|
||||||
namespace Demo;
|
|
||||||
|
|
||||||
public enum Verbosity
|
|
||||||
{
|
|
||||||
Quiet,
|
|
||||||
Minimal,
|
|
||||||
Normal,
|
|
||||||
Detailed,
|
|
||||||
Diagnostic
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class VerbosityConverter : TypeConverter
|
|
||||||
{
|
|
||||||
private readonly Dictionary<string, Verbosity> _lookup;
|
|
||||||
|
|
||||||
public VerbosityConverter()
|
|
||||||
{
|
|
||||||
_lookup = new Dictionary<string, Verbosity>(StringComparer.OrdinalIgnoreCase)
|
|
||||||
{
|
|
||||||
{ "q", Verbosity.Quiet },
|
|
||||||
{ "quiet", Verbosity.Quiet },
|
|
||||||
{ "m", Verbosity.Minimal },
|
|
||||||
{ "minimal", Verbosity.Minimal },
|
|
||||||
{ "n", Verbosity.Normal },
|
|
||||||
{ "normal", Verbosity.Normal },
|
|
||||||
{ "d", Verbosity.Detailed },
|
|
||||||
{ "detailed", Verbosity.Detailed },
|
|
||||||
{ "diag", Verbosity.Diagnostic },
|
|
||||||
{ "diagnostic", Verbosity.Diagnostic }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
|
||||||
{
|
|
||||||
if (value is string stringValue)
|
|
||||||
{
|
|
||||||
var result = _lookup.TryGetValue(stringValue, out var verbosity);
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
const string format = "The value '{0}' is not a valid verbosity.";
|
|
||||||
var message = string.Format(CultureInfo.InvariantCulture, format, value);
|
|
||||||
throw new InvalidOperationException(message);
|
|
||||||
}
|
|
||||||
return verbosity;
|
|
||||||
}
|
|
||||||
throw new NotSupportedException("Can't convert value to verbosity.");
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
<ExampleName>Dynamic</ExampleName>
|
|
||||||
<ExampleDescription>Demonstrates how to define dynamic commands.</ExampleDescription>
|
|
||||||
<ExampleGroup>Cli</ExampleGroup>
|
|
||||||
<ExampleVisible>false</ExampleVisible>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,20 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Spectre.Console;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Dynamic;
|
|
||||||
|
|
||||||
public sealed class MyCommand : Command
|
|
||||||
{
|
|
||||||
public override int Execute(CommandContext context)
|
|
||||||
{
|
|
||||||
if (!(context.Data is int data))
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException("Command has no associated data.");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
AnsiConsole.WriteLine("Value = {0}", data);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
using System.Linq;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Dynamic;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static int Main(string[] args)
|
|
||||||
{
|
|
||||||
var app = new CommandApp();
|
|
||||||
app.Configure(config =>
|
|
||||||
{
|
|
||||||
foreach (var index in Enumerable.Range(1, 10))
|
|
||||||
{
|
|
||||||
config.AddCommand<MyCommand>($"c{index}")
|
|
||||||
.WithDescription($"Prints the number {index}")
|
|
||||||
.WithData(index);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return app.Run(args);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
using System.Linq;
|
|
||||||
using Spectre.Console;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
using Spectre.Console.Cli.Help;
|
|
||||||
using Spectre.Console.Rendering;
|
|
||||||
|
|
||||||
namespace Help;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Example showing how to extend the built-in Spectre.Console help provider
|
|
||||||
/// by rendering a custom banner at the top of the help information
|
|
||||||
/// </summary>
|
|
||||||
internal class CustomHelpProvider : HelpProvider
|
|
||||||
{
|
|
||||||
public CustomHelpProvider(ICommandAppSettings settings)
|
|
||||||
: base(settings)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override IEnumerable<IRenderable> GetHeader(ICommandModel model, ICommandInfo? command)
|
|
||||||
{
|
|
||||||
return new[]
|
|
||||||
{
|
|
||||||
new Text("--------------------------------------"), Text.NewLine,
|
|
||||||
new Text("--- CUSTOM HELP PROVIDER ---"), Text.NewLine,
|
|
||||||
new Text("--------------------------------------"), Text.NewLine,
|
|
||||||
Text.NewLine,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Help;
|
|
||||||
|
|
||||||
public sealed class DefaultCommand : Command
|
|
||||||
{
|
|
||||||
private IAnsiConsole _console;
|
|
||||||
|
|
||||||
public DefaultCommand(IAnsiConsole console)
|
|
||||||
{
|
|
||||||
_console = console;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int Execute(CommandContext context)
|
|
||||||
{
|
|
||||||
_console.WriteLine("Hello world");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<ExampleName>Help</ExampleName>
|
|
||||||
<ExampleDescription>Demonstrates how to extend the built-in Spectre.Console help provider to render a custom banner at the top of the help information.</ExampleDescription>
|
|
||||||
<ExampleGroup>Cli</ExampleGroup>
|
|
||||||
<ExampleVisible>false</ExampleVisible>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,23 +0,0 @@
|
|||||||
using Spectre.Console.Cli;
|
|
||||||
using Spectre.Console.Cli.Help;
|
|
||||||
|
|
||||||
namespace Help;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static int Main(string[] args)
|
|
||||||
{
|
|
||||||
var app = new CommandApp<DefaultCommand>();
|
|
||||||
|
|
||||||
app.Configure(config =>
|
|
||||||
{
|
|
||||||
// Register the custom help provider
|
|
||||||
config.SetHelpProvider(new CustomHelpProvider(config.Settings));
|
|
||||||
|
|
||||||
// Render an unstyled help text for maximum accessibility
|
|
||||||
config.Settings.HelpProviderStyles = null;
|
|
||||||
});
|
|
||||||
|
|
||||||
return app.Run(args);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Injection.Commands;
|
|
||||||
|
|
||||||
public sealed class DefaultCommand : Command<DefaultCommand.Settings>
|
|
||||||
{
|
|
||||||
private readonly IGreeter _greeter;
|
|
||||||
|
|
||||||
public sealed class Settings : CommandSettings
|
|
||||||
{
|
|
||||||
[CommandOption("-n|--name <NAME>")]
|
|
||||||
[Description("The person or thing to greet.")]
|
|
||||||
[DefaultValue("World")]
|
|
||||||
public string Name { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public DefaultCommand(IGreeter greeter)
|
|
||||||
{
|
|
||||||
_greeter = greeter ?? throw new ArgumentNullException(nameof(greeter));
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int Execute(CommandContext context, Settings settings)
|
|
||||||
{
|
|
||||||
_greeter.Greet(settings.Name);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace Injection;
|
|
||||||
|
|
||||||
public interface IGreeter
|
|
||||||
{
|
|
||||||
void Greet(string name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class HelloWorldGreeter : IGreeter
|
|
||||||
{
|
|
||||||
public void Greet(string name)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine($"Hello {name}!");
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Injection.Infrastructure;
|
|
||||||
|
|
||||||
public sealed class TypeRegistrar : ITypeRegistrar
|
|
||||||
{
|
|
||||||
private readonly IServiceCollection _builder;
|
|
||||||
|
|
||||||
public TypeRegistrar(IServiceCollection builder)
|
|
||||||
{
|
|
||||||
_builder = builder;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ITypeResolver Build()
|
|
||||||
{
|
|
||||||
return new TypeResolver(_builder.BuildServiceProvider());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Register(Type service, Type implementation)
|
|
||||||
{
|
|
||||||
_builder.AddSingleton(service, implementation);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RegisterInstance(Type service, object implementation)
|
|
||||||
{
|
|
||||||
_builder.AddSingleton(service, implementation);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RegisterLazy(Type service, Func<object> func)
|
|
||||||
{
|
|
||||||
if (func is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(func));
|
|
||||||
}
|
|
||||||
|
|
||||||
_builder.AddSingleton(service, (provider) => func());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Injection.Infrastructure;
|
|
||||||
|
|
||||||
public sealed class TypeResolver : ITypeResolver, IDisposable
|
|
||||||
{
|
|
||||||
private readonly IServiceProvider _provider;
|
|
||||||
|
|
||||||
public TypeResolver(IServiceProvider provider)
|
|
||||||
{
|
|
||||||
_provider = provider ?? throw new ArgumentNullException(nameof(provider));
|
|
||||||
}
|
|
||||||
|
|
||||||
public object Resolve(Type type)
|
|
||||||
{
|
|
||||||
if (type == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _provider.GetService(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
if (_provider is IDisposable disposable)
|
|
||||||
{
|
|
||||||
disposable.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
<ExampleName>Injection</ExampleName>
|
|
||||||
<ExampleDescription>Demonstrates how to use dependency injection with Spectre.Cli.</ExampleDescription>
|
|
||||||
<ExampleGroup>Cli</ExampleGroup>
|
|
||||||
<ExampleVisible>false</ExampleVisible>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,23 +0,0 @@
|
|||||||
using Injection.Commands;
|
|
||||||
using Injection.Infrastructure;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Injection;
|
|
||||||
|
|
||||||
public class Program
|
|
||||||
{
|
|
||||||
public static int Main(string[] args)
|
|
||||||
{
|
|
||||||
// Create a type registrar and register any dependencies.
|
|
||||||
// A type registrar is an adapter for a DI framework.
|
|
||||||
var registrations = new ServiceCollection();
|
|
||||||
registrations.AddSingleton<IGreeter, HelloWorldGreeter>();
|
|
||||||
var registrar = new TypeRegistrar(registrations);
|
|
||||||
|
|
||||||
// Create a new command app with the registrar
|
|
||||||
// and run it with the provided arguments.
|
|
||||||
var app = new CommandApp<DefaultCommand>(registrar);
|
|
||||||
return app.Run(args);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Spectre.Console;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Logging.Commands;
|
|
||||||
|
|
||||||
public class HelloCommand : Command<HelloCommand.Settings>
|
|
||||||
{
|
|
||||||
private ILogger<HelloCommand> _logger;
|
|
||||||
private IAnsiConsole _console;
|
|
||||||
|
|
||||||
public HelloCommand(IAnsiConsole console, ILogger<HelloCommand> logger)
|
|
||||||
{
|
|
||||||
_console = console;
|
|
||||||
_logger = logger;
|
|
||||||
_logger.LogDebug("{0} initialized", nameof(HelloCommand));
|
|
||||||
}
|
|
||||||
|
|
||||||
public class Settings : LogCommandSettings
|
|
||||||
{
|
|
||||||
[CommandArgument(0, "[Name]")]
|
|
||||||
public string Name { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public override int Execute(CommandContext context, Settings settings)
|
|
||||||
{
|
|
||||||
_logger.LogInformation("Starting my command");
|
|
||||||
AnsiConsole.MarkupLine($"Hello, [blue]{settings.Name}[/]");
|
|
||||||
_logger.LogInformation("Completed my command");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Globalization;
|
|
||||||
using Serilog.Events;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Logging.Commands;
|
|
||||||
|
|
||||||
public class LogCommandSettings : CommandSettings
|
|
||||||
{
|
|
||||||
[CommandOption("--logFile")]
|
|
||||||
[Description("Path and file name for logging")]
|
|
||||||
public string LogFile { get; set; }
|
|
||||||
|
|
||||||
[CommandOption("--logLevel")]
|
|
||||||
[Description("Minimum level for logging")]
|
|
||||||
[TypeConverter(typeof(VerbosityConverter))]
|
|
||||||
[DefaultValue(LogEventLevel.Information)]
|
|
||||||
public LogEventLevel LogLevel { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class VerbosityConverter : TypeConverter
|
|
||||||
{
|
|
||||||
private readonly Dictionary<string, LogEventLevel> _lookup;
|
|
||||||
|
|
||||||
public VerbosityConverter()
|
|
||||||
{
|
|
||||||
_lookup = new Dictionary<string, LogEventLevel>(StringComparer.OrdinalIgnoreCase)
|
|
||||||
{
|
|
||||||
{"d", LogEventLevel.Debug},
|
|
||||||
{"v", LogEventLevel.Verbose},
|
|
||||||
{"i", LogEventLevel.Information},
|
|
||||||
{"w", LogEventLevel.Warning},
|
|
||||||
{"e", LogEventLevel.Error},
|
|
||||||
{"f", LogEventLevel.Fatal}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
|
||||||
{
|
|
||||||
if (value is string stringValue)
|
|
||||||
{
|
|
||||||
var result = _lookup.TryGetValue(stringValue, out var verbosity);
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
const string format = "The value '{0}' is not a valid verbosity.";
|
|
||||||
var message = string.Format(CultureInfo.InvariantCulture, format, value);
|
|
||||||
throw new InvalidOperationException(message);
|
|
||||||
}
|
|
||||||
return verbosity;
|
|
||||||
}
|
|
||||||
throw new NotSupportedException("Can't convert value to verbosity.");
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
using Logging.Commands;
|
|
||||||
using Serilog.Core;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Logging.Infrastructure;
|
|
||||||
|
|
||||||
public class LogInterceptor : ICommandInterceptor
|
|
||||||
{
|
|
||||||
public static readonly LoggingLevelSwitch LogLevel = new();
|
|
||||||
|
|
||||||
public void Intercept(CommandContext context, CommandSettings settings)
|
|
||||||
{
|
|
||||||
if (settings is LogCommandSettings logSettings)
|
|
||||||
{
|
|
||||||
LoggingEnricher.Path = logSettings.LogFile ?? "application.log";
|
|
||||||
LogLevel.MinimumLevel = logSettings.LogLevel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
using Serilog.Core;
|
|
||||||
using Serilog.Events;
|
|
||||||
|
|
||||||
namespace Logging.Infrastructure;
|
|
||||||
|
|
||||||
internal class LoggingEnricher : ILogEventEnricher
|
|
||||||
{
|
|
||||||
private string _cachedLogFilePath;
|
|
||||||
private LogEventProperty _cachedLogFilePathProperty;
|
|
||||||
|
|
||||||
// this path and level will be set by the LogInterceptor.cs after parsing the settings
|
|
||||||
public static string Path = string.Empty;
|
|
||||||
|
|
||||||
public const string LogFilePathPropertyName = "LogFilePath";
|
|
||||||
|
|
||||||
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
|
|
||||||
{
|
|
||||||
// the settings might not have a path or we might not be within a command in which case
|
|
||||||
// we won't have the setting so a default value for the log file will be required
|
|
||||||
LogEventProperty logFilePathProperty;
|
|
||||||
|
|
||||||
if (_cachedLogFilePathProperty != null && Path.Equals(_cachedLogFilePath))
|
|
||||||
{
|
|
||||||
// Path hasn't changed, so let's use the cached property
|
|
||||||
logFilePathProperty = _cachedLogFilePathProperty;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// We've got a new path for the log. Let's create a new property
|
|
||||||
// and cache it for future log events to use
|
|
||||||
_cachedLogFilePath = Path;
|
|
||||||
_cachedLogFilePathProperty = logFilePathProperty = propertyFactory.CreateProperty(LogFilePathPropertyName, Path);
|
|
||||||
}
|
|
||||||
|
|
||||||
logEvent.AddPropertyIfAbsent(logFilePathProperty);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Logging.Infrastructure;
|
|
||||||
|
|
||||||
public sealed class TypeRegistrar : ITypeRegistrar
|
|
||||||
{
|
|
||||||
private readonly IServiceCollection _builder;
|
|
||||||
|
|
||||||
public TypeRegistrar(IServiceCollection builder)
|
|
||||||
{
|
|
||||||
_builder = builder;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ITypeResolver Build()
|
|
||||||
{
|
|
||||||
return new TypeResolver(_builder.BuildServiceProvider());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Register(Type service, Type implementation)
|
|
||||||
{
|
|
||||||
_builder.AddSingleton(service, implementation);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RegisterInstance(Type service, object implementation)
|
|
||||||
{
|
|
||||||
_builder.AddSingleton(service, implementation);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RegisterLazy(Type service, Func<object> func)
|
|
||||||
{
|
|
||||||
if (func is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(func));
|
|
||||||
}
|
|
||||||
|
|
||||||
_builder.AddSingleton(service, _ => func());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
namespace Logging.Infrastructure;
|
|
||||||
|
|
||||||
public sealed class TypeResolver : ITypeResolver
|
|
||||||
{
|
|
||||||
private readonly IServiceProvider _provider;
|
|
||||||
|
|
||||||
public TypeResolver(IServiceProvider provider)
|
|
||||||
{
|
|
||||||
_provider = provider ?? throw new ArgumentNullException(nameof(provider));
|
|
||||||
}
|
|
||||||
|
|
||||||
public object Resolve(Type type)
|
|
||||||
{
|
|
||||||
if (type == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _provider.GetService(type);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
<ExampleName>Logging</ExampleName>
|
|
||||||
<ExampleDescription>Demonstrates how to dynamically configure Serilog for logging using parameters from a command.</ExampleDescription>
|
|
||||||
<ExampleGroup>Cli</ExampleGroup>
|
|
||||||
<ExampleVisible>false</ExampleVisible>
|
|
||||||
<Nullable>disable</Nullable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
|
|
||||||
<PackageReference Include="Serilog" Version="3.1.1" />
|
|
||||||
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
|
|
||||||
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
|
|
||||||
<PackageReference Include="Serilog.Sinks.Map" Version="1.0.2" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,54 +0,0 @@
|
|||||||
using Logging.Commands;
|
|
||||||
using Logging.Infrastructure;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Serilog;
|
|
||||||
using Spectre.Console.Cli;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Dynamically control serilog configuration via command line parameters
|
|
||||||
*
|
|
||||||
* This works around the chicken and egg situation with configuring serilog via the command line.
|
|
||||||
* The logger needs to be configured prior to executing the parser, but the logger needs the parsed values
|
|
||||||
* to be configured. By using serilog.sinks.map we can defer configuration. We use a LogLevelSwitch to control the
|
|
||||||
* logging levels dynamically, and then we use a serilog enricher that has its state populated via a
|
|
||||||
* Spectre.Console CommandInterceptor
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Logging;
|
|
||||||
|
|
||||||
public class Program
|
|
||||||
{
|
|
||||||
static int Main(string[] args)
|
|
||||||
{
|
|
||||||
// to retrieve the log file name, we must first parse the command settings
|
|
||||||
// this will require us to delay setting the file path for the file writer.
|
|
||||||
// With serilog we can use an enricher and Serilog.Sinks.Map to dynamically
|
|
||||||
// pull this setting.
|
|
||||||
var serviceCollection = new ServiceCollection()
|
|
||||||
.AddLogging(configure =>
|
|
||||||
configure.AddSerilog(new LoggerConfiguration()
|
|
||||||
// log level will be dynamically be controlled by our log interceptor upon running
|
|
||||||
.MinimumLevel.ControlledBy(LogInterceptor.LogLevel)
|
|
||||||
// the log enricher will add a new property with the log file path from the settings
|
|
||||||
// that we can use to set the path dynamically
|
|
||||||
.Enrich.With<LoggingEnricher>()
|
|
||||||
// serilog.sinks.map will defer the configuration of the sink to be ondemand
|
|
||||||
// allowing us to look at the properties set by the enricher to set the path appropriately
|
|
||||||
.WriteTo.Map(LoggingEnricher.LogFilePathPropertyName,
|
|
||||||
(logFilePath, wt) => wt.File($"{logFilePath}"), 1)
|
|
||||||
.CreateLogger()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
var registrar = new TypeRegistrar(serviceCollection);
|
|
||||||
var app = new CommandApp(registrar);
|
|
||||||
|
|
||||||
app.Configure(config =>
|
|
||||||
{
|
|
||||||
config.SetInterceptor(new LogInterceptor()); // add the interceptor
|
|
||||||
config.AddCommand<HelloCommand>("hello");
|
|
||||||
});
|
|
||||||
|
|
||||||
return app.Run(args);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Screens</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to use alternate screens.</ExampleDescription>
|
|
||||||
<ExampleGroup>Widgets</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,26 +0,0 @@
|
|||||||
// Check if we can use alternate screen buffers
|
|
||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
if (!AnsiConsole.Profile.Capabilities.AlternateBuffer)
|
|
||||||
{
|
|
||||||
AnsiConsole.MarkupLine(
|
|
||||||
"[red]Alternate screen buffers are not supported " +
|
|
||||||
"by your terminal[/] [yellow]:([/]");
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write to the terminal
|
|
||||||
AnsiConsole.Write(new Rule("[yellow]Normal universe[/]"));
|
|
||||||
AnsiConsole.Write(new Panel("Hello World!"));
|
|
||||||
AnsiConsole.MarkupLine("[grey]Press a key to continue[/]");
|
|
||||||
AnsiConsole.Console.Input.ReadKey(true);
|
|
||||||
|
|
||||||
AnsiConsole.AlternateScreen(() =>
|
|
||||||
{
|
|
||||||
// Now we're in another terminal screen buffer
|
|
||||||
AnsiConsole.Write(new Rule("[red]Mirror universe[/]"));
|
|
||||||
AnsiConsole.Write(new Panel("[red]Welcome to the upside down![/]"));
|
|
||||||
AnsiConsole.MarkupLine("[grey]Press a key to return[/]");
|
|
||||||
AnsiConsole.Console.Input.ReadKey(true);
|
|
||||||
});
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Borders</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates the different kind of borders.</ExampleDescription>
|
|
||||||
<ExampleGroup>Widgets</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,86 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
using Spectre.Console.Rendering;
|
|
||||||
|
|
||||||
namespace Borders;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main()
|
|
||||||
{
|
|
||||||
// Render panel borders
|
|
||||||
HorizontalRule("PANEL BORDERS");
|
|
||||||
PanelBorders();
|
|
||||||
|
|
||||||
// Render table borders
|
|
||||||
HorizontalRule("TABLE BORDERS");
|
|
||||||
TableBorders();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void PanelBorders()
|
|
||||||
{
|
|
||||||
static IRenderable CreatePanel(string name, BoxBorder border)
|
|
||||||
{
|
|
||||||
return
|
|
||||||
new Panel($"This is a panel with\nthe [yellow]{name}[/] border.")
|
|
||||||
.Header($" [blue]{name}[/] ", Justify.Center)
|
|
||||||
.Border(border)
|
|
||||||
.BorderStyle(Style.Parse("grey"));
|
|
||||||
}
|
|
||||||
|
|
||||||
var items = new[]
|
|
||||||
{
|
|
||||||
CreatePanel("Ascii", BoxBorder.Ascii),
|
|
||||||
CreatePanel("Square", BoxBorder.Square),
|
|
||||||
CreatePanel("Rounded", BoxBorder.Rounded),
|
|
||||||
CreatePanel("Heavy", BoxBorder.Heavy),
|
|
||||||
CreatePanel("Double", BoxBorder.Double),
|
|
||||||
CreatePanel("None", BoxBorder.None),
|
|
||||||
};
|
|
||||||
|
|
||||||
AnsiConsole.Write(
|
|
||||||
new Padder(
|
|
||||||
new Columns(items).PadRight(2),
|
|
||||||
new Padding(2, 0, 0, 0)));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void TableBorders()
|
|
||||||
{
|
|
||||||
static IRenderable CreateTable(string name, TableBorder border)
|
|
||||||
{
|
|
||||||
var table = new Table().Border(border);
|
|
||||||
table.ShowRowSeparators();
|
|
||||||
table.AddColumn("[yellow]Header 1[/]", c => c.Footer("[grey]Footer 1[/]"));
|
|
||||||
table.AddColumn("[yellow]Header 2[/]", col => col.Footer("[grey]Footer 2[/]").RightAligned());
|
|
||||||
table.AddRow("Cell", "Cell");
|
|
||||||
table.AddRow("Cell", "Cell");
|
|
||||||
|
|
||||||
return new Panel(table)
|
|
||||||
.Header($" [blue]{name}[/] ", Justify.Center)
|
|
||||||
.PadBottom(1)
|
|
||||||
.NoBorder();
|
|
||||||
}
|
|
||||||
|
|
||||||
var items = new[]
|
|
||||||
{
|
|
||||||
CreateTable("Ascii", TableBorder.Ascii), CreateTable("Ascii2", TableBorder.Ascii2),
|
|
||||||
CreateTable("AsciiDoubleHead", TableBorder.AsciiDoubleHead),
|
|
||||||
CreateTable("Horizontal", TableBorder.Horizontal), CreateTable("Simple", TableBorder.Simple),
|
|
||||||
CreateTable("SimpleHeavy", TableBorder.SimpleHeavy), CreateTable("Minimal", TableBorder.Minimal),
|
|
||||||
CreateTable("MinimalHeavyHead", TableBorder.MinimalHeavyHead),
|
|
||||||
CreateTable("MinimalDoubleHead", TableBorder.MinimalDoubleHead),
|
|
||||||
CreateTable("Square", TableBorder.Square), CreateTable("Rounded", TableBorder.Rounded),
|
|
||||||
CreateTable("Heavy", TableBorder.Heavy), CreateTable("HeavyEdge", TableBorder.HeavyEdge),
|
|
||||||
CreateTable("HeavyHead", TableBorder.HeavyHead), CreateTable("Double", TableBorder.Double),
|
|
||||||
CreateTable("DoubleEdge", TableBorder.DoubleEdge), CreateTable("Markdown", TableBorder.Markdown),
|
|
||||||
};
|
|
||||||
|
|
||||||
AnsiConsole.Write(new Columns(items).Collapse());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void HorizontalRule(string title)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.Write(new Rule($"[white bold]{title}[/]").RuleStyle("grey").LeftJustified());
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Calendars</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to render calendars.</ExampleDescription>
|
|
||||||
<ExampleGroup>Widgets</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,18 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace Calendars;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main(string[] args)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.Write(new Calendar(2020, 10)
|
|
||||||
.RoundedBorder()
|
|
||||||
.HighlightStyle(Style.Parse("red"))
|
|
||||||
.HeaderStyle(Style.Parse("yellow"))
|
|
||||||
.AddCalendarEvent("An event", 2020, 9, 22)
|
|
||||||
.AddCalendarEvent("Another event", 2020, 10, 2)
|
|
||||||
.AddCalendarEvent("A third event", 2020, 10, 13));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Canvas</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to render pixels and images.</ExampleDescription>
|
|
||||||
<ExampleGroup>Widgets</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
<ProjectReference Include="..\..\..\src\Spectre.Console.ImageSharp\Spectre.Console.ImageSharp.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<EmbeddedResource Include="cake.png">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</EmbeddedResource>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,43 +0,0 @@
|
|||||||
using System.Diagnostics;
|
|
||||||
using System.Reflection;
|
|
||||||
using SixLabors.ImageSharp.Processing;
|
|
||||||
using Spectre.Console;
|
|
||||||
using Spectre.Console.Rendering;
|
|
||||||
|
|
||||||
namespace Canvas;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main()
|
|
||||||
{
|
|
||||||
// Draw an image using CanvasImage powered by ImageSharp.
|
|
||||||
// This requires the "Spectre.Console.ImageSharp" NuGet package.
|
|
||||||
var image = new CanvasImage("cake.png");
|
|
||||||
image.BilinearResampler();
|
|
||||||
image.MaxWidth(16);
|
|
||||||
Render(image, "Image from file (16 wide)");
|
|
||||||
|
|
||||||
// Draw image again, but without max width
|
|
||||||
image.NoMaxWidth();
|
|
||||||
image.Mutate(ctx => ctx.Grayscale().Rotate(-45).EntropyCrop());
|
|
||||||
Render(image, "Image from file (fit, greyscale, rotated)");
|
|
||||||
|
|
||||||
// Draw image again, but load from embedded resource rather than file
|
|
||||||
using (var fileStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Canvas.cake.png"))
|
|
||||||
{
|
|
||||||
Debug.Assert(fileStream != null);
|
|
||||||
var embeddedImage = new CanvasImage(fileStream);
|
|
||||||
embeddedImage.BilinearResampler();
|
|
||||||
embeddedImage.MaxWidth(16);
|
|
||||||
Render(embeddedImage, "Image from embedded resource (16 wide)");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void Render(IRenderable canvas, string title)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.Write(new Rule($"[yellow]{title}[/]").LeftJustified().RuleStyle("grey"));
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.Write(canvas);
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Before Width: | Height: | Size: 52 KiB |
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Charts</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to render charts in a console.</ExampleDescription>
|
|
||||||
<ExampleGroup>Widgets</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,42 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
using Spectre.Console.Rendering;
|
|
||||||
|
|
||||||
namespace Charts;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main()
|
|
||||||
{
|
|
||||||
// Render a bar chart
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
Render("Fruits per month", new BarChart()
|
|
||||||
.Width(60)
|
|
||||||
.Label("[green bold underline]Number of fruits[/]")
|
|
||||||
.CenterLabel()
|
|
||||||
.AddItem("Apple", 12, Color.Yellow)
|
|
||||||
.AddItem("Orange", 54, Color.Green)
|
|
||||||
.AddItem("Banana", 33, Color.Red));
|
|
||||||
|
|
||||||
// Render a breakdown chart
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
Render("Languages used", new BreakdownChart()
|
|
||||||
.FullSize()
|
|
||||||
.Width(60)
|
|
||||||
.ShowPercentage()
|
|
||||||
.WithValueColor(Color.Orange1)
|
|
||||||
.AddItem("SCSS", 37, Color.Red)
|
|
||||||
.AddItem("HTML", 28.3, Color.Blue)
|
|
||||||
.AddItem("C#", 22.6, Color.Green)
|
|
||||||
.AddItem("JavaScript", 6, Color.Yellow)
|
|
||||||
.AddItem("Ruby", 6, Color.LightGreen)
|
|
||||||
.AddItem("Shell", 0.1, Color.Aqua));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void Render(string title, IRenderable chart)
|
|
||||||
{
|
|
||||||
AnsiConsole.Write(
|
|
||||||
new Panel(chart)
|
|
||||||
.Padding(1, 1)
|
|
||||||
.Header(title));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Colors</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to use [yellow]c[/][red]o[/][green]l[/][blue]o[/][aqua]r[/][lime]s[/] in the console.</ExampleDescription>
|
|
||||||
<ExampleGroup>Misc</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,105 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
using Spectre.Console.Examples;
|
|
||||||
|
|
||||||
namespace Colors;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main()
|
|
||||||
{
|
|
||||||
/////////////////////////////////////////////////////////////////
|
|
||||||
// No colors
|
|
||||||
/////////////////////////////////////////////////////////////////
|
|
||||||
if (AnsiConsole.Profile.Capabilities.ColorSystem == ColorSystem.NoColors)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine("No colors are supported.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////
|
|
||||||
// 3-BIT
|
|
||||||
/////////////////////////////////////////////////////////////////
|
|
||||||
if (AnsiConsole.Profile.Supports(ColorSystem.Legacy))
|
|
||||||
{
|
|
||||||
AnsiConsole.ResetColors();
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.Write(new Rule("[yellow bold underline]3-bit Colors[/]").RuleStyle("grey").LeftJustified());
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
|
|
||||||
for (var i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
AnsiConsole.Background = Color.FromInt32(i);
|
|
||||||
AnsiConsole.Foreground = AnsiConsole.Background.GetInvertedColor();
|
|
||||||
AnsiConsole.Write(string.Format(" {0,-9}", AnsiConsole.Background.ToString()));
|
|
||||||
AnsiConsole.ResetColors();
|
|
||||||
if ((i + 1) % 8 == 0)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////
|
|
||||||
// 4-BIT
|
|
||||||
/////////////////////////////////////////////////////////////////
|
|
||||||
if (AnsiConsole.Profile.Supports(ColorSystem.Standard))
|
|
||||||
{
|
|
||||||
AnsiConsole.ResetColors();
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.Write(new Rule("[yellow bold underline]4-bit Colors[/]").RuleStyle("grey").LeftJustified());
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
|
|
||||||
for (var i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
AnsiConsole.Background = Color.FromInt32(i);
|
|
||||||
AnsiConsole.Foreground = AnsiConsole.Background.GetInvertedColor();
|
|
||||||
AnsiConsole.Write(string.Format(" {0,-9}", AnsiConsole.Background.ToString()));
|
|
||||||
AnsiConsole.ResetColors();
|
|
||||||
if ((i + 1) % 8 == 0)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////
|
|
||||||
// 8-BIT
|
|
||||||
/////////////////////////////////////////////////////////////////
|
|
||||||
if (AnsiConsole.Profile.Supports(ColorSystem.EightBit))
|
|
||||||
{
|
|
||||||
AnsiConsole.ResetColors();
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.Write(new Rule("[yellow bold underline]8-bit Colors[/]").RuleStyle("grey").LeftJustified());
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
|
|
||||||
for (var i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
for (var j = 0; j < 16; j++)
|
|
||||||
{
|
|
||||||
var number = i * 16 + j;
|
|
||||||
AnsiConsole.Background = Color.FromInt32(number);
|
|
||||||
AnsiConsole.Foreground = AnsiConsole.Background.GetInvertedColor();
|
|
||||||
AnsiConsole.Write(string.Format(" {0,-4}", number));
|
|
||||||
AnsiConsole.ResetColors();
|
|
||||||
if ((number + 1) % 16 == 0)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////
|
|
||||||
// 24-BIT
|
|
||||||
/////////////////////////////////////////////////////////////////
|
|
||||||
if (AnsiConsole.Profile.Supports(ColorSystem.TrueColor))
|
|
||||||
{
|
|
||||||
AnsiConsole.ResetColors();
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.Write(new Rule("[yellow bold underline]24-bit Colors[/]").RuleStyle("grey").LeftJustified());
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
|
|
||||||
AnsiConsole.Write(new ColorBox(width: 80, height: 15));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Columns</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to render data into columns.</ExampleDescription>
|
|
||||||
<ExampleGroup>Widgets</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,30 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace Columns;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main()
|
|
||||||
{
|
|
||||||
var cards = new List<Panel>();
|
|
||||||
foreach (var user in User.LoadUsers())
|
|
||||||
{
|
|
||||||
cards.Add(
|
|
||||||
new Panel(GetCardContent(user))
|
|
||||||
.Header($"{user.Country}")
|
|
||||||
.RoundedBorder().Expand());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Render all cards in columns
|
|
||||||
AnsiConsole.Write(new Spectre.Console.Columns(cards));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string GetCardContent(User user)
|
|
||||||
{
|
|
||||||
var name = $"{user.FirstName} {user.LastName}";
|
|
||||||
var city = $"{user.City}";
|
|
||||||
|
|
||||||
return $"[b]{name}[/]\n[yellow]{city}[/]";
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,88 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Columns;
|
|
||||||
|
|
||||||
public sealed class User
|
|
||||||
{
|
|
||||||
public string FirstName { get; set; }
|
|
||||||
public string LastName { get; set; }
|
|
||||||
public string City { get; set; }
|
|
||||||
public string Country { get; set; }
|
|
||||||
|
|
||||||
public static List<User> LoadUsers()
|
|
||||||
{
|
|
||||||
return new List<User>
|
|
||||||
{
|
|
||||||
new User
|
|
||||||
{
|
|
||||||
FirstName = "Andrea",
|
|
||||||
LastName = "Johansen",
|
|
||||||
City = "Hornbæk",
|
|
||||||
Country = "Denmark",
|
|
||||||
},
|
|
||||||
new User
|
|
||||||
{
|
|
||||||
FirstName = "Phil",
|
|
||||||
LastName = "Scott",
|
|
||||||
City = "Dayton",
|
|
||||||
Country = "United States",
|
|
||||||
},
|
|
||||||
new User
|
|
||||||
{
|
|
||||||
FirstName = "Patrik",
|
|
||||||
LastName = "Svensson",
|
|
||||||
City = "Stockholm",
|
|
||||||
Country = "Sweden",
|
|
||||||
},
|
|
||||||
new User
|
|
||||||
{
|
|
||||||
FirstName = "Freya",
|
|
||||||
LastName = "Thompson",
|
|
||||||
City = "Rotorua",
|
|
||||||
Country = "New Zealand",
|
|
||||||
},
|
|
||||||
new User
|
|
||||||
{
|
|
||||||
FirstName = "طاها",
|
|
||||||
LastName = "رضایی",
|
|
||||||
City = "اهواز",
|
|
||||||
Country = "Iran",
|
|
||||||
},
|
|
||||||
new User
|
|
||||||
{
|
|
||||||
FirstName = "Yara",
|
|
||||||
LastName = "Simon",
|
|
||||||
City = "Develier",
|
|
||||||
Country = "Switzerland",
|
|
||||||
},
|
|
||||||
new User
|
|
||||||
{
|
|
||||||
FirstName = "Giray",
|
|
||||||
LastName = "Erbay",
|
|
||||||
City = "Karabük",
|
|
||||||
Country = "Turkey",
|
|
||||||
},
|
|
||||||
new User
|
|
||||||
{
|
|
||||||
FirstName = "Miodrag",
|
|
||||||
LastName = "Schaffer",
|
|
||||||
City = "Möckern",
|
|
||||||
Country = "Germany",
|
|
||||||
},
|
|
||||||
new User
|
|
||||||
{
|
|
||||||
FirstName = "Carmela",
|
|
||||||
LastName = "Lo Castro",
|
|
||||||
City = "Firenze",
|
|
||||||
Country = "Italy",
|
|
||||||
},
|
|
||||||
new User
|
|
||||||
{
|
|
||||||
FirstName = "Roberto",
|
|
||||||
LastName = "Sims",
|
|
||||||
City = "Mallow",
|
|
||||||
Country = "Ireland",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Cursor</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to move the cursor.</ExampleDescription>
|
|
||||||
<ExampleGroup>Misc</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,19 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace Cursor;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main(string[] args)
|
|
||||||
{
|
|
||||||
AnsiConsole.Write("Hello");
|
|
||||||
|
|
||||||
// Move the cursor 3 cells to the right
|
|
||||||
AnsiConsole.Cursor.Move(CursorDirection.Right, 3);
|
|
||||||
AnsiConsole.Write("World");
|
|
||||||
|
|
||||||
// Move the cursor 5 cells to the left.
|
|
||||||
AnsiConsole.Cursor.Move(CursorDirection.Left, 5);
|
|
||||||
AnsiConsole.WriteLine("Universe");
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Decorations</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to [italic]use[/] [bold]decorations[/] [dim]in[/] the console.</ExampleDescription>
|
|
||||||
<ExampleGroup>Misc</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,29 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace Colors;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main()
|
|
||||||
{
|
|
||||||
AnsiConsole.ResetDecoration();
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
|
|
||||||
if (AnsiConsole.Profile.Capabilities.Ansi)
|
|
||||||
{
|
|
||||||
AnsiConsole.Write(new Rule("[bold green]ANSI Decorations[/]"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AnsiConsole.Write(new Rule("[bold red]Legacy Decorations (unsupported)[/]"));
|
|
||||||
}
|
|
||||||
|
|
||||||
var decorations = System.Enum.GetValues(typeof(Decoration));
|
|
||||||
foreach (var decoration in decorations)
|
|
||||||
{
|
|
||||||
var name = System.Enum.GetName(typeof(Decoration),decoration);
|
|
||||||
AnsiConsole.Write(name + ": ");
|
|
||||||
AnsiConsole.Write(new Markup(name+"\n", new Style(decoration: (Decoration)decoration)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Emojis</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to render emojis.</ExampleDescription>
|
|
||||||
<ExampleGroup>Misc</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,23 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace Emojis;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main(string[] args)
|
|
||||||
{
|
|
||||||
// Show a known emoji
|
|
||||||
RenderEmoji();
|
|
||||||
|
|
||||||
// Show a remapped emoji
|
|
||||||
Emoji.Remap("globe_showing_europe_africa", Emoji.Known.GrinningFaceWithSmilingEyes);
|
|
||||||
RenderEmoji();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void RenderEmoji()
|
|
||||||
{
|
|
||||||
AnsiConsole.Write(
|
|
||||||
new Panel("[yellow]Hello :globe_showing_europe_africa:![/]")
|
|
||||||
.RoundedBorder());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Exceptions</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to render formatted exceptions.</ExampleDescription>
|
|
||||||
<ExampleGroup>Misc</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,101 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Security.Authentication;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace Exceptions;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static async Task Main(string[] args)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var foo = new List<string>();
|
|
||||||
DoMagic(42, null, ref foo);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.Write(new Rule("Default").LeftJustified());
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.WriteException(ex);
|
|
||||||
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.Write(new Rule("Compact").LeftJustified());
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.WriteException(ex, ExceptionFormats.ShortenEverything | ExceptionFormats.ShowLinks);
|
|
||||||
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.Write(new Rule("Compact + Custom colors").LeftJustified());
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.WriteException(ex, new ExceptionSettings
|
|
||||||
{
|
|
||||||
Format = ExceptionFormats.ShortenEverything | ExceptionFormats.ShowLinks,
|
|
||||||
Style = new ExceptionStyle
|
|
||||||
{
|
|
||||||
Exception = new Style().Foreground(Color.Grey),
|
|
||||||
Message = new Style().Foreground(Color.White),
|
|
||||||
NonEmphasized = new Style().Foreground(Color.Cornsilk1),
|
|
||||||
Parenthesis = new Style().Foreground(Color.Cornsilk1),
|
|
||||||
Method = new Style().Foreground(Color.Red),
|
|
||||||
ParameterName = new Style().Foreground(Color.Cornsilk1),
|
|
||||||
ParameterType = new Style().Foreground(Color.Red),
|
|
||||||
Path = new Style().Foreground(Color.Red),
|
|
||||||
LineNumber = new Style().Foreground(Color.Cornsilk1),
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await DoMagicAsync<int>(42, null);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.Write(new Rule("Async").LeftJustified());
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.WriteException(ex, ExceptionFormats.ShortenPaths);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void DoMagic(int foo, string[,] bar, ref List<string> result)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
CheckCredentials(foo, bar);
|
|
||||||
result = new List<string>();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException("Whaaat?", ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool CheckCredentials(int? qux, string[,] corgi)
|
|
||||||
{
|
|
||||||
throw new InvalidCredentialException("The credentials are invalid.");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static async Task DoMagicAsync<T>(T foo, string[,] bar)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await CheckCredentialsAsync(new[] { foo }.ToList(), new []{ foo }, bar);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException("Whaaat?", ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static async Task<bool> CheckCredentialsAsync<T>(List<T> qux, T[] otherArray, string[,] corgi)
|
|
||||||
{
|
|
||||||
await Task.Delay(0);
|
|
||||||
throw new InvalidCredentialException("The credentials are invalid.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Figlet</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to render FIGlet text.</ExampleDescription>
|
|
||||||
<ExampleGroup>Widgets</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,13 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace Figlet;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main(string[] args)
|
|
||||||
{
|
|
||||||
AnsiConsole.Write(new FigletText("Left aligned").LeftJustified().Color(Color.Red));
|
|
||||||
AnsiConsole.Write(new FigletText("Centered").Centered().Color(Color.Green));
|
|
||||||
AnsiConsole.Write(new FigletText("Right aligned").RightJustified().Color(Color.Blue));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Grids</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to render grids in a console.</ExampleDescription>
|
|
||||||
<ExampleGroup>Widgets</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,23 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace Grids;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main()
|
|
||||||
{
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.MarkupLine("Usage: [grey]dotnet [blue]run[/] [[options]] [[[[--]] <additional arguments>...]]]][/]");
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
|
|
||||||
var grid = new Grid();
|
|
||||||
grid.AddColumn(new GridColumn().NoWrap());
|
|
||||||
grid.AddColumn(new GridColumn().PadLeft(2));
|
|
||||||
grid.AddRow("Options:");
|
|
||||||
grid.AddRow(" [blue]-h[/], [blue]--help[/]", "Show command line help.");
|
|
||||||
grid.AddRow(" [blue]-c[/], [blue]--configuration[/] <CONFIGURATION>", "The configuration to run for.");
|
|
||||||
grid.AddRow(" [blue]-v[/], [blue]--verbosity[/] <LEVEL>", "Set the [grey]MSBuild[/] verbosity level.");
|
|
||||||
|
|
||||||
AnsiConsole.Write(grid);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Info</ExampleTitle>
|
|
||||||
<ExampleDescription>Displays the capabilities of the current console.</ExampleDescription>
|
|
||||||
<ExampleGroup>Misc</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,33 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace Info;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main()
|
|
||||||
{
|
|
||||||
var grid = new Grid()
|
|
||||||
.AddColumn(new GridColumn().NoWrap().PadRight(4))
|
|
||||||
.AddColumn()
|
|
||||||
.AddRow("[b]Enrichers[/]", string.Join(", ", AnsiConsole.Profile.Enrichers))
|
|
||||||
.AddRow("[b]Color system[/]", $"{AnsiConsole.Profile.Capabilities.ColorSystem}")
|
|
||||||
.AddRow("[b]Unicode?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Unicode)}")
|
|
||||||
.AddRow("[b]Supports ansi?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Ansi)}")
|
|
||||||
.AddRow("[b]Supports links?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Links)}")
|
|
||||||
.AddRow("[b]Legacy console?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Legacy)}")
|
|
||||||
.AddRow("[b]Interactive?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Interactive)}")
|
|
||||||
.AddRow("[b]Terminal?[/]", $"{YesNo(AnsiConsole.Profile.Out.IsTerminal)}")
|
|
||||||
.AddRow("[b]Buffer width[/]", $"{AnsiConsole.Console.Profile.Width}")
|
|
||||||
.AddRow("[b]Buffer height[/]", $"{AnsiConsole.Console.Profile.Height}")
|
|
||||||
.AddRow("[b]Encoding[/]", $"{AnsiConsole.Console.Profile.Encoding.EncodingName}");
|
|
||||||
|
|
||||||
AnsiConsole.Write(
|
|
||||||
new Panel(grid)
|
|
||||||
.Header("Information"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string YesNo(bool value)
|
|
||||||
{
|
|
||||||
return value ? "Yes" : "No";
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Json</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to print syntax highlighted JSON.</ExampleDescription>
|
|
||||||
<ExampleGroup>Widgets</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\..\src\Spectre.Console.Json\Spectre.Console.Json.csproj" />
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,36 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
using Spectre.Console.Json;
|
|
||||||
|
|
||||||
namespace Json;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main()
|
|
||||||
{
|
|
||||||
var json = new JsonText(
|
|
||||||
"""
|
|
||||||
{
|
|
||||||
"hello": 32,
|
|
||||||
"world": {
|
|
||||||
"foo": 21,
|
|
||||||
"bar": 255,
|
|
||||||
"baz": [
|
|
||||||
0.32, 0.33e-32,
|
|
||||||
0.42e32, 0.55e+32,
|
|
||||||
{
|
|
||||||
"hello": "world",
|
|
||||||
"lol": null
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
""");
|
|
||||||
|
|
||||||
AnsiConsole.Write(
|
|
||||||
new Panel(json)
|
|
||||||
.Header("Some JSON in a panel")
|
|
||||||
.Collapse()
|
|
||||||
.RoundedBorder()
|
|
||||||
.BorderColor(Color.Yellow));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Layout</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to use layouts.</ExampleDescription>
|
|
||||||
<ExampleGroup>Widgets</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,60 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace Layouts;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main()
|
|
||||||
{
|
|
||||||
var layout = CreateLayout();
|
|
||||||
AnsiConsole.Write(layout);
|
|
||||||
|
|
||||||
Console.ReadKey(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Layout CreateLayout()
|
|
||||||
{
|
|
||||||
var layout = new Layout();
|
|
||||||
|
|
||||||
layout.SplitRows(
|
|
||||||
new Layout("Top")
|
|
||||||
.SplitColumns(
|
|
||||||
new Layout("Left")
|
|
||||||
.SplitRows(
|
|
||||||
new Layout("LeftTop"),
|
|
||||||
new Layout("LeftBottom")),
|
|
||||||
new Layout("Right").Ratio(2),
|
|
||||||
new Layout("RightRight").Size(3)),
|
|
||||||
new Layout("Bottom"));
|
|
||||||
|
|
||||||
layout["LeftBottom"].Update(
|
|
||||||
new Panel("[blink]PRESS ANY KEY TO QUIT[/]")
|
|
||||||
.Expand()
|
|
||||||
.BorderColor(Color.Yellow)
|
|
||||||
.Padding(0, 0));
|
|
||||||
|
|
||||||
layout["Right"].Update(
|
|
||||||
new Panel(
|
|
||||||
new Table()
|
|
||||||
.AddColumns("[blue]Qux[/]", "[green]Corgi[/]")
|
|
||||||
.AddRow("9", "8")
|
|
||||||
.AddRow("7", "6")
|
|
||||||
.Expand())
|
|
||||||
.Header("A [yellow]Table[/] in a [blue]Panel[/] (Ratio=2)")
|
|
||||||
.Expand());
|
|
||||||
|
|
||||||
layout["RightRight"].Update(
|
|
||||||
new Panel("Explicit-size-is-[yellow]3[/]")
|
|
||||||
.BorderColor(Color.Yellow)
|
|
||||||
.Padding(0, 0));
|
|
||||||
|
|
||||||
layout["Bottom"].Update(
|
|
||||||
new Panel(
|
|
||||||
new FigletText("Hello World"))
|
|
||||||
.Header("Some [green]Figlet[/] text")
|
|
||||||
.Expand());
|
|
||||||
|
|
||||||
return layout;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Links</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to render links in a console.</ExampleDescription>
|
|
||||||
<ExampleGroup>Misc</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,20 +0,0 @@
|
|||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace Links;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main()
|
|
||||||
{
|
|
||||||
if (AnsiConsole.Profile.Capabilities.Links)
|
|
||||||
{
|
|
||||||
AnsiConsole.MarkupLine("[link=https://patriksvensson.se]Click to visit my blog[/]!");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AnsiConsole.MarkupLine("[red]It looks like your terminal doesn't support links[/]");
|
|
||||||
AnsiConsole.WriteLine();
|
|
||||||
AnsiConsole.MarkupLine("[yellow](╯°□°)╯[/]︵ [blue]┻━┻[/]");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>Live</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to do live updates.</ExampleDescription>
|
|
||||||
<ExampleGroup>Live</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,81 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Threading;
|
|
||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace Live;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
public static void Main()
|
|
||||||
{
|
|
||||||
var table = new Table().Centered();
|
|
||||||
|
|
||||||
// Animate
|
|
||||||
AnsiConsole.Live(table)
|
|
||||||
.AutoClear(false)
|
|
||||||
.Overflow(VerticalOverflow.Ellipsis)
|
|
||||||
.Cropping(VerticalOverflowCropping.Top)
|
|
||||||
.Start(ctx =>
|
|
||||||
{
|
|
||||||
void Update(int delay, Action action)
|
|
||||||
{
|
|
||||||
action();
|
|
||||||
ctx.Refresh();
|
|
||||||
Thread.Sleep(delay);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Columns
|
|
||||||
Update(230, () => table.AddColumn("Release date"));
|
|
||||||
Update(230, () => table.AddColumn("Title"));
|
|
||||||
Update(230, () => table.AddColumn("Budget"));
|
|
||||||
Update(230, () => table.AddColumn("Opening Weekend"));
|
|
||||||
Update(230, () => table.AddColumn("Box office"));
|
|
||||||
|
|
||||||
// Rows
|
|
||||||
Update(70, () => table.AddRow("May 25, 1977", "[yellow]Star Wars[/] [grey]Ep.[/] [u]IV[/]", "$11,000,000", "$1,554,475", "$775,398,007"));
|
|
||||||
Update(70, () => table.AddRow("May 21, 1980", "[yellow]Star Wars[/] [grey]Ep.[/] [u]V[/]", "$18,000,000", "$4,910,483", "$547,969,004"));
|
|
||||||
Update(70, () => table.AddRow("May 25, 1983", "[yellow]Star Wars[/] [grey]Ep.[/] [u]VI[/]", "$32,500,000", "$23,019,618", "$475,106,177"));
|
|
||||||
Update(70, () => table.AddRow("May 19, 1999", "[yellow]Star Wars[/] [grey]Ep.[/] [u]I[/]", "$115,000,000", "$64,810,870", "$1,027,044,677"));
|
|
||||||
Update(70, () => table.AddRow("May 16, 2002", "[yellow]Star Wars[/] [grey]Ep.[/] [u]II[/]", "$115,000,000", "$80,027,814", "$649,436,358"));
|
|
||||||
Update(70, () => table.AddRow("May 19, 2005", "[yellow]Star Wars[/] [grey]Ep.[/] [u]III[/]", "$113,000,000", "$108,435,841", "$850,035,635"));
|
|
||||||
Update(70, () => table.AddRow("Dec 18, 2015", "[yellow]Star Wars[/] [grey]Ep.[/] [u]VII[/]", "$245,000,000", "$247,966,675", "$2,068,223,624"));
|
|
||||||
Update(70, () => table.AddRow("Dec 15, 2017", "[yellow]Star Wars[/] [grey]Ep.[/] [u]VIII[/]", "$317,000,000", "$220,009,584", "$1,333,539,889"));
|
|
||||||
Update(70, () => table.AddRow("Dec 20, 2019", "[yellow]Star Wars[/] [grey]Ep.[/] [u]IX[/]", "$245,000,000", "$177,383,864", "$1,074,114,248"));
|
|
||||||
|
|
||||||
// Column footer
|
|
||||||
Update(230, () => table.Columns[2].Footer("$1,633,000,000"));
|
|
||||||
Update(230, () => table.Columns[3].Footer("$928,119,224"));
|
|
||||||
Update(400, () => table.Columns[4].Footer("$10,318,030,576"));
|
|
||||||
|
|
||||||
// Column alignment
|
|
||||||
Update(230, () => table.Columns[2].RightAligned());
|
|
||||||
Update(230, () => table.Columns[3].RightAligned());
|
|
||||||
Update(400, () => table.Columns[4].RightAligned());
|
|
||||||
|
|
||||||
// Column titles
|
|
||||||
Update(70, () => table.Columns[0].Header("[bold]Release date[/]"));
|
|
||||||
Update(70, () => table.Columns[1].Header("[bold]Title[/]"));
|
|
||||||
Update(70, () => table.Columns[2].Header("[red bold]Budget[/]"));
|
|
||||||
Update(70, () => table.Columns[3].Header("[green bold]Opening Weekend[/]"));
|
|
||||||
Update(400, () => table.Columns[4].Header("[blue bold]Box office[/]"));
|
|
||||||
|
|
||||||
// Footers
|
|
||||||
Update(70, () => table.Columns[2].Footer("[red bold]$1,633,000,000[/]"));
|
|
||||||
Update(70, () => table.Columns[3].Footer("[green bold]$928,119,224[/]"));
|
|
||||||
Update(400, () => table.Columns[4].Footer("[blue bold]$10,318,030,576[/]"));
|
|
||||||
|
|
||||||
// Title
|
|
||||||
Update(500, () => table.Title("Star Wars Movies"));
|
|
||||||
Update(400, () => table.Title("[[ [yellow]Star Wars Movies[/] ]]"));
|
|
||||||
|
|
||||||
// Borders
|
|
||||||
Update(230, () => table.BorderColor(Color.Yellow));
|
|
||||||
Update(230, () => table.MinimalBorder());
|
|
||||||
Update(230, () => table.SimpleBorder());
|
|
||||||
Update(230, () => table.SimpleHeavyBorder());
|
|
||||||
|
|
||||||
// Caption
|
|
||||||
Update(400, () => table.Caption("[[ [blue]THE END[/] ]]"));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ExampleTitle>LiveTable</ExampleTitle>
|
|
||||||
<ExampleDescription>Demonstrates how to do live updates in a table.</ExampleDescription>
|
|
||||||
<ExampleGroup>Live</ExampleGroup>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Shared\Shared.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,86 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Spectre.Console;
|
|
||||||
|
|
||||||
namespace LiveTable;
|
|
||||||
|
|
||||||
public static class Program
|
|
||||||
{
|
|
||||||
private const int NumberOfRows = 10;
|
|
||||||
|
|
||||||
private static readonly Random _random = new();
|
|
||||||
private static readonly string[] _exchanges = new string[]
|
|
||||||
{
|
|
||||||
"SGD", "SEK", "PLN",
|
|
||||||
"MYR", "EUR", "USD",
|
|
||||||
"AUD", "JPY", "CNH",
|
|
||||||
"HKD", "CAD", "INR",
|
|
||||||
"DKK", "GBP", "RUB",
|
|
||||||
"NZD", "MXN", "IDR",
|
|
||||||
"TWD", "THB", "VND",
|
|
||||||
};
|
|
||||||
|
|
||||||
public static async Task Main(string[] args)
|
|
||||||
{
|
|
||||||
var table = new Table().Expand().BorderColor(Color.Grey);
|
|
||||||
table.AddColumn("[yellow]Source currency[/]");
|
|
||||||
table.AddColumn("[yellow]Destination currency[/]");
|
|
||||||
table.AddColumn("[yellow]Exchange rate[/]");
|
|
||||||
|
|
||||||
AnsiConsole.MarkupLine("Press [yellow]CTRL+C[/] to exit");
|
|
||||||
|
|
||||||
await AnsiConsole.Live(table)
|
|
||||||
.AutoClear(false)
|
|
||||||
.Overflow(VerticalOverflow.Ellipsis)
|
|
||||||
.Cropping(VerticalOverflowCropping.Bottom)
|
|
||||||
.StartAsync(async ctx =>
|
|
||||||
{
|
|
||||||
// Add some initial rows
|
|
||||||
foreach (var _ in Enumerable.Range(0, NumberOfRows))
|
|
||||||
{
|
|
||||||
AddExchangeRateRow(table);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Continously update the table
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
// More rows than we want?
|
|
||||||
if (table.Rows.Count > NumberOfRows)
|
|
||||||
{
|
|
||||||
// Remove the first one
|
|
||||||
table.Rows.RemoveAt(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a new row
|
|
||||||
AddExchangeRateRow(table);
|
|
||||||
|
|
||||||
// Refresh and wait for a while
|
|
||||||
ctx.Refresh();
|
|
||||||
await Task.Delay(400);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void AddExchangeRateRow(Table table)
|
|
||||||
{
|
|
||||||
var (source, destination, rate) = GetExchangeRate();
|
|
||||||
table.AddRow(
|
|
||||||
source, destination,
|
|
||||||
_random.NextDouble() > 0.35D ? $"[green]{rate}[/]" : $"[red]{rate}[/]");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static (string Source, string Destination, double Rate) GetExchangeRate()
|
|
||||||
{
|
|
||||||
var source = _exchanges[_random.Next(0, _exchanges.Length)];
|
|
||||||
var dest = _exchanges[_random.Next(0, _exchanges.Length)];
|
|
||||||
var rate = 200 / ((_random.NextDouble() * 320) + 1);
|
|
||||||
|
|
||||||
while (source == dest)
|
|
||||||
{
|
|
||||||
dest = _exchanges[_random.Next(0, _exchanges.Length)];
|
|
||||||
}
|
|
||||||
|
|
||||||
return (source, dest, rate);
|
|
||||||
}
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user