私が歌川です

@utgwkk が書いている

perlcriticのポリシーの一覧を見れるようにしたい

metacpanのAPIを使う作戦 (断念)

metacpanにはAPIがあるので、これを活用できないか考えます。

curl 'https://fastapi.metacpan.org/v1/module/_search?q=distribution:Perl-Critic&size=5000' というコマンドを実行することで、metacpanからPerl-Criticディストリビューションに含まれるモジュールの一覧を取得できます。pod というフィールドが含まれているのでこれが使えそうです。

が、この pod フィールドには、連続する空白文字をスペースに変換したPODの文字列が含まれています*1。テキストエディタの拡張機能などから使うぶんにはこれでもよいかもしれませんが、一覧として見るにはちょっと使いづらそうです。

手元にインストールしたモジュールのPODを抽出する作戦

metacpanのAPIを叩かなくても、手元にインストール済のperlcriticのポリシーのPODを抽出すればよいことに気づきました。 Pod-Markdownディストリビューションに含まれる pod2markdown コマンドでMarkdownに変換しておけば取り回しがよさそうです。

Perl::CriticとPod::Markdownを手元にインストールしたあと、以下のようなスクリプトを回すことで、perlcriticのポリシー一覧のドキュメントを生成できます。Perl::Critic::Policy以下のモジュールを取得するためにいきなり find コマンドを使ったり、Pod::Markdownのインスタンスを作らずに文字列操作でゴチャゴチャやったりしています。

# generate-perlcritic-policies.pl
use strict;
use warnings;
use utf8;
use feature 'say';

sub filename_to_package {
    my $filename = shift;
    my ($pkg) = $filename =~ m{lib/perl5/([0-9a-zA-Z_\/]+)\.pm$};
    $pkg =~ s{/}{::}g;
    $pkg;
}

# モジュールのパスは手元の環境に合わせて書き換える
my @policy_files = split /\n/, `find ~/perl5/lib/perl5/Perl/Critic/Policy -type f -name '*.pm'`;

for my $policy_file (@policy_files) {
    my $markdown = `pod2markdown $policy_file`;
    $markdown =~ s/^#/##/mg;

    my $pkg = filename_to_package($policy_file);
    say "# [$pkg](https://metacpan.org/pod/$pkg)";
    say "";
    say $markdown;
}
$ perl generate-perlcritic-policies.pl > policies.md

こうして生成したMarkdownファイルを適当なところに置いておくとよさそうです。