WordPress.org

Make WordPress Core

Ticket #16908: 16908.3.patch

File 16908.3.patch, 14.9 KB (added by hakre, 10 years ago)

get_transliteration_table()

  • wp-includes/formatting.php

    ### Eclipse Workspace Patch 1.0
    #P wordpress-trunk
     
    538538 * @since 1.2.1
    539539 *
    540540 * @param string $string Text that might have accent characters
    541  * @return string Filtered string with replaced "nice" characters.
     541 * @return string Filtered string with replaced "nice" (US-ASCII) characters.
    542542 */
    543543function remove_accents($string) {
     544        // US-ASCII is considered all "nice"
    544545        if ( !preg_match('/[\x80-\xff]/', $string) )
    545546                return $string;
    546547
    547         if (seems_utf8($string)) {
     548        // Assume ISO-8859-1 if not UTF-8
     549        $table = seems_utf8( $string ) ? 'utf-8' : 'latin-1';
     550        $table = apply_filters( 'remove_accents_table', $table, $string );
     551        $chars = get_transliteration_table( $table );
     552        $string = strtr($string, $chars);
     553        return $string;
     554}
     555
     556/**
     557 * getter for a table that can be used in transliteration
     558 *
     559 * @since 3.2
     560 *
     561 * @param $label string transliteration table name
     562 * @return array transliteration table
     563 */
     564function get_transliteration_table( $table ) {
     565        if ('utf-8' === $table ) {
    548566                $chars = array(
    549                 // Decompositions for Latin-1 Supplement
    550                 chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
    551                 chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
    552                 chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
    553                 chr(195).chr(134) => 'AE',chr(195).chr(135) => 'C',
    554                 chr(195).chr(136) => 'E', chr(195).chr(137) => 'E',
    555                 chr(195).chr(138) => 'E', chr(195).chr(139) => 'E',
    556                 chr(195).chr(140) => 'I', chr(195).chr(141) => 'I',
    557                 chr(195).chr(142) => 'I', chr(195).chr(143) => 'I',
    558                 chr(195).chr(144) => 'D', chr(195).chr(145) => 'N',
    559                 chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
    560                 chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
    561                 chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
    562                 chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
    563                 chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
    564                 chr(195).chr(158) => 'TH',chr(195).chr(159) => 's',
    565                 chr(195).chr(160) => 'a', chr(195).chr(161) => 'a',
    566                 chr(195).chr(162) => 'a', chr(195).chr(163) => 'a',
    567                 chr(195).chr(164) => 'a', chr(195).chr(165) => 'a',
    568                 chr(195).chr(166) => 'ae',chr(195).chr(167) => 'c',
    569                 chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
    570                 chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
    571                 chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
    572                 chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
    573                 chr(195).chr(176) => 'd', chr(195).chr(177) => 'n',
    574                 chr(195).chr(178) => 'o', chr(195).chr(179) => 'o',
    575                 chr(195).chr(180) => 'o', chr(195).chr(181) => 'o',
    576                 chr(195).chr(182) => 'o', chr(195).chr(182) => 'o',
    577                 chr(195).chr(185) => 'u', chr(195).chr(186) => 'u',
    578                 chr(195).chr(187) => 'u', chr(195).chr(188) => 'u',
    579                 chr(195).chr(189) => 'y', chr(195).chr(190) => 'th',
    580                 chr(195).chr(191) => 'y',
    581                 // Decompositions for Latin Extended-A
    582                 chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
    583                 chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
    584                 chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
    585                 chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
    586                 chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
    587                 chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
    588                 chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
    589                 chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
    590                 chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
    591                 chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
    592                 chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
    593                 chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
    594                 chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
    595                 chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
    596                 chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
    597                 chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
    598                 chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
    599                 chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
    600                 chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
    601                 chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
    602                 chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
    603                 chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
    604                 chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
    605                 chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
    606                 chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
    607                 chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
    608                 chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
    609                 chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
    610                 chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
    611                 chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
    612                 chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
    613                 chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
    614                 chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
    615                 chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
    616                 chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
    617                 chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
    618                 chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
    619                 chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
    620                 chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
    621                 chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
    622                 chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
    623                 chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
    624                 chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
    625                 chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
    626                 chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
    627                 chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
    628                 chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
    629                 chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
    630                 chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
    631                 chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
    632                 chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
    633                 chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
    634                 chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
    635                 chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
    636                 chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
    637                 chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
    638                 chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
    639                 chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
    640                 chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
    641                 chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
    642                 chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
    643                 chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
    644                 chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
    645                 chr(197).chr(190) => 'z', chr(197).chr(191) => 's',
    646                 // Decompositions for Latin Extended-B
    647                 chr(200).chr(152) => 'S', chr(200).chr(153) => 's',
    648                 chr(200).chr(154) => 'T', chr(200).chr(155) => 't',
    649                 // Euro Sign
    650                 chr(226).chr(130).chr(172) => 'E',
    651                 // GBP (Pound) Sign
    652                 chr(194).chr(163) => '');
    653 
    654                 $string = strtr($string, $chars);
     567                        // Decompositions for Latin-1 Supplement
     568                        chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
     569                        chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
     570                        chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
     571                        chr(195).chr(134) => 'AE',chr(195).chr(135) => 'C',
     572                        chr(195).chr(136) => 'E', chr(195).chr(137) => 'E',
     573                        chr(195).chr(138) => 'E', chr(195).chr(139) => 'E',
     574                        chr(195).chr(140) => 'I', chr(195).chr(141) => 'I',
     575                        chr(195).chr(142) => 'I', chr(195).chr(143) => 'I',
     576                        chr(195).chr(144) => 'D', chr(195).chr(145) => 'N',
     577                        chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
     578                        chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
     579                        chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
     580                        chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
     581                        chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
     582                        chr(195).chr(158) => 'TH',chr(195).chr(159) => 's',
     583                        chr(195).chr(160) => 'a', chr(195).chr(161) => 'a',
     584                        chr(195).chr(162) => 'a', chr(195).chr(163) => 'a',
     585                        chr(195).chr(164) => 'a', chr(195).chr(165) => 'a',
     586                        chr(195).chr(166) => 'ae',chr(195).chr(167) => 'c',
     587                        chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
     588                        chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
     589                        chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
     590                        chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
     591                        chr(195).chr(176) => 'd', chr(195).chr(177) => 'n',
     592                        chr(195).chr(178) => 'o', chr(195).chr(179) => 'o',
     593                        chr(195).chr(180) => 'o', chr(195).chr(181) => 'o',
     594                        chr(195).chr(182) => 'o', chr(195).chr(182) => 'o',
     595                        chr(195).chr(185) => 'u', chr(195).chr(186) => 'u',
     596                        chr(195).chr(187) => 'u', chr(195).chr(188) => 'u',
     597                        chr(195).chr(189) => 'y', chr(195).chr(190) => 'th',
     598                        chr(195).chr(191) => 'y',
     599                        // Decompositions for Latin Extended-A
     600                        chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
     601                        chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
     602                        chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
     603                        chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
     604                        chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
     605                        chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
     606                        chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
     607                        chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
     608                        chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
     609                        chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
     610                        chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
     611                        chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
     612                        chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
     613                        chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
     614                        chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
     615                        chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
     616                        chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
     617                        chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
     618                        chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
     619                        chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
     620                        chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
     621                        chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
     622                        chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
     623                        chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
     624                        chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
     625                        chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
     626                        chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
     627                        chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
     628                        chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
     629                        chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
     630                        chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
     631                        chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
     632                        chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
     633                        chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
     634                        chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
     635                        chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
     636                        chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
     637                        chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
     638                        chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
     639                        chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
     640                        chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
     641                        chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
     642                        chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
     643                        chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
     644                        chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
     645                        chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
     646                        chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
     647                        chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
     648                        chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
     649                        chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
     650                        chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
     651                        chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
     652                        chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
     653                        chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
     654                        chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
     655                        chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
     656                        chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
     657                        chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
     658                        chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
     659                        chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
     660                        chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
     661                        chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
     662                        chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
     663                        chr(197).chr(190) => 'z', chr(197).chr(191) => 's',
     664                        // Decompositions for Latin Extended-B
     665                        chr(200).chr(152) => 'S', chr(200).chr(153) => 's',
     666                        chr(200).chr(154) => 'T', chr(200).chr(155) => 't',
     667                        // Euro Sign
     668                        chr(226).chr(130).chr(172) => 'E',
     669                        // GBP (Pound) Sign
     670                        chr(194).chr(163) => ''
     671                );
     672        } elseif ( 'latin-1' === $table ) {
     673                $chars = array(
     674                        chr(128) => 'E', chr(131) => 'f',
     675                        chr(138) => 'S', chr(140) => 'OE',
     676                        chr(142) => 'Z', chr(154) => 's',
     677                        chr(156) => 'oe', chr(158) => 'z',
     678                        chr(159) => 'Y', chr(162) => 'c',
     679                        chr(165) => 'Y', chr(181) => 'u',
     680                        chr(192) => 'A', chr(193) => 'A',
     681                        chr(194) => 'A', chr(195) => 'A',
     682                        chr(196) => 'A', chr(197) => 'A',
     683                        chr(198) => 'AE', chr(199) => 'C',
     684                        chr(200) => 'E', chr(201) => 'E',
     685                        chr(202) => 'E', chr(203) => 'E',
     686                        chr(204) => 'I', chr(205) => 'I',
     687                        chr(206) => 'I', chr(207) => 'I',
     688                        chr(209) => 'N', chr(208) => 'DH',
     689                        chr(210) => 'O', chr(211) => 'O',
     690                        chr(212) => 'O', chr(213) => 'O',
     691                        chr(214) => 'O', chr(216) => 'O',
     692                        chr(217) => 'U', chr(218) => 'U',
     693                        chr(219) => 'U', chr(220) => 'U',
     694                        chr(221) => 'Y', chr(222) => 'TH',
     695                        chr(223) => 'ss', chr(224) => 'a',
     696                        chr(225) => 'a', chr(226) => 'a',
     697                        chr(227) => 'a', chr(228) => 'a',
     698                        chr(229) => 'a', chr(230) => 'ae',
     699                        chr(231) => 'c', chr(232) => 'e',
     700                        chr(233) => 'e', chr(234) => 'e',
     701                        chr(235) => 'e', chr(236) => 'i',
     702                        chr(237) => 'i', chr(238) => 'i',
     703                        chr(239) => 'i', chr(240) => 'dh',
     704                        chr(241) => 'n', chr(242) => 'o',
     705                        chr(243) => 'o', chr(244) => 'o',
     706                        chr(245) => 'o', chr(246) => 'o',
     707                        chr(248) => 'o', chr(249) => 'u',
     708                        chr(250) => 'u', chr(251) => 'u',
     709                        chr(252) => 'u', chr(253) => 'y',
     710                        chr(254) => 'th', chr(255) => 'y'
     711                );
    655712        } else {
    656                 // Assume ISO-8859-1 if not UTF-8
    657                 $chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
    658                         .chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
    659                         .chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
    660                         .chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
    661                         .chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
    662                         .chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
    663                         .chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
    664                         .chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
    665                         .chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
    666                         .chr(252).chr(253).chr(255);
    667 
    668                 $chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
    669 
    670                 $string = strtr($string, $chars['in'], $chars['out']);
    671                 $double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
    672                 $double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
    673                 $string = str_replace($double_chars['in'], $double_chars['out'], $string);
     713                // unknown table
     714                $chars = array();
    674715        }
    675 
    676         return $string;
     716        return apply_filters( 'get_transliteration_table', $chars, $table );
    677717}
    678718
    679719/**