<?php
/*
 * このソースコードは blanco Frameworkにより自動生成されました。
 */
/*. DOC <@package blanco.sample.stringconverter;>.*/

/*. require_module 'mbstring'; .*/;
/*. require_module 'standard'; .*/;

/**
 * 全角カタカナ→全角ひらがなの文字列変換のサンプル。blancoStringConverterの実装には影響しません。
 */
class SampleZenKatakana2HiraganaStringConverter {
    /**
     * 文字列置換定義。
     */
    public /*.array[int][int]string.*/ $STRING_CONVERT_DEF = array(array('ヴ', 'う゛')/* No.1 説明:濁音を先に定義します。 */, array('ァ', 'ぁ')/* No.2 */, array('ア', 'あ')/* No.3 */, array('ィ', 'ぃ')/* No.4 */, array('イ', 'い')/* No.5 */, array('ゥ', 'ぅ')/* No.6 */, array('ウ', 'う')/* No.7 */, array('ェ', 'ぇ')/* No.8 */, array('エ', 'え')/* No.9 */, array('ォ', 'ぉ')/* No.10 */, array('オ', 'お')/* No.11 */, array('カ', 'か')/* No.12 */, array('ガ', 'が')/* No.13 */, array('キ', 'き')/* No.14 */, array('ギ', 'ぎ')/* No.15 */, array('ク', 'く')/* No.16 */, array('グ', 'ぐ')/* No.17 */, array('ケ', 'け')/* No.18 */, array('ゲ', 'げ')/* No.19 */, array('コ', 'こ')/* No.20 */, array('ゴ', 'ご')/* No.21 */, array('サ', 'さ')/* No.22 */, array('ザ', 'ざ')/* No.23 */, array('シ', 'し')/* No.24 */, array('ジ', 'じ')/* No.25 */, array('ス', 'す')/* No.26 */, array('ズ', 'ず')/* No.27 */, array('セ', 'せ')/* No.28 */, array('ゼ', 'ぜ')/* No.29 */, array('ソ', 'そ')/* No.30 */, array('ゾ', 'ぞ')/* No.31 */, array('タ', 'た')/* No.32 */, array('ダ', 'だ')/* No.33 */, array('チ', 'ち')/* No.34 */, array('ヂ', 'ぢ')/* No.35 */, array('ッ', 'っ')/* No.36 */, array('ツ', 'つ')/* No.37 */, array('ヅ', 'づ')/* No.38 */, array('テ', 'て')/* No.39 */, array('デ', 'で')/* No.40 */, array('ト', 'と')/* No.41 */, array('ド', 'ど')/* No.42 */, array('ナ', 'な')/* No.43 */, array('ニ', 'に')/* No.44 */, array('ヌ', 'ぬ')/* No.45 */, array('ネ', 'ね')/* No.46 */, array('ノ', 'の')/* No.47 */, array('ハ', 'は')/* No.48 */, array('バ', 'ば')/* No.49 */, array('パ', 'ぱ')/* No.50 */, array('ヒ', 'ひ')/* No.51 */, array('ビ', 'び')/* No.52 */, array('ピ', 'ぴ')/* No.53 */, array('フ', 'ふ')/* No.54 */, array('ブ', 'ぶ')/* No.55 */, array('プ', 'ぷ')/* No.56 */, array('ヘ', 'へ')/* No.57 */, array('ベ', 'べ')/* No.58 */, array('ペ', 'ぺ')/* No.59 */, array('ホ', 'ほ')/* No.60 */, array('ボ', 'ぼ')/* No.61 */, array('ポ', 'ぽ')/* No.62 */, array('マ', 'ま')/* No.63 */, array('ミ', 'み')/* No.64 */, array('ム', 'む')/* No.65 */, array('メ', 'め')/* No.66 */, array('モ', 'も')/* No.67 */, array('ャ', 'ゃ')/* No.68 */, array('ヤ', 'や')/* No.69 */, array('ュ', 'ゅ')/* No.70 */, array('ユ', 'ゆ')/* No.71 */, array('ョ', 'ょ')/* No.72 */, array('ヨ', 'よ')/* No.73 */, array('ラ', 'ら')/* No.74 */, array('リ', 'り')/* No.75 */, array('ル', 'る')/* No.76 */, array('レ', 'れ')/* No.77 */, array('ロ', 'ろ')/* No.78 */, array('ヮ', 'ゎ')/* No.79 */, array('ワ', 'わ')/* No.80 */, array('ヰ', 'ゐ')/* No.81 */, array('ヱ', 'ゑ')/* No.82 */, array('ヲ', 'を')/* No.83 */, array('ン', 'ん')/* No.84 */, array('ヵ', 'か')/* No.87 説明:全角ひらがなに相当するものが無いため、大きい文字に強制的にマッピング。 */, array('ヶ', 'け')/* No.88 説明:全角ひらがなに相当するものが無いため、大きい文字に強制的にマッピング。 */ );

    /**
     * 文字列変換定義に従い、文字列を変換します。
     *
     * @param string $argCheck 変換対象の文字列。
     * @return string 文字列変換定義にしたがって変換された文字列。変換定義にひとつも合致しない場合には元の文字列が戻ります。
     */
    public /*.string.*/ function convert(/*.string.*/ $argCheck) {
        /* パラメータの数、型チェックを行います。 */
        if (func_num_args() !== 1) {
            throw new Exception('[ArgumentException]: SampleZenKatakana2HiraganaStringConverter.convert のパラメータは[1]個である必要があります。しかし実際には[' . func_num_args() .  ']個のパラメータを伴って呼び出されました。');
        }
        if (gettype($argCheck) !== 'string' && gettype($argCheck) !== 'NULL') {
            throw new Exception('[ArgumentException]: SampleZenKatakana2HiraganaStringConverter.convert の1番目のパラメータは[string]型でなくてはなりません。しかし実際には[' . gettype($argCheck) . ']型が与えられました。');
        }

        if ($argCheck === null) {
            throw new Exception('メソッド[convert]のパラメータ[argCheck]にnullが与えられました。しかし、このパラメータにnullを与えることはできません。');
        }

        $wrkString = '';
        $arraySize = mb_strlen($argCheck);
        for ($index = 0; $index < $arraySize; ) {
            $look = mb_substr($argCheck, $index);
            $isFound = false;
            for ($indexDef = 0; $indexDef < count($this->STRING_CONVERT_DEF); $indexDef++) {
                $wrkStrComp = $look;
                if (mb_strlen($look) > mb_strlen($this->STRING_CONVERT_DEF[$indexDef][0])) {
                    $wrkStrComp = mb_substr($wrkStrComp, 0, mb_strlen($this->STRING_CONVERT_DEF[$indexDef][0]));
                }
                if ($wrkStrComp === $this->STRING_CONVERT_DEF[$indexDef][0]) {
                    $wrkString = $wrkString . $this->STRING_CONVERT_DEF[$indexDef][1];
                    $index += mb_strlen($this->STRING_CONVERT_DEF[$indexDef][0]);
                    $isFound = true;
                    break;
                }
            }
            if (!$isFound) {
                $wrkString = $wrkString . mb_substr($argCheck, $index, 1);
                $index = $index + 1;
            }
        }

        return $wrkString;
    }
}
?>
