mirror of
https://github.com/spectreconsole/spectre.console.git
synced 2025-10-25 15:19:23 +00:00
Compare commits
293 Commits
0.46.0
...
renovate/s
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a527dfa18d | ||
|
|
e51812237e | ||
|
|
749f0fded8 | ||
|
|
f5f61ca610 | ||
|
|
d90e94dbb3 | ||
|
|
169abca986 | ||
|
|
3c2156268c | ||
|
|
6fb81103f0 | ||
|
|
880e83b27c | ||
|
|
0b270e1ccd | ||
|
|
2d9e8069fd | ||
|
|
b551bbd244 | ||
|
|
3a70fbec75 | ||
|
|
c67b3df3ba | ||
|
|
8e474f514c | ||
|
|
097f740bbd | ||
|
|
ba7299adcf | ||
|
|
d84f9ae713 | ||
|
|
3a6d3e4520 | ||
|
|
a8b2f1f1e0 | ||
|
|
0889c2f97c | ||
|
|
f4782d9916 | ||
|
|
8b59ddfd41 | ||
|
|
6ad814cab0 | ||
|
|
f32f80dc57 | ||
|
|
7f3ebe02c4 | ||
|
|
d77bfb6391 | ||
|
|
7819f0693d | ||
|
|
465be9391b | ||
|
|
7e5ddb1efe | ||
|
|
aabe8eeaf8 | ||
|
|
108b23fca8 | ||
|
|
7051bc9e2d | ||
|
|
65bab890f2 | ||
|
|
bd0e2d3e22 | ||
|
|
9efc426eb9 | ||
|
|
2570202990 | ||
|
|
e4b5b56d93 | ||
|
|
67c3909bbb | ||
|
|
d836ad1805 | ||
|
|
57dd8ee410 | ||
|
|
6105ee2a86 | ||
|
|
b5c839030c | ||
|
|
b08ca1c4d7 | ||
|
|
68fcfe0de4 | ||
|
|
b0f82d787d | ||
|
|
1dabf25e1c | ||
|
|
958820dd66 | ||
|
|
c4a97f3c89 | ||
|
|
4ac88b5d3f | ||
|
|
c937c8800a | ||
|
|
349eac1e22 | ||
|
|
2f8a38f169 | ||
|
|
e9f9f56189 | ||
|
|
cefb51df7b | ||
|
|
75b3b83210 | ||
|
|
dfdd129dd0 | ||
|
|
17c7a4f7d6 | ||
|
|
520efe07e2 | ||
|
|
c81bc5fe1d | ||
|
|
edf7f23957 | ||
|
|
80a8b0e406 | ||
|
|
dca67da8cd | ||
|
|
78272e62e6 | ||
|
|
540fb0195f | ||
|
|
93668e92b6 | ||
|
|
11a320c7c9 | ||
|
|
c1eb94c1db | ||
|
|
9d8d3c1d6d | ||
|
|
7e1142df58 | ||
|
|
a6b96e9297 | ||
|
|
f1f633cc72 | ||
|
|
05ce33615e | ||
|
|
97715f2553 | ||
|
|
039553efbb | ||
|
|
f704f2a0e8 | ||
|
|
8c5264d117 | ||
|
|
58bf89a56a | ||
|
|
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 | ||
|
|
b61fff042b | ||
|
|
ca441dbe7a | ||
|
|
f6bcf67cbe | ||
|
|
5c87d7fa04 | ||
|
|
0e2ed511a5 | ||
|
|
7b13148773 | ||
|
|
e5a6459c52 | ||
|
|
68b28b57f2 | ||
|
|
43b5ac99f9 | ||
|
|
b1b50a21f7 | ||
|
|
5d4b2c88e5 | ||
|
|
3acc90e47c | ||
|
|
88515b7d7f | ||
|
|
c5e11626b5 | ||
|
|
2ead177404 | ||
|
|
71f762f646 | ||
|
|
95bff47b85 | ||
|
|
de04619f88 | ||
|
|
ecdfdd4b85 | ||
|
|
a893a9601e | ||
|
|
d52d14e848 | ||
|
|
a62e79992b | ||
|
|
4f22f5b7c3 | ||
|
|
ff7282ecb8 | ||
|
|
eb38f76a6a | ||
|
|
20a2f727f7 | ||
|
|
fc0b553a4a | ||
|
|
1a3249cdae | ||
|
|
43f9ae92ad | ||
|
|
e66d3aab2e | ||
|
|
d921ac6f02 | ||
|
|
5acd83a3ef | ||
|
|
397b742bec | ||
|
|
d30b08201d | ||
|
|
8da05bcc17 | ||
|
|
badcd642ec | ||
|
|
fde9ee04cf | ||
|
|
b6e0b2389a | ||
|
|
3f5e8aabf5 | ||
|
|
ead874e6b2 | ||
|
|
e13410861d | ||
|
|
bf3b91a535 | ||
|
|
72704529c5 | ||
|
|
b21e07ea94 | ||
|
|
703d653ec5 | ||
|
|
71631b248a | ||
|
|
63c22575ea | ||
|
|
9cc888e5ad | ||
|
|
d5b4621233 | ||
|
|
cee97821d6 | ||
|
|
55c763a5c2 | ||
|
|
d03c10623c | ||
|
|
5a52c1f277 | ||
|
|
544e6a92df | ||
|
|
a94bc15746 | ||
|
|
e7ce6a69b7 | ||
|
|
7cf7e84dd8 | ||
|
|
6f1f29967d | ||
|
|
006da0f9ea | ||
|
|
c62f79eded | ||
|
|
1d19079913 | ||
|
|
44300c871f | ||
|
|
989c0b9904 | ||
|
|
cb52eb63ce | ||
|
|
7397169a27 | ||
|
|
ffdb47d77f | ||
|
|
383bee0e3e | ||
|
|
4d6541dd14 | ||
|
|
b1e0896a0d | ||
|
|
e07ccd9f66 | ||
|
|
250b1f4c9c | ||
|
|
023c77ff09 | ||
|
|
dc402220f2 | ||
|
|
c448d0d5f6 | ||
|
|
3da367f29f | ||
|
|
ead7115cbe | ||
|
|
1fd028942f | ||
|
|
4219bbbf61 | ||
|
|
29a43686d4 | ||
|
|
63b940cf0e | ||
|
|
bbf58ee814 | ||
|
|
e2a674815d | ||
|
|
343b98944d | ||
|
|
2bbb7c1ab6 | ||
|
|
5296e56b1c | ||
|
|
943c045fab | ||
|
|
2af3f7faeb | ||
|
|
ed9e198d60 | ||
|
|
3bee7212b7 | ||
|
|
c82d8c4523 | ||
|
|
bef21e8a21 | ||
|
|
037e109699 | ||
|
|
f7befacd79 | ||
|
|
cec5fb4595 | ||
|
|
9c86391fb6 | ||
|
|
a3dcb31729 | ||
|
|
1002c6fe27 | ||
|
|
c64797d681 | ||
|
|
131b37fff8 | ||
|
|
813a53cdfa | ||
|
|
2af901a814 | ||
|
|
83afa97017 | ||
|
|
e0ded712e8 | ||
|
|
d484e832f5 | ||
|
|
71a5d83067 | ||
|
|
35ce60b596 | ||
|
|
0ec70a44db | ||
|
|
1ee2653cf8 | ||
|
|
4c0178cf9a | ||
|
|
296bc61837 | ||
|
|
766ccb1f1b | ||
|
|
f7314dc2e8 | ||
|
|
f453890d13 | ||
|
|
2c8f459806 | ||
|
|
018f4ebd17 | ||
|
|
404b052a5f | ||
|
|
dac2097321 | ||
|
|
6acf9b8c63 | ||
|
|
3ec0fee795 | ||
|
|
5843a4545e | ||
|
|
d64d3ec770 | ||
|
|
4dcbd30285 | ||
|
|
1334319dd1 | ||
|
|
714cf179cb | ||
|
|
70da3f40ff | ||
|
|
5075732564 | ||
|
|
10467a2912 | ||
|
|
a7ab1b690e | ||
|
|
142942b8a2 | ||
|
|
0bab835293 | ||
|
|
a6af9a6842 | ||
|
|
d3f4f5f208 | ||
|
|
cbbdb3369c | ||
|
|
6740f0b02b | ||
|
|
f7f99ec899 | ||
|
|
955fe07bac | ||
|
|
819b948e78 | ||
|
|
baa8220a52 | ||
|
|
9cd7b24e65 | ||
|
|
04610cf492 | ||
|
|
f4183e0462 | ||
|
|
29846ba505 | ||
|
|
92318ce1fb | ||
|
|
720db951f3 | ||
|
|
e042fe15e4 | ||
|
|
62b30d6072 | ||
|
|
beca0b2419 | ||
|
|
de847b90e4 | ||
|
|
7b9553dd22 | ||
|
|
f223f6061c |
@@ -2,13 +2,13 @@ root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = CRLF
|
||||
end_of_line = LF
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
insert_final_newline = false
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.sln]
|
||||
[*.{sln,slnx}]
|
||||
indent_style = tab
|
||||
|
||||
[*.{csproj,vbproj,vcxproj,vcxproj.filters}]
|
||||
@@ -26,9 +26,6 @@ indent_size = 2
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.sh]
|
||||
end_of_line = lf
|
||||
|
||||
[*.cs]
|
||||
# Prefer file scoped namespace declarations
|
||||
csharp_style_namespace_declarations = file_scoped:warning
|
||||
|
||||
@@ -1,2 +1,5 @@
|
||||
# Use file scoped namespace declarations
|
||||
7b2da0a4f63bf3ceab99d2c88535e74155f2b99c
|
||||
|
||||
# fix line-endings
|
||||
e2ad4b1ea5555e701cda4fd400bb6592e318e1ff
|
||||
|
||||
4
.gitattributes
vendored
Normal file
4
.gitattributes
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
* text=auto
|
||||
|
||||
*.cs text eol=lf
|
||||
*.md text eol=lf
|
||||
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -26,3 +26,6 @@ If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
---
|
||||
Please upvote :+1: this issue if you are interested in it.
|
||||
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1 @@
|
||||
blank_issues_enabled: false
|
||||
3
.github/ISSUE_TEMPLATE/feature_request.md
vendored
3
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -18,3 +18,6 @@ A clear and concise description of any alternative solutions or features you've
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
|
||||
---
|
||||
Please upvote :+1: this issue if you are interested in it.
|
||||
22
.github/pull_request_template.md
vendored
Normal file
22
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
<!--
|
||||
Do NOT open a PR without discussing the changes on an open issue, first.
|
||||
|
||||
Add the issue number here. e.g. #123
|
||||
-->
|
||||
fixes #
|
||||
|
||||
<!-- formalities. These are not optional. -->
|
||||
|
||||
- [ ] I have read the [Contribution Guidelines](https://github.com/spectreconsole/spectre.console/blob/main/CONTRIBUTING.md)
|
||||
- [ ] I have commented on the issue above and discussed the intended changes
|
||||
- [ ] A maintainer has signed off on the changes and the issue was assigned to me
|
||||
- [ ] All newly added code is adequately covered by tests
|
||||
- [ ] All existing tests are still running without errors
|
||||
- [ ] The documentation was modified to reflect the changes _OR_ no documentation changes are required.
|
||||
|
||||
## Changes
|
||||
|
||||
<!-- describe the changes you made. -->
|
||||
|
||||
---
|
||||
Please upvote :+1: this pull request if you are interested in it.
|
||||
64
.github/workflows/ci.yaml
vendored
64
.github/workflows/ci.yaml
vendored
@@ -8,48 +8,6 @@ env:
|
||||
|
||||
jobs:
|
||||
|
||||
###################################################
|
||||
# DOCS
|
||||
###################################################
|
||||
|
||||
docs:
|
||||
name: Documentation
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@master
|
||||
|
||||
- name: Setup .NET SDK
|
||||
uses: actions/setup-dotnet@v3
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '16'
|
||||
|
||||
- name: Cache dependencies
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: npm-${{ hashFiles('package-lock.json') }}
|
||||
restore-keys: npm-
|
||||
|
||||
- name: Build
|
||||
shell: bash
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
cd docs
|
||||
dotnet tool restore
|
||||
dotnet run --configuration Release
|
||||
|
||||
- name: Archive doc generation
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: documentation-output
|
||||
path: docs/output/
|
||||
retention-days: 5
|
||||
|
||||
###################################################
|
||||
# BUILD
|
||||
###################################################
|
||||
@@ -57,25 +15,19 @@ jobs:
|
||||
build:
|
||||
name: Build
|
||||
if: "!contains(github.event.head_commit.message, 'skip-ci')"
|
||||
strategy:
|
||||
matrix:
|
||||
kind: ['linux', 'windows', 'macOS']
|
||||
include:
|
||||
- kind: linux
|
||||
os: ubuntu-latest
|
||||
- kind: windows
|
||||
os: windows-latest
|
||||
- kind: macOS
|
||||
os: macos-latest
|
||||
runs-on: ${{ matrix.os }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup .NET SDK
|
||||
uses: actions/setup-dotnet@v3
|
||||
uses: actions/setup-dotnet@v5
|
||||
with:
|
||||
dotnet-version: |
|
||||
8.0.x
|
||||
9.0.x
|
||||
|
||||
- name: Build
|
||||
shell: bash
|
||||
@@ -85,7 +37,7 @@ jobs:
|
||||
|
||||
- name: Upload Verify Test Results
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: verify-test-results
|
||||
path: |
|
||||
|
||||
71
.github/workflows/publish.yaml
vendored
71
.github/workflows/publish.yaml
vendored
@@ -15,40 +15,33 @@ env:
|
||||
jobs:
|
||||
|
||||
###################################################
|
||||
# BUILD
|
||||
# PUBLISH
|
||||
###################################################
|
||||
|
||||
build:
|
||||
name: Build
|
||||
if: |
|
||||
(!startsWith(github.event.head_commit.message, 'skip-ci')
|
||||
&& !startsWith(github.event.head_commit.message, 'chore:'))
|
||||
|| startsWith(github.ref, 'refs/tags/')
|
||||
strategy:
|
||||
matrix:
|
||||
kind: ['linux', 'windows', 'macOS']
|
||||
include:
|
||||
- kind: linux
|
||||
os: ubuntu-latest
|
||||
- kind: windows
|
||||
os: windows-latest
|
||||
- kind: macOS
|
||||
os: macos-latest
|
||||
runs-on: ${{ matrix.os }}
|
||||
name: Publish NuGet Packages
|
||||
if: "!contains(github.event.head_commit.message, 'skip-ci') || startsWith(github.ref, 'refs/tags/')"
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup .NET SDK
|
||||
uses: actions/setup-dotnet@v3
|
||||
uses: actions/setup-dotnet@v5
|
||||
with:
|
||||
dotnet-version: |
|
||||
8.0.x
|
||||
9.0.x
|
||||
|
||||
- name: Build
|
||||
- name: Publish
|
||||
shell: bash
|
||||
run: |
|
||||
dotnet tool restore
|
||||
dotnet cake
|
||||
dotnet cake --target="publish" \
|
||||
--nuget-key="${{secrets.NUGET_API_KEY}}" \
|
||||
--github-key="${{secrets.GITHUB_TOKEN}}"
|
||||
|
||||
###################################################
|
||||
# DOCS
|
||||
@@ -60,20 +53,20 @@ jobs:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup .NET SDK
|
||||
uses: actions/setup-dotnet@v3
|
||||
uses: actions/setup-dotnet@v5
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: '16'
|
||||
node-version: '22'
|
||||
|
||||
- name: Cache dependencies
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: npm-${{ hashFiles('package-lock.json') }}
|
||||
@@ -89,29 +82,3 @@ jobs:
|
||||
cd docs
|
||||
dotnet tool restore
|
||||
dotnet run --configuration Release -- deploy
|
||||
|
||||
###################################################
|
||||
# PUBLISH
|
||||
###################################################
|
||||
|
||||
publish:
|
||||
name: Publish NuGet Packages
|
||||
needs: [build]
|
||||
if: "!contains(github.event.head_commit.message, 'skip-ci') || startsWith(github.ref, 'refs/tags/')"
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup .NET SDK
|
||||
uses: actions/setup-dotnet@v3
|
||||
|
||||
- name: Publish
|
||||
shell: bash
|
||||
run: |
|
||||
dotnet tool restore
|
||||
dotnet cake --target="publish" \
|
||||
--nuget-key="${{secrets.NUGET_API_KEY}}" \
|
||||
--github-key="${{secrets.GITHUB_TOKEN}}"
|
||||
24
.github/workflows/top-issues-dashboard.yml
vendored
Normal file
24
.github/workflows/top-issues-dashboard.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
name: Top issues action.
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 */1 * *'
|
||||
|
||||
jobs:
|
||||
ShowAndLabelTopIssues:
|
||||
name: Display and label top issues.
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Top Issues action
|
||||
uses: rickstaa/top-issues-action@v1.3.101
|
||||
env:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
top_list_size: 10
|
||||
label: true
|
||||
dashboard: true
|
||||
dashboard_show_total_reactions: true
|
||||
top_issues: true
|
||||
top_bugs: true
|
||||
top_features: true
|
||||
feature_label: feature
|
||||
top_pull_requests: true
|
||||
@@ -39,7 +39,7 @@ What is generally considered trivial:
|
||||
### Code style
|
||||
|
||||
Normal .NET coding guidelines apply.
|
||||
See the [Framework Design Guidelines](https://msdn.microsoft.com/en-us/library/ms229042%28v=vs.110%29.aspx) for more information.
|
||||
See the [Framework Design Guidelines](https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/) for more information.
|
||||
|
||||
### Dependencies
|
||||
|
||||
@@ -59,7 +59,7 @@ Any new code should also have reasonable unit test coverage.
|
||||
information and a link back to the discussion.
|
||||
* Once you get a nod from someone in the Spectre.Console Team, you can start on the feature.
|
||||
* Alternatively, if a feature is on the issues list with the
|
||||
[Up For Grabs](https://github.com/spectreconsole/spectre.console/labels/up-for-grabs) label,
|
||||
[good first issue](https://github.com/spectreconsole/spectre.console/labels/good%20first%20issue) label,
|
||||
it is open for a community member (contributor) to patch. You should comment that you are signing up for it on
|
||||
the issue so someone else doesn't also sign up for the work.
|
||||
|
||||
|
||||
23
README.fa.md
23
README.fa.md
@@ -44,30 +44,13 @@ https://spectreconsole.net/
|
||||
|
||||
<h2 id="examples">مثالها</h2>
|
||||
|
||||
برای بررسی `Spectre.Console` در عمل، ابزار سراسری
|
||||
[dotnet-example](https://github.com/patriksvensson/dotnet-example)
|
||||
را نصب کنید.
|
||||
|
||||
<pre dir="ltr">
|
||||
> dotnet tool restore
|
||||
</pre>
|
||||
|
||||
حالا شما میتوانید مثالهای موجود در این مخزن را لیست کنید:
|
||||
|
||||
<pre dir="ltr">
|
||||
> dotnet example
|
||||
</pre>
|
||||
|
||||
و برای اجرای مثال:
|
||||
|
||||
<pre dir="ltr">
|
||||
> dotnet example tables
|
||||
</pre>
|
||||
To see `Spectre.Console` in action, please see the
|
||||
[examples repository](https://github.com/spectreconsole/examples).
|
||||
|
||||
<h2 id="license">مجوز</h2>
|
||||
|
||||
<div dir="ltr">
|
||||
Copyright © Patrik Svensson, Phil Scott
|
||||
Copyright © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray
|
||||
</div>
|
||||
|
||||
همانطور که Spectre.Console تحت مجوز MIT ارائه شده است؛ برای کسب اطلاعات بیشتر به مجوز مراجعه کنید.
|
||||
|
||||
44
README.md
44
README.md
@@ -3,8 +3,7 @@
|
||||
_[](https://www.nuget.org/packages/spectre.console)_ _[](https://www.nuget.org/packages/spectre.console.cli)_ [](https://app.netlify.com/sites/spectreconsole/deploys)
|
||||
|
||||
A .NET library that makes it easier to create beautiful, cross platform, console applications.
|
||||
It is heavily inspired by the excellent [Rich library](https://github.com/willmcgugan/rich)
|
||||
for Python. For detailed usage instructions, [please refer to the documentation at https://spectreconsole.net/.](https://spectreconsole.net/)
|
||||
It is heavily inspired by the excellent Python library, [Rich](https://github.com/willmcgugan/rich). Detailed instructions for using `Spectre.Console` are located on the project website, https://spectreconsole.net
|
||||
|
||||
## Table of Contents
|
||||
|
||||
@@ -19,18 +18,22 @@ for Python. For detailed usage instructions, [please refer to the documentation
|
||||
|
||||
## Features
|
||||
|
||||
* Written with unit testing in mind.
|
||||
* Supports tables, grids, panels, and a [rich](https://github.com/willmcgugan/rich) inspired markup language.
|
||||
* Supports tables, grids, panels, and a [Rich](https://github.com/willmcgugan/rich) inspired markup language.
|
||||
* Supports the most common SRG parameters when it comes to text
|
||||
styling such as bold, dim, italic, underline, strikethrough,
|
||||
and blinking text.
|
||||
* Supports 3/4/8/24-bit colors in the terminal.
|
||||
The library will detect the capabilities of the current terminal
|
||||
and downgrade colors as needed.
|
||||
|
||||
* Written with unit testing in mind.
|
||||
|
||||

|
||||
|
||||
## Important Notices
|
||||
|
||||
> [!IMPORTANT]\
|
||||
> We use the [Top Issues Dashboard](https://github.com/spectreconsole/spectre.console/issues/1517) for tracking community demand. Please upvote :+1: the issues and pull requests you are interested in.
|
||||
|
||||
## Installing
|
||||
|
||||
The fastest way of getting started using `Spectre.Console` is to install the NuGet package.
|
||||
@@ -42,34 +45,17 @@ dotnet add package Spectre.Console
|
||||
## Documentation
|
||||
|
||||
The documentation for `Spectre.Console` can be found at
|
||||
https://spectreconsole.net/
|
||||
https://spectreconsole.net
|
||||
|
||||
## Examples
|
||||
|
||||
To see `Spectre.Console` in action, install the
|
||||
[dotnet-example](https://github.com/patriksvensson/dotnet-example)
|
||||
global tool.
|
||||
|
||||
```
|
||||
> dotnet tool restore
|
||||
```
|
||||
|
||||
Now you can list available examples in this repository:
|
||||
|
||||
```
|
||||
> dotnet example
|
||||
```
|
||||
|
||||
And to run an example:
|
||||
|
||||
```
|
||||
> dotnet example tables
|
||||
```
|
||||
To see `Spectre.Console` in action, please see the
|
||||
[examples repository](https://github.com/spectreconsole/examples).
|
||||
|
||||
## Sponsors
|
||||
|
||||
The following people are [sponsoring](https://github.com/sponsors/patriksvensson)
|
||||
Spectre.Console to show their support and to ensure the longevity of the project.
|
||||
`Spectre.Console` to show their support and to ensure the longevity of the project.
|
||||
|
||||
* [Rodney Littles II](https://github.com/RLittlesII)
|
||||
* [Martin Björkström](https://github.com/bjorkstromm)
|
||||
@@ -97,8 +83,8 @@ This project is supported by the [.NET Foundation](https://dotnetfoundation.org)
|
||||
|
||||
## 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.
|
||||
|
||||
* SixLabors.ImageSharp, a library which Spectre.Console relies upon, is licensed under Apache 2.0 when distributed as part of Spectre.Console. The Six Labors Split License covers all other usage, see: https://github.com/SixLabors/ImageSharp/blob/master/LICENSE
|
||||
* SixLabors.ImageSharp, a library which `Spectre.Console` relies upon, is licensed under Apache 2.0 when distributed as part of `Spectre.Console`. The Six Labors Split License covers all other usage, see: https://github.com/SixLabors/ImageSharp/blob/master/LICENSE
|
||||
|
||||
@@ -43,24 +43,8 @@ https://spectreconsole.net/
|
||||
|
||||
## Exemplos
|
||||
|
||||
Para ver o `Spectre.Console` em ação, instale a ferramenta global
|
||||
[dotnet-example](https://github.com/patriksvensson/dotnet-example).
|
||||
|
||||
```
|
||||
> dotnet tool restore
|
||||
```
|
||||
|
||||
Agora você pode listar os exemplos disponíveis neste repositório:
|
||||
|
||||
```
|
||||
> dotnet example
|
||||
```
|
||||
|
||||
E para executar um exemplo:
|
||||
|
||||
```
|
||||
> dotnet example tables
|
||||
```
|
||||
To see `Spectre.Console` in action, please see the
|
||||
[examples repository](https://github.com/spectreconsole/examples).
|
||||
|
||||
## Patrocinadores
|
||||
|
||||
@@ -83,7 +67,7 @@ Eu estou muito agradecido.
|
||||
|
||||
## 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).
|
||||
|
||||
|
||||
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)工具。
|
||||
|
||||
```
|
||||
> dotnet tool restore
|
||||
```
|
||||
|
||||
然后你可以列出仓库里的所有例子:
|
||||
|
||||
```
|
||||
> dotnet example
|
||||
```
|
||||
|
||||
跑一个看看效果:
|
||||
|
||||
```
|
||||
> dotnet example tables
|
||||
```
|
||||
To see `Spectre.Console` in action, please see the
|
||||
[examples repository](https://github.com/spectreconsole/examples).
|
||||
|
||||
## 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 文件了解更多信息。
|
||||
|
||||
|
||||
92
build.cake
92
build.cake
@@ -14,32 +14,23 @@ Task("Build")
|
||||
.IsDependentOn("Clean")
|
||||
.Does(context =>
|
||||
{
|
||||
DotNetBuild("./src/Spectre.Console.sln", new DotNetBuildSettings {
|
||||
Information("Compiling generator...");
|
||||
DotNetBuild("./resources/scripts/Generator/Generator.slnx", new DotNetBuildSettings
|
||||
{
|
||||
Configuration = configuration,
|
||||
Verbosity = DotNetVerbosity.Minimal,
|
||||
NoLogo = true,
|
||||
NoIncremental = context.HasArgument("rebuild"),
|
||||
MSBuildSettings = new DotNetMSBuildSettings()
|
||||
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
|
||||
});
|
||||
});
|
||||
|
||||
Task("Build-Analyzer")
|
||||
.IsDependentOn("Build")
|
||||
.Does(context =>
|
||||
Information("\nCompiling Spectre.Console...");
|
||||
DotNetBuild("./src/Spectre.Console.slnx", new DotNetBuildSettings
|
||||
{
|
||||
DotNetBuild("./src/Spectre.Console.Analyzer.sln", new DotNetBuildSettings {
|
||||
Configuration = configuration,
|
||||
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)
|
||||
@@ -48,24 +39,20 @@ Task("Build-Examples")
|
||||
|
||||
Task("Test")
|
||||
.IsDependentOn("Build")
|
||||
.IsDependentOn("Build-Analyzer")
|
||||
.IsDependentOn("Build-Examples")
|
||||
.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,
|
||||
Verbosity = DotNetVerbosity.Minimal,
|
||||
NoLogo = true,
|
||||
NoRestore = true,
|
||||
NoBuild = true,
|
||||
});
|
||||
|
||||
DotNetTest("./test/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj", new DotNetTestSettings {
|
||||
Configuration = configuration,
|
||||
NoRestore = true,
|
||||
NoBuild = true,
|
||||
});
|
||||
|
||||
DotNetTest("./test/Spectre.Console.Analyzer.Tests/Spectre.Console.Analyzer.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,
|
||||
});
|
||||
@@ -75,55 +62,17 @@ Task("Package")
|
||||
.IsDependentOn("Test")
|
||||
.Does(context =>
|
||||
{
|
||||
context.DotNetPack($"./src/Spectre.Console.sln", new DotNetPackSettings {
|
||||
context.DotNetPack($"./src/Spectre.Console.slnx", new DotNetPackSettings
|
||||
{
|
||||
Configuration = configuration,
|
||||
Verbosity = DotNetVerbosity.Minimal,
|
||||
NoLogo = true,
|
||||
NoRestore = true,
|
||||
NoBuild = true,
|
||||
OutputDirectory = "./.artifacts",
|
||||
MSBuildSettings = new DotNetMSBuildSettings()
|
||||
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
|
||||
});
|
||||
|
||||
context.DotNetPack($"./src/Spectre.Console.Analyzer.sln", new DotNetPackSettings {
|
||||
Configuration = configuration,
|
||||
NoRestore = true,
|
||||
NoBuild = true,
|
||||
OutputDirectory = "./.artifacts",
|
||||
MSBuildSettings = new DotNetMSBuildSettings()
|
||||
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
|
||||
});
|
||||
});
|
||||
|
||||
Task("Publish-GitHub")
|
||||
.WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions")
|
||||
.IsDependentOn("Package")
|
||||
.Does(context =>
|
||||
{
|
||||
var apiKey = Argument<string>("github-key", null);
|
||||
if(string.IsNullOrWhiteSpace(apiKey)) {
|
||||
throw new CakeException("No GitHub API key was provided.");
|
||||
}
|
||||
|
||||
// Publish to GitHub Packages
|
||||
var exitCode = 0;
|
||||
foreach(var file in context.GetFiles("./.artifacts/*.nupkg"))
|
||||
{
|
||||
context.Information("Publishing {0}...", file.GetFilename().FullPath);
|
||||
exitCode += StartProcess("dotnet",
|
||||
new ProcessSettings {
|
||||
Arguments = new ProcessArgumentBuilder()
|
||||
.Append("gpr")
|
||||
.Append("push")
|
||||
.AppendQuoted(file.FullPath)
|
||||
.AppendSwitchSecret("-k", " ", apiKey)
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
if(exitCode != 0)
|
||||
{
|
||||
throw new CakeException("Could not push GitHub packages.");
|
||||
}
|
||||
});
|
||||
|
||||
Task("Publish-NuGet")
|
||||
@@ -152,7 +101,6 @@ Task("Publish-NuGet")
|
||||
// Targets
|
||||
|
||||
Task("Publish")
|
||||
.IsDependentOn("Publish-GitHub")
|
||||
.IsDependentOn("Publish-NuGet");
|
||||
|
||||
Task("Default")
|
||||
@@ -161,4 +109,4 @@ Task("Default")
|
||||
////////////////////////////////////////////////////////////////
|
||||
// Execution
|
||||
|
||||
RunTarget(target)
|
||||
RunTarget(target);
|
||||
@@ -2,11 +2,16 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>
|
||||
<DefaultItemExcludes>$(DefaultItemExcludes);output\**;.gitignore</DefaultItemExcludes>
|
||||
<NoWarn>MVC1000</NoWarn>
|
||||
<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>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -33,13 +38,13 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Playwright" Version="1.19.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||
<PackageReference Include="Statiq.CodeAnalysis" Version="1.0.0-beta.58" />
|
||||
<PackageReference Include="Statiq.Common" Version="1.0.0-beta.58" />
|
||||
<PackageReference Include="Statiq.Web" Version="1.0.0-beta.44" />
|
||||
<PackageReference Include="MinVer" PrivateAssets="All" Version="2.5.0" />
|
||||
<PackageReference Include="Statiq.Web.Netlify" Version="1.0.0-beta.44" />
|
||||
<PackageReference Include="Microsoft.Playwright" Version="1.55.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||
<PackageReference Include="Statiq.CodeAnalysis" Version="1.0.0-beta.72" />
|
||||
<PackageReference Include="Statiq.Common" Version="1.0.0-beta.72" />
|
||||
<PackageReference Include="Statiq.Web" Version="1.0.0-beta.60" />
|
||||
<PackageReference Include="MinVer" PrivateAssets="All" Version="6.0.0" />
|
||||
<PackageReference Include="Statiq.Web.Netlify" Version="1.0.0-beta.60" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.30011.22
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Docs", "Docs.csproj", "{C337F609-A890-4E52-BDA3-91658039B0E3}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{C337F609-A890-4E52-BDA3-91658039B0E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C337F609-A890-4E52-BDA3-91658039B0E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C337F609-A890-4E52-BDA3-91658039B0E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C337F609-A890-4E52-BDA3-91658039B0E3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {2FB3922B-494A-45EB-A479-FC507B8E107C}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
3
docs/Docs.slnx
Normal file
3
docs/Docs.slnx
Normal file
@@ -0,0 +1,3 @@
|
||||
<Solution>
|
||||
<Project Path="Docs.csproj" />
|
||||
</Solution>
|
||||
@@ -23,8 +23,9 @@ namespace Docs
|
||||
{
|
||||
"../../src/Spectre.Console/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
|
||||
"../../src/Spectre.Console.Cli/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
|
||||
"../../src/Spectre.Console.ImageSharp/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
|
||||
"../../src/Spectre.Console.Json/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs"
|
||||
"../../src/Spectre.Console.Testing/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
|
||||
"../../src/Extensions/Spectre.Console.ImageSharp/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
|
||||
"../../src/Extensions/Spectre.Console.Json/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs"
|
||||
})
|
||||
.AddSetting(Constants.ExampleSourceFiles, new List<string>
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"isRoot": true,
|
||||
"tools": {
|
||||
"microsoft.playwright.cli": {
|
||||
"version": "1.2.2",
|
||||
"version": "1.2.3",
|
||||
"commands": [
|
||||
"playwright"
|
||||
]
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"sdk": {
|
||||
"version": "7.0.100",
|
||||
"rollForward": "latestFeature"
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,7 @@ Optional: Embed an asciicast. The cast parameter should be the base name of the
|
||||
one suffixed with -rich.cast and a second named -plain.cast. The cast attribute should be the name without
|
||||
the suffix.
|
||||
|
||||
To generate a new cast file, open the \resources\scripts\Generator\Generator.sln project and add a new sample in the
|
||||
To generate a new cast file, open the \resources\scripts\Generator\Generator.slnx project and add a new sample in the
|
||||
Commands/AsciiCast/Samples/ folder. If the widget is static such as a tree or a table, try and animate the widget
|
||||
using the Live widget to change the content or styling.
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ For all available spinners, see https://jsfiddle.net/sindresorhus/2eLtsbey/embed
|
||||
|
||||
## 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
|
||||
AnsiConsole.Status()
|
||||
|
||||
@@ -6,6 +6,7 @@ Highlights:
|
||||
- Dim, Invert
|
||||
- Conceal, slowblink, rapidblink
|
||||
- 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.
|
||||
@@ -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>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>link</link></td>
|
||||
<td><code>link</code></td>
|
||||
<td>Creates a clickable link within text</td>
|
||||
</tr>
|
||||
</table>
|
||||
2
docs/input/assets/casts/align-rich.cast
Normal file
2
docs/input/assets/casts/align-rich.cast
Normal file
@@ -0,0 +1,2 @@
|
||||
{"version": 2, "width": 40, "height": 3, "timestamp": 1667342769, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}}
|
||||
[0.0, "o", "\u001b[H\u001b[2B\u001b[38;5;9;48;5;0mSpectre!\u001b[0m"]
|
||||
332
docs/input/assets/casts/await-spinner-plain.cast
Normal file
332
docs/input/assets/casts/await-spinner-plain.cast
Normal file
@@ -0,0 +1,332 @@
|
||||
{"version": 2, "width": 42, "height": 4, "title": "await-spinner (plain)", "env": {"TERM": "Spectre.Console"}}
|
||||
[0, "o", "Loading the rocket ship "]
|
||||
[0, "o", "\u001B[?25l"]
|
||||
[0, "o", "\u280B"]
|
||||
[0, "o", "\u001B[1D"]
|
||||
[0.094, "o", "\u001B[?25l"]
|
||||
[0.094, "o", "\u2819"]
|
||||
[0.094, "o", "\u001B[1D"]
|
||||
[0.188, "o", "\u001B[?25l"]
|
||||
[0.188, "o", "\u2839"]
|
||||
[0.188, "o", "\u001B[1D"]
|
||||
[0.266, "o", "\u001B[?25l"]
|
||||
[0.266, "o", "\u2838"]
|
||||
[0.266, "o", "\u001B[1D"]
|
||||
[0.36, "o", "\u001B[?25l"]
|
||||
[0.36, "o", "\u283C"]
|
||||
[0.36, "o", "\u001B[1D"]
|
||||
[0.453, "o", "\u001B[?25l"]
|
||||
[0.453, "o", "\u2834"]
|
||||
[0.453, "o", "\u001B[1D"]
|
||||
[0.563, "o", "\u001B[?25l"]
|
||||
[0.563, "o", "\u2826"]
|
||||
[0.563, "o", "\u001B[1D"]
|
||||
[0.656, "o", "\u001B[?25l"]
|
||||
[0.656, "o", "\u2827"]
|
||||
[0.656, "o", "\u001B[1D"]
|
||||
[0.75, "o", "\u001B[?25l"]
|
||||
[0.75, "o", "\u2807"]
|
||||
[0.75, "o", "\u001B[1D"]
|
||||
[0.844, "o", "\u001B[?25l"]
|
||||
[0.844, "o", "\u280F"]
|
||||
[0.844, "o", "\u001B[1D"]
|
||||
[0.922, "o", "\u001B[?25l"]
|
||||
[0.922, "o", "\u280B"]
|
||||
[0.922, "o", "\u001B[1D"]
|
||||
[1.016, "o", "\u001B[?25l"]
|
||||
[1.016, "o", "\u2819"]
|
||||
[1.016, "o", "\u001B[1D"]
|
||||
[1.11, "o", "\u001B[?25l"]
|
||||
[1.11, "o", "\u2839"]
|
||||
[1.11, "o", "\u001B[1D"]
|
||||
[1.203, "o", "\u001B[?25l"]
|
||||
[1.203, "o", "\u2838"]
|
||||
[1.203, "o", "\u001B[1D"]
|
||||
[1.297, "o", "\u001B[?25l"]
|
||||
[1.297, "o", "\u283C"]
|
||||
[1.297, "o", "\u001B[1D"]
|
||||
[1.391, "o", "\u001B[?25l"]
|
||||
[1.391, "o", "\u2834"]
|
||||
[1.391, "o", "\u001B[1D"]
|
||||
[1.485, "o", "\u001B[?25l"]
|
||||
[1.485, "o", "\u2826"]
|
||||
[1.485, "o", "\u001B[1D"]
|
||||
[1.578, "o", "\u001B[?25l"]
|
||||
[1.578, "o", "\u2827"]
|
||||
[1.578, "o", "\u001B[1D"]
|
||||
[1.672, "o", "\u001B[?25l"]
|
||||
[1.672, "o", "\u2807"]
|
||||
[1.672, "o", "\u001B[1D"]
|
||||
[1.75, "o", "\u001B[?25l"]
|
||||
[1.75, "o", "\u280F"]
|
||||
[1.75, "o", "\u001B[1D"]
|
||||
[1.828, "o", "\u001B[?25l"]
|
||||
[1.828, "o", "\u280B"]
|
||||
[1.828, "o", "\u001B[1D"]
|
||||
[1.906, "o", "\u001B[?25l"]
|
||||
[1.906, "o", "\u2819"]
|
||||
[1.906, "o", "\u001B[1D"]
|
||||
[2, "o", "\u001B[?25l"]
|
||||
[2, "o", "\u2839"]
|
||||
[2, "o", "\u001B[1D"]
|
||||
[2.11, "o", "\u001B[?25l"]
|
||||
[2.11, "o", "\u2838"]
|
||||
[2.11, "o", "\u001B[1D"]
|
||||
[2.203, "o", "\u001B[?25l"]
|
||||
[2.203, "o", "\u283C"]
|
||||
[2.203, "o", "\u001B[1D"]
|
||||
[2.297, "o", "\u001B[?25l"]
|
||||
[2.297, "o", "\u2834"]
|
||||
[2.297, "o", "\u001B[1D"]
|
||||
[2.391, "o", "\u001B[?25l"]
|
||||
[2.391, "o", "\u2826"]
|
||||
[2.391, "o", "\u001B[1D"]
|
||||
[2.485, "o", "\u001B[?25l"]
|
||||
[2.485, "o", "\u2827"]
|
||||
[2.485, "o", "\u001B[1D"]
|
||||
[2.578, "o", "\u001B[?25l"]
|
||||
[2.578, "o", "\u2807"]
|
||||
[2.578, "o", "\u001B[1D"]
|
||||
[2.656, "o", "\u001B[?25l"]
|
||||
[2.656, "o", "\u280F"]
|
||||
[2.656, "o", "\u001B[1D"]
|
||||
[2.735, "o", "\u001B[?25l"]
|
||||
[2.735, "o", "\u280B"]
|
||||
[2.735, "o", "\u001B[1D"]
|
||||
[2.828, "o", "\u001B[?25l"]
|
||||
[2.828, "o", "\u2819"]
|
||||
[2.828, "o", "\u001B[1D"]
|
||||
[2.922, "o", "\u001B[?25l"]
|
||||
[2.922, "o", "\u2839"]
|
||||
[2.922, "o", "\u001B[1D"]
|
||||
[3.016, "o", "\u001B[?25l"]
|
||||
[3.016, "o", "\u2838"]
|
||||
[3.016, "o", "\u001B[1D"]
|
||||
[3.094, "o", "\u001B[?25l"]
|
||||
[3.094, "o", "\u283C"]
|
||||
[3.094, "o", "\u001B[1D"]
|
||||
[3.188, "o", "\u001B[?25l"]
|
||||
[3.188, "o", "\u2834"]
|
||||
[3.188, "o", "\u001B[1D"]
|
||||
[3.281, "o", "\u001B[?25l"]
|
||||
[3.281, "o", "\u2826"]
|
||||
[3.281, "o", "\u001B[1D"]
|
||||
[3.375, "o", "\u001B[?25l"]
|
||||
[3.375, "o", "\u2827"]
|
||||
[3.375, "o", "\u001B[1D"]
|
||||
[3.453, "o", "\u001B[?25l"]
|
||||
[3.453, "o", "\u2807"]
|
||||
[3.453, "o", "\u001B[1D"]
|
||||
[3.516, "o", " "]
|
||||
[3.516, "o", "\u001B[1D"]
|
||||
[3.516, "o", "\u001B[?25h"]
|
||||
[3.516, "o", "\u001B[32mDone\u001B[0m\r\n"]
|
||||
[3.516, "o", "Firing up the engines "]
|
||||
[3.516, "o", "\u001B[?25l"]
|
||||
[3.516, "o", "[ ]"]
|
||||
[3.516, "o", "\u001B[6D"]
|
||||
[3.61, "o", "\u001B[?25l"]
|
||||
[3.61, "o", "[= ]"]
|
||||
[3.61, "o", "\u001B[6D"]
|
||||
[3.703, "o", "\u001B[?25l"]
|
||||
[3.703, "o", "[== ]"]
|
||||
[3.703, "o", "\u001B[6D"]
|
||||
[3.797, "o", "\u001B[?25l"]
|
||||
[3.797, "o", "[=== ]"]
|
||||
[3.797, "o", "\u001B[6D"]
|
||||
[3.875, "o", "\u001B[?25l"]
|
||||
[3.875, "o", "[ ===]"]
|
||||
[3.875, "o", "\u001B[6D"]
|
||||
[3.953, "o", "\u001B[?25l"]
|
||||
[3.953, "o", "[ ==]"]
|
||||
[3.953, "o", "\u001B[6D"]
|
||||
[4.063, "o", "\u001B[?25l"]
|
||||
[4.063, "o", "[ =]"]
|
||||
[4.063, "o", "\u001B[6D"]
|
||||
[4.156, "o", "\u001B[?25l"]
|
||||
[4.156, "o", "[ ]"]
|
||||
[4.156, "o", "\u001B[6D"]
|
||||
[4.25, "o", "\u001B[?25l"]
|
||||
[4.25, "o", "[ =]"]
|
||||
[4.25, "o", "\u001B[6D"]
|
||||
[4.328, "o", "\u001B[?25l"]
|
||||
[4.328, "o", "[ ==]"]
|
||||
[4.328, "o", "\u001B[6D"]
|
||||
[4.406, "o", "\u001B[?25l"]
|
||||
[4.406, "o", "[ ===]"]
|
||||
[4.406, "o", "\u001B[6D"]
|
||||
[4.5, "o", "\u001B[?25l"]
|
||||
[4.5, "o", "[====]"]
|
||||
[4.5, "o", "\u001B[6D"]
|
||||
[4.594, "o", "\u001B[?25l"]
|
||||
[4.594, "o", "[=== ]"]
|
||||
[4.594, "o", "\u001B[6D"]
|
||||
[4.688, "o", "\u001B[?25l"]
|
||||
[4.688, "o", "[== ]"]
|
||||
[4.688, "o", "\u001B[6D"]
|
||||
[4.781, "o", "\u001B[?25l"]
|
||||
[4.781, "o", "[= ]"]
|
||||
[4.781, "o", "\u001B[6D"]
|
||||
[4.86, "o", "\u001B[?25l"]
|
||||
[4.86, "o", "[ ]"]
|
||||
[4.86, "o", "\u001B[6D"]
|
||||
[4.953, "o", "\u001B[?25l"]
|
||||
[4.953, "o", "[= ]"]
|
||||
[4.953, "o", "\u001B[6D"]
|
||||
[5.031, "o", "\u001B[?25l"]
|
||||
[5.031, "o", "[== ]"]
|
||||
[5.031, "o", "\u001B[6D"]
|
||||
[5.125, "o", "\u001B[?25l"]
|
||||
[5.125, "o", "[=== ]"]
|
||||
[5.125, "o", "\u001B[6D"]
|
||||
[5.219, "o", "\u001B[?25l"]
|
||||
[5.219, "o", "[ ===]"]
|
||||
[5.219, "o", "\u001B[6D"]
|
||||
[5.313, "o", "\u001B[?25l"]
|
||||
[5.313, "o", "[ ==]"]
|
||||
[5.313, "o", "\u001B[6D"]
|
||||
[5.422, "o", "\u001B[?25l"]
|
||||
[5.422, "o", "[ =]"]
|
||||
[5.422, "o", "\u001B[6D"]
|
||||
[5.5, "o", "\u001B[?25l"]
|
||||
[5.5, "o", "[ ]"]
|
||||
[5.5, "o", "\u001B[6D"]
|
||||
[5.594, "o", "\u001B[?25l"]
|
||||
[5.594, "o", "[ =]"]
|
||||
[5.594, "o", "\u001B[6D"]
|
||||
[5.672, "o", "\u001B[?25l"]
|
||||
[5.672, "o", "[ ==]"]
|
||||
[5.672, "o", "\u001B[6D"]
|
||||
[5.766, "o", "\u001B[?25l"]
|
||||
[5.766, "o", "[ ===]"]
|
||||
[5.766, "o", "\u001B[6D"]
|
||||
[5.86, "o", "\u001B[?25l"]
|
||||
[5.86, "o", "[====]"]
|
||||
[5.86, "o", "\u001B[6D"]
|
||||
[5.953, "o", "\u001B[?25l"]
|
||||
[5.969, "o", "[=== ]"]
|
||||
[5.969, "o", "\u001B[6D"]
|
||||
[6.063, "o", "\u001B[?25l"]
|
||||
[6.063, "o", "[== ]"]
|
||||
[6.063, "o", "\u001B[6D"]
|
||||
[6.156, "o", "\u001B[?25l"]
|
||||
[6.156, "o", "[= ]"]
|
||||
[6.156, "o", "\u001B[6D"]
|
||||
[6.25, "o", "\u001B[?25l"]
|
||||
[6.25, "o", "[ ]"]
|
||||
[6.25, "o", "\u001B[6D"]
|
||||
[6.328, "o", "\u001B[?25l"]
|
||||
[6.328, "o", "[= ]"]
|
||||
[6.328, "o", "\u001B[6D"]
|
||||
[6.422, "o", "\u001B[?25l"]
|
||||
[6.422, "o", "[== ]"]
|
||||
[6.422, "o", "\u001B[6D"]
|
||||
[6.516, "o", "\u001B[?25l"]
|
||||
[6.516, "o", "[=== ]"]
|
||||
[6.516, "o", "\u001B[6D"]
|
||||
[6.61, "o", "\u001B[?25l"]
|
||||
[6.61, "o", "[ ===]"]
|
||||
[6.61, "o", "\u001B[6D"]
|
||||
[6.703, "o", "\u001B[?25l"]
|
||||
[6.703, "o", "[ ==]"]
|
||||
[6.703, "o", "\u001B[6D"]
|
||||
[6.797, "o", "\u001B[?25l"]
|
||||
[6.797, "o", "[ =]"]
|
||||
[6.797, "o", "\u001B[6D"]
|
||||
[6.891, "o", "\u001B[?25l"]
|
||||
[6.891, "o", "[ ]"]
|
||||
[6.891, "o", "\u001B[6D"]
|
||||
[6.922, "o", " "]
|
||||
[6.922, "o", "\u001B[6D"]
|
||||
[6.922, "o", "\u001B[?25h"]
|
||||
[6.922, "o", "\u001B[32mDone\u001B[0m\r\n"]
|
||||
[6.922, "o", "Blasting into orbit "]
|
||||
[6.922, "o", "\u001B[?25l"]
|
||||
[6.922, "o", "\u2631"]
|
||||
[6.922, "o", "\u001B[1D"]
|
||||
[7.031, "o", "\u001B[?25l"]
|
||||
[7.031, "o", "\u2632"]
|
||||
[7.031, "o", "\u001B[1D"]
|
||||
[7.141, "o", "\u001B[?25l"]
|
||||
[7.141, "o", "\u2634"]
|
||||
[7.141, "o", "\u001B[1D"]
|
||||
[7.25, "o", "\u001B[?25l"]
|
||||
[7.25, "o", "\u2631"]
|
||||
[7.25, "o", "\u001B[1D"]
|
||||
[7.36, "o", "\u001B[?25l"]
|
||||
[7.36, "o", "\u2632"]
|
||||
[7.36, "o", "\u001B[1D"]
|
||||
[7.485, "o", "\u001B[?25l"]
|
||||
[7.485, "o", "\u2634"]
|
||||
[7.485, "o", "\u001B[1D"]
|
||||
[7.594, "o", "\u001B[?25l"]
|
||||
[7.594, "o", "\u2631"]
|
||||
[7.594, "o", "\u001B[1D"]
|
||||
[7.703, "o", "\u001B[?25l"]
|
||||
[7.703, "o", "\u2632"]
|
||||
[7.703, "o", "\u001B[1D"]
|
||||
[7.813, "o", "\u001B[?25l"]
|
||||
[7.813, "o", "\u2634"]
|
||||
[7.813, "o", "\u001B[1D"]
|
||||
[7.922, "o", "\u001B[?25l"]
|
||||
[7.922, "o", "\u2631"]
|
||||
[7.922, "o", "\u001B[1D"]
|
||||
[8.031, "o", "\u001B[?25l"]
|
||||
[8.031, "o", "\u2632"]
|
||||
[8.031, "o", "\u001B[1D"]
|
||||
[8.141, "o", "\u001B[?25l"]
|
||||
[8.141, "o", "\u2634"]
|
||||
[8.141, "o", "\u001B[1D"]
|
||||
[8.25, "o", "\u001B[?25l"]
|
||||
[8.25, "o", "\u2631"]
|
||||
[8.25, "o", "\u001B[1D"]
|
||||
[8.375, "o", "\u001B[?25l"]
|
||||
[8.375, "o", "\u2632"]
|
||||
[8.375, "o", "\u001B[1D"]
|
||||
[8.485, "o", "\u001B[?25l"]
|
||||
[8.485, "o", "\u2634"]
|
||||
[8.485, "o", "\u001B[1D"]
|
||||
[8.594, "o", "\u001B[?25l"]
|
||||
[8.594, "o", "\u2631"]
|
||||
[8.594, "o", "\u001B[1D"]
|
||||
[8.703, "o", "\u001B[?25l"]
|
||||
[8.703, "o", "\u2632"]
|
||||
[8.703, "o", "\u001B[1D"]
|
||||
[8.813, "o", "\u001B[?25l"]
|
||||
[8.813, "o", "\u2634"]
|
||||
[8.813, "o", "\u001B[1D"]
|
||||
[8.938, "o", "\u001B[?25l"]
|
||||
[8.938, "o", "\u2631"]
|
||||
[8.938, "o", "\u001B[1D"]
|
||||
[9.047, "o", "\u001B[?25l"]
|
||||
[9.047, "o", "\u2632"]
|
||||
[9.047, "o", "\u001B[1D"]
|
||||
[9.156, "o", "\u001B[?25l"]
|
||||
[9.156, "o", "\u2634"]
|
||||
[9.156, "o", "\u001B[1D"]
|
||||
[9.266, "o", "\u001B[?25l"]
|
||||
[9.266, "o", "\u2631"]
|
||||
[9.266, "o", "\u001B[1D"]
|
||||
[9.375, "o", "\u001B[?25l"]
|
||||
[9.375, "o", "\u2632"]
|
||||
[9.375, "o", "\u001B[1D"]
|
||||
[9.485, "o", "\u001B[?25l"]
|
||||
[9.485, "o", "\u2634"]
|
||||
[9.485, "o", "\u001B[1D"]
|
||||
[9.594, "o", "\u001B[?25l"]
|
||||
[9.594, "o", "\u2631"]
|
||||
[9.594, "o", "\u001B[1D"]
|
||||
[9.719, "o", "\u001B[?25l"]
|
||||
[9.719, "o", "\u2632"]
|
||||
[9.719, "o", "\u001B[1D"]
|
||||
[9.828, "o", "\u001B[?25l"]
|
||||
[9.828, "o", "\u2634"]
|
||||
[9.828, "o", "\u001B[1D"]
|
||||
[9.938, "o", "\u001B[?25l"]
|
||||
[9.938, "o", "\u2631"]
|
||||
[9.938, "o", "\u001B[1D"]
|
||||
[9.953, "o", " "]
|
||||
[9.953, "o", "\u001B[1D"]
|
||||
[9.953, "o", "\u001B[?25h"]
|
||||
[9.953, "o", "\u001B[31mOh no\u001B[0m\r\n"]
|
||||
|
||||
326
docs/input/assets/casts/await-spinner-rich.cast
Normal file
326
docs/input/assets/casts/await-spinner-rich.cast
Normal file
@@ -0,0 +1,326 @@
|
||||
{"version": 2, "width": 42, "height": 4, "title": "await-spinner (rich)", "env": {"TERM": "Spectre.Console"}}
|
||||
[0, "o", "Loading the rocket ship "]
|
||||
[0, "o", "\u001B[?25l"]
|
||||
[0, "o", "\u280B"]
|
||||
[0, "o", "\u001B[1D"]
|
||||
[0.094, "o", "\u001B[?25l"]
|
||||
[0.094, "o", "\u2819"]
|
||||
[0.094, "o", "\u001B[1D"]
|
||||
[0.172, "o", "\u001B[?25l"]
|
||||
[0.172, "o", "\u2839"]
|
||||
[0.172, "o", "\u001B[1D"]
|
||||
[0.266, "o", "\u001B[?25l"]
|
||||
[0.266, "o", "\u2838"]
|
||||
[0.266, "o", "\u001B[1D"]
|
||||
[0.36, "o", "\u001B[?25l"]
|
||||
[0.36, "o", "\u283C"]
|
||||
[0.36, "o", "\u001B[1D"]
|
||||
[0.453, "o", "\u001B[?25l"]
|
||||
[0.453, "o", "\u2834"]
|
||||
[0.453, "o", "\u001B[1D"]
|
||||
[0.547, "o", "\u001B[?25l"]
|
||||
[0.547, "o", "\u2826"]
|
||||
[0.547, "o", "\u001B[1D"]
|
||||
[0.641, "o", "\u001B[?25l"]
|
||||
[0.641, "o", "\u2827"]
|
||||
[0.641, "o", "\u001B[1D"]
|
||||
[0.719, "o", "\u001B[?25l"]
|
||||
[0.719, "o", "\u2807"]
|
||||
[0.719, "o", "\u001B[1D"]
|
||||
[0.797, "o", "\u001B[?25l"]
|
||||
[0.797, "o", "\u280F"]
|
||||
[0.797, "o", "\u001B[1D"]
|
||||
[0.891, "o", "\u001B[?25l"]
|
||||
[0.891, "o", "\u280B"]
|
||||
[0.891, "o", "\u001B[1D"]
|
||||
[0.969, "o", "\u001B[?25l"]
|
||||
[0.969, "o", "\u2819"]
|
||||
[0.969, "o", "\u001B[1D"]
|
||||
[1.078, "o", "\u001B[?25l"]
|
||||
[1.078, "o", "\u2839"]
|
||||
[1.094, "o", "\u001B[1D"]
|
||||
[1.25, "o", "\u001B[?25l"]
|
||||
[1.25, "o", "\u2838"]
|
||||
[1.266, "o", "\u001B[1D"]
|
||||
[1.407, "o", "\u001B[?25l"]
|
||||
[1.407, "o", "\u283C"]
|
||||
[1.422, "o", "\u001B[1D"]
|
||||
[1.532, "o", "\u001B[?25l"]
|
||||
[1.532, "o", "\u2834"]
|
||||
[1.532, "o", "\u001B[1D"]
|
||||
[1.61, "o", "\u001B[?25l"]
|
||||
[1.61, "o", "\u2826"]
|
||||
[1.61, "o", "\u001B[1D"]
|
||||
[1.703, "o", "\u001B[?25l"]
|
||||
[1.703, "o", "\u2827"]
|
||||
[1.703, "o", "\u001B[1D"]
|
||||
[1.782, "o", "\u001B[?25l"]
|
||||
[1.782, "o", "\u2807"]
|
||||
[1.782, "o", "\u001B[1D"]
|
||||
[1.86, "o", "\u001B[?25l"]
|
||||
[1.86, "o", "\u280F"]
|
||||
[1.86, "o", "\u001B[1D"]
|
||||
[1.953, "o", "\u001B[?25l"]
|
||||
[1.953, "o", "\u280B"]
|
||||
[1.953, "o", "\u001B[1D"]
|
||||
[2.047, "o", "\u001B[?25l"]
|
||||
[2.047, "o", "\u2819"]
|
||||
[2.047, "o", "\u001B[1D"]
|
||||
[2.125, "o", "\u001B[?25l"]
|
||||
[2.125, "o", "\u2839"]
|
||||
[2.125, "o", "\u001B[1D"]
|
||||
[2.219, "o", "\u001B[?25l"]
|
||||
[2.219, "o", "\u2838"]
|
||||
[2.219, "o", "\u001B[1D"]
|
||||
[2.313, "o", "\u001B[?25l"]
|
||||
[2.313, "o", "\u283C"]
|
||||
[2.313, "o", "\u001B[1D"]
|
||||
[2.407, "o", "\u001B[?25l"]
|
||||
[2.407, "o", "\u2834"]
|
||||
[2.407, "o", "\u001B[1D"]
|
||||
[2.5, "o", "\u001B[?25l"]
|
||||
[2.5, "o", "\u2826"]
|
||||
[2.5, "o", "\u001B[1D"]
|
||||
[2.594, "o", "\u001B[?25l"]
|
||||
[2.594, "o", "\u2827"]
|
||||
[2.594, "o", "\u001B[1D"]
|
||||
[2.688, "o", "\u001B[?25l"]
|
||||
[2.688, "o", "\u2807"]
|
||||
[2.688, "o", "\u001B[1D"]
|
||||
[2.782, "o", "\u001B[?25l"]
|
||||
[2.782, "o", "\u280F"]
|
||||
[2.782, "o", "\u001B[1D"]
|
||||
[2.875, "o", "\u001B[?25l"]
|
||||
[2.875, "o", "\u280B"]
|
||||
[2.875, "o", "\u001B[1D"]
|
||||
[2.969, "o", "\u001B[?25l"]
|
||||
[2.969, "o", "\u2819"]
|
||||
[2.969, "o", "\u001B[1D"]
|
||||
[3.063, "o", "\u001B[?25l"]
|
||||
[3.063, "o", "\u2839"]
|
||||
[3.063, "o", "\u001B[1D"]
|
||||
[3.157, "o", "\u001B[?25l"]
|
||||
[3.157, "o", "\u2838"]
|
||||
[3.157, "o", "\u001B[1D"]
|
||||
[3.25, "o", "\u001B[?25l"]
|
||||
[3.25, "o", "\u283C"]
|
||||
[3.25, "o", "\u001B[1D"]
|
||||
[3.344, "o", "\u001B[?25l"]
|
||||
[3.344, "o", "\u2834"]
|
||||
[3.344, "o", "\u001B[1D"]
|
||||
[3.469, "o", "\u001B[?25l"]
|
||||
[3.469, "o", "\u2826"]
|
||||
[3.469, "o", "\u001B[1D"]
|
||||
[3.563, "o", "\u001B[?25l"]
|
||||
[3.563, "o", "\u2827"]
|
||||
[3.563, "o", "\u001B[1D"]
|
||||
[3.563, "o", " "]
|
||||
[3.563, "o", "\u001B[1D"]
|
||||
[3.563, "o", "\u001B[?25h"]
|
||||
[3.563, "o", "\u001B[38;5;2mDone\u001B[0m\r\n"]
|
||||
[3.563, "o", "Firing up the engines "]
|
||||
[3.563, "o", "\u001B[?25l"]
|
||||
[3.563, "o", "[ ]"]
|
||||
[3.563, "o", "\u001B[6D"]
|
||||
[3.672, "o", "\u001B[?25l"]
|
||||
[3.672, "o", "[= ]"]
|
||||
[3.672, "o", "\u001B[6D"]
|
||||
[3.75, "o", "\u001B[?25l"]
|
||||
[3.75, "o", "[== ]"]
|
||||
[3.75, "o", "\u001B[6D"]
|
||||
[3.844, "o", "\u001B[?25l"]
|
||||
[3.844, "o", "[=== ]"]
|
||||
[3.844, "o", "\u001B[6D"]
|
||||
[3.953, "o", "\u001B[?25l"]
|
||||
[3.953, "o", "[ ===]"]
|
||||
[3.953, "o", "\u001B[6D"]
|
||||
[4.047, "o", "\u001B[?25l"]
|
||||
[4.047, "o", "[ ==]"]
|
||||
[4.047, "o", "\u001B[6D"]
|
||||
[4.157, "o", "\u001B[?25l"]
|
||||
[4.157, "o", "[ =]"]
|
||||
[4.157, "o", "\u001B[6D"]
|
||||
[4.25, "o", "\u001B[?25l"]
|
||||
[4.25, "o", "[ ]"]
|
||||
[4.25, "o", "\u001B[6D"]
|
||||
[4.344, "o", "\u001B[?25l"]
|
||||
[4.344, "o", "[ =]"]
|
||||
[4.344, "o", "\u001B[6D"]
|
||||
[4.438, "o", "\u001B[?25l"]
|
||||
[4.438, "o", "[ ==]"]
|
||||
[4.438, "o", "\u001B[6D"]
|
||||
[4.532, "o", "\u001B[?25l"]
|
||||
[4.532, "o", "[ ===]"]
|
||||
[4.532, "o", "\u001B[6D"]
|
||||
[4.625, "o", "\u001B[?25l"]
|
||||
[4.625, "o", "[====]"]
|
||||
[4.625, "o", "\u001B[6D"]
|
||||
[4.719, "o", "\u001B[?25l"]
|
||||
[4.719, "o", "[=== ]"]
|
||||
[4.719, "o", "\u001B[6D"]
|
||||
[4.828, "o", "\u001B[?25l"]
|
||||
[4.844, "o", "[== ]"]
|
||||
[4.86, "o", "\u001B[6D"]
|
||||
[4.953, "o", "\u001B[?25l"]
|
||||
[4.953, "o", "[= ]"]
|
||||
[4.953, "o", "\u001B[6D"]
|
||||
[5.047, "o", "\u001B[?25l"]
|
||||
[5.047, "o", "[ ]"]
|
||||
[5.047, "o", "\u001B[6D"]
|
||||
[5.141, "o", "\u001B[?25l"]
|
||||
[5.141, "o", "[= ]"]
|
||||
[5.141, "o", "\u001B[6D"]
|
||||
[5.235, "o", "\u001B[?25l"]
|
||||
[5.235, "o", "[== ]"]
|
||||
[5.235, "o", "\u001B[6D"]
|
||||
[5.328, "o", "\u001B[?25l"]
|
||||
[5.328, "o", "[=== ]"]
|
||||
[5.328, "o", "\u001B[6D"]
|
||||
[5.422, "o", "\u001B[?25l"]
|
||||
[5.422, "o", "[ ===]"]
|
||||
[5.422, "o", "\u001B[6D"]
|
||||
[5.532, "o", "\u001B[?25l"]
|
||||
[5.532, "o", "[ ==]"]
|
||||
[5.532, "o", "\u001B[6D"]
|
||||
[5.625, "o", "\u001B[?25l"]
|
||||
[5.625, "o", "[ =]"]
|
||||
[5.625, "o", "\u001B[6D"]
|
||||
[5.719, "o", "\u001B[?25l"]
|
||||
[5.719, "o", "[ ]"]
|
||||
[5.719, "o", "\u001B[6D"]
|
||||
[5.813, "o", "\u001B[?25l"]
|
||||
[5.813, "o", "[ =]"]
|
||||
[5.813, "o", "\u001B[6D"]
|
||||
[5.907, "o", "\u001B[?25l"]
|
||||
[5.907, "o", "[ ==]"]
|
||||
[5.907, "o", "\u001B[6D"]
|
||||
[6, "o", "\u001B[?25l"]
|
||||
[6, "o", "[ ===]"]
|
||||
[6, "o", "\u001B[6D"]
|
||||
[6.094, "o", "\u001B[?25l"]
|
||||
[6.094, "o", "[====]"]
|
||||
[6.094, "o", "\u001B[6D"]
|
||||
[6.188, "o", "\u001B[?25l"]
|
||||
[6.188, "o", "[=== ]"]
|
||||
[6.188, "o", "\u001B[6D"]
|
||||
[6.282, "o", "\u001B[?25l"]
|
||||
[6.282, "o", "[== ]"]
|
||||
[6.282, "o", "\u001B[6D"]
|
||||
[6.375, "o", "\u001B[?25l"]
|
||||
[6.375, "o", "[= ]"]
|
||||
[6.375, "o", "\u001B[6D"]
|
||||
[6.453, "o", "\u001B[?25l"]
|
||||
[6.453, "o", "[ ]"]
|
||||
[6.453, "o", "\u001B[6D"]
|
||||
[6.547, "o", "\u001B[?25l"]
|
||||
[6.547, "o", "[= ]"]
|
||||
[6.547, "o", "\u001B[6D"]
|
||||
[6.625, "o", "\u001B[?25l"]
|
||||
[6.625, "o", "[== ]"]
|
||||
[6.625, "o", "\u001B[6D"]
|
||||
[6.703, "o", "\u001B[?25l"]
|
||||
[6.703, "o", "[=== ]"]
|
||||
[6.703, "o", "\u001B[6D"]
|
||||
[6.797, "o", "\u001B[?25l"]
|
||||
[6.797, "o", "[ ===]"]
|
||||
[6.797, "o", "\u001B[6D"]
|
||||
[6.891, "o", "\u001B[?25l"]
|
||||
[6.891, "o", "[ ==]"]
|
||||
[6.891, "o", "\u001B[6D"]
|
||||
[6.969, "o", " "]
|
||||
[6.969, "o", "\u001B[6D"]
|
||||
[6.969, "o", "\u001B[?25h"]
|
||||
[6.969, "o", "\u001B[38;5;2mDone\u001B[0m\r\n"]
|
||||
[6.969, "o", "Blasting into orbit "]
|
||||
[6.969, "o", "\u001B[?25l"]
|
||||
[6.969, "o", "\u2631"]
|
||||
[6.969, "o", "\u001B[1D"]
|
||||
[7.078, "o", "\u001B[?25l"]
|
||||
[7.078, "o", "\u2632"]
|
||||
[7.078, "o", "\u001B[1D"]
|
||||
[7.172, "o", "\u001B[?25l"]
|
||||
[7.172, "o", "\u2634"]
|
||||
[7.172, "o", "\u001B[1D"]
|
||||
[7.282, "o", "\u001B[?25l"]
|
||||
[7.282, "o", "\u2631"]
|
||||
[7.282, "o", "\u001B[1D"]
|
||||
[7.375, "o", "\u001B[?25l"]
|
||||
[7.375, "o", "\u2632"]
|
||||
[7.375, "o", "\u001B[1D"]
|
||||
[7.485, "o", "\u001B[?25l"]
|
||||
[7.485, "o", "\u2634"]
|
||||
[7.485, "o", "\u001B[1D"]
|
||||
[7.594, "o", "\u001B[?25l"]
|
||||
[7.594, "o", "\u2631"]
|
||||
[7.594, "o", "\u001B[1D"]
|
||||
[7.703, "o", "\u001B[?25l"]
|
||||
[7.703, "o", "\u2632"]
|
||||
[7.703, "o", "\u001B[1D"]
|
||||
[7.813, "o", "\u001B[?25l"]
|
||||
[7.813, "o", "\u2634"]
|
||||
[7.813, "o", "\u001B[1D"]
|
||||
[7.922, "o", "\u001B[?25l"]
|
||||
[7.922, "o", "\u2631"]
|
||||
[7.922, "o", "\u001B[1D"]
|
||||
[8.032, "o", "\u001B[?25l"]
|
||||
[8.032, "o", "\u2632"]
|
||||
[8.032, "o", "\u001B[1D"]
|
||||
[8.125, "o", "\u001B[?25l"]
|
||||
[8.125, "o", "\u2634"]
|
||||
[8.125, "o", "\u001B[1D"]
|
||||
[8.235, "o", "\u001B[?25l"]
|
||||
[8.235, "o", "\u2631"]
|
||||
[8.235, "o", "\u001B[1D"]
|
||||
[8.344, "o", "\u001B[?25l"]
|
||||
[8.344, "o", "\u2632"]
|
||||
[8.344, "o", "\u001B[1D"]
|
||||
[8.453, "o", "\u001B[?25l"]
|
||||
[8.453, "o", "\u2634"]
|
||||
[8.453, "o", "\u001B[1D"]
|
||||
[8.563, "o", "\u001B[?25l"]
|
||||
[8.563, "o", "\u2631"]
|
||||
[8.563, "o", "\u001B[1D"]
|
||||
[8.657, "o", "\u001B[?25l"]
|
||||
[8.657, "o", "\u2632"]
|
||||
[8.657, "o", "\u001B[1D"]
|
||||
[8.766, "o", "\u001B[?25l"]
|
||||
[8.766, "o", "\u2634"]
|
||||
[8.766, "o", "\u001B[1D"]
|
||||
[8.86, "o", "\u001B[?25l"]
|
||||
[8.86, "o", "\u2631"]
|
||||
[8.86, "o", "\u001B[1D"]
|
||||
[8.969, "o", "\u001B[?25l"]
|
||||
[8.969, "o", "\u2632"]
|
||||
[8.969, "o", "\u001B[1D"]
|
||||
[9.078, "o", "\u001B[?25l"]
|
||||
[9.078, "o", "\u2634"]
|
||||
[9.078, "o", "\u001B[1D"]
|
||||
[9.203, "o", "\u001B[?25l"]
|
||||
[9.203, "o", "\u2631"]
|
||||
[9.203, "o", "\u001B[1D"]
|
||||
[9.313, "o", "\u001B[?25l"]
|
||||
[9.313, "o", "\u2632"]
|
||||
[9.313, "o", "\u001B[1D"]
|
||||
[9.407, "o", "\u001B[?25l"]
|
||||
[9.407, "o", "\u2634"]
|
||||
[9.407, "o", "\u001B[1D"]
|
||||
[9.516, "o", "\u001B[?25l"]
|
||||
[9.516, "o", "\u2631"]
|
||||
[9.516, "o", "\u001B[1D"]
|
||||
[9.625, "o", "\u001B[?25l"]
|
||||
[9.625, "o", "\u2632"]
|
||||
[9.625, "o", "\u001B[1D"]
|
||||
[9.719, "o", "\u001B[?25l"]
|
||||
[9.719, "o", "\u2634"]
|
||||
[9.735, "o", "\u001B[1D"]
|
||||
[9.828, "o", "\u001B[?25l"]
|
||||
[9.828, "o", "\u2631"]
|
||||
[9.828, "o", "\u001B[1D"]
|
||||
[9.938, "o", "\u001B[?25l"]
|
||||
[9.938, "o", "\u2632"]
|
||||
[9.938, "o", "\u001B[1D"]
|
||||
[10, "o", " "]
|
||||
[10, "o", "\u001B[1D"]
|
||||
[10, "o", "\u001B[?25h"]
|
||||
[10, "o", "\u001B[38;5;9mOh no\u001B[0m\r\n"]
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{"version": 2, "width": 122, "height": 5, "title": "breakdown-chart (plain)", "env": {"TERM": "Spectre.Console"}}
|
||||
{"version": 2, "width": 84, "height": 5, "title": "breakdown-chart (plain)", "env": {"TERM": "Spectre.Console"}}
|
||||
[0, "o", "\u001B[31m\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u001B[0m\u001B[34m\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u001B[0m\u001B[32m\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u001B[0m\u001B[37m\u2588\u2588\u001B[0m\u001B[37m\u2588\u2588\u001B[0m\r\n\u001B[31m\u25A0\u001B[0m SCSS \u001B[37m80\u001B[0m \u001B[34m\u25A0\u001B[0m HTML \u001B[37m28.3\u001B[0m \u001B[32m\u25A0\u001B[0m C# \u001B[37m22.6\u001B[0m \u001B[37m\u25A0\u001B[0m JavaScript \u001B[37m6\u001B[0m \r\n\u001B[37m\u25A0\u001B[0m Ruby \u001B[37m6\u001B[0m \u001B[36m\u25A0\u001B[0m Shell \u001B[37m0.1\u001B[0m \r\n"]
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{"version": 2, "width": 122, "height": 5, "title": "breakdown-chart (rich)", "env": {"TERM": "Spectre.Console"}}
|
||||
{"version": 2, "width": 84, "height": 5, "title": "breakdown-chart (rich)", "env": {"TERM": "Spectre.Console"}}
|
||||
[0, "o", "\u001B[38;5;9m\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u001B[0m\u001B[38;5;12m\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u001B[0m\u001B[38;5;2m\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u001B[0m\u001B[38;5;11m\u2588\u2588\u001B[0m\u001B[38;5;119m\u2588\u2588\u001B[0m\r\n\u001B[38;5;9m\u25A0\u001B[0m SCSS \u001B[38;5;8m80\u001B[0m \u001B[38;5;12m\u25A0\u001B[0m HTML \u001B[38;5;8m28.3\u001B[0m \u001B[38;5;2m\u25A0\u001B[0m C# \u001B[38;5;8m22.6\u001B[0m \u001B[38;5;11m\u25A0\u001B[0m JavaScript \u001B[38;5;8m6\u001B[0m \r\n\u001B[38;5;119m\u25A0\u001B[0m Ruby \u001B[38;5;8m6\u001B[0m \u001B[38;5;14m\u25A0\u001B[0m Shell \u001B[38;5;8m0.1\u001B[0m \r\n"]
|
||||
|
||||
|
||||
43
docs/input/assets/casts/columns-plain.cast
Normal file
43
docs/input/assets/casts/columns-plain.cast
Normal file
@@ -0,0 +1,43 @@
|
||||
{"version": 2, "width": 84, "height": 24, "title": "columns (plain)", "env": {"TERM": "Spectre.Console"}}
|
||||
[0, "o", "\u001B[?25l"]
|
||||
[0.094, "o", "\u001B[1;37mApple\u001B[0m "]
|
||||
[0.297, "o", "\r\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m "]
|
||||
[0.5, "o", "\r\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m "]
|
||||
[0.719, "o", "\r\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m "]
|
||||
[0.922, "o", "\r\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m "]
|
||||
[1.125, "o", "\r\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m "]
|
||||
[1.344, "o", "\r\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m "]
|
||||
[1.563, "o", "\r\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m \u001B[1;37mBreadfruit\u001B[0m"]
|
||||
[1.766, "o", "\r\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m \u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m"]
|
||||
[1.969, "o", "\r\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m \u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m\r\n\u001B[1;37mCherry\u001B[0m "]
|
||||
[2.172, "o", "\r\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m \u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m\r\n\u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m "]
|
||||
[2.375, "o", "\r\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m \u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m\r\n\u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m "]
|
||||
[2.594, "o", "\r\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m \u001B[1;37mBreadfruit\u001B[0m\r\n\u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m "]
|
||||
[2.797, "o", "\r\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m \u001B[1;37mBreadfruit\u001B[0m\r\n\u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m "]
|
||||
[3, "o", "\r\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m \u001B[1;37mBreadfruit\u001B[0m\r\n\u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \u001B[1;37mGrape\u001B[0m "]
|
||||
[3.219, "o", "\r\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m \u001B[1;37mBreadfruit\u001B[0m\r\n\u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m"]
|
||||
[3.422, "o", "\r\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m \u001B[1;37mBreadfruit\u001B[0m\r\n\u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m\r\n\u001B[1;37mJackfruit\u001B[0m "]
|
||||
[3.625, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m "]
|
||||
[3.828, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m "]
|
||||
[4.047, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m "]
|
||||
[4.25, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m "]
|
||||
[4.453, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m "]
|
||||
[4.672, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m "]
|
||||
[4.875, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m "]
|
||||
[5.094, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m "]
|
||||
[5.297, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m \u001B[1;37mMandarine\u001B[0m "]
|
||||
[5.516, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m \u001B[1;37mMandarine\u001B[0m \u001B[1;37mTangerine\u001B[0m "]
|
||||
[5.734, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m \u001B[1;37mMandarine\u001B[0m \u001B[1;37mTangerine\u001B[0m \u001B[1;37mPapaya\u001B[0m "]
|
||||
[5.953, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m \u001B[1;37mMandarine\u001B[0m \u001B[1;37mTangerine\u001B[0m \u001B[1;37mPapaya\u001B[0m \r\n\u001B[1;37mPassionfruit\u001B[0m "]
|
||||
[6.172, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m \u001B[1;37mMandarine\u001B[0m \u001B[1;37mTangerine\u001B[0m \u001B[1;37mPapaya\u001B[0m \r\n\u001B[1;37mPassionfruit\u001B[0m \u001B[1;37mPlum\u001B[0m "]
|
||||
[6.375, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m \u001B[1;37mMandarine\u001B[0m \u001B[1;37mTangerine\u001B[0m \u001B[1;37mPapaya\u001B[0m \r\n\u001B[1;37mPassionfruit\u001B[0m \u001B[1;37mPlum\u001B[0m \u001B[1;37mPineapple\u001B[0m "]
|
||||
[6.594, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m \u001B[1;37mMandarine\u001B[0m \u001B[1;37mTangerine\u001B[0m \u001B[1;37mPapaya\u001B[0m \r\n\u001B[1;37mPassionfruit\u001B[0m \u001B[1;37mPlum\u001B[0m \u001B[1;37mPineapple\u001B[0m \u001B[1;37mPomelo\u001B[0m "]
|
||||
[6.797, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m \u001B[1;37mMandarine\u001B[0m \u001B[1;37mTangerine\u001B[0m \u001B[1;37mPapaya\u001B[0m \r\n\u001B[1;37mPassionfruit\u001B[0m \u001B[1;37mPlum\u001B[0m \u001B[1;37mPineapple\u001B[0m \u001B[1;37mPomelo\u001B[0m \u001B[1;37mRaspberry\u001B[0m "]
|
||||
[7.016, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m \u001B[1;37mMandarine\u001B[0m \u001B[1;37mTangerine\u001B[0m \u001B[1;37mPapaya\u001B[0m \r\n\u001B[1;37mPassionfruit\u001B[0m \u001B[1;37mPlum\u001B[0m \u001B[1;37mPineapple\u001B[0m \u001B[1;37mPomelo\u001B[0m \u001B[1;37mRaspberry\u001B[0m \u001B[1;37mSalmonberry\u001B[0m "]
|
||||
[7.234, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m \u001B[1;37mMandarine\u001B[0m \u001B[1;37mTangerine\u001B[0m \u001B[1;37mPapaya\u001B[0m \r\n\u001B[1;37mPassionfruit\u001B[0m \u001B[1;37mPlum\u001B[0m \u001B[1;37mPineapple\u001B[0m \u001B[1;37mPomelo\u001B[0m \u001B[1;37mRaspberry\u001B[0m \u001B[1;37mSalmonberry\u001B[0m \u001B[1;37mStrawberry\u001B[0m "]
|
||||
[7.438, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m \u001B[1;37mMandarine\u001B[0m \u001B[1;37mTangerine\u001B[0m \u001B[1;37mPapaya\u001B[0m \r\n\u001B[1;37mPassionfruit\u001B[0m \u001B[1;37mPlum\u001B[0m \u001B[1;37mPineapple\u001B[0m \u001B[1;37mPomelo\u001B[0m \u001B[1;37mRaspberry\u001B[0m \u001B[1;37mSalmonberry\u001B[0m \u001B[1;37mStrawberry\u001B[0m \r\n\u001B[1;37mXimenia\u001B[0m "]
|
||||
[7.641, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m \u001B[1;37mMandarine\u001B[0m \u001B[1;37mTangerine\u001B[0m \u001B[1;37mPapaya\u001B[0m \r\n\u001B[1;37mPassionfruit\u001B[0m \u001B[1;37mPlum\u001B[0m \u001B[1;37mPineapple\u001B[0m \u001B[1;37mPomelo\u001B[0m \u001B[1;37mRaspberry\u001B[0m \u001B[1;37mSalmonberry\u001B[0m \u001B[1;37mStrawberry\u001B[0m \r\n\u001B[1;37mXimenia\u001B[0m "]
|
||||
[7.641, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K"]
|
||||
[7.641, "o", "\u001B[?25h"]
|
||||
[7.656, "o", "\u001B[1;37mApple\u001B[0m \u001B[1;37mApricot\u001B[0m \u001B[1;37mAvocado\u001B[0m \u001B[1;37mBanana\u001B[0m \u001B[1;37mBlackberry\u001B[0m \u001B[1;37mBlueberry\u001B[0m \u001B[1;37mBoysenberry\u001B[0m\r\n\u001B[1;37mBreadfruit\u001B[0m \u001B[1;37mCacao\u001B[0m \u001B[1;37mCherry\u001B[0m \u001B[1;37mCloudberry\u001B[0m \u001B[1;37mCoconut\u001B[0m \u001B[1;37mDragonfruit\u001B[0m \u001B[1;37mElderberry\u001B[0m \r\n\u001B[1;37mGrape\u001B[0m \u001B[1;37mGrapefruit\u001B[0m \u001B[1;37mJackfruit\u001B[0m \u001B[1;37mKiwifruit\u001B[0m \u001B[1;37mLemon\u001B[0m \u001B[1;37mLime\u001B[0m \u001B[1;37mMango\u001B[0m \r\n\u001B[1;37mMelon\u001B[0m \u001B[1;37mOrange\u001B[0m \u001B[1;37mBlood orange\u001B[0m \u001B[1;37mClementine\u001B[0m \u001B[1;37mMandarine\u001B[0m \u001B[1;37mTangerine\u001B[0m \u001B[1;37mPapaya\u001B[0m \r\n\u001B[1;37mPassionfruit\u001B[0m \u001B[1;37mPlum\u001B[0m \u001B[1;37mPineapple\u001B[0m \u001B[1;37mPomelo\u001B[0m \u001B[1;37mRaspberry\u001B[0m \u001B[1;37mSalmonberry\u001B[0m \u001B[1;37mStrawberry\u001B[0m \r\n\u001B[1;37mXimenia\u001B[0m \u001B[1;37mYuzu\u001B[0m \r\n"]
|
||||
|
||||
43
docs/input/assets/casts/columns-rich.cast
Normal file
43
docs/input/assets/casts/columns-rich.cast
Normal file
@@ -0,0 +1,43 @@
|
||||
{"version": 2, "width": 84, "height": 24, "title": "columns (rich)", "env": {"TERM": "Spectre.Console"}}
|
||||
[0, "o", "\u001B[?25l"]
|
||||
[0, "o", "\u001B[1;38;5;11mApple\u001B[0m "]
|
||||
[0.219, "o", "\r\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m "]
|
||||
[0.422, "o", "\r\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m "]
|
||||
[0.625, "o", "\r\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m "]
|
||||
[0.828, "o", "\r\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m "]
|
||||
[1.032, "o", "\r\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m "]
|
||||
[1.235, "o", "\r\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m "]
|
||||
[1.438, "o", "\r\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m \u001B[1;38;5;11mBreadfruit\u001B[0m"]
|
||||
[1.641, "o", "\r\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m \u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m"]
|
||||
[1.844, "o", "\r\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m \u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m\r\n\u001B[1;38;5;11mCherry\u001B[0m "]
|
||||
[2.047, "o", "\r\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m \u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m\r\n\u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m "]
|
||||
[2.266, "o", "\r\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m \u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m\r\n\u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m "]
|
||||
[2.485, "o", "\r\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m \u001B[1;38;5;11mBreadfruit\u001B[0m\r\n\u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m "]
|
||||
[2.703, "o", "\r\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m \u001B[1;38;5;11mBreadfruit\u001B[0m\r\n\u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m "]
|
||||
[2.907, "o", "\r\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m \u001B[1;38;5;11mBreadfruit\u001B[0m\r\n\u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \u001B[1;38;5;11mGrape\u001B[0m "]
|
||||
[3.11, "o", "\r\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m \u001B[1;38;5;11mBreadfruit\u001B[0m\r\n\u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m"]
|
||||
[3.313, "o", "\r\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m \u001B[1;38;5;11mBreadfruit\u001B[0m\r\n\u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m\r\n\u001B[1;38;5;11mJackfruit\u001B[0m "]
|
||||
[3.532, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m "]
|
||||
[3.735, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m "]
|
||||
[3.953, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m "]
|
||||
[4.157, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m "]
|
||||
[4.36, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m "]
|
||||
[4.578, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m "]
|
||||
[4.782, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m "]
|
||||
[4.985, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m "]
|
||||
[5.188, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m \u001B[1;38;5;11mMandarine\u001B[0m "]
|
||||
[5.407, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m \u001B[1;38;5;11mMandarine\u001B[0m \u001B[1;38;5;11mTangerine\u001B[0m "]
|
||||
[5.61, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m \u001B[1;38;5;11mMandarine\u001B[0m \u001B[1;38;5;11mTangerine\u001B[0m \u001B[1;38;5;11mPapaya\u001B[0m "]
|
||||
[5.813, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m \u001B[1;38;5;11mMandarine\u001B[0m \u001B[1;38;5;11mTangerine\u001B[0m \u001B[1;38;5;11mPapaya\u001B[0m \r\n\u001B[1;38;5;11mPassionfruit\u001B[0m "]
|
||||
[6.016, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m \u001B[1;38;5;11mMandarine\u001B[0m \u001B[1;38;5;11mTangerine\u001B[0m \u001B[1;38;5;11mPapaya\u001B[0m \r\n\u001B[1;38;5;11mPassionfruit\u001B[0m \u001B[1;38;5;11mPlum\u001B[0m "]
|
||||
[6.219, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m \u001B[1;38;5;11mMandarine\u001B[0m \u001B[1;38;5;11mTangerine\u001B[0m \u001B[1;38;5;11mPapaya\u001B[0m \r\n\u001B[1;38;5;11mPassionfruit\u001B[0m \u001B[1;38;5;11mPlum\u001B[0m \u001B[1;38;5;11mPineapple\u001B[0m "]
|
||||
[6.438, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m \u001B[1;38;5;11mMandarine\u001B[0m \u001B[1;38;5;11mTangerine\u001B[0m \u001B[1;38;5;11mPapaya\u001B[0m \r\n\u001B[1;38;5;11mPassionfruit\u001B[0m \u001B[1;38;5;11mPlum\u001B[0m \u001B[1;38;5;11mPineapple\u001B[0m \u001B[1;38;5;11mPomelo\u001B[0m "]
|
||||
[6.657, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m \u001B[1;38;5;11mMandarine\u001B[0m \u001B[1;38;5;11mTangerine\u001B[0m \u001B[1;38;5;11mPapaya\u001B[0m \r\n\u001B[1;38;5;11mPassionfruit\u001B[0m \u001B[1;38;5;11mPlum\u001B[0m \u001B[1;38;5;11mPineapple\u001B[0m \u001B[1;38;5;11mPomelo\u001B[0m \u001B[1;38;5;11mRaspberry\u001B[0m "]
|
||||
[6.86, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m \u001B[1;38;5;11mMandarine\u001B[0m \u001B[1;38;5;11mTangerine\u001B[0m \u001B[1;38;5;11mPapaya\u001B[0m \r\n\u001B[1;38;5;11mPassionfruit\u001B[0m \u001B[1;38;5;11mPlum\u001B[0m \u001B[1;38;5;11mPineapple\u001B[0m \u001B[1;38;5;11mPomelo\u001B[0m \u001B[1;38;5;11mRaspberry\u001B[0m \u001B[1;38;5;11mSalmonberry\u001B[0m "]
|
||||
[7.063, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m \u001B[1;38;5;11mMandarine\u001B[0m \u001B[1;38;5;11mTangerine\u001B[0m \u001B[1;38;5;11mPapaya\u001B[0m \r\n\u001B[1;38;5;11mPassionfruit\u001B[0m \u001B[1;38;5;11mPlum\u001B[0m \u001B[1;38;5;11mPineapple\u001B[0m \u001B[1;38;5;11mPomelo\u001B[0m \u001B[1;38;5;11mRaspberry\u001B[0m \u001B[1;38;5;11mSalmonberry\u001B[0m \u001B[1;38;5;11mStrawberry\u001B[0m "]
|
||||
[7.266, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m \u001B[1;38;5;11mMandarine\u001B[0m \u001B[1;38;5;11mTangerine\u001B[0m \u001B[1;38;5;11mPapaya\u001B[0m \r\n\u001B[1;38;5;11mPassionfruit\u001B[0m \u001B[1;38;5;11mPlum\u001B[0m \u001B[1;38;5;11mPineapple\u001B[0m \u001B[1;38;5;11mPomelo\u001B[0m \u001B[1;38;5;11mRaspberry\u001B[0m \u001B[1;38;5;11mSalmonberry\u001B[0m \u001B[1;38;5;11mStrawberry\u001B[0m \r\n\u001B[1;38;5;11mXimenia\u001B[0m "]
|
||||
[7.485, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m \u001B[1;38;5;11mMandarine\u001B[0m \u001B[1;38;5;11mTangerine\u001B[0m \u001B[1;38;5;11mPapaya\u001B[0m \r\n\u001B[1;38;5;11mPassionfruit\u001B[0m \u001B[1;38;5;11mPlum\u001B[0m \u001B[1;38;5;11mPineapple\u001B[0m \u001B[1;38;5;11mPomelo\u001B[0m \u001B[1;38;5;11mRaspberry\u001B[0m \u001B[1;38;5;11mSalmonberry\u001B[0m \u001B[1;38;5;11mStrawberry\u001B[0m \r\n\u001B[1;38;5;11mXimenia\u001B[0m "]
|
||||
[7.485, "o", "\r\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K\u001B[1A\u001B[2K"]
|
||||
[7.485, "o", "\u001B[?25h"]
|
||||
[7.485, "o", "\u001B[1;38;5;11mApple\u001B[0m \u001B[1;38;5;11mApricot\u001B[0m \u001B[1;38;5;11mAvocado\u001B[0m \u001B[1;38;5;11mBanana\u001B[0m \u001B[1;38;5;11mBlackberry\u001B[0m \u001B[1;38;5;11mBlueberry\u001B[0m \u001B[1;38;5;11mBoysenberry\u001B[0m\r\n\u001B[1;38;5;11mBreadfruit\u001B[0m \u001B[1;38;5;11mCacao\u001B[0m \u001B[1;38;5;11mCherry\u001B[0m \u001B[1;38;5;11mCloudberry\u001B[0m \u001B[1;38;5;11mCoconut\u001B[0m \u001B[1;38;5;11mDragonfruit\u001B[0m \u001B[1;38;5;11mElderberry\u001B[0m \r\n\u001B[1;38;5;11mGrape\u001B[0m \u001B[1;38;5;11mGrapefruit\u001B[0m \u001B[1;38;5;11mJackfruit\u001B[0m \u001B[1;38;5;11mKiwifruit\u001B[0m \u001B[1;38;5;11mLemon\u001B[0m \u001B[1;38;5;11mLime\u001B[0m \u001B[1;38;5;11mMango\u001B[0m \r\n\u001B[1;38;5;11mMelon\u001B[0m \u001B[1;38;5;11mOrange\u001B[0m \u001B[1;38;5;11mBlood orange\u001B[0m \u001B[1;38;5;11mClementine\u001B[0m \u001B[1;38;5;11mMandarine\u001B[0m \u001B[1;38;5;11mTangerine\u001B[0m \u001B[1;38;5;11mPapaya\u001B[0m \r\n\u001B[1;38;5;11mPassionfruit\u001B[0m \u001B[1;38;5;11mPlum\u001B[0m \u001B[1;38;5;11mPineapple\u001B[0m \u001B[1;38;5;11mPomelo\u001B[0m \u001B[1;38;5;11mRaspberry\u001B[0m \u001B[1;38;5;11mSalmonberry\u001B[0m \u001B[1;38;5;11mStrawberry\u001B[0m \r\n\u001B[1;38;5;11mXimenia\u001B[0m \u001B[1;38;5;11mYuzu\u001B[0m \r\n"]
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{"version": 2, "width": 122, "height": 24, "title": "panel (plain)", "env": {"TERM": "Spectre.Console"}}
|
||||
{"version": 2, "width": 84, "height": 24, "title": "panel (plain)", "env": {"TERM": "Spectre.Console"}}
|
||||
[0, "o", "\u2554\u2550\u2550\u001B[4mPasta Menu\u001B[0m\u2550\u2550\u2557\r\n\u2551 \u2551\r\n\u2551 \u2551\r\n\u2551 \u001B[31mSpaghetti\u001B[0m \u2551\r\n\u2551 \u001B[31mLinguini\u001B[0m \u2551\r\n\u2551 \u001B[31mFettucine\u001B[0m \u2551\r\n\u2551 \u001B[31mTortellini\u001B[0m \u2551\r\n\u2551 \u001B[31mCapellini\u001B[0m \u2551\r\n\u2551 \u001B[31mLasagna\u001B[0m \u2551\r\n\u2551 \u2551\r\n\u2551 \u2551\r\n\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\r\n"]
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{"version": 2, "width": 122, "height": 24, "title": "panel (rich)", "env": {"TERM": "Spectre.Console"}}
|
||||
{"version": 2, "width": 84, "height": 24, "title": "panel (rich)", "env": {"TERM": "Spectre.Console"}}
|
||||
[0, "o", "\u2554\u2550\u2550\u001B[4mPasta Menu\u001B[0m\u2550\u2550\u2557\r\n\u2551 \u2551\r\n\u2551 \u2551\r\n\u2551 \u001B[38;5;9mSpaghetti\u001B[0m \u2551\r\n\u2551 \u001B[38;5;9mLinguini\u001B[0m \u2551\r\n\u2551 \u001B[38;5;9mFettucine\u001B[0m \u2551\r\n\u2551 \u001B[38;5;9mTortellini\u001B[0m \u2551\r\n\u2551 \u001B[38;5;9mCapellini\u001B[0m \u2551\r\n\u2551 \u001B[38;5;9mLasagna\u001B[0m \u2551\r\n\u2551 \u2551\r\n\u2551 \u2551\r\n\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\r\n"]
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ Spectre.Console will tell your terminal to use the color that is configured in t
|
||||
If you are using an 8 or 24-bit color for the foreground text, it is recommended that you also set an appropriate
|
||||
background color to match.
|
||||
|
||||
**Do** escape data when outputting any user input or any external data via Markup using the [`EscapeMarkup`](xref:M:Spectre.Console.Markup.Escape(System.String)) method on the data. Any user input containing `[` or `]` will likely cause a runtime error while rendering otherwise.
|
||||
**Do** escape data when outputting any user input or any external data via Markup using the [`Markup.Escape`](xref:M:Spectre.Console.Markup.Escape(System.String)) method on the data. Any user input containing `[` or `]` will likely cause a runtime error while rendering otherwise.
|
||||
|
||||
**Consider** replacing `Markup` and `MarkupLine` with [`MarkupInterpolated`](xref:M:Spectre.Console.AnsiConsole.MarkupInterpolated(System.FormattableString)) and [`MarkupLineInterpolated`](xref:M:Spectre.Console.AnsiConsole.MarkupLineInterpolated(System.FormattableString)). Both these methods will automatically escape all data in the interpolated string holes. When working with widgets such as the Table and Tree, consider using [`Markup.FromInterpolated`](xref:M:Spectre.Console.Markup.FromInterpolated(System.FormattableString,Spectre.Console.Style)) to generate an `IRenderable` from an interpolated string.
|
||||
|
||||
@@ -85,10 +85,8 @@ on the main thread.
|
||||
### Unit Testing Best Practices
|
||||
|
||||
For testing of console output, Spectre.Console has [`IAnsiConsole`](xref:T:Spectre.Console.IAnsiConsole) that can be
|
||||
injected into your application.
|
||||
The [Spectre.Console.Test](https://www.nuget.org/packages/Spectre.Console.Testing/) contains a set of utilities for
|
||||
capturing the output for verification, either manually or via a tool such
|
||||
as [Verify](https://github.com/VerifyTests/Verify).
|
||||
injected into your application. The [Spectre.Console.Test](https://www.nuget.org/packages/Spectre.Console.Testing/)
|
||||
NuGet package contains utilities for capturing the console output for verification. See the [Unit Testing](cli/unit-testing) page for further guidance.
|
||||
|
||||
### Analyzer for Best Practices
|
||||
|
||||
@@ -96,6 +94,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,
|
||||
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
|
||||
|
||||
Windows Terminal supports Unicode and Emoji. However, the shells such as Powershell and cmd.exe do not.
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
Title: Spectre.Console 0.46 released!
|
||||
Description: .NET 7 support, Layout Widget, JSON rendering
|
||||
Published: 2023-01-10
|
||||
Category: Release Notes
|
||||
Excluded: false
|
||||
---
|
||||
|
||||
Happy new year! 🎉
|
||||
Version 0.46 of Spectre.Console has been released!
|
||||
|
||||
A lot has happened since the last release, but the most notable additions
|
||||
and changes are support for [.NET 7](https://devblogs.microsoft.com/dotnet/announcing-dotnet-7/),
|
||||
the new [Layout](https://spectreconsole.net/widgets/layout) widget, and
|
||||
[rendering of JSON](https://spectreconsole.net/widgets/json). There has also been a lot of long overdue work
|
||||
on the command line argument parser.
|
||||
|
||||
## New Contributors
|
||||
* [@GaryMcD](https://github.com/GaryMcD) made their first contribution in [#961](https://github.com/spectreconsole/spectre.console/pull/961)
|
||||
* [@eduherminio](https://github.com/eduherminio) made their first contribution in [#964](https://github.com/spectreconsole/spectre.console/pull/964)
|
||||
* [@Saalvage](https://github.com/Saalvage) made their first contribution in [#976](https://github.com/spectreconsole/spectre.console/pull/976)
|
||||
* [@BenjaminMichaelis](https://github.com/BenjaminMichaelis) made their first contribution in [#1000](https://github.com/spectreconsole/spectre.console/pull/1000)
|
||||
* [@nilaoda](https://github.com/nilaoda) made their first contribution in [#1012](https://github.com/spectreconsole/spectre.console/pull/1012)
|
||||
* [@picture](https://github.com/picture)-vision made their first contribution in [#1013](https://github.com/spectreconsole/spectre.console/pull/1013)
|
||||
* [@patrickfreilinger](https://github.com/patrickfreilinger) made their first contribution in [#1016](https://github.com/spectreconsole/spectre.console/pull/1016)
|
||||
* [@sowa](https://github.com/sowa)705 made their first contribution in [#1014](https://github.com/spectreconsole/spectre.console/pull/1014)
|
||||
* [@ardalis](https://github.com/ardalis) made their first contribution in [#1021](https://github.com/spectreconsole/spectre.console/pull/1021)
|
||||
* [@Elisha](https://github.com/Elisha)-Aguilera made their first contribution in [#1038](https://github.com/spectreconsole/spectre.console/pull/1038)
|
||||
* [@wguner](https://github.com/wguner) made their first contribution in [#1044](https://github.com/spectreconsole/spectre.console/pull/1044)
|
||||
* [@bcwood](https://github.com/bcwood) made their first contribution in [#1068](https://github.com/spectreconsole/spectre.console/pull/1068)
|
||||
* [@FrankRay](https://github.com/FrankRay)78 made their first contribution in [#1073](https://github.com/spectreconsole/spectre.console/pull/1073)
|
||||
* [@tomkerkhove](https://github.com/tomkerkhove) made their first contribution in [#1089](https://github.com/spectreconsole/spectre.console/pull/1089)
|
||||
* [@ArveSystad](https://github.com/ArveSystad) made their first contribution in [#1090](https://github.com/spectreconsole/spectre.console/pull/1090)
|
||||
* [@maije](https://github.com/maije) made their first contribution in [#1096](https://github.com/spectreconsole/spectre.console/pull/1096)
|
||||
* [@krisrok](https://github.com/krisrok) made their first contribution in [#953](https://github.com/spectreconsole/spectre.console/pull/953)
|
||||
|
||||
## What's changed?
|
||||
* Add support for .NET 7.0 by [@patriksvensson](https://github.com/patriksvensson) in [#1056](https://github.com/spectreconsole/spectre.console/pull/1056)
|
||||
* Add `Layout` widget by [@patriksvensson](https://github.com/patriksvensson) in [#1041](https://github.com/spectreconsole/spectre.console/pull/1041)
|
||||
* Add JSON text renderer by [@patriksvensson](https://github.com/patriksvensson) in [#1086](https://github.com/spectreconsole/spectre.console/pull/1086)
|
||||
* Backward direction of text prompt autocomplete by [@nkochnev](https://github.com/nkochnev) in [#921](https://github.com/spectreconsole/spectre.console/pull/921)
|
||||
* Custom mask for secret by [@GaryMcD](https://github.com/GaryMcD) in [#970](https://github.com/spectreconsole/spectre.console/pull/970)
|
||||
* Allow selections to wrap around by [@Saalvage](https://github.com/Saalvage) in [#976](https://github.com/spectreconsole/spectre.console/pull/976)
|
||||
* Join .NET Foundation by [@patriksvensson](https://github.com/patriksvensson) in [#978](https://github.com/spectreconsole/spectre.console/pull/978)
|
||||
* Adding value: a single semi-colon! by [@johanlindfors](https://github.com/johanlindfors) in [#986](https://github.com/spectreconsole/spectre.console/pull/986)
|
||||
* Fix `@` being used in Figlet font by [@Saalvage](https://github.com/Saalvage) in [#972](https://github.com/spectreconsole/spectre.console/pull/972)
|
||||
* Add new and transferred issues to backlog project by [@patriksvensson](https://github.com/patriksvensson) in [#995](https://github.com/spectreconsole/spectre.console/pull/995)
|
||||
* Pin SDK due to a bug in .NET 6.0.401 by [@patriksvensson](https://github.com/patriksvensson) in [#1011](https://github.com/spectreconsole/spectre.console/pull/1011)
|
||||
* Remove period trimming by [@BenjaminMichaelis](https://github.com/BenjaminMichaelis) in [#1008](https://github.com/spectreconsole/spectre.console/pull/1008)
|
||||
* Allow `PACKET` key on MultiSelectionPrompt by [@nilaoda](https://github.com/nilaoda) in [#1012](https://github.com/spectreconsole/spectre.console/pull/1012)
|
||||
* Added Suckless Simple Terminal to list of ANSI terminals by [@picture](https://github.com/picture)-vision in [#1013](https://github.com/spectreconsole/spectre.console/pull/1013)
|
||||
* Add culture option to `TypeConverterHelper`, `TextPrompt` and `AnsiConsole` by [@sowa](https://github.com/sowa)705 in [#1014](https://github.com/spectreconsole/spectre.console/pull/1014)
|
||||
* Minor typo fixes by [@ardalis](https://github.com/ardalis) in [#1021](https://github.com/spectreconsole/spectre.console/pull/1021)
|
||||
* Alignment fixes by [@patriksvensson](https://github.com/patriksvensson) in [#1066](https://github.com/spectreconsole/spectre.console/pull/1066)
|
||||
* `IndexOf` replaced by Count at Add method - Performance issue #975 fixed by [@maije](https://github.com/maije) in [#1096](https://github.com/spectreconsole/spectre.console/pull/1096)
|
||||
* Modified tokenizer not to break on on `]]]` at the end of a style by [@nils](https://github.com/nils)-a in [#1027](https://github.com/spectreconsole/spectre.console/pull/1027)
|
||||
* Command line argument parsing improvements by [@FrankRay](https://github.com/FrankRay)78 in [#1048](https://github.com/spectreconsole/spectre.console/pull/1048)
|
||||
* Show help for default command by [@krisrok](https://github.com/krisrok) in [#953](https://github.com/spectreconsole/spectre.console/pull/953)
|
||||
* Automatically display default values of options in the help page by @0xced in [#1032](https://github.com/spectreconsole/spectre.console/pull/1032)
|
||||
|
||||
## Documentation updates
|
||||
* Add link to documentation in README by [@ardalis](https://github.com/ardalis) in [#1030](https://github.com/spectreconsole/spectre.console/pull/1030)
|
||||
* Update `.NET 5` references in docs by [@eduherminio](https://github.com/eduherminio) in [#964](https://github.com/spectreconsole/spectre.console/pull/964)
|
||||
* Blog date fix by [@phil](https://github.com/phil)-scott-78 in [#963](https://github.com/spectreconsole/spectre.console/pull/963)
|
||||
* Update sponsors by [@tomkerkhove](https://github.com/tomkerkhove) in [#1089](https://github.com/spectreconsole/spectre.console/pull/1089)
|
||||
* Inline `CommandArgument` required/optional style in template parameter docs by [@ArveSystad](https://github.com/ArveSystad) in [#1090](https://github.com/spectreconsole/spectre.console/pull/1090)
|
||||
* Add documentation for `BreakdownChart` by [@BenjaminMichaelis](https://github.com/BenjaminMichaelis) in [#1000](https://github.com/spectreconsole/spectre.console/pull/1000)
|
||||
* Create `Panel` documentation by [@patrickfreilinger](https://github.com/patrickfreilinger) in [#1016](https://github.com/spectreconsole/spectre.console/pull/1016)
|
||||
* Added details for using links within markup. by [@GaryMcD](https://github.com/GaryMcD) in [#961](https://github.com/spectreconsole/spectre.console/pull/961)
|
||||
* Added documentation for `Rows` widget by [@Elisha](https://github.com/Elisha)-Aguilera in [#1038](https://github.com/spectreconsole/spectre.console/pull/1038)
|
||||
* Added documentation guide for `Grid` widget by [@Elisha](https://github.com/Elisha)-Aguilera in [#1043](https://github.com/spectreconsole/spectre.console/pull/1043)
|
||||
* Added documentation guide for the `Padder` widget by [@Elisha](https://github.com/Elisha)-Aguilera in [#1046](https://github.com/spectreconsole/spectre.console/pull/1046)
|
||||
* Created a `Columns` widget documentation by [@wguner](https://github.com/wguner) in [#1044](https://github.com/spectreconsole/spectre.console/pull/1044)
|
||||
* Fixed typo in `Panel` documentation [@bcwood](https://github.com/bcwood) in [#1068](https://github.com/spectreconsole/spectre.console/pull/1068)
|
||||
* Clarified the license for `SixLabors.ImageSharp` by [@FrankRay](https://github.com/FrankRay)78 in [#1073](https://github.com/spectreconsole/spectre.console/pull/1073)
|
||||
* Add documentation for `Layout` by [@patriksvensson](https://github.com/patriksvensson) in [#1127](https://github.com/spectreconsole/spectre.console/pull/1127)
|
||||
|
||||
## Dependencies
|
||||
* Update dependency `Wcwidth.Sources` to `v1` by [@renovate](https://github.com/renovate) in [#969](https://github.com/spectreconsole/spectre.console/pull/969)
|
||||
* Update `actions/setup-dotnet` action to `v3` by [@renovate](https://github.com/renovate) in [#982](https://github.com/spectreconsole/spectre.console/pull/982)
|
||||
* Update dependency `Microsoft.NET.Test.Sdk` to `v17.3.2` by [@renovate](https://github.com/renovate) in [#977](https://github.com/spectreconsole/spectre.console/pull/977)
|
||||
* Update dependency `cake.tool` to `v2.3.0` by [@renovate](https://github.com/renovate) in [#1015](https://github.com/spectreconsole/spectre.console/pull/1015)
|
||||
@@ -0,0 +1,48 @@
|
||||
Title: Spectre.Console 0.47 released!
|
||||
Description: Alacritty terminal support, command line improvements
|
||||
Published: 2023-05-19
|
||||
Category: Release Notes
|
||||
Excluded: false
|
||||
---
|
||||
|
||||
Version 0.47 of Spectre.Console has been released!
|
||||
|
||||
There are a lot of fixes and improvements in this release, the most noteworthy changes being support for the [Alacritty](https://github.com/alacritty/alacritty) terminal and continued improvements to command line parsing.
|
||||
|
||||
Thank you to all contributers.
|
||||
|
||||
## New Contributors
|
||||
* [@wbaldoumas](https://github.com/wbaldoumas) made their first contribution in [#1143](https://github.com/spectreconsole/spectre.console/pull/1143)
|
||||
* [@MartinZikmund](https://github.com/MartinZikmund) made their first contribution in [#1151](https://github.com/spectreconsole/spectre.console/pull/1151)
|
||||
* [@ilyahryapko](https://github.com/ilyahryapko) made their first contribution in [#1131](https://github.com/spectreconsole/spectre.console/pull/1131)
|
||||
* [@meziantou](https://github.com/meziantou) made their first contribution in [#1174](https://github.com/spectreconsole/spectre.console/pull/1174)
|
||||
* [@MaxAtoms](https://github.com/MaxAtoms) made their first contribution in [#1211](https://github.com/spectreconsole/spectre.console/pull/1211)
|
||||
* [@phillip-haydon](https://github.com/phillip-haydon) made their first contribution in [#1218](https://github.com/spectreconsole/spectre.console/pull/1218)
|
||||
|
||||
## What's Changed
|
||||
* Add Alacritty to the supported terminals in AnsiDetector by [@MaxAtoms](https://github.com/MaxAtoms) in [#1211](https://github.com/spectreconsole/spectre.console/pull/1211)
|
||||
* Add an implicit operator to convert from Color to Style by [@0xced](https://github.com/0xced) in [#1160](https://github.com/spectreconsole/spectre.console/pull/1160)
|
||||
* Allow case-insensitive confirmation prompt by [@MartinZikmund](https://github.com/MartinZikmund) in [#1151](https://github.com/spectreconsole/spectre.console/pull/1151)
|
||||
* Allow configuration of confirmation prompt comparison via `StringComparer` by [@MartinZikmund](https://github.com/MartinZikmund) in [#1161](https://github.com/spectreconsole/spectre.console/pull/1161)
|
||||
* Do not register analyzer if SpectreConsole is not available in the current compilation by [@meziantou](https://github.com/meziantou) in [#1172](https://github.com/spectreconsole/spectre.console/pull/1172)
|
||||
* Ensure correct comparer is used for `TextPrompt` by [@MartinZikmund](https://github.com/MartinZikmund) in [#1152](https://github.com/spectreconsole/spectre.console/pull/1152)
|
||||
* Forward CancellationToken to GetOperation by [@meziantou](https://github.com/meziantou) in [#1173](https://github.com/spectreconsole/spectre.console/pull/1173)
|
||||
* Fix minor typo in Prompt example by [@Frassle](https://github.com/Frassle) in [#1183](https://github.com/spectreconsole/spectre.console/pull/1183)
|
||||
* Fix coconut spelling by [@phillip-haydon](https://github.com/phillip-haydon) in [#1218](https://github.com/spectreconsole/spectre.console/pull/1218)
|
||||
* Improve conversion error messages by [@0xced](https://github.com/0xced) in [#1141](https://github.com/spectreconsole/spectre.console/pull/1141)
|
||||
* Make the code fix more robust and detect more symbols of type IAnsiConsole by [@meziantou](https://github.com/meziantou) in [#1169](https://github.com/spectreconsole/spectre.console/pull/1169)
|
||||
* Minor Refactorings by [@Elisha-Aguilera](https://github.com/Elisha-Aguilera) in [#1081](https://github.com/spectreconsole/spectre.console/pull/1081)
|
||||
* Simplify access to the SemanticModel in analyzers by [@meziantou](https://github.com/meziantou) in [#1167](https://github.com/spectreconsole/spectre.console/pull/1167)
|
||||
* Use SymbolEqualityComparer.Default when possible by [@meziantou](https://github.com/meziantou) in [#1171](https://github.com/spectreconsole/spectre.console/pull/1171)
|
||||
* Use StringComparison.Ordinal instead of culture-sensitive comparisons by [@meziantou](https://github.com/meziantou) in [#1174](https://github.com/spectreconsole/spectre.console/pull/1174)
|
||||
|
||||
## Command line updates
|
||||
* Add possibility to set description and/or data for the default command by [@0xced](https://github.com/0xced) in [#1091](https://github.com/spectreconsole/spectre.console/pull/1091)
|
||||
* Add support for converting command parameters into FileInfo and DirectoryInfo by [@0xced](https://github.com/0xced) in [#1145](https://github.com/spectreconsole/spectre.console/pull/1145)
|
||||
* Add support for arrays in \[DefaultValue\] attributes by [@0xced](https://github.com/0xced) in [#1164](https://github.com/spectreconsole/spectre.console/pull/1164)
|
||||
* Add ability to pass example args using `params` syntax by [@seclerp](https://github.com/seclerp) in [#1166](https://github.com/spectreconsole/spectre.console/pull/1166)
|
||||
* Alias for branches by [@ilyahryapko](https://github.com/ilyahryapko) in [#1131](https://github.com/spectreconsole/spectre.console/pull/1131)
|
||||
* Command line improvements by [@FrankRay78](https://github.com/FrankRay78) in [#1103](https://github.com/spectreconsole/spectre.console/pull/1103)
|
||||
|
||||
## Documentation updates
|
||||
* Alignment => Justification Docs Fixes by [@wbaldoumas](https://github.com/wbaldoumas) in [#1143](https://github.com/spectreconsole/spectre.console/pull/1143)
|
||||
@@ -0,0 +1,63 @@
|
||||
Title: Spectre.Console 0.48 released!
|
||||
Description: .NET 8, custom help providers, and more!
|
||||
Published: 2023-11-22
|
||||
Category: Release Notes
|
||||
Excluded: false
|
||||
---
|
||||
|
||||
Version 0.48 of Spectre.Console has been released!
|
||||
|
||||
Several rendering issues have been addressed, such as fixing problems related to rendering inside status causing corrupt output, avoiding exceptions on Rows with no children, as well as addressing rendering bugs in TextPath.
|
||||
|
||||
New features have been added, such as the ability to show separators between table rows. Other notable additions include progress bar header and footer support, customizable (and localizable) help providers, and the option to style text and confirmation prompts.
|
||||
|
||||
# New Contributors
|
||||
|
||||
* [@icalvo](https://github.com/icalvo) made their first contribution in [#1215](https://github.com/spectreconsole/spectre.console/pull/1215)
|
||||
* [@fredrikbentzen](https://github.com/fredrikbentzen) made their first contribution in [#1132](https://github.com/spectreconsole/spectre.console/pull/1132)
|
||||
* [@jeppevammenkristensen](https://github.com/jeppevammenkristensen) made their first contribution in [#1241](https://github.com/spectreconsole/spectre.console/pull/1241)
|
||||
* [@tomaszprasolek](https://github.com/tomaszprasolek) made their first contribution in [#1257](https://github.com/spectreconsole/spectre.console/pull/1257)
|
||||
* [@olabacker](https://github.com/olabacker) made their first contribution in [#1302](https://github.com/spectreconsole/spectre.console/pull/1302)
|
||||
* [@AndrewRathbun](https://github.com/AndrewRathbun) made their first contribution in [#1315](https://github.com/spectreconsole/spectre.console/pull/1315)
|
||||
|
||||
|
||||
# What's Changed
|
||||
|
||||
## Rendering
|
||||
|
||||
* 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](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](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](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)
|
||||
* 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)
|
||||
* Render tables with zero-width columns by [@Frassle](https://github.com/Frassle) in [#1197](https://github.com/spectreconsole/spectre.console/pull/1197)
|
||||
* Fix figlet centering possibly throwing due to negative size by [@olabacker](https://github.com/olabacker) in [#1302](https://github.com/spectreconsole/spectre.console/pull/1302)
|
||||
* Add option to show separator between table rows by [@patriksvensson](https://github.com/patriksvensson) in [#1304](https://github.com/spectreconsole/spectre.console/pull/1304)
|
||||
* Enable setting the color of the values in a `BreakdownChart` by [@nils](https://github.com/nils)-a in [#1303](https://github.com/spectreconsole/spectre.console/pull/1303)
|
||||
* Progress bar header and footer by [@phil](https://github.com/phil)-scott-78 in [#1262](https://github.com/spectreconsole/spectre.console/pull/1262)
|
||||
* Add an example showing the decorations off by [@Frassle](https://github.com/Frassle) in [#1191](https://github.com/spectreconsole/spectre.console/pull/1191)
|
||||
* Fixes `TextPath` rendering bugs by [@patriksvensson](https://github.com/patriksvensson) in [#1308](https://github.com/spectreconsole/spectre.console/pull/1308)
|
||||
* Fix greedy row measure by [@nils](https://github.com/nils)-a in [#1338](https://github.com/spectreconsole/spectre.console/pull/1338)
|
||||
* Fix `AnsiConsoleOutput` safe height by [@0xced](https://github.com/0xced) in [#1358](https://github.com/spectreconsole/spectre.console/pull/1358)
|
||||
* Allow passing a nullable style in `DefaultValueStyle()` and `ChoicesStyle()` by [@0xced](https://github.com/0xced) in [#1359](https://github.com/spectreconsole/spectre.console/pull/1359)
|
||||
* Allow `ConfirmationPrompt` Styling by [@wbaldoumas](https://github.com/wbaldoumas) in [#1210](https://github.com/spectreconsole/spectre.console/pull/1210)
|
||||
|
||||
## CLI
|
||||
* 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](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)
|
||||
* 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)
|
||||
* Add support for localisation in help provider by [@FrankRay78](https://github.com/FrankRay78) in [#1349](https://github.com/spectreconsole/spectre.console/pull/1349)
|
||||
* Fix DefaultValue for `FileInfo` and `DirectoryInfo` by [@0xced](https://github.com/0xced) in [#1238](https://github.com/spectreconsole/spectre.console/pull/1238)
|
||||
|
||||
## Documentation & Samples
|
||||
* Added a minimal PR template by [@nils](https://github.com/nils)-a in [#1318](https://github.com/spectreconsole/spectre.console/pull/1318)
|
||||
* Fix typo in `showcase` sample by [@AndrewRathbun](https://github.com/AndrewRathbun) in [#1315](https://github.com/spectreconsole/spectre.console/pull/1315)
|
||||
* Update `columns` sample to showcase nicer data by [@nils](https://github.com/nils)-a in [#1295](https://github.com/spectreconsole/spectre.console/pull/1295)
|
||||
* Change all `SetErrorHandler` to `SetExceptionHandler` by [@nils](https://github.com/nils)-a in [#1298](https://github.com/spectreconsole/spectre.console/pull/1298)
|
||||
|
||||
## Other stuff
|
||||
* Ensure the `Generator` project compiles by [@patriksvensson](https://github.com/patriksvensson) in [#1371](https://github.com/spectreconsole/spectre.console/pull/1371)
|
||||
@@ -0,0 +1,55 @@
|
||||
Title: Spectre.Console 0.49 released!
|
||||
Description: Bug fixes, bug fixes, bug fixes
|
||||
Published: 2024-04-23
|
||||
Category: Release Notes
|
||||
Excluded: false
|
||||
---
|
||||
|
||||
Version 0.49 of Spectre.Console has been released!
|
||||
|
||||
## New Contributors
|
||||
* @baronfel made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1425
|
||||
* @DarqueWarrior made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1431
|
||||
* @tonycknight made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1435
|
||||
* @caesay made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1439
|
||||
* @jsheely made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1414
|
||||
* @danielcweber made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1456
|
||||
* @martincostello made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1477
|
||||
* @slang25 made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1289
|
||||
* @thomhurst made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1250
|
||||
* @gerardog made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1489
|
||||
* @yenneferofvengerberg made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1503
|
||||
* @BlazeFace made their first contribution in https://github.com/spectreconsole/spectre.console/pull/1509
|
||||
|
||||
## Changes
|
||||
|
||||
* Cleanup line endings by @nils-a in https://github.com/spectreconsole/spectre.console/pull/1381
|
||||
* Added Spectre.Console.Cli to quick-start. by @nils-a in https://github.com/spectreconsole/spectre.console/pull/1413
|
||||
* Fix rendering of ListPrompt for odd pageSizes by @nils-a in https://github.com/spectreconsole/spectre.console/pull/1365
|
||||
* Remove mandelbrot example due to conflicting license by @patriksvensson in https://github.com/spectreconsole/spectre.console/pull/1426
|
||||
* Allow specifying a property to ignore the use of build-time packages for versioning and analysis by @baronfel in https://github.com/spectreconsole/spectre.console/pull/1425
|
||||
* Add the possibility to register multiple interceptors by @nils-a in https://github.com/spectreconsole/spectre.console/pull/1412
|
||||
* Added the ITypeResolver to the ExceptionHandler by @nils-a in https://github.com/spectreconsole/spectre.console/pull/1411
|
||||
* Updated typo in commandApp.md by @DarqueWarrior in https://github.com/spectreconsole/spectre.console/pull/1431
|
||||
* Command with -v displays app version instead of executing the command by @FrankRay78 in https://github.com/spectreconsole/spectre.console/pull/1427
|
||||
* HelpProvider colors should be configurable by @FrankRay78 in https://github.com/spectreconsole/spectre.console/pull/1408
|
||||
* Direct contributors to the current CONTRIBUTING.md by @tonycknight in https://github.com/spectreconsole/spectre.console/pull/1435
|
||||
* Fix deadlock when cancelling prompts by @caesay in https://github.com/spectreconsole/spectre.console/pull/1439
|
||||
* Add progress bar value formatter by @jsheely in https://github.com/spectreconsole/spectre.console/pull/1414
|
||||
* Update dependencies and do some clean-up by @patriksvensson in https://github.com/spectreconsole/spectre.console/pull/1440
|
||||
* Delete [UsesVerify], which has become obsolete through the latest update. by @danielcweber in https://github.com/spectreconsole/spectre.console/pull/1456
|
||||
* Don't erase secret prompt text upon backspace when mask is null by @danielcweber in https://github.com/spectreconsole/spectre.console/pull/1458
|
||||
* Update dependencies to the latest version by @patriksvensson in https://github.com/spectreconsole/spectre.console/pull/1459
|
||||
* Automatically register command settings by @patriksvensson in https://github.com/spectreconsole/spectre.console/pull/1463
|
||||
* Remove [DebuggerDisplay] from Paragraph by @martincostello in https://github.com/spectreconsole/spectre.console/pull/1477
|
||||
* Selection Prompt Search by @slang25 in https://github.com/spectreconsole/spectre.console/pull/1289
|
||||
* Update dependency SixLabors.ImageSharp to v3.1.3 by @renovate in https://github.com/spectreconsole/spectre.console/pull/1486
|
||||
* Positioned Progress Tasks - Before or After Other Tasks by @thomhurst in https://github.com/spectreconsole/spectre.console/pull/1250
|
||||
* Added NoStackTrace to ExceptionFormats by @gerardog in https://github.com/spectreconsole/spectre.console/pull/1489
|
||||
* Pipe character for listing options (issue 1434) by @FrankRay78 in https://github.com/spectreconsole/spectre.console/pull/1498
|
||||
* Improve XmlDoc output by @yenneferofvengerberg in https://github.com/spectreconsole/spectre.console/pull/1503
|
||||
* Revert 71a5d830 to undo flickering regression by @phil-scott-78 in https://github.com/spectreconsole/spectre.console/pull/1504
|
||||
* AddDelegate uses an abstract type when used in a branch by @BlazeFace in https://github.com/spectreconsole/spectre.console/pull/1509
|
||||
* Missing Separator When Headers are Hidden by @BlazeFace in https://github.com/spectreconsole/spectre.console/pull/1513
|
||||
* Expose raw arguments on the command context by @patriksvensson in https://github.com/spectreconsole/spectre.console/pull/1523
|
||||
* Add token representation to remaining arguments by @patriksvensson in https://github.com/spectreconsole/spectre.console/pull/1525
|
||||
@@ -0,0 +1,71 @@
|
||||
Title: Spectre.Console 0.50 released!
|
||||
Description: Now with 25% less lead!
|
||||
Published: 2025-04-08
|
||||
Category: Release Notes
|
||||
Excluded: false
|
||||
---
|
||||
|
||||
Version 0.50 of Spectre.Console has been released!
|
||||
|
||||
## New Contributors
|
||||
|
||||
* [@Kissaki](https://github.com/Kissaki) made their first contribution in [#1575](https://github.com/spectreconsole/spectre.console/pull/1575)
|
||||
* [@z4ryy](https://github.com/z4ryy) made their first contribution in [#1590](https://github.com/spectreconsole/spectre.console/pull/1590)
|
||||
* [@TonWin618](https://github.com/TonWin618) made their first contribution in [#1595](https://github.com/spectreconsole/spectre.console/pull/1595)
|
||||
* [@KirillOsenkov](https://github.com/KirillOsenkov) made their first contribution in [#1623](https://github.com/spectreconsole/spectre.console/pull/1623)
|
||||
* [@davide-pi](https://github.com/davide-pi) made their first contribution in [#1246](https://github.com/spectreconsole/spectre.console/pull/1246)
|
||||
* [@armanossiloko](https://github.com/armanossiloko) made their first contribution in [#1668](https://github.com/spectreconsole/spectre.console/pull/1668)
|
||||
* [@PascalSenn](https://github.com/PascalSenn) made their first contribution in [#1687](https://github.com/spectreconsole/spectre.console/pull/1687)
|
||||
* [@tpill90](https://github.com/tpill90) made their first contribution in [#904](https://github.com/spectreconsole/spectre.console/pull/904)
|
||||
* [@tmds](https://github.com/tmds) made their first contribution in [#1194](https://github.com/spectreconsole/spectre.console/pull/1194)
|
||||
* [@TheMarteh](https://github.com/TheMarteh) made their first contribution in [#1708](https://github.com/spectreconsole/spectre.console/pull/1708)
|
||||
* [@Tolitech](https://github.com/Tolitech) made their first contribution in [#1717](https://github.com/spectreconsole/spectre.console/pull/1717)
|
||||
* [@TheTonttu](https://github.com/TheTonttu) made their first contribution in [#1740](https://github.com/spectreconsole/spectre.console/pull/1740)
|
||||
* [@byte2pixel](https://github.com/byte2pixel) made their first contribution in [#1762](https://github.com/spectreconsole/spectre.console/pull/1762)
|
||||
* [@Moustafaa91](https://github.com/Moustafaa91) made their first contribution in [#1779](https://github.com/spectreconsole/spectre.console/pull/1779)
|
||||
|
||||
### General
|
||||
|
||||
* Strong name the assemblies by [@KirillOsenkov](https://github.com/KirillOsenkov) in [#1623](https://github.com/spectreconsole/spectre.console/pull/1623)
|
||||
* Update MSDN link to learn.microsoft.com by [@Kissaki](https://github.com/Kissaki) in [#1575](https://github.com/spectreconsole/spectre.console/pull/1575)
|
||||
* Add spanish translation for help strings by [@kzu](https://github.com/kzu) in [#1597](https://github.com/spectreconsole/spectre.console/pull/1597)
|
||||
* Update documentation: add example for the Text Prompt usage by [@davide-pi](https://github.com/davide-pi) in [#1636](https://github.com/spectreconsole/spectre.console/pull/1636)
|
||||
* Fix typos xml docs by [@devlead](https://github.com/devlead) in [#1684](https://github.com/spectreconsole/spectre.console/pull/1684)
|
||||
* Upgrade SixLabors.ImageSharp to 3.1.7 by [@Moustafaa91](https://github.com/Moustafaa91) in [#1779](https://github.com/spectreconsole/spectre.console/pull/1779)
|
||||
|
||||
### Console
|
||||
|
||||
* AOT Support for Spectre.Console by [@phil-scott-78](https://github.com/phil-scott-78) in [#1690](https://github.com/spectreconsole/spectre.console/pull/1690)
|
||||
* Make method reference to Markup.Escape more obvious by [@Kissaki](https://github.com/Kissaki) in [#1574](https://github.com/spectreconsole/spectre.console/pull/1574)
|
||||
* Fix `HtmlEncoder` Incorrectly Applying Italics to Bold Text by [@z4ryy](https://github.com/z4ryy) in [#1590](https://github.com/spectreconsole/spectre.console/pull/1590)
|
||||
* Fix Console Display Issue with Deleting Wide Characters by [@TonWin618](https://github.com/TonWin618) in [#1595](https://github.com/spectreconsole/spectre.console/pull/1595)
|
||||
* Fix search bug in prompt related to custom item types by [@patriksvensson](https://github.com/patriksvensson) in [#1627](https://github.com/spectreconsole/spectre.console/pull/1627)
|
||||
* Cleanup the prompt tests by [@0xced](https://github.com/0xced) in [#1635](https://github.com/spectreconsole/spectre.console/pull/1635)
|
||||
* Add custom style for each calendar event by [@davide-pi](https://github.com/davide-pi) in [#1246](https://github.com/spectreconsole/spectre.console/pull/1246)
|
||||
* Fix tree expansion bug by [@davide-pi](https://github.com/davide-pi) in [#1245](https://github.com/spectreconsole/spectre.console/pull/1245)
|
||||
* Enhance the style of the checkboxes for multi-selection by [@davide-pi](https://github.com/davide-pi) in [#1244](https://github.com/spectreconsole/spectre.console/pull/1244)
|
||||
* Improve exception if a (multi)selection prompt is used incorrectly by [@0xced](https://github.com/0xced) in [#1637](https://github.com/spectreconsole/spectre.console/pull/1637)
|
||||
* Fix incorrect panel height calculation in complex layout by [@BlazeFace](https://github.com/BlazeFace) in [#1514](https://github.com/spectreconsole/spectre.console/pull/1514)
|
||||
* Adding Enricher for Azure Pipelines by [@BlazeFace](https://github.com/BlazeFace) in [#1675](https://github.com/spectreconsole/spectre.console/pull/1675)
|
||||
* Added hex color conversion by [@jsheely](https://github.com/jsheely) in [#1432](https://github.com/spectreconsole/spectre.console/pull/1432)
|
||||
* Fixed type in Segment description by [@PascalSenn](https://github.com/PascalSenn) in [#1687](https://github.com/spectreconsole/spectre.console/pull/1687)
|
||||
* Adding TransferSpeedColumn configuration to display bits/bytes + binary/decimal prefixes by [@tpill90](https://github.com/tpill90) in [#904](https://github.com/spectreconsole/spectre.console/pull/904)
|
||||
* Changes Emoji dictionary to OrdinalIgnoreCase for performance by [@phil-scott-78](https://github.com/phil-scott-78) in [#1691](https://github.com/spectreconsole/spectre.console/pull/1691)
|
||||
* ProgressTask.GetPercentage() returns 100 when max value is 0 by [@FrankRay78](https://github.com/FrankRay78) in [#1694](https://github.com/spectreconsole/spectre.console/pull/1694)
|
||||
* Async overloads for AnsiConsole Prompt/Ask/Confirm. by [@tmds](https://github.com/tmds) in [#1194](https://github.com/spectreconsole/spectre.console/pull/1194)
|
||||
* Support 3-digit hex codes in markup by [@TheMarteh](https://github.com/TheMarteh) in [#1708](https://github.com/spectreconsole/spectre.console/pull/1708)
|
||||
* Add async spinner extension methods and related documentation by [@phil-scott-78](https://github.com/phil-scott-78) in [#1747](https://github.com/spectreconsole/spectre.console/pull/1747)
|
||||
* Fix generic exception formatting by [@0xced](https://github.com/0xced) in [#1755](https://github.com/spectreconsole/spectre.console/pull/1755)
|
||||
|
||||
### CLI
|
||||
|
||||
* Remove redundant explain settings ctor by [@gitfool](https://github.com/gitfool) in [#1534](https://github.com/spectreconsole/spectre.console/pull/1534)
|
||||
* Trim trailing comma in settings by [@devlead](https://github.com/devlead) in [#1550](https://github.com/spectreconsole/spectre.console/pull/1550)
|
||||
* Consider -? as an alias to -h by [@kzu](https://github.com/kzu) in [#1552](https://github.com/spectreconsole/spectre.console/pull/1552)
|
||||
* Trimming of TestConsole output by CommandAppTester is user configurable. by [@FrankRay78](https://github.com/FrankRay78) in [#1739](https://github.com/spectreconsole/spectre.console/pull/1739)
|
||||
* Include resource files for additional cultures in HelpProvider. by [@Tolitech](https://github.com/Tolitech) in [#1717](https://github.com/spectreconsole/spectre.console/pull/1717)
|
||||
* Conditionally trim trailing periods of argument and option descriptions by [@TheTonttu](https://github.com/TheTonttu) in [#1740](https://github.com/spectreconsole/spectre.console/pull/1740)
|
||||
* Changed IConfigurator to return IConfigurator instead of void by [@byte2pixel](https://github.com/byte2pixel) in [#1762](https://github.com/spectreconsole/spectre.console/pull/1762)
|
||||
* Add parsed unknown flag to remaining arguments for a branch with a default command by [@FrankRay78](https://github.com/FrankRay78) in [#1660](https://github.com/spectreconsole/spectre.console/pull/1660)
|
||||
* Correctly show application version; execution of command with version option by [@FrankRay78](https://github.com/FrankRay78) in [#1663](https://github.com/spectreconsole/spectre.console/pull/1663)
|
||||
* Help output correctly decides when to show the version option by [@FrankRay78](https://github.com/FrankRay78) in [#1664](https://github.com/spectreconsole/spectre.console/pull/1664)
|
||||
@@ -0,0 +1,43 @@
|
||||
Title: Spectre.Console 0.51.1 released!
|
||||
Description: Not a substitute for human interaction.
|
||||
Published: 2025-09-07
|
||||
Category: Release Notes
|
||||
Excluded: false
|
||||
---
|
||||
|
||||
Version `0.51.1` of Spectre.Console has been released!
|
||||
|
||||
_Note: Due to an issue discovered after the release of version 0.51.0, that version has now been unlisted. Let’s all pretend it never existed 😅_
|
||||
|
||||
## What's Changed
|
||||
|
||||
* Fix IndexOutOfRangeException in ExceptionFormatter by [@martincostello](https://github.com/martincostello) in [#1800](https://github.com/spectreconsole/spectre.console/pull/1800)
|
||||
* TestConsole can now be configured and accessed in CommandAppTester by [@magiino](https://github.com/magiino) in [#1803](https://github.com/spectreconsole/spectre.console/pull/1803)
|
||||
* Add ShowRowSeparators in Table Widget docs by [@bartoginski](https://github.com/bartoginski) in [#1807](https://github.com/spectreconsole/spectre.console/pull/1807)
|
||||
* Add support for required options by [@patriksvensson](https://github.com/patriksvensson) in [#1825](https://github.com/spectreconsole/spectre.console/pull/1825)
|
||||
* Added documentation for align widget by [@Elementttto](https://github.com/Elementttto) in [#1746](https://github.com/spectreconsole/spectre.console/pull/1746)
|
||||
* Fixed link not displayed in markup in Style.cs and added unit test cases by [@Elementttto](https://github.com/Elementttto) in [#1750](https://github.com/spectreconsole/spectre.console/pull/1750)
|
||||
* Update System.Memory dependency by [@WeihanLi](https://github.com/WeihanLi) in [#1832](https://github.com/spectreconsole/spectre.console/pull/1832)
|
||||
* Reduce memory usage for rune width cache. by [@Pannoniae](https://github.com/Pannoniae) in [#1756](https://github.com/spectreconsole/spectre.console/pull/1756)
|
||||
* Fix resizing of Live views with reduced size. by [@belucha](https://github.com/belucha) in [#1840](https://github.com/spectreconsole/spectre.console/pull/1840)
|
||||
* Corrects comment for optional text prompt by [@aljanabim](https://github.com/aljanabim) in [#1857](https://github.com/spectreconsole/spectre.console/pull/1857)
|
||||
* Update spinners by [@FroggieFrog](https://github.com/FroggieFrog) in [#1873](https://github.com/spectreconsole/spectre.console/pull/1873)
|
||||
* Support J and K for navigating list prompts by [@tobias-tengler](https://github.com/tobias-tengler) in [#1877](https://github.com/spectreconsole/spectre.console/pull/1877)
|
||||
* Fix space triggering selection when items in the selection list have a space. by [@mitchdenny](https://github.com/mitchdenny) in [#1881](https://github.com/spectreconsole/spectre.console/pull/1881)
|
||||
* Fix bug setting Header by [@mattfennerom](https://github.com/mattfennerom) in [#1890](https://github.com/spectreconsole/spectre.console/pull/1890)
|
||||
|
||||
## New Contributors
|
||||
|
||||
* [@magiino](https://github.com/magiino) made their first contribution in [#1803](https://github.com/spectreconsole/spectre.console/pull/1803)
|
||||
* [@bartoginski](https://github.com/bartoginski) made their first contribution in [#1807](https://github.com/spectreconsole/spectre.console/pull/1807)
|
||||
* [@Elementttto](https://github.com/Elementttto) made their first contribution in [#1746](https://github.com/spectreconsole/spectre.console/pull/1746)
|
||||
* [@WeihanLi](https://github.com/WeihanLi) made their first contribution in [#1832](https://github.com/spectreconsole/spectre.console/pull/1832)
|
||||
* [@Pannoniae](https://github.com/Pannoniae) made their first contribution in [#1756](https://github.com/spectreconsole/spectre.console/pull/1756)
|
||||
* [@belucha](https://github.com/belucha) made their first contribution in [#1840](https://github.com/spectreconsole/spectre.console/pull/1840)
|
||||
* [@aljanabim](https://github.com/aljanabim) made their first contribution in [#1857](https://github.com/spectreconsole/spectre.console/pull/1857)
|
||||
* [@FroggieFrog](https://github.com/FroggieFrog) made their first contribution in [#1873](https://github.com/spectreconsole/spectre.console/pull/1873)
|
||||
* [@tobias-tengler](https://github.com/tobias-tengler) made their first contribution in [#1877](https://github.com/spectreconsole/spectre.console/pull/1877)
|
||||
* [@mitchdenny](https://github.com/mitchdenny) made their first contribution in [#1881](https://github.com/spectreconsole/spectre.console/pull/1881)
|
||||
* [@mattfennerom](https://github.com/mattfennerom) made their first contribution in [#1890](https://github.com/spectreconsole/spectre.console/pull/1890)
|
||||
|
||||
**Full Changelog**: [0.50.0...0.51.0](https://github.com/spectreconsole/spectre.console/compare/0.50.0...0.51.1)
|
||||
@@ -0,0 +1,17 @@
|
||||
Title: Spectre.Console 0.52.0 released!
|
||||
Description: Don't eat (too much) glue.
|
||||
Published: 2025-10-10
|
||||
Category: Release Notes
|
||||
Excluded: false
|
||||
---
|
||||
|
||||
Version `0.52.0` of Spectre.Console has been released!
|
||||
|
||||
Exciting things are happening. We’ve merged support for my love child, OpenCli, in this release. That means you can now pass the parameter `--help-dump-opencli` to your application to get an [OpenCli](https://opencli.org) description dumped to stdout.
|
||||
|
||||
## What's Changed
|
||||
|
||||
* Add OpenCLI integration to Spectre.Console.Cli by [@patriksvensson](https://github.com/patriksvensson) in [#1909](https://github.com/spectreconsole/spectre.console/pull/1909)
|
||||
* Fix OPENCLI_VISIBILITY_INTERNAL to DefineConstants concat by [@devlead](https://github.com/devlead) in [#1912](https://github.com/spectreconsole/spectre.console/pull/1912)
|
||||
|
||||
**Full Changelog**: https://github.com/spectreconsole/spectre.console/compare/0.51.1...0.52.0
|
||||
@@ -1,3 +1,3 @@
|
||||
@{
|
||||
Layout = @$"_layout.cshtml";
|
||||
Layout = "_layout.cshtml";
|
||||
}
|
||||
75
docs/input/cli/command-help.md
Normal file
75
docs/input/cli/command-help.md
Normal file
@@ -0,0 +1,75 @@
|
||||
Title: Command Help
|
||||
Order: 13
|
||||
Description: "Console applications built with *Spectre.Console.Cli* include automatically generated help command line help."
|
||||
---
|
||||
|
||||
Console applications built with `Spectre.Console.Cli` include automatically generated help which is displayed when `-h` or `--help` has been specified on the command line.
|
||||
|
||||
The automatically generated help is derived from the configured commands and their command settings.
|
||||
|
||||
The help is also context aware and tailored depending on what has been specified on the command line before it. For example,
|
||||
|
||||
1. When `-h` or `--help` appears immediately after the application name (eg. `application.exe --help`), then the help displayed is a high-level summary of the application, including any command line examples and a listing of all possible commands the user can execute.
|
||||
|
||||
2. When `-h` or `--help` appears immediately after a command has been specified (eg. `application.exe command --help`), then the help displayed is specific to the command and includes information about command specific switches and any default values.
|
||||
|
||||
`HelpProvider` is the `Spectre.Console` class responsible for determining context and preparing the help text to write to the console. It is an implementation of the public interface `IHelpProvider`.
|
||||
|
||||
## Styling the help text
|
||||
|
||||
Basic styling is applied to the generated help text by default, however this is configurable.
|
||||
|
||||
`HelpProviderStyle` is the `Spectre.Console` class that holds the style information for the help text.
|
||||
|
||||
The default theme shipped with Spectre.Console is provided by a factory method, `HelpProviderStyle.Default`.
|
||||
|
||||
However, you can explicitly set a custom theme when configuring a CommandApp, for example:
|
||||
|
||||
```csharp
|
||||
config.Settings.HelpProviderStyles = new HelpProviderStyle()
|
||||
{
|
||||
Description = new DescriptionStyle()
|
||||
{
|
||||
Header = "bold",
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
Removing all styling from help text is also possible, a good choice for ensuring maximum accessibility. This is configured by clearing the style provider entirely:
|
||||
|
||||
```csharp
|
||||
config.Settings.HelpProviderStyles = null;
|
||||
```
|
||||
|
||||
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
|
||||
|
||||
Whilst it shouldn't be common place to implement your own help provider, it is however possible.
|
||||
|
||||
You are able to implement your own `IHelpProvider` and configure a `CommandApp` to use that instead of the Spectre.Console help provider.
|
||||
|
||||
```csharp
|
||||
using Spectre.Console.Cli;
|
||||
|
||||
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));
|
||||
});
|
||||
|
||||
return app.Run(args);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
There is a working [example of a custom help provider](https://github.com/spectreconsole/examples/tree/main/examples/Cli/Help) demonstrating this.
|
||||
|
||||
@@ -23,7 +23,7 @@ app.Configure(config =>
|
||||
|
||||
## Multiple Commands
|
||||
|
||||
In the previous example we have a single command that is configured. For complex command line applications, it is common for them to have multiple commands (or verbs) defined. Examples of applications like this are `git`, `dotnet` and `gh`. For example, git would have a `commit` command and along with other commits like `add` or `rebase`. Each with their own settings and validation. With `Spectre.Console.Cli` we use the `Configure` method to add these commands.
|
||||
In the previous example we have a single command that is configured. For complex command line applications, it is common for them to have multiple commands (or verbs) defined. Examples of applications like this are `git`, `dotnet` and `gh`. For example, git would have a `commit` command and along with other commands like `add` or `rebase`. Each with their own settings and validation. With `Spectre.Console.Cli` we use the `Configure` method to add these commands.
|
||||
|
||||
For example, to add three different commands to the application:
|
||||
|
||||
@@ -43,7 +43,7 @@ For more complex command hierarchical configurations, they can also be composed
|
||||
|
||||
## Customizing Command Configurations
|
||||
|
||||
The `Configure` method is also used to change how help for the commands is generated. This configuration will give our command an additional alias of `file-size` and a description to be used when displaying the help. Additional, an example is specified that will be parsed and displayed for users asking for help. Multiple examples can be provided. Commands can also be marked as hidden. With this option they are still executable, but will not be displayed in help screens.
|
||||
The `Configure` method is also used to change how help for the commands is generated. This configuration will give our command an additional alias of `file-size` and a description to be used when displaying the help. Additionally, an example is specified that will be parsed and displayed for users asking for help. Multiple examples can be provided. Commands can also be marked as hidden. With this option they are still executable, but will not be displayed in help screens.
|
||||
|
||||
``` csharp
|
||||
var app = new CommandApp();
|
||||
@@ -67,7 +67,7 @@ registrations.AddSingleton<IGreeter, HelloWorldGreeter>();
|
||||
|
||||
// Create a type registrar and register any dependencies.
|
||||
// A type registrar is an adapter for a DI framework.
|
||||
var registrar = new TypeRegistrar(registrations);
|
||||
var registrar = new MyTypeRegistrar(registrations);
|
||||
|
||||
// Create a new command app with the registrar
|
||||
// and run it with the provided arguments.
|
||||
@@ -75,15 +75,21 @@ var app = new CommandApp<DefaultCommand>(registrar);
|
||||
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.
|
||||
<?# Alert ?>
|
||||
`MyTypeRegistrar` is a custom class that implements [ITypeRegistrar](xref:T:Spectre.Console.Cli.ITypeRegistrar) and must be provided by the user.
|
||||
<?#/ Alert ?>
|
||||
|
||||
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 working [example of dependency injection](https://github.com/spectreconsole/examples/tree/main/examples/Cli/Injection) that uses `Microsoft.Extensions.DependencyInjection` as the container. Example implementations of `ITypeRegistrar` and `ITypeResolver` are provided, which you can copy and paste to your application for dependency injection.
|
||||
|
||||
Unit testing your `ITypeRegistrar` and `ITypeResolver` implementations is done using the utility `TypeRegistrarBaseTests` included in `Spectre.Console.Testing`. Simply call `TypeRegistrarBaseTests.RunAllTests()` and expect no `TypeRegistrarBaseTests.TestFailedException` to be thrown.
|
||||
|
||||
## Interception
|
||||
Interceptors can be registered with the `TypeRegistrar` (or with a custom DI-Container). Alternatively, `CommandApp` also provides a `SetInterceptor` configuration.
|
||||
|
||||
`CommandApp` also provides a `SetInterceptor` configuration. An interceptor is run before all commands are executed. This is typically used for configuring logging or other infrastructure concerns.
|
||||
All interceptors must implement `ICommandInterceptor`. Upon execution of a command, The `Intercept`-Method of an instance of your interceptor will be called with the parsed settings. This provides an opportunity for configuring any infrastructure or modifying the settings.
|
||||
When the command has been run, the `InterceptResult`-Method of the same instance is called with the result of the command.
|
||||
This provides an opportunity to modify the result and also to tear down any infrastructure in use.
|
||||
|
||||
All interceptors must implement `ICommandInterceptor`. Upon execution of a command, an instance of your interceptor will be called with the parsed settings. This provides an opportunity for configuring any infrastructure or modifying the settings.
|
||||
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)
|
||||
|
||||
@@ -18,7 +18,7 @@ public class HelloCommand : Command<HelloCommand.Settings>
|
||||
}
|
||||
|
||||
|
||||
public override int Execute(CommandContext context, Settings settings)
|
||||
public override int Execute(CommandContext context, Settings settings, CancellationToken cancellationToken)
|
||||
{
|
||||
AnsiConsole.MarkupLine($"Hello, [blue]{settings.Name}[/]");
|
||||
return 0;
|
||||
@@ -37,8 +37,8 @@ app.Configure(config =>
|
||||
config.AddCommand<HelloCommand>("hello")
|
||||
.WithAlias("hola")
|
||||
.WithDescription("Say hello")
|
||||
.WithExample(new []{"hello", "Phil"})
|
||||
.WithExample(new []{"hello", "Phil", "--count", "4"});
|
||||
.WithExample("hello", "Phil")
|
||||
.WithExample("hello", "Phil", "--count", "4");
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
Title: Composing Commands
|
||||
RedirectFrom: introduction
|
||||
Order: 8
|
||||
Description: "The underlying philosophy behind *Spectre.Console.Cli* is to rely on the .NET type system to
|
||||
declare the commands, but tie everything together via composition."
|
||||
Description: The underlying philosophy behind *Spectre.Console.Cli* is
|
||||
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
|
||||
@@ -55,7 +55,7 @@ in the previous step.
|
||||
```csharp
|
||||
public class AddPackageCommand : Command<AddPackageSettings>
|
||||
{
|
||||
public override int Execute(CommandContext context, AddPackageSettings settings)
|
||||
public override int Execute(CommandContext context, AddPackageSettings settings, CancellationToken cancellationToken)
|
||||
{
|
||||
// Omitted
|
||||
return 0;
|
||||
@@ -64,7 +64,7 @@ public class AddPackageCommand : Command<AddPackageSettings>
|
||||
|
||||
public class AddReferenceCommand : Command<AddReferenceSettings>
|
||||
{
|
||||
public override int Execute(CommandContext context, AddReferenceSettings settings)
|
||||
public override int Execute(CommandContext context, AddReferenceSettings settings, CancellationToken cancellationToken)
|
||||
{
|
||||
// Omitted
|
||||
return 0;
|
||||
|
||||
@@ -49,11 +49,15 @@ namespace MyApp
|
||||
|
||||
## Using a custom ExceptionHandler
|
||||
|
||||
Using the `SetErrorHandler()` during configuration it is possible to handle exceptions in a defined way.
|
||||
Using the `SetExceptionHandler()` during configuration it is possible to handle exceptions in a defined way.
|
||||
This method comes in two flavours: One that uses the default exitCode (or `return` value) of `-1` and one
|
||||
where the exitCode needs to be supplied.
|
||||
|
||||
### Using `SetErrorHandler(Func<Exception, int> handler)`
|
||||
The `ITypeResolver?` parameter will be null, when the exception occurs while no `ITypeResolver` is available.
|
||||
(Basically the `ITypeResolver` will be set, when the exception occurs during a command execution, but not
|
||||
during the parsing phase and construction of the command.)
|
||||
|
||||
### Using `SetExceptionHandler(Func<Exception, ITypeResolver?, int> handler)`
|
||||
|
||||
Using this method exceptions can be handled in a custom way. The return value of the handler is used as
|
||||
the exitCode for the application.
|
||||
@@ -71,7 +75,7 @@ namespace MyApp
|
||||
|
||||
app.Configure(config =>
|
||||
{
|
||||
config.SetExceptionHandler(ex =>
|
||||
config.SetExceptionHandler((ex, resolver) =>
|
||||
{
|
||||
AnsiConsole.WriteException(ex, ExceptionFormats.ShortenEverything);
|
||||
return -99;
|
||||
@@ -84,9 +88,9 @@ namespace MyApp
|
||||
}
|
||||
```
|
||||
|
||||
### Using `SetErrorHandler(Action<Exception> handler)`
|
||||
### Using `SetExceptionHandler(Action<Exception, ITypeResolver?> handler)`
|
||||
|
||||
Using this method exceptions can be handled in a custom way, much the same as with the `SetErrorHandler(Func<Exception, int> handler)`.
|
||||
Using this method exceptions can be handled in a custom way, much the same as with the `SetExceptionHandler(Func<Exception, ITypeResolver?, int> handler)`.
|
||||
Using the `Action` as the handler however, it is not possible (or required) to supply a return value.
|
||||
The exitCode for the application will be `-1`.
|
||||
|
||||
@@ -103,7 +107,7 @@ namespace MyApp
|
||||
|
||||
app.Configure(config =>
|
||||
{
|
||||
config.SetExceptionHandler(ex =>
|
||||
config.SetExceptionHandler((ex, resolver) =>
|
||||
{
|
||||
AnsiConsole.WriteException(ex, ExceptionFormats.ShortenEverything);
|
||||
});
|
||||
|
||||
@@ -33,7 +33,7 @@ internal sealed class FileSizeCommand : Command<FileSizeCommand.Settings>
|
||||
public bool IncludeHidden { get; init; }
|
||||
}
|
||||
|
||||
public override int Execute([NotNull] CommandContext context, [NotNull] Settings settings)
|
||||
public override int Execute(CommandContext context, Settings settings, CancellationToken cancellationToken)
|
||||
{
|
||||
var searchOptions = new EnumerationOptions
|
||||
{
|
||||
|
||||
@@ -61,7 +61,7 @@ in the previous step.
|
||||
```csharp
|
||||
public class AddPackageCommand : Command<AddPackageSettings>
|
||||
{
|
||||
public override int Execute(CommandContext context, AddPackageSettings settings)
|
||||
public override int Execute(CommandContext context, AddPackageSettings settings, CancellationToken cancellationToken)
|
||||
{
|
||||
// Omitted
|
||||
return 0;
|
||||
@@ -70,7 +70,7 @@ public class AddPackageCommand : Command<AddPackageSettings>
|
||||
|
||||
public class AddReferenceCommand : Command<AddReferenceSettings>
|
||||
{
|
||||
public override int Execute(CommandContext context, AddReferenceSettings settings)
|
||||
public override int Execute(CommandContext context, AddReferenceSettings settings, CancellationToken cancellationToken)
|
||||
{
|
||||
// Omitted
|
||||
return 0;
|
||||
|
||||
22
docs/input/cli/opencli.md
Normal file
22
docs/input/cli/opencli.md
Normal file
@@ -0,0 +1,22 @@
|
||||
Title: OpenCLI Integration
|
||||
Order: 15
|
||||
Description: OpenCLI integration
|
||||
Highlights:
|
||||
- Generate OpenCLI descriptions
|
||||
---
|
||||
|
||||
From version `0.52.0` and above, you will be able to generate [OpenCLI](https://opencli.org)
|
||||
descriptions from your `Spectre.Console.Cli` applications.
|
||||
|
||||
Simply add the `--help-dump-opencli` option to your application, and an
|
||||
OpenCLI description will be written to stdout.
|
||||
|
||||
```shell
|
||||
$ ./myapp --help-dump-opencli
|
||||
```
|
||||
|
||||
If you want to save it to disk, pipe it to a file.
|
||||
|
||||
```shell
|
||||
$ ./myapp --help-dump-opencli > myapp.openapi.json
|
||||
```
|
||||
@@ -26,7 +26,7 @@ This setting file tells `Spectre.Console.Cli` that our command has two parameter
|
||||
|
||||
## CommandArgument
|
||||
|
||||
Arguments have a position and a name. The name is not only used for generating help, but its formatting is used to determine whether or not the argument is optional. The name must either be surrounded by square brackets (e.g. `[name]`) or angle brackets (e.g. `<name>`). Angle brackets denote required whereas square brackets denote optional. If neither are specified an exception will be thrown.
|
||||
Arguments have a position and a name. The name is not only used for generating help, but its formatting is used to determine whether or not the argument is optional. Angle brackets denote a required argument (e.g. `<name>`) whereas square brackets denote an optional argument (e.g. `[name]`). If neither are specified an exception will be thrown.
|
||||
|
||||
The position is used for scenarios where there could be more than one argument.
|
||||
|
||||
@@ -86,7 +86,9 @@ public int Count { get; set; }
|
||||
|
||||
## Arrays
|
||||
|
||||
`CommandArgument` can be defined as arrays and any additional parameters will be included in the value. For example
|
||||
### Argument Vector
|
||||
|
||||
One (exactly one) `CommandArgument` can be defined as an array, and any additional parameters will be included in the value. For example:
|
||||
|
||||
```csharp
|
||||
[CommandArgument(0, "[name]")]
|
||||
@@ -95,6 +97,19 @@ public string[] Name { get; set; }
|
||||
|
||||
Would allow the user to run `app.exe Dwayne Elizondo "Mountain Dew" Herbert Camacho`. The settings passed to the command would have a 5 element array consisting of Dwayne, Elizondo, Mountain Dew, Herbert and Camacho.
|
||||
|
||||
A command can have only one argument vector, and it needs to be the last argument. (I.e. there can be no `CommandArgument` whose position is higher than that of the argument vector.)
|
||||
|
||||
### Option Arrays
|
||||
|
||||
A `CommandOption` can be defined as an array like the following:
|
||||
|
||||
```csharp
|
||||
[CommandOption("-n|--name <VALUES>")]
|
||||
public string[] Names { get; set; }
|
||||
```
|
||||
|
||||
This would allow the user to run `app.exe --name Dwayne --name Elizondo --name "Mountain Dew" --name Herbert --name Camacho` and would result in a 5 element array consisting of Dwayne, Elizondo, Mountain Dew, Herbert and Camacho.
|
||||
|
||||
## Constructors
|
||||
|
||||
`Spectre.Console.Cli` supports constructor initialization and init only initialization. For constructor initialization, the parameter name of the constructor must match the name of the property name of the settings class. Order does not matter.
|
||||
|
||||
199
docs/input/cli/unit-testing.md
Normal file
199
docs/input/cli/unit-testing.md
Normal file
@@ -0,0 +1,199 @@
|
||||
Title: Unit Testing
|
||||
Order: 14
|
||||
Description: Instructions for unit testing a Spectre.Console application.
|
||||
Reference:
|
||||
- T:Spectre.Console.Testing.CommandAppTester
|
||||
- T:Spectre.Console.Testing.TestConsole
|
||||
- T:Spectre.Console.Testing.TestConsoleInput
|
||||
---
|
||||
|
||||
`Spectre.Console` has a separate project that contains test harnesses for unit testing your own console applications.
|
||||
|
||||
The fastest way of getting started is to install the `Spectre.Console.Testing` NuGet package.
|
||||
|
||||
```text
|
||||
> dotnet add package Spectre.Console.Testing
|
||||
```
|
||||
|
||||
`Spectre.Console.Testing` is also the namespace containing the test classes.
|
||||
|
||||
## Testing a CommandApp
|
||||
|
||||
The `CommandAppTester` is a test implementation of `CommandApp` that's configured in a similar manner but designed for unit testing.
|
||||
|
||||
The following example validates the exit code and terminal output of a `Spectre.Console` command:
|
||||
|
||||
```csharp
|
||||
/// <summary>
|
||||
/// A Spectre.Console Command
|
||||
/// </summary>
|
||||
public class HelloWorldCommand : Command
|
||||
{
|
||||
private readonly IAnsiConsole _console;
|
||||
|
||||
public HelloWorldCommand(IAnsiConsole console)
|
||||
{
|
||||
// nb. AnsiConsole should not be called directly by the command
|
||||
// since this doesn't play well with testing. Instead,
|
||||
// the command should inject a IAnsiConsole and use that.
|
||||
|
||||
_console = console;
|
||||
}
|
||||
|
||||
public override int Execute(CommandContext context, CancellationToken cancellationToken)
|
||||
{
|
||||
_console.WriteLine("Hello world.");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void Should_Output_Hello_World()
|
||||
{
|
||||
// Given
|
||||
var app = new CommandAppTester();
|
||||
app.SetDefaultCommand<HelloWorldCommand>();
|
||||
|
||||
// When
|
||||
var result = app.Run();
|
||||
|
||||
// Then
|
||||
Assert.AreEqual(result.ExitCode, 0);
|
||||
Assert.AreEqual(result.Output, "Hello world.");
|
||||
}
|
||||
```
|
||||
|
||||
The following example demonstrates how to mock user inputs for an interactive command.
|
||||
This test (InteractiveCommand_WithMockedUserInputs_ProducesExpectedOutput) simulates user interactions by pushing predefined inputs to the console, then verifies that the resulting output is as expected.
|
||||
|
||||
```csharp
|
||||
public sealed class InteractiveCommandTests
|
||||
{
|
||||
private sealed class InteractiveCommand : Command
|
||||
{
|
||||
private readonly IAnsiConsole _console;
|
||||
|
||||
public InteractiveCommand(IAnsiConsole console)
|
||||
{
|
||||
_console = console;
|
||||
}
|
||||
|
||||
public override int Execute(CommandContext context, CancellationToken cancellationToken)
|
||||
{
|
||||
var fruits = _console.Prompt(
|
||||
new MultiSelectionPrompt<string>()
|
||||
.Title("What are your [green]favorite fruits[/]?")
|
||||
.NotRequired() // Not required to have a favorite fruit
|
||||
.PageSize(10)
|
||||
.MoreChoicesText("[grey](Move up and down to reveal more fruits)[/]")
|
||||
.InstructionsText(
|
||||
"[grey](Press [blue]<space>[/] to toggle a fruit, " +
|
||||
"[green]<enter>[/] to accept)[/]")
|
||||
.AddChoices(new[] {
|
||||
"Apple", "Apricot", "Avocado",
|
||||
"Banana", "Blackcurrant", "Blueberry",
|
||||
"Cherry", "Cloudberry", "Coconut",
|
||||
}));
|
||||
|
||||
var fruit = _console.Prompt(
|
||||
new SelectionPrompt<string>()
|
||||
.Title("What's your [green]favorite fruit[/]?")
|
||||
.PageSize(10)
|
||||
.MoreChoicesText("[grey](Move up and down to reveal more fruits)[/]")
|
||||
.AddChoices(new[] {
|
||||
"Apple", "Apricot", "Avocado",
|
||||
"Banana", "Blackcurrant", "Blueberry",
|
||||
"Cherry", "Cloudberry", "Cocunut",
|
||||
}));
|
||||
|
||||
var name = _console.Ask<string>("What's your name?");
|
||||
|
||||
_console.WriteLine($"[{string.Join(',', fruits)};{fruit};{name}]");
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void InteractiveCommand_WithMockedUserInputs_ProducesExpectedOutput()
|
||||
{
|
||||
// Given
|
||||
TestConsole console = new();
|
||||
console.Interactive();
|
||||
|
||||
// Your mocked inputs must always end with "Enter" for each prompt!
|
||||
|
||||
// Multi selection prompt: Choose first option
|
||||
console.Input.PushKey(ConsoleKey.Spacebar);
|
||||
console.Input.PushKey(ConsoleKey.Enter);
|
||||
|
||||
// Selection prompt: Choose second option
|
||||
console.Input.PushKey(ConsoleKey.DownArrow);
|
||||
console.Input.PushKey(ConsoleKey.Enter);
|
||||
|
||||
// Ask text prompt: Enter name
|
||||
console.Input.PushTextWithEnter("Spectre Console");
|
||||
|
||||
var app = new CommandAppTester(null, new CommandAppTesterSettings(), console);
|
||||
app.SetDefaultCommand<InteractiveCommand>();
|
||||
|
||||
// When
|
||||
var result = app.Run();
|
||||
|
||||
// Then
|
||||
result.ExitCode.ShouldBe(0);
|
||||
result.Output.EndsWith("[Apple;Apricot;Spectre Console]");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Testing console behaviour
|
||||
|
||||
`TestConsole` and `TestConsoleInput` are testable implementations of `IAnsiConsole` and `IAnsiConsoleInput`, allowing you fine-grain control over testing console output and interactivity.
|
||||
|
||||
The following example renders some widgets before then validating the console output:
|
||||
|
||||
```csharp
|
||||
[TestMethod]
|
||||
public void Should_Render_Panel()
|
||||
{
|
||||
// Given
|
||||
var console = new TestConsole();
|
||||
|
||||
// When
|
||||
console.Write(new Panel(new Text("Hello World")));
|
||||
|
||||
// Then
|
||||
Assert.AreEqual(console.Output, """"
|
||||
┌─────────────┐
|
||||
│ Hello World │
|
||||
└─────────────┘
|
||||
|
||||
"""");
|
||||
}
|
||||
```
|
||||
|
||||
While `Assert` is fine for validating simple output, more complex output may benefit from a tool like [Verify](https://github.com/VerifyTests/Verify).
|
||||
|
||||
The following example prompts the user for input before then validating the expected choice was made:
|
||||
|
||||
```csharp
|
||||
[TestMethod]
|
||||
public void Should_Select_Orange()
|
||||
{
|
||||
// Given
|
||||
var console = new TestConsole();
|
||||
console.Input.PushTextWithEnter("Orange");
|
||||
|
||||
// When
|
||||
console.Prompt(
|
||||
new TextPrompt<string>("Favorite fruit?")
|
||||
.AddChoice("Banana")
|
||||
.AddChoice("Orange"));
|
||||
|
||||
// Then
|
||||
Assert.AreEqual(console.Output, "Favorite fruit? [Banana/Orange]: Orange\n");
|
||||
}
|
||||
```
|
||||
|
||||
`CommandAppTester` uses `TestConsole` internally, which in turn uses `TestConsoleInput`, offering a fully testable harness for `Spectre.Console` widgets, prompts and commands.
|
||||
@@ -6,7 +6,7 @@ Order: 0
|
||||
Spectre.Console is a `.NET` library that makes it easier
|
||||
to create beautiful console applications.
|
||||
|
||||
## Spectre.Console.AnsiConsole Features
|
||||
## Spectre.Console.AnsiConsole
|
||||
|
||||
* Easily output text with different colors and even styles such as bold, italic and blinking with a Rich inspired [markup language](markup).
|
||||
* Supports `3`/`4`/`8`/`24`-bit colors in the terminal with auto-detection of the current terminal's capabilities.
|
||||
@@ -14,16 +14,19 @@ to create beautiful console applications.
|
||||
* Display progress for long running tasks with live displays of [progress](live/progress) and [status](live/status) controls.
|
||||
* Prompt user input with strongly typed [text input](prompts/text) or via [single-item select](prompts/selection) and [multiple item select](prompts/multiselection) controls.
|
||||
* Format .NET [exceptions](exceptions) with custom color coded themes and styles.
|
||||
* Written with unit testing in mind.
|
||||
|
||||
Spectre.Console.AnsiConsole has been heavily inspired
|
||||
by the excellent [Rich](https://github.com/willmcgugan/rich) library
|
||||
for Python written by Will McGugan.
|
||||
Spectre.Console.AnsiConsole has been heavily inspired by the excellent [Rich](https://github.com/willmcgugan/rich) library for Python written by Will McGugan.
|
||||
|
||||
## Spectre.Console.Cli
|
||||
|
||||
* Create strongly typed settings and commands for parsing `args[]` to create complex command line applications like `git`, `gh`, or `dotnet`
|
||||
|
||||
## Spectre.Console.Testing
|
||||
|
||||
* Spectre.Console has been developed with unit testing in mind. The Spectre.Console library itself is covered by an extensive test suite, project maintainers require test coverage for all new commits, and the same extension points and test harnesses used internally for testing are available to you.
|
||||
|
||||
* The [Unit Testing](cli/unit-testing) page provides instructions for testing a Spectre.Console application.
|
||||
|
||||
## Examples
|
||||
|
||||

|
||||
@@ -36,3 +39,4 @@ for Python written by Will McGugan.
|
||||
Sorry, your browser doesn't support embedded videos.
|
||||
</video>
|
||||
|
||||
The Spectre.Console [examples repository](https://github.com/spectreconsole/examples) contains many other examples.
|
||||
73
docs/input/live/async.md
Normal file
73
docs/input/live/async.md
Normal file
@@ -0,0 +1,73 @@
|
||||
Title: Async Extensions
|
||||
Order: 11
|
||||
Description: "Async Extensions provides extension methods for running tasks with an inline animations."
|
||||
Highlights:
|
||||
- Extension methods for running tasks with spinner animations
|
||||
- Support for both void and generic Task types
|
||||
- Customizable spinner styles and console output
|
||||
Reference:
|
||||
- T:Spectre.Console.Extensions.SpinnerExtensions
|
||||
Xref: spinner-extensions
|
||||
---
|
||||
|
||||
The Async Spinner Extension provides convenient extension methods for running tasks with an inline spinner animations in the console.
|
||||
|
||||
<?# AsciiCast cast="await-spinner" /?>
|
||||
|
||||
<?# Alert ?>
|
||||
The spinner animation is not thread safe, and using it together with other interactive
|
||||
components such as prompts, progress displays or other status displays is not supported.
|
||||
<?#/ Alert ?>
|
||||
|
||||
## Usage
|
||||
|
||||
The extension methods allow you to easily add spinner animations to any Task execution:
|
||||
|
||||
```csharp
|
||||
// Basic usage with void Task
|
||||
await someTask.Spinner();
|
||||
|
||||
// With generic Task<T>
|
||||
var result = await someTaskWithResult.Spinner(
|
||||
Spinner.Known.Star,
|
||||
new Style(foreground: Color.Green));
|
||||
|
||||
// With custom console
|
||||
await someTask.Spinner(
|
||||
Spinner.Known.Dots,
|
||||
style: Style.Plain,
|
||||
ansiConsole: customConsole);
|
||||
```
|
||||
|
||||
## Features
|
||||
|
||||
The spinner extensions provide:
|
||||
|
||||
- Support for both void Tasks and Tasks with return values
|
||||
- Customizable spinner animations using any Spectre.Console Spinner
|
||||
- Optional styling for the spinner animation
|
||||
- Ability to specify a custom IAnsiConsole instance
|
||||
|
||||
## Examples
|
||||
|
||||
Here's a more complete example showing different ways to use the spinner extensions:
|
||||
|
||||
```csharp
|
||||
// Basic spinner with default settings
|
||||
await Task.Delay(1000)
|
||||
.Spinner(Spinner.Known.Dots);
|
||||
|
||||
// Customized spinner with style
|
||||
var result = await CalculateSomething()
|
||||
.Spinner(
|
||||
Spinner.Known.Star,
|
||||
new Style(foreground: Color.Green));
|
||||
|
||||
// Using with a custom console
|
||||
await ProcessData()
|
||||
.Spinner(
|
||||
new Spinner(new[] { "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏" }, 80),
|
||||
new Style(foreground: Color.Blue),
|
||||
customConsole);
|
||||
```
|
||||
|
||||
@@ -9,6 +9,7 @@ Highlights:
|
||||
Reference:
|
||||
- T:Spectre.Console.Progress
|
||||
- M:Spectre.Console.AnsiConsole.Progress
|
||||
Xref: live-progress
|
||||
---
|
||||
|
||||
Spectre.Console can display information about long running tasks in the console.
|
||||
@@ -85,6 +86,8 @@ AnsiConsole.Progress()
|
||||
new PercentageColumn(), // Percentage
|
||||
new RemainingTimeColumn(), // Remaining time
|
||||
new SpinnerColumn(), // Spinner
|
||||
new DownloadedColumn(), // Downloaded
|
||||
new TransferSpeedColumn(), // Transfer speed
|
||||
})
|
||||
.Start(ctx =>
|
||||
{
|
||||
|
||||
@@ -8,6 +8,7 @@ Highlights:
|
||||
Reference:
|
||||
- T:Spectre.Console.Status
|
||||
- M:Spectre.Console.AnsiConsole.Status
|
||||
Xref: live-status
|
||||
---
|
||||
|
||||
Spectre.Console can display information about long running tasks in the console.
|
||||
|
||||
@@ -31,7 +31,7 @@ var fruits = AnsiConsole.Prompt(
|
||||
.AddChoices(new[] {
|
||||
"Apple", "Apricot", "Avocado",
|
||||
"Banana", "Blackcurrant", "Blueberry",
|
||||
"Cherry", "Cloudberry", "Cocunut",
|
||||
"Cherry", "Cloudberry", "Coconut",
|
||||
}));
|
||||
|
||||
// Write the selected fruits to the terminal
|
||||
|
||||
@@ -27,6 +27,32 @@ you can use the `Prompt<TResult>`.
|
||||
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
|
||||
|
||||
<?# Example symbol="M:Prompt.Program.AskName" project="Prompt" /?>
|
||||
@@ -36,6 +62,30 @@ What's your name? Patrik
|
||||
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
|
||||
|
||||
<?# 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): _
|
||||
```
|
||||
|
||||
### 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
|
||||
|
||||
<?# Example symbol="M:Prompt.Program.AskAge" project="Prompt" /?>
|
||||
@@ -56,6 +119,23 @@ Too high
|
||||
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
|
||||
|
||||
<?# Example symbol="M:Prompt.Program.AskPassword" project="Prompt" /?>
|
||||
@@ -65,6 +145,18 @@ What's the secret number? _
|
||||
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
|
||||
|
||||
<?# Example symbol="M:Prompt.Program.AskPasswordWithCustomMask" project="Prompt" /?>
|
||||
@@ -82,6 +174,18 @@ You can utilize a null character to completely hide input.
|
||||
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
|
||||
|
||||
<?# Example symbol="M:Prompt.Program.AskColor" project="Prompt" /?>
|
||||
@@ -89,3 +193,17 @@ Enter password: _
|
||||
```text
|
||||
[Optional] Favorite color? _
|
||||
```
|
||||
|
||||
### Usage
|
||||
|
||||
```csharp
|
||||
// Ask for the user's favorite color (optional)
|
||||
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");
|
||||
```
|
||||
@@ -8,9 +8,10 @@ to install the NuGet package.
|
||||
|
||||
```text
|
||||
> dotnet add package Spectre.Console
|
||||
> dotnet add package Spectre.Console.Cli
|
||||
```
|
||||
|
||||
After that you will need to reference the `Spectre.Console` namespace.
|
||||
After that you will need to reference the `Spectre.Console` and `Spectre.Console.Cli` namespaces.
|
||||
Once that is done, you can start using all the available features.
|
||||
|
||||
```csharp
|
||||
|
||||
@@ -17,7 +17,7 @@ and the ascii terminal player.
|
||||
/* temp styling for alerts */
|
||||
|
||||
.alert-warning {
|
||||
@apply p-4 border border-yellow-300 bg-yellow-100 text-yellow-800 dark:border-orange-700/50 dark:bg-orange-800/50 dark:text-orange-300/90 rounded shadow-sm text-sm;
|
||||
@apply p-4 border border-yellow-300 bg-yellow-100 text-yellow-800 dark:border-red-700/50 dark:bg-red-800/50 dark:text-red-100/90 rounded shadow-sm text-sm;
|
||||
}
|
||||
|
||||
.alert-warning p {
|
||||
|
||||
66
docs/input/widgets/align.md
Normal file
66
docs/input/widgets/align.md
Normal file
@@ -0,0 +1,66 @@
|
||||
Title: Align
|
||||
Description: "Use **Align** to render and position widgets in the console."
|
||||
Highlights:
|
||||
- Custom colors
|
||||
- Labels
|
||||
- Use your own data with a converter.
|
||||
Reference: T:Spectre.Console.Align
|
||||
|
||||
---
|
||||
|
||||
Use `Align` to render and position widgets in the console.
|
||||
|
||||
<?# AsciiCast cast="align" /?>
|
||||
|
||||
## Usage
|
||||
|
||||
### Basic usage
|
||||
|
||||
```csharp
|
||||
// Render an item and align it in the bottom-left corner of the console
|
||||
AnsiConsole.Write(new Align(
|
||||
new Text("Spectre!"),
|
||||
HorizontalAlignment.Left,
|
||||
VerticalAlignment.Bottom
|
||||
));
|
||||
```
|
||||
|
||||
### Align items from an IEnumerable
|
||||
|
||||
```csharp
|
||||
// Create a list of items
|
||||
var alignItems = new List<Text>(){
|
||||
new Text("Spectre"),
|
||||
new Text("Console"),
|
||||
new Text("Is Awesome!")
|
||||
};
|
||||
|
||||
// Render the items in the middle-right of the console
|
||||
AnsiConsole.Write(new Align(
|
||||
alignItems,
|
||||
HorizontalAlignment.Right,
|
||||
VerticalAlignment.Middle
|
||||
));
|
||||
```
|
||||
|
||||
### Dynamically align with different widgets
|
||||
|
||||
```csharp
|
||||
// Create a table
|
||||
var table = new Table()
|
||||
.AddColumn("ID")
|
||||
.AddColumn("Methods")
|
||||
.AddColumn("Purpose")
|
||||
.AddRow("1", "Center()", "Initializes a new instance that is center aligned")
|
||||
.AddRow("2", "Measure()", "Measures the renderable object")
|
||||
.AddRow("3", "Right()", "Initializes a new instance that is right aligned.");
|
||||
|
||||
// Create a panel
|
||||
var panel = new Panel(table)
|
||||
.Header("Other Align Methods")
|
||||
.Border(BoxBorder.Double);
|
||||
|
||||
// Renders the panel in the top-center of the console
|
||||
AnsiConsole.Write(new Align(panel, HorizontalAlignment.Center, VerticalAlignment.Top));
|
||||
```
|
||||
|
||||
@@ -132,3 +132,13 @@ AnsiConsole.Write(new BreakdownChart()
|
||||
.AddItem(new Fruit("Mango", 3, Color.Orange4))
|
||||
.AddItems(items));
|
||||
```
|
||||
|
||||
### Add value formatter to chart numbers
|
||||
|
||||
```csharp
|
||||
var chart = new BreakdownChart();
|
||||
chart.UseValueFormater(value => value.ToString("N0"));
|
||||
|
||||
// This can be simplified as extension methods are chainable.
|
||||
var chart = new BreakdownChart().UseValueFormatter(v => v.ToString("N0"));
|
||||
```
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Title: Calendar
|
||||
Title: Calendar
|
||||
Order: 40
|
||||
RedirectFrom: calendar
|
||||
Description: "The **Calendar** is used to render a calendar to the terminal."
|
||||
|
||||
@@ -12,7 +12,7 @@ Spectre.Console can render [FIGlet](http://www.figlet.org/) text by using the `F
|
||||
```csharp
|
||||
AnsiConsole.Write(
|
||||
new FigletText("Hello")
|
||||
.LeftAligned()
|
||||
.LeftJustified()
|
||||
.Color(Color.Red));
|
||||
```
|
||||
|
||||
@@ -26,6 +26,6 @@ var font = FigletFont.Load("starwars.flf");
|
||||
|
||||
AnsiConsole.Write(
|
||||
new FigletText(font, "Hello")
|
||||
.LeftAligned()
|
||||
.LeftJustified()
|
||||
.Color(Color.Red));
|
||||
```
|
||||
|
||||
@@ -45,16 +45,16 @@ grid.AddColumn();
|
||||
|
||||
// Add header row
|
||||
grid.AddRow(new Text[]{
|
||||
new Text("Header 1", new Style(Color.Red, Color.Black)).LeftAligned(),
|
||||
new Text("Header 1", new Style(Color.Red, Color.Black)).LeftJustified(),
|
||||
new Text("Header 2", new Style(Color.Green, Color.Black)).Centered(),
|
||||
new Text("Header 3", new Style(Color.Blue, Color.Black)).RightAligned()
|
||||
new Text("Header 3", new Style(Color.Blue, Color.Black)).RightJustified()
|
||||
});
|
||||
|
||||
// Add content row
|
||||
grid.AddRow(new Text[]{
|
||||
new Text("Row 1").LeftAligned(),
|
||||
new Text("Row 1").LeftJustified(),
|
||||
new Text("Row 2").Centered(),
|
||||
new Text("Row 3").RightAligned()
|
||||
new Text("Row 3").RightJustified()
|
||||
});
|
||||
|
||||
// Write centered cell grid contents to Console
|
||||
@@ -73,9 +73,9 @@ grid.AddColumn();
|
||||
|
||||
// Add header row
|
||||
grid.AddRow(new Text[]{
|
||||
new Text("Header 1", new Style(Color.Red, Color.Black)).LeftAligned(),
|
||||
new Text("Header 1", new Style(Color.Red, Color.Black)).LeftJustified(),
|
||||
new Text("Header 2", new Style(Color.Green, Color.Black)).Centered(),
|
||||
new Text("Header 3", new Style(Color.Blue, Color.Black)).RightAligned()
|
||||
new Text("Header 3", new Style(Color.Blue, Color.Black)).RightJustified()
|
||||
});
|
||||
|
||||
var embedded = new Grid();
|
||||
@@ -88,7 +88,7 @@ embedded.AddRow(new Text("Embedded III"), new Text("Embedded IV"));
|
||||
|
||||
// Add content row
|
||||
grid.AddRow(
|
||||
new Text("Row 1").LeftAligned(),
|
||||
new Text("Row 1").LeftJustified(),
|
||||
new Text("Row 2").Centered(),
|
||||
embedded
|
||||
);
|
||||
|
||||
@@ -41,7 +41,7 @@ You can set the rule's title alignment.
|
||||
|
||||
```csharp
|
||||
var rule = new Rule("[red]Hello[/]");
|
||||
rule.Alignment = Justify.Left;
|
||||
rule.Justification = Justify.Left;
|
||||
AnsiConsole.Write(rule);
|
||||
```
|
||||
|
||||
@@ -53,7 +53,7 @@ You can also specify it via an extension method:
|
||||
|
||||
```csharp
|
||||
var rule = new Rule("[red]Hello[/]");
|
||||
rule.LeftAligned();
|
||||
rule.LeftJustified();
|
||||
AnsiConsole.Write(rule);
|
||||
```
|
||||
|
||||
|
||||
@@ -138,3 +138,10 @@ table.Columns[0].NoWrap();
|
||||
// Set the column width
|
||||
table.Columns[0].Width(15);
|
||||
```
|
||||
|
||||
### Show row separators
|
||||
|
||||
```csharp
|
||||
// Shows separator between each row
|
||||
table.ShowRowSeparators();
|
||||
```
|
||||
@@ -34,7 +34,7 @@ You can also specify styles via extension methods:
|
||||
|
||||
```csharp
|
||||
var path = new TextPath("C:/This/Path/Is/Too/Long/To/Fit/In/The/Area.txt")
|
||||
.RightAligned();
|
||||
.RightJustified();
|
||||
```
|
||||
|
||||
## Styling
|
||||
|
||||
282
docs/package-lock.json
generated
282
docs/package-lock.json
generated
@@ -123,12 +123,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/runtime": {
|
||||
"version": "7.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.0.tgz",
|
||||
"integrity": "sha512-etcO/ohMNaNA2UBdaXBBSX/3aEzFMRrVfaPv8Ptc0k+cWpWW0QFiGZ2XnVqQZI1Cf734LbPGmqBKWESfW4x/dQ==",
|
||||
"version": "7.27.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
|
||||
"integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"regenerator-runtime": "^0.13.4"
|
||||
"regenerator-runtime": "^0.14.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@@ -315,12 +316,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/braces": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"fill-range": "^7.0.1"
|
||||
"fill-range": "^7.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
@@ -475,10 +477,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cross-spawn": {
|
||||
"version": "7.0.3",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
||||
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"path-key": "^3.1.0",
|
||||
"shebang-command": "^2.0.0",
|
||||
@@ -500,6 +503,13 @@
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/csstype": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
|
||||
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/defined": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
|
||||
@@ -587,10 +597,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/fill-range": {
|
||||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
},
|
||||
@@ -737,6 +748,7 @@
|
||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.12.0"
|
||||
}
|
||||
@@ -802,13 +814,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/micromatch": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
|
||||
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
|
||||
"version": "4.0.8",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
|
||||
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"braces": "^3.0.1",
|
||||
"picomatch": "^2.2.3"
|
||||
"braces": "^3.0.3",
|
||||
"picomatch": "^2.3.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.6"
|
||||
@@ -824,16 +837,27 @@
|
||||
}
|
||||
},
|
||||
"node_modules/minimist": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
|
||||
"dev": true
|
||||
"version": "1.2.8",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
|
||||
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/nanoid": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
|
||||
"integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
|
||||
"version": "3.3.11",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
|
||||
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"nanoid": "bin/nanoid.cjs"
|
||||
},
|
||||
@@ -931,10 +955,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/picocolors": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
|
||||
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
|
||||
"dev": true
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
|
||||
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/picomatch": {
|
||||
"version": "2.3.1",
|
||||
@@ -949,21 +974,32 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.4.6",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz",
|
||||
"integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==",
|
||||
"version": "8.5.3",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
|
||||
"integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/postcss/"
|
||||
},
|
||||
{
|
||||
"type": "tidelift",
|
||||
"url": "https://tidelift.com/funding/github/npm/postcss"
|
||||
},
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"nanoid": "^3.2.0",
|
||||
"picocolors": "^1.0.0",
|
||||
"source-map-js": "^1.0.2"
|
||||
"nanoid": "^3.3.8",
|
||||
"picocolors": "^1.1.1",
|
||||
"source-map-js": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^10 || ^12 || >=14"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/postcss/"
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-js": {
|
||||
@@ -1093,10 +1129,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/regenerator-runtime": {
|
||||
"version": "0.13.9",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
|
||||
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
|
||||
"dev": true
|
||||
"version": "0.14.1",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
|
||||
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/resolve": {
|
||||
"version": "1.22.0",
|
||||
@@ -1157,6 +1194,29 @@
|
||||
"queue-microtask": "^1.2.2"
|
||||
}
|
||||
},
|
||||
"node_modules/seroval": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/seroval/-/seroval-1.2.1.tgz",
|
||||
"integrity": "sha512-yBxFFs3zmkvKNmR0pFSU//rIsYjuX418TnlDmc2weaq5XFDqDIV/NOMPBoLrbxjLH42p4UzRuXHryXh9dYcKcw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/seroval-plugins": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.2.1.tgz",
|
||||
"integrity": "sha512-H5vs53+39+x4Udwp4J5rNZfgFuA+Lt+uU+09w1gYBVWomtAl98B+E9w7yC05Xc81/HgLvJdlyqJbU0fJCKCmdw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"seroval": "^1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/shebang-command": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
|
||||
@@ -1179,16 +1239,23 @@
|
||||
}
|
||||
},
|
||||
"node_modules/solid-js": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.3.5.tgz",
|
||||
"integrity": "sha512-PUom2cCARfvvgxI7cwOhfXMrZZZxjp+vIrb5fzVNBFyICy8A30wTqExwfUv457eJYgKpii2D3qStW9ILtKnShw==",
|
||||
"dev": true
|
||||
"version": "1.9.5",
|
||||
"resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.5.tgz",
|
||||
"integrity": "sha512-ogI3DaFcyn6UhYhrgcyRAMbu/buBJitYQASZz5WzfQVPP10RD2AbCoRZ517psnezrasyCbWzIxZ6kVqet768xw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"csstype": "^3.1.0",
|
||||
"seroval": "^1.1.0",
|
||||
"seroval-plugins": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/source-map-js": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
|
||||
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
|
||||
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
@@ -1274,6 +1341,7 @@
|
||||
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
||||
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"is-number": "^7.0.0"
|
||||
},
|
||||
@@ -1407,12 +1475,12 @@
|
||||
}
|
||||
},
|
||||
"@babel/runtime": {
|
||||
"version": "7.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.0.tgz",
|
||||
"integrity": "sha512-etcO/ohMNaNA2UBdaXBBSX/3aEzFMRrVfaPv8Ptc0k+cWpWW0QFiGZ2XnVqQZI1Cf734LbPGmqBKWESfW4x/dQ==",
|
||||
"version": "7.27.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
|
||||
"integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"regenerator-runtime": "^0.13.4"
|
||||
"regenerator-runtime": "^0.14.0"
|
||||
}
|
||||
},
|
||||
"@nodelib/fs.scandir": {
|
||||
@@ -1547,12 +1615,12 @@
|
||||
"dev": true
|
||||
},
|
||||
"braces": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fill-range": "^7.0.1"
|
||||
"fill-range": "^7.1.1"
|
||||
}
|
||||
},
|
||||
"browserslist": {
|
||||
@@ -1652,9 +1720,9 @@
|
||||
}
|
||||
},
|
||||
"cross-spawn": {
|
||||
"version": "7.0.3",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
||||
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"path-key": "^3.1.0",
|
||||
@@ -1668,6 +1736,12 @@
|
||||
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
|
||||
"dev": true
|
||||
},
|
||||
"csstype": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
|
||||
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
|
||||
"dev": true
|
||||
},
|
||||
"defined": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
|
||||
@@ -1743,9 +1817,9 @@
|
||||
}
|
||||
},
|
||||
"fill-range": {
|
||||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
@@ -1905,13 +1979,13 @@
|
||||
"dev": true
|
||||
},
|
||||
"micromatch": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
|
||||
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
|
||||
"version": "4.0.8",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
|
||||
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"braces": "^3.0.1",
|
||||
"picomatch": "^2.2.3"
|
||||
"braces": "^3.0.3",
|
||||
"picomatch": "^2.3.1"
|
||||
}
|
||||
},
|
||||
"mini-svg-data-uri": {
|
||||
@@ -1921,15 +1995,15 @@
|
||||
"dev": true
|
||||
},
|
||||
"minimist": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
|
||||
"version": "1.2.8",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
|
||||
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
|
||||
"dev": true
|
||||
},
|
||||
"nanoid": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
|
||||
"integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
|
||||
"version": "3.3.11",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
|
||||
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
|
||||
"dev": true
|
||||
},
|
||||
"node-releases": {
|
||||
@@ -1998,9 +2072,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"picocolors": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
|
||||
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
|
||||
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
|
||||
"dev": true
|
||||
},
|
||||
"picomatch": {
|
||||
@@ -2010,14 +2084,14 @@
|
||||
"dev": true
|
||||
},
|
||||
"postcss": {
|
||||
"version": "8.4.6",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz",
|
||||
"integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==",
|
||||
"version": "8.5.3",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
|
||||
"integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"nanoid": "^3.2.0",
|
||||
"picocolors": "^1.0.0",
|
||||
"source-map-js": "^1.0.2"
|
||||
"nanoid": "^3.3.8",
|
||||
"picocolors": "^1.1.1",
|
||||
"source-map-js": "^1.2.1"
|
||||
}
|
||||
},
|
||||
"postcss-js": {
|
||||
@@ -2086,9 +2160,9 @@
|
||||
}
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
"version": "0.13.9",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
|
||||
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
|
||||
"version": "0.14.1",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
|
||||
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
|
||||
"dev": true
|
||||
},
|
||||
"resolve": {
|
||||
@@ -2123,6 +2197,19 @@
|
||||
"queue-microtask": "^1.2.2"
|
||||
}
|
||||
},
|
||||
"seroval": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/seroval/-/seroval-1.2.1.tgz",
|
||||
"integrity": "sha512-yBxFFs3zmkvKNmR0pFSU//rIsYjuX418TnlDmc2weaq5XFDqDIV/NOMPBoLrbxjLH42p4UzRuXHryXh9dYcKcw==",
|
||||
"dev": true
|
||||
},
|
||||
"seroval-plugins": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.2.1.tgz",
|
||||
"integrity": "sha512-H5vs53+39+x4Udwp4J5rNZfgFuA+Lt+uU+09w1gYBVWomtAl98B+E9w7yC05Xc81/HgLvJdlyqJbU0fJCKCmdw==",
|
||||
"dev": true,
|
||||
"requires": {}
|
||||
},
|
||||
"shebang-command": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
|
||||
@@ -2139,15 +2226,20 @@
|
||||
"dev": true
|
||||
},
|
||||
"solid-js": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.3.5.tgz",
|
||||
"integrity": "sha512-PUom2cCARfvvgxI7cwOhfXMrZZZxjp+vIrb5fzVNBFyICy8A30wTqExwfUv457eJYgKpii2D3qStW9ILtKnShw==",
|
||||
"dev": true
|
||||
"version": "1.9.5",
|
||||
"resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.5.tgz",
|
||||
"integrity": "sha512-ogI3DaFcyn6UhYhrgcyRAMbu/buBJitYQASZz5WzfQVPP10RD2AbCoRZ517psnezrasyCbWzIxZ6kVqet768xw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"csstype": "^3.1.0",
|
||||
"seroval": "^1.1.0",
|
||||
"seroval-plugins": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"source-map-js": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
|
||||
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
|
||||
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
|
||||
"dev": true
|
||||
},
|
||||
"supports-color": {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Statiq.App;
|
||||
using Statiq.App;
|
||||
using Statiq.Common;
|
||||
using Statiq.Web;
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Immutable;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace Docs.Extensions
|
||||
namespace Docs.Extensions
|
||||
{
|
||||
public static class StringExtensions
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Docs.Models
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Linq;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using Docs.Utilities;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
@@ -99,8 +99,7 @@ public class Api : Pipeline
|
||||
new ConcatDocuments(nameof(Code)),
|
||||
new CacheDocuments(
|
||||
new AnalyzeCSharp()
|
||||
.WhereNamespaces(ns => ns.StartsWith("Spectre.Console") && !ns.Contains("Analyzer") &&
|
||||
!ns.Contains("Testing") && !ns.Contains("Examples"))
|
||||
.WhereNamespaces(ns => ns.StartsWith("Spectre.Console") && !ns.Contains("Analyzer") && !ns.Contains("Examples"))
|
||||
.WherePublic(true)
|
||||
.WithCssClasses("code", "cs")
|
||||
.WithDestinationPrefix("api")
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Statiq.Common;
|
||||
using Statiq.Common;
|
||||
using Statiq.Web.GitHub;
|
||||
using Statiq.Web.Netlify;
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Docs.Extensions;
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
<div id="container">
|
||||
<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 7.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"></div>
|
||||
<div class="line">╭────────────────────────────────────────────────────────╮</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
@@ -58,21 +58,31 @@ internal static class HighlightService
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
private static string HighlightElement(Workspace workspace, SemanticModel semanticModel, SourceText fullSourceText,
|
||||
private static async Task<string> HighlightElement(Document document,
|
||||
SourceText fullSourceText,
|
||||
TextSpan textSpan, int indent)
|
||||
{
|
||||
|
||||
var classifiedSpans = Classifier.GetClassifiedSpans(semanticModel, textSpan, workspace);
|
||||
var classifiedSpans = await Classifier.GetClassifiedSpansAsync(document, textSpan);
|
||||
return HighlightElement(classifiedSpans, fullSourceText, indent);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,21 +3,15 @@
|
||||
"isRoot": true,
|
||||
"tools": {
|
||||
"cake.tool": {
|
||||
"version": "3.0.0",
|
||||
"version": "5.1.0",
|
||||
"commands": [
|
||||
"dotnet-cake"
|
||||
]
|
||||
},
|
||||
"gpr": {
|
||||
"version": "0.1.281",
|
||||
"verify.tool": {
|
||||
"version": "0.6.0",
|
||||
"commands": [
|
||||
"gpr"
|
||||
]
|
||||
},
|
||||
"dotnet-example": {
|
||||
"version": "2.0.0",
|
||||
"commands": [
|
||||
"dotnet-example"
|
||||
"dotnet-verify"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(1)]
|
||||
public int Count { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net7.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,38 +0,0 @@
|
||||
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"); ;
|
||||
});
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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>net7.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(new[] { "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(new[] { "serve", "-o", "firefox" })
|
||||
.WithExample(new[] { "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>net7.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,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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user