スタイル

Rich API の様々な箇所で、テキストの色や太字、斜体などの属性を定義する「スタイル」を設定できます。スタイルは、_スタイル定義_を含む文字列、またはStyleクラスのインスタンスとして指定できます。

スタイルの定義

スタイル定義は、色と属性を設定するための1つ以上の単語を含む文字列です。

前景色を指定するには、256色の標準色のいずれかを使用します。たとえば、「Hello」をマゼンタで出力するには、次のようにします。

console.print("Hello", style="magenta")

"color(<number>)"という構文で、色の番号(0から255までの整数)を使用することもできます。以下は同等の出力を生成します。

console.print("Hello", style="color(5)")

あるいは、CSSのような構文を使用して、「#」の後に3組の16進文字を続けるか、3つの10進整数を持つRGB形式で色を指定することもできます。以下の2行はどちらも「Hello」を同じ色(紫)で出力します。

console.print("Hello", style="#af00ff")
console.print("Hello", style="rgb(175,0,255)")

16進数とRGB形式を使用すると、1670万色のフル_トゥルーカラー_セットから選択できます。

注意

一部の端末は256色しかサポートしていません。Richは、指定した色が利用できない場合、最も近い色を選択しようとします。

単独では、色は_前景色_を変更します。_背景色_を指定するには、色の前に「on」という単語を付けます。たとえば、以下は白い背景に赤いテキストを出力します。

console.print("DANGER!", style="red on white")

また、"default"という単語で色を設定することもできます。これは、端末ソフトウェアによって管理されるデフォルトの色にリセットされます。これは背景にも有効なので、"default on default"のスタイルは端末の初期状態と同じです。

以下の単語を1つ以上追加することで、スタイル属性を設定できます。

  • 太字のテキストには、"bold"または"b"を使用します。

  • 点滅するテキストには、"blink"を使用します(これは控えめに使用してください)。

  • 高速で点滅するテキストには、"blink2"を使用します(ほとんどの端末ではサポートされていません)。

  • _隠蔽_テキストには、"conceal"を使用します(ほとんどの端末ではサポートされていません)。

  • 斜体のテキストには、"italic"または"i"を使用します(Windowsではサポートされていません)。

  • 前景色と背景色が反転したテキストには、"reverse"または"r"を使用します。

  • 取り消し線のテキストには、"strike"または"s"を使用します。

  • 下線のテキストには、"underline"または"u"を使用します。

Richは、あまりサポートされておらず、端末に表示されない可能性のある以下のスタイルもサポートしています。

  • 二重下線のテキストには、"underline2"または"uu"を使用します。

  • 枠で囲まれたテキストには、"frame"を使用します。

  • 円で囲まれたテキストには、"encircle"を使用します。

  • 上線のテキストには、"overline"または"o"を使用します。

スタイル属性と色は、互いに組み合わせて使用できます。例:

console.print("Danger, Will Robinson!", style="blink bold red underline on white")

属性の前に「not」という単語を付けることで、スタイルを無効にすることができます。これは、スタイルが重複する場合にスタイルをオフにするために使用できます。例:

console.print("foo [not bold]bar[/not bold] baz", style="bold")

これは、「foo」と「baz」を太字で出力しますが、「bar」は通常のテキストになります。

スタイルには、スタイル設定されたテキストを_ハイパーリンク_に変換する"link"属性を設定することもできます(端末ソフトウェアでサポートされている場合)。

スタイルにリンクを追加するには、定義に"link"という単語とそれに続くURLを含める必要があります。次の例は、クリック可能なリンクを作成します。

console.print("Google", style="link https://google.com")

注意

HTMLに精通している場合、この方法でリンクを適用するのは少し奇妙に感じるかもしれませんが、端末はリンクを太字、斜体などの別の属性と見なします。

スタイルクラス

最終的に、スタイル定義が解析され、Styleクラスのインスタンスが作成されます。必要に応じて、スタイル定義の代わりに Style クラスを使用できます。次に例を示します。

from rich.style import Style
danger_style = Style(color="red", blink=True, bold=True)
console.print("Danger, Will Robinson!", style=danger_style)

このように Style クラスを構築する方がわずかに高速です。スタイル定義の解析には少し時間がかかりますが、Rich は解析されたスタイル定義をキャッシュするため、最初の呼び出し時のみです。

スタイルは、それらを足し合わせることで組み合わせることができます。これは、既存のスタイルの属性を変更する場合に便利です。次に例を示します。

from rich.console import Console
from rich.style import Style
console = Console()

base_style = Style.parse("cyan")
console.print("Hello, World", style = base_style + Style(underline=True))

parse()メソッドを使用して、スタイル定義を明示的に解析できます。このメソッドは、スタイル定義を受け取り、Style インスタンスを返します。たとえば、次の2行は同等です。

style = Style(color="magenta", bgcolor="yellow", italic=True)
style = Style.parse("italic magenta on yellow")

スタイルテーマ

スタイルを再利用する場合、属性や色を変更したい場合に、スタイルが使用されているすべての行を変更する必要があるため、メンテナンスが面倒になることがあります。Richは、名前で参照できるカスタムスタイルを定義するために使用できるThemeクラスを提供します。こうすることで、スタイルを1箇所で更新するだけで済みます。

スタイルテーマを使用すると、コードをよりセマンティックにすることができます。たとえば、"warning"というスタイルは、"italic magenta underline"よりも意意図を明確に表現します。

スタイルテーマを使用するには、Themeインスタンスを構築し、Consoleコンストラクタに渡します。次に例を示します。

from rich.console import Console
from rich.theme import Theme
custom_theme = Theme({
    "info": "dim cyan",
    "warning": "magenta",
    "danger": "bold red"
})
console = Console(theme=custom_theme)
console.print("This is information", style="info")
console.print("[warning]The pod bay doors are locked[/warning]")
console.print("Something terrible happened!", style="danger")

注意

スタイル名は小文字で始まり、文字、".""-""_"のみを含める必要があります。

デフォルトのカスタマイズ

Theme クラスは、Rich に組み込まれているデフォルトのスタイルを継承します。カスタムテーマに既存のスタイルの名前が含まれている場合、そのスタイルは置き換えられます。これにより、独自のスタイルを作成するのと同じくらい簡単にデフォルトをカスタマイズできます。たとえば、Rich が数字を強調表示する方法を変更する方法は次のとおりです。

from rich.console import Console
from rich.theme import Theme
console = Console(theme=Theme({"repr.number": "bold green blink"}))
console.print("The total is 128")

rich.theme.Themeコンストラクタでinherit=Falseを設定することで、デフォルトテーマの継承を無効にすることができます。

デフォルトのテーマを確認するには、次のコマンドを実行します。

python -m rich.theme
python -m rich.default_styles

テーマの読み込み

必要に応じて、Pythonではなく外部設定ファイルにスタイルを記述できます。フォーマットの例を次に示します。

[styles]
info = dim cyan
warning = magenta
danger = bold red

read()メソッドを使用して、これらのファイルを読み取ることができます。