Skip to content

Latest commit

 

History

History
414 lines (299 loc) · 15.3 KB

README.jp.md

File metadata and controls

414 lines (299 loc) · 15.3 KB

Spectre.Console

Spectre.Console NuGet Version

綺麗なコンソールアプリケーションを簡単に作成するための.NETライブラリです。 Python用の素晴らしいRich ライブラリに強く影響を受けています。

目次

  1. 特徴
  2. 使用方法
    3.1. Static APIの利用
    3.2. コンソールの作成
  3. 例の実行
  4. クイックスタート
  5. マークアップ
  6. 絵文字
  7. テーブル
  8. 例外

特徴

  • ユニットテストを意識して書いています。
  • table、grid、panel、マークアップ言語に影響を受けた rich に対応しています。
  • 太字、薄字、斜字、下線、斜線、点滅などの一般的なSGR parameters に対応しています。
  • ターミナルで 3/4/8/24ビットカラーに対応しています。 ライブラリは現在のターミナルの性能を検知し、必要なカラーにダウングレードします

Example

使用方法

Spectre.Console APIはステートフルで、スレッドセーフではありません。 異なるスレッドからコンソールに書く必要がある場合、通常のSystem.Console APIを使用するときと同様、適切な注意を払ってください。

現在の端末がANSIエスケープシーケンスに対応していない場合、 Spectre.Consoleは、System.Console APIの利用に切り替わります。

メモ: このライブラリは現在開発中で、APIは1.0のリリースまでの間に変更されたり、 削除されたりする可能性があります。

Static APIの利用

System.Console APIでするように、テキストを出力したいだけの時にはstatic APIが最適ですが、綺麗です。

AnsiConsole.Foreground = Color.CornflowerBlue;
AnsiConsole.Decoration = Decoration.Underline | Decoration.Bold;
AnsiConsole.WriteLine("Hello World!");

AnsiConsole.Reset();
AnsiConsole.MarkupLine("[bold yellow on red]{0}[/] [underline]world[/]!", "Goodbye");

もし、デフォルトのIAnsiConsoleへの参照を取得したい場合、 AnsiConsole.Console経由でアクセスできます。

コンソールの作成

単体テスト中にコードの実行環境を制御したい場合など、 特定の機能をもつコンソールを明示的に作成すると便利なことがあります。

単体テストの一部としてコードで AnsiConsoleを使わないことを推奨します。

IAnsiConsole console = AnsiConsole.Create(
    new AnsiConsoleSettings()
    {
        Ansi = AnsiSupport.Yes,
        ColorSystem = ColorSystemSupport.TrueColor,
        Out = new StringWriter(),
    });

メモ: 主導でコンソールを作成しているときに特定のカラーシステムを指定できたとしても、 ユーザーのターミナルでは使えないかもしれないことを覚えておいてください。 テスト用にIAnsiConsoleを作成していない限り、 常にColorSystemSupport.DetectAnsiSupport.Detectを使用してください。

例の実行

Spectre.Consoleでできることを見るために、 dotnet-exampleグローバルツールをインストールします。

> dotnet tool restore

このリポジトリで提供している例が一覧表示されます

> dotnet example

╭────────────┬───────────────────────────────────────┬──────────────────────────────────────────────────────╮
│ Name       │ Path                                  │ Description                                          │
├────────────┼───────────────────────────────────────┼──────────────────────────────────────────────────────┤
│ Borders    │ examples/Borders/Borders.csproj       │ Demonstrates the different kind of borders.          │
│ Calendars  │ examples/Calendars/Calendars.csproj   │ Demonstrates how to render calendars.                │
│ Colors     │ examples/Colors/Colors.csproj         │ Demonstrates how to use colors in the console.       │
│ Columns    │ examples/Columns/Columns.csproj       │ Demonstrates how to render data into columns.        │
│ Emojis     │ examples/Emojis/Emojis.csproj         │ Demonstrates how to render emojis.                   │
│ Exceptions │ examples/Exceptions/Exceptions.csproj │ Demonstrates how to render formatted exceptions.     │
│ Grids      │ examples/Grids/Grids.csproj           │ Demonstrates how to render grids in a console.       │
│ Info       │ examples/Info/Info.csproj             │ Displays the capabilities of the current console.    │
│ Links      │ examples/Links/Links.csproj           │ Demonstrates how to render links in a console.       │
│ Panels     │ examples/Panels/Panels.csproj         │ Demonstrates how to render items in panels.          │
│ Rules      │ examples/Rules/Rules.csproj           │ Demonstrates how to render horizontal rules (lines). │
│ Tables     │ examples/Tables/Tables.csproj         │ Demonstrates how to render tables in a console.      │
│ Trees      │ examples/Trees/Trees.csproj           │ Demonstrates how to render trees in a console.       │
╰────────────┴───────────────────────────────────────┴──────────────────────────────────────────────────────╯

そして、例を実行します

> dotnet example tables
┌──────────┬──────────┬────────┐
│ Foo      │ Bar      │ Baz    │
├──────────┼──────────┼────────┤
│ Hello    │ World!   │        │
│ Bonjour  │ le       │ monde! │
│ Hej      │ Världen! │        │
└──────────┴──────────┴────────┘

クイックスタート

pectre.Consoleの利用を開始する最初の方法は、Nugetパッケージをインストールすることです。

> dotnet add package Spectre.Console

その後、Spectre.Console名前空間を参照する必要があります。一度参照したら、提供されている全ての機能を使用できます。

using Spectre.Console

public static class Program
{
    public static void Main(string[] args)
    {
        AnsiConsole.Markup("[underline red]Hello[/] World!");
    }
}

マークアップ

Markupクラスは、コンソールにリッチなテキストを出力することができます。

文法

コンソールマークアップはbbcodeに影響を受けた文法を利用します。角括弧でスタイルを書いたら(スタイルを参照)、例えば、[bold red] は、[/]で閉じるまでスタイルが適用されます。

AnsiConsole.Render(new Markup("[bold yellow]Hello[/] [red]World![/]"));

Markup クラスはIRenderableを実装しており、table、grid、Panelを使用できることを意味します。 IRenderableのレンダリングに対応している多くのクラスは、リッチテキストの描画を上書きます。

var table = new Table();
table.AddColumn(new TableColumn(new Markup("[yellow]Foo[/]")));
table.AddColumn(new TableColumn("[blue]Bar[/]"));

便利なメソッド

AnsiConsoleには、新しいMarkupインスタンスをインスタンス化することなく、コンソールにマークアップテキストを書き込める便利なメソッドがあります。

AnsiConsole.Markup("[underline green]Hello[/] ");
AnsiConsole.MarkupLine("[bold]World[/]");

エスケープ文字列

[を出力するために、 [[を利用し、]を出力するために]]を利用します。

AnsiConsole.Markup("[[Hello]] "); // [Hello]
AnsiConsole.Markup("[red][[World]][/]"); // [World]

SafeMarkup拡張メソッドを使用することもできます。

AnsiConsole.Markup("[red]{0}[/]", "Hello [World]".SafeMarkup());

カラー

new Style(foreground: Color.Maroon)のようなコード、または、AnsiConsole.Markup("[maroon on blue]Hello[/]")のようなマークアップテキストで色を使用できます。

背景色の設定

カラー指定の際に、onを付けることで、マークアップで背景色を設定できます。

[bold yellow on blue]Hello[/]
[default on blue]World[/]

絵文字の描画

マークアップの一部として絵文字を出力するために、emojiショートコードが使用できます。

AnsiConsole.MarkupLine("Hello :globe_showing_europe_africa:!");

emojiのスタイルについては、付録のEmoji を参照してください。

カラー

上の例では、全ての色は名前で参照されています。 しかし、16進数やRGB表現をマークダウンで色指定に使用できます。

AnsiConsole.Markup("[red]Foo[/] ");
AnsiConsole.Markup("[#ff0000]Bar[/] ");
AnsiConsole.Markup("[rgb(255,0,0)]Baz[/] ");

絵文字

どのような絵文字が使用できるかは、使用しているOSやターミナルに依存し、どのように表示されるかは保証されません。絵文字の幅計算は正確ではないため、表、パネル、グリッドで使用する場合は表示がずれるかもしれません。

完全な互換性を確保するために、Unicode 13.0 より以前のEmoji_Presentationカテゴリにあるものだけを使用することを検討してください。 公式の絵文字一覧 https://www.unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt

// Markup
AnsiConsole.MarkupLine("Hello :globe_showing_europe_africa:!");

// Constant
var hello = "Hello " + Emoji.Known.GlobeShowingEuropeAfrica;

テキスト内の絵文字を置き換えることができます。

var phrase = "Mmmm :birthday_cake:";
var rendered

既存の絵文字を別のものにしたり、完全に新しい物を追加したいことがあります。このために、Emoji.Remapメソッドを使用できます。 この方法は、マークアップ文字とEmoji.Replaceの両方で動作します。

// Remap the emoji
Emoji.Remap("globe_showing_europe_africa", "😄");

// Render markup
AnsiConsole.MarkupLine("Hello :globe_showing_europe_africa:!");

// Replace emojis in string
var phrase = "Hello :globe_showing_europe_africa:!";
var rendered = Emoji.Replace(phrase);

テーブル

テーブルはターミナルで表データを表示するのに完璧な方法です。 Spectre.Console は、テーブルの描画にとても優れていて、全てのカラムは中に合わせて調整してくれます。 IRenderableを実装しているものは、列ヘッダやセル、別のテーブルとして使用できます。

使い方

テーブルを描画するために、Tableインスタンスを作成し、必要な数の列を追加し、行を追加します。 テーブルをコンソールのRenderメソッドに渡して終わりです。

// テーブルの作成
var table = new Table();

// 列の追加
table.AddColumn("Foo");
table.AddColumn(new TableColumn("Bar").Centered());

// 行の追加
table.AddRow("Baz", "[green]Qux[/]");
table.AddRow(new Markup("[blue]Corgi[/]"), new Panel("Waldo"));

// コンソールにテーブルの描画
AnsiConsole.Render(table);

これは次のように出力を描画します。

Table

罫線

// 罫線を設定します
table.SetBorder(Border.None);
table.SetBorder(Border.Ascii);
table.SetBorder(Border.Square);
table.SetBorder(Border.Rounded);

拡大 / 縮小

// テーブル幅を最大に設定します
table.Expand();

// テーブル幅を最小に設定します
table.Collapse();

ヘッダーを隠す

// 全ての列のヘッダーを隠します
table.HideHeaders();

テーブル幅の設定

// テーブル幅50セルに設定します
table.SetWidth(50);

整列(アライメント)

// 整列を明示的に設定する
column.SetAlignment(Justify.Right);

パディング

// 左と右のパディングを設定する
column.SetPadding(left: 3, right: 5);

// 個別にパディングを設定する
column.PadLeft(3);
column.PadRight(5);

列改行の無効化

// 列改行の無効化
column.NoWrap();

列幅の設定

// 列幅の設定(これはまだ柔軟な拡張メソッドがありません)
column.Width = 15;

例外

例外はターミナルで見たときに読みやすいとは限りません。 WriteExceptionメソッドを使用することで、例外をもう少し読みやすくすることができます。

AnsiConsole.WriteException(ex);

exception

例外の省略表示

例外の特定部分を短くして、さらに読みやすくしたり、パスをクリック可能なハイパーリンクにすることもできます。 ハイパーリンクがクリックできるかはターミナル次第です。

AnsiConsole.WriteException(ex, 
    ExceptionFormats.ShortenPaths | ExceptionFormats.ShortenTypes |
    ExceptionFormats.ShortenMethods | ExceptionFormats.ShowLinks);

exception

例外出力のカスタマイズ

例外の特定部分を短縮するだけでなく、デフォルトのスタイルを上書きすることもできます。

AnsiConsole.WriteException(ex, new ExceptionSettings
{
    Format = ExceptionFormats.ShortenEverything | ExceptionFormats.ShowLinks,
    Style = new ExceptionStyle
    {
        Exception = Style.WithForeground(Color.Grey),
        Message = Style.WithForeground(Color.White),
        NonEmphasized = Style.WithForeground(Color.Cornsilk1),
        Parenthesis = Style.WithForeground(Color.Cornsilk1),
        Method = Style.WithForeground(Color.Red),
        ParameterName = Style.WithForeground(Color.Cornsilk1),
        ParameterType = Style.WithForeground(Color.Red),
        Path = Style.WithForeground(Color.Red),
        LineNumber = Style.WithForeground(Color.Cornsilk1),
    }
});

exception