Kotlin製テキスト装飾ライブラリMordantを試す

Kotlinで使える文字装飾ライブラリを探していたところ、Mordantというライブラリを見つけたので紹介します。

- ドキュメント

https://ajalt.github.io/mordant/

- リポジトリ

https://github.com/ajalt/mordant

## 導入

``build.gradle.kts``を編集します。

```Kotlin
// build.gradle.kts
repositories {
    mavenCentral()
}

dependencies {
    implementation("com.github.ajalt.mordant:mordant:2.1.0")
}
```

## 文字を装飾する

標準出力にテキストを表示するには``println()``ではなく、``Terminal.println()``を利用します。

```kotlin
import com.github.ajalt.mordant.rendering.TextColors.*
import com.github.ajalt.mordant.rendering.TextStyles.*
import com.github.ajalt.mordant.terminal.Terminal

fun main() {
    val t = Terminal()

    t.println("Hello, ${(blue on gray)("World!")}")

    val style = (bold + white + underline)
    t.println(style("スタイルの組み合わせを記述できる！"))
    t.println(style("作ったスタイルは使い回せる。"))
}
```

出力するとこうなります。whiteが白っぽくないのは、IntelliJで実行しているからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/caffd2c8-e4b7-f161-d7b9-663497b5744e.png)

文字に色をつけるときは、``blue on gray``のように表現することができます。便利ですね。

もちろん、関数のように書くこともできます。

- [参考: Usage](https://ajalt.github.io/mordant/#usage)

https://ajalt.github.io/mordant/#usage

## 表(テーブル)を出力する

Mordantでは、テーブルを宣言的に作成し表示することができます。

```kotlin
import com.github.ajalt.mordant.table.table
import com.github.ajalt.mordant.terminal.Terminal

fun main() {
    val t = Terminal()

    t.println(table{
        header{
            row("Name", "Age")
        }
        body{
            row("John Doe", "30")
            row("山田 二郎", "32")
        }
    })
}
```

出力するとこうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/a45a2dbd-3a8c-529b-4088-dafbc8f2c5a1.png)

日本語で表示が崩れる問題は、等幅フォントを利用することで解決します。（HackGen Console NFを利用）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/94434dbc-17be-1053-5d14-bfa381813d42.png)

## Markdown文書を出力する

なんとMarkdownで記述した文書を渡すことで適当にスタイリングして表示してくれます。

以下のようなMarkdown文書を渡してみます。

````Markdown
# Header 1
## Header 2
### Header 3
#### Header 4
##### Header 5
###### Header 6

- List item 1
- List item 2
- List item 3
1. Ordered list item 1
2. Ordered list item 2
3. Ordered list item 3
- [Link](https://example.com/)

```
Code Block
```

> Blockquote
````

ターミナルではこのように表示されます。すごい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/25e93f5f-d861-2ac4-3e9a-de3d13b44653.png)

ソースコードはこんな感じに書くだけです。

```kotlin
import com.github.ajalt.mordant.markdown.Markdown
import com.github.ajalt.mordant.terminal.Terminal
import kotlin.io.path.Path
import kotlin.io.path.readText

fun main() {
    val t = Terminal()

    t.print(Markdown(Path("sample.md").readText()))
}
```

## プログレスバーを表示する

次はプログレスバーを表示させてみます。

以下のようなコードを書いて実行します。

```kotlin
import com.github.ajalt.mordant.animation.progressAnimation
import com.github.ajalt.mordant.terminal.Terminal

fun main() {
    val t = Terminal()
    val progress = t.progressAnimation {
        text("Downloading...")
        percentage()
        progressBar()
        completed()
    }
    progress.start()

    Thread.sleep(100)
    progress.updateTotal(100)

    repeat(100){
        progress.advance(1)
        Thread.sleep(10)
    }
    Thread.sleep(1000)
    progress.stop()
}
```

実行するとこのような表示になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/f84d14cd-52a2-0e91-e430-b7d47625dff2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/12ee511a-6b97-c631-c49b-6767f4823e02.png)

プログレスバーは、進行前・進行中・終了によって異なるアニメーションで動作します。

- [参考: Progress bars](https://ajalt.github.io/mordant/#progress-bars)

https://ajalt.github.io/mordant/#progress-bars

## おわりに

とても便利なライブラリで、KotlinでちょっとしたCLI(TUI)アプリケーションを作成するときにお世話になりそうな気がします。