本プロジェクトは prh をGo言語で再実装するものです。
本プロジェクトの実装による挙動は極力prhに近づけたいとは考えていますが、prh自体の仕様が文書化されていないため、完全な移植版ではありません。 またprhはTypeScriptで実装されていますが、Goで実装するために正規表現の互換性がありません。そのため、元のprh.ymlファイルはそのままでは動作しない可能性があります。 作者の実用上の理由から本家prhにはない機能が追加されることもありえます。
- テキスト置換: YAML形式のルールファイルに基づく自動テキスト置換
- 複数ファイル対応: 複数のファイルを一度に処理
- ルールファイル自動検索:
grh.ymlまたはgrh.yamlの自動検出 - Hugoショートコード保護: Hugoショートコード内のテキストを置換から保護
- Markdown検証: 基本的なMarkdown構文の検証
- 多様な出力形式: 標準出力、差分表示、ファイル上書きに対応
- 統計情報表示: 処理結果の統計情報を自動表示
- 包括的なテスト: 単体テスト、統合テスト、CLIテストを完備
- ルートディレクトリ: github.com/ymotongpoo/grh をライブラリとして実装するパッケージ
- cmd: github.com/ymotongpoo/grh をインポートし、grhコマンドを実装するためのパッケージ
- testdata/yaml: テスト用のルール定義ファイルが置いてあるディレクトリ
- testdata/doc: テスト用のドキュメントが置いてあるディレクトリ
grhの基本的な機能は、YAML形式で表現されたルールに基づいて、与えられたファイル内の文章を置換します。
grh 対象ファイル [対象ファイル...]
複数ファイルを指定すると、ファイルそれぞれに対してルールを適用します。
ルールファイルは指定がない場合は、コマンドを実行した際のカレントディレクトリおよびその親ディレクトリを辿っていって見つかった grh.yml もしくは grh.yaml ファイルを読み込みます。
grhコマンドは次のようなオプションを受け付けます。
- --rules-yaml: 読み込んだルールを標準出力にYAML形式で表示する。出力用のYAMLの仕様は後述する。
- --rules-json: 読み込んだルールを標準出力にJSON形式で表示する。出力用のJSONのスキーマは
--rules-yamlと同じ。 - --rules: grhコマンドを実行する際のルールファイルを指定する。この場合デフォルトのルールファイルの読み込み規則は適用しない。
- --verify: 指定したファイルがMarkdownとして正しいか確認する。ただし Hugo の各種ショートコードは認める。
- --stdout: 指定したファイルをルールファイルに基づいて置換した結果を標準出力に表示する
- --diff: 指定したファイルとそれをルールファイルに基づいて置換した結果をUnified diff形式で出力する
- -r, --replace: 指定したファイルをルールファイルに基づいて置換し上書きする
ルールは次のYAMLスキーマを用いて設定します。 各フィールドの説明は grh.yaml を参照してください。そのファイル内のコメントに詳細な解説があります。
ignorePatternBeforeオプションを使用することで、特定のパターンの直前にある場合に置換を実行しないよう設定できます。
rules:
- expected: 運用担当者
patterns:
- オペレーター
ignorePatternBefore: 'Kubernetes\s*$'記述時の注意点:
- 正規表現パターンは必ずシングルクォート(
')で囲む - パターンの最後に
$を付けて、マッチ対象が直前に位置することを明確にする - スペースやタブを含む場合は
\s*や\s+などの正規表現メタ文字を使用 - Go言語のRE2正規表現エンジンを使用(JavaScript/Perlとは一部記法が異なる)
上記の例では「Kubernetesオペレーター」「Kubernetes オペレーター」は置換されず、「サービスのオペレーター」は「サービスの運用担当者」に置換されます。
--rules-yaml や --rules-json で表示する仕様はルールファイルと同じですが、複数のルールファイルを読み込んだあとの最終結果を表示します。
複数のルールファイルを読み込んだ場合、最後に読み込まれたルールが優先されます。
また上のルールファイルの仕様に加えて、以下のフィールドが追加されています。
sourcePaths: 読み込んだルールファイルのパスの配列。複数ある場合はすべて列挙します。
grhはHugoの静的サイトジェネレーターで使用されるショートコードを認識し、ショートコード内のテキストを置換から保護します。
対応しているショートコード形式:
- ペアードショートコード:
{{< name >}}...{{< /name >}} - ペアードショートコード(代替形式):
{{% name %}}...{{% /name %}} - セルフクローズショートコード:
{{< name >}}、{{< name />}} - セルフクローズショートコード(代替形式):
{{% name %}}、{{% name /%}}
grhは処理完了後に統計情報を自動的に表示します。統計情報には以下の内容が含まれます:
- 処理ファイル数: 処理対象となったファイルの総数
- 変更ファイル数: 実際に変更が発生したファイルの数
- 総置換回数: 全ファイルでの置換処理の総回数
- ファイル別詳細: 変更があったファイルごとの置換回数
処理結果:
処理ファイル数: 3
変更ファイル数: 2
総置換回数: 5
ファイル別詳細:
document1.md: 3件の置換
document2.md: 2件の置換
以下のオプション使用時は統計情報は表示されません:
--verify: Markdown検証モード--rules-yaml: ルール表示(YAML形式)--rules-json: ルール表示(JSON形式)
grhは構造化ログ(JSON Lines形式)を標準エラー出力に出力します。
- デフォルト: 警告(Warn)レベル以上のメッセージのみ表示
- --verify使用時: 情報(Info)レベル以上のメッセージを表示
{"time":"2025-06-28T12:00:00Z","level":"INFO","msg":"Processing file","file_path":"document.md"}
{"time":"2025-06-28T12:00:00Z","level":"WARN","msg":"Markdown validation issues found","issues_count":2}# カレントディレクトリのgrh.ymlを使用してファイルを処理
grh document.md
# 特定のルールファイルを指定
grh --rules custom-rules.yml document.md
# 複数ファイルを一度に処理
grh *.md
# 結果を標準出力に表示(ファイルは変更しない)
grh --stdout document.md
# 差分を表示
grh --diff document.md
# ファイルを上書き
grh --replace document.md# 読み込まれるルールをYAML形式で確認
grh --rules-yaml
# 読み込まれるルールをJSON形式で確認
grh --rules-json# Markdownファイルの構文を検証
grh --verify document.md# 全テストを実行
go test
# 特定のテストを実行
go test -run TestIntegration
# 詳細なテスト出力
go test -v# grhコマンドをビルド
go build -o grh ./cmd/grh
# インストール
go install ./cmd/grh