PageReading処理の書き直し

これまでの実装では、ページ一覧の索引付機能を使用するときに:config/PageReading/dictから正規表現パターンを読み取っていましたが、これをコード内に埋め込むことで処理を高速化させました。以下の様な実装になっています。

/**
 * テキスト読み取りクラス
 */
class Reading{
	// 特殊ページ
	const SPECIALPAGE_PATTERN = '[\:]';
	// アルファベット(ドイツ語やフランス語などを含む)にマッチするパターン
	const ALPHABET_PATTERN = '[A-Za-zÀ-ɏ]';
	// :以外のシンボル、数字にマッチするパターン
	const SYMBOL_PATTERN = '[!-9\;-\@0-9]';
	// すべての漢字にマッチするパターン(※ハングル、サロゲートペア文字は含まず)
	const KANJI_PATTERN = '[々〇〻㐀-龻豈-頻]';
	// ひらがな・カタカナにマッチするパターン
	const KANA_PATTERN = '[ぁ-ヶ]';
	// ハングル文字にマッチするパターン
	const HANGUL_PATTERN = '[가-힣]';

	// 強制的に末尾に降る文字
	const SYMBOL_CHAR = '!SYMBOL';
	const SPECIAL_CHAR = ' SPECIAL';
	// 強制的に末尾に降る文字
	const OTHER_CHAR = 'OTHER';	// は、ソートで使うため外字領域のの文字を入れている。

	/**
	 * 読みを取得
	 * @param string $str 入力文字列
	 * @return string
	 */
	public static function getReading($str){
		foreach(self::mbStringToArray($str) as $char){
			$ret[] = self::getReadingChar($char);
		}
		return join('', $ret);
	}
	/**
	 * 文字の読みを取得(先頭1文字で言語を判断。複数の言語が含まれている場合を考慮しない)
	 * @param string $char 入力文字列
	 * @return string
	 */
	public static function getReadingChar($char){
		if (preg_match('/^('.self::SPECIALPAGE_PATTERN.')/u',$char, $matches)) {
			return $matches[1];
		}else if (preg_match('/^('.self::SYMBOL_PATTERN.')/u',$char, $matches)) {
			// 数字
			return $matches[1];
		}else if (mb_ereg('^('.self::ALPHABET_PATTERN.')', mb_convert_kana($char, 'as'), $matches) !== FALSE) {
			// 英字
			return $matches[1];
		}else if (preg_match('/^('.self::KANA_PATTERN.')/u',$char, $matches)) {
			// かな/カタカナ
			return mb_convert_kana($matches[1],'KVC');
		}else if(preg_match('/^('.self::KANJI_PATTERN.')/u',$char, $matches)) {
			// 漢字
			if (DEFAULT_LANG === 'ja_JP'){
				//まず、日本語の漢字として処理
				$reading = Hiragana::toKana($matches[1]);
				if ($reading !== $char) return $reading;
				// マッチしない場合は中国語として処理
				return PinYin::toKana($matches[1]);
			}else{
				// デフォルトの言語が日本語以外の場合中国語のピンインとして処理
				return PinYin::toPinYin($matches[1]);
			}
		}else if(preg_match('/^('.self::HANGUL_PATTERN.')/u',$char, $matches)) {
			// ハングル
			return Hangul::toChosung($matches[1]);
		}
		return $char;
	}

日本で使われる漢字と中国で使われる漢字を正規表現で分ける方法が思いつかなかったので[々〇〻㐀-龻豈-頻]でUnicodeに含まれるすべての漢字をマッチさせたあと、日本語でマッチしなかった漢字をピンイン変換するという処理にしました。

完全に独立したコードとなっているのでプラグインからこの関数を呼び出すことも可能です。