2014/10/25
テキストを自動整形する簡易 CakePHP ヘルパー
-
-
CakePHP 2.0 でいくつかシステムを作成したのだが、日本語対応のテキスト整形機能が乏しくて苦労している。
特に、動的に行長が変化するメールの文面などを一定幅で自動改行して整形したいことがよくある。これを CakePHP のヘルパーにしておけばいろいろ使いまわしができそうなので CakePHP 2 用のプラグインとして簡易ルール※のものを作ってみた。
※禁則は行頭禁則のみ。禁則文字は「。」と「、」のみ。半角文字のみで構成される単語は1まとまりとみなし分割しない。禁則文字が複数連続する場合の処理は行っていない。
LambdaTools StringHelper Plugin (ZIP; 1,698 bytes)
CakePHP の {APP}/Plugin 配下に展開し、ヘルパー名 LambdaTools.String でロードすることで String ヘルパーが利用可能となる。現在利用できる機能はテキスト自動整形用の mb_folding() メソッドのみ。
ヘルパーメソッド仕様
-
mb_folding($str, $width, $encoding=NULL)
-
引数
-
$str
-
整形対象となる文字列。改行文字で区切られた複数行を指定可。入力文字列内にもともと存在する改行文字は、このメソッドが付与する改行に優先する。1行の半角換算文字数が指定値に満たない場合は、そのまま出力される。
なお、半角文字だけから構成される単語の途中に自動改行位置が来た場合、当該単語は分割されず次行先頭に割り当てられる。
句読点は行頭禁則文字とし、行頭に単独で出現する場合は直前行の行末文字とともに次行先頭に繰り越す。(その結果、直前行の長さは繰り越した文字分だけ短くなる)
行内にある連続する空白文字 (半角空白文字) は1つの空白文字に集約される。また、行頭が空白文字になる場合、当該文字は除去され行頭が空白文字から始まらないようにする。
-
$width
-
整形後の1行の最大長を指定する整数。長さは半角文字数で表し、全角文字は半角2文字分と換算。
-
$encoding
-
指定された文字列のエンコーディングを表す文字列。省略時 (=NULL) はその時点での mb_internal_encoding() の結果が使用される。この値は内部的に使用する正規表現の解釈に影響する。
戻り値: 整形した行からなる配列。(整形した文字列ではない点に注意。)
使い方
まずコントローラで Helper として宣言する
02 | class HogehogeController extends AppController |
05 | public $helpers = array ( 'LambdaTools.String' ); |
09 | $email = new CakeEmail(); |
10 | $email ->helpers( 'LambdaTools.String' ); |
ビューやメールテンプレートでの使用例。CakePHP 2.x ではビューブロック (view block) が利用できるので、これを使用して自動整形を適用する部分と適用しない部分を容易に使い分けることができる。
02 | $this ->start( 'auto_folding_part' ); |
05 | この度は「<?php echo $data [ 'produt_name' ] ?>」(¥<?php echo number_format( $data [ 'price' ])) ?>) をご注文頂きありがとうございました。商品は下記の業者から発送されます。到着まで3ないし4日ほどかかることがございます。 |
08 | $text = $this ->fetch( 'auto_folding_part' ); |
09 | echo implode( "\n" , $this ->String->mb_folding( $text , 72)); |
13 | 住所: 〒100-0000 東京都練馬区へけもけ 1-2-3 |
自動整形例
元となるデータ
長い行がきちんとフォールディングされるかどうかの確認を行いたいのですが、適度な長さの文面が得られなかったのでこの文面で代用してみました。
半角72文字分で折り曲げられるのを期待しています。
長い・行がきちんとフォールディングされるかどうかの確認を行いたいのですが、abcdefghijkl適度な長さの文面が得られなかったのでこの文面で代用してみました。
途中に長い半角トークン aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa が入っている例。行頭の空白文字は除去されます。
1行の指定値より長い半角トークン ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 が入っている場合の例。
(半角) 72文字幅で整形した結果
長い行がきちんとフォールディングされるかどうかの確認を行いたいのですが、
適度な長さの文面が得られなかったのでこの文面で代用してみました。
半角72文字分で折り曲げられるのを期待しています。
長い・行がきちんとフォールディングされるかどうかの確認を行いたいのです
が、abcdefghijkl適度な長さの文面が得られなかったのでこの文面で代用してみ
ました。
途中に長い半角トークン
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa が入っている
例。行頭の空白文字は除去されます。
1行の指定値より長い半角トークン
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
が入っている場合の例。