public function testConvertKatakanaToHiraganaWhenMixCharacters() { $result = Helper::convertKatakanaToHiragana($this->mixCharacters); $this->assertEquals('今日、Joo「じょお」は学校にいます。', $result); }
/** * Converts a year in Japanese format into Western format. * * @param $year : kanji or hiragana era name followed by digits, or era name in romaji, space and digit. I.e. : 明治33, めいじ33, Meiji 33 * @return string|array : The year(s) in Western format. * @throws Exception */ public static function toWesternYear($year) { if (Analyzer::hasKanji($year)) { $key = 'kanji'; $eraName = Helper::extractKanji($year); $eraName = $eraName[0]; $eraValue = (int) Helper::subString($year, Analyzer::length($eraName), Analyzer::length($year)); } elseif (Analyzer::hasHiragana($year)) { $key = 'kana'; $eraName = Helper::extractHiragana($year); $eraName = $eraName[0]; $eraValue = (int) Helper::subString($year, Analyzer::length($eraName), Analyzer::length($year)); } else { $key = 'romaji'; $year = strtolower($year); $parts = explode(' ', $year); $eraName = $parts[0]; $eraValue = (int) $parts[1]; } if (empty($eraName) || empty($eraValue)) { throw new Exception('Invalid year ' . $year); } $max = count(self::$mapEras); $westernYears = array(); for ($i = 0; $i < $max; $i++) { $era = self::$mapEras[$i]; $overflown = false; if (strtolower($era[$key]) == $eraName) { $eraStart = $era['year']; $westernYear = $eraStart + $eraValue - 1; if ($i < $max - 1) { $nextEra = self::$mapEras[$i + 1]; $nextEraYear = $nextEra['year']; if ($westernYear > $nextEraYear) { $overflown = true; } } $westernYears[] = array('value' => $westernYear, 'overflown' => $overflown); } } $results = array(); foreach ($westernYears as $westernYear) { if (!$westernYear['overflown']) { $results[] = $westernYear['value']; } } if (empty($results)) { throw new Exception('Year ' . $year . ' is invalid'); } elseif (count($results) == 1) { return $results[0]; } else { return $results; } }
public function segment($input) { $results = array(); $segments = array('B3', 'B2', 'B1'); $types = array('O', 'O', 'O'); $parts = Helper::split($input); for ($i = 0; $i < count($parts); ++$i) { $segments[] = $parts[$i]; $types[] = $this->getType($parts[$i]); } $segments[] = 'E1'; $segments[] = 'E2'; $segments[] = 'E3'; $types[] = 'O'; $types[] = 'O'; $types[] = 'O'; $word = $segments[3]; $p1 = 'U'; $p2 = 'U'; $p3 = 'U'; for ($i = 4; $i < count($segments) - 3; ++$i) { $score = $this->BIAS; $w1 = $segments[$i - 3]; $w2 = $segments[$i - 2]; $w3 = $segments[$i - 1]; $w4 = $segments[$i]; $w5 = $segments[$i + 1]; $w6 = $segments[$i + 2]; $c1 = $types[$i - 3]; $c2 = $types[$i - 2]; $c3 = $types[$i - 1]; $c4 = $types[$i]; $c5 = $types[$i + 1]; $c6 = $types[$i + 2]; $score += $this->getScore($this->UP1, $p1); $score += $this->getScore($this->UP2, $p2); $score += $this->getScore($this->UP3, $p3); $score += $this->getScore($this->BP1, $p1 . $p2); $score += $this->getScore($this->BP2, $p2 . $p3); $score += $this->getScore($this->UW1, $w1); $score += $this->getScore($this->UW2, $w2); $score += $this->getScore($this->UW3, $w3); $score += $this->getScore($this->UW4, $w4); $score += $this->getScore($this->UW5, $w5); $score += $this->getScore($this->UW6, $w6); $score += $this->getScore($this->BW1, $w2 . $w3); $score += $this->getScore($this->BW2, $w3 . $w4); $score += $this->getScore($this->BW3, $w4 . $w5); $score += $this->getScore($this->TW1, $w1 . $w2 . $w3); $score += $this->getScore($this->TW2, $w2 . $w3 . $w4); $score += $this->getScore($this->TW3, $w3 . $w4 . $w5); $score += $this->getScore($this->TW4, $w4 . $w5 . $w6); $score += $this->getScore($this->UC1, $c1); $score += $this->getScore($this->UC2, $c2); $score += $this->getScore($this->UC3, $c3); $score += $this->getScore($this->UC4, $c4); $score += $this->getScore($this->UC5, $c5); $score += $this->getScore($this->UC6, $c6); $score += $this->getScore($this->BC1, $c2 . $c3); $score += $this->getScore($this->BC2, $c3 . $c4); $score += $this->getScore($this->BC3, $c4 . $c5); $score += $this->getScore($this->TC1, $c1 . $c2 . $c3); $score += $this->getScore($this->TC2, $c2 . $c3 . $c4); $score += $this->getScore($this->TC3, $c3 . $c4 . $c5); $score += $this->getScore($this->TC4, $c4 . $c5 . $c6); $score += $this->getScore($this->UQ1, $p1 . $c1); $score += $this->getScore($this->UQ2, $p2 . $c2); $score += $this->getScore($this->UQ1, $p3 . $c3); $score += $this->getScore($this->BQ1, $p2 . $c2 . $c3); $score += $this->getScore($this->BQ2, $p2 . $c3 . $c4); $score += $this->getScore($this->BQ3, $p3 . $c2 . $c3); $score += $this->getScore($this->BQ4, $p3 . $c3 . $c4); $score += $this->getScore($this->TQ1, $p2 . $c1 . $c2 . $c3); $score += $this->getScore($this->TQ2, $p2 . $c2 . $c3 . $c4); $score += $this->getScore($this->TQ3, $p3 . $c1 . $c2 . $c3); $score += $this->getScore($this->TQ4, $p3 . $c2 . $c3 . $c4); $p = 'O'; if ($score > 0) { $results[] = $word; $word = ''; $p = 'B'; } $p1 = $p2; $p2 = $p3; $p3 = $p; $word .= $segments[$i]; } $results[] = $word; return $results; }
/** * Inflects radical for the given verb to the given form * * @param array $verb * @param $form * @return array */ public static function getRadicals(array $verb, $form) { $kanji = $verb['kanji']; $kana = $verb['kana']; $type = $verb['type']; if ($type == 'k') { switch ($form) { case self::NON_PAST_NEGATIVE: case self::PAST_NEGATIVE: case self::PASSIVE: case self::PASSIVE_SUSPENSIVE: case self::IMPERATIVE_POLITE_NEGATIVE: case self::IMPERATIVE_HARD: case self::FACTITIVE: case self::FACTITIVE_SHORTENED: case self::POTENTIAL_NEUTRAL: case self::POTENTIAL_POLITE: case self::VOLITIONAL_FAMILIAR: case self::NOT_LOOK_LIKE_POLITE: case self::NOT_LOOK_LIKE_NEUTRAL: $kanaRadical = 'こ'; break; default: $kanaRadical = 'き'; } } elseif ($type == 's-i') { $kanaRadical = ''; } else { $kanaRadical = Helper::subString($kana, 0, Analyzer::length($kana) - 1); } if (!empty($kanji)) { $kanjiRadical = Helper::subString($kanji, 0, Analyzer::length($kanji) - 1); } else { $kanjiRadical = null; } return array('kanji' => $kanjiRadical, 'kana' => $kanaRadical); }
/** * Hack to call Helper::convertHiraganaToKatakana() within the * transliteration workflow. * * @param string $str String to be converted. * * @return string Converted string. * * @see JpnForPhp\Helper\Helper::convertHiraganaToKatakana() */ protected function convertHiraganaToKatakana($str) { return Helper::convertHiraganaToKatakana($str); }