From 1a6d4d8fe31213a9b5d4a2532478c48e74286fe5 Mon Sep 17 00:00:00 2001 From: Martijn Date: Fri, 16 Dec 2011 20:12:43 +0100 Subject: [PATCH 1/5] Added initial Form helper version --- wolf/helpers/Form.php | 197 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 wolf/helpers/Form.php diff --git a/wolf/helpers/Form.php b/wolf/helpers/Form.php new file mode 100644 index 00000000..75c829f9 --- /dev/null +++ b/wolf/helpers/Form.php @@ -0,0 +1,197 @@ + + * Copyright (C) 2011 Martijn van der Kleijn + * + * Please see license.txt for the full license text. + */ + +/** + * Supplies helper functions to create HTML forms. + * + * The Form helper is designed to provide quick and easy to use functions that + * will echo back HTML 5 form elements. + * + * @author Martijn van der Kleijn + * @copyright 2011, Martijn van der Kleijn + * @license http://www.wolfcms.org/about/wolf-cms-licensing.html + */ +class Form { + + /** + * Generates an element. + * + * Depending on browser support, valid types are: + * - text + * - image + * - tel + * - email + * - url + * - file + * - password + * - number + * - range + * - date + * - month + * - week + * - time + * - datetime + * - datetime-local + * - search + * - color + * - hidden + * + * @param type $name + * @param type $id + * @param type $type + * @param type $label + * @param type $placeholder + * @param type $required + * @param type $focus + * @return type + */ + public static function input($name, $id=false, $type='text', $label=false, $placeholder=false, $required=false, $focus=false, $autocomplete=false, $options=array()) { + $id = ($id !== false) ? $id : $name; + $type = (($type !== false) && ($type !== null)) ? $type : 'text'; + $required = ($required !== false) ? ' required' : ''; + $focus = ($focus !== false) ? ' autofocus' : ''; + $ph = ''; + $lbl = ''; + $opt = ''; + + switch ($autocomplete) { + case true: + $complete = ' autocomplete="on"'; + break; + case false: + $complete = ' autocomplete="off"'; + break; + default: + $complete = ''; + break; + } + + if ($placeholder !== false) { + $ph = ' placeholder="'; + if ($placeholder === true) { + switch ($type) { + case 'url': + $ph = $ph.'http://www.example.com'; + break; + case 'email': + $ph = $ph.'user@example.com'; + break; + case 'tel': + $ph = $ph.'e.g. +31201234567'; + break; + default: + break; + } + } + else { + $ph = $ph.$placeholder; + } + $ph = $ph.'"'; + } + + if ($label !== true) { + $lbl = ''; + } + + foreach ($options as $name => $value) { + $opt = $opt.' '.$name.'="'.$value.'"'; + } + + return $lbl.''; + } + + public static function textarea($name, $id=false, $rows=5, $value=false, $label=false, $placeholder=false, $required=false, $focus=false, $options=array()) { + $id = ($id !== false) ? $id : $name; + $type = (($type !== false) && ($type !== null)) ? $type : '5'; + $required = ($required !== false) ? ' required' : ''; + $focus = ($focus !== false) ? ' autofocus' : ''; + $ph = ''; + $opt = ''; + $value = (($value !== false) && ($value !== null)) ? $value : ''; + + if ($placeholder !== false) { + $ph = ' placeholder="'; + if ($placeholder !== true) { + $ph = $ph.$placeholder; + } + $ph = $ph.'"'; + } + + if ($label !== true) { + $lbl = ''; + } + + foreach ($options as $name => $value) { + $opt = $opt.' '.$name.'="'.$value.'"'; + } + + return $lbl.''; + } + + public static function radio($name, $values=array(), $required=false, $focus=false, $options=array()) { + $ret = ''; + $opt = ''; + + foreach ($options as $name => $value) { + $opt = $opt.' '.$name.'="'.$value.'"'; + } + + foreach ($values as $label => $value) { + $ret = $ret.''; + $ret = $ret.''; + } + + return $ret; + } + + public static function box($name, $values=array(), $required=false, $focus=false, $options=array()) { + $ret = ''; + $opt = ''; + + foreach ($options as $name => $value) { + $opt = $opt.' '.$name.'="'.$value.'"'; + } + + foreach ($values as $label => $value) { + $ret = $ret.''; + $ret = $ret.''; + } + + return $ret; + } + + public static function dropdown($name, $values=array(), $multiple=false, $selected=false, $size=1, $required=false, $focus=false, $options=array()) { + $multiple = ($multiple !== false) ? ' multiple="multiple"' : ''; + $size = ' size="'.$size.'"'; + $opt = ''; + foreach ($options as $name => $value) { + $opt = $opt.' '.$name.'="'.$value.'"'; + } + + $ret = ''; + } + + public static function button($name="Submit", $type='submit', $options=array()) { + $opt = ''; + + foreach ($options as $name => $value) { + $opt = $opt.' '.$name.'="'.$value.'"'; + } + + return ''; + } + +} \ No newline at end of file From 7b05050f3a030be1188b6ae93ac3da3180afadd6 Mon Sep 17 00:00:00 2001 From: Martijn Date: Sat, 17 Dec 2011 00:34:45 +0100 Subject: [PATCH 2/5] Added phpdoc --- wolf/helpers/Form.php | 178 ++++++++++++++++++++++++++++++------------ 1 file changed, 129 insertions(+), 49 deletions(-) diff --git a/wolf/helpers/Form.php b/wolf/helpers/Form.php index 75c829f9..7a532658 100644 --- a/wolf/helpers/Form.php +++ b/wolf/helpers/Form.php @@ -19,37 +19,26 @@ */ class Form { + /** * Generates an element. * * Depending on browser support, valid types are: - * - text - * - image - * - tel - * - email - * - url - * - file - * - password - * - number - * - range - * - date - * - month - * - week - * - time - * - datetime - * - datetime-local - * - search - * - color - * - hidden + * text, image, tel, email, url, file, password, number, range, date + * month, week, time, datetime, datetime-local, search, color, hidden + * + * Some features are not supported yet by all browsers, most notably IE. * - * @param type $name - * @param type $id - * @param type $type - * @param type $label - * @param type $placeholder - * @param type $required - * @param type $focus - * @return type + * @param string $name Name attribute for field. + * @param string $id Id attribute for field. + * @param string $type Type of field. + * @param boolean $label Add a label? + * @param string $placeholder Placeholder text. + * @param boolean $required Required field? + * @param boolean $focus Autofocus on field? + * @param boolean $autocomplete Autocomplete attribute. + * @param array $options Array of name=>value pairs to add as element attributes. + * @return string HTML 5 compliant field. */ public static function input($name, $id=false, $type='text', $label=false, $placeholder=false, $required=false, $focus=false, $autocomplete=false, $options=array()) { $id = ($id !== false) ? $id : $name; @@ -59,7 +48,7 @@ public static function input($name, $id=false, $type='text', $label=false, $plac $ph = ''; $lbl = ''; $opt = ''; - + switch ($autocomplete) { case true: $complete = ' autocomplete="on"'; @@ -70,7 +59,7 @@ public static function input($name, $id=false, $type='text', $label=false, $plac default: $complete = ''; break; - } + } if ($placeholder !== false) { $ph = ' placeholder="'; @@ -94,18 +83,42 @@ public static function input($name, $id=false, $type='text', $label=false, $plac } $ph = $ph.'"'; } - + if ($label !== true) { $lbl = ''; } - + foreach ($options as $name => $value) { $opt = $opt.' '.$name.'="'.$value.'"'; } return $lbl.''; } - + + + /** + * Generates a + * + * @param string $name + * @param string $id + * @param int $rows + * @param string $value + * @param string $label + * @param string $placeholder + * @param boolean $required + * @param boolean $focus + * @param array $options + * @return string + */ public static function textarea($name, $id=false, $rows=5, $value=false, $label=false, $placeholder=false, $required=false, $focus=false, $options=array()) { $id = ($id !== false) ? $id : $name; $type = (($type !== false) && ($type !== null)) ? $type : '5'; @@ -113,8 +126,9 @@ public static function textarea($name, $id=false, $rows=5, $value=false, $label= $focus = ($focus !== false) ? ' autofocus' : ''; $ph = ''; $opt = ''; + $lbl = ''; $value = (($value !== false) && ($value !== null)) ? $value : ''; - + if ($placeholder !== false) { $ph = ' placeholder="'; if ($placeholder !== true) { @@ -122,18 +136,36 @@ public static function textarea($name, $id=false, $rows=5, $value=false, $label= } $ph = $ph.'"'; } - - if ($label !== true) { + + if ($label === true) { $lbl = ''; } - + foreach ($options as $name => $value) { $opt = $opt.' '.$name.'="'.$value.'"'; } - + return $lbl.''; } - + + + /** + * Generates an element for radiobuttons. + * + * Minimal usage example: + * + * use_helper('Form'); + * $values = array('nl' => 'Netherlands, The', 'uk' => 'United Kingdom', + * 'us' => 'United States'); + * echo Form::radio('country', $values); + * + * @param string $name + * @param array $values + * @param boolean $required + * @param boolean $focus + * @param array $options + * @return string + */ public static function radio($name, $values=array(), $required=false, $focus=false, $options=array()) { $ret = ''; $opt = ''; @@ -141,15 +173,33 @@ public static function radio($name, $values=array(), $required=false, $focus=fal foreach ($options as $name => $value) { $opt = $opt.' '.$name.'="'.$value.'"'; } - + foreach ($values as $label => $value) { $ret = $ret.''; $ret = $ret.''; } - + return $ret; } - + + + /** + * Generates an element for checkboxes. + * + * Minimal usage example: + * + * use_helper('Form'); + * $values = array('nl' => 'Netherlands, The', 'uk' => 'United Kingdom', + * 'us' => 'United States'); + * echo Form::box('country', $values); + * + * @param string $name + * @param array $values + * @param boolean $required + * @param boolean $focus + * @param array $options + * @return string + */ public static function box($name, $values=array(), $required=false, $focus=false, $options=array()) { $ret = ''; $opt = ''; @@ -157,15 +207,36 @@ public static function box($name, $values=array(), $required=false, $focus=false foreach ($options as $name => $value) { $opt = $opt.' '.$name.'="'.$value.'"'; } - + foreach ($values as $label => $value) { $ret = $ret.''; $ret = $ret.''; } - + return $ret; } - + + + /** + * Generates a '; - + foreach ($values as $label => $value) { $sel = ($selected !== false && $value == $selected) ? ' selected="selected"' : ''; $ret = $ret.''; } - + return $ret.''; } - + + + /** + * Generates a '; } From c5bb47eb1b482d6cb00170035f3283df9bb3691a Mon Sep 17 00:00:00 2001 From: Martijn Date: Tue, 17 Jan 2012 22:07:41 +0100 Subject: [PATCH 3/5] Moving some functions from Page to Node --- wolf/app/models/Node.php | 1033 +++++++++++++++++++++++--------------- wolf/app/models/Page.php | 282 +---------- 2 files changed, 647 insertions(+), 668 deletions(-) diff --git a/wolf/app/models/Node.php b/wolf/app/models/Node.php index 8e3a76af..a5d7804c 100644 --- a/wolf/app/models/Node.php +++ b/wolf/app/models/Node.php @@ -1,4 +1,5 @@ * Copyright (C) 2010 Martijn van der Kleijn @@ -25,6 +26,269 @@ */ class Node extends Record { + // DB fields + public $parent_id; + public $slug = ''; + // Non DB fields + protected $uri = false; + protected $parent = false; + protected $level = false; + + + public function __construct($object=null, $parent=null) { + if ($parent !== null) { + $this->parent = $parent; + } + + if ($object !== null) { + foreach ($object as $key => $value) { + $this->$key = $value; + } + } + } + + + public function parentId() { + return $this->parent_id; + } + + + /** + * Returns the current page object's url. + * + * Usage: url(); ?> or url(); ?> + * + * @return string The url of the page object. + */ + public function url($suffix=false) { + if ($suffix === false) { + return BASE_URL.$this->uri(); + } + else { + return BASE_URL.$this->uri().($this->uri() != '' ? URL_SUFFIX : ''); + } + } + + + /** + * Allows user to get the url of a page by page ID. + * + * This function will always produce a correct and current url to the page + * despite it possibly having moved from its original position in the page + * hierarchy. + * + * Usage: + * + * @param int $id The id of the page to link to. + * @return mixed Full url of page or error message. + */ + public static function urlById($id) { + if (!is_numeric($id) || !is_int($id) || $id <= 0) { + return '[urlById: id NAN or id <= 0]'; + } + + $page = self::findById($id); + + if (!$page) + return '[urlById: no page with that id]'; + + return $page->url(); + } + + + public function slug() { + return $this->slug; + } + + + public function breadcrumb() { + return $this->breadcrumb; + } + + + /** + * Returns a set of breadcrumbs as html. + * + * @param string $separator The separator between crumbs. Defaults to > + * @return string The breadcrumbs as an html snippet. + */ + public function breadcrumbs($separator='>') { + $out = ''; + $url = ''; + $path = ''; + $paths = explode('/', '/'.$this->slug); + $nb_path = count($paths); + + if ($this->parent() !== false) + $out .= $this->parent()->_inversedBreadcrumbs($separator); + + return $out.''.$this->breadcrumb().''; + } + + + /** + * + * @todo Finish _inversedBreadcrumbs PHPDoc + * + * @param type $separator + * @return string + */ + private function _inversedBreadcrumbs($separator) { + $out = ''.$this->breadcrumb.''.$separator.''; + + if ($this->parent() !== false) + return $this->parent()->_inversedBreadcrumbs($separator).$out; + + return $out; + } + + + /** + * Counts the number of children belonging to a Page. + * + * @fixme Remove dependency on CMS_CONN - not good + * + * @param type $args + * @param type $value + * @param type $include_hidden + * @return int The number of children counted. + */ + public function childrenCount($args=null, $value=array(), $include_hidden=false) { + global $__CMS_CONN__; + + // Collect attributes... + $where = isset($args['where']) ? $args['where'] : ''; + $order = isset($args['order']) ? $args['order'] : 'position, id'; + $limit = isset($args['limit']) ? $args['limit'] : 0; + $offset = isset($args['offset']) ? $args['offset'] : 0; + + // Prepare query parts + $where_string = trim($where) == '' ? '' : "AND ".$where; + $limit_string = $limit > 0 ? "LIMIT $limit" : ''; + $offset_string = $offset > 0 ? "OFFSET $offset" : ''; + + // Prepare SQL + $sql = 'SELECT COUNT(*) AS nb_rows FROM '.TABLE_PREFIX.'page ' + .'WHERE parent_id = '.$this->id + ." AND (valid_until IS NULL OR CAST('".date('Y-m-d H:i:s')."' AS DATETIME) < valid_until)" + .' AND (status_id='.Page::STATUS_PUBLISHED + .($include_hidden ? ' OR status_id='.Page::STATUS_HIDDEN : '').') ' + ."$where_string ORDER BY $order $limit_string $offset_string"; + + $stmt = $__CMS_CONN__->prepare($sql); + $stmt->execute($value); + + return (int) $stmt->fetchColumn(); + } + + + /** + * Returns the Page object's parent. + * + * The option $level parameter allows the user to specify the level on + * which the found Page object should be. + * + * @param int $level Optional level parameter + * @return Page The object's parent. + */ + public function parent($level=null) { + + // check to see if it's already been retrieved, if not get the parent! + if ($this->parent === false && $this->parent_id != 0) { + $this->parent = self::findById($this->parentId()); + } + + if ($level === null) + return $this->parent; + + if ($level > $this->level) + return false; + else if ($this->level == $level) + return $this; + else + return $this->parent($level); + } + + + public function executionTime() { + return execution_time(); + } + + + /** + * Return an HTML anchor element for this page. + * + * @param string $label A custom label. Defaults to page title. + * @param array $options Array containing attributes to add. + * @return string The actual anchor element. + */ + public function link($label=null, $options='') { + if ($label == null) + $label = $this->title(); + + return sprintf('%s', $this->url(), $options, $label + ); + } + + + /** + * Allow user to link to a page by ID. + * + * This function will always produce a correct and current link to the page + * despite it possibly having moved from its original position in the page + * hierarchy. + * + * Usage: + * + * @param int $id The id of the page to link to. + * @param string $label The label or title of the link. + * @param string $options Any other HTML options you want to use. + * @return string XHTML compliant link code or error message. + */ + public static function linkById($id, $label=null, $options='') { + if (!is_numeric($id) || !is_int($id) || $id <= 0) { + return '[linkById: id NAN or id <= 0]'; + } + + $page = self::findById($id); + + if ($label == null) { + $label = $page->title(); + } + + return sprintf('%s', $page->url(), $options, $label + ); + } + + /** + * Returns the uri for this node. + * + * Note: The uri does not start nor end with a '/'. + * + * @return string The node's full uri. + */ + public function uri() { + if ($this->uri === false) { + if ($this->parent() !== false) + $this->uri = trim($this->parent()->uri().'/'.$this->slug, '/'); + else + $this->uri = trim($this->slug, '/'); + } + + return $this->uri; + } + + + /** + * @deprecated + * @see uri() + */ + public function getUri() { + return $this->uri(); + } + + + /** * Intended to eventually replace like-wise names JS function from wolf.js @@ -37,31 +301,30 @@ class Node extends Record { public static function toSlug($string) { global $UTF8_ROMANIZATION; $string = trim($string); - + /* TEST to check if we need to do nothing and simply return the string - // Test for non western characters that we support - $roman = array_keys($UTF8_ROMANIZATION); - $roman = implode('', $roman); - - $test = '([a-z]|[A-Z]|[0-9])'; - $test = preg_match($test, $string, $matches); - - if ($test === 0 || false === $test) { - return $string; - } + // Test for non western characters that we support + $roman = array_keys($UTF8_ROMANIZATION); + $roman = implode('', $roman); + + $test = '([a-z]|[A-Z]|[0-9])'; + $test = preg_match($test, $string, $matches); + + if ($test === 0 || false === $test) { + return $string; + } * */ - $string = strtr($string,$UTF8_ROMANIZATION); // Romanize + $string = strtr($string, $UTF8_ROMANIZATION); // Romanize $string = strtolower(trim($string)); // Lowercase $string = preg_replace('/[^-a-z0-9~\s\.:;+=_]/', '', $string); // Remove certain characters $string = preg_replace('/[\s\.:;=+]+/', '-', $string); // Replace characters by '-' return preg_replace('/[-]+/', '-', $string); } -} - +} /** * Romanization lookup table @@ -87,388 +350,360 @@ public static function toSlug($string) { * @author Denis Scheither */ global $UTF8_ROMANIZATION; -if(empty($UTF8_ROMANIZATION)) $UTF8_ROMANIZATION = array( - // scandinavian - differs from what we do in deaccent - 'å'=>'a','Å'=>'A','ä'=>'a','Ä'=>'A','ö'=>'o','Ö'=>'O', - - // various accents - added by mvdkleijn - 'á'=>'a','à'=>'a','â'=>'a','ą'=>'a', - 'ć'=>'c','č'=>'c','ç'=>'c','ц'=>'c', - 'д'=>'d','đ'=>'d','ď'=>'d', - 'é'=>'e','è'=>'e','ê'=>'e','ë'=>'e','ę'=>'e','ě'=>'e', - 'ф'=>'f', - 'г'=>'g','ѓ'=>'g', - 'í'=>'i','î'=>'i','ï'=>'i','и'=>'i', - 'й'=>'j', - 'к'=>'k', - 'ł'=>'l','л'=>'l', - 'м'=>'m', - 'ñ'=>'n','ń'=>'n','ň'=>'n', - 'ó'=>'o','ô'=>'o','ó'=>'o', - 'п'=>'p', - 'ú'=>'u','ù'=>'u','û'=>'u','ů'=>'u', - 'ř'=>'r', - 'š'=>'s','ś'=>'s', - 'ť'=>'t','т'=>'t', - 'в'=>'v', - 'ý'=>'y','ы'=>'y', - 'ž'=>'z','ż'=>'z','ź'=>'z','з'=>'z', - 'ä'=>'ae','æ'=>'ae', - 'ч'=>'ch', - 'ö'=>'oe','ø'=>'oe', - 'ü'=>'ue', - 'ш'=>'sh', - 'щ'=>'shh', - 'ß'=>'ss', - 'å'=>'aa', - 'я'=>'ya', - 'ю'=>'yu', - 'ж'=>'zh', - - //russian cyrillic - 'а'=>'a','А'=>'A','б'=>'b','Б'=>'B','в'=>'v','В'=>'V','г'=>'g','Г'=>'G', - 'д'=>'d','Д'=>'D','е'=>'e','Е'=>'E','ё'=>'jo','Ё'=>'Jo','ж'=>'zh','Ж'=>'Zh', - 'з'=>'z','З'=>'Z','и'=>'i','И'=>'I','й'=>'j','Й'=>'J','к'=>'k','К'=>'K', - 'л'=>'l','Л'=>'L','м'=>'m','М'=>'M','н'=>'n','Н'=>'N','о'=>'o','О'=>'O', - 'п'=>'p','П'=>'P','р'=>'r','Р'=>'R','с'=>'s','С'=>'S','т'=>'t','Т'=>'T', - 'у'=>'u','У'=>'U','ф'=>'f','Ф'=>'F','х'=>'x','Х'=>'X','ц'=>'c','Ц'=>'C', - 'ч'=>'ch','Ч'=>'Ch','ш'=>'sh','Ш'=>'Sh','щ'=>'sch','Щ'=>'Sch','ъ'=>'', - 'Ъ'=>'','ы'=>'y','Ы'=>'Y','ь'=>'','Ь'=>'','э'=>'eh','Э'=>'Eh','ю'=>'ju', - 'Ю'=>'Ju','я'=>'ja','Я'=>'Ja', - // Ukrainian cyrillic - 'Ґ'=>'Gh','ґ'=>'gh','Є'=>'Je','є'=>'je','І'=>'I','і'=>'i','Ї'=>'Ji','ї'=>'ji', - // Georgian - 'ა'=>'a','ბ'=>'b','გ'=>'g','დ'=>'d','ე'=>'e','ვ'=>'v','ზ'=>'z','თ'=>'th', - 'ი'=>'i','კ'=>'p','ლ'=>'l','მ'=>'m','ნ'=>'n','ო'=>'o','პ'=>'p','ჟ'=>'zh', - 'რ'=>'r','ს'=>'s','ტ'=>'t','უ'=>'u','ფ'=>'ph','ქ'=>'kh','ღ'=>'gh','ყ'=>'q', - 'შ'=>'sh','ჩ'=>'ch','ც'=>'c','ძ'=>'dh','წ'=>'w','ჭ'=>'j','ხ'=>'x','ჯ'=>'jh', - 'ჰ'=>'xh', - //Sanskrit - 'अ'=>'a','आ'=>'ah','इ'=>'i','ई'=>'ih','उ'=>'u','ऊ'=>'uh','ऋ'=>'ry', - 'ॠ'=>'ryh','ऌ'=>'ly','ॡ'=>'lyh','ए'=>'e','ऐ'=>'ay','ओ'=>'o','औ'=>'aw', - 'अं'=>'amh','अः'=>'aq','क'=>'k','ख'=>'kh','ग'=>'g','घ'=>'gh','ङ'=>'nh', - 'च'=>'c','छ'=>'ch','ज'=>'j','झ'=>'jh','ञ'=>'ny','ट'=>'tq','ठ'=>'tqh', - 'ड'=>'dq','ढ'=>'dqh','ण'=>'nq','त'=>'t','थ'=>'th','द'=>'d','ध'=>'dh', - 'न'=>'n','प'=>'p','फ'=>'ph','ब'=>'b','भ'=>'bh','म'=>'m','य'=>'z','र'=>'r', - 'ल'=>'l','व'=>'v','श'=>'sh','ष'=>'sqh','स'=>'s','ह'=>'x', - //Hebrew - 'א'=>'a', 'ב'=>'b','ג'=>'g','ד'=>'d','ה'=>'h','ו'=>'v','ז'=>'z','ח'=>'kh','ט'=>'th', - 'י'=>'y','ך'=>'h','כ'=>'k','ל'=>'l','ם'=>'m','מ'=>'m','ן'=>'n','נ'=>'n', - 'ס'=>'s','ע'=>'ah','ף'=>'f','פ'=>'p','ץ'=>'c','צ'=>'c','ק'=>'q','ר'=>'r', - 'ש'=>'sh','ת'=>'t', - //Arabic - 'ا'=>'a','ب'=>'b','ت'=>'t','ث'=>'th','ج'=>'g','ح'=>'xh','خ'=>'x','د'=>'d', - 'ذ'=>'dh','ر'=>'r','ز'=>'z','س'=>'s','ش'=>'sh','ص'=>'s\'','ض'=>'d\'', - 'ط'=>'t\'','ظ'=>'z\'','ع'=>'y','غ'=>'gh','ف'=>'f','ق'=>'q','ك'=>'k', - 'ل'=>'l','م'=>'m','ن'=>'n','ه'=>'x\'','و'=>'u','ي'=>'i', - - // Japanese characters (last update: 2008-05-09) - - // Japanese hiragana - - // 3 character syllables, っ doubles the consonant after - 'っちゃ'=>'ccha','っちぇ'=>'cche','っちょ'=>'ccho','っちゅ'=>'cchu', - 'っびゃ'=>'bbya','っびぇ'=>'bbye','っびぃ'=>'bbyi','っびょ'=>'bbyo','っびゅ'=>'bbyu', - 'っぴゃ'=>'ppya','っぴぇ'=>'ppye','っぴぃ'=>'ppyi','っぴょ'=>'ppyo','っぴゅ'=>'ppyu', - 'っちゃ'=>'ccha','っちぇ'=>'cche','っち'=>'cchi','っちょ'=>'ccho','っちゅ'=>'cchu', - // 'っひゃ'=>'hya','っひぇ'=>'hye','っひぃ'=>'hyi','っひょ'=>'hyo','っひゅ'=>'hyu', - 'っきゃ'=>'kkya','っきぇ'=>'kkye','っきぃ'=>'kkyi','っきょ'=>'kkyo','っきゅ'=>'kkyu', - 'っぎゃ'=>'ggya','っぎぇ'=>'ggye','っぎぃ'=>'ggyi','っぎょ'=>'ggyo','っぎゅ'=>'ggyu', - 'っみゃ'=>'mmya','っみぇ'=>'mmye','っみぃ'=>'mmyi','っみょ'=>'mmyo','っみゅ'=>'mmyu', - 'っにゃ'=>'nnya','っにぇ'=>'nnye','っにぃ'=>'nnyi','っにょ'=>'nnyo','っにゅ'=>'nnyu', - 'っりゃ'=>'rrya','っりぇ'=>'rrye','っりぃ'=>'rryi','っりょ'=>'rryo','っりゅ'=>'rryu', - 'っしゃ'=>'ssha','っしぇ'=>'sshe','っし'=>'sshi','っしょ'=>'ssho','っしゅ'=>'sshu', - - // seperate hiragana 'n' ('n' + 'i' != 'ni', normally we would write "kon'nichi wa" but the apostrophe would be converted to _ anyway) - 'んあ'=>'n_a','んえ'=>'n_e','んい'=>'n_i','んお'=>'n_o','んう'=>'n_u', - 'んや'=>'n_ya','んよ'=>'n_yo','んゆ'=>'n_yu', - - // 2 character syllables - normal - 'ふぁ'=>'fa','ふぇ'=>'fe','ふぃ'=>'fi','ふぉ'=>'fo', - 'ちゃ'=>'cha','ちぇ'=>'che','ち'=>'chi','ちょ'=>'cho','ちゅ'=>'chu', - 'ひゃ'=>'hya','ひぇ'=>'hye','ひぃ'=>'hyi','ひょ'=>'hyo','ひゅ'=>'hyu', - 'びゃ'=>'bya','びぇ'=>'bye','びぃ'=>'byi','びょ'=>'byo','びゅ'=>'byu', - 'ぴゃ'=>'pya','ぴぇ'=>'pye','ぴぃ'=>'pyi','ぴょ'=>'pyo','ぴゅ'=>'pyu', - 'きゃ'=>'kya','きぇ'=>'kye','きぃ'=>'kyi','きょ'=>'kyo','きゅ'=>'kyu', - 'ぎゃ'=>'gya','ぎぇ'=>'gye','ぎぃ'=>'gyi','ぎょ'=>'gyo','ぎゅ'=>'gyu', - 'みゃ'=>'mya','みぇ'=>'mye','みぃ'=>'myi','みょ'=>'myo','みゅ'=>'myu', - 'にゃ'=>'nya','にぇ'=>'nye','にぃ'=>'nyi','にょ'=>'nyo','にゅ'=>'nyu', - 'りゃ'=>'rya','りぇ'=>'rye','りぃ'=>'ryi','りょ'=>'ryo','りゅ'=>'ryu', - 'しゃ'=>'sha','しぇ'=>'she','し'=>'shi','しょ'=>'sho','しゅ'=>'shu', - 'じゃ'=>'ja','じぇ'=>'je','じょ'=>'jo','じゅ'=>'ju', - 'うぇ'=>'we','うぃ'=>'wi', - 'いぇ'=>'ye', - - // 2 character syllables, っ doubles the consonant after - 'っば'=>'bba','っべ'=>'bbe','っび'=>'bbi','っぼ'=>'bbo','っぶ'=>'bbu', - 'っぱ'=>'ppa','っぺ'=>'ppe','っぴ'=>'ppi','っぽ'=>'ppo','っぷ'=>'ppu', - 'った'=>'tta','って'=>'tte','っち'=>'cchi','っと'=>'tto','っつ'=>'ttsu', - 'っだ'=>'dda','っで'=>'dde','っぢ'=>'ddi','っど'=>'ddo','っづ'=>'ddu', - 'っが'=>'gga','っげ'=>'gge','っぎ'=>'ggi','っご'=>'ggo','っぐ'=>'ggu', - 'っか'=>'kka','っけ'=>'kke','っき'=>'kki','っこ'=>'kko','っく'=>'kku', - 'っま'=>'mma','っめ'=>'mme','っみ'=>'mmi','っも'=>'mmo','っむ'=>'mmu', - 'っな'=>'nna','っね'=>'nne','っに'=>'nni','っの'=>'nno','っぬ'=>'nnu', - 'っら'=>'rra','っれ'=>'rre','っり'=>'rri','っろ'=>'rro','っる'=>'rru', - 'っさ'=>'ssa','っせ'=>'sse','っし'=>'sshi','っそ'=>'sso','っす'=>'ssu', - 'っざ'=>'zza','っぜ'=>'zze','っじ'=>'jji','っぞ'=>'zzo','っず'=>'zzu', - - // 1 character syllabels - 'あ'=>'a','え'=>'e','い'=>'i','お'=>'o','う'=>'u','ん'=>'n', - 'は'=>'ha','へ'=>'he','ひ'=>'hi','ほ'=>'ho','ふ'=>'fu', - 'ば'=>'ba','べ'=>'be','び'=>'bi','ぼ'=>'bo','ぶ'=>'bu', - 'ぱ'=>'pa','ぺ'=>'pe','ぴ'=>'pi','ぽ'=>'po','ぷ'=>'pu', - 'た'=>'ta','て'=>'te','ち'=>'chi','と'=>'to','つ'=>'tsu', - 'だ'=>'da','で'=>'de','ぢ'=>'di','ど'=>'do','づ'=>'du', - 'が'=>'ga','げ'=>'ge','ぎ'=>'gi','ご'=>'go','ぐ'=>'gu', - 'か'=>'ka','け'=>'ke','き'=>'ki','こ'=>'ko','く'=>'ku', - 'ま'=>'ma','め'=>'me','み'=>'mi','も'=>'mo','む'=>'mu', - 'な'=>'na','ね'=>'ne','に'=>'ni','の'=>'no','ぬ'=>'nu', - 'ら'=>'ra','れ'=>'re','り'=>'ri','ろ'=>'ro','る'=>'ru', - 'さ'=>'sa','せ'=>'se','し'=>'shi','そ'=>'so','す'=>'su', - 'わ'=>'wa','を'=>'wo', - 'ざ'=>'za','ぜ'=>'ze','じ'=>'ji','ぞ'=>'zo','ず'=>'zu', - 'や'=>'ya','よ'=>'yo','ゆ'=>'yu', - // old characters - 'ゑ'=>'we','ゐ'=>'wi', - - // convert what's left (probably only kicks in when something's missing above) - // 'ぁ'=>'a','ぇ'=>'e','ぃ'=>'i','ぉ'=>'o','ぅ'=>'u', - // 'ゃ'=>'ya','ょ'=>'yo','ゅ'=>'yu', - - // never seen one of those (disabled for the moment) - // 'ヴぁ'=>'va','ヴぇ'=>'ve','ヴぃ'=>'vi','ヴぉ'=>'vo','ヴ'=>'vu', - // 'でゃ'=>'dha','でぇ'=>'dhe','でぃ'=>'dhi','でょ'=>'dho','でゅ'=>'dhu', - // 'どぁ'=>'dwa','どぇ'=>'dwe','どぃ'=>'dwi','どぉ'=>'dwo','どぅ'=>'dwu', - // 'ぢゃ'=>'dya','ぢぇ'=>'dye','ぢぃ'=>'dyi','ぢょ'=>'dyo','ぢゅ'=>'dyu', - // 'ふぁ'=>'fwa','ふぇ'=>'fwe','ふぃ'=>'fwi','ふぉ'=>'fwo','ふぅ'=>'fwu', - // 'ふゃ'=>'fya','ふぇ'=>'fye','ふぃ'=>'fyi','ふょ'=>'fyo','ふゅ'=>'fyu', - // 'すぁ'=>'swa','すぇ'=>'swe','すぃ'=>'swi','すぉ'=>'swo','すぅ'=>'swu', - // 'てゃ'=>'tha','てぇ'=>'the','てぃ'=>'thi','てょ'=>'tho','てゅ'=>'thu', - // 'つゃ'=>'tsa','つぇ'=>'tse','つぃ'=>'tsi','つょ'=>'tso','つ'=>'tsu', - // 'とぁ'=>'twa','とぇ'=>'twe','とぃ'=>'twi','とぉ'=>'two','とぅ'=>'twu', - // 'ヴゃ'=>'vya','ヴぇ'=>'vye','ヴぃ'=>'vyi','ヴょ'=>'vyo','ヴゅ'=>'vyu', - // 'うぁ'=>'wha','うぇ'=>'whe','うぃ'=>'whi','うぉ'=>'who','うぅ'=>'whu', - // 'じゃ'=>'zha','じぇ'=>'zhe','じぃ'=>'zhi','じょ'=>'zho','じゅ'=>'zhu', - // 'じゃ'=>'zya','じぇ'=>'zye','じぃ'=>'zyi','じょ'=>'zyo','じゅ'=>'zyu', - - // 'spare' characters from other romanization systems - // 'だ'=>'da','で'=>'de','ぢ'=>'di','ど'=>'do','づ'=>'du', - // 'ら'=>'la','れ'=>'le','り'=>'li','ろ'=>'lo','る'=>'lu', - // 'さ'=>'sa','せ'=>'se','し'=>'si','そ'=>'so','す'=>'su', - // 'ちゃ'=>'cya','ちぇ'=>'cye','ちぃ'=>'cyi','ちょ'=>'cyo','ちゅ'=>'cyu', - //'じゃ'=>'jya','じぇ'=>'jye','じぃ'=>'jyi','じょ'=>'jyo','じゅ'=>'jyu', - //'りゃ'=>'lya','りぇ'=>'lye','りぃ'=>'lyi','りょ'=>'lyo','りゅ'=>'lyu', - //'しゃ'=>'sya','しぇ'=>'sye','しぃ'=>'syi','しょ'=>'syo','しゅ'=>'syu', - //'ちゃ'=>'tya','ちぇ'=>'tye','ちぃ'=>'tyi','ちょ'=>'tyo','ちゅ'=>'tyu', - //'し'=>'ci',,い'=>'yi','ぢ'=>'dzi', - //'っじゃ'=>'jja','っじぇ'=>'jje','っじ'=>'jji','っじょ'=>'jjo','っじゅ'=>'jju', - - - // Japanese katakana - - // 4 character syllables: ッ doubles the consonant after, ー doubles the vowel before (usualy written with macron, but we don't want that in our URLs) - 'ッビャー'=>'bbyaa','ッビェー'=>'bbyee','ッビィー'=>'bbyii','ッビョー'=>'bbyoo','ッビュー'=>'bbyuu', - 'ッピャー'=>'ppyaa','ッピェー'=>'ppyee','ッピィー'=>'ppyii','ッピョー'=>'ppyoo','ッピュー'=>'ppyuu', - 'ッキャー'=>'kkyaa','ッキェー'=>'kkyee','ッキィー'=>'kkyii','ッキョー'=>'kkyoo','ッキュー'=>'kkyuu', - 'ッギャー'=>'ggyaa','ッギェー'=>'ggyee','ッギィー'=>'ggyii','ッギョー'=>'ggyoo','ッギュー'=>'ggyuu', - 'ッミャー'=>'mmyaa','ッミェー'=>'mmyee','ッミィー'=>'mmyii','ッミョー'=>'mmyoo','ッミュー'=>'mmyuu', - 'ッニャー'=>'nnyaa','ッニェー'=>'nnyee','ッニィー'=>'nnyii','ッニョー'=>'nnyoo','ッニュー'=>'nnyuu', - 'ッリャー'=>'rryaa','ッリェー'=>'rryee','ッリィー'=>'rryii','ッリョー'=>'rryoo','ッリュー'=>'rryuu', - 'ッシャー'=>'sshaa','ッシェー'=>'sshee','ッシー'=>'sshii','ッショー'=>'sshoo','ッシュー'=>'sshuu', - 'ッチャー'=>'cchaa','ッチェー'=>'cchee','ッチー'=>'cchii','ッチョー'=>'cchoo','ッチュー'=>'cchuu', - 'ッティー'=>'ttii', - 'ッヂィー'=>'ddii', - - // 3 character syllables - doubled vowels - 'ファー'=>'faa','フェー'=>'fee','フィー'=>'fii','フォー'=>'foo', - 'フャー'=>'fyaa','フェー'=>'fyee','フィー'=>'fyii','フョー'=>'fyoo','フュー'=>'fyuu', - 'ヒャー'=>'hyaa','ヒェー'=>'hyee','ヒィー'=>'hyii','ヒョー'=>'hyoo','ヒュー'=>'hyuu', - 'ビャー'=>'byaa','ビェー'=>'byee','ビィー'=>'byii','ビョー'=>'byoo','ビュー'=>'byuu', - 'ピャー'=>'pyaa','ピェー'=>'pyee','ピィー'=>'pyii','ピョー'=>'pyoo','ピュー'=>'pyuu', - 'キャー'=>'kyaa','キェー'=>'kyee','キィー'=>'kyii','キョー'=>'kyoo','キュー'=>'kyuu', - 'ギャー'=>'gyaa','ギェー'=>'gyee','ギィー'=>'gyii','ギョー'=>'gyoo','ギュー'=>'gyuu', - 'ミャー'=>'myaa','ミェー'=>'myee','ミィー'=>'myii','ミョー'=>'myoo','ミュー'=>'myuu', - 'ニャー'=>'nyaa','ニェー'=>'nyee','ニィー'=>'nyii','ニョー'=>'nyoo','ニュー'=>'nyuu', - 'リャー'=>'ryaa','リェー'=>'ryee','リィー'=>'ryii','リョー'=>'ryoo','リュー'=>'ryuu', - 'シャー'=>'shaa','シェー'=>'shee','シー'=>'shii','ショー'=>'shoo','シュー'=>'shuu', - 'ジャー'=>'jaa','ジェー'=>'jee','ジー'=>'jii','ジョー'=>'joo','ジュー'=>'juu', - 'スァー'=>'swaa','スェー'=>'swee','スィー'=>'swii','スォー'=>'swoo','スゥー'=>'swuu', - 'デァー'=>'daa','デェー'=>'dee','ディー'=>'dii','デォー'=>'doo','デゥー'=>'duu', - 'チャー'=>'chaa','チェー'=>'chee','チー'=>'chii','チョー'=>'choo','チュー'=>'chuu', - 'ヂャー'=>'dyaa','ヂェー'=>'dyee','ヂィー'=>'dyii','ヂョー'=>'dyoo','ヂュー'=>'dyuu', - 'ツャー'=>'tsaa','ツェー'=>'tsee','ツィー'=>'tsii','ツョー'=>'tsoo','ツー'=>'tsuu', - 'トァー'=>'twaa','トェー'=>'twee','トィー'=>'twii','トォー'=>'twoo','トゥー'=>'twuu', - 'ドァー'=>'dwaa','ドェー'=>'dwee','ドィー'=>'dwii','ドォー'=>'dwoo','ドゥー'=>'dwuu', - 'ウァー'=>'whaa','ウェー'=>'whee','ウィー'=>'whii','ウォー'=>'whoo','ウゥー'=>'whuu', - 'ヴャー'=>'vyaa','ヴェー'=>'vyee','ヴィー'=>'vyii','ヴョー'=>'vyoo','ヴュー'=>'vyuu', - 'ヴァー'=>'vaa','ヴェー'=>'vee','ヴィー'=>'vii','ヴォー'=>'voo','ヴー'=>'vuu', - 'ウェー'=>'wee','ウィー'=>'wii', - 'イェー'=>'yee', - 'ティー'=>'tii', - 'ヂィー'=>'dii', - - // 3 character syllables - doubled consonants - 'ッビャ'=>'bbya','ッビェ'=>'bbye','ッビィ'=>'bbyi','ッビョ'=>'bbyo','ッビュ'=>'bbyu', - 'ッピャ'=>'ppya','ッピェ'=>'ppye','ッピィ'=>'ppyi','ッピョ'=>'ppyo','ッピュ'=>'ppyu', - 'ッキャ'=>'kkya','ッキェ'=>'kkye','ッキィ'=>'kkyi','ッキョ'=>'kkyo','ッキュ'=>'kkyu', - 'ッギャ'=>'ggya','ッギェ'=>'ggye','ッギィ'=>'ggyi','ッギョ'=>'ggyo','ッギュ'=>'ggyu', - 'ッミャ'=>'mmya','ッミェ'=>'mmye','ッミィ'=>'mmyi','ッミョ'=>'mmyo','ッミュ'=>'mmyu', - 'ッニャ'=>'nnya','ッニェ'=>'nnye','ッニィ'=>'nnyi','ッニョ'=>'nnyo','ッニュ'=>'nnyu', - 'ッリャ'=>'rrya','ッリェ'=>'rrye','ッリィ'=>'rryi','ッリョ'=>'rryo','ッリュ'=>'rryu', - 'ッシャ'=>'ssha','ッシェ'=>'sshe','ッシ'=>'sshi','ッショ'=>'ssho','ッシュ'=>'sshu', - 'ッチャ'=>'ccha','ッチェ'=>'cche','ッチ'=>'cchi','ッチョ'=>'ccho','ッチュ'=>'cchu', - 'ッティ'=>'tti', - 'ッヂィ'=>'ddi', - - // 3 character syllables - doubled vowel and consonants - 'ッバー'=>'bbaa','ッベー'=>'bbee','ッビー'=>'bbii','ッボー'=>'bboo','ッブー'=>'bbuu', - 'ッパー'=>'ppaa','ッペー'=>'ppee','ッピー'=>'ppii','ッポー'=>'ppoo','ップー'=>'ppuu', - 'ッケー'=>'kkee','ッキー'=>'kkii','ッコー'=>'kkoo','ックー'=>'kkuu','ッカー'=>'kkaa', - 'ッガー'=>'ggaa','ッゲー'=>'ggee','ッギー'=>'ggii','ッゴー'=>'ggoo','ッグー'=>'gguu', - 'ッマー'=>'maa','ッメー'=>'mee','ッミー'=>'mii','ッモー'=>'moo','ッムー'=>'muu', - 'ッナー'=>'nnaa','ッネー'=>'nnee','ッニー'=>'nnii','ッノー'=>'nnoo','ッヌー'=>'nnuu', - 'ッラー'=>'rraa','ッレー'=>'rree','ッリー'=>'rrii','ッロー'=>'rroo','ッルー'=>'rruu', - 'ッサー'=>'ssaa','ッセー'=>'ssee','ッシー'=>'sshii','ッソー'=>'ssoo','ッスー'=>'ssuu', - 'ッザー'=>'zzaa','ッゼー'=>'zzee','ッジー'=>'jjii','ッゾー'=>'zzoo','ッズー'=>'zzuu', - 'ッター'=>'ttaa','ッテー'=>'ttee','ッチー'=>'chii','ットー'=>'ttoo','ッツー'=>'ttsuu', - 'ッダー'=>'ddaa','ッデー'=>'ddee','ッヂー'=>'ddii','ッドー'=>'ddoo','ッヅー'=>'dduu', - - // 2 character syllables - normal - 'ファ'=>'fa','フェ'=>'fe','フィ'=>'fi','フォ'=>'fo','フゥ'=>'fu', - // 'フャ'=>'fya','フェ'=>'fye','フィ'=>'fyi','フョ'=>'fyo','フュ'=>'fyu', - 'フャ'=>'fa','フェ'=>'fe','フィ'=>'fi','フョ'=>'fo','フュ'=>'fu', - 'ヒャ'=>'hya','ヒェ'=>'hye','ヒィ'=>'hyi','ヒョ'=>'hyo','ヒュ'=>'hyu', - 'ビャ'=>'bya','ビェ'=>'bye','ビィ'=>'byi','ビョ'=>'byo','ビュ'=>'byu', - 'ピャ'=>'pya','ピェ'=>'pye','ピィ'=>'pyi','ピョ'=>'pyo','ピュ'=>'pyu', - 'キャ'=>'kya','キェ'=>'kye','キィ'=>'kyi','キョ'=>'kyo','キュ'=>'kyu', - 'ギャ'=>'gya','ギェ'=>'gye','ギィ'=>'gyi','ギョ'=>'gyo','ギュ'=>'gyu', - 'ミャ'=>'mya','ミェ'=>'mye','ミィ'=>'myi','ミョ'=>'myo','ミュ'=>'myu', - 'ニャ'=>'nya','ニェ'=>'nye','ニィ'=>'nyi','ニョ'=>'nyo','ニュ'=>'nyu', - 'リャ'=>'rya','リェ'=>'rye','リィ'=>'ryi','リョ'=>'ryo','リュ'=>'ryu', - 'シャ'=>'sha','シェ'=>'she','ショ'=>'sho','シュ'=>'shu', - 'ジャ'=>'ja','ジェ'=>'je','ジョ'=>'jo','ジュ'=>'ju', - 'スァ'=>'swa','スェ'=>'swe','スィ'=>'swi','スォ'=>'swo','スゥ'=>'swu', - 'デァ'=>'da','デェ'=>'de','ディ'=>'di','デォ'=>'do','デゥ'=>'du', - 'チャ'=>'cha','チェ'=>'che','チ'=>'chi','チョ'=>'cho','チュ'=>'chu', - // 'ヂャ'=>'dya','ヂェ'=>'dye','ヂィ'=>'dyi','ヂョ'=>'dyo','ヂュ'=>'dyu', - 'ツャ'=>'tsa','ツェ'=>'tse','ツィ'=>'tsi','ツョ'=>'tso','ツ'=>'tsu', - 'トァ'=>'twa','トェ'=>'twe','トィ'=>'twi','トォ'=>'two','トゥ'=>'twu', - 'ドァ'=>'dwa','ドェ'=>'dwe','ドィ'=>'dwi','ドォ'=>'dwo','ドゥ'=>'dwu', - 'ウァ'=>'wha','ウェ'=>'whe','ウィ'=>'whi','ウォ'=>'who','ウゥ'=>'whu', - 'ヴャ'=>'vya','ヴェ'=>'vye','ヴィ'=>'vyi','ヴョ'=>'vyo','ヴュ'=>'vyu', - 'ヴァ'=>'va','ヴェ'=>'ve','ヴィ'=>'vi','ヴォ'=>'vo','ヴ'=>'vu', - 'ウェ'=>'we','ウィ'=>'wi', - 'イェ'=>'ye', - 'ティ'=>'ti', - 'ヂィ'=>'di', - - // 2 character syllables - doubled vocal - 'アー'=>'aa','エー'=>'ee','イー'=>'ii','オー'=>'oo','ウー'=>'uu', - 'ダー'=>'daa','デー'=>'dee','ヂー'=>'dii','ドー'=>'doo','ヅー'=>'duu', - 'ハー'=>'haa','ヘー'=>'hee','ヒー'=>'hii','ホー'=>'hoo','フー'=>'fuu', - 'バー'=>'baa','ベー'=>'bee','ビー'=>'bii','ボー'=>'boo','ブー'=>'buu', - 'パー'=>'paa','ペー'=>'pee','ピー'=>'pii','ポー'=>'poo','プー'=>'puu', - 'ケー'=>'kee','キー'=>'kii','コー'=>'koo','クー'=>'kuu','カー'=>'kaa', - 'ガー'=>'gaa','ゲー'=>'gee','ギー'=>'gii','ゴー'=>'goo','グー'=>'guu', - 'マー'=>'maa','メー'=>'mee','ミー'=>'mii','モー'=>'moo','ムー'=>'muu', - 'ナー'=>'naa','ネー'=>'nee','ニー'=>'nii','ノー'=>'noo','ヌー'=>'nuu', - 'ラー'=>'raa','レー'=>'ree','リー'=>'rii','ロー'=>'roo','ルー'=>'ruu', - 'サー'=>'saa','セー'=>'see','シー'=>'shii','ソー'=>'soo','スー'=>'suu', - 'ザー'=>'zaa','ゼー'=>'zee','ジー'=>'jii','ゾー'=>'zoo','ズー'=>'zuu', - 'ター'=>'taa','テー'=>'tee','チー'=>'chii','トー'=>'too','ツー'=>'tsuu', - 'ワー'=>'waa','ヲー'=>'woo', - 'ヤー'=>'yaa','ヨー'=>'yoo','ユー'=>'yuu', - 'ヵー'=>'kaa','ヶー'=>'kee', - // old characters - 'ヱー'=>'wee','ヰー'=>'wii', - - // seperate katakana 'n' - 'ンア'=>'n_a','ンエ'=>'n_e','ンイ'=>'n_i','ンオ'=>'n_o','ンウ'=>'n_u', - 'ンヤ'=>'n_ya','ンヨ'=>'n_yo','ンユ'=>'n_yu', - - // 2 character syllables - doubled consonants - 'ッバ'=>'bba','ッベ'=>'bbe','ッビ'=>'bbi','ッボ'=>'bbo','ッブ'=>'bbu', - 'ッパ'=>'ppa','ッペ'=>'ppe','ッピ'=>'ppi','ッポ'=>'ppo','ップ'=>'ppu', - 'ッケ'=>'kke','ッキ'=>'kki','ッコ'=>'kko','ック'=>'kku','ッカ'=>'kka', - 'ッガ'=>'gga','ッゲ'=>'gge','ッギ'=>'ggi','ッゴ'=>'ggo','ッグ'=>'ggu', - 'ッマ'=>'ma','ッメ'=>'me','ッミ'=>'mi','ッモ'=>'mo','ッム'=>'mu', - 'ッナ'=>'nna','ッネ'=>'nne','ッニ'=>'nni','ッノ'=>'nno','ッヌ'=>'nnu', - 'ッラ'=>'rra','ッレ'=>'rre','ッリ'=>'rri','ッロ'=>'rro','ッル'=>'rru', - 'ッサ'=>'ssa','ッセ'=>'sse','ッシ'=>'sshi','ッソ'=>'sso','ッス'=>'ssu', - 'ッザ'=>'zza','ッゼ'=>'zze','ッジ'=>'jji','ッゾ'=>'zzo','ッズ'=>'zzu', - 'ッタ'=>'tta','ッテ'=>'tte','ッチ'=>'cchi','ット'=>'tto','ッツ'=>'ttsu', - 'ッダ'=>'dda','ッデ'=>'dde','ッヂ'=>'ddi','ッド'=>'ddo','ッヅ'=>'ddu', - - // 1 character syllables - 'ア'=>'a','エ'=>'e','イ'=>'i','オ'=>'o','ウ'=>'u','ン'=>'n', - 'ハ'=>'ha','ヘ'=>'he','ヒ'=>'hi','ホ'=>'ho','フ'=>'fu', - 'バ'=>'ba','ベ'=>'be','ビ'=>'bi','ボ'=>'bo','ブ'=>'bu', - 'パ'=>'pa','ペ'=>'pe','ピ'=>'pi','ポ'=>'po','プ'=>'pu', - 'ケ'=>'ke','キ'=>'ki','コ'=>'ko','ク'=>'ku','カ'=>'ka', - 'ガ'=>'ga','ゲ'=>'ge','ギ'=>'gi','ゴ'=>'go','グ'=>'gu', - 'マ'=>'ma','メ'=>'me','ミ'=>'mi','モ'=>'mo','ム'=>'mu', - 'ナ'=>'na','ネ'=>'ne','ニ'=>'ni','ノ'=>'no','ヌ'=>'nu', - 'ラ'=>'ra','レ'=>'re','リ'=>'ri','ロ'=>'ro','ル'=>'ru', - 'サ'=>'sa','セ'=>'se','シ'=>'shi','ソ'=>'so','ス'=>'su', - 'ザ'=>'za','ゼ'=>'ze','ジ'=>'ji','ゾ'=>'zo','ズ'=>'zu', - 'タ'=>'ta','テ'=>'te','チ'=>'chi','ト'=>'to','ツ'=>'tsu', - 'ダ'=>'da','デ'=>'de','ヂ'=>'di','ド'=>'do','ヅ'=>'du', - 'ワ'=>'wa','ヲ'=>'wo', - 'ヤ'=>'ya','ヨ'=>'yo','ユ'=>'yu', - 'ヵ'=>'ka','ヶ'=>'ke', - // old characters - 'ヱ'=>'we','ヰ'=>'wi', - - // convert what's left (probably only kicks in when something's missing above) - 'ァ'=>'a','ェ'=>'e','ィ'=>'i','ォ'=>'o','ゥ'=>'u', - 'ャ'=>'ya','ョ'=>'yo','ュ'=>'yu', - - // special characters - '・'=>'_','、'=>'_', - 'ー'=>'_', // when used with hiragana (seldom), this character would not be converted otherwise - - // 'ラ'=>'la','レ'=>'le','リ'=>'li','ロ'=>'lo','ル'=>'lu', - // 'チャ'=>'cya','チェ'=>'cye','チィ'=>'cyi','チョ'=>'cyo','チュ'=>'cyu', - //'デャ'=>'dha','デェ'=>'dhe','ディ'=>'dhi','デョ'=>'dho','デュ'=>'dhu', - // 'リャ'=>'lya','リェ'=>'lye','リィ'=>'lyi','リョ'=>'lyo','リュ'=>'lyu', - // 'テャ'=>'tha','テェ'=>'the','ティ'=>'thi','テョ'=>'tho','テュ'=>'thu', - //'ファ'=>'fwa','フェ'=>'fwe','フィ'=>'fwi','フォ'=>'fwo','フゥ'=>'fwu', - //'チャ'=>'tya','チェ'=>'tye','チィ'=>'tyi','チョ'=>'tyo','チュ'=>'tyu', - // 'ジャ'=>'jya','ジェ'=>'jye','ジィ'=>'jyi','ジョ'=>'jyo','ジュ'=>'jyu', - // 'ジャ'=>'zha','ジェ'=>'zhe','ジィ'=>'zhi','ジョ'=>'zho','ジュ'=>'zhu', - //'ジャ'=>'zya','ジェ'=>'zye','ジィ'=>'zyi','ジョ'=>'zyo','ジュ'=>'zyu', - //'シャ'=>'sya','シェ'=>'sye','シィ'=>'syi','ショ'=>'syo','シュ'=>'syu', - //'シ'=>'ci','フ'=>'hu',シ'=>'si','チ'=>'ti','ツ'=>'tu','イ'=>'yi','ヂ'=>'dzi', - - // "Greeklish" - 'Γ'=>'G','Δ'=>'E','Θ'=>'Th','Λ'=>'L','Ξ'=>'X','Π'=>'P','Σ'=>'S','Φ'=>'F','Ψ'=>'Ps', - 'γ'=>'g','δ'=>'e','θ'=>'th','λ'=>'l','ξ'=>'x','π'=>'p','σ'=>'s','φ'=>'f','ψ'=>'ps', - - // Thai - 'ก'=>'k','ข'=>'kh','ฃ'=>'kh','ค'=>'kh','ฅ'=>'kh','ฆ'=>'kh','ง'=>'ng','จ'=>'ch', - 'ฉ'=>'ch','ช'=>'ch','ซ'=>'s','ฌ'=>'ch','ญ'=>'y','ฎ'=>'d','ฏ'=>'t','ฐ'=>'th', - 'ฑ'=>'d','ฒ'=>'th','ณ'=>'n','ด'=>'d','ต'=>'t','ถ'=>'th','ท'=>'th','ธ'=>'th', - 'น'=>'n','บ'=>'b','ป'=>'p','ผ'=>'ph','ฝ'=>'f','พ'=>'ph','ฟ'=>'f','ภ'=>'ph', - 'ม'=>'m','ย'=>'y','ร'=>'r','ฤ'=>'rue','ฤๅ'=>'rue','ล'=>'l','ฦ'=>'lue', - 'ฦๅ'=>'lue','ว'=>'w','ศ'=>'s','ษ'=>'s','ส'=>'s','ห'=>'h','ฬ'=>'l','ฮ'=>'h', - 'ะ'=>'a','ั'=>'a','รร'=>'a','า'=>'a','ๅ'=>'a','ำ'=>'am','ํา'=>'am', - 'ิ'=>'i','ี'=>'i','ึ'=>'ue','ี'=>'ue','ุ'=>'u','ู'=>'u', - 'เ'=>'e','แ'=>'ae','โ'=>'o','อ'=>'o', - 'ียะ'=>'ia','ีย'=>'ia','ือะ'=>'uea','ือ'=>'uea','ัวะ'=>'ua','ัว'=>'ua', - 'ใ'=>'ai','ไ'=>'ai','ัย'=>'ai','าย'=>'ai','าว'=>'ao', - 'ุย'=>'ui','อย'=>'oi','ือย'=>'ueai','วย'=>'uai', - 'ิว'=>'io','็ว'=>'eo','ียว'=>'iao', - '่'=>'','้'=>'','๊'=>'','๋'=>'','็'=>'', - '์'=>'','๎'=>'','ํ'=>'','ฺ'=>'', - 'ๆ'=>'2','๏'=>'o','ฯ'=>'-','๚'=>'-','๛'=>'-', - '๐'=>'0','๑'=>'1','๒'=>'2','๓'=>'3','๔'=>'4', - '๕'=>'5','๖'=>'6','๗'=>'7','๘'=>'8','๙'=>'9', - - // Korean - 'ㄱ'=>'k','ㅋ'=>'kh','ㄲ'=>'kk','ㄷ'=>'t','ㅌ'=>'th','ㄸ'=>'tt','ㅂ'=>'p', - 'ㅍ'=>'ph','ㅃ'=>'pp','ㅈ'=>'c','ㅊ'=>'ch','ㅉ'=>'cc','ㅅ'=>'s','ㅆ'=>'ss', - 'ㅎ'=>'h','ㅇ'=>'ng','ㄴ'=>'n','ㄹ'=>'l','ㅁ'=>'m', 'ㅏ'=>'a','ㅓ'=>'e','ㅗ'=>'o', - 'ㅜ'=>'wu','ㅡ'=>'u','ㅣ'=>'i','ㅐ'=>'ay','ㅔ'=>'ey','ㅚ'=>'oy','ㅘ'=>'wa','ㅝ'=>'we', - 'ㅟ'=>'wi','ㅙ'=>'way','ㅞ'=>'wey','ㅢ'=>'uy','ㅑ'=>'ya','ㅕ'=>'ye','ㅛ'=>'oy', - 'ㅠ'=>'yu','ㅒ'=>'yay','ㅖ'=>'yey', -); \ No newline at end of file +if (empty($UTF8_ROMANIZATION)) + $UTF8_ROMANIZATION = array( + // scandinavian - differs from what we do in deaccent + 'å' => 'a', 'Å' => 'A', 'ä' => 'a', 'Ä' => 'A', 'ö' => 'o', 'Ö' => 'O', + // various accents - added by mvdkleijn + 'á' => 'a', 'à' => 'a', 'â' => 'a', 'ą' => 'a', + 'ć' => 'c', 'č' => 'c', 'ç' => 'c', 'ц' => 'c', + 'д' => 'd', 'đ' => 'd', 'ď' => 'd', + 'é' => 'e', 'è' => 'e', 'ê' => 'e', 'ë' => 'e', 'ę' => 'e', 'ě' => 'e', + 'ф' => 'f', + 'г' => 'g', 'ѓ' => 'g', + 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'и' => 'i', + 'й' => 'j', + 'к' => 'k', + 'ł' => 'l', 'л' => 'l', + 'м' => 'm', + 'ñ' => 'n', 'ń' => 'n', 'ň' => 'n', + 'ó' => 'o', 'ô' => 'o', 'ó' => 'o', + 'п' => 'p', + 'ú' => 'u', 'ù' => 'u', 'û' => 'u', 'ů' => 'u', + 'ř' => 'r', + 'š' => 's', 'ś' => 's', + 'ť' => 't', 'т' => 't', + 'в' => 'v', + 'ý' => 'y', 'ы' => 'y', + 'ž' => 'z', 'ż' => 'z', 'ź' => 'z', 'з' => 'z', + 'ä' => 'ae', 'æ' => 'ae', + 'ч' => 'ch', + 'ö' => 'oe', 'ø' => 'oe', + 'ü' => 'ue', + 'ш' => 'sh', + 'щ' => 'shh', + 'ß' => 'ss', + 'å' => 'aa', + 'я' => 'ya', + 'ю' => 'yu', + 'ж' => 'zh', + //russian cyrillic + 'а' => 'a', 'А' => 'A', 'б' => 'b', 'Б' => 'B', 'в' => 'v', 'В' => 'V', 'г' => 'g', 'Г' => 'G', + 'д' => 'd', 'Д' => 'D', 'е' => 'e', 'Е' => 'E', 'ё' => 'jo', 'Ё' => 'Jo', 'ж' => 'zh', 'Ж' => 'Zh', + 'з' => 'z', 'З' => 'Z', 'и' => 'i', 'И' => 'I', 'й' => 'j', 'Й' => 'J', 'к' => 'k', 'К' => 'K', + 'л' => 'l', 'Л' => 'L', 'м' => 'm', 'М' => 'M', 'н' => 'n', 'Н' => 'N', 'о' => 'o', 'О' => 'O', + 'п' => 'p', 'П' => 'P', 'р' => 'r', 'Р' => 'R', 'с' => 's', 'С' => 'S', 'т' => 't', 'Т' => 'T', + 'у' => 'u', 'У' => 'U', 'ф' => 'f', 'Ф' => 'F', 'х' => 'x', 'Х' => 'X', 'ц' => 'c', 'Ц' => 'C', + 'ч' => 'ch', 'Ч' => 'Ch', 'ш' => 'sh', 'Ш' => 'Sh', 'щ' => 'sch', 'Щ' => 'Sch', 'ъ' => '', + 'Ъ' => '', 'ы' => 'y', 'Ы' => 'Y', 'ь' => '', 'Ь' => '', 'э' => 'eh', 'Э' => 'Eh', 'ю' => 'ju', + 'Ю' => 'Ju', 'я' => 'ja', 'Я' => 'Ja', + // Ukrainian cyrillic + 'Ґ' => 'Gh', 'ґ' => 'gh', 'Є' => 'Je', 'є' => 'je', 'І' => 'I', 'і' => 'i', 'Ї' => 'Ji', 'ї' => 'ji', + // Georgian + 'ა' => 'a', 'ბ' => 'b', 'გ' => 'g', 'დ' => 'd', 'ე' => 'e', 'ვ' => 'v', 'ზ' => 'z', 'თ' => 'th', + 'ი' => 'i', 'კ' => 'p', 'ლ' => 'l', 'მ' => 'm', 'ნ' => 'n', 'ო' => 'o', 'პ' => 'p', 'ჟ' => 'zh', + 'რ' => 'r', 'ს' => 's', 'ტ' => 't', 'უ' => 'u', 'ფ' => 'ph', 'ქ' => 'kh', 'ღ' => 'gh', 'ყ' => 'q', + 'შ' => 'sh', 'ჩ' => 'ch', 'ც' => 'c', 'ძ' => 'dh', 'წ' => 'w', 'ჭ' => 'j', 'ხ' => 'x', 'ჯ' => 'jh', + 'ჰ' => 'xh', + //Sanskrit + 'अ' => 'a', 'आ' => 'ah', 'इ' => 'i', 'ई' => 'ih', 'उ' => 'u', 'ऊ' => 'uh', 'ऋ' => 'ry', + 'ॠ' => 'ryh', 'ऌ' => 'ly', 'ॡ' => 'lyh', 'ए' => 'e', 'ऐ' => 'ay', 'ओ' => 'o', 'औ' => 'aw', + 'अं' => 'amh', 'अः' => 'aq', 'क' => 'k', 'ख' => 'kh', 'ग' => 'g', 'घ' => 'gh', 'ङ' => 'nh', + 'च' => 'c', 'छ' => 'ch', 'ज' => 'j', 'झ' => 'jh', 'ञ' => 'ny', 'ट' => 'tq', 'ठ' => 'tqh', + 'ड' => 'dq', 'ढ' => 'dqh', 'ण' => 'nq', 'त' => 't', 'थ' => 'th', 'द' => 'd', 'ध' => 'dh', + 'न' => 'n', 'प' => 'p', 'फ' => 'ph', 'ब' => 'b', 'भ' => 'bh', 'म' => 'm', 'य' => 'z', 'र' => 'r', + 'ल' => 'l', 'व' => 'v', 'श' => 'sh', 'ष' => 'sqh', 'स' => 's', 'ह' => 'x', + //Hebrew + 'א' => 'a', 'ב' => 'b', 'ג' => 'g', 'ד' => 'd', 'ה' => 'h', 'ו' => 'v', 'ז' => 'z', 'ח' => 'kh', 'ט' => 'th', + 'י' => 'y', 'ך' => 'h', 'כ' => 'k', 'ל' => 'l', 'ם' => 'm', 'מ' => 'm', 'ן' => 'n', 'נ' => 'n', + 'ס' => 's', 'ע' => 'ah', 'ף' => 'f', 'פ' => 'p', 'ץ' => 'c', 'צ' => 'c', 'ק' => 'q', 'ר' => 'r', + 'ש' => 'sh', 'ת' => 't', + //Arabic + 'ا' => 'a', 'ب' => 'b', 'ت' => 't', 'ث' => 'th', 'ج' => 'g', 'ح' => 'xh', 'خ' => 'x', 'د' => 'd', + 'ذ' => 'dh', 'ر' => 'r', 'ز' => 'z', 'س' => 's', 'ش' => 'sh', 'ص' => 's\'', 'ض' => 'd\'', + 'ط' => 't\'', 'ظ' => 'z\'', 'ع' => 'y', 'غ' => 'gh', 'ف' => 'f', 'ق' => 'q', 'ك' => 'k', + 'ل' => 'l', 'م' => 'm', 'ن' => 'n', 'ه' => 'x\'', 'و' => 'u', 'ي' => 'i', + // Japanese characters (last update: 2008-05-09) + // Japanese hiragana + // 3 character syllables, っ doubles the consonant after + 'っちゃ' => 'ccha', 'っちぇ' => 'cche', 'っちょ' => 'ccho', 'っちゅ' => 'cchu', + 'っびゃ' => 'bbya', 'っびぇ' => 'bbye', 'っびぃ' => 'bbyi', 'っびょ' => 'bbyo', 'っびゅ' => 'bbyu', + 'っぴゃ' => 'ppya', 'っぴぇ' => 'ppye', 'っぴぃ' => 'ppyi', 'っぴょ' => 'ppyo', 'っぴゅ' => 'ppyu', + 'っちゃ' => 'ccha', 'っちぇ' => 'cche', 'っち' => 'cchi', 'っちょ' => 'ccho', 'っちゅ' => 'cchu', + // 'っひゃ'=>'hya','っひぇ'=>'hye','っひぃ'=>'hyi','っひょ'=>'hyo','っひゅ'=>'hyu', + 'っきゃ' => 'kkya', 'っきぇ' => 'kkye', 'っきぃ' => 'kkyi', 'っきょ' => 'kkyo', 'っきゅ' => 'kkyu', + 'っぎゃ' => 'ggya', 'っぎぇ' => 'ggye', 'っぎぃ' => 'ggyi', 'っぎょ' => 'ggyo', 'っぎゅ' => 'ggyu', + 'っみゃ' => 'mmya', 'っみぇ' => 'mmye', 'っみぃ' => 'mmyi', 'っみょ' => 'mmyo', 'っみゅ' => 'mmyu', + 'っにゃ' => 'nnya', 'っにぇ' => 'nnye', 'っにぃ' => 'nnyi', 'っにょ' => 'nnyo', 'っにゅ' => 'nnyu', + 'っりゃ' => 'rrya', 'っりぇ' => 'rrye', 'っりぃ' => 'rryi', 'っりょ' => 'rryo', 'っりゅ' => 'rryu', + 'っしゃ' => 'ssha', 'っしぇ' => 'sshe', 'っし' => 'sshi', 'っしょ' => 'ssho', 'っしゅ' => 'sshu', + // seperate hiragana 'n' ('n' + 'i' != 'ni', normally we would write "kon'nichi wa" but the apostrophe would be converted to _ anyway) + 'んあ' => 'n_a', 'んえ' => 'n_e', 'んい' => 'n_i', 'んお' => 'n_o', 'んう' => 'n_u', + 'んや' => 'n_ya', 'んよ' => 'n_yo', 'んゆ' => 'n_yu', + // 2 character syllables - normal + 'ふぁ' => 'fa', 'ふぇ' => 'fe', 'ふぃ' => 'fi', 'ふぉ' => 'fo', + 'ちゃ' => 'cha', 'ちぇ' => 'che', 'ち' => 'chi', 'ちょ' => 'cho', 'ちゅ' => 'chu', + 'ひゃ' => 'hya', 'ひぇ' => 'hye', 'ひぃ' => 'hyi', 'ひょ' => 'hyo', 'ひゅ' => 'hyu', + 'びゃ' => 'bya', 'びぇ' => 'bye', 'びぃ' => 'byi', 'びょ' => 'byo', 'びゅ' => 'byu', + 'ぴゃ' => 'pya', 'ぴぇ' => 'pye', 'ぴぃ' => 'pyi', 'ぴょ' => 'pyo', 'ぴゅ' => 'pyu', + 'きゃ' => 'kya', 'きぇ' => 'kye', 'きぃ' => 'kyi', 'きょ' => 'kyo', 'きゅ' => 'kyu', + 'ぎゃ' => 'gya', 'ぎぇ' => 'gye', 'ぎぃ' => 'gyi', 'ぎょ' => 'gyo', 'ぎゅ' => 'gyu', + 'みゃ' => 'mya', 'みぇ' => 'mye', 'みぃ' => 'myi', 'みょ' => 'myo', 'みゅ' => 'myu', + 'にゃ' => 'nya', 'にぇ' => 'nye', 'にぃ' => 'nyi', 'にょ' => 'nyo', 'にゅ' => 'nyu', + 'りゃ' => 'rya', 'りぇ' => 'rye', 'りぃ' => 'ryi', 'りょ' => 'ryo', 'りゅ' => 'ryu', + 'しゃ' => 'sha', 'しぇ' => 'she', 'し' => 'shi', 'しょ' => 'sho', 'しゅ' => 'shu', + 'じゃ' => 'ja', 'じぇ' => 'je', 'じょ' => 'jo', 'じゅ' => 'ju', + 'うぇ' => 'we', 'うぃ' => 'wi', + 'いぇ' => 'ye', + // 2 character syllables, っ doubles the consonant after + 'っば' => 'bba', 'っべ' => 'bbe', 'っび' => 'bbi', 'っぼ' => 'bbo', 'っぶ' => 'bbu', + 'っぱ' => 'ppa', 'っぺ' => 'ppe', 'っぴ' => 'ppi', 'っぽ' => 'ppo', 'っぷ' => 'ppu', + 'った' => 'tta', 'って' => 'tte', 'っち' => 'cchi', 'っと' => 'tto', 'っつ' => 'ttsu', + 'っだ' => 'dda', 'っで' => 'dde', 'っぢ' => 'ddi', 'っど' => 'ddo', 'っづ' => 'ddu', + 'っが' => 'gga', 'っげ' => 'gge', 'っぎ' => 'ggi', 'っご' => 'ggo', 'っぐ' => 'ggu', + 'っか' => 'kka', 'っけ' => 'kke', 'っき' => 'kki', 'っこ' => 'kko', 'っく' => 'kku', + 'っま' => 'mma', 'っめ' => 'mme', 'っみ' => 'mmi', 'っも' => 'mmo', 'っむ' => 'mmu', + 'っな' => 'nna', 'っね' => 'nne', 'っに' => 'nni', 'っの' => 'nno', 'っぬ' => 'nnu', + 'っら' => 'rra', 'っれ' => 'rre', 'っり' => 'rri', 'っろ' => 'rro', 'っる' => 'rru', + 'っさ' => 'ssa', 'っせ' => 'sse', 'っし' => 'sshi', 'っそ' => 'sso', 'っす' => 'ssu', + 'っざ' => 'zza', 'っぜ' => 'zze', 'っじ' => 'jji', 'っぞ' => 'zzo', 'っず' => 'zzu', + // 1 character syllabels + 'あ' => 'a', 'え' => 'e', 'い' => 'i', 'お' => 'o', 'う' => 'u', 'ん' => 'n', + 'は' => 'ha', 'へ' => 'he', 'ひ' => 'hi', 'ほ' => 'ho', 'ふ' => 'fu', + 'ば' => 'ba', 'べ' => 'be', 'び' => 'bi', 'ぼ' => 'bo', 'ぶ' => 'bu', + 'ぱ' => 'pa', 'ぺ' => 'pe', 'ぴ' => 'pi', 'ぽ' => 'po', 'ぷ' => 'pu', + 'た' => 'ta', 'て' => 'te', 'ち' => 'chi', 'と' => 'to', 'つ' => 'tsu', + 'だ' => 'da', 'で' => 'de', 'ぢ' => 'di', 'ど' => 'do', 'づ' => 'du', + 'が' => 'ga', 'げ' => 'ge', 'ぎ' => 'gi', 'ご' => 'go', 'ぐ' => 'gu', + 'か' => 'ka', 'け' => 'ke', 'き' => 'ki', 'こ' => 'ko', 'く' => 'ku', + 'ま' => 'ma', 'め' => 'me', 'み' => 'mi', 'も' => 'mo', 'む' => 'mu', + 'な' => 'na', 'ね' => 'ne', 'に' => 'ni', 'の' => 'no', 'ぬ' => 'nu', + 'ら' => 'ra', 'れ' => 're', 'り' => 'ri', 'ろ' => 'ro', 'る' => 'ru', + 'さ' => 'sa', 'せ' => 'se', 'し' => 'shi', 'そ' => 'so', 'す' => 'su', + 'わ' => 'wa', 'を' => 'wo', + 'ざ' => 'za', 'ぜ' => 'ze', 'じ' => 'ji', 'ぞ' => 'zo', 'ず' => 'zu', + 'や' => 'ya', 'よ' => 'yo', 'ゆ' => 'yu', + // old characters + 'ゑ' => 'we', 'ゐ' => 'wi', + // convert what's left (probably only kicks in when something's missing above) + // 'ぁ'=>'a','ぇ'=>'e','ぃ'=>'i','ぉ'=>'o','ぅ'=>'u', + // 'ゃ'=>'ya','ょ'=>'yo','ゅ'=>'yu', + // never seen one of those (disabled for the moment) + // 'ヴぁ'=>'va','ヴぇ'=>'ve','ヴぃ'=>'vi','ヴぉ'=>'vo','ヴ'=>'vu', + // 'でゃ'=>'dha','でぇ'=>'dhe','でぃ'=>'dhi','でょ'=>'dho','でゅ'=>'dhu', + // 'どぁ'=>'dwa','どぇ'=>'dwe','どぃ'=>'dwi','どぉ'=>'dwo','どぅ'=>'dwu', + // 'ぢゃ'=>'dya','ぢぇ'=>'dye','ぢぃ'=>'dyi','ぢょ'=>'dyo','ぢゅ'=>'dyu', + // 'ふぁ'=>'fwa','ふぇ'=>'fwe','ふぃ'=>'fwi','ふぉ'=>'fwo','ふぅ'=>'fwu', + // 'ふゃ'=>'fya','ふぇ'=>'fye','ふぃ'=>'fyi','ふょ'=>'fyo','ふゅ'=>'fyu', + // 'すぁ'=>'swa','すぇ'=>'swe','すぃ'=>'swi','すぉ'=>'swo','すぅ'=>'swu', + // 'てゃ'=>'tha','てぇ'=>'the','てぃ'=>'thi','てょ'=>'tho','てゅ'=>'thu', + // 'つゃ'=>'tsa','つぇ'=>'tse','つぃ'=>'tsi','つょ'=>'tso','つ'=>'tsu', + // 'とぁ'=>'twa','とぇ'=>'twe','とぃ'=>'twi','とぉ'=>'two','とぅ'=>'twu', + // 'ヴゃ'=>'vya','ヴぇ'=>'vye','ヴぃ'=>'vyi','ヴょ'=>'vyo','ヴゅ'=>'vyu', + // 'うぁ'=>'wha','うぇ'=>'whe','うぃ'=>'whi','うぉ'=>'who','うぅ'=>'whu', + // 'じゃ'=>'zha','じぇ'=>'zhe','じぃ'=>'zhi','じょ'=>'zho','じゅ'=>'zhu', + // 'じゃ'=>'zya','じぇ'=>'zye','じぃ'=>'zyi','じょ'=>'zyo','じゅ'=>'zyu', + // 'spare' characters from other romanization systems + // 'だ'=>'da','で'=>'de','ぢ'=>'di','ど'=>'do','づ'=>'du', + // 'ら'=>'la','れ'=>'le','り'=>'li','ろ'=>'lo','る'=>'lu', + // 'さ'=>'sa','せ'=>'se','し'=>'si','そ'=>'so','す'=>'su', + // 'ちゃ'=>'cya','ちぇ'=>'cye','ちぃ'=>'cyi','ちょ'=>'cyo','ちゅ'=>'cyu', + //'じゃ'=>'jya','じぇ'=>'jye','じぃ'=>'jyi','じょ'=>'jyo','じゅ'=>'jyu', + //'りゃ'=>'lya','りぇ'=>'lye','りぃ'=>'lyi','りょ'=>'lyo','りゅ'=>'lyu', + //'しゃ'=>'sya','しぇ'=>'sye','しぃ'=>'syi','しょ'=>'syo','しゅ'=>'syu', + //'ちゃ'=>'tya','ちぇ'=>'tye','ちぃ'=>'tyi','ちょ'=>'tyo','ちゅ'=>'tyu', + //'し'=>'ci',,い'=>'yi','ぢ'=>'dzi', + //'っじゃ'=>'jja','っじぇ'=>'jje','っじ'=>'jji','っじょ'=>'jjo','っじゅ'=>'jju', + // Japanese katakana + // 4 character syllables: ッ doubles the consonant after, ー doubles the vowel before (usualy written with macron, but we don't want that in our URLs) + 'ッビャー' => 'bbyaa', 'ッビェー' => 'bbyee', 'ッビィー' => 'bbyii', 'ッビョー' => 'bbyoo', 'ッビュー' => 'bbyuu', + 'ッピャー' => 'ppyaa', 'ッピェー' => 'ppyee', 'ッピィー' => 'ppyii', 'ッピョー' => 'ppyoo', 'ッピュー' => 'ppyuu', + 'ッキャー' => 'kkyaa', 'ッキェー' => 'kkyee', 'ッキィー' => 'kkyii', 'ッキョー' => 'kkyoo', 'ッキュー' => 'kkyuu', + 'ッギャー' => 'ggyaa', 'ッギェー' => 'ggyee', 'ッギィー' => 'ggyii', 'ッギョー' => 'ggyoo', 'ッギュー' => 'ggyuu', + 'ッミャー' => 'mmyaa', 'ッミェー' => 'mmyee', 'ッミィー' => 'mmyii', 'ッミョー' => 'mmyoo', 'ッミュー' => 'mmyuu', + 'ッニャー' => 'nnyaa', 'ッニェー' => 'nnyee', 'ッニィー' => 'nnyii', 'ッニョー' => 'nnyoo', 'ッニュー' => 'nnyuu', + 'ッリャー' => 'rryaa', 'ッリェー' => 'rryee', 'ッリィー' => 'rryii', 'ッリョー' => 'rryoo', 'ッリュー' => 'rryuu', + 'ッシャー' => 'sshaa', 'ッシェー' => 'sshee', 'ッシー' => 'sshii', 'ッショー' => 'sshoo', 'ッシュー' => 'sshuu', + 'ッチャー' => 'cchaa', 'ッチェー' => 'cchee', 'ッチー' => 'cchii', 'ッチョー' => 'cchoo', 'ッチュー' => 'cchuu', + 'ッティー' => 'ttii', + 'ッヂィー' => 'ddii', + // 3 character syllables - doubled vowels + 'ファー' => 'faa', 'フェー' => 'fee', 'フィー' => 'fii', 'フォー' => 'foo', + 'フャー' => 'fyaa', 'フェー' => 'fyee', 'フィー' => 'fyii', 'フョー' => 'fyoo', 'フュー' => 'fyuu', + 'ヒャー' => 'hyaa', 'ヒェー' => 'hyee', 'ヒィー' => 'hyii', 'ヒョー' => 'hyoo', 'ヒュー' => 'hyuu', + 'ビャー' => 'byaa', 'ビェー' => 'byee', 'ビィー' => 'byii', 'ビョー' => 'byoo', 'ビュー' => 'byuu', + 'ピャー' => 'pyaa', 'ピェー' => 'pyee', 'ピィー' => 'pyii', 'ピョー' => 'pyoo', 'ピュー' => 'pyuu', + 'キャー' => 'kyaa', 'キェー' => 'kyee', 'キィー' => 'kyii', 'キョー' => 'kyoo', 'キュー' => 'kyuu', + 'ギャー' => 'gyaa', 'ギェー' => 'gyee', 'ギィー' => 'gyii', 'ギョー' => 'gyoo', 'ギュー' => 'gyuu', + 'ミャー' => 'myaa', 'ミェー' => 'myee', 'ミィー' => 'myii', 'ミョー' => 'myoo', 'ミュー' => 'myuu', + 'ニャー' => 'nyaa', 'ニェー' => 'nyee', 'ニィー' => 'nyii', 'ニョー' => 'nyoo', 'ニュー' => 'nyuu', + 'リャー' => 'ryaa', 'リェー' => 'ryee', 'リィー' => 'ryii', 'リョー' => 'ryoo', 'リュー' => 'ryuu', + 'シャー' => 'shaa', 'シェー' => 'shee', 'シー' => 'shii', 'ショー' => 'shoo', 'シュー' => 'shuu', + 'ジャー' => 'jaa', 'ジェー' => 'jee', 'ジー' => 'jii', 'ジョー' => 'joo', 'ジュー' => 'juu', + 'スァー' => 'swaa', 'スェー' => 'swee', 'スィー' => 'swii', 'スォー' => 'swoo', 'スゥー' => 'swuu', + 'デァー' => 'daa', 'デェー' => 'dee', 'ディー' => 'dii', 'デォー' => 'doo', 'デゥー' => 'duu', + 'チャー' => 'chaa', 'チェー' => 'chee', 'チー' => 'chii', 'チョー' => 'choo', 'チュー' => 'chuu', + 'ヂャー' => 'dyaa', 'ヂェー' => 'dyee', 'ヂィー' => 'dyii', 'ヂョー' => 'dyoo', 'ヂュー' => 'dyuu', + 'ツャー' => 'tsaa', 'ツェー' => 'tsee', 'ツィー' => 'tsii', 'ツョー' => 'tsoo', 'ツー' => 'tsuu', + 'トァー' => 'twaa', 'トェー' => 'twee', 'トィー' => 'twii', 'トォー' => 'twoo', 'トゥー' => 'twuu', + 'ドァー' => 'dwaa', 'ドェー' => 'dwee', 'ドィー' => 'dwii', 'ドォー' => 'dwoo', 'ドゥー' => 'dwuu', + 'ウァー' => 'whaa', 'ウェー' => 'whee', 'ウィー' => 'whii', 'ウォー' => 'whoo', 'ウゥー' => 'whuu', + 'ヴャー' => 'vyaa', 'ヴェー' => 'vyee', 'ヴィー' => 'vyii', 'ヴョー' => 'vyoo', 'ヴュー' => 'vyuu', + 'ヴァー' => 'vaa', 'ヴェー' => 'vee', 'ヴィー' => 'vii', 'ヴォー' => 'voo', 'ヴー' => 'vuu', + 'ウェー' => 'wee', 'ウィー' => 'wii', + 'イェー' => 'yee', + 'ティー' => 'tii', + 'ヂィー' => 'dii', + // 3 character syllables - doubled consonants + 'ッビャ' => 'bbya', 'ッビェ' => 'bbye', 'ッビィ' => 'bbyi', 'ッビョ' => 'bbyo', 'ッビュ' => 'bbyu', + 'ッピャ' => 'ppya', 'ッピェ' => 'ppye', 'ッピィ' => 'ppyi', 'ッピョ' => 'ppyo', 'ッピュ' => 'ppyu', + 'ッキャ' => 'kkya', 'ッキェ' => 'kkye', 'ッキィ' => 'kkyi', 'ッキョ' => 'kkyo', 'ッキュ' => 'kkyu', + 'ッギャ' => 'ggya', 'ッギェ' => 'ggye', 'ッギィ' => 'ggyi', 'ッギョ' => 'ggyo', 'ッギュ' => 'ggyu', + 'ッミャ' => 'mmya', 'ッミェ' => 'mmye', 'ッミィ' => 'mmyi', 'ッミョ' => 'mmyo', 'ッミュ' => 'mmyu', + 'ッニャ' => 'nnya', 'ッニェ' => 'nnye', 'ッニィ' => 'nnyi', 'ッニョ' => 'nnyo', 'ッニュ' => 'nnyu', + 'ッリャ' => 'rrya', 'ッリェ' => 'rrye', 'ッリィ' => 'rryi', 'ッリョ' => 'rryo', 'ッリュ' => 'rryu', + 'ッシャ' => 'ssha', 'ッシェ' => 'sshe', 'ッシ' => 'sshi', 'ッショ' => 'ssho', 'ッシュ' => 'sshu', + 'ッチャ' => 'ccha', 'ッチェ' => 'cche', 'ッチ' => 'cchi', 'ッチョ' => 'ccho', 'ッチュ' => 'cchu', + 'ッティ' => 'tti', + 'ッヂィ' => 'ddi', + // 3 character syllables - doubled vowel and consonants + 'ッバー' => 'bbaa', 'ッベー' => 'bbee', 'ッビー' => 'bbii', 'ッボー' => 'bboo', 'ッブー' => 'bbuu', + 'ッパー' => 'ppaa', 'ッペー' => 'ppee', 'ッピー' => 'ppii', 'ッポー' => 'ppoo', 'ップー' => 'ppuu', + 'ッケー' => 'kkee', 'ッキー' => 'kkii', 'ッコー' => 'kkoo', 'ックー' => 'kkuu', 'ッカー' => 'kkaa', + 'ッガー' => 'ggaa', 'ッゲー' => 'ggee', 'ッギー' => 'ggii', 'ッゴー' => 'ggoo', 'ッグー' => 'gguu', + 'ッマー' => 'maa', 'ッメー' => 'mee', 'ッミー' => 'mii', 'ッモー' => 'moo', 'ッムー' => 'muu', + 'ッナー' => 'nnaa', 'ッネー' => 'nnee', 'ッニー' => 'nnii', 'ッノー' => 'nnoo', 'ッヌー' => 'nnuu', + 'ッラー' => 'rraa', 'ッレー' => 'rree', 'ッリー' => 'rrii', 'ッロー' => 'rroo', 'ッルー' => 'rruu', + 'ッサー' => 'ssaa', 'ッセー' => 'ssee', 'ッシー' => 'sshii', 'ッソー' => 'ssoo', 'ッスー' => 'ssuu', + 'ッザー' => 'zzaa', 'ッゼー' => 'zzee', 'ッジー' => 'jjii', 'ッゾー' => 'zzoo', 'ッズー' => 'zzuu', + 'ッター' => 'ttaa', 'ッテー' => 'ttee', 'ッチー' => 'chii', 'ットー' => 'ttoo', 'ッツー' => 'ttsuu', + 'ッダー' => 'ddaa', 'ッデー' => 'ddee', 'ッヂー' => 'ddii', 'ッドー' => 'ddoo', 'ッヅー' => 'dduu', + // 2 character syllables - normal + 'ファ' => 'fa', 'フェ' => 'fe', 'フィ' => 'fi', 'フォ' => 'fo', 'フゥ' => 'fu', + // 'フャ'=>'fya','フェ'=>'fye','フィ'=>'fyi','フョ'=>'fyo','フュ'=>'fyu', + 'フャ' => 'fa', 'フェ' => 'fe', 'フィ' => 'fi', 'フョ' => 'fo', 'フュ' => 'fu', + 'ヒャ' => 'hya', 'ヒェ' => 'hye', 'ヒィ' => 'hyi', 'ヒョ' => 'hyo', 'ヒュ' => 'hyu', + 'ビャ' => 'bya', 'ビェ' => 'bye', 'ビィ' => 'byi', 'ビョ' => 'byo', 'ビュ' => 'byu', + 'ピャ' => 'pya', 'ピェ' => 'pye', 'ピィ' => 'pyi', 'ピョ' => 'pyo', 'ピュ' => 'pyu', + 'キャ' => 'kya', 'キェ' => 'kye', 'キィ' => 'kyi', 'キョ' => 'kyo', 'キュ' => 'kyu', + 'ギャ' => 'gya', 'ギェ' => 'gye', 'ギィ' => 'gyi', 'ギョ' => 'gyo', 'ギュ' => 'gyu', + 'ミャ' => 'mya', 'ミェ' => 'mye', 'ミィ' => 'myi', 'ミョ' => 'myo', 'ミュ' => 'myu', + 'ニャ' => 'nya', 'ニェ' => 'nye', 'ニィ' => 'nyi', 'ニョ' => 'nyo', 'ニュ' => 'nyu', + 'リャ' => 'rya', 'リェ' => 'rye', 'リィ' => 'ryi', 'リョ' => 'ryo', 'リュ' => 'ryu', + 'シャ' => 'sha', 'シェ' => 'she', 'ショ' => 'sho', 'シュ' => 'shu', + 'ジャ' => 'ja', 'ジェ' => 'je', 'ジョ' => 'jo', 'ジュ' => 'ju', + 'スァ' => 'swa', 'スェ' => 'swe', 'スィ' => 'swi', 'スォ' => 'swo', 'スゥ' => 'swu', + 'デァ' => 'da', 'デェ' => 'de', 'ディ' => 'di', 'デォ' => 'do', 'デゥ' => 'du', + 'チャ' => 'cha', 'チェ' => 'che', 'チ' => 'chi', 'チョ' => 'cho', 'チュ' => 'chu', + // 'ヂャ'=>'dya','ヂェ'=>'dye','ヂィ'=>'dyi','ヂョ'=>'dyo','ヂュ'=>'dyu', + 'ツャ' => 'tsa', 'ツェ' => 'tse', 'ツィ' => 'tsi', 'ツョ' => 'tso', 'ツ' => 'tsu', + 'トァ' => 'twa', 'トェ' => 'twe', 'トィ' => 'twi', 'トォ' => 'two', 'トゥ' => 'twu', + 'ドァ' => 'dwa', 'ドェ' => 'dwe', 'ドィ' => 'dwi', 'ドォ' => 'dwo', 'ドゥ' => 'dwu', + 'ウァ' => 'wha', 'ウェ' => 'whe', 'ウィ' => 'whi', 'ウォ' => 'who', 'ウゥ' => 'whu', + 'ヴャ' => 'vya', 'ヴェ' => 'vye', 'ヴィ' => 'vyi', 'ヴョ' => 'vyo', 'ヴュ' => 'vyu', + 'ヴァ' => 'va', 'ヴェ' => 've', 'ヴィ' => 'vi', 'ヴォ' => 'vo', 'ヴ' => 'vu', + 'ウェ' => 'we', 'ウィ' => 'wi', + 'イェ' => 'ye', + 'ティ' => 'ti', + 'ヂィ' => 'di', + // 2 character syllables - doubled vocal + 'アー' => 'aa', 'エー' => 'ee', 'イー' => 'ii', 'オー' => 'oo', 'ウー' => 'uu', + 'ダー' => 'daa', 'デー' => 'dee', 'ヂー' => 'dii', 'ドー' => 'doo', 'ヅー' => 'duu', + 'ハー' => 'haa', 'ヘー' => 'hee', 'ヒー' => 'hii', 'ホー' => 'hoo', 'フー' => 'fuu', + 'バー' => 'baa', 'ベー' => 'bee', 'ビー' => 'bii', 'ボー' => 'boo', 'ブー' => 'buu', + 'パー' => 'paa', 'ペー' => 'pee', 'ピー' => 'pii', 'ポー' => 'poo', 'プー' => 'puu', + 'ケー' => 'kee', 'キー' => 'kii', 'コー' => 'koo', 'クー' => 'kuu', 'カー' => 'kaa', + 'ガー' => 'gaa', 'ゲー' => 'gee', 'ギー' => 'gii', 'ゴー' => 'goo', 'グー' => 'guu', + 'マー' => 'maa', 'メー' => 'mee', 'ミー' => 'mii', 'モー' => 'moo', 'ムー' => 'muu', + 'ナー' => 'naa', 'ネー' => 'nee', 'ニー' => 'nii', 'ノー' => 'noo', 'ヌー' => 'nuu', + 'ラー' => 'raa', 'レー' => 'ree', 'リー' => 'rii', 'ロー' => 'roo', 'ルー' => 'ruu', + 'サー' => 'saa', 'セー' => 'see', 'シー' => 'shii', 'ソー' => 'soo', 'スー' => 'suu', + 'ザー' => 'zaa', 'ゼー' => 'zee', 'ジー' => 'jii', 'ゾー' => 'zoo', 'ズー' => 'zuu', + 'ター' => 'taa', 'テー' => 'tee', 'チー' => 'chii', 'トー' => 'too', 'ツー' => 'tsuu', + 'ワー' => 'waa', 'ヲー' => 'woo', + 'ヤー' => 'yaa', 'ヨー' => 'yoo', 'ユー' => 'yuu', + 'ヵー' => 'kaa', 'ヶー' => 'kee', + // old characters + 'ヱー' => 'wee', 'ヰー' => 'wii', + // seperate katakana 'n' + 'ンア' => 'n_a', 'ンエ' => 'n_e', 'ンイ' => 'n_i', 'ンオ' => 'n_o', 'ンウ' => 'n_u', + 'ンヤ' => 'n_ya', 'ンヨ' => 'n_yo', 'ンユ' => 'n_yu', + // 2 character syllables - doubled consonants + 'ッバ' => 'bba', 'ッベ' => 'bbe', 'ッビ' => 'bbi', 'ッボ' => 'bbo', 'ッブ' => 'bbu', + 'ッパ' => 'ppa', 'ッペ' => 'ppe', 'ッピ' => 'ppi', 'ッポ' => 'ppo', 'ップ' => 'ppu', + 'ッケ' => 'kke', 'ッキ' => 'kki', 'ッコ' => 'kko', 'ック' => 'kku', 'ッカ' => 'kka', + 'ッガ' => 'gga', 'ッゲ' => 'gge', 'ッギ' => 'ggi', 'ッゴ' => 'ggo', 'ッグ' => 'ggu', + 'ッマ' => 'ma', 'ッメ' => 'me', 'ッミ' => 'mi', 'ッモ' => 'mo', 'ッム' => 'mu', + 'ッナ' => 'nna', 'ッネ' => 'nne', 'ッニ' => 'nni', 'ッノ' => 'nno', 'ッヌ' => 'nnu', + 'ッラ' => 'rra', 'ッレ' => 'rre', 'ッリ' => 'rri', 'ッロ' => 'rro', 'ッル' => 'rru', + 'ッサ' => 'ssa', 'ッセ' => 'sse', 'ッシ' => 'sshi', 'ッソ' => 'sso', 'ッス' => 'ssu', + 'ッザ' => 'zza', 'ッゼ' => 'zze', 'ッジ' => 'jji', 'ッゾ' => 'zzo', 'ッズ' => 'zzu', + 'ッタ' => 'tta', 'ッテ' => 'tte', 'ッチ' => 'cchi', 'ット' => 'tto', 'ッツ' => 'ttsu', + 'ッダ' => 'dda', 'ッデ' => 'dde', 'ッヂ' => 'ddi', 'ッド' => 'ddo', 'ッヅ' => 'ddu', + // 1 character syllables + 'ア' => 'a', 'エ' => 'e', 'イ' => 'i', 'オ' => 'o', 'ウ' => 'u', 'ン' => 'n', + 'ハ' => 'ha', 'ヘ' => 'he', 'ヒ' => 'hi', 'ホ' => 'ho', 'フ' => 'fu', + 'バ' => 'ba', 'ベ' => 'be', 'ビ' => 'bi', 'ボ' => 'bo', 'ブ' => 'bu', + 'パ' => 'pa', 'ペ' => 'pe', 'ピ' => 'pi', 'ポ' => 'po', 'プ' => 'pu', + 'ケ' => 'ke', 'キ' => 'ki', 'コ' => 'ko', 'ク' => 'ku', 'カ' => 'ka', + 'ガ' => 'ga', 'ゲ' => 'ge', 'ギ' => 'gi', 'ゴ' => 'go', 'グ' => 'gu', + 'マ' => 'ma', 'メ' => 'me', 'ミ' => 'mi', 'モ' => 'mo', 'ム' => 'mu', + 'ナ' => 'na', 'ネ' => 'ne', 'ニ' => 'ni', 'ノ' => 'no', 'ヌ' => 'nu', + 'ラ' => 'ra', 'レ' => 're', 'リ' => 'ri', 'ロ' => 'ro', 'ル' => 'ru', + 'サ' => 'sa', 'セ' => 'se', 'シ' => 'shi', 'ソ' => 'so', 'ス' => 'su', + 'ザ' => 'za', 'ゼ' => 'ze', 'ジ' => 'ji', 'ゾ' => 'zo', 'ズ' => 'zu', + 'タ' => 'ta', 'テ' => 'te', 'チ' => 'chi', 'ト' => 'to', 'ツ' => 'tsu', + 'ダ' => 'da', 'デ' => 'de', 'ヂ' => 'di', 'ド' => 'do', 'ヅ' => 'du', + 'ワ' => 'wa', 'ヲ' => 'wo', + 'ヤ' => 'ya', 'ヨ' => 'yo', 'ユ' => 'yu', + 'ヵ' => 'ka', 'ヶ' => 'ke', + // old characters + 'ヱ' => 'we', 'ヰ' => 'wi', + // convert what's left (probably only kicks in when something's missing above) + 'ァ' => 'a', 'ェ' => 'e', 'ィ' => 'i', 'ォ' => 'o', 'ゥ' => 'u', + 'ャ' => 'ya', 'ョ' => 'yo', 'ュ' => 'yu', + // special characters + '・' => '_', '、' => '_', + 'ー' => '_', // when used with hiragana (seldom), this character would not be converted otherwise + // 'ラ'=>'la','レ'=>'le','リ'=>'li','ロ'=>'lo','ル'=>'lu', + // 'チャ'=>'cya','チェ'=>'cye','チィ'=>'cyi','チョ'=>'cyo','チュ'=>'cyu', + //'デャ'=>'dha','デェ'=>'dhe','ディ'=>'dhi','デョ'=>'dho','デュ'=>'dhu', + // 'リャ'=>'lya','リェ'=>'lye','リィ'=>'lyi','リョ'=>'lyo','リュ'=>'lyu', + // 'テャ'=>'tha','テェ'=>'the','ティ'=>'thi','テョ'=>'tho','テュ'=>'thu', + //'ファ'=>'fwa','フェ'=>'fwe','フィ'=>'fwi','フォ'=>'fwo','フゥ'=>'fwu', + //'チャ'=>'tya','チェ'=>'tye','チィ'=>'tyi','チョ'=>'tyo','チュ'=>'tyu', + // 'ジャ'=>'jya','ジェ'=>'jye','ジィ'=>'jyi','ジョ'=>'jyo','ジュ'=>'jyu', + // 'ジャ'=>'zha','ジェ'=>'zhe','ジィ'=>'zhi','ジョ'=>'zho','ジュ'=>'zhu', + //'ジャ'=>'zya','ジェ'=>'zye','ジィ'=>'zyi','ジョ'=>'zyo','ジュ'=>'zyu', + //'シャ'=>'sya','シェ'=>'sye','シィ'=>'syi','ショ'=>'syo','シュ'=>'syu', + //'シ'=>'ci','フ'=>'hu',シ'=>'si','チ'=>'ti','ツ'=>'tu','イ'=>'yi','ヂ'=>'dzi', + // "Greeklish" + 'Γ' => 'G', 'Δ' => 'E', 'Θ' => 'Th', 'Λ' => 'L', 'Ξ' => 'X', 'Π' => 'P', 'Σ' => 'S', 'Φ' => 'F', 'Ψ' => 'Ps', + 'γ' => 'g', 'δ' => 'e', 'θ' => 'th', 'λ' => 'l', 'ξ' => 'x', 'π' => 'p', 'σ' => 's', 'φ' => 'f', 'ψ' => 'ps', + // Thai + 'ก' => 'k', 'ข' => 'kh', 'ฃ' => 'kh', 'ค' => 'kh', 'ฅ' => 'kh', 'ฆ' => 'kh', 'ง' => 'ng', 'จ' => 'ch', + 'ฉ' => 'ch', 'ช' => 'ch', 'ซ' => 's', 'ฌ' => 'ch', 'ญ' => 'y', 'ฎ' => 'd', 'ฏ' => 't', 'ฐ' => 'th', + 'ฑ' => 'd', 'ฒ' => 'th', 'ณ' => 'n', 'ด' => 'd', 'ต' => 't', 'ถ' => 'th', 'ท' => 'th', 'ธ' => 'th', + 'น' => 'n', 'บ' => 'b', 'ป' => 'p', 'ผ' => 'ph', 'ฝ' => 'f', 'พ' => 'ph', 'ฟ' => 'f', 'ภ' => 'ph', + 'ม' => 'm', 'ย' => 'y', 'ร' => 'r', 'ฤ' => 'rue', 'ฤๅ' => 'rue', 'ล' => 'l', 'ฦ' => 'lue', + 'ฦๅ' => 'lue', 'ว' => 'w', 'ศ' => 's', 'ษ' => 's', 'ส' => 's', 'ห' => 'h', 'ฬ' => 'l', 'ฮ' => 'h', + 'ะ' => 'a', 'ั' => 'a', 'รร' => 'a', 'า' => 'a', 'ๅ' => 'a', 'ำ' => 'am', 'ํา' => 'am', + 'ิ' => 'i', 'ี' => 'i', 'ึ' => 'ue', 'ี' => 'ue', 'ุ' => 'u', 'ู' => 'u', + 'เ' => 'e', 'แ' => 'ae', 'โ' => 'o', 'อ' => 'o', + 'ียะ' => 'ia', 'ีย' => 'ia', 'ือะ' => 'uea', 'ือ' => 'uea', 'ัวะ' => 'ua', 'ัว' => 'ua', + 'ใ' => 'ai', 'ไ' => 'ai', 'ัย' => 'ai', 'าย' => 'ai', 'าว' => 'ao', + 'ุย' => 'ui', 'อย' => 'oi', 'ือย' => 'ueai', 'วย' => 'uai', + 'ิว' => 'io', '็ว' => 'eo', 'ียว' => 'iao', + '่' => '', '้' => '', '๊' => '', '๋' => '', '็' => '', + '์' => '', '๎' => '', 'ํ' => '', 'ฺ' => '', + 'ๆ' => '2', '๏' => 'o', 'ฯ' => '-', '๚' => '-', '๛' => '-', + '๐' => '0', '๑' => '1', '๒' => '2', '๓' => '3', '๔' => '4', + '๕' => '5', '๖' => '6', '๗' => '7', '๘' => '8', '๙' => '9', + // Korean + 'ㄱ' => 'k', 'ㅋ' => 'kh', 'ㄲ' => 'kk', 'ㄷ' => 't', 'ㅌ' => 'th', 'ㄸ' => 'tt', 'ㅂ' => 'p', + 'ㅍ' => 'ph', 'ㅃ' => 'pp', 'ㅈ' => 'c', 'ㅊ' => 'ch', 'ㅉ' => 'cc', 'ㅅ' => 's', 'ㅆ' => 'ss', + 'ㅎ' => 'h', 'ㅇ' => 'ng', 'ㄴ' => 'n', 'ㄹ' => 'l', 'ㅁ' => 'm', 'ㅏ' => 'a', 'ㅓ' => 'e', 'ㅗ' => 'o', + 'ㅜ' => 'wu', 'ㅡ' => 'u', 'ㅣ' => 'i', 'ㅐ' => 'ay', 'ㅔ' => 'ey', 'ㅚ' => 'oy', 'ㅘ' => 'wa', 'ㅝ' => 'we', + 'ㅟ' => 'wi', 'ㅙ' => 'way', 'ㅞ' => 'wey', 'ㅢ' => 'uy', 'ㅑ' => 'ya', 'ㅕ' => 'ye', 'ㅛ' => 'oy', + 'ㅠ' => 'yu', 'ㅒ' => 'yay', 'ㅖ' => 'yey', + ); \ No newline at end of file diff --git a/wolf/app/models/Page.php b/wolf/app/models/Page.php index 26819a50..34723406 100755 --- a/wolf/app/models/Page.php +++ b/wolf/app/models/Page.php @@ -40,12 +40,10 @@ class Page extends Node { public $id; public $title = ''; - public $slug = ''; public $breadcrumb; public $keywords = ''; public $description = ''; public $content; - public $parent_id; public $layout_id; public $behavior_id; public $status_id; @@ -64,22 +62,7 @@ class Page extends Node { public $updater; public $updater_id; // non db fields - private $parent = false; - private $uri = false; - private $level = false; - private $tags = false; - - public function __construct($object=null, $parent=null) { - if ($parent !== null) { - $this->parent = $parent; - } - - if ($object !== null) { - foreach ($object as $key => $value) { - $this->$key = $value; - } - } - } + protected $tags = false; public function id() { @@ -112,64 +95,6 @@ public function keywords() { } - public function parentId() { - return $this->parent_id; - } - - - /** - * Returns the current page object's url. - * - * Usage: url(); ?> or url(); ?> - * - * @return string The url of the page object. - */ - public function url($suffix=false) { - if ($suffix === false) { - return BASE_URL.$this->uri(); - } - else { - return BASE_URL.$this->uri().($this->uri() != '' ? URL_SUFFIX : ''); - } - } - - - /** - * Allows user to get the url of a page by page ID. - * - * This function will always produce a correct and current url to the page - * despite it possibly having moved from its original position in the page - * hierarchy. - * - * Usage: - * - * @param int $id The id of the page to link to. - * @return mixed Full url of page or error message. - */ - public static function urlById($id) { - if (!is_numeric($id) || !is_int($id) || $id <= 0) { - return '[urlById: id NAN or id <= 0]'; - } - - $page = self::findById($id); - - if (!$page) - return '[urlById: no page with that id]'; - - return $page->url(); - } - - - public function slug() { - return $this->slug; - } - - - public function breadcrumb() { - return $this->breadcrumb; - } - - public function updater() { return $this->updater; } @@ -180,43 +105,6 @@ public function updaterId() { } - /** - * Returns a set of breadcrumbs as html. - * - * @param string $separator The separator between crumbs. Defaults to > - * @return string The breadcrumbs as an html snippet. - */ - public function breadcrumbs($separator='>') { - $out = ''; - $url = ''; - $path = ''; - $paths = explode('/', '/'.$this->slug); - $nb_path = count($paths); - - if ($this->parent() !== false) - $out .= $this->parent()->_inversedBreadcrumbs($separator); - - return $out.''.$this->breadcrumb().''; - } - - - /** - * - * @todo Finish _inversedBreadcrumbs PHPDoc - * - * @param type $separator - * @return string - */ - private function _inversedBreadcrumbs($separator) { - $out = ''.$this->breadcrumb.''.$separator.''; - - if ($this->parent() !== false) - return $this->parent()->_inversedBreadcrumbs($separator).$out; - - return $out; - } - - /** * Returns the subjective "previous" Page. * @@ -225,10 +113,10 @@ private function _inversedBreadcrumbs($separator) { public function previous() { if ($this->parent() !== false) { return $this->parent()->children(array( - 'limit' => 1, - 'where' => 'page.position < '.$this->position.' AND page.id < '.$this->id, - 'order' => 'page.position DESC' - )); + 'limit' => 1, + 'where' => 'page.position < '.$this->position.' AND page.id < '.$this->id, + 'order' => 'page.position DESC' + )); } return false; @@ -243,86 +131,16 @@ public function previous() { public function next() { if ($this->parent() !== false) { return $this->parent()->children(array( - 'limit' => 1, - 'where' => 'page.position > '.$this->position.' AND page.id > '.$this->id, - 'order' => 'page.position ASC' - )); + 'limit' => 1, + 'where' => 'page.position > '.$this->position.' AND page.id > '.$this->id, + 'order' => 'page.position ASC' + )); } return false; } - /** - * Counts the number of children belonging to a Page. - * - * @fixme Remove dependency on CMS_CONN - not good - * - * @param type $args - * @param type $value - * @param type $include_hidden - * @return int The number of children counted. - */ - public function childrenCount($args=null, $value=array(), $include_hidden=false) { - global $__CMS_CONN__; - - // Collect attributes... - $where = isset($args['where']) ? $args['where'] : ''; - $order = isset($args['order']) ? $args['order'] : 'position, id'; - $limit = isset($args['limit']) ? $args['limit'] : 0; - $offset = isset($args['offset']) ? $args['offset'] : 0; - - // Prepare query parts - $where_string = trim($where) == '' ? '' : "AND ".$where; - $limit_string = $limit > 0 ? "LIMIT $limit" : ''; - $offset_string = $offset > 0 ? "OFFSET $offset" : ''; - - // Prepare SQL - $sql = 'SELECT COUNT(*) AS nb_rows FROM '.TABLE_PREFIX.'page ' - .'WHERE parent_id = '.$this->id - ." AND (valid_until IS NULL OR CAST('".date('Y-m-d H:i:s')."' AS DATETIME) < valid_until)" - .' AND (status_id='.Page::STATUS_PUBLISHED - .($include_hidden ? ' OR status_id='.Page::STATUS_HIDDEN : '').') ' - ."$where_string ORDER BY $order $limit_string $offset_string"; - - $stmt = $__CMS_CONN__->prepare($sql); - $stmt->execute($value); - - return (int) $stmt->fetchColumn(); - } - - - /** - * Returns the Page object's parent. - * - * The option $level parameter allows the user to specify the level on - * which the found Page object should be. - * - * @param int $level Optional level parameter - * @return Page The object's parent. - */ - public function parent($level=null) { - - // check to see if it's already been retrieved, if not get the parent! - if ($this->parent === false && $this->parent_id != 0) { - $this->parent = self::findById($this->parentId()); - } - - if ($level === null) - return $this->parent; - - if ($level > $this->level) - return false; - else if ($this->level == $level) - return $this; - else - return $this->parent($level); - } - - - public function executionTime() { - return execution_time(); - } /** @@ -518,53 +336,6 @@ public function partExists($part, $inherit=false) { return false; } - - /** - * Return an HTML anchor element for this page. - * - * @param string $label A custom label. Defaults to page title. - * @param array $options Array containing attributes to add. - * @return string The actual anchor element. - */ - public function link($label=null, $options='') { - if ($label == null) - $label = $this->title(); - - return sprintf('%s', $this->url(), $options, $label - ); - } - - - /** - * Allow user to link to a page by ID. - * - * This function will always produce a correct and current link to the page - * despite it possibly having moved from its original position in the page - * hierarchy. - * - * Usage: - * - * @param int $id The id of the page to link to. - * @param string $label The label or title of the link. - * @param string $options Any other HTML options you want to use. - * @return string XHTML compliant link code or error message. - */ - public static function linkById($id, $label=null, $options='') { - if (!is_numeric($id) || !is_int($id) || $id <= 0) { - return '[linkById: id NAN or id <= 0]'; - } - - $page = self::findById($id); - - if ($label == null) { - $label = $page->title(); - } - - return sprintf('%s', $page->url(), $options, $label - ); - } - - /** * Return an array of this page's children. * @@ -753,33 +524,6 @@ public function beforeDelete() { } - /** - * Returns the uri for this node. - * - * Note: The uri does not start nor end with a '/'. - * - * @return string The node's full uri. - */ - public function uri() { - if ($this->uri === false) { - if ($this->parent() !== false) - $this->uri = trim($this->parent()->uri().'/'.$this->slug, '/'); - else - $this->uri = trim($this->slug, '/'); - } - - return $this->uri; - } - - - /** - * @deprecated - * @see uri() - */ - public function getUri() { - return $this->uri(); - } - public function setTags($tags) { if (is_string($tags)) @@ -896,7 +640,7 @@ public static function findByUri($uri, $all = false) { $parent = $page; } // foreach - + return $page; } @@ -1028,9 +772,9 @@ public static function findAll($args = null) { public static function findById($id) { return self::find(array( - 'where' => 'page.id='.(int) $id, - 'limit' => 1 - )); + 'where' => 'page.id='.(int) $id, + 'limit' => 1 + )); } From 4535f045b4baab3b1944ef9a20f9c279a51a5419 Mon Sep 17 00:00:00 2001 From: Marek Murawski Date: Tue, 24 Jul 2012 16:40:29 +0300 Subject: [PATCH 4/5] Changing $name to $oname variable in foreach loop of $options Assigning $options array conflicts with method's $name, so when you pass $options=array('foo'=>'bar') to method, you'll end up with instead of the $name passed as the first argument of method. --- wolf/helpers/Form.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wolf/helpers/Form.php b/wolf/helpers/Form.php index 7a532658..94e177ec 100644 --- a/wolf/helpers/Form.php +++ b/wolf/helpers/Form.php @@ -88,8 +88,8 @@ public static function input($name, $id=false, $type='text', $label=false, $plac $lbl = ''; } - foreach ($options as $name => $value) { - $opt = $opt.' '.$name.'="'.$value.'"'; + foreach ($options as $oname => $value) { + $opt = $opt.' '.$oname.'="'.$value.'"'; } return $lbl.''; From ef7c92fcd603cc49350b545a4e721c5888aad310 Mon Sep 17 00:00:00 2001 From: Marek Murawski Date: Tue, 24 Jul 2012 16:47:01 +0300 Subject: [PATCH 5/5] Assigning $options array conflicts with method's $name, so when you pass for example $options=array('foo'=>'bar') to Input's last argument, you'll end up with instead of the $name passed as the first argument of method. --- wolf/helpers/Form.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/wolf/helpers/Form.php b/wolf/helpers/Form.php index 94e177ec..f01820b3 100644 --- a/wolf/helpers/Form.php +++ b/wolf/helpers/Form.php @@ -88,8 +88,8 @@ public static function input($name, $id=false, $type='text', $label=false, $plac $lbl = ''; } - foreach ($options as $oname => $value) { - $opt = $opt.' '.$oname.'="'.$value.'"'; + foreach ($options as $oname => $ovalue) { + $opt = $opt.' '.$oname.'="'.$ovalue.'"'; } return $lbl.''; @@ -141,8 +141,8 @@ public static function textarea($name, $id=false, $rows=5, $value=false, $label= $lbl = ''; } - foreach ($options as $name => $value) { - $opt = $opt.' '.$name.'="'.$value.'"'; + foreach ($options as $oname => $ovalue) { + $opt = $opt.' '.$oname.'="'.$ovalue.'"'; } return $lbl.''; @@ -170,8 +170,8 @@ public static function radio($name, $values=array(), $required=false, $focus=fal $ret = ''; $opt = ''; - foreach ($options as $name => $value) { - $opt = $opt.' '.$name.'="'.$value.'"'; + foreach ($options as $oname => $ovalue) { + $opt = $opt.' '.$oname.'="'.$ovalue.'"'; } foreach ($values as $label => $value) { @@ -204,8 +204,8 @@ public static function box($name, $values=array(), $required=false, $focus=false $ret = ''; $opt = ''; - foreach ($options as $name => $value) { - $opt = $opt.' '.$name.'="'.$value.'"'; + foreach ($options as $oname => $ovalue) { + $opt = $opt.' '.$oname.'="'.$ovalue.'"'; } foreach ($values as $label => $value) { @@ -241,8 +241,8 @@ public static function dropdown($name, $values=array(), $multiple=false, $select $multiple = ($multiple !== false) ? ' multiple="multiple"' : ''; $size = ' size="'.$size.'"'; $opt = ''; - foreach ($options as $name => $value) { - $opt = $opt.' '.$name.'="'.$value.'"'; + foreach ($options as $oname => $ovalue) { + $opt = $opt.' '.$oname.'="'.$ovalue.'"'; } $ret = '