2010-12-21

Inflectorのやっていることがイマイチわからなかったのでまとめてみました

どだい日本人には複数形なんて...って話の前に、その他のメソッドの動作も理解できていなかったのでコードを追ってみました。以下メモ。読んだのはCakePHP 1.3.6のInfratorです。

pluralize
singularize
1. 最後の単語が例外単語帳にマッチしたらそれを返す
2. 単語全体が変更なしグループにマッチしたら何もせずに返す
3. ルールを一つずつ当てはめていき、マッチしたら実行して返す

まあ、この二つは想像通りというか、パターンは複雑だけどやっていることは単純明快。

humanize
1. 全ての"_"をスペースに
2. 各単語の最初の文字を大文字、それ以外を小文字に変換

camelize
1. humanize
2. スペースを取り除く

underscore
1. 先頭文字を除き、文字列中の大文字の前に"_"を挿入する
2. 全部小文字に

これがくせ者。大文字が続く場合に、各文字の前に"_"が入ります。
例)PostgreSQL => postgre_s_q_l

またこの正規表現が、戻り読み言明を使っていて最初読めなかったです。
/(?<=\w)([A-Z])/ まだまだ勉強不足ですな。

tableize
1. underscore
2. pluralize

classify
1. singularize
2. camelize

variable
1. underscore
2. camelize
3. 先頭の文字を小文字に

slug
1. アルファベットレターと数字以外の文字を" "に変換
2. 連続する" "を"_"に変換
3. 先頭と最後に"_"が一つ以上あった場合は取り除く

これも正規表現を読むのに苦労しました
/[^\s\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu

Unicode 文字プロパティ参照

おそらく結局
/[^\s\p{L}\p{Nd}]/mu
と一緒なのではと思うんですが、どうなんでしょう。

2010-12-16

PHPで簡単にコンソールにカラライズした出力をする方法

<?php
function console_styles() {
return array(
'heading1' => "\033[1;30;46m",
'heading2' => "\033[1;35m",
'heading3' => "\033[1;34m",
'option' => "\033[40;37m",
'command' => "\033[1;40;37m",
'error' => "\033[0;31m",
'success' => "\033[0;32m",
'black' => "\033[0;30m",
'red' => "\033[0;31m",
'green' => "\033[0;32m",
'yellow' => "\033[0;33m",
'blue' => "\033[0;34m",
'purple' => "\033[0;35m",
'cyan' => "\033[0;36m",
'white' => "\033[0;37m",
'end' => "\033[0m",
);
}
function console_out($data) {
$styles = console_styles();
foreach ((array) $data as $key=>$token) {
if (is_string($key)) {
echo $styles[$key], $token, $styles['end'];
} else {
echo $token;
}
}
}
view raw console.php hosted with ❤ by GitHub


Lithiumの表示が綺麗だったので、その部分だけ簡単に使えるように抜き出してみました。PHPの変態的ともいえる配列の動作(辞書的+数字のミックス)を取り入れたんで、比較的使いやすくできました。以下のような感じで、緑色の"world"が表示されます。

console_out(array('Hello', 'green' => '"world"', '!'));
echo "\n";

array() が余計かなぁ。ここがもっと簡単にかけるとうれしいんだけど。こんな風にかけたらうれしいな。

console_out(['Hello', 'green'=>'"world"', '!']);
echo "\n";