a-blog cmsで、独自タグの内容を置換する「校正オプション」の具体的な使い方

この記事は、[a-blog cms Advent Calendar 2017](https://adventar.org/calendars/2570)の10日目の記事です。
すみませんリマインダの日付間違えてて一日遅れました。

先日、12月9日の[CMSMix Sapporo Vol.4](https://connpass.com/event/67656/)のハンズオンでご紹介した、「校正オプション」の具体的な使い方です。

## 校正オプションとは

a-blog cmsでは、テンプレート内の変数の直後に、半角角カッコ（[]）で「表示内容を置換するルール」を指定することができます。これが「校正オプション」で、ほぼすべての変数に対して使用できます。
使用できるオプションの一覧は、下記を参照ください。

https://developer.a-blogcms.jp/document/reference/proofreading.html

最もよく使われるのが、他のCMSでもよくある日付変換です。下記のサンプルでは、YY-mm-dd形式で入力されたカスタムフィールド「event_date」を、ゼロを付けない日付に置換して表示しています。

```html:acms_corrector_date.html
{event_date}[date('Y年n月j日')] -> 2017-01-01 -> 2018年1月1日
```

## a-blog cms独自の校正オプション

a-blog cmsでは、国産ならではの、日付を和暦に変換する校正オプションもあります。下記のサンプルでは、YY-mm-dd形式で入力されたカスタムフィールド「my_birth」を、和暦で表示しています。
以下は私のお誕生日です。なにかください。

```html:acms_corrector_wareki.html
{my_birth}[wareki('年n月j日')] -> 1975-03-26 -> 昭和50年3月26日
```

## 校正オプションを自作する

### 自作オプションが必要となる例

![acms_corrector.jpg](https://qiita-image-store.s3.amazonaws.com/0/21117/7f3cea00-1019-bc07-efc8-f46e6aa60e2f.jpeg)

これは、[CMSMix Sapporo Vol.4](https://connpass.com/event/67656/)のハンズオンのスクリーンショットです。
日本将棋連盟のプロ棋士のデータをa-blog cmsで表示したものです。

一般に日本の芸道は、漢数字の「段」でランク分けされ、サイトによっては「段位が高い順」での表示を求められます。漢数字でもソートは可能ですが、半角数字にしておいたほうが無難です。
このサンプルでは、「kanjinum」校正オプションを自作し、数字を漢数字に変換しています。

### 作り方

a-blog cms内の以下のファイルをエディタで開き、「ACMS_User_Corrector」クラスにpublic関数を追加します。

*php/ACMS/User/Corrector.php*

実際のファイルは既にサンプルコードが入っていますが、アウトラインは以下の通りです。

```php:acms_corrector_outline.php
<?php
class ACMS_User_Corrector
{

    public static function sample($txt, $args = array())
    {
        // 校正オプション[sample]の処理
        // 変数「$txt」に直前のa-blog cmsの変数の値が入る
        // 第二引数にarrayを定義すると、文字列で補助値を渡すことができる
    }

    public static function kanjinum($txt)
    {
        // 校正オプション[kanjinum]の処理
        // 第二引数はないので、補助値を渡さないで使う前提
    }


}
```

### 処理の流れ

- 校正オプションと同じ名前の関数が呼び出される
- 変数「\$txt」に、直前のa-blog cmsの変数の値が送られる
- 関数から「return」で返された値を、本来の変数の値に変わって表示する

最も単純な構造だとこうなります。変数の内容が何であっても「\_:(´ཀ`」∠):\_」にして返します。

```php:acms_corrector_simple.php
    public static function simple($txt)
    {
       return '_:(´ཀ`」∠):_';
    }
}
```

### 漢数字変換のサンプル

こちらで公開されている関数をそのまま流用できます。変数「\$outstr」に、変数「\$txt」を処理した内容を入れて返します。

PHPで半角数字を漢数字にする | ぱふぅ家のホームページ
https://www.pahoo.org/e-soul/webtech/php03/php03-05-01.shtm

```php:acms_corrector_kanjinum.php
    public static function kanjinum($txt)
    {
        // 例 {var}[kanjinum]
        // {var}の中は整数でなければならない

        static $kantbl1 = array(0=>'', 1=>'一', 2=>'二', 3=>'三', 4=>'四', 5=>'五', 6=>'六', 7=>'七', 8=>'八', 9=>'九', '.'=>'．', '-'=>'－');
        static $kantbl2 = array(0=>'', 1=>'十', 2=>'百', 3=>'千');
        static $kantbl3 = array(0=>'', 1=>'万', 2=>'億', 3=>'兆', 4=>'京');

        $outstr = '';
        $len = strlen($txt);
        $m = (int)($len / 4);

        //一、万、億、兆‥‥の繰り返し
        for ($i = 0; $i <= $m; $i++) {

            $s2 = '';

            //一、十、百、千の繰り返し
            for ($j = 0; $j < 4; $j++) {

                $pos = $len - $i * 4 - $j - 1;

                if ($pos >= 0) {
                    $ch  = substr($txt, $pos, 1);
                    if ($ch == ',')    continue;        //カンマは無視

                    $ch1 = isset($kantbl1[$ch]) ? $kantbl1[$ch] : '';
                    $ch2 = isset($kantbl2[$j])  ? $kantbl2[$j]  : '';

                    //冒頭が「一」の場合の処理
                    if ($ch1 != '') {
                        if ($ch1 == '一' && $ch2 != '')  $s2 = $ch2 . $s2;
                        else                             $s2 = $ch1 . $ch2 . $s2;
                    }
                }
            }

            if ($s2 != '')  $outstr = $s2 . $kantbl3[$i] . $outstr;

        }
        return $outstr;
    }
}
```

### 実際に利用する

以下のように書くだけです。

```html:acms_corrector_kanjinum_tmpl.html
{player_lank}[kanjinum]段
```

## その他の校正オプションの自作例

サイトによっては、以下のようなものを作ると便利かもしれません。

- 商品番号を別途サーバーに置いている商品情報APIに渡し、取得した情報を返す
- 変数が空のときのデフォルト値を、表示しているコンテンツによって変更する 
- 正規表現検索を行い、特定のキーワードが入っていればマークアップする