doxybook2-decolorize-output.sh 仕様

1 概要

doxybook2-decolorize-output.sh は、Doxybook2 の出力メッセージから過剰な ANSI カラーコードを除去するフィルタースクリプトです。[info] ログを完全に脱色し、[warning] / [error] / [critical] の太字を除去します。

2 背景と目的

2.1 問題点

Doxybook2 は spdlog ライブラリを使用してログ出力を行っており、デフォルトで ANSI カラーコードによる着色が有効になっています。実行時、以下の問題が発生します。

  • [info] レベルのログが緑色で大量に出力され、視認性が低下する
  • Doxygen とは逆に、着色が過剰である
  • [info] は情報メッセージであり、着色の必要性が低い
  • [warning][error][critical] の太字も、強調が過剰である
  • [critical] の赤背景も過剰であり、通常の赤文字で十分である

2.2 目標

Doxygen 着色スクリプト (doxygen-colorize-output.sh) とは逆のアプローチを採用します。

  • 着色の削除: 過剰な ANSI エスケープコードを除去
  • 選択的処理: [info] は完全脱色、[warning] / [error] / [critical] は太字を除去
  • 単語のみ着色: すべてのログレベルで、[単語] のみが着色される

3 ファイルパス

doxybook2-decolorize-output.sh

4 実行権限

実行可能 (chmod +x)

5 機能

標準入力から受け取った各行を解析し、ログレベルに応じて ANSI カラーコードを除去または調整します。

5.1 処理ルール

ログレベル 検出パターン 処理内容 処理後の表示
Info [info] 全ての ANSI コードを削除 デフォルト (着色なし)
Critical [critical] 太字と背景色を除去し、赤色に変換 🔴 赤 (通常の太さ、背景なし)
Warning [warning] 太字コードを除去、黄色は維持 🟡 黄 (通常の太さ)
Error [error] 太字コードを除去、赤色は維持 🔴 赤 (通常の太さ)
その他 (該当なし) そのまま出力 変更なし

6 実装詳細

6.1 処理フロー

処理フロー

6.2 マッチング条件

6.2.1 Info ログの検出

if [[ "$line" == *"[info]"* ]]; then

行内に [info] が含まれる場合にマッチします。

6.2.2 Critical ログの検出

elif [[ "$line" == *"[critical]"* ]]; then

行内に [critical] が含まれる場合にマッチします。

6.2.3 Warning/Error ログの検出

elif [[ "$line" == *"[warning]"* ]] || [[ "$line" == *"[error]"* ]]; then

行内に [warning] または [error] が含まれる場合にマッチします。

6.3 ANSI エスケープコードの除去・変換

6.3.1 Info ログの完全脱色

echo "$line" | sed 's/\x1b\[[0-9;]*m//g'

正規表現の説明:
- \x1b: ESC 文字 (8 進数 033)
- \[: 左角括弧
- [0-9;]*: 数字とセミコロンの 0 回以上の繰り返し
- m: 終端文字

6.3.2 Critical ログの太字と背景色の除去

echo "$line" | sed 's/\x1b\[1;41m/\x1b[0;31m/g'

処理内容:
- 太字 + 赤背景 (\033[1;41m) を通常の赤文字 (\033[0;31m) に変換
- [critical] という単語のみが赤色で表示される

6.3.3 Warning/Error ログの太字除去

echo "$line" | sed 's/\x1b\[1;/\x1b[0;/g'

変換例:
- \033[1;33m (太字 + 黄色) → \033[0;33m (通常 + 黄色)
- \033[1;31m (太字 + 赤色) → \033[0;31m (通常 + 赤色)

6.4 設計上の考慮事項

6.4.1 Doxygen 着色スクリプトとの対比

項目 doxygen-colorize-output.sh doxybook2-decolorize-output.sh
目的 着色を追加 着色を削除/調整
対象 error, warning info, warning, error
処理 ANSI コードを付与 ANSI コードを除去/変換
理由 着色が不足 着色が過剰

6.4.2 パターンマッチングの簡潔性

[info] の形式は、スペースを含まない明確なパターンであるため、誤検知の可能性が低く、シンプルなマッチングで十分です。

7 使用方法

7.1 makefile からの呼び出し

doxybook2 -i ../xml -o ../docs-src/doxybook2 --config doxybook2-config.json --templates templates 2>&1 | $(MAKEFILE_DIR)/doxybook2-decolorize-output.sh
  • 2>&1: stderr を stdout にリダイレクトして結合
  • |: パイプでフィルタースクリプトに渡す

7.2 終了コードの保持

doxybook2 -i ../xml -o ../docs-src/doxybook2 --config doxybook2-config.json --templates templates 2>&1 | $(MAKEFILE_DIR)/doxybook2-decolorize-output.sh;
DOXYBOOK2_EXIT=${PIPESTATUS[0]};
exit $DOXYBOOK2_EXIT;

PIPESTATUS[0] を使用して、パイプの最初のコマンド (doxybook2) の終了コードを取得し、ビルドの成否を正しく判定します。

8 出力例

8.1 処理前

[2025-11-26 10:30:15.123] [info] Processing file calculator.h
[2025-11-26 10:30:15.124] [warning] Missing brief description
[2025-11-26 10:30:15.125] [error] Failed to parse member
[2025-11-26 10:30:15.126] [critical] Fatal error occurred

(ターミナルでは [info] が緑、[warning] が太字黄色、[error] が太字赤色、[critical] が太字 + 赤背景で表示)

8.2 処理後

[2025-11-26 10:30:15.123] [info] Processing file calculator.h

[2025-11-26 10:30:15.124] [warning] Missing brief description
[2025-11-26 10:30:15.125] [error] Failed to parse member
[2025-11-26 10:30:15.126] [critical] Fatal error occurred

([info] は着色なし、[warning] 単語は通常の太さの黄色、[error][critical] 単語は通常の太さの赤色で表示)

9 制限事項

9.1 ANSI カラーコード非対応環境

元々 ANSI カラーコードに対応していないターミナルでは、Doxybook2 自体が着色を出力しないため、本スクリプトの効果はありません。

9.2 ログファイルへの出力

ANSI カラーコードを含む出力をファイルにリダイレクトする場合、本スクリプトを適用することで、ログファイルに不要なエスケープシーケンスが含まれることを防げます。

doxybook2 ... 2>&1 | doxybook2-decolorize-output.sh | tee doxybook2.log

10 テスト方法

以下のコマンドでスクリプト単体のテストが可能です。

cat <<'EOF' | doxybook2-decolorize-output.sh
Normal output line
[2025-11-26 10:30:15.123] [info] Processing file
Another normal line
[2025-11-26 10:30:15.124] [warning] Missing description
[2025-11-26 10:30:15.125] [error] Parse failed
[2025-11-26 10:30:15.126] [critical] Fatal error
More normal output
EOF

期待される結果:
- [info] 行: ANSI コードが完全に削除される
- [critical] 行: 太字と背景色が除去され、[critical] 単語が通常の太さの赤色になる
- [warning] 行: 太字が除去され、[warning] 単語が通常の太さの黄色になる
- [error] 行: 太字が除去され、[error] 単語が通常の太さの赤色になる

実際の ANSI コードを含むテストは以下の通りです。

cat <<'EOF' | doxybook2-decolorize-output.sh
Normal output line
[2025-11-26 10:30:15.123] [32m[info][0m Processing file
[2025-11-26 10:30:15.124] [1;33m[warning][0m Missing description
[2025-11-26 10:30:15.125] [1;31m[error][0m Parse failed
[2025-11-26 10:30:15.126] [1;41m[critical][0m Fatal error
EOF

11 関連ファイル

  • makefile: 本スクリプトを doxybook2 実行時に適用
  • docs-src/doxybook2-decolorize-output-research.md: 調査結果と背景情報
  • doxygen-colorize-output.sh: Doxygen 用の着色スクリプト (対比参考)