r106460 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r106459‎ | r106460 | r106461 >
Date:18:54, 16 December 2011
Author:ialex
Status:ok
Tags:
Comment:
svn:eol-style native
Modified paths:
  • /trunk/extensions/EducationProgram/specials/SpecialEPFormPage.php (modified) (history)
  • /trunk/extensions/EducationProgram/specials/SpecialEditInstitution.php (modified) (history)
  • /trunk/extensions/MobileFrontend/ApplicationTemplate.php (modified) (history)
  • /trunk/extensions/MobileFrontend/ApplicationWmlTemplate.php (modified) (history)
  • /trunk/extensions/MobileFrontend/DisableTemplate.php (modified) (history)
  • /trunk/extensions/MobileFrontend/FooterTemplate.php (modified) (history)
  • /trunk/extensions/MobileFrontend/LeaveFeedbackTemplate.php (modified) (history)
  • /trunk/extensions/MobileFrontend/MobileFrontendTemplate.php (modified) (history)
  • /trunk/extensions/MobileFrontend/OptInTemplate.php (modified) (history)
  • /trunk/extensions/MobileFrontend/OptOutTemplate.php (modified) (history)
  • /trunk/extensions/MobileFrontend/SearchTemplate.php (modified) (history)
  • /trunk/extensions/MobileFrontend/ThanksNoticeTemplate.php (modified) (history)
  • /trunk/extensions/MobileFrontend/javascripts/filepage.js (modified) (history)
  • /trunk/extensions/MobileFrontend/stylesheets/filepage.css (modified) (history)
  • /trunk/extensions/MoodBar/include/MoodBarHTMLEmailNotification.php (modified) (history)
  • /trunk/extensions/MoodBar/include/MoodBarHTMLMailerJob.php (modified) (history)
  • /trunk/extensions/NoBogusUserpages/NoBogusUserpages.i18n.php (modified) (history)
  • /trunk/extensions/NoBogusUserpages/NoBogusUserpages.php (modified) (history)
  • /trunk/extensions/SelectionSifter/SelectionSifter.alias.php (modified) (history)
  • /trunk/extensions/SelectionSifter/SelectionSifter.i18n.php (modified) (history)
  • /trunk/extensions/SolrStore/SolrConnector.i18n.php (modified) (history)
  • /trunk/extensions/SolrStore/SolrConnector.php (modified) (history)
  • /trunk/extensions/SolrStore/SolrConnectorStore.php (modified) (history)
  • /trunk/extensions/SolrStore/SolrDoc.php (modified) (history)
  • /trunk/extensions/SolrStore/SolrSearch.php (modified) (history)
  • /trunk/extensions/SolrStore/SolrSearchFieldSet.php (modified) (history)
  • /trunk/extensions/SolrStore/SolrTalker.php (modified) (history)
  • /trunk/extensions/SolrStore/SpecialSolrSearch.php (modified) (history)
  • /trunk/extensions/SolrStore/doc/install-solr (modified) (history)
  • /trunk/extensions/SolrStore/doc/install-solr-ger (modified) (history)
  • /trunk/extensions/SolrStore/solr-example/README.txt (modified) (history)
  • /trunk/extensions/SolrStore/solr-example/core0/conf/mapping-FoldToASCII.txt (modified) (history)
  • /trunk/extensions/SolrStore/solr-example/core0/conf/mapping-ISOLatin1Accent.txt (modified) (history)
  • /trunk/extensions/SolrStore/solr-example/core0/conf/protwords.txt (modified) (history)
  • /trunk/extensions/SolrStore/solr-example/core0/conf/schema.xml (modified) (history)
  • /trunk/extensions/SolrStore/solr-example/core0/conf/solrconfig.xml (modified) (history)
  • /trunk/extensions/SolrStore/solr-example/core0/conf/spellings.txt (modified) (history)
  • /trunk/extensions/SolrStore/solr-example/core0/conf/stopwords.txt (modified) (history)
  • /trunk/extensions/SolrStore/solr-example/core0/conf/stopwords_en.txt (modified) (history)
  • /trunk/extensions/SolrStore/solr-example/core0/conf/synonyms.txt (modified) (history)
  • /trunk/extensions/SolrStore/solr-example/core1/conf/schema.xml (modified) (history)
  • /trunk/extensions/SolrStore/solr-example/core1/conf/solrconfig.xml (modified) (history)
  • /trunk/extensions/SolrStore/solr-example/solr.xml (modified) (history)
  • /trunk/extensions/WikiObjectModel/includes/models/WOM_OM_NestProperty.php (modified) (history)
  • /trunk/extensions/WikiObjectModel/includes/models/WOM_OM_NestPropertyValue.php (modified) (history)
  • /trunk/extensions/WikiObjectModel/includes/models/WOM_OM_QueryPrintout.php (modified) (history)
  • /trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Querystring.php (modified) (history)
  • /trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyValueParser.php (modified) (history)
  • /trunk/extensions/skins/Synagonism/skins/synagonism/csshover.htc (modified) (history)
  • /trunk/extensions/skins/Synagonism/skins/synagonism/csshover.min.htc (modified) (history)
  • /trunk/phase3/maintenance/dev/includes/php.sh (modified) (history)
  • /trunk/phase3/maintenance/dev/includes/require-php.sh (modified) (history)
  • /trunk/phase3/resources/mediawiki/mediawiki.jqueryMsg.peg (modified) (history)

Diff [purge]

Property changes on: trunk/phase3/maintenance/dev/includes/php.sh
___________________________________________________________________
Added: svn:eol-style
11 + native
Property changes on: trunk/phase3/maintenance/dev/includes/require-php.sh
___________________________________________________________________
Added: svn:eol-style
22 + native
Property changes on: trunk/phase3/resources/mediawiki/mediawiki.jqueryMsg.peg
___________________________________________________________________
Added: svn:eol-style
33 + native
Property changes on: trunk/extensions/NoBogusUserpages/NoBogusUserpages.i18n.php
___________________________________________________________________
Added: svn:eol-style
44 + native
Property changes on: trunk/extensions/NoBogusUserpages/NoBogusUserpages.php
___________________________________________________________________
Added: svn:eol-style
55 + native
Index: trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyValueParser.php
@@ -1,36 +1,36 @@
2 -<?php
3 -/**
4 - * @author Ning
5 - *
6 - * @file
7 - * @ingroup WikiObjectModels
8 - */
9 -
10 -class WOMPropertyValueParser extends WikiObjectModelParser {
11 -
12 - public function __construct() {
13 - parent::__construct();
14 - $this->m_parserId = WOM_PARSER_ID_PROPERTY_VALUE;
15 - }
16 -
17 - public function parseNext( $text, WikiObjectModelCollection $parentObj, $offset = 0 ) {
18 - if ( !( $parentObj instanceof WOMNestPropertyModel ) )
19 - return null;
20 -
21 - return array( 'len' => 0, 'obj' => new WOMNestPropertyValueModel() );
22 - }
23 -
24 - public function isObjectClosed( $obj, $text, $offset ) {
25 - if ( !( $obj instanceof WOMNestPropertyValueModel ) )
26 - return false;
27 -
28 - if ( ( strlen( $text ) >= $offset + 1 ) && $text { $offset } == '|' ) {
29 - return 1;
30 - }
31 - $parentClose = WOMProcessor::getObjectParser( $obj->getParent() )
32 - ->isObjectClosed( $obj->getParent(), $text, $offset );
33 - if ( $parentClose !== false ) return 0;
34 -
35 - return false;
36 - }
37 -}
 2+<?php
 3+/**
 4+ * @author Ning
 5+ *
 6+ * @file
 7+ * @ingroup WikiObjectModels
 8+ */
 9+
 10+class WOMPropertyValueParser extends WikiObjectModelParser {
 11+
 12+ public function __construct() {
 13+ parent::__construct();
 14+ $this->m_parserId = WOM_PARSER_ID_PROPERTY_VALUE;
 15+ }
 16+
 17+ public function parseNext( $text, WikiObjectModelCollection $parentObj, $offset = 0 ) {
 18+ if ( !( $parentObj instanceof WOMNestPropertyModel ) )
 19+ return null;
 20+
 21+ return array( 'len' => 0, 'obj' => new WOMNestPropertyValueModel() );
 22+ }
 23+
 24+ public function isObjectClosed( $obj, $text, $offset ) {
 25+ if ( !( $obj instanceof WOMNestPropertyValueModel ) )
 26+ return false;
 27+
 28+ if ( ( strlen( $text ) >= $offset + 1 ) && $text { $offset } == '|' ) {
 29+ return 1;
 30+ }
 31+ $parentClose = WOMProcessor::getObjectParser( $obj->getParent() )
 32+ ->isObjectClosed( $obj->getParent(), $text, $offset );
 33+ if ( $parentClose !== false ) return 0;
 34+
 35+ return false;
 36+ }
 37+}
Property changes on: trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyValueParser.php
___________________________________________________________________
Added: svn:eol-style
3838 + native
Index: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_NestProperty.php
@@ -1,66 +1,66 @@
2 -<?php
3 -/**
4 - * This model implements Property models.
5 - *
6 - * @author Ning
7 - * @file
8 - * @ingroup WikiObjectModels
9 - *
10 - */
11 -
12 -class WOMNestPropertyModel extends WikiObjectModelCollection {
13 - protected $m_property; // name
14 - protected $m_user_property; // name
15 -
16 - public function __construct( $property ) {
17 - parent::__construct( WOM_TYPE_NESTPROPERTY );
18 -
19 - if ( !defined( 'SMW_VERSION' ) ) {
20 - // MW hook will catch this exception
21 - throw new MWException( __METHOD__ . ": Property model is invalid. Please install 'SemanticMediaWiki extension' first." );
22 - }
23 -
24 - $user_property = SMWPropertyValue::makeUserProperty( $property );
25 - if ( count ( $user_property->getErrors() ) > 0 ) {
26 - $user_property = SMWPropertyValue::makeUserProperty( '///NA///' );
27 - } else {
28 - $property = '';
29 - }
30 -
31 - $this->m_user_property = $user_property;
32 - $this->m_property = $property;
33 - }
34 -
35 - public function getProperty() {
36 - return $this->m_user_property;
37 - }
38 -
39 - public function setProperty( $property ) {
40 - $this->m_user_property = $property;
41 - }
42 -
43 - public function getPropertyName() {
44 - return ( $this->m_property ) ? $this->m_property : $this->m_user_property->getWikiValue();
45 - }
46 -
47 - public function getWikiText() {
48 - return "[[{$this->getPropertyName()}::{$this->getValueText()}]]";
49 - }
50 -
51 - public function getValueText() {
52 - return parent::getWikiText();
53 - }
54 -
55 - public function setXMLAttribute( $key, $value ) {
56 - if ( $value == '' ) throw new MWException( __METHOD__ . ": value cannot be empty" );
57 -
58 - if ( $key == 'name' ) {
59 - $property = SMWPropertyValue::makeUserProperty( $value );
60 - } else {
61 - throw new MWException( __METHOD__ . ": invalid key/value pair: name=property_name" );
62 - }
63 - }
64 - protected function getXMLAttributes() {
65 - return 'name="' . self::xml_entities( $this->getPropertyName() ) . '"';
66 - }
67 -}
 2+<?php
 3+/**
 4+ * This model implements Property models.
 5+ *
 6+ * @author Ning
 7+ * @file
 8+ * @ingroup WikiObjectModels
 9+ *
 10+ */
 11+
 12+class WOMNestPropertyModel extends WikiObjectModelCollection {
 13+ protected $m_property; // name
 14+ protected $m_user_property; // name
 15+
 16+ public function __construct( $property ) {
 17+ parent::__construct( WOM_TYPE_NESTPROPERTY );
 18+
 19+ if ( !defined( 'SMW_VERSION' ) ) {
 20+ // MW hook will catch this exception
 21+ throw new MWException( __METHOD__ . ": Property model is invalid. Please install 'SemanticMediaWiki extension' first." );
 22+ }
 23+
 24+ $user_property = SMWPropertyValue::makeUserProperty( $property );
 25+ if ( count ( $user_property->getErrors() ) > 0 ) {
 26+ $user_property = SMWPropertyValue::makeUserProperty( '///NA///' );
 27+ } else {
 28+ $property = '';
 29+ }
 30+
 31+ $this->m_user_property = $user_property;
 32+ $this->m_property = $property;
 33+ }
 34+
 35+ public function getProperty() {
 36+ return $this->m_user_property;
 37+ }
 38+
 39+ public function setProperty( $property ) {
 40+ $this->m_user_property = $property;
 41+ }
 42+
 43+ public function getPropertyName() {
 44+ return ( $this->m_property ) ? $this->m_property : $this->m_user_property->getWikiValue();
 45+ }
 46+
 47+ public function getWikiText() {
 48+ return "[[{$this->getPropertyName()}::{$this->getValueText()}]]";
 49+ }
 50+
 51+ public function getValueText() {
 52+ return parent::getWikiText();
 53+ }
 54+
 55+ public function setXMLAttribute( $key, $value ) {
 56+ if ( $value == '' ) throw new MWException( __METHOD__ . ": value cannot be empty" );
 57+
 58+ if ( $key == 'name' ) {
 59+ $property = SMWPropertyValue::makeUserProperty( $value );
 60+ } else {
 61+ throw new MWException( __METHOD__ . ": invalid key/value pair: name=property_name" );
 62+ }
 63+ }
 64+ protected function getXMLAttributes() {
 65+ return 'name="' . self::xml_entities( $this->getPropertyName() ) . '"';
 66+ }
 67+}
Property changes on: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_NestProperty.php
___________________________________________________________________
Added: svn:eol-style
6868 + native
Index: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Querystring.php
@@ -1,29 +1,29 @@
2 -<?php
3 -/**
4 - * This model implements key value models.
5 - *
6 - * @author Ning
7 - * @file
8 - * @ingroup WikiObjectModels
9 - *
10 - */
11 -
12 -class WOMQuerystringModel extends WikiObjectModelCollection {
13 -
14 - public function __construct() {
15 - parent::__construct( WOM_TYPE_QUERYSTRING );
16 - }
17 -
18 - public function setXMLAttribute( $key, $value ) {
19 - throw new MWException( __METHOD__ . ": no key/value pair required" );
20 - }
21 -
22 - public function getWikiText() {
23 - return $this->getValueText() .
24 - '|';
25 - }
26 -
27 - public function getValueText() {
28 - return parent::getWikiText();
29 - }
30 -}
 2+<?php
 3+/**
 4+ * This model implements key value models.
 5+ *
 6+ * @author Ning
 7+ * @file
 8+ * @ingroup WikiObjectModels
 9+ *
 10+ */
 11+
 12+class WOMQuerystringModel extends WikiObjectModelCollection {
 13+
 14+ public function __construct() {
 15+ parent::__construct( WOM_TYPE_QUERYSTRING );
 16+ }
 17+
 18+ public function setXMLAttribute( $key, $value ) {
 19+ throw new MWException( __METHOD__ . ": no key/value pair required" );
 20+ }
 21+
 22+ public function getWikiText() {
 23+ return $this->getValueText() .
 24+ '|';
 25+ }
 26+
 27+ public function getValueText() {
 28+ return parent::getWikiText();
 29+ }
 30+}
Property changes on: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Querystring.php
___________________________________________________________________
Added: svn:eol-style
3131 + native
Index: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_QueryPrintout.php
@@ -1,62 +1,62 @@
2 -<?php
3 -/**
4 - * This model implements query printout models.
5 - *
6 - * @author Ning
7 - * @file
8 - * @ingroup WikiObjectModels
9 - *
10 - */
11 -
12 -class WOMQueryPrintoutModel extends WikiObjectModel {
13 - protected $m_property;
14 - protected $m_label;
15 - protected $m_aggregation;
16 -
17 - public function __construct( $property, $label = '', $aggregation = '' ) {
18 - parent::__construct( WOM_TYPE_QUERYPRINTOUT );
19 - $this->m_property = $property;
20 - $this->m_label = $label;
21 -
22 - $this->m_aggregation = ( defined( 'SMW_AGGREGATION_VERSION' ) ? $aggregation : '' );
23 - }
24 -
25 - public function getProperty() {
26 - return $this->m_property;
27 - }
28 -
29 - public function getLabel() {
30 - return $this->m_label;
31 - }
32 -
33 - public function getAggregation() {
34 - return $this->m_aggregation;
35 - }
36 -
37 - public function getWikiText() {
38 - return '?' . $this->m_property .
39 - ( $this->m_aggregation == '' ? "" : ( '>' . $this->m_aggregation ) ) .
40 - ( $this->m_label == '' ? "" : ( '=' . $this->m_label ) ) . '|';
41 - }
42 -
43 - public function setXMLAttribute( $key, $value ) {
44 - if ( $value == '' ) throw new MWException( __METHOD__ . ": value cannot be empty" );
45 -
46 - if ( $key == 'property' ) {
47 - $this->m_property = $value;
48 - } elseif ( $key == 'label' ) {
49 - $this->m_label = $value;
50 - } elseif ( defined( 'SMW_AGGREGATION_VERSION' ) && $key == 'aggregation' ) {
51 - $this->m_aggregation = $value;
52 - } else {
53 - throw new MWException( __METHOD__ . ": invalid key/value pair: property=property name, label=query label" .
54 - ( defined( 'SMW_AGGREGATION_VERSION' ) ? ", aggregation=agg_type" : "" ) );
55 - }
56 - }
57 -
58 - protected function getXMLAttributes() {
59 - return 'property="' . self::xml_entities( $this->m_property ) . '"' .
60 - ( $this->m_aggregation == '' ? "" : ( ' aggregation="' . self::xml_entities( $this->m_aggregation ) . '"' ) ) .
61 - ( $this->m_label == '' ? "" : ( ' label="' . self::xml_entities( $this->m_label ) . '"' ) );
62 - }
63 -}
 2+<?php
 3+/**
 4+ * This model implements query printout models.
 5+ *
 6+ * @author Ning
 7+ * @file
 8+ * @ingroup WikiObjectModels
 9+ *
 10+ */
 11+
 12+class WOMQueryPrintoutModel extends WikiObjectModel {
 13+ protected $m_property;
 14+ protected $m_label;
 15+ protected $m_aggregation;
 16+
 17+ public function __construct( $property, $label = '', $aggregation = '' ) {
 18+ parent::__construct( WOM_TYPE_QUERYPRINTOUT );
 19+ $this->m_property = $property;
 20+ $this->m_label = $label;
 21+
 22+ $this->m_aggregation = ( defined( 'SMW_AGGREGATION_VERSION' ) ? $aggregation : '' );
 23+ }
 24+
 25+ public function getProperty() {
 26+ return $this->m_property;
 27+ }
 28+
 29+ public function getLabel() {
 30+ return $this->m_label;
 31+ }
 32+
 33+ public function getAggregation() {
 34+ return $this->m_aggregation;
 35+ }
 36+
 37+ public function getWikiText() {
 38+ return '?' . $this->m_property .
 39+ ( $this->m_aggregation == '' ? "" : ( '>' . $this->m_aggregation ) ) .
 40+ ( $this->m_label == '' ? "" : ( '=' . $this->m_label ) ) . '|';
 41+ }
 42+
 43+ public function setXMLAttribute( $key, $value ) {
 44+ if ( $value == '' ) throw new MWException( __METHOD__ . ": value cannot be empty" );
 45+
 46+ if ( $key == 'property' ) {
 47+ $this->m_property = $value;
 48+ } elseif ( $key == 'label' ) {
 49+ $this->m_label = $value;
 50+ } elseif ( defined( 'SMW_AGGREGATION_VERSION' ) && $key == 'aggregation' ) {
 51+ $this->m_aggregation = $value;
 52+ } else {
 53+ throw new MWException( __METHOD__ . ": invalid key/value pair: property=property name, label=query label" .
 54+ ( defined( 'SMW_AGGREGATION_VERSION' ) ? ", aggregation=agg_type" : "" ) );
 55+ }
 56+ }
 57+
 58+ protected function getXMLAttributes() {
 59+ return 'property="' . self::xml_entities( $this->m_property ) . '"' .
 60+ ( $this->m_aggregation == '' ? "" : ( ' aggregation="' . self::xml_entities( $this->m_aggregation ) . '"' ) ) .
 61+ ( $this->m_label == '' ? "" : ( ' label="' . self::xml_entities( $this->m_label ) . '"' ) );
 62+ }
 63+}
Property changes on: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_QueryPrintout.php
___________________________________________________________________
Added: svn:eol-style
6464 + native
Index: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_NestPropertyValue.php
@@ -1,20 +1,20 @@
2 -<?php
3 -/**
4 - * This model implements Parameter / Template_field value models.
5 - *
6 - * @author Ning
7 - * @file
8 - * @ingroup WikiObjectModels
9 - *
10 - */
11 -
12 -class WOMNestPropertyValueModel extends WikiObjectModelCollection {
13 -
14 - public function __construct() {
15 - parent::__construct( WOM_TYPE_NESTPROPERTYVAL );
16 - }
17 -
18 - public function setXMLAttribute( $key, $value ) {
19 - throw new MWException( __METHOD__ . ": no key/value pair required" );
20 - }
21 -}
 2+<?php
 3+/**
 4+ * This model implements Parameter / Template_field value models.
 5+ *
 6+ * @author Ning
 7+ * @file
 8+ * @ingroup WikiObjectModels
 9+ *
 10+ */
 11+
 12+class WOMNestPropertyValueModel extends WikiObjectModelCollection {
 13+
 14+ public function __construct() {
 15+ parent::__construct( WOM_TYPE_NESTPROPERTYVAL );
 16+ }
 17+
 18+ public function setXMLAttribute( $key, $value ) {
 19+ throw new MWException( __METHOD__ . ": no key/value pair required" );
 20+ }
 21+}
Property changes on: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_NestPropertyValue.php
___________________________________________________________________
Added: svn:eol-style
2222 + native
Index: trunk/extensions/SolrStore/SolrConnector.php
@@ -1,96 +1,96 @@
2 -<?php
3 -
4 -/**
5 - * A terminology markup extension with a Semantic MediaWiki backend
6 - *
7 - * @defgroup SolrStore
8 - * @author Stephan Gambke, Simon Bachenberg
9 - * @version 0.5 Beta
10 - */
11 -
12 -/**
13 - * The main file of the SolrConnector extension
14 - *
15 - * @file
16 - * @ingroup SolrStore
17 - */
18 -
19 -
20 -if ( !defined( 'MEDIAWIKI' ) ) {
21 - die( 'This file is part of a MediaWiki extension, it is not a valid entry point.' );
22 -}
23 -
24 -if ( !defined( 'SMW_VERSION' ) ) {
25 - die( 'SolrConnector depends on the Semantic MediaWiki extension. You need to install Semantic MediaWiki first.' );
26 -}
27 -
28 -/**
29 - * The Solr Connector version
30 - */
31 -define( 'SC_VERSION', '0.5 Beta' );
32 -
33 -// register the extension
34 -//TODO: Add other authors here and in the file header
35 -$wgExtensionCredits[defined( 'SEMANTIC_EXTENSION_TYPE' ) ? 'semantic' : 'other'][] = array(
36 - 'path' => __FILE__,
37 - 'name' => 'SolrStore',
38 - 'author' => array( '[http://www.mediawiki.org/wiki/User:F.trott Stephan Gambke]', '[http://www.mediawiki.org/wiki/User:SBachenberg Simon Bachenberg]', 'Sascha Schüller' ),
39 - 'url' => 'http://www.mediawiki.org/wiki/Extension:SolrStore',
40 - 'descriptionmsg' => 'solrconnector-desc',
41 - 'version' => SC_VERSION,
42 -);
43 -
44 -
45 -// server-local path to this file
46 -$dir = dirname( __FILE__ );
47 -
48 -// register message file
49 -$wgExtensionMessagesFiles['SolrConnector'] = $dir . '/SolrConnector.i18n.php';
50 -//$wgExtensionMessagesFiles['SolrConnectorAlias'] = $dir . '/SolrConnector.alias.php';
51 -
52 -// register class files with the Autoloader
53 -$wgAutoloadClasses['SolrConnectorStore'] = $dir . '/SolrConnectorStore.php';
54 -$wgAutoloadClasses['SolrDoc'] = $dir . '/SolrDoc.php';
55 -$wgAutoloadClasses['SolrTalker'] = $dir . '/SolrTalker.php';
56 -$wgAutoloadClasses['SolrSearch'] = $dir . '/SolrSearch.php';
57 -$wgAutoloadClasses['SolrResult'] = $dir . '/SolrSearch.php';
58 -$wgAutoloadClasses['SolrSearchSet'] = $dir . '/SolrSearch.php';
59 -$wgAutoloadClasses['SpecialSolrSearch'] = $dir . '/SpecialSolrSearch.php';
60 -$wgAutoloadClasses['SolrSearchFieldSet'] = $dir . '/SolrSearchFieldSet.php';
61 -
62 -
63 -// Specialpage
64 -$wgSpecialPages['SolrSearch'] = 'SpecialSolrSearch'; # Tell MediaWiki about the new special page and its class name
65 -$wgSpecialPageGroups['SolrSearch'] = 'smw_group';
66 -// register Special pages
67 -//$wgSpecialPages['SemanticGlossaryBrowser'] = 'SpecialSemanticGlossaryBrowser';
68 -//$wgSpecialPageGroups['SemanticGlossaryBrowser'] = 'other';
69 -
70 -// register hook handlers
71 -//$wgHooks['smwInitProperties'][] = 'SemanticGlossaryRegisterProperties';
72 -//$wgHooks['smwInitDatatypes'][] = 'SemanticGlossaryRegisterPropertyAliases';
73 -
74 -// register resource modules with the Resource Loader
75 -//$wgResourceModules['ext.SemanticGlossary.Browser'] = array(
76 -// 'localBasePath' => $dir,
77 -// 'styles' => 'skins/SemanticGlossaryBrowser.css',
78 -// 'remoteExtPath' => 'SemanticGlossary'
79 -//);
80 -
81 -// Create new permission 'editglossary' and assign it to usergroup 'user' by default
82 -$wgGroupPermissions['user']['editglossary'] = true;
83 -
84 -
85 -// original store
86 -$wgscBaseStore = $smwgDefaultStore;
87 -$smwgDefaultStore = "SolrConnectorStore";
88 -$smwgQuerySources["solr"] = "SolrConnectorStore";
89 -$wgSearchType = 'SolrSearch';
90 -
91 -// Solr Configuration
92 -$wgSolrTalker = new SolrTalker();
93 -if ( !isset( $wgSolrUrl ) ){
94 - //Url to the Solr Server
95 - $wgSolrUrl = 'http://svbosofixwiki:8180/solr';
96 -}
97 -
 2+<?php
 3+
 4+/**
 5+ * A terminology markup extension with a Semantic MediaWiki backend
 6+ *
 7+ * @defgroup SolrStore
 8+ * @author Stephan Gambke, Simon Bachenberg
 9+ * @version 0.5 Beta
 10+ */
 11+
 12+/**
 13+ * The main file of the SolrConnector extension
 14+ *
 15+ * @file
 16+ * @ingroup SolrStore
 17+ */
 18+
 19+
 20+if ( !defined( 'MEDIAWIKI' ) ) {
 21+ die( 'This file is part of a MediaWiki extension, it is not a valid entry point.' );
 22+}
 23+
 24+if ( !defined( 'SMW_VERSION' ) ) {
 25+ die( 'SolrConnector depends on the Semantic MediaWiki extension. You need to install Semantic MediaWiki first.' );
 26+}
 27+
 28+/**
 29+ * The Solr Connector version
 30+ */
 31+define( 'SC_VERSION', '0.5 Beta' );
 32+
 33+// register the extension
 34+//TODO: Add other authors here and in the file header
 35+$wgExtensionCredits[defined( 'SEMANTIC_EXTENSION_TYPE' ) ? 'semantic' : 'other'][] = array(
 36+ 'path' => __FILE__,
 37+ 'name' => 'SolrStore',
 38+ 'author' => array( '[http://www.mediawiki.org/wiki/User:F.trott Stephan Gambke]', '[http://www.mediawiki.org/wiki/User:SBachenberg Simon Bachenberg]', 'Sascha Schüller' ),
 39+ 'url' => 'http://www.mediawiki.org/wiki/Extension:SolrStore',
 40+ 'descriptionmsg' => 'solrconnector-desc',
 41+ 'version' => SC_VERSION,
 42+);
 43+
 44+
 45+// server-local path to this file
 46+$dir = dirname( __FILE__ );
 47+
 48+// register message file
 49+$wgExtensionMessagesFiles['SolrConnector'] = $dir . '/SolrConnector.i18n.php';
 50+//$wgExtensionMessagesFiles['SolrConnectorAlias'] = $dir . '/SolrConnector.alias.php';
 51+
 52+// register class files with the Autoloader
 53+$wgAutoloadClasses['SolrConnectorStore'] = $dir . '/SolrConnectorStore.php';
 54+$wgAutoloadClasses['SolrDoc'] = $dir . '/SolrDoc.php';
 55+$wgAutoloadClasses['SolrTalker'] = $dir . '/SolrTalker.php';
 56+$wgAutoloadClasses['SolrSearch'] = $dir . '/SolrSearch.php';
 57+$wgAutoloadClasses['SolrResult'] = $dir . '/SolrSearch.php';
 58+$wgAutoloadClasses['SolrSearchSet'] = $dir . '/SolrSearch.php';
 59+$wgAutoloadClasses['SpecialSolrSearch'] = $dir . '/SpecialSolrSearch.php';
 60+$wgAutoloadClasses['SolrSearchFieldSet'] = $dir . '/SolrSearchFieldSet.php';
 61+
 62+
 63+// Specialpage
 64+$wgSpecialPages['SolrSearch'] = 'SpecialSolrSearch'; # Tell MediaWiki about the new special page and its class name
 65+$wgSpecialPageGroups['SolrSearch'] = 'smw_group';
 66+// register Special pages
 67+//$wgSpecialPages['SemanticGlossaryBrowser'] = 'SpecialSemanticGlossaryBrowser';
 68+//$wgSpecialPageGroups['SemanticGlossaryBrowser'] = 'other';
 69+
 70+// register hook handlers
 71+//$wgHooks['smwInitProperties'][] = 'SemanticGlossaryRegisterProperties';
 72+//$wgHooks['smwInitDatatypes'][] = 'SemanticGlossaryRegisterPropertyAliases';
 73+
 74+// register resource modules with the Resource Loader
 75+//$wgResourceModules['ext.SemanticGlossary.Browser'] = array(
 76+// 'localBasePath' => $dir,
 77+// 'styles' => 'skins/SemanticGlossaryBrowser.css',
 78+// 'remoteExtPath' => 'SemanticGlossary'
 79+//);
 80+
 81+// Create new permission 'editglossary' and assign it to usergroup 'user' by default
 82+$wgGroupPermissions['user']['editglossary'] = true;
 83+
 84+
 85+// original store
 86+$wgscBaseStore = $smwgDefaultStore;
 87+$smwgDefaultStore = "SolrConnectorStore";
 88+$smwgQuerySources["solr"] = "SolrConnectorStore";
 89+$wgSearchType = 'SolrSearch';
 90+
 91+// Solr Configuration
 92+$wgSolrTalker = new SolrTalker();
 93+if ( !isset( $wgSolrUrl ) ){
 94+ //Url to the Solr Server
 95+ $wgSolrUrl = 'http://svbosofixwiki:8180/solr';
 96+}
 97+
Property changes on: trunk/extensions/SolrStore/SolrConnector.php
___________________________________________________________________
Added: svn:eol-style
9898 + native
Index: trunk/extensions/SolrStore/doc/install-solr
@@ -1,85 +1,85 @@
2 -=Install Apache Solr under Ubuntu=
3 -
4 -This Tutorial describes how to install a local Tomcat Server with the newest Solr Version.
5 -
6 -==Java Runtime Environment installieren==
7 -
8 -At First we need a Java Runtime Environment. You can use OpenJdk or Oracle (Sun) Java Version 6+
9 -
10 - aptitude install default-jre
11 -
12 -or
13 -
14 - apt-get install openjdk-6-jdk
15 -
16 -==Tomcat downloading and install==
17 -
18 -At Firts we need the newest Tomcat Version from Apache.org. If this link isn't working anymore go to tomcat.apache.org
19 -
20 - cd /opt
21 - wget http://artfiles.org/apache.org/tomcat/tomcat-7/v7.0.23/bin/apache-tomcat-7.0.23.tar.gz
22 - tar xvfz apache-tomcat-7.0.23.tar.gz
23 - ln -s apache-tomcat-7.0.23 tomcat
24 - rm apache-tomcat-7.0.23.tar.gz
25 -
26 -==Solr downloading and install==
27 -
28 -Now we need the Newest Version of Solr. You can find it on the Apache Site (http://www.apache.org/dyn/closer.cgi/lucene/solr/)
29 -
30 - cd /opt
31 - wget http://apache.imsam.info//lucene/solr/3.5.0/apache-solr-3.5.0.tgz
32 - tar xvfz apache-solr-3.5.0.tgz
33 - rm apache-solr-3.5.0.tgz
34 -
35 -Now we deploy Apache Solr to the Tomcat Server. Copy the war File from the "dist" dir to your Tomcat webapps folder.
36 -
37 - cd /opt
38 - cp apache-solr-3.5.0/dist/apache-solr-3.5.0.war tomcat/webapps/solr.war
39 -
40 -Now copy the Multicore Example to your Solr Folder /opt/solr. Now you can delete the other solr files, we dont need them.
41 -
42 - cd /opt
43 - cp -R apache-solr-3.5.0/example/multicore/ solr
44 - rm -R apache-solr-3.5.0
45 -
46 -Now we can start your new Tomcat server.
47 -
48 -Note: It's important to strat the Tomcat Server from /opt, otherwise the Tomcat Server will not find your solr dir.
49 -
50 - cd /opt
51 - ./tomcat/bin/startup.sh
52 -
53 -Now you can see your solr Cores and the admin interface under the url http://yourserver:8080/solr
54 -
55 -Your Solr Server is now ready to use, but you should maybe add some security configuration
56 -
57 -==Secure your Installation==
58 -
59 -Your have just to do a few steps to scure your server.
60 -
61 -Move your Data:
62 -
63 -Create a new dir and change it in your Solr config. If you use 2 cores you have to change it for eache of them:
64 -
65 - mkdir /var/solr
66 - vi /opt/solr/solr.xml
67 -
68 -bevore :
69 -
70 - <core name="core-0" instanceDir="core-0" />
71 - <core name="core-1" instanceDir="core-1" />
72 -
73 -after:
74 -
75 - <core name="core-0" instanceDir="core-0" dataDir="/var/solr/core-0" />
76 - <core name="core-1" instanceDir="core-1" dataDir="/var/solr/core-1" />
77 -
78 -==Tomcat logging.properties:==
79 -
80 -Your Logging Properties should be reduced to SEVERE, otherwise it will be realy big realy fast.
81 -
82 -Edit the logging.properties File in /opt/tomcat/conf
83 -
84 - vi /opt/tomcat/conf/logging.properties
85 -
86 -Default is "FINE". You should change it from "FINE" to "SEVERE"
 2+=Install Apache Solr under Ubuntu=
 3+
 4+This Tutorial describes how to install a local Tomcat Server with the newest Solr Version.
 5+
 6+==Java Runtime Environment installieren==
 7+
 8+At First we need a Java Runtime Environment. You can use OpenJdk or Oracle (Sun) Java Version 6+
 9+
 10+ aptitude install default-jre
 11+
 12+or
 13+
 14+ apt-get install openjdk-6-jdk
 15+
 16+==Tomcat downloading and install==
 17+
 18+At Firts we need the newest Tomcat Version from Apache.org. If this link isn't working anymore go to tomcat.apache.org
 19+
 20+ cd /opt
 21+ wget http://artfiles.org/apache.org/tomcat/tomcat-7/v7.0.23/bin/apache-tomcat-7.0.23.tar.gz
 22+ tar xvfz apache-tomcat-7.0.23.tar.gz
 23+ ln -s apache-tomcat-7.0.23 tomcat
 24+ rm apache-tomcat-7.0.23.tar.gz
 25+
 26+==Solr downloading and install==
 27+
 28+Now we need the Newest Version of Solr. You can find it on the Apache Site (http://www.apache.org/dyn/closer.cgi/lucene/solr/)
 29+
 30+ cd /opt
 31+ wget http://apache.imsam.info//lucene/solr/3.5.0/apache-solr-3.5.0.tgz
 32+ tar xvfz apache-solr-3.5.0.tgz
 33+ rm apache-solr-3.5.0.tgz
 34+
 35+Now we deploy Apache Solr to the Tomcat Server. Copy the war File from the "dist" dir to your Tomcat webapps folder.
 36+
 37+ cd /opt
 38+ cp apache-solr-3.5.0/dist/apache-solr-3.5.0.war tomcat/webapps/solr.war
 39+
 40+Now copy the Multicore Example to your Solr Folder /opt/solr. Now you can delete the other solr files, we dont need them.
 41+
 42+ cd /opt
 43+ cp -R apache-solr-3.5.0/example/multicore/ solr
 44+ rm -R apache-solr-3.5.0
 45+
 46+Now we can start your new Tomcat server.
 47+
 48+Note: It's important to strat the Tomcat Server from /opt, otherwise the Tomcat Server will not find your solr dir.
 49+
 50+ cd /opt
 51+ ./tomcat/bin/startup.sh
 52+
 53+Now you can see your solr Cores and the admin interface under the url http://yourserver:8080/solr
 54+
 55+Your Solr Server is now ready to use, but you should maybe add some security configuration
 56+
 57+==Secure your Installation==
 58+
 59+Your have just to do a few steps to scure your server.
 60+
 61+Move your Data:
 62+
 63+Create a new dir and change it in your Solr config. If you use 2 cores you have to change it for eache of them:
 64+
 65+ mkdir /var/solr
 66+ vi /opt/solr/solr.xml
 67+
 68+bevore :
 69+
 70+ <core name="core-0" instanceDir="core-0" />
 71+ <core name="core-1" instanceDir="core-1" />
 72+
 73+after:
 74+
 75+ <core name="core-0" instanceDir="core-0" dataDir="/var/solr/core-0" />
 76+ <core name="core-1" instanceDir="core-1" dataDir="/var/solr/core-1" />
 77+
 78+==Tomcat logging.properties:==
 79+
 80+Your Logging Properties should be reduced to SEVERE, otherwise it will be realy big realy fast.
 81+
 82+Edit the logging.properties File in /opt/tomcat/conf
 83+
 84+ vi /opt/tomcat/conf/logging.properties
 85+
 86+Default is "FINE". You should change it from "FINE" to "SEVERE"
Property changes on: trunk/extensions/SolrStore/doc/install-solr
___________________________________________________________________
Added: svn:eol-style
8787 + native
Index: trunk/extensions/SolrStore/doc/install-solr-ger
@@ -1,106 +1,106 @@
2 -=Apache Solr unter Ubuntu installieren=
3 -
4 -Dieses Tutorial erklärt wie man sich zu Entwicklungzwecken lokal einen Tomcat Server mit der aktuellsten Solr Version installiert.
5 -Java Runtime Environment installieren
6 -
7 -Zunächst müssen wir das Java Runtime Environment unter Ubuntu mit aptitude installieren.
8 -
9 - aptitude install default-jre
10 -
11 -==Tomcat downloaden und installieren==
12 -
13 -Zunächst müssen wir die aktuellste Tomcat Version von Apache.org besorgen. Falls der Mirrorlink nicht mehr aktuell sein sollte, kann die aktuelle Quelle unter tomcat.apache.org festgestellt werden.
14 -
15 - cd /opt
16 - wget http://artfiles.org/apache.org/tomcat/tomcat-7/v7.0.23/bin/apache-tomcat-7.0.23.tar.gz
17 - tar xvfz apache-tomcat-7.0.23.tar.gz
18 - ln -s apache-tomcat-7.0.23 tomcat
19 - rm apache-tomcat-7.0.23.tar.gz
20 -
21 -==Solr downloaden und installieren==
22 -
23 -Nun brauchst du noch die aktuellste Solr Version. Diese kann auf der Apache Website ermittet werden (http://www.apache.org/dyn/closer.cgi/lucene/solr/)
24 -
25 - cd /opt
26 - wget http://apache.imsam.info//lucene/solr/3.5.0/apache-solr-3.5.0.tgz
27 - tar xvfz apache-solr-3.5.0.tgz
28 - rm apache-solr-3.5.0.tgz
29 -
30 -Nun wird Apache Solr in den Tomcat Server deployed. Im dist Vereichnis gibt es dazu eine war Datei:
31 -
32 - cd /opt
33 - cp apache-solr-3.5.0/dist/apache-solr-3.5.0.war tomcat/webapps/solr.war
34 -
35 -Nun kopieren wir die Multicore Beispielkonfiguration auf dem Solr Paket in /opt/solr.
36 -Danach können wir das Quellverzeichnis von solr löschen, da wir alles daraus haben was wir brauchen.
37 -
38 - cd /opt
39 - cp -R apache-solr-3.5.0/example/multicore/ solr
40 - rm -R apache-solr-3.5.0
41 -
42 -Nun können wir den Tomcat Server starten.
43 -
44 -Anmerkung: Es ist wichtig, das der Tomcat Server von /opt gestartet wird, da der Tomcat Server sonst das Verzeichnis mit der solr
45 -Konfiguration (/opt/solr) nicht finden kann.
46 -
47 - cd /opt
48 - ./tomcat/bin/startup.sh
49 -
50 -Nun kann unter hostname/solr der Solr Server aufgerufen werden. Dabei solltest du eine Liste der Cores sehen,
51 -die auf das Admininterface verlinken:
52 -
53 -Grundsätzlich ist der Solr Server nun bereit. Aus Gründen der Sicherheit sollten jedoch noch ein paar Anpassungen am Basis Setup gemacht werden.
54 -
55 -==Basis Installation absichern==
56 -
57 -Es sind noch ein paar Schritte notwendig, die mindestens gemacht werden sollten um den Solr Server abzusichern.
58 -
59 -Datenverzeichnis verschieben:
60 -
61 -Das Datenverzeichnis sollte in ein eigene Verzeichnis gelegt werden.
62 -
63 -Dazu legen wir auf der /var Partition ein Verzeichnis an und passen die solr.xml Datei an:
64 -
65 - mkdir /var/solr
66 - vi /opt/solr/solr.xml
67 -
68 -von :
69 -
70 - <core name="core-0" instanceDir="core-0" />
71 - <core name="core-1" instanceDir="core-1" />
72 -
73 -nach:
74 -
75 - <core name="core-0" instanceDir="core-0" dataDir="/var/solr/core-0" />
76 - <core name="core-1" instanceDir="core-1" dataDir="/var/solr/core-1" />
77 -
78 -==Tomcat logging.properties anpassen:==
79 -
80 -Die Logging Properties von Tomcat sollten auf SEVERE reduziert werden, da sonst das Log sehr schnell sehr groß wird.
81 -
82 -Dazu ist die logging.properties Datei in /opt/tomcat/conf anzupassen.
83 -
84 - vi /opt/tomcat/conf/logging.properties
85 -
86 -Per Default ist hier die feinste Stufe eingestellt also "FINE". Hier sollte statt "FINE" "SEVERE" verwendet werden.
87 -
88 -Ausserdem ist darüber nachzudenken ob die Log Dateien lieber in /var/log abgelegt werden sollen.
89 -
90 -Nehme also hier die nötigen Anpassungen vor und Starte den Tomcat Server neu.
91 -
92 -Zugriff auf Port 8080 nur von localhost erlauben:
93 -
94 -Der Zugriff auf den Port 8080 sollte auf localhost limitiert werden, da solr selbst keine Authentifizierung hat
95 -und der Server sonst für jeden zugreifbar ist.
96 -
97 -Das machen wir am besten mit iptables, da dann Request garnicht erst beim Tomcat ankommen:
98 -
99 - iptables -A INPUT -p tcp ! -s 127.0.0.1 --dport 8080 -j DROP
100 -
101 -Nun solltest du nochmal testen, das du von einem externen Host Solr nicht mehr aufrufen kannst, aber nachwievor noch
102 -lokal zugreifen kannst.
103 -
104 -Auf dem Server sollte also folgendes noch funktionieren;
105 -
106 - cd ~
107 - wget http://localhost:8080/solr
 2+=Apache Solr unter Ubuntu installieren=
 3+
 4+Dieses Tutorial erklärt wie man sich zu Entwicklungzwecken lokal einen Tomcat Server mit der aktuellsten Solr Version installiert.
 5+Java Runtime Environment installieren
 6+
 7+Zunächst müssen wir das Java Runtime Environment unter Ubuntu mit aptitude installieren.
 8+
 9+ aptitude install default-jre
 10+
 11+==Tomcat downloaden und installieren==
 12+
 13+Zunächst müssen wir die aktuellste Tomcat Version von Apache.org besorgen. Falls der Mirrorlink nicht mehr aktuell sein sollte, kann die aktuelle Quelle unter tomcat.apache.org festgestellt werden.
 14+
 15+ cd /opt
 16+ wget http://artfiles.org/apache.org/tomcat/tomcat-7/v7.0.23/bin/apache-tomcat-7.0.23.tar.gz
 17+ tar xvfz apache-tomcat-7.0.23.tar.gz
 18+ ln -s apache-tomcat-7.0.23 tomcat
 19+ rm apache-tomcat-7.0.23.tar.gz
 20+
 21+==Solr downloaden und installieren==
 22+
 23+Nun brauchst du noch die aktuellste Solr Version. Diese kann auf der Apache Website ermittet werden (http://www.apache.org/dyn/closer.cgi/lucene/solr/)
 24+
 25+ cd /opt
 26+ wget http://apache.imsam.info//lucene/solr/3.5.0/apache-solr-3.5.0.tgz
 27+ tar xvfz apache-solr-3.5.0.tgz
 28+ rm apache-solr-3.5.0.tgz
 29+
 30+Nun wird Apache Solr in den Tomcat Server deployed. Im dist Vereichnis gibt es dazu eine war Datei:
 31+
 32+ cd /opt
 33+ cp apache-solr-3.5.0/dist/apache-solr-3.5.0.war tomcat/webapps/solr.war
 34+
 35+Nun kopieren wir die Multicore Beispielkonfiguration auf dem Solr Paket in /opt/solr.
 36+Danach können wir das Quellverzeichnis von solr löschen, da wir alles daraus haben was wir brauchen.
 37+
 38+ cd /opt
 39+ cp -R apache-solr-3.5.0/example/multicore/ solr
 40+ rm -R apache-solr-3.5.0
 41+
 42+Nun können wir den Tomcat Server starten.
 43+
 44+Anmerkung: Es ist wichtig, das der Tomcat Server von /opt gestartet wird, da der Tomcat Server sonst das Verzeichnis mit der solr
 45+Konfiguration (/opt/solr) nicht finden kann.
 46+
 47+ cd /opt
 48+ ./tomcat/bin/startup.sh
 49+
 50+Nun kann unter hostname/solr der Solr Server aufgerufen werden. Dabei solltest du eine Liste der Cores sehen,
 51+die auf das Admininterface verlinken:
 52+
 53+Grundsätzlich ist der Solr Server nun bereit. Aus Gründen der Sicherheit sollten jedoch noch ein paar Anpassungen am Basis Setup gemacht werden.
 54+
 55+==Basis Installation absichern==
 56+
 57+Es sind noch ein paar Schritte notwendig, die mindestens gemacht werden sollten um den Solr Server abzusichern.
 58+
 59+Datenverzeichnis verschieben:
 60+
 61+Das Datenverzeichnis sollte in ein eigene Verzeichnis gelegt werden.
 62+
 63+Dazu legen wir auf der /var Partition ein Verzeichnis an und passen die solr.xml Datei an:
 64+
 65+ mkdir /var/solr
 66+ vi /opt/solr/solr.xml
 67+
 68+von :
 69+
 70+ <core name="core-0" instanceDir="core-0" />
 71+ <core name="core-1" instanceDir="core-1" />
 72+
 73+nach:
 74+
 75+ <core name="core-0" instanceDir="core-0" dataDir="/var/solr/core-0" />
 76+ <core name="core-1" instanceDir="core-1" dataDir="/var/solr/core-1" />
 77+
 78+==Tomcat logging.properties anpassen:==
 79+
 80+Die Logging Properties von Tomcat sollten auf SEVERE reduziert werden, da sonst das Log sehr schnell sehr groß wird.
 81+
 82+Dazu ist die logging.properties Datei in /opt/tomcat/conf anzupassen.
 83+
 84+ vi /opt/tomcat/conf/logging.properties
 85+
 86+Per Default ist hier die feinste Stufe eingestellt also "FINE". Hier sollte statt "FINE" "SEVERE" verwendet werden.
 87+
 88+Ausserdem ist darüber nachzudenken ob die Log Dateien lieber in /var/log abgelegt werden sollen.
 89+
 90+Nehme also hier die nötigen Anpassungen vor und Starte den Tomcat Server neu.
 91+
 92+Zugriff auf Port 8080 nur von localhost erlauben:
 93+
 94+Der Zugriff auf den Port 8080 sollte auf localhost limitiert werden, da solr selbst keine Authentifizierung hat
 95+und der Server sonst für jeden zugreifbar ist.
 96+
 97+Das machen wir am besten mit iptables, da dann Request garnicht erst beim Tomcat ankommen:
 98+
 99+ iptables -A INPUT -p tcp ! -s 127.0.0.1 --dport 8080 -j DROP
 100+
 101+Nun solltest du nochmal testen, das du von einem externen Host Solr nicht mehr aufrufen kannst, aber nachwievor noch
 102+lokal zugreifen kannst.
 103+
 104+Auf dem Server sollte also folgendes noch funktionieren;
 105+
 106+ cd ~
 107+ wget http://localhost:8080/solr
Property changes on: trunk/extensions/SolrStore/doc/install-solr-ger
___________________________________________________________________
Added: svn:eol-style
108108 + native
Property changes on: trunk/extensions/SolrStore/SolrTalker.php
___________________________________________________________________
Added: svn:eol-style
109109 + native
Index: trunk/extensions/SolrStore/solr-example/core0/conf/schema.xml
@@ -1,608 +1,608 @@
2 -<?xml version="1.0" encoding="UTF-8" ?>
3 -<!--
4 - Licensed to the Apache Software Foundation (ASF) under one or more
5 - contributor license agreements. See the NOTICE file distributed with
6 - this work for additional information regarding copyright ownership.
7 - The ASF licenses this file to You under the Apache License, Version 2.0
8 - (the "License"); you may not use this file except in compliance with
9 - the License. You may obtain a copy of the License at
10 -
11 - http://www.apache.org/licenses/LICENSE-2.0
12 -
13 - Unless required by applicable law or agreed to in writing, software
14 - distributed under the License is distributed on an "AS IS" BASIS,
15 - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 - See the License for the specific language governing permissions and
17 - limitations under the License.
18 -
19 -<!--
20 - This is the Solr schema file. This file should be named "schema.xml" and
21 - should be in the conf directory under the solr home
22 - (i.e. ./solr/conf/schema.xml by default)
23 - or located where the classloader for the Solr webapp can find it.
24 -
25 - This example schema is the recommended starting point for users.
26 - It should be kept correct and concise, usable out-of-the-box.
27 -
28 - For more information, on how to customize this file, please see
29 - http://wiki.apache.org/solr/SchemaXml
30 -
31 - PERFORMANCE NOTE: this schema includes many optional features and should not
32 - be used for benchmarking. To improve performance one could
33 - - set stored="false" for all fields possible (esp large fields) when you
34 - only need to search on the field but don't need to return the original
35 - value.
36 - - set indexed="false" if you don't need to search on the field, but only
37 - return the field as a result of searching on other indexed fields.
38 - - remove all unneeded copyField statements
39 - - for best index size and searching performance, set "index" to false
40 - for all general text fields, use copyField to copy them to the
41 - catchall "text" field, and use that for searching.
42 - - For maximum indexing performance, use the StreamingUpdateSolrServer
43 - java client.
44 - - Remember to run the JVM in server mode, and use a higher logging level
45 - that avoids logging every request
46 -
47 -<schema name="example" version="1.2">
48 - <!-- attribute "name" is the name of this schema and is only used for display purposes.
49 - Applications should change this to reflect the nature of the search collection.
50 - version="1.2" is Solr's version number for the schema syntax and semantics. It should
51 - not normally be changed by applications.
52 - 1.0: multiValued attribute did not exist, all fields are multiValued by nature
53 - 1.1: multiValued attribute introduced, false by default
54 - 1.2: omitTermFreqAndPositions attribute introduced, true by default except for text fields.
55 - -->
56 -
57 - <types>
58 - <!-- field type definitions. The "name" attribute is
59 - just a label to be used by field definitions. The "class"
60 - attribute and any other attributes determine the real
61 - behavior of the fieldType.
62 - Class names starting with "solr" refer to java classes in the
63 - org.apache.solr.analysis package.
64 - -->
65 -
66 - <!-- The StrField type is not analyzed, but indexed/stored verbatim.
67 - - StrField and TextField support an optional compressThreshold which
68 - limits compression (if enabled in the derived fields) to values which
69 - exceed a certain size (in characters).
70 - -->
71 - <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
72 -
73 - <!-- boolean type: "true" or "false" -->
74 - <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/>
75 - <!--Binary data type. The data should be sent/retrieved in as Base64 encoded Strings -->
76 - <fieldtype name="binary" class="solr.BinaryField"/>
77 -
78 - <!-- The optional sortMissingLast and sortMissingFirst attributes are
79 - currently supported on types that are sorted internally as strings.
80 - This includes "string","boolean","sint","slong","sfloat","sdouble","pdate"
81 - - If sortMissingLast="true", then a sort on this field will cause documents
82 - without the field to come after documents with the field,
83 - regardless of the requested sort order (asc or desc).
84 - - If sortMissingFirst="true", then a sort on this field will cause documents
85 - without the field to come before documents with the field,
86 - regardless of the requested sort order.
87 - - If sortMissingLast="false" and sortMissingFirst="false" (the default),
88 - then default lucene sorting will be used which places docs without the
89 - field first in an ascending sort and last in a descending sort.
90 - -->
91 -
92 - <!--
93 - Default numeric field types. For faster range queries, consider the tint/tfloat/tlong/tdouble types.
94 - -->
95 - <fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
96 - <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
97 - <fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
98 - <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
99 -
100 - <!--
101 - Numeric field types that index each value at various levels of precision
102 - to accelerate range queries when the number of values between the range
103 - endpoints is large. See the javadoc for NumericRangeQuery for internal
104 - implementation details.
105 -
106 - Smaller precisionStep values (specified in bits) will lead to more tokens
107 - indexed per value, slightly larger index size, and faster range queries.
108 - A precisionStep of 0 disables indexing at different precision levels.
109 - -->
110 - <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
111 - <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
112 - <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
113 - <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
114 -
115 - <!-- The format for this date field is of the form 1995-12-31T23:59:59Z, and
116 - is a more restricted form of the canonical representation of dateTime
117 - http://www.w3.org/TR/xmlschema-2/#dateTime
118 - The trailing "Z" designates UTC time and is mandatory.
119 - Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z
120 - All other components are mandatory.
121 -
122 - Expressions can also be used to denote calculations that should be
123 - performed relative to "NOW" to determine the value, ie...
124 -
125 - NOW/HOUR
126 - ... Round to the start of the current hour
127 - NOW-1DAY
128 - ... Exactly 1 day prior to now
129 - NOW/DAY+6MONTHS+3DAYS
130 - ... 6 months and 3 days in the future from the start of
131 - the current day
132 -
133 - Consult the DateField javadocs for more information.
134 -
135 - Note: For faster range queries, consider the tdate type
136 - -->
137 - <fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0"/>
138 -
139 - <!-- A Trie based date field for faster date range queries and date faceting. -->
140 - <fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6" positionIncrementGap="0"/>
141 -
142 -
143 - <!--
144 - Note:
145 - These should only be used for compatibility with existing indexes (created with older Solr versions)
146 - or if "sortMissingFirst" or "sortMissingLast" functionality is needed. Use Trie based fields instead.
147 -
148 - Plain numeric field types that store and index the text
149 - value verbatim (and hence don't support range queries, since the
150 - lexicographic ordering isn't equal to the numeric ordering)
151 - -->
152 - <fieldType name="pint" class="solr.IntField" omitNorms="true"/>
153 - <fieldType name="plong" class="solr.LongField" omitNorms="true"/>
154 - <fieldType name="pfloat" class="solr.FloatField" omitNorms="true"/>
155 - <fieldType name="pdouble" class="solr.DoubleField" omitNorms="true"/>
156 - <fieldType name="pdate" class="solr.DateField" sortMissingLast="true" omitNorms="true"/>
157 -
158 -
159 - <!--
160 - Note:
161 - These should only be used for compatibility with existing indexes (created with older Solr versions)
162 - or if "sortMissingFirst" or "sortMissingLast" functionality is needed. Use Trie based fields instead.
163 -
164 - Numeric field types that manipulate the value into
165 - a string value that isn't human-readable in its internal form,
166 - but with a lexicographic ordering the same as the numeric ordering,
167 - so that range queries work correctly.
168 - -->
169 - <fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>
170 - <fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="true"/>
171 - <fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="true"/>
172 - <fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="true"/>
173 -
174 -
175 - <!-- The "RandomSortField" is not used to store or search any
176 - data. You can declare fields of this type it in your schema
177 - to generate pseudo-random orderings of your docs for sorting
178 - purposes. The ordering is generated based on the field name
179 - and the version of the index, As long as the index version
180 - remains unchanged, and the same field name is reused,
181 - the ordering of the docs will be consistent.
182 - If you want different psuedo-random orderings of documents,
183 - for the same version of the index, use a dynamicField and
184 - change the name
185 - -->
186 - <fieldType name="random" class="solr.RandomSortField" indexed="true" />
187 -
188 - <!-- solr.TextField allows the specification of custom text analyzers
189 - specified as a tokenizer and a list of token filters. Different
190 - analyzers may be specified for indexing and querying.
191 -
192 - The optional positionIncrementGap puts space between multiple fields of
193 - this type on the same document, with the purpose of preventing false phrase
194 - matching across fields.
195 -
196 - For more info on customizing your analyzer chain, please see
197 - http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
198 - -->
199 -
200 - <!-- One can also specify an existing Analyzer class that has a
201 - default constructor via the class attribute on the analyzer element
202 - <fieldType name="text_greek" class="solr.TextField">
203 - <analyzer class="org.apache.lucene.analysis.el.GreekAnalyzer"/>
204 - </fieldType>
205 - -->
206 -
207 - <!-- A text field that only splits on whitespace for exact matching of words -->
208 - <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
209 - <analyzer>
210 - <tokenizer class="solr.WhitespaceTokenizerFactory"/>
211 - </analyzer>
212 - </fieldType>
213 -
214 - <!-- A text field that uses WordDelimiterFilter to enable splitting and matching of
215 - words on case-change, alpha numeric boundaries, and non-alphanumeric chars,
216 - so that a query of "wifi" or "wi fi" could match a document containing "Wi-Fi".
217 - Synonyms and stopwords are customized by external files, and stemming is enabled.
218 - -->
219 - <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
220 - <analyzer type="index">
221 - <tokenizer class="solr.WhitespaceTokenizerFactory"/>
222 - <!-- in this example, we will only use synonyms at query time
223 - <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
224 - -->
225 - <!-- Case insensitive stop word removal.
226 - add enablePositionIncrements=true in both the index and query
227 - analyzers to leave a 'gap' for more accurate phrase queries.
228 - -->
229 - <filter class="solr.StopFilterFactory"
230 - ignoreCase="true"
231 - words="stopwords.txt"
232 - enablePositionIncrements="true"
233 - />
234 - <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
235 - <filter class="solr.LowerCaseFilterFactory"/>
236 - <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
237 - </analyzer>
238 - <analyzer type="query">
239 - <tokenizer class="solr.WhitespaceTokenizerFactory"/>
240 - <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
241 - <filter class="solr.StopFilterFactory"
242 - ignoreCase="true"
243 - words="stopwords.txt"
244 - enablePositionIncrements="true"
245 - />
246 - <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
247 - <filter class="solr.LowerCaseFilterFactory"/>
248 - <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
249 - </analyzer>
250 - </fieldType>
251 -
252 -
253 - <!-- Less flexible matching, but less false matches. Probably not ideal for product names,
254 - but may be good for SKUs. Can insert dashes in the wrong place and still match. -->
255 - <fieldType name="textTight" class="solr.TextField" positionIncrementGap="100" >
256 - <analyzer>
257 - <tokenizer class="solr.WhitespaceTokenizerFactory"/>
258 - <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
259 - <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
260 - <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
261 - <filter class="solr.LowerCaseFilterFactory"/>
262 - <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
263 - <!-- this filter can remove any duplicate tokens that appear at the same position - sometimes
264 - possible with WordDelimiterFilter in conjuncton with stemming. -->
265 - <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
266 - </analyzer>
267 - </fieldType>
268 -
269 -
270 - <!-- A general unstemmed text field - good if one does not know the language of the field -->
271 - <fieldType name="textgen" class="solr.TextField" positionIncrementGap="100">
272 - <analyzer type="index">
273 - <tokenizer class="solr.WhitespaceTokenizerFactory"/>
274 - <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
275 - <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/>
276 - <filter class="solr.LowerCaseFilterFactory"/>
277 - </analyzer>
278 - <analyzer type="query">
279 - <tokenizer class="solr.WhitespaceTokenizerFactory"/>
280 - <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
281 - <filter class="solr.StopFilterFactory"
282 - ignoreCase="true"
283 - words="stopwords.txt"
284 - enablePositionIncrements="true"
285 - />
286 - <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
287 - <filter class="solr.LowerCaseFilterFactory"/>
288 - </analyzer>
289 - </fieldType>
290 -
291 -
292 - <!-- A general unstemmed text field that indexes tokens normally and also
293 - reversed (via ReversedWildcardFilterFactory), to enable more efficient
294 - leading wildcard queries. -->
295 - <fieldType name="text_rev" class="solr.TextField" positionIncrementGap="100">
296 - <analyzer type="index">
297 - <tokenizer class="solr.WhitespaceTokenizerFactory"/>
298 - <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
299 - <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/>
300 - <filter class="solr.LowerCaseFilterFactory"/>
301 - <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true"
302 - maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/>
303 - </analyzer>
304 - <analyzer type="query">
305 - <tokenizer class="solr.WhitespaceTokenizerFactory"/>
306 - <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
307 - <filter class="solr.StopFilterFactory"
308 - ignoreCase="true"
309 - words="stopwords.txt"
310 - enablePositionIncrements="true"
311 - />
312 - <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
313 - <filter class="solr.LowerCaseFilterFactory"/>
314 - </analyzer>
315 - </fieldType>
316 -
317 - <!-- charFilter + WhitespaceTokenizer -->
318 - <!--
319 - <fieldType name="textCharNorm" class="solr.TextField" positionIncrementGap="100" >
320 - <analyzer>
321 - <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
322 - <tokenizer class="solr.WhitespaceTokenizerFactory"/>
323 - </analyzer>
324 - </fieldType>
325 - -->
326 -
327 - <!-- This is an example of using the KeywordTokenizer along
328 - With various TokenFilterFactories to produce a sortable field
329 - that does not include some properties of the source text
330 - -->
331 - <fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
332 - <analyzer>
333 - <!-- KeywordTokenizer does no actual tokenizing, so the entire
334 - input string is preserved as a single token
335 - -->
336 - <tokenizer class="solr.KeywordTokenizerFactory"/>
337 - <!-- The LowerCase TokenFilter does what you expect, which can be
338 - when you want your sorting to be case insensitive
339 - -->
340 - <filter class="solr.LowerCaseFilterFactory" />
341 - <!-- The TrimFilter removes any leading or trailing whitespace -->
342 - <filter class="solr.TrimFilterFactory" />
343 - <!-- The PatternReplaceFilter gives you the flexibility to use
344 - Java Regular expression to replace any sequence of characters
345 - matching a pattern with an arbitrary replacement string,
346 - which may include back references to portions of the original
347 - string matched by the pattern.
348 -
349 - See the Java Regular Expression documentation for more
350 - information on pattern and replacement string syntax.
351 -
352 - http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/package-summary.html
353 - -->
354 - <filter class="solr.PatternReplaceFilterFactory"
355 - pattern="([^a-z])" replacement="" replace="all"
356 - />
357 - </analyzer>
358 - </fieldType>
359 -
360 - <fieldtype name="phonetic" stored="false" indexed="true" class="solr.TextField" >
361 - <analyzer>
362 - <tokenizer class="solr.StandardTokenizerFactory"/>
363 - <filter class="solr.DoubleMetaphoneFilterFactory" inject="false"/>
364 - </analyzer>
365 - </fieldtype>
366 -
367 - <fieldtype name="payloads" stored="false" indexed="true" class="solr.TextField" >
368 - <analyzer>
369 - <tokenizer class="solr.WhitespaceTokenizerFactory"/>
370 - <!--
371 - The DelimitedPayloadTokenFilter can put payloads on tokens... for example,
372 - a token of "foo|1.4" would be indexed as "foo" with a payload of 1.4f
373 - Attributes of the DelimitedPayloadTokenFilterFactory :
374 - "delimiter" - a one character delimiter. Default is | (pipe)
375 - "encoder" - how to encode the following value into a playload
376 - float -> org.apache.lucene.analysis.payloads.FloatEncoder,
377 - integer -> o.a.l.a.p.IntegerEncoder
378 - identity -> o.a.l.a.p.IdentityEncoder
379 - Fully Qualified class name implementing PayloadEncoder, Encoder must have a no arg constructor.
380 - -->
381 - <filter class="solr.DelimitedPayloadTokenFilterFactory" encoder="float"/>
382 - </analyzer>
383 - </fieldtype>
384 -
385 - <!-- lowercases the entire field value, keeping it as a single token. -->
386 - <fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">
387 - <analyzer>
388 - <tokenizer class="solr.KeywordTokenizerFactory"/>
389 - <filter class="solr.LowerCaseFilterFactory" />
390 - </analyzer>
391 - </fieldType>
392 -
393 -
394 - <!-- Case Insensitive String-->
395 - <fieldType name="string_ci" class="solr.TextField"
396 - sortMissingLast="true" omitNorms="true">
397 - <analyzer>
398 - <tokenizer class="solr.LowerCaseTokenizerFactory"/>
399 - <filter class="solr.LowerCaseFilterFactory" />
400 - </analyzer>
401 - </fieldType>
402 -
403 - <!-- since fields of this type are by default not stored or indexed,
404 - any data added to them will be ignored outright. -->
405 - <fieldtype name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField" />
406 -
407 - </types>
408 -
409 -
410 - <fields>
411 - <!-- Valid attributes for fields:
412 - name: mandatory - the name for the field
413 - type: mandatory - the name of a previously defined type from the
414 - <types> section
415 - indexed: true if this field should be indexed (searchable or sortable)
416 - stored: true if this field should be retrievable
417 - compressed: [false] if this field should be stored using gzip compression
418 - (this will only apply if the field type is compressable; among
419 - the standard field types, only TextField and StrField are)
420 - multiValued: true if this field may contain multiple values per document
421 - omitNorms: (expert) set to true to omit the norms associated with
422 - this field (this disables length normalization and index-time
423 - boosting for the field, and saves some memory). Only full-text
424 - fields or fields that need an index-time boost need norms.
425 - termVectors: [false] set to true to store the term vector for a
426 - given field.
427 - When using MoreLikeThis, fields used for similarity should be
428 - stored for best performance.
429 - termPositions: Store position information with the term vector.
430 - This will increase storage costs.
431 - termOffsets: Store offset information with the term vector. This
432 - will increase storage costs.
433 - default: a value that should be used if no value is specified
434 - when adding a document.
435 - -->
436 -
437 - <field name="pagetitle" type="string" indexed="true" stored="true" required="true" />
438 - <field name="interwiki" type="string" indexed="true" stored="true" />
439 - <field name="dbkey" type="string" indexed="true" stored="true" required="true" />
440 - <field name="subobjectname" type="string" indexed="true" stored="true" />
441 - <field name="namespace" type="int" indexed="true" stored="true" required="true" />
442 -
443 - <field name="titleen" type="text" indexed="true" stored="true" />
444 - <field name="name" type="text" indexed="true" stored="true" />
445 - <field name="von" type="date" indexed="true" stored="true" />
446 - <field name="bis" type="date" indexed="true" stored="true" />
447 - <field name="category" type="text" indexed="true" stored="true" />
448 - <field name="id" type="sint" indexed="true" stored="true" />
449 - <field name="institution" type="text" indexed="true" stored="true" multiValued="true"/>
450 - <field name="person" type="text" indexed="true" stored="true" multiValued="true"/>
451 - <field name="inhaltde" type="text" indexed="true" stored="true"/>
452 - <field name="inhalten" type="text" indexed="true" stored="true"/>
453 - <field name="inhaltfr" type="text" indexed="true" stored="true"/>
454 - <field name="stichworte" type="text" indexed="true" stored="true" multiValued="true"/>
455 - <field name="schlagworte" type="text" indexed="true" stored="true" multiValued="true"/>
456 - <field name="rnr" type="sint" indexed="true" stored="true" multiValued="true"/>
457 - <field name="orgtyp" type="text" indexed="true" stored="true"/>
458 - <field name="shortname" type="text" indexed="true" stored="true"/>
459 - <field name="subject" type="text" indexed="true" stored="true"/>
460 - <field name="homepage" type="text" indexed="true" stored="true"/>
461 - <field name="ort" type="text" indexed="true" stored="true"/>
462 - <field name="land" type="text" indexed="true" stored="true"/>
463 - <field name="maindept" type="text" indexed="true" stored="true"/>
464 - <field name="higherdept" type="text" indexed="true" stored="true"/>
465 - <field name="text" type="text" indexed="true" stored="true" multiValued="true"/>
466 -
467 -
468 - <!-- Common metadata fields, named specifically to match up with
469 - SolrCell metadata when parsing rich documents such as Word, PDF.
470 - Some fields are multiValued only because Tika currently may return
471 - multiple values for them.
472 - -->
473 - <field name="title" type="text" indexed="true" stored="true" multiValued="true"/>
474 - <field name="description" type="text" indexed="true" stored="true"/>
475 - <field name="comments" type="text" indexed="true" stored="true"/>
476 - <field name="author" type="textgen" indexed="true" stored="true"/>
477 - <field name="keywords" type="textgen" indexed="true" stored="true"/>
478 - <field name="content_type" type="string" indexed="true" stored="true" multiValued="true"/>
479 - <field name="last_modified" type="date" indexed="true" stored="true"/>
480 - <field name="links" type="string" indexed="true" stored="true" multiValued="true"/>
481 -
482 -
483 - <!-- catchall field, containing all other searchable text fields (implemented
484 - via copyField further on in this schema -->
485 - <!-- <field name="text" type="text" indexed="true" stored="false" multiValued="true"/>
486 - <!-- catchall text field that indexes tokens both normally and in reverse for efficient
487 - leading wildcard queries. -->
488 - <field name="text_rev" type="text_rev" indexed="true" stored="false" multiValued="true"/>
489 -
490 - <!-- non-tokenized version of manufacturer to make it easier to sort or group
491 - results by manufacturer. copied from "manu" via copyField -->
492 - <field name="manu_exact" type="string" indexed="true" stored="false"/>
493 -
494 - <field name="payloads" type="payloads" indexed="true" stored="true"/>
495 -
496 - <!-- Uncommenting the following will create a "timestamp" field using
497 - a default value of "NOW" to indicate when each document was indexed.
498 - -->
499 - <!--
500 - <field name="timestamp" type="date" indexed="true" stored="true" default="NOW" multiValued="false"/>
501 - -->
502 -
503 -
504 - <!-- Dynamic field definitions. If a field name is not found, dynamicFields
505 - will be used if the name matches any of the patterns.
506 - RESTRICTION: the glob-like pattern in the name attribute must have
507 - a "*" only at the start or the end.
508 - EXAMPLE: name="*_i" will match any field ending in _i (like myid_i, z_i)
509 - Longer patterns will be matched first. if equal size patterns
510 - both match, the first appearing in the schema will be used. -->
511 - <dynamicField name="*_i" type="int" indexed="true" stored="true" multiValued="true"/>
512 - <dynamicField name="*_s" type="string_ci" indexed="true" stored="true" multiValued="true"/>
513 - <dynamicField name="*_l" type="long" indexed="true" stored="true" multiValued="true"/>
514 - <dynamicField name="*_t" type="text" indexed="true" stored="true" multiValued="true"/>
515 - <dynamicField name="*_b" type="boolean" indexed="true" stored="true" multiValued="true"/>
516 - <dynamicField name="*_f" type="float" indexed="true" stored="true" multiValued="true"/>
517 - <dynamicField name="*_d" type="double" indexed="true" stored="true" multiValued="true"/>
518 - <dynamicField name="*_dt" type="date" indexed="true" stored="true" multiValued="true"/>
519 -
520 - <!-- Fields need for Sorting Multivalued Fields -->
521 - <dynamicField name="*_tmin" type="alphaOnlySort" indexed="true" />
522 - <dynamicField name="*_tmax" type="alphaOnlySort" indexed="true" />
523 - <dynamicField name="*_smin" type="alphaOnlySort" indexed="true" />
524 - <dynamicField name="*_smax" type="alphaOnlySort" indexed="true" />
525 - <dynamicField name="*_imin" type="int" indexed="true" />
526 - <dynamicField name="*_imax" type="int" indexed="true" />
527 - <dynamicField name="*_dtmin" type="date" indexed="true"/>
528 - <dynamicField name="*_dtmax" type="date" indexed="true"/>
529 -
530 -
531 - <!-- some trie-coded dynamic fields for faster range queries -->
532 - <dynamicField name="*_ti" type="tint" indexed="true" stored="true" />
533 - <dynamicField name="*_tl" type="tlong" indexed="true" stored="true" />
534 - <dynamicField name="*_tf" type="tfloat" indexed="true" stored="true" />
535 - <dynamicField name="*_td" type="tdouble" indexed="true" stored="true" />
536 - <dynamicField name="*_tdt" type="tdate" indexed="true" stored="true" />
537 -
538 - <!-- Geo Coordinates -->
539 - <dynamicField name="*_lat" type="sdouble" indexed="true" stored="true" />
540 - <dynamicField name="*_lng" type="sdouble" indexed="true" stored="true" />
541 -
542 - <dynamicField name="*_pi" type="pint" indexed="true" stored="true" />
543 -
544 - <dynamicField name="ignored_*" type="ignored" multiValued="true"/>
545 - <dynamicField name="attr_*" type="textgen" indexed="true" stored="true" />
546 -
547 - <dynamicField name="random_*" type="random" />
548 -
549 - <!-- uncomment the following to ignore any fields that don't already match an existing
550 - field name or dynamic field, rather than reporting them as an error.
551 - alternately, change the type="ignored" to some other type e.g. "text" if you want
552 - unknown fields indexed and/or stored by default -->
553 - <!--dynamicField name="*" type="ignored" multiValued="true" /-->
554 -
555 - </fields>
556 -
557 - <!-- Field to use to determine and enforce document uniqueness.
558 - Unless this field is marked with required="false", it will be a required field
559 - -->
560 - <uniqueKey>pagetitle</uniqueKey>
561 -
562 - <!-- field for the QueryParser to use when an explicit fieldname is absent -->
563 - <defaultSearchField>text</defaultSearchField>
564 -
565 - <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
566 - <solrQueryParser defaultOperator="OR"/>
567 -
568 - <!-- copyField commands copy one field to another at the time a document
569 - is added to the index. It's used either to index the same field differently,
570 - or to add multiple fields to the same field for easier/faster searching. -->
571 -<!--
572 - <copyField source="cat" dest="text"/>
573 - <copyField source="name" dest="text"/>
574 - <copyField source="manu" dest="text"/>
575 - <copyField source="features" dest="text"/>
576 - <copyField source="includes" dest="text"/>
577 - <copyField source="manu" dest="manu_exact"/>
578 - <!-- Above, multiple source fields are copied to the [text] field.
579 - Another way to map multiple source fields to the same
580 - destination field is to use the dynamic field syntax.
581 - copyField also supports a maxChars to copy setting. -->
582 -
583 - <copyField source="*" dest="text" maxChars="5000"/>
584 - <copyField source="pagetitle" dest="title"/>
585 -
586 - <!-- copy name to alphaNameSort, a field designed for sorting by name -->
587 - <!-- <copyField source="name" dest="alphaNameSort"/> -->
588 -
589 -
590 - <!-- Similarity is the scoring routine for each document vs. a query.
591 - A custom similarity may be specified here, but the default is fine
592 - for most applications. -->
593 - <!-- <similarity class="org.apache.lucene.search.DefaultSimilarity"/> -->
594 - <!-- ... OR ...
595 - Specify a SimilarityFactory class name implementation
596 - allowing parameters to be used.
597 - -->
598 - <!--
599 - <similarity class="com.example.solr.CustomSimilarityFactory">
600 - <str name="paramkey">param value</str>
601 - </similarity>
602 - -->
603 -
604 -
605 -</schema>
 2+<?xml version="1.0" encoding="UTF-8" ?>
 3+<!--
 4+ Licensed to the Apache Software Foundation (ASF) under one or more
 5+ contributor license agreements. See the NOTICE file distributed with
 6+ this work for additional information regarding copyright ownership.
 7+ The ASF licenses this file to You under the Apache License, Version 2.0
 8+ (the "License"); you may not use this file except in compliance with
 9+ the License. You may obtain a copy of the License at
 10+
 11+ http://www.apache.org/licenses/LICENSE-2.0
 12+
 13+ Unless required by applicable law or agreed to in writing, software
 14+ distributed under the License is distributed on an "AS IS" BASIS,
 15+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 16+ See the License for the specific language governing permissions and
 17+ limitations under the License.
 18+-->
 19+
 20+<!--
 21+ This is the Solr schema file. This file should be named "schema.xml" and
 22+ should be in the conf directory under the solr home
 23+ (i.e. ./solr/conf/schema.xml by default)
 24+ or located where the classloader for the Solr webapp can find it.
 25+
 26+ This example schema is the recommended starting point for users.
 27+ It should be kept correct and concise, usable out-of-the-box.
 28+
 29+ For more information, on how to customize this file, please see
 30+ http://wiki.apache.org/solr/SchemaXml
 31+
 32+ PERFORMANCE NOTE: this schema includes many optional features and should not
 33+ be used for benchmarking. To improve performance one could
 34+ - set stored="false" for all fields possible (esp large fields) when you
 35+ only need to search on the field but don't need to return the original
 36+ value.
 37+ - set indexed="false" if you don't need to search on the field, but only
 38+ return the field as a result of searching on other indexed fields.
 39+ - remove all unneeded copyField statements
 40+ - for best index size and searching performance, set "index" to false
 41+ for all general text fields, use copyField to copy them to the
 42+ catchall "text" field, and use that for searching.
 43+ - For maximum indexing performance, use the StreamingUpdateSolrServer
 44+ java client.
 45+ - Remember to run the JVM in server mode, and use a higher logging level
 46+ that avoids logging every request
 47+-->
 48+
 49+<schema name="example" version="1.2">
 50+ <!-- attribute "name" is the name of this schema and is only used for display purposes.
 51+ Applications should change this to reflect the nature of the search collection.
 52+ version="1.2" is Solr's version number for the schema syntax and semantics. It should
 53+ not normally be changed by applications.
 54+ 1.0: multiValued attribute did not exist, all fields are multiValued by nature
 55+ 1.1: multiValued attribute introduced, false by default
 56+ 1.2: omitTermFreqAndPositions attribute introduced, true by default except for text fields.
 57+ -->
 58+
 59+ <types>
 60+ <!-- field type definitions. The "name" attribute is
 61+ just a label to be used by field definitions. The "class"
 62+ attribute and any other attributes determine the real
 63+ behavior of the fieldType.
 64+ Class names starting with "solr" refer to java classes in the
 65+ org.apache.solr.analysis package.
 66+ -->
 67+
 68+ <!-- The StrField type is not analyzed, but indexed/stored verbatim.
 69+ - StrField and TextField support an optional compressThreshold which
 70+ limits compression (if enabled in the derived fields) to values which
 71+ exceed a certain size (in characters).
 72+ -->
 73+ <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
 74+
 75+ <!-- boolean type: "true" or "false" -->
 76+ <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/>
 77+ <!--Binary data type. The data should be sent/retrieved in as Base64 encoded Strings -->
 78+ <fieldtype name="binary" class="solr.BinaryField"/>
 79+
 80+ <!-- The optional sortMissingLast and sortMissingFirst attributes are
 81+ currently supported on types that are sorted internally as strings.
 82+ This includes "string","boolean","sint","slong","sfloat","sdouble","pdate"
 83+ - If sortMissingLast="true", then a sort on this field will cause documents
 84+ without the field to come after documents with the field,
 85+ regardless of the requested sort order (asc or desc).
 86+ - If sortMissingFirst="true", then a sort on this field will cause documents
 87+ without the field to come before documents with the field,
 88+ regardless of the requested sort order.
 89+ - If sortMissingLast="false" and sortMissingFirst="false" (the default),
 90+ then default lucene sorting will be used which places docs without the
 91+ field first in an ascending sort and last in a descending sort.
 92+ -->
 93+
 94+ <!--
 95+ Default numeric field types. For faster range queries, consider the tint/tfloat/tlong/tdouble types.
 96+ -->
 97+ <fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
 98+ <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
 99+ <fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
 100+ <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
 101+
 102+ <!--
 103+ Numeric field types that index each value at various levels of precision
 104+ to accelerate range queries when the number of values between the range
 105+ endpoints is large. See the javadoc for NumericRangeQuery for internal
 106+ implementation details.
 107+
 108+ Smaller precisionStep values (specified in bits) will lead to more tokens
 109+ indexed per value, slightly larger index size, and faster range queries.
 110+ A precisionStep of 0 disables indexing at different precision levels.
 111+ -->
 112+ <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
 113+ <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
 114+ <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
 115+ <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
 116+
 117+ <!-- The format for this date field is of the form 1995-12-31T23:59:59Z, and
 118+ is a more restricted form of the canonical representation of dateTime
 119+ http://www.w3.org/TR/xmlschema-2/#dateTime
 120+ The trailing "Z" designates UTC time and is mandatory.
 121+ Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z
 122+ All other components are mandatory.
 123+
 124+ Expressions can also be used to denote calculations that should be
 125+ performed relative to "NOW" to determine the value, ie...
 126+
 127+ NOW/HOUR
 128+ ... Round to the start of the current hour
 129+ NOW-1DAY
 130+ ... Exactly 1 day prior to now
 131+ NOW/DAY+6MONTHS+3DAYS
 132+ ... 6 months and 3 days in the future from the start of
 133+ the current day
 134+
 135+ Consult the DateField javadocs for more information.
 136+
 137+ Note: For faster range queries, consider the tdate type
 138+ -->
 139+ <fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0"/>
 140+
 141+ <!-- A Trie based date field for faster date range queries and date faceting. -->
 142+ <fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6" positionIncrementGap="0"/>
 143+
 144+
 145+ <!--
 146+ Note:
 147+ These should only be used for compatibility with existing indexes (created with older Solr versions)
 148+ or if "sortMissingFirst" or "sortMissingLast" functionality is needed. Use Trie based fields instead.
 149+
 150+ Plain numeric field types that store and index the text
 151+ value verbatim (and hence don't support range queries, since the
 152+ lexicographic ordering isn't equal to the numeric ordering)
 153+ -->
 154+ <fieldType name="pint" class="solr.IntField" omitNorms="true"/>
 155+ <fieldType name="plong" class="solr.LongField" omitNorms="true"/>
 156+ <fieldType name="pfloat" class="solr.FloatField" omitNorms="true"/>
 157+ <fieldType name="pdouble" class="solr.DoubleField" omitNorms="true"/>
 158+ <fieldType name="pdate" class="solr.DateField" sortMissingLast="true" omitNorms="true"/>
 159+
 160+
 161+ <!--
 162+ Note:
 163+ These should only be used for compatibility with existing indexes (created with older Solr versions)
 164+ or if "sortMissingFirst" or "sortMissingLast" functionality is needed. Use Trie based fields instead.
 165+
 166+ Numeric field types that manipulate the value into
 167+ a string value that isn't human-readable in its internal form,
 168+ but with a lexicographic ordering the same as the numeric ordering,
 169+ so that range queries work correctly.
 170+ -->
 171+ <fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>
 172+ <fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="true"/>
 173+ <fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="true"/>
 174+ <fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="true"/>
 175+
 176+
 177+ <!-- The "RandomSortField" is not used to store or search any
 178+ data. You can declare fields of this type it in your schema
 179+ to generate pseudo-random orderings of your docs for sorting
 180+ purposes. The ordering is generated based on the field name
 181+ and the version of the index, As long as the index version
 182+ remains unchanged, and the same field name is reused,
 183+ the ordering of the docs will be consistent.
 184+ If you want different psuedo-random orderings of documents,
 185+ for the same version of the index, use a dynamicField and
 186+ change the name
 187+ -->
 188+ <fieldType name="random" class="solr.RandomSortField" indexed="true" />
 189+
 190+ <!-- solr.TextField allows the specification of custom text analyzers
 191+ specified as a tokenizer and a list of token filters. Different
 192+ analyzers may be specified for indexing and querying.
 193+
 194+ The optional positionIncrementGap puts space between multiple fields of
 195+ this type on the same document, with the purpose of preventing false phrase
 196+ matching across fields.
 197+
 198+ For more info on customizing your analyzer chain, please see
 199+ http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
 200+ -->
 201+
 202+ <!-- One can also specify an existing Analyzer class that has a
 203+ default constructor via the class attribute on the analyzer element
 204+ <fieldType name="text_greek" class="solr.TextField">
 205+ <analyzer class="org.apache.lucene.analysis.el.GreekAnalyzer"/>
 206+ </fieldType>
 207+ -->
 208+
 209+ <!-- A text field that only splits on whitespace for exact matching of words -->
 210+ <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
 211+ <analyzer>
 212+ <tokenizer class="solr.WhitespaceTokenizerFactory"/>
 213+ </analyzer>
 214+ </fieldType>
 215+
 216+ <!-- A text field that uses WordDelimiterFilter to enable splitting and matching of
 217+ words on case-change, alpha numeric boundaries, and non-alphanumeric chars,
 218+ so that a query of "wifi" or "wi fi" could match a document containing "Wi-Fi".
 219+ Synonyms and stopwords are customized by external files, and stemming is enabled.
 220+ -->
 221+ <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
 222+ <analyzer type="index">
 223+ <tokenizer class="solr.WhitespaceTokenizerFactory"/>
 224+ <!-- in this example, we will only use synonyms at query time
 225+ <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
 226+ -->
 227+ <!-- Case insensitive stop word removal.
 228+ add enablePositionIncrements=true in both the index and query
 229+ analyzers to leave a 'gap' for more accurate phrase queries.
 230+ -->
 231+ <filter class="solr.StopFilterFactory"
 232+ ignoreCase="true"
 233+ words="stopwords.txt"
 234+ enablePositionIncrements="true"
 235+ />
 236+ <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
 237+ <filter class="solr.LowerCaseFilterFactory"/>
 238+ <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
 239+ </analyzer>
 240+ <analyzer type="query">
 241+ <tokenizer class="solr.WhitespaceTokenizerFactory"/>
 242+ <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
 243+ <filter class="solr.StopFilterFactory"
 244+ ignoreCase="true"
 245+ words="stopwords.txt"
 246+ enablePositionIncrements="true"
 247+ />
 248+ <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
 249+ <filter class="solr.LowerCaseFilterFactory"/>
 250+ <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
 251+ </analyzer>
 252+ </fieldType>
 253+
 254+
 255+ <!-- Less flexible matching, but less false matches. Probably not ideal for product names,
 256+ but may be good for SKUs. Can insert dashes in the wrong place and still match. -->
 257+ <fieldType name="textTight" class="solr.TextField" positionIncrementGap="100" >
 258+ <analyzer>
 259+ <tokenizer class="solr.WhitespaceTokenizerFactory"/>
 260+ <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
 261+ <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
 262+ <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
 263+ <filter class="solr.LowerCaseFilterFactory"/>
 264+ <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
 265+ <!-- this filter can remove any duplicate tokens that appear at the same position - sometimes
 266+ possible with WordDelimiterFilter in conjuncton with stemming. -->
 267+ <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
 268+ </analyzer>
 269+ </fieldType>
 270+
 271+
 272+ <!-- A general unstemmed text field - good if one does not know the language of the field -->
 273+ <fieldType name="textgen" class="solr.TextField" positionIncrementGap="100">
 274+ <analyzer type="index">
 275+ <tokenizer class="solr.WhitespaceTokenizerFactory"/>
 276+ <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
 277+ <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/>
 278+ <filter class="solr.LowerCaseFilterFactory"/>
 279+ </analyzer>
 280+ <analyzer type="query">
 281+ <tokenizer class="solr.WhitespaceTokenizerFactory"/>
 282+ <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
 283+ <filter class="solr.StopFilterFactory"
 284+ ignoreCase="true"
 285+ words="stopwords.txt"
 286+ enablePositionIncrements="true"
 287+ />
 288+ <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
 289+ <filter class="solr.LowerCaseFilterFactory"/>
 290+ </analyzer>
 291+ </fieldType>
 292+
 293+
 294+ <!-- A general unstemmed text field that indexes tokens normally and also
 295+ reversed (via ReversedWildcardFilterFactory), to enable more efficient
 296+ leading wildcard queries. -->
 297+ <fieldType name="text_rev" class="solr.TextField" positionIncrementGap="100">
 298+ <analyzer type="index">
 299+ <tokenizer class="solr.WhitespaceTokenizerFactory"/>
 300+ <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
 301+ <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/>
 302+ <filter class="solr.LowerCaseFilterFactory"/>
 303+ <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true"
 304+ maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/>
 305+ </analyzer>
 306+ <analyzer type="query">
 307+ <tokenizer class="solr.WhitespaceTokenizerFactory"/>
 308+ <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
 309+ <filter class="solr.StopFilterFactory"
 310+ ignoreCase="true"
 311+ words="stopwords.txt"
 312+ enablePositionIncrements="true"
 313+ />
 314+ <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
 315+ <filter class="solr.LowerCaseFilterFactory"/>
 316+ </analyzer>
 317+ </fieldType>
 318+
 319+ <!-- charFilter + WhitespaceTokenizer -->
 320+ <!--
 321+ <fieldType name="textCharNorm" class="solr.TextField" positionIncrementGap="100" >
 322+ <analyzer>
 323+ <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
 324+ <tokenizer class="solr.WhitespaceTokenizerFactory"/>
 325+ </analyzer>
 326+ </fieldType>
 327+ -->
 328+
 329+ <!-- This is an example of using the KeywordTokenizer along
 330+ With various TokenFilterFactories to produce a sortable field
 331+ that does not include some properties of the source text
 332+ -->
 333+ <fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
 334+ <analyzer>
 335+ <!-- KeywordTokenizer does no actual tokenizing, so the entire
 336+ input string is preserved as a single token
 337+ -->
 338+ <tokenizer class="solr.KeywordTokenizerFactory"/>
 339+ <!-- The LowerCase TokenFilter does what you expect, which can be
 340+ when you want your sorting to be case insensitive
 341+ -->
 342+ <filter class="solr.LowerCaseFilterFactory" />
 343+ <!-- The TrimFilter removes any leading or trailing whitespace -->
 344+ <filter class="solr.TrimFilterFactory" />
 345+ <!-- The PatternReplaceFilter gives you the flexibility to use
 346+ Java Regular expression to replace any sequence of characters
 347+ matching a pattern with an arbitrary replacement string,
 348+ which may include back references to portions of the original
 349+ string matched by the pattern.
 350+
 351+ See the Java Regular Expression documentation for more
 352+ information on pattern and replacement string syntax.
 353+
 354+ http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/package-summary.html
 355+ -->
 356+ <filter class="solr.PatternReplaceFilterFactory"
 357+ pattern="([^a-z])" replacement="" replace="all"
 358+ />
 359+ </analyzer>
 360+ </fieldType>
 361+
 362+ <fieldtype name="phonetic" stored="false" indexed="true" class="solr.TextField" >
 363+ <analyzer>
 364+ <tokenizer class="solr.StandardTokenizerFactory"/>
 365+ <filter class="solr.DoubleMetaphoneFilterFactory" inject="false"/>
 366+ </analyzer>
 367+ </fieldtype>
 368+
 369+ <fieldtype name="payloads" stored="false" indexed="true" class="solr.TextField" >
 370+ <analyzer>
 371+ <tokenizer class="solr.WhitespaceTokenizerFactory"/>
 372+ <!--
 373+ The DelimitedPayloadTokenFilter can put payloads on tokens... for example,
 374+ a token of "foo|1.4" would be indexed as "foo" with a payload of 1.4f
 375+ Attributes of the DelimitedPayloadTokenFilterFactory :
 376+ "delimiter" - a one character delimiter. Default is | (pipe)
 377+ "encoder" - how to encode the following value into a playload
 378+ float -> org.apache.lucene.analysis.payloads.FloatEncoder,
 379+ integer -> o.a.l.a.p.IntegerEncoder
 380+ identity -> o.a.l.a.p.IdentityEncoder
 381+ Fully Qualified class name implementing PayloadEncoder, Encoder must have a no arg constructor.
 382+ -->
 383+ <filter class="solr.DelimitedPayloadTokenFilterFactory" encoder="float"/>
 384+ </analyzer>
 385+ </fieldtype>
 386+
 387+ <!-- lowercases the entire field value, keeping it as a single token. -->
 388+ <fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">
 389+ <analyzer>
 390+ <tokenizer class="solr.KeywordTokenizerFactory"/>
 391+ <filter class="solr.LowerCaseFilterFactory" />
 392+ </analyzer>
 393+ </fieldType>
 394+
 395+
 396+ <!-- Case Insensitive String-->
 397+ <fieldType name="string_ci" class="solr.TextField"
 398+ sortMissingLast="true" omitNorms="true">
 399+ <analyzer>
 400+ <tokenizer class="solr.LowerCaseTokenizerFactory"/>
 401+ <filter class="solr.LowerCaseFilterFactory" />
 402+ </analyzer>
 403+ </fieldType>
 404+
 405+ <!-- since fields of this type are by default not stored or indexed,
 406+ any data added to them will be ignored outright. -->
 407+ <fieldtype name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField" />
 408+
 409+ </types>
 410+
 411+
 412+ <fields>
 413+ <!-- Valid attributes for fields:
 414+ name: mandatory - the name for the field
 415+ type: mandatory - the name of a previously defined type from the
 416+ <types> section
 417+ indexed: true if this field should be indexed (searchable or sortable)
 418+ stored: true if this field should be retrievable
 419+ compressed: [false] if this field should be stored using gzip compression
 420+ (this will only apply if the field type is compressable; among
 421+ the standard field types, only TextField and StrField are)
 422+ multiValued: true if this field may contain multiple values per document
 423+ omitNorms: (expert) set to true to omit the norms associated with
 424+ this field (this disables length normalization and index-time
 425+ boosting for the field, and saves some memory). Only full-text
 426+ fields or fields that need an index-time boost need norms.
 427+ termVectors: [false] set to true to store the term vector for a
 428+ given field.
 429+ When using MoreLikeThis, fields used for similarity should be
 430+ stored for best performance.
 431+ termPositions: Store position information with the term vector.
 432+ This will increase storage costs.
 433+ termOffsets: Store offset information with the term vector. This
 434+ will increase storage costs.
 435+ default: a value that should be used if no value is specified
 436+ when adding a document.
 437+ -->
 438+
 439+ <field name="pagetitle" type="string" indexed="true" stored="true" required="true" />
 440+ <field name="interwiki" type="string" indexed="true" stored="true" />
 441+ <field name="dbkey" type="string" indexed="true" stored="true" required="true" />
 442+ <field name="subobjectname" type="string" indexed="true" stored="true" />
 443+ <field name="namespace" type="int" indexed="true" stored="true" required="true" />
 444+
 445+ <field name="titleen" type="text" indexed="true" stored="true" />
 446+ <field name="name" type="text" indexed="true" stored="true" />
 447+ <field name="von" type="date" indexed="true" stored="true" />
 448+ <field name="bis" type="date" indexed="true" stored="true" />
 449+ <field name="category" type="text" indexed="true" stored="true" />
 450+ <field name="id" type="sint" indexed="true" stored="true" />
 451+ <field name="institution" type="text" indexed="true" stored="true" multiValued="true"/>
 452+ <field name="person" type="text" indexed="true" stored="true" multiValued="true"/>
 453+ <field name="inhaltde" type="text" indexed="true" stored="true"/>
 454+ <field name="inhalten" type="text" indexed="true" stored="true"/>
 455+ <field name="inhaltfr" type="text" indexed="true" stored="true"/>
 456+ <field name="stichworte" type="text" indexed="true" stored="true" multiValued="true"/>
 457+ <field name="schlagworte" type="text" indexed="true" stored="true" multiValued="true"/>
 458+ <field name="rnr" type="sint" indexed="true" stored="true" multiValued="true"/>
 459+ <field name="orgtyp" type="text" indexed="true" stored="true"/>
 460+ <field name="shortname" type="text" indexed="true" stored="true"/>
 461+ <field name="subject" type="text" indexed="true" stored="true"/>
 462+ <field name="homepage" type="text" indexed="true" stored="true"/>
 463+ <field name="ort" type="text" indexed="true" stored="true"/>
 464+ <field name="land" type="text" indexed="true" stored="true"/>
 465+ <field name="maindept" type="text" indexed="true" stored="true"/>
 466+ <field name="higherdept" type="text" indexed="true" stored="true"/>
 467+ <field name="text" type="text" indexed="true" stored="true" multiValued="true"/>
 468+
 469+
 470+ <!-- Common metadata fields, named specifically to match up with
 471+ SolrCell metadata when parsing rich documents such as Word, PDF.
 472+ Some fields are multiValued only because Tika currently may return
 473+ multiple values for them.
 474+ -->
 475+ <field name="title" type="text" indexed="true" stored="true" multiValued="true"/>
 476+ <field name="description" type="text" indexed="true" stored="true"/>
 477+ <field name="comments" type="text" indexed="true" stored="true"/>
 478+ <field name="author" type="textgen" indexed="true" stored="true"/>
 479+ <field name="keywords" type="textgen" indexed="true" stored="true"/>
 480+ <field name="content_type" type="string" indexed="true" stored="true" multiValued="true"/>
 481+ <field name="last_modified" type="date" indexed="true" stored="true"/>
 482+ <field name="links" type="string" indexed="true" stored="true" multiValued="true"/>
 483+
 484+
 485+ <!-- catchall field, containing all other searchable text fields (implemented
 486+ via copyField further on in this schema -->
 487+ <!-- <field name="text" type="text" indexed="true" stored="false" multiValued="true"/>
 488+-->
 489+ <!-- catchall text field that indexes tokens both normally and in reverse for efficient
 490+ leading wildcard queries. -->
 491+ <field name="text_rev" type="text_rev" indexed="true" stored="false" multiValued="true"/>
 492+
 493+ <!-- non-tokenized version of manufacturer to make it easier to sort or group
 494+ results by manufacturer. copied from "manu" via copyField -->
 495+ <field name="manu_exact" type="string" indexed="true" stored="false"/>
 496+
 497+ <field name="payloads" type="payloads" indexed="true" stored="true"/>
 498+
 499+ <!-- Uncommenting the following will create a "timestamp" field using
 500+ a default value of "NOW" to indicate when each document was indexed.
 501+ -->
 502+ <!--
 503+ <field name="timestamp" type="date" indexed="true" stored="true" default="NOW" multiValued="false"/>
 504+ -->
 505+
 506+
 507+ <!-- Dynamic field definitions. If a field name is not found, dynamicFields
 508+ will be used if the name matches any of the patterns.
 509+ RESTRICTION: the glob-like pattern in the name attribute must have
 510+ a "*" only at the start or the end.
 511+ EXAMPLE: name="*_i" will match any field ending in _i (like myid_i, z_i)
 512+ Longer patterns will be matched first. if equal size patterns
 513+ both match, the first appearing in the schema will be used. -->
 514+ <dynamicField name="*_i" type="int" indexed="true" stored="true" multiValued="true"/>
 515+ <dynamicField name="*_s" type="string_ci" indexed="true" stored="true" multiValued="true"/>
 516+ <dynamicField name="*_l" type="long" indexed="true" stored="true" multiValued="true"/>
 517+ <dynamicField name="*_t" type="text" indexed="true" stored="true" multiValued="true"/>
 518+ <dynamicField name="*_b" type="boolean" indexed="true" stored="true" multiValued="true"/>
 519+ <dynamicField name="*_f" type="float" indexed="true" stored="true" multiValued="true"/>
 520+ <dynamicField name="*_d" type="double" indexed="true" stored="true" multiValued="true"/>
 521+ <dynamicField name="*_dt" type="date" indexed="true" stored="true" multiValued="true"/>
 522+
 523+ <!-- Fields need for Sorting Multivalued Fields -->
 524+ <dynamicField name="*_tmin" type="alphaOnlySort" indexed="true" />
 525+ <dynamicField name="*_tmax" type="alphaOnlySort" indexed="true" />
 526+ <dynamicField name="*_smin" type="alphaOnlySort" indexed="true" />
 527+ <dynamicField name="*_smax" type="alphaOnlySort" indexed="true" />
 528+ <dynamicField name="*_imin" type="int" indexed="true" />
 529+ <dynamicField name="*_imax" type="int" indexed="true" />
 530+ <dynamicField name="*_dtmin" type="date" indexed="true"/>
 531+ <dynamicField name="*_dtmax" type="date" indexed="true"/>
 532+
 533+
 534+ <!-- some trie-coded dynamic fields for faster range queries -->
 535+ <dynamicField name="*_ti" type="tint" indexed="true" stored="true" />
 536+ <dynamicField name="*_tl" type="tlong" indexed="true" stored="true" />
 537+ <dynamicField name="*_tf" type="tfloat" indexed="true" stored="true" />
 538+ <dynamicField name="*_td" type="tdouble" indexed="true" stored="true" />
 539+ <dynamicField name="*_tdt" type="tdate" indexed="true" stored="true" />
 540+
 541+ <!-- Geo Coordinates -->
 542+ <dynamicField name="*_lat" type="sdouble" indexed="true" stored="true" />
 543+ <dynamicField name="*_lng" type="sdouble" indexed="true" stored="true" />
 544+
 545+ <dynamicField name="*_pi" type="pint" indexed="true" stored="true" />
 546+
 547+ <dynamicField name="ignored_*" type="ignored" multiValued="true"/>
 548+ <dynamicField name="attr_*" type="textgen" indexed="true" stored="true" />
 549+
 550+ <dynamicField name="random_*" type="random" />
 551+
 552+ <!-- uncomment the following to ignore any fields that don't already match an existing
 553+ field name or dynamic field, rather than reporting them as an error.
 554+ alternately, change the type="ignored" to some other type e.g. "text" if you want
 555+ unknown fields indexed and/or stored by default -->
 556+ <!--dynamicField name="*" type="ignored" multiValued="true" /-->
 557+
 558+ </fields>
 559+
 560+ <!-- Field to use to determine and enforce document uniqueness.
 561+ Unless this field is marked with required="false", it will be a required field
 562+ -->
 563+ <uniqueKey>pagetitle</uniqueKey>
 564+
 565+ <!-- field for the QueryParser to use when an explicit fieldname is absent -->
 566+ <defaultSearchField>text</defaultSearchField>
 567+
 568+ <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
 569+ <solrQueryParser defaultOperator="OR"/>
 570+
 571+ <!-- copyField commands copy one field to another at the time a document
 572+ is added to the index. It's used either to index the same field differently,
 573+ or to add multiple fields to the same field for easier/faster searching. -->
 574+<!--
 575+ <copyField source="cat" dest="text"/>
 576+ <copyField source="name" dest="text"/>
 577+ <copyField source="manu" dest="text"/>
 578+ <copyField source="features" dest="text"/>
 579+ <copyField source="includes" dest="text"/>
 580+ <copyField source="manu" dest="manu_exact"/>
 581+-->
 582+ <!-- Above, multiple source fields are copied to the [text] field.
 583+ Another way to map multiple source fields to the same
 584+ destination field is to use the dynamic field syntax.
 585+ copyField also supports a maxChars to copy setting. -->
 586+
 587+ <copyField source="*" dest="text" maxChars="5000"/>
 588+ <copyField source="pagetitle" dest="title"/>
 589+
 590+ <!-- copy name to alphaNameSort, a field designed for sorting by name -->
 591+ <!-- <copyField source="name" dest="alphaNameSort"/> -->
 592+
 593+
 594+ <!-- Similarity is the scoring routine for each document vs. a query.
 595+ A custom similarity may be specified here, but the default is fine
 596+ for most applications. -->
 597+ <!-- <similarity class="org.apache.lucene.search.DefaultSimilarity"/> -->
 598+ <!-- ... OR ...
 599+ Specify a SimilarityFactory class name implementation
 600+ allowing parameters to be used.
 601+ -->
 602+ <!--
 603+ <similarity class="com.example.solr.CustomSimilarityFactory">
 604+ <str name="paramkey">param value</str>
 605+ </similarity>
 606+ -->
 607+
 608+
 609+</schema>
Property changes on: trunk/extensions/SolrStore/solr-example/core0/conf/schema.xml
___________________________________________________________________
Added: svn:eol-style
606610 + native
Index: trunk/extensions/SolrStore/solr-example/core0/conf/protwords.txt
@@ -1,21 +1,21 @@
2 -# The ASF licenses this file to You under the Apache License, Version 2.0
3 -# (the "License"); you may not use this file except in compliance with
4 -# the License. You may obtain a copy of the License at
5 -#
6 -# http://www.apache.org/licenses/LICENSE-2.0
7 -#
8 -# Unless required by applicable law or agreed to in writing, software
9 -# distributed under the License is distributed on an "AS IS" BASIS,
10 -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 -# See the License for the specific language governing permissions and
12 -# limitations under the License.
13 -
14 -#-----------------------------------------------------------------------
15 -# Use a protected word file to protect against the stemmer reducing two
16 -# unrelated words to the same base word.
17 -
18 -# Some non-words that normally won't be encountered,
19 -# just to test that they won't be stemmed.
20 -dontstems
21 -zwhacky
22 -
 2+# The ASF licenses this file to You under the Apache License, Version 2.0
 3+# (the "License"); you may not use this file except in compliance with
 4+# the License. You may obtain a copy of the License at
 5+#
 6+# http://www.apache.org/licenses/LICENSE-2.0
 7+#
 8+# Unless required by applicable law or agreed to in writing, software
 9+# distributed under the License is distributed on an "AS IS" BASIS,
 10+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 11+# See the License for the specific language governing permissions and
 12+# limitations under the License.
 13+
 14+#-----------------------------------------------------------------------
 15+# Use a protected word file to protect against the stemmer reducing two
 16+# unrelated words to the same base word.
 17+
 18+# Some non-words that normally won't be encountered,
 19+# just to test that they won't be stemmed.
 20+dontstems
 21+zwhacky
 22+
Property changes on: trunk/extensions/SolrStore/solr-example/core0/conf/protwords.txt
___________________________________________________________________
Added: svn:eol-style
2323 + native
Index: trunk/extensions/SolrStore/solr-example/core0/conf/stopwords.txt
@@ -1,58 +1,58 @@
2 -# Licensed to the Apache Software Foundation (ASF) under one or more
3 -# contributor license agreements. See the NOTICE file distributed with
4 -# this work for additional information regarding copyright ownership.
5 -# The ASF licenses this file to You under the Apache License, Version 2.0
6 -# (the "License"); you may not use this file except in compliance with
7 -# the License. You may obtain a copy of the License at
8 -#
9 -# http://www.apache.org/licenses/LICENSE-2.0
10 -#
11 -# Unless required by applicable law or agreed to in writing, software
12 -# distributed under the License is distributed on an "AS IS" BASIS,
13 -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 -# See the License for the specific language governing permissions and
15 -# limitations under the License.
16 -
17 -#-----------------------------------------------------------------------
18 -# a couple of test stopwords to test that the words are really being
19 -# configured from this file:
20 -stopworda
21 -stopwordb
22 -
23 -#Standard english stop words taken from Lucene's StopAnalyzer
24 -a
25 -an
26 -and
27 -are
28 -as
29 -at
30 -be
31 -but
32 -by
33 -for
34 -if
35 -in
36 -into
37 -is
38 -it
39 -no
40 -not
41 -of
42 -on
43 -or
44 -s
45 -such
46 -t
47 -that
48 -the
49 -their
50 -then
51 -there
52 -these
53 -they
54 -this
55 -to
56 -was
57 -will
58 -with
59 -
 2+# Licensed to the Apache Software Foundation (ASF) under one or more
 3+# contributor license agreements. See the NOTICE file distributed with
 4+# this work for additional information regarding copyright ownership.
 5+# The ASF licenses this file to You under the Apache License, Version 2.0
 6+# (the "License"); you may not use this file except in compliance with
 7+# the License. You may obtain a copy of the License at
 8+#
 9+# http://www.apache.org/licenses/LICENSE-2.0
 10+#
 11+# Unless required by applicable law or agreed to in writing, software
 12+# distributed under the License is distributed on an "AS IS" BASIS,
 13+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 14+# See the License for the specific language governing permissions and
 15+# limitations under the License.
 16+
 17+#-----------------------------------------------------------------------
 18+# a couple of test stopwords to test that the words are really being
 19+# configured from this file:
 20+stopworda
 21+stopwordb
 22+
 23+#Standard english stop words taken from Lucene's StopAnalyzer
 24+a
 25+an
 26+and
 27+are
 28+as
 29+at
 30+be
 31+but
 32+by
 33+for
 34+if
 35+in
 36+into
 37+is
 38+it
 39+no
 40+not
 41+of
 42+on
 43+or
 44+s
 45+such
 46+t
 47+that
 48+the
 49+their
 50+then
 51+there
 52+these
 53+they
 54+this
 55+to
 56+was
 57+will
 58+with
 59+
Property changes on: trunk/extensions/SolrStore/solr-example/core0/conf/stopwords.txt
___________________________________________________________________
Added: svn:eol-style
6060 + native
Index: trunk/extensions/SolrStore/solr-example/core0/conf/solrconfig.xml
@@ -1,46 +1,46 @@
2 -<?xml version="1.0" encoding="UTF-8" ?>
3 -<!--
4 - Licensed to the Apache Software Foundation (ASF) under one or more
5 - contributor license agreements. See the NOTICE file distributed with
6 - this work for additional information regarding copyright ownership.
7 - The ASF licenses this file to You under the Apache License, Version 2.0
8 - (the "License"); you may not use this file except in compliance with
9 - the License. You may obtain a copy of the License at
10 -
11 - http://www.apache.org/licenses/LICENSE-2.0
12 -
13 - Unless required by applicable law or agreed to in writing, software
14 - distributed under the License is distributed on an "AS IS" BASIS,
15 - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 - See the License for the specific language governing permissions and
17 - limitations under the License.
18 -
19 -<!--
20 - This is a stripped down config file used for a simple example...
21 - It is *not* a good example to work from.
22 -<config>
23 - <luceneMatchVersion>LUCENE_35</luceneMatchVersion>
24 - <!-- The DirectoryFactory to use for indexes.
25 - solr.StandardDirectoryFactory, the default, is filesystem based.
26 - solr.RAMDirectoryFactory is memory based, not persistent, and doesn't work with replication. -->
27 - <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/>
28 -
29 - <updateHandler class="solr.DirectUpdateHandler2" />
30 -
31 - <requestDispatcher handleSelect="true" >
32 - <requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" />
33 - </requestDispatcher>
34 -
35 - <requestHandler name="standard" class="solr.StandardRequestHandler" default="true" />
36 - <requestHandler name="/update" class="solr.XmlUpdateRequestHandler" />
37 - <requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" />
38 -
39 - <!-- config for the admin interface -->
40 - <admin>
41 - <defaultQuery>solr</defaultQuery>
42 - </admin>
43 -
44 -</config>
45 -
 2+<?xml version="1.0" encoding="UTF-8" ?>
 3+<!--
 4+ Licensed to the Apache Software Foundation (ASF) under one or more
 5+ contributor license agreements. See the NOTICE file distributed with
 6+ this work for additional information regarding copyright ownership.
 7+ The ASF licenses this file to You under the Apache License, Version 2.0
 8+ (the "License"); you may not use this file except in compliance with
 9+ the License. You may obtain a copy of the License at
 10+
 11+ http://www.apache.org/licenses/LICENSE-2.0
 12+
 13+ Unless required by applicable law or agreed to in writing, software
 14+ distributed under the License is distributed on an "AS IS" BASIS,
 15+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 16+ See the License for the specific language governing permissions and
 17+ limitations under the License.
 18+-->
 19+
 20+<!--
 21+ This is a stripped down config file used for a simple example...
 22+ It is *not* a good example to work from.
 23+-->
 24+<config>
 25+ <luceneMatchVersion>LUCENE_35</luceneMatchVersion>
 26+ <!-- The DirectoryFactory to use for indexes.
 27+ solr.StandardDirectoryFactory, the default, is filesystem based.
 28+ solr.RAMDirectoryFactory is memory based, not persistent, and doesn't work with replication. -->
 29+ <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/>
 30+
 31+ <updateHandler class="solr.DirectUpdateHandler2" />
 32+
 33+ <requestDispatcher handleSelect="true" >
 34+ <requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" />
 35+ </requestDispatcher>
 36+
 37+ <requestHandler name="standard" class="solr.StandardRequestHandler" default="true" />
 38+ <requestHandler name="/update" class="solr.XmlUpdateRequestHandler" />
 39+ <requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" />
 40+
 41+ <!-- config for the admin interface -->
 42+ <admin>
 43+ <defaultQuery>solr</defaultQuery>
 44+ </admin>
 45+
 46+</config>
 47+
Property changes on: trunk/extensions/SolrStore/solr-example/core0/conf/solrconfig.xml
___________________________________________________________________
Added: svn:eol-style
4648 + native
Index: trunk/extensions/SolrStore/solr-example/core0/conf/stopwords_en.txt
@@ -1,54 +1,54 @@
2 -# Licensed to the Apache Software Foundation (ASF) under one or more
3 -# contributor license agreements. See the NOTICE file distributed with
4 -# this work for additional information regarding copyright ownership.
5 -# The ASF licenses this file to You under the Apache License, Version 2.0
6 -# (the "License"); you may not use this file except in compliance with
7 -# the License. You may obtain a copy of the License at
8 -#
9 -# http://www.apache.org/licenses/LICENSE-2.0
10 -#
11 -# Unless required by applicable law or agreed to in writing, software
12 -# distributed under the License is distributed on an "AS IS" BASIS,
13 -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 -# See the License for the specific language governing permissions and
15 -# limitations under the License.
16 -
17 -# a couple of test stopwords to test that the words are really being
18 -# configured from this file:
19 -stopworda
20 -stopwordb
21 -
22 -# Standard english stop words taken from Lucene's StopAnalyzer
23 -a
24 -an
25 -and
26 -are
27 -as
28 -at
29 -be
30 -but
31 -by
32 -for
33 -if
34 -in
35 -into
36 -is
37 -it
38 -no
39 -not
40 -of
41 -on
42 -or
43 -such
44 -that
45 -the
46 -their
47 -then
48 -there
49 -these
50 -they
51 -this
52 -to
53 -was
54 -will
55 -with
 2+# Licensed to the Apache Software Foundation (ASF) under one or more
 3+# contributor license agreements. See the NOTICE file distributed with
 4+# this work for additional information regarding copyright ownership.
 5+# The ASF licenses this file to You under the Apache License, Version 2.0
 6+# (the "License"); you may not use this file except in compliance with
 7+# the License. You may obtain a copy of the License at
 8+#
 9+# http://www.apache.org/licenses/LICENSE-2.0
 10+#
 11+# Unless required by applicable law or agreed to in writing, software
 12+# distributed under the License is distributed on an "AS IS" BASIS,
 13+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 14+# See the License for the specific language governing permissions and
 15+# limitations under the License.
 16+
 17+# a couple of test stopwords to test that the words are really being
 18+# configured from this file:
 19+stopworda
 20+stopwordb
 21+
 22+# Standard english stop words taken from Lucene's StopAnalyzer
 23+a
 24+an
 25+and
 26+are
 27+as
 28+at
 29+be
 30+but
 31+by
 32+for
 33+if
 34+in
 35+into
 36+is
 37+it
 38+no
 39+not
 40+of
 41+on
 42+or
 43+such
 44+that
 45+the
 46+their
 47+then
 48+there
 49+these
 50+they
 51+this
 52+to
 53+was
 54+will
 55+with
Property changes on: trunk/extensions/SolrStore/solr-example/core0/conf/stopwords_en.txt
___________________________________________________________________
Added: svn:eol-style
5656 + native
Index: trunk/extensions/SolrStore/solr-example/core0/conf/mapping-FoldToASCII.txt
@@ -1,3813 +1,3813 @@
2 -# The ASF licenses this file to You under the Apache License, Version 2.0
3 -# (the "License"); you may not use this file except in compliance with
4 -# the License. You may obtain a copy of the License at
5 -#
6 -# http://www.apache.org/licenses/LICENSE-2.0
7 -#
8 -# Unless required by applicable law or agreed to in writing, software
9 -# distributed under the License is distributed on an "AS IS" BASIS,
10 -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 -# See the License for the specific language governing permissions and
12 -# limitations under the License.
13 -
14 -
15 -# This map converts alphabetic, numeric, and symbolic Unicode characters
16 -# which are not in the first 127 ASCII characters (the "Basic Latin" Unicode
17 -# block) into their ASCII equivalents, if one exists.
18 -#
19 -# Characters from the following Unicode blocks are converted; however, only
20 -# those characters with reasonable ASCII alternatives are converted:
21 -#
22 -# - C1 Controls and Latin-1 Supplement: http://www.unicode.org/charts/PDF/U0080.pdf
23 -# - Latin Extended-A: http://www.unicode.org/charts/PDF/U0100.pdf
24 -# - Latin Extended-B: http://www.unicode.org/charts/PDF/U0180.pdf
25 -# - Latin Extended Additional: http://www.unicode.org/charts/PDF/U1E00.pdf
26 -# - Latin Extended-C: http://www.unicode.org/charts/PDF/U2C60.pdf
27 -# - Latin Extended-D: http://www.unicode.org/charts/PDF/UA720.pdf
28 -# - IPA Extensions: http://www.unicode.org/charts/PDF/U0250.pdf
29 -# - Phonetic Extensions: http://www.unicode.org/charts/PDF/U1D00.pdf
30 -# - Phonetic Extensions Supplement: http://www.unicode.org/charts/PDF/U1D80.pdf
31 -# - General Punctuation: http://www.unicode.org/charts/PDF/U2000.pdf
32 -# - Superscripts and Subscripts: http://www.unicode.org/charts/PDF/U2070.pdf
33 -# - Enclosed Alphanumerics: http://www.unicode.org/charts/PDF/U2460.pdf
34 -# - Dingbats: http://www.unicode.org/charts/PDF/U2700.pdf
35 -# - Supplemental Punctuation: http://www.unicode.org/charts/PDF/U2E00.pdf
36 -# - Alphabetic Presentation Forms: http://www.unicode.org/charts/PDF/UFB00.pdf
37 -# - Halfwidth and Fullwidth Forms: http://www.unicode.org/charts/PDF/UFF00.pdf
38 -#
39 -# See: http://en.wikipedia.org/wiki/Latin_characters_in_Unicode
40 -#
41 -# The set of character conversions supported by this map is a superset of
42 -# those supported by the map represented by mapping-ISOLatin1Accent.txt.
43 -#
44 -# See the bottom of this file for the Perl script used to generate the contents
45 -# of this file (without this header) from ASCIIFoldingFilter.java.
46 -
47 -
48 -# Syntax:
49 -# "source" => "target"
50 -# "source".length() > 0 (source cannot be empty.)
51 -# "target".length() >= 0 (target can be empty.)
52 -
53 -
54 -# À [LATIN CAPITAL LETTER A WITH GRAVE]
55 -"\u00C0" => "A"
56 -
57 -# Á [LATIN CAPITAL LETTER A WITH ACUTE]
58 -"\u00C1" => "A"
59 -
60 -# Â [LATIN CAPITAL LETTER A WITH CIRCUMFLEX]
61 -"\u00C2" => "A"
62 -
63 -# Ã [LATIN CAPITAL LETTER A WITH TILDE]
64 -"\u00C3" => "A"
65 -
66 -# Ä [LATIN CAPITAL LETTER A WITH DIAERESIS]
67 -"\u00C4" => "A"
68 -
69 -# Å [LATIN CAPITAL LETTER A WITH RING ABOVE]
70 -"\u00C5" => "A"
71 -
72 -# Ā [LATIN CAPITAL LETTER A WITH MACRON]
73 -"\u0100" => "A"
74 -
75 -# Ă [LATIN CAPITAL LETTER A WITH BREVE]
76 -"\u0102" => "A"
77 -
78 -# Ą [LATIN CAPITAL LETTER A WITH OGONEK]
79 -"\u0104" => "A"
80 -
81 -# Ə http://en.wikipedia.org/wiki/Schwa [LATIN CAPITAL LETTER SCHWA]
82 -"\u018F" => "A"
83 -
84 -# Ǎ [LATIN CAPITAL LETTER A WITH CARON]
85 -"\u01CD" => "A"
86 -
87 -# Ǟ [LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON]
88 -"\u01DE" => "A"
89 -
90 -# Ǡ [LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON]
91 -"\u01E0" => "A"
92 -
93 -# Ǻ [LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE]
94 -"\u01FA" => "A"
95 -
96 -# Ȁ [LATIN CAPITAL LETTER A WITH DOUBLE GRAVE]
97 -"\u0200" => "A"
98 -
99 -# Ȃ [LATIN CAPITAL LETTER A WITH INVERTED BREVE]
100 -"\u0202" => "A"
101 -
102 -# Ȧ [LATIN CAPITAL LETTER A WITH DOT ABOVE]
103 -"\u0226" => "A"
104 -
105 -# Ⱥ [LATIN CAPITAL LETTER A WITH STROKE]
106 -"\u023A" => "A"
107 -
108 -# ᴀ [LATIN LETTER SMALL CAPITAL A]
109 -"\u1D00" => "A"
110 -
111 -# Ḁ [LATIN CAPITAL LETTER A WITH RING BELOW]
112 -"\u1E00" => "A"
113 -
114 -# Ạ [LATIN CAPITAL LETTER A WITH DOT BELOW]
115 -"\u1EA0" => "A"
116 -
117 -# Ả [LATIN CAPITAL LETTER A WITH HOOK ABOVE]
118 -"\u1EA2" => "A"
119 -
120 -# Ấ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE]
121 -"\u1EA4" => "A"
122 -
123 -# Ầ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE]
124 -"\u1EA6" => "A"
125 -
126 -# Ẩ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE]
127 -"\u1EA8" => "A"
128 -
129 -# Ẫ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE]
130 -"\u1EAA" => "A"
131 -
132 -# Ậ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW]
133 -"\u1EAC" => "A"
134 -
135 -# Ắ [LATIN CAPITAL LETTER A WITH BREVE AND ACUTE]
136 -"\u1EAE" => "A"
137 -
138 -# Ằ [LATIN CAPITAL LETTER A WITH BREVE AND GRAVE]
139 -"\u1EB0" => "A"
140 -
141 -# Ẳ [LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE]
142 -"\u1EB2" => "A"
143 -
144 -# Ẵ [LATIN CAPITAL LETTER A WITH BREVE AND TILDE]
145 -"\u1EB4" => "A"
146 -
147 -# Ặ [LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW]
148 -"\u1EB6" => "A"
149 -
150 -# Ⓐ [CIRCLED LATIN CAPITAL LETTER A]
151 -"\u24B6" => "A"
152 -
153 -# A [FULLWIDTH LATIN CAPITAL LETTER A]
154 -"\uFF21" => "A"
155 -
156 -# à [LATIN SMALL LETTER A WITH GRAVE]
157 -"\u00E0" => "a"
158 -
159 -# á [LATIN SMALL LETTER A WITH ACUTE]
160 -"\u00E1" => "a"
161 -
162 -# â [LATIN SMALL LETTER A WITH CIRCUMFLEX]
163 -"\u00E2" => "a"
164 -
165 -# ã [LATIN SMALL LETTER A WITH TILDE]
166 -"\u00E3" => "a"
167 -
168 -# ä [LATIN SMALL LETTER A WITH DIAERESIS]
169 -"\u00E4" => "a"
170 -
171 -# å [LATIN SMALL LETTER A WITH RING ABOVE]
172 -"\u00E5" => "a"
173 -
174 -# ā [LATIN SMALL LETTER A WITH MACRON]
175 -"\u0101" => "a"
176 -
177 -# ă [LATIN SMALL LETTER A WITH BREVE]
178 -"\u0103" => "a"
179 -
180 -# ą [LATIN SMALL LETTER A WITH OGONEK]
181 -"\u0105" => "a"
182 -
183 -# ǎ [LATIN SMALL LETTER A WITH CARON]
184 -"\u01CE" => "a"
185 -
186 -# ǟ [LATIN SMALL LETTER A WITH DIAERESIS AND MACRON]
187 -"\u01DF" => "a"
188 -
189 -# ǡ [LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON]
190 -"\u01E1" => "a"
191 -
192 -# ǻ [LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE]
193 -"\u01FB" => "a"
194 -
195 -# ȁ [LATIN SMALL LETTER A WITH DOUBLE GRAVE]
196 -"\u0201" => "a"
197 -
198 -# ȃ [LATIN SMALL LETTER A WITH INVERTED BREVE]
199 -"\u0203" => "a"
200 -
201 -# ȧ [LATIN SMALL LETTER A WITH DOT ABOVE]
202 -"\u0227" => "a"
203 -
204 -# ɐ [LATIN SMALL LETTER TURNED A]
205 -"\u0250" => "a"
206 -
207 -# ə [LATIN SMALL LETTER SCHWA]
208 -"\u0259" => "a"
209 -
210 -# ɚ [LATIN SMALL LETTER SCHWA WITH HOOK]
211 -"\u025A" => "a"
212 -
213 -# ᶏ [LATIN SMALL LETTER A WITH RETROFLEX HOOK]
214 -"\u1D8F" => "a"
215 -
216 -# ᶕ [LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK]
217 -"\u1D95" => "a"
218 -
219 -# ạ [LATIN SMALL LETTER A WITH RING BELOW]
220 -"\u1E01" => "a"
221 -
222 -# ả [LATIN SMALL LETTER A WITH RIGHT HALF RING]
223 -"\u1E9A" => "a"
224 -
225 -# ạ [LATIN SMALL LETTER A WITH DOT BELOW]
226 -"\u1EA1" => "a"
227 -
228 -# ả [LATIN SMALL LETTER A WITH HOOK ABOVE]
229 -"\u1EA3" => "a"
230 -
231 -# ấ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE]
232 -"\u1EA5" => "a"
233 -
234 -# ầ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE]
235 -"\u1EA7" => "a"
236 -
237 -# ẩ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE]
238 -"\u1EA9" => "a"
239 -
240 -# ẫ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE]
241 -"\u1EAB" => "a"
242 -
243 -# ậ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW]
244 -"\u1EAD" => "a"
245 -
246 -# ắ [LATIN SMALL LETTER A WITH BREVE AND ACUTE]
247 -"\u1EAF" => "a"
248 -
249 -# ằ [LATIN SMALL LETTER A WITH BREVE AND GRAVE]
250 -"\u1EB1" => "a"
251 -
252 -# ẳ [LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE]
253 -"\u1EB3" => "a"
254 -
255 -# ẵ [LATIN SMALL LETTER A WITH BREVE AND TILDE]
256 -"\u1EB5" => "a"
257 -
258 -# ặ [LATIN SMALL LETTER A WITH BREVE AND DOT BELOW]
259 -"\u1EB7" => "a"
260 -
261 -# ₐ [LATIN SUBSCRIPT SMALL LETTER A]
262 -"\u2090" => "a"
263 -
264 -# ₔ [LATIN SUBSCRIPT SMALL LETTER SCHWA]
265 -"\u2094" => "a"
266 -
267 -# ⓐ [CIRCLED LATIN SMALL LETTER A]
268 -"\u24D0" => "a"
269 -
270 -# ⱥ [LATIN SMALL LETTER A WITH STROKE]
271 -"\u2C65" => "a"
272 -
273 -# Ɐ [LATIN CAPITAL LETTER TURNED A]
274 -"\u2C6F" => "a"
275 -
276 -# a [FULLWIDTH LATIN SMALL LETTER A]
277 -"\uFF41" => "a"
278 -
279 -# Ꜳ [LATIN CAPITAL LETTER AA]
280 -"\uA732" => "AA"
281 -
282 -# Æ [LATIN CAPITAL LETTER AE]
283 -"\u00C6" => "AE"
284 -
285 -# Ǣ [LATIN CAPITAL LETTER AE WITH MACRON]
286 -"\u01E2" => "AE"
287 -
288 -# Ǽ [LATIN CAPITAL LETTER AE WITH ACUTE]
289 -"\u01FC" => "AE"
290 -
291 -# ᴁ [LATIN LETTER SMALL CAPITAL AE]
292 -"\u1D01" => "AE"
293 -
294 -# Ꜵ [LATIN CAPITAL LETTER AO]
295 -"\uA734" => "AO"
296 -
297 -# Ꜷ [LATIN CAPITAL LETTER AU]
298 -"\uA736" => "AU"
299 -
300 -# Ꜹ [LATIN CAPITAL LETTER AV]
301 -"\uA738" => "AV"
302 -
303 -# Ꜻ [LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR]
304 -"\uA73A" => "AV"
305 -
306 -# Ꜽ [LATIN CAPITAL LETTER AY]
307 -"\uA73C" => "AY"
308 -
309 -# ⒜ [PARENTHESIZED LATIN SMALL LETTER A]
310 -"\u249C" => "(a)"
311 -
312 -# ꜳ [LATIN SMALL LETTER AA]
313 -"\uA733" => "aa"
314 -
315 -# æ [LATIN SMALL LETTER AE]
316 -"\u00E6" => "ae"
317 -
318 -# ǣ [LATIN SMALL LETTER AE WITH MACRON]
319 -"\u01E3" => "ae"
320 -
321 -# ǽ [LATIN SMALL LETTER AE WITH ACUTE]
322 -"\u01FD" => "ae"
323 -
324 -# ᴂ [LATIN SMALL LETTER TURNED AE]
325 -"\u1D02" => "ae"
326 -
327 -# ꜵ [LATIN SMALL LETTER AO]
328 -"\uA735" => "ao"
329 -
330 -# ꜷ [LATIN SMALL LETTER AU]
331 -"\uA737" => "au"
332 -
333 -# ꜹ [LATIN SMALL LETTER AV]
334 -"\uA739" => "av"
335 -
336 -# ꜻ [LATIN SMALL LETTER AV WITH HORIZONTAL BAR]
337 -"\uA73B" => "av"
338 -
339 -# ꜽ [LATIN SMALL LETTER AY]
340 -"\uA73D" => "ay"
341 -
342 -# Ɓ [LATIN CAPITAL LETTER B WITH HOOK]
343 -"\u0181" => "B"
344 -
345 -# Ƃ [LATIN CAPITAL LETTER B WITH TOPBAR]
346 -"\u0182" => "B"
347 -
348 -# Ƀ [LATIN CAPITAL LETTER B WITH STROKE]
349 -"\u0243" => "B"
350 -
351 -# ʙ [LATIN LETTER SMALL CAPITAL B]
352 -"\u0299" => "B"
353 -
354 -# ᴃ [LATIN LETTER SMALL CAPITAL BARRED B]
355 -"\u1D03" => "B"
356 -
357 -# Ḃ [LATIN CAPITAL LETTER B WITH DOT ABOVE]
358 -"\u1E02" => "B"
359 -
360 -# Ḅ [LATIN CAPITAL LETTER B WITH DOT BELOW]
361 -"\u1E04" => "B"
362 -
363 -# Ḇ [LATIN CAPITAL LETTER B WITH LINE BELOW]
364 -"\u1E06" => "B"
365 -
366 -# Ⓑ [CIRCLED LATIN CAPITAL LETTER B]
367 -"\u24B7" => "B"
368 -
369 -# B [FULLWIDTH LATIN CAPITAL LETTER B]
370 -"\uFF22" => "B"
371 -
372 -# ƀ [LATIN SMALL LETTER B WITH STROKE]
373 -"\u0180" => "b"
374 -
375 -# ƃ [LATIN SMALL LETTER B WITH TOPBAR]
376 -"\u0183" => "b"
377 -
378 -# ɓ [LATIN SMALL LETTER B WITH HOOK]
379 -"\u0253" => "b"
380 -
381 -# ᵬ [LATIN SMALL LETTER B WITH MIDDLE TILDE]
382 -"\u1D6C" => "b"
383 -
384 -# ᶀ [LATIN SMALL LETTER B WITH PALATAL HOOK]
385 -"\u1D80" => "b"
386 -
387 -# ḃ [LATIN SMALL LETTER B WITH DOT ABOVE]
388 -"\u1E03" => "b"
389 -
390 -# ḅ [LATIN SMALL LETTER B WITH DOT BELOW]
391 -"\u1E05" => "b"
392 -
393 -# ḇ [LATIN SMALL LETTER B WITH LINE BELOW]
394 -"\u1E07" => "b"
395 -
396 -# ⓑ [CIRCLED LATIN SMALL LETTER B]
397 -"\u24D1" => "b"
398 -
399 -# b [FULLWIDTH LATIN SMALL LETTER B]
400 -"\uFF42" => "b"
401 -
402 -# ⒝ [PARENTHESIZED LATIN SMALL LETTER B]
403 -"\u249D" => "(b)"
404 -
405 -# Ç [LATIN CAPITAL LETTER C WITH CEDILLA]
406 -"\u00C7" => "C"
407 -
408 -# Ć [LATIN CAPITAL LETTER C WITH ACUTE]
409 -"\u0106" => "C"
410 -
411 -# Ĉ [LATIN CAPITAL LETTER C WITH CIRCUMFLEX]
412 -"\u0108" => "C"
413 -
414 -# Ċ [LATIN CAPITAL LETTER C WITH DOT ABOVE]
415 -"\u010A" => "C"
416 -
417 -# Č [LATIN CAPITAL LETTER C WITH CARON]
418 -"\u010C" => "C"
419 -
420 -# Ƈ [LATIN CAPITAL LETTER C WITH HOOK]
421 -"\u0187" => "C"
422 -
423 -# Ȼ [LATIN CAPITAL LETTER C WITH STROKE]
424 -"\u023B" => "C"
425 -
426 -# ʗ [LATIN LETTER STRETCHED C]
427 -"\u0297" => "C"
428 -
429 -# ᴄ [LATIN LETTER SMALL CAPITAL C]
430 -"\u1D04" => "C"
431 -
432 -# Ḉ [LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE]
433 -"\u1E08" => "C"
434 -
435 -# Ⓒ [CIRCLED LATIN CAPITAL LETTER C]
436 -"\u24B8" => "C"
437 -
438 -# C [FULLWIDTH LATIN CAPITAL LETTER C]
439 -"\uFF23" => "C"
440 -
441 -# ç [LATIN SMALL LETTER C WITH CEDILLA]
442 -"\u00E7" => "c"
443 -
444 -# ć [LATIN SMALL LETTER C WITH ACUTE]
445 -"\u0107" => "c"
446 -
447 -# ĉ [LATIN SMALL LETTER C WITH CIRCUMFLEX]
448 -"\u0109" => "c"
449 -
450 -# ċ [LATIN SMALL LETTER C WITH DOT ABOVE]
451 -"\u010B" => "c"
452 -
453 -# č [LATIN SMALL LETTER C WITH CARON]
454 -"\u010D" => "c"
455 -
456 -# ƈ [LATIN SMALL LETTER C WITH HOOK]
457 -"\u0188" => "c"
458 -
459 -# ȼ [LATIN SMALL LETTER C WITH STROKE]
460 -"\u023C" => "c"
461 -
462 -# ɕ [LATIN SMALL LETTER C WITH CURL]
463 -"\u0255" => "c"
464 -
465 -# ḉ [LATIN SMALL LETTER C WITH CEDILLA AND ACUTE]
466 -"\u1E09" => "c"
467 -
468 -# ↄ [LATIN SMALL LETTER REVERSED C]
469 -"\u2184" => "c"
470 -
471 -# ⓒ [CIRCLED LATIN SMALL LETTER C]
472 -"\u24D2" => "c"
473 -
474 -# Ꜿ [LATIN CAPITAL LETTER REVERSED C WITH DOT]
475 -"\uA73E" => "c"
476 -
477 -# ꜿ [LATIN SMALL LETTER REVERSED C WITH DOT]
478 -"\uA73F" => "c"
479 -
480 -# c [FULLWIDTH LATIN SMALL LETTER C]
481 -"\uFF43" => "c"
482 -
483 -# ⒞ [PARENTHESIZED LATIN SMALL LETTER C]
484 -"\u249E" => "(c)"
485 -
486 -# Ð [LATIN CAPITAL LETTER ETH]
487 -"\u00D0" => "D"
488 -
489 -# Ď [LATIN CAPITAL LETTER D WITH CARON]
490 -"\u010E" => "D"
491 -
492 -# Đ [LATIN CAPITAL LETTER D WITH STROKE]
493 -"\u0110" => "D"
494 -
495 -# Ɖ [LATIN CAPITAL LETTER AFRICAN D]
496 -"\u0189" => "D"
497 -
498 -# Ɗ [LATIN CAPITAL LETTER D WITH HOOK]
499 -"\u018A" => "D"
500 -
501 -# Ƌ [LATIN CAPITAL LETTER D WITH TOPBAR]
502 -"\u018B" => "D"
503 -
504 -# ᴅ [LATIN LETTER SMALL CAPITAL D]
505 -"\u1D05" => "D"
506 -
507 -# ᴆ [LATIN LETTER SMALL CAPITAL ETH]
508 -"\u1D06" => "D"
509 -
510 -# Ḋ [LATIN CAPITAL LETTER D WITH DOT ABOVE]
511 -"\u1E0A" => "D"
512 -
513 -# Ḍ [LATIN CAPITAL LETTER D WITH DOT BELOW]
514 -"\u1E0C" => "D"
515 -
516 -# Ḏ [LATIN CAPITAL LETTER D WITH LINE BELOW]
517 -"\u1E0E" => "D"
518 -
519 -# Ḑ [LATIN CAPITAL LETTER D WITH CEDILLA]
520 -"\u1E10" => "D"
521 -
522 -# Ḓ [LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW]
523 -"\u1E12" => "D"
524 -
525 -# Ⓓ [CIRCLED LATIN CAPITAL LETTER D]
526 -"\u24B9" => "D"
527 -
528 -# Ꝺ [LATIN CAPITAL LETTER INSULAR D]
529 -"\uA779" => "D"
530 -
531 -# D [FULLWIDTH LATIN CAPITAL LETTER D]
532 -"\uFF24" => "D"
533 -
534 -# ð [LATIN SMALL LETTER ETH]
535 -"\u00F0" => "d"
536 -
537 -# ď [LATIN SMALL LETTER D WITH CARON]
538 -"\u010F" => "d"
539 -
540 -# đ [LATIN SMALL LETTER D WITH STROKE]
541 -"\u0111" => "d"
542 -
543 -# ƌ [LATIN SMALL LETTER D WITH TOPBAR]
544 -"\u018C" => "d"
545 -
546 -# ȡ [LATIN SMALL LETTER D WITH CURL]
547 -"\u0221" => "d"
548 -
549 -# ɖ [LATIN SMALL LETTER D WITH TAIL]
550 -"\u0256" => "d"
551 -
552 -# ɗ [LATIN SMALL LETTER D WITH HOOK]
553 -"\u0257" => "d"
554 -
555 -# ᵭ [LATIN SMALL LETTER D WITH MIDDLE TILDE]
556 -"\u1D6D" => "d"
557 -
558 -# ᶁ [LATIN SMALL LETTER D WITH PALATAL HOOK]
559 -"\u1D81" => "d"
560 -
561 -# ᶑ [LATIN SMALL LETTER D WITH HOOK AND TAIL]
562 -"\u1D91" => "d"
563 -
564 -# ḋ [LATIN SMALL LETTER D WITH DOT ABOVE]
565 -"\u1E0B" => "d"
566 -
567 -# ḍ [LATIN SMALL LETTER D WITH DOT BELOW]
568 -"\u1E0D" => "d"
569 -
570 -# ḏ [LATIN SMALL LETTER D WITH LINE BELOW]
571 -"\u1E0F" => "d"
572 -
573 -# ḑ [LATIN SMALL LETTER D WITH CEDILLA]
574 -"\u1E11" => "d"
575 -
576 -# ḓ [LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW]
577 -"\u1E13" => "d"
578 -
579 -# ⓓ [CIRCLED LATIN SMALL LETTER D]
580 -"\u24D3" => "d"
581 -
582 -# ꝺ [LATIN SMALL LETTER INSULAR D]
583 -"\uA77A" => "d"
584 -
585 -# d [FULLWIDTH LATIN SMALL LETTER D]
586 -"\uFF44" => "d"
587 -
588 -# DŽ [LATIN CAPITAL LETTER DZ WITH CARON]
589 -"\u01C4" => "DZ"
590 -
591 -# DZ [LATIN CAPITAL LETTER DZ]
592 -"\u01F1" => "DZ"
593 -
594 -# Dž [LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]
595 -"\u01C5" => "Dz"
596 -
597 -# Dz [LATIN CAPITAL LETTER D WITH SMALL LETTER Z]
598 -"\u01F2" => "Dz"
599 -
600 -# ⒟ [PARENTHESIZED LATIN SMALL LETTER D]
601 -"\u249F" => "(d)"
602 -
603 -# ȸ [LATIN SMALL LETTER DB DIGRAPH]
604 -"\u0238" => "db"
605 -
606 -# dž [LATIN SMALL LETTER DZ WITH CARON]
607 -"\u01C6" => "dz"
608 -
609 -# dz [LATIN SMALL LETTER DZ]
610 -"\u01F3" => "dz"
611 -
612 -# ʣ [LATIN SMALL LETTER DZ DIGRAPH]
613 -"\u02A3" => "dz"
614 -
615 -# ʥ [LATIN SMALL LETTER DZ DIGRAPH WITH CURL]
616 -"\u02A5" => "dz"
617 -
618 -# È [LATIN CAPITAL LETTER E WITH GRAVE]
619 -"\u00C8" => "E"
620 -
621 -# É [LATIN CAPITAL LETTER E WITH ACUTE]
622 -"\u00C9" => "E"
623 -
624 -# Ê [LATIN CAPITAL LETTER E WITH CIRCUMFLEX]
625 -"\u00CA" => "E"
626 -
627 -# Ë [LATIN CAPITAL LETTER E WITH DIAERESIS]
628 -"\u00CB" => "E"
629 -
630 -# Ē [LATIN CAPITAL LETTER E WITH MACRON]
631 -"\u0112" => "E"
632 -
633 -# Ĕ [LATIN CAPITAL LETTER E WITH BREVE]
634 -"\u0114" => "E"
635 -
636 -# Ė [LATIN CAPITAL LETTER E WITH DOT ABOVE]
637 -"\u0116" => "E"
638 -
639 -# Ę [LATIN CAPITAL LETTER E WITH OGONEK]
640 -"\u0118" => "E"
641 -
642 -# Ě [LATIN CAPITAL LETTER E WITH CARON]
643 -"\u011A" => "E"
644 -
645 -# Ǝ [LATIN CAPITAL LETTER REVERSED E]
646 -"\u018E" => "E"
647 -
648 -# Ɛ [LATIN CAPITAL LETTER OPEN E]
649 -"\u0190" => "E"
650 -
651 -# Ȅ [LATIN CAPITAL LETTER E WITH DOUBLE GRAVE]
652 -"\u0204" => "E"
653 -
654 -# Ȇ [LATIN CAPITAL LETTER E WITH INVERTED BREVE]
655 -"\u0206" => "E"
656 -
657 -# Ȩ [LATIN CAPITAL LETTER E WITH CEDILLA]
658 -"\u0228" => "E"
659 -
660 -# Ɇ [LATIN CAPITAL LETTER E WITH STROKE]
661 -"\u0246" => "E"
662 -
663 -# ᴇ [LATIN LETTER SMALL CAPITAL E]
664 -"\u1D07" => "E"
665 -
666 -# Ḕ [LATIN CAPITAL LETTER E WITH MACRON AND GRAVE]
667 -"\u1E14" => "E"
668 -
669 -# Ḗ [LATIN CAPITAL LETTER E WITH MACRON AND ACUTE]
670 -"\u1E16" => "E"
671 -
672 -# Ḙ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW]
673 -"\u1E18" => "E"
674 -
675 -# Ḛ [LATIN CAPITAL LETTER E WITH TILDE BELOW]
676 -"\u1E1A" => "E"
677 -
678 -# Ḝ [LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE]
679 -"\u1E1C" => "E"
680 -
681 -# Ẹ [LATIN CAPITAL LETTER E WITH DOT BELOW]
682 -"\u1EB8" => "E"
683 -
684 -# Ẻ [LATIN CAPITAL LETTER E WITH HOOK ABOVE]
685 -"\u1EBA" => "E"
686 -
687 -# Ẽ [LATIN CAPITAL LETTER E WITH TILDE]
688 -"\u1EBC" => "E"
689 -
690 -# Ế [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE]
691 -"\u1EBE" => "E"
692 -
693 -# Ề [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE]
694 -"\u1EC0" => "E"
695 -
696 -# Ể [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE]
697 -"\u1EC2" => "E"
698 -
699 -# Ễ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE]
700 -"\u1EC4" => "E"
701 -
702 -# Ệ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW]
703 -"\u1EC6" => "E"
704 -
705 -# Ⓔ [CIRCLED LATIN CAPITAL LETTER E]
706 -"\u24BA" => "E"
707 -
708 -# ⱻ [LATIN LETTER SMALL CAPITAL TURNED E]
709 -"\u2C7B" => "E"
710 -
711 -# E [FULLWIDTH LATIN CAPITAL LETTER E]
712 -"\uFF25" => "E"
713 -
714 -# è [LATIN SMALL LETTER E WITH GRAVE]
715 -"\u00E8" => "e"
716 -
717 -# é [LATIN SMALL LETTER E WITH ACUTE]
718 -"\u00E9" => "e"
719 -
720 -# ê [LATIN SMALL LETTER E WITH CIRCUMFLEX]
721 -"\u00EA" => "e"
722 -
723 -# ë [LATIN SMALL LETTER E WITH DIAERESIS]
724 -"\u00EB" => "e"
725 -
726 -# ē [LATIN SMALL LETTER E WITH MACRON]
727 -"\u0113" => "e"
728 -
729 -# ĕ [LATIN SMALL LETTER E WITH BREVE]
730 -"\u0115" => "e"
731 -
732 -# ė [LATIN SMALL LETTER E WITH DOT ABOVE]
733 -"\u0117" => "e"
734 -
735 -# ę [LATIN SMALL LETTER E WITH OGONEK]
736 -"\u0119" => "e"
737 -
738 -# ě [LATIN SMALL LETTER E WITH CARON]
739 -"\u011B" => "e"
740 -
741 -# ǝ [LATIN SMALL LETTER TURNED E]
742 -"\u01DD" => "e"
743 -
744 -# ȅ [LATIN SMALL LETTER E WITH DOUBLE GRAVE]
745 -"\u0205" => "e"
746 -
747 -# ȇ [LATIN SMALL LETTER E WITH INVERTED BREVE]
748 -"\u0207" => "e"
749 -
750 -# ȩ [LATIN SMALL LETTER E WITH CEDILLA]
751 -"\u0229" => "e"
752 -
753 -# ɇ [LATIN SMALL LETTER E WITH STROKE]
754 -"\u0247" => "e"
755 -
756 -# ɘ [LATIN SMALL LETTER REVERSED E]
757 -"\u0258" => "e"
758 -
759 -# ɛ [LATIN SMALL LETTER OPEN E]
760 -"\u025B" => "e"
761 -
762 -# ɜ [LATIN SMALL LETTER REVERSED OPEN E]
763 -"\u025C" => "e"
764 -
765 -# ɝ [LATIN SMALL LETTER REVERSED OPEN E WITH HOOK]
766 -"\u025D" => "e"
767 -
768 -# ɞ [LATIN SMALL LETTER CLOSED REVERSED OPEN E]
769 -"\u025E" => "e"
770 -
771 -# ʚ [LATIN SMALL LETTER CLOSED OPEN E]
772 -"\u029A" => "e"
773 -
774 -# ᴈ [LATIN SMALL LETTER TURNED OPEN E]
775 -"\u1D08" => "e"
776 -
777 -# ᶒ [LATIN SMALL LETTER E WITH RETROFLEX HOOK]
778 -"\u1D92" => "e"
779 -
780 -# ᶓ [LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK]
781 -"\u1D93" => "e"
782 -
783 -# ᶔ [LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK]
784 -"\u1D94" => "e"
785 -
786 -# ḕ [LATIN SMALL LETTER E WITH MACRON AND GRAVE]
787 -"\u1E15" => "e"
788 -
789 -# ḗ [LATIN SMALL LETTER E WITH MACRON AND ACUTE]
790 -"\u1E17" => "e"
791 -
792 -# ḙ [LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW]
793 -"\u1E19" => "e"
794 -
795 -# ḛ [LATIN SMALL LETTER E WITH TILDE BELOW]
796 -"\u1E1B" => "e"
797 -
798 -# ḝ [LATIN SMALL LETTER E WITH CEDILLA AND BREVE]
799 -"\u1E1D" => "e"
800 -
801 -# ẹ [LATIN SMALL LETTER E WITH DOT BELOW]
802 -"\u1EB9" => "e"
803 -
804 -# ẻ [LATIN SMALL LETTER E WITH HOOK ABOVE]
805 -"\u1EBB" => "e"
806 -
807 -# ẽ [LATIN SMALL LETTER E WITH TILDE]
808 -"\u1EBD" => "e"
809 -
810 -# ế [LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE]
811 -"\u1EBF" => "e"
812 -
813 -# ề [LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE]
814 -"\u1EC1" => "e"
815 -
816 -# ể [LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE]
817 -"\u1EC3" => "e"
818 -
819 -# ễ [LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE]
820 -"\u1EC5" => "e"
821 -
822 -# ệ [LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW]
823 -"\u1EC7" => "e"
824 -
825 -# ₑ [LATIN SUBSCRIPT SMALL LETTER E]
826 -"\u2091" => "e"
827 -
828 -# ⓔ [CIRCLED LATIN SMALL LETTER E]
829 -"\u24D4" => "e"
830 -
831 -# ⱸ [LATIN SMALL LETTER E WITH NOTCH]
832 -"\u2C78" => "e"
833 -
834 -# e [FULLWIDTH LATIN SMALL LETTER E]
835 -"\uFF45" => "e"
836 -
837 -# ⒠ [PARENTHESIZED LATIN SMALL LETTER E]
838 -"\u24A0" => "(e)"
839 -
840 -# Ƒ [LATIN CAPITAL LETTER F WITH HOOK]
841 -"\u0191" => "F"
842 -
843 -# Ḟ [LATIN CAPITAL LETTER F WITH DOT ABOVE]
844 -"\u1E1E" => "F"
845 -
846 -# Ⓕ [CIRCLED LATIN CAPITAL LETTER F]
847 -"\u24BB" => "F"
848 -
849 -# ꜰ [LATIN LETTER SMALL CAPITAL F]
850 -"\uA730" => "F"
851 -
852 -# Ꝼ [LATIN CAPITAL LETTER INSULAR F]
853 -"\uA77B" => "F"
854 -
855 -# ꟻ [LATIN EPIGRAPHIC LETTER REVERSED F]
856 -"\uA7FB" => "F"
857 -
858 -# F [FULLWIDTH LATIN CAPITAL LETTER F]
859 -"\uFF26" => "F"
860 -
861 -# ƒ [LATIN SMALL LETTER F WITH HOOK]
862 -"\u0192" => "f"
863 -
864 -# ᵮ [LATIN SMALL LETTER F WITH MIDDLE TILDE]
865 -"\u1D6E" => "f"
866 -
867 -# ᶂ [LATIN SMALL LETTER F WITH PALATAL HOOK]
868 -"\u1D82" => "f"
869 -
870 -# ḟ [LATIN SMALL LETTER F WITH DOT ABOVE]
871 -"\u1E1F" => "f"
872 -
873 -# ẛ [LATIN SMALL LETTER LONG S WITH DOT ABOVE]
874 -"\u1E9B" => "f"
875 -
876 -# ⓕ [CIRCLED LATIN SMALL LETTER F]
877 -"\u24D5" => "f"
878 -
879 -# ꝼ [LATIN SMALL LETTER INSULAR F]
880 -"\uA77C" => "f"
881 -
882 -# f [FULLWIDTH LATIN SMALL LETTER F]
883 -"\uFF46" => "f"
884 -
885 -# ⒡ [PARENTHESIZED LATIN SMALL LETTER F]
886 -"\u24A1" => "(f)"
887 -
888 -# ff [LATIN SMALL LIGATURE FF]
889 -"\uFB00" => "ff"
890 -
891 -# ffi [LATIN SMALL LIGATURE FFI]
892 -"\uFB03" => "ffi"
893 -
894 -# ffl [LATIN SMALL LIGATURE FFL]
895 -"\uFB04" => "ffl"
896 -
897 -# fi [LATIN SMALL LIGATURE FI]
898 -"\uFB01" => "fi"
899 -
900 -# fl [LATIN SMALL LIGATURE FL]
901 -"\uFB02" => "fl"
902 -
903 -# Ĝ [LATIN CAPITAL LETTER G WITH CIRCUMFLEX]
904 -"\u011C" => "G"
905 -
906 -# Ğ [LATIN CAPITAL LETTER G WITH BREVE]
907 -"\u011E" => "G"
908 -
909 -# Ġ [LATIN CAPITAL LETTER G WITH DOT ABOVE]
910 -"\u0120" => "G"
911 -
912 -# Ģ [LATIN CAPITAL LETTER G WITH CEDILLA]
913 -"\u0122" => "G"
914 -
915 -# Ɠ [LATIN CAPITAL LETTER G WITH HOOK]
916 -"\u0193" => "G"
917 -
918 -# Ǥ [LATIN CAPITAL LETTER G WITH STROKE]
919 -"\u01E4" => "G"
920 -
921 -# ǥ [LATIN SMALL LETTER G WITH STROKE]
922 -"\u01E5" => "G"
923 -
924 -# Ǧ [LATIN CAPITAL LETTER G WITH CARON]
925 -"\u01E6" => "G"
926 -
927 -# ǧ [LATIN SMALL LETTER G WITH CARON]
928 -"\u01E7" => "G"
929 -
930 -# Ǵ [LATIN CAPITAL LETTER G WITH ACUTE]
931 -"\u01F4" => "G"
932 -
933 -# ɢ [LATIN LETTER SMALL CAPITAL G]
934 -"\u0262" => "G"
935 -
936 -# ʛ [LATIN LETTER SMALL CAPITAL G WITH HOOK]
937 -"\u029B" => "G"
938 -
939 -# Ḡ [LATIN CAPITAL LETTER G WITH MACRON]
940 -"\u1E20" => "G"
941 -
942 -# Ⓖ [CIRCLED LATIN CAPITAL LETTER G]
943 -"\u24BC" => "G"
944 -
945 -# Ᵹ [LATIN CAPITAL LETTER INSULAR G]
946 -"\uA77D" => "G"
947 -
948 -# Ꝿ [LATIN CAPITAL LETTER TURNED INSULAR G]
949 -"\uA77E" => "G"
950 -
951 -# G [FULLWIDTH LATIN CAPITAL LETTER G]
952 -"\uFF27" => "G"
953 -
954 -# ĝ [LATIN SMALL LETTER G WITH CIRCUMFLEX]
955 -"\u011D" => "g"
956 -
957 -# ğ [LATIN SMALL LETTER G WITH BREVE]
958 -"\u011F" => "g"
959 -
960 -# ġ [LATIN SMALL LETTER G WITH DOT ABOVE]
961 -"\u0121" => "g"
962 -
963 -# ģ [LATIN SMALL LETTER G WITH CEDILLA]
964 -"\u0123" => "g"
965 -
966 -# ǵ [LATIN SMALL LETTER G WITH ACUTE]
967 -"\u01F5" => "g"
968 -
969 -# ɠ [LATIN SMALL LETTER G WITH HOOK]
970 -"\u0260" => "g"
971 -
972 -# ɡ [LATIN SMALL LETTER SCRIPT G]
973 -"\u0261" => "g"
974 -
975 -# ᵷ [LATIN SMALL LETTER TURNED G]
976 -"\u1D77" => "g"
977 -
978 -# ᵹ [LATIN SMALL LETTER INSULAR G]
979 -"\u1D79" => "g"
980 -
981 -# ᶃ [LATIN SMALL LETTER G WITH PALATAL HOOK]
982 -"\u1D83" => "g"
983 -
984 -# ḡ [LATIN SMALL LETTER G WITH MACRON]
985 -"\u1E21" => "g"
986 -
987 -# ⓖ [CIRCLED LATIN SMALL LETTER G]
988 -"\u24D6" => "g"
989 -
990 -# ꝿ [LATIN SMALL LETTER TURNED INSULAR G]
991 -"\uA77F" => "g"
992 -
993 -# g [FULLWIDTH LATIN SMALL LETTER G]
994 -"\uFF47" => "g"
995 -
996 -# ⒢ [PARENTHESIZED LATIN SMALL LETTER G]
997 -"\u24A2" => "(g)"
998 -
999 -# Ĥ [LATIN CAPITAL LETTER H WITH CIRCUMFLEX]
1000 -"\u0124" => "H"
1001 -
1002 -# Ħ [LATIN CAPITAL LETTER H WITH STROKE]
1003 -"\u0126" => "H"
1004 -
1005 -# Ȟ [LATIN CAPITAL LETTER H WITH CARON]
1006 -"\u021E" => "H"
1007 -
1008 -# ʜ [LATIN LETTER SMALL CAPITAL H]
1009 -"\u029C" => "H"
1010 -
1011 -# Ḣ [LATIN CAPITAL LETTER H WITH DOT ABOVE]
1012 -"\u1E22" => "H"
1013 -
1014 -# Ḥ [LATIN CAPITAL LETTER H WITH DOT BELOW]
1015 -"\u1E24" => "H"
1016 -
1017 -# Ḧ [LATIN CAPITAL LETTER H WITH DIAERESIS]
1018 -"\u1E26" => "H"
1019 -
1020 -# Ḩ [LATIN CAPITAL LETTER H WITH CEDILLA]
1021 -"\u1E28" => "H"
1022 -
1023 -# Ḫ [LATIN CAPITAL LETTER H WITH BREVE BELOW]
1024 -"\u1E2A" => "H"
1025 -
1026 -# Ⓗ [CIRCLED LATIN CAPITAL LETTER H]
1027 -"\u24BD" => "H"
1028 -
1029 -# Ⱨ [LATIN CAPITAL LETTER H WITH DESCENDER]
1030 -"\u2C67" => "H"
1031 -
1032 -# Ⱶ [LATIN CAPITAL LETTER HALF H]
1033 -"\u2C75" => "H"
1034 -
1035 -# H [FULLWIDTH LATIN CAPITAL LETTER H]
1036 -"\uFF28" => "H"
1037 -
1038 -# ĥ [LATIN SMALL LETTER H WITH CIRCUMFLEX]
1039 -"\u0125" => "h"
1040 -
1041 -# ħ [LATIN SMALL LETTER H WITH STROKE]
1042 -"\u0127" => "h"
1043 -
1044 -# ȟ [LATIN SMALL LETTER H WITH CARON]
1045 -"\u021F" => "h"
1046 -
1047 -# ɥ [LATIN SMALL LETTER TURNED H]
1048 -"\u0265" => "h"
1049 -
1050 -# ɦ [LATIN SMALL LETTER H WITH HOOK]
1051 -"\u0266" => "h"
1052 -
1053 -# ʮ [LATIN SMALL LETTER TURNED H WITH FISHHOOK]
1054 -"\u02AE" => "h"
1055 -
1056 -# ʯ [LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL]
1057 -"\u02AF" => "h"
1058 -
1059 -# ḣ [LATIN SMALL LETTER H WITH DOT ABOVE]
1060 -"\u1E23" => "h"
1061 -
1062 -# ḥ [LATIN SMALL LETTER H WITH DOT BELOW]
1063 -"\u1E25" => "h"
1064 -
1065 -# ḧ [LATIN SMALL LETTER H WITH DIAERESIS]
1066 -"\u1E27" => "h"
1067 -
1068 -# ḩ [LATIN SMALL LETTER H WITH CEDILLA]
1069 -"\u1E29" => "h"
1070 -
1071 -# ḫ [LATIN SMALL LETTER H WITH BREVE BELOW]
1072 -"\u1E2B" => "h"
1073 -
1074 -# ẖ [LATIN SMALL LETTER H WITH LINE BELOW]
1075 -"\u1E96" => "h"
1076 -
1077 -# ⓗ [CIRCLED LATIN SMALL LETTER H]
1078 -"\u24D7" => "h"
1079 -
1080 -# ⱨ [LATIN SMALL LETTER H WITH DESCENDER]
1081 -"\u2C68" => "h"
1082 -
1083 -# ⱶ [LATIN SMALL LETTER HALF H]
1084 -"\u2C76" => "h"
1085 -
1086 -# h [FULLWIDTH LATIN SMALL LETTER H]
1087 -"\uFF48" => "h"
1088 -
1089 -# Ƕ http://en.wikipedia.org/wiki/Hwair [LATIN CAPITAL LETTER HWAIR]
1090 -"\u01F6" => "HV"
1091 -
1092 -# ⒣ [PARENTHESIZED LATIN SMALL LETTER H]
1093 -"\u24A3" => "(h)"
1094 -
1095 -# ƕ [LATIN SMALL LETTER HV]
1096 -"\u0195" => "hv"
1097 -
1098 -# Ì [LATIN CAPITAL LETTER I WITH GRAVE]
1099 -"\u00CC" => "I"
1100 -
1101 -# Í [LATIN CAPITAL LETTER I WITH ACUTE]
1102 -"\u00CD" => "I"
1103 -
1104 -# Î [LATIN CAPITAL LETTER I WITH CIRCUMFLEX]
1105 -"\u00CE" => "I"
1106 -
1107 -# Ï [LATIN CAPITAL LETTER I WITH DIAERESIS]
1108 -"\u00CF" => "I"
1109 -
1110 -# Ĩ [LATIN CAPITAL LETTER I WITH TILDE]
1111 -"\u0128" => "I"
1112 -
1113 -# Ī [LATIN CAPITAL LETTER I WITH MACRON]
1114 -"\u012A" => "I"
1115 -
1116 -# Ĭ [LATIN CAPITAL LETTER I WITH BREVE]
1117 -"\u012C" => "I"
1118 -
1119 -# Į [LATIN CAPITAL LETTER I WITH OGONEK]
1120 -"\u012E" => "I"
1121 -
1122 -# İ [LATIN CAPITAL LETTER I WITH DOT ABOVE]
1123 -"\u0130" => "I"
1124 -
1125 -# Ɩ [LATIN CAPITAL LETTER IOTA]
1126 -"\u0196" => "I"
1127 -
1128 -# Ɨ [LATIN CAPITAL LETTER I WITH STROKE]
1129 -"\u0197" => "I"
1130 -
1131 -# Ǐ [LATIN CAPITAL LETTER I WITH CARON]
1132 -"\u01CF" => "I"
1133 -
1134 -# Ȉ [LATIN CAPITAL LETTER I WITH DOUBLE GRAVE]
1135 -"\u0208" => "I"
1136 -
1137 -# Ȋ [LATIN CAPITAL LETTER I WITH INVERTED BREVE]
1138 -"\u020A" => "I"
1139 -
1140 -# ɪ [LATIN LETTER SMALL CAPITAL I]
1141 -"\u026A" => "I"
1142 -
1143 -# ᵻ [LATIN SMALL CAPITAL LETTER I WITH STROKE]
1144 -"\u1D7B" => "I"
1145 -
1146 -# Ḭ [LATIN CAPITAL LETTER I WITH TILDE BELOW]
1147 -"\u1E2C" => "I"
1148 -
1149 -# Ḯ [LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE]
1150 -"\u1E2E" => "I"
1151 -
1152 -# Ỉ [LATIN CAPITAL LETTER I WITH HOOK ABOVE]
1153 -"\u1EC8" => "I"
1154 -
1155 -# Ị [LATIN CAPITAL LETTER I WITH DOT BELOW]
1156 -"\u1ECA" => "I"
1157 -
1158 -# Ⓘ [CIRCLED LATIN CAPITAL LETTER I]
1159 -"\u24BE" => "I"
1160 -
1161 -# ꟾ [LATIN EPIGRAPHIC LETTER I LONGA]
1162 -"\uA7FE" => "I"
1163 -
1164 -# I [FULLWIDTH LATIN CAPITAL LETTER I]
1165 -"\uFF29" => "I"
1166 -
1167 -# ì [LATIN SMALL LETTER I WITH GRAVE]
1168 -"\u00EC" => "i"
1169 -
1170 -# í [LATIN SMALL LETTER I WITH ACUTE]
1171 -"\u00ED" => "i"
1172 -
1173 -# î [LATIN SMALL LETTER I WITH CIRCUMFLEX]
1174 -"\u00EE" => "i"
1175 -
1176 -# ï [LATIN SMALL LETTER I WITH DIAERESIS]
1177 -"\u00EF" => "i"
1178 -
1179 -# ĩ [LATIN SMALL LETTER I WITH TILDE]
1180 -"\u0129" => "i"
1181 -
1182 -# ī [LATIN SMALL LETTER I WITH MACRON]
1183 -"\u012B" => "i"
1184 -
1185 -# ĭ [LATIN SMALL LETTER I WITH BREVE]
1186 -"\u012D" => "i"
1187 -
1188 -# į [LATIN SMALL LETTER I WITH OGONEK]
1189 -"\u012F" => "i"
1190 -
1191 -# ı [LATIN SMALL LETTER DOTLESS I]
1192 -"\u0131" => "i"
1193 -
1194 -# ǐ [LATIN SMALL LETTER I WITH CARON]
1195 -"\u01D0" => "i"
1196 -
1197 -# ȉ [LATIN SMALL LETTER I WITH DOUBLE GRAVE]
1198 -"\u0209" => "i"
1199 -
1200 -# ȋ [LATIN SMALL LETTER I WITH INVERTED BREVE]
1201 -"\u020B" => "i"
1202 -
1203 -# ɨ [LATIN SMALL LETTER I WITH STROKE]
1204 -"\u0268" => "i"
1205 -
1206 -# ᴉ [LATIN SMALL LETTER TURNED I]
1207 -"\u1D09" => "i"
1208 -
1209 -# ᵢ [LATIN SUBSCRIPT SMALL LETTER I]
1210 -"\u1D62" => "i"
1211 -
1212 -# ᵼ [LATIN SMALL LETTER IOTA WITH STROKE]
1213 -"\u1D7C" => "i"
1214 -
1215 -# ᶖ [LATIN SMALL LETTER I WITH RETROFLEX HOOK]
1216 -"\u1D96" => "i"
1217 -
1218 -# ḭ [LATIN SMALL LETTER I WITH TILDE BELOW]
1219 -"\u1E2D" => "i"
1220 -
1221 -# ḯ [LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE]
1222 -"\u1E2F" => "i"
1223 -
1224 -# ỉ [LATIN SMALL LETTER I WITH HOOK ABOVE]
1225 -"\u1EC9" => "i"
1226 -
1227 -# ị [LATIN SMALL LETTER I WITH DOT BELOW]
1228 -"\u1ECB" => "i"
1229 -
1230 -# ⁱ [SUPERSCRIPT LATIN SMALL LETTER I]
1231 -"\u2071" => "i"
1232 -
1233 -# ⓘ [CIRCLED LATIN SMALL LETTER I]
1234 -"\u24D8" => "i"
1235 -
1236 -# i [FULLWIDTH LATIN SMALL LETTER I]
1237 -"\uFF49" => "i"
1238 -
1239 -# IJ [LATIN CAPITAL LIGATURE IJ]
1240 -"\u0132" => "IJ"
1241 -
1242 -# ⒤ [PARENTHESIZED LATIN SMALL LETTER I]
1243 -"\u24A4" => "(i)"
1244 -
1245 -# ij [LATIN SMALL LIGATURE IJ]
1246 -"\u0133" => "ij"
1247 -
1248 -# Ĵ [LATIN CAPITAL LETTER J WITH CIRCUMFLEX]
1249 -"\u0134" => "J"
1250 -
1251 -# Ɉ [LATIN CAPITAL LETTER J WITH STROKE]
1252 -"\u0248" => "J"
1253 -
1254 -# ᴊ [LATIN LETTER SMALL CAPITAL J]
1255 -"\u1D0A" => "J"
1256 -
1257 -# Ⓙ [CIRCLED LATIN CAPITAL LETTER J]
1258 -"\u24BF" => "J"
1259 -
1260 -# J [FULLWIDTH LATIN CAPITAL LETTER J]
1261 -"\uFF2A" => "J"
1262 -
1263 -# ĵ [LATIN SMALL LETTER J WITH CIRCUMFLEX]
1264 -"\u0135" => "j"
1265 -
1266 -# ǰ [LATIN SMALL LETTER J WITH CARON]
1267 -"\u01F0" => "j"
1268 -
1269 -# ȷ [LATIN SMALL LETTER DOTLESS J]
1270 -"\u0237" => "j"
1271 -
1272 -# ɉ [LATIN SMALL LETTER J WITH STROKE]
1273 -"\u0249" => "j"
1274 -
1275 -# ɟ [LATIN SMALL LETTER DOTLESS J WITH STROKE]
1276 -"\u025F" => "j"
1277 -
1278 -# ʄ [LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK]
1279 -"\u0284" => "j"
1280 -
1281 -# ʝ [LATIN SMALL LETTER J WITH CROSSED-TAIL]
1282 -"\u029D" => "j"
1283 -
1284 -# ⓙ [CIRCLED LATIN SMALL LETTER J]
1285 -"\u24D9" => "j"
1286 -
1287 -# ⱼ [LATIN SUBSCRIPT SMALL LETTER J]
1288 -"\u2C7C" => "j"
1289 -
1290 -# j [FULLWIDTH LATIN SMALL LETTER J]
1291 -"\uFF4A" => "j"
1292 -
1293 -# ⒥ [PARENTHESIZED LATIN SMALL LETTER J]
1294 -"\u24A5" => "(j)"
1295 -
1296 -# Ķ [LATIN CAPITAL LETTER K WITH CEDILLA]
1297 -"\u0136" => "K"
1298 -
1299 -# Ƙ [LATIN CAPITAL LETTER K WITH HOOK]
1300 -"\u0198" => "K"
1301 -
1302 -# Ǩ [LATIN CAPITAL LETTER K WITH CARON]
1303 -"\u01E8" => "K"
1304 -
1305 -# ᴋ [LATIN LETTER SMALL CAPITAL K]
1306 -"\u1D0B" => "K"
1307 -
1308 -# Ḱ [LATIN CAPITAL LETTER K WITH ACUTE]
1309 -"\u1E30" => "K"
1310 -
1311 -# Ḳ [LATIN CAPITAL LETTER K WITH DOT BELOW]
1312 -"\u1E32" => "K"
1313 -
1314 -# Ḵ [LATIN CAPITAL LETTER K WITH LINE BELOW]
1315 -"\u1E34" => "K"
1316 -
1317 -# Ⓚ [CIRCLED LATIN CAPITAL LETTER K]
1318 -"\u24C0" => "K"
1319 -
1320 -# Ⱪ [LATIN CAPITAL LETTER K WITH DESCENDER]
1321 -"\u2C69" => "K"
1322 -
1323 -# Ꝁ [LATIN CAPITAL LETTER K WITH STROKE]
1324 -"\uA740" => "K"
1325 -
1326 -# Ꝃ [LATIN CAPITAL LETTER K WITH DIAGONAL STROKE]
1327 -"\uA742" => "K"
1328 -
1329 -# Ꝅ [LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE]
1330 -"\uA744" => "K"
1331 -
1332 -# K [FULLWIDTH LATIN CAPITAL LETTER K]
1333 -"\uFF2B" => "K"
1334 -
1335 -# ķ [LATIN SMALL LETTER K WITH CEDILLA]
1336 -"\u0137" => "k"
1337 -
1338 -# ƙ [LATIN SMALL LETTER K WITH HOOK]
1339 -"\u0199" => "k"
1340 -
1341 -# ǩ [LATIN SMALL LETTER K WITH CARON]
1342 -"\u01E9" => "k"
1343 -
1344 -# ʞ [LATIN SMALL LETTER TURNED K]
1345 -"\u029E" => "k"
1346 -
1347 -# ᶄ [LATIN SMALL LETTER K WITH PALATAL HOOK]
1348 -"\u1D84" => "k"
1349 -
1350 -# ḱ [LATIN SMALL LETTER K WITH ACUTE]
1351 -"\u1E31" => "k"
1352 -
1353 -# ḳ [LATIN SMALL LETTER K WITH DOT BELOW]
1354 -"\u1E33" => "k"
1355 -
1356 -# ḵ [LATIN SMALL LETTER K WITH LINE BELOW]
1357 -"\u1E35" => "k"
1358 -
1359 -# ⓚ [CIRCLED LATIN SMALL LETTER K]
1360 -"\u24DA" => "k"
1361 -
1362 -# ⱪ [LATIN SMALL LETTER K WITH DESCENDER]
1363 -"\u2C6A" => "k"
1364 -
1365 -# ꝁ [LATIN SMALL LETTER K WITH STROKE]
1366 -"\uA741" => "k"
1367 -
1368 -# ꝃ [LATIN SMALL LETTER K WITH DIAGONAL STROKE]
1369 -"\uA743" => "k"
1370 -
1371 -# ꝅ [LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE]
1372 -"\uA745" => "k"
1373 -
1374 -# k [FULLWIDTH LATIN SMALL LETTER K]
1375 -"\uFF4B" => "k"
1376 -
1377 -# ⒦ [PARENTHESIZED LATIN SMALL LETTER K]
1378 -"\u24A6" => "(k)"
1379 -
1380 -# Ĺ [LATIN CAPITAL LETTER L WITH ACUTE]
1381 -"\u0139" => "L"
1382 -
1383 -# Ļ [LATIN CAPITAL LETTER L WITH CEDILLA]
1384 -"\u013B" => "L"
1385 -
1386 -# Ľ [LATIN CAPITAL LETTER L WITH CARON]
1387 -"\u013D" => "L"
1388 -
1389 -# Ŀ [LATIN CAPITAL LETTER L WITH MIDDLE DOT]
1390 -"\u013F" => "L"
1391 -
1392 -# Ł [LATIN CAPITAL LETTER L WITH STROKE]
1393 -"\u0141" => "L"
1394 -
1395 -# Ƚ [LATIN CAPITAL LETTER L WITH BAR]
1396 -"\u023D" => "L"
1397 -
1398 -# ʟ [LATIN LETTER SMALL CAPITAL L]
1399 -"\u029F" => "L"
1400 -
1401 -# ᴌ [LATIN LETTER SMALL CAPITAL L WITH STROKE]
1402 -"\u1D0C" => "L"
1403 -
1404 -# Ḷ [LATIN CAPITAL LETTER L WITH DOT BELOW]
1405 -"\u1E36" => "L"
1406 -
1407 -# Ḹ [LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON]
1408 -"\u1E38" => "L"
1409 -
1410 -# Ḻ [LATIN CAPITAL LETTER L WITH LINE BELOW]
1411 -"\u1E3A" => "L"
1412 -
1413 -# Ḽ [LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW]
1414 -"\u1E3C" => "L"
1415 -
1416 -# Ⓛ [CIRCLED LATIN CAPITAL LETTER L]
1417 -"\u24C1" => "L"
1418 -
1419 -# Ⱡ [LATIN CAPITAL LETTER L WITH DOUBLE BAR]
1420 -"\u2C60" => "L"
1421 -
1422 -# Ɫ [LATIN CAPITAL LETTER L WITH MIDDLE TILDE]
1423 -"\u2C62" => "L"
1424 -
1425 -# Ꝇ [LATIN CAPITAL LETTER BROKEN L]
1426 -"\uA746" => "L"
1427 -
1428 -# Ꝉ [LATIN CAPITAL LETTER L WITH HIGH STROKE]
1429 -"\uA748" => "L"
1430 -
1431 -# Ꞁ [LATIN CAPITAL LETTER TURNED L]
1432 -"\uA780" => "L"
1433 -
1434 -# L [FULLWIDTH LATIN CAPITAL LETTER L]
1435 -"\uFF2C" => "L"
1436 -
1437 -# ĺ [LATIN SMALL LETTER L WITH ACUTE]
1438 -"\u013A" => "l"
1439 -
1440 -# ļ [LATIN SMALL LETTER L WITH CEDILLA]
1441 -"\u013C" => "l"
1442 -
1443 -# ľ [LATIN SMALL LETTER L WITH CARON]
1444 -"\u013E" => "l"
1445 -
1446 -# ŀ [LATIN SMALL LETTER L WITH MIDDLE DOT]
1447 -"\u0140" => "l"
1448 -
1449 -# ł [LATIN SMALL LETTER L WITH STROKE]
1450 -"\u0142" => "l"
1451 -
1452 -# ƚ [LATIN SMALL LETTER L WITH BAR]
1453 -"\u019A" => "l"
1454 -
1455 -# ȴ [LATIN SMALL LETTER L WITH CURL]
1456 -"\u0234" => "l"
1457 -
1458 -# ɫ [LATIN SMALL LETTER L WITH MIDDLE TILDE]
1459 -"\u026B" => "l"
1460 -
1461 -# ɬ [LATIN SMALL LETTER L WITH BELT]
1462 -"\u026C" => "l"
1463 -
1464 -# ɭ [LATIN SMALL LETTER L WITH RETROFLEX HOOK]
1465 -"\u026D" => "l"
1466 -
1467 -# ᶅ [LATIN SMALL LETTER L WITH PALATAL HOOK]
1468 -"\u1D85" => "l"
1469 -
1470 -# ḷ [LATIN SMALL LETTER L WITH DOT BELOW]
1471 -"\u1E37" => "l"
1472 -
1473 -# ḹ [LATIN SMALL LETTER L WITH DOT BELOW AND MACRON]
1474 -"\u1E39" => "l"
1475 -
1476 -# ḻ [LATIN SMALL LETTER L WITH LINE BELOW]
1477 -"\u1E3B" => "l"
1478 -
1479 -# ḽ [LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW]
1480 -"\u1E3D" => "l"
1481 -
1482 -# ⓛ [CIRCLED LATIN SMALL LETTER L]
1483 -"\u24DB" => "l"
1484 -
1485 -# ⱡ [LATIN SMALL LETTER L WITH DOUBLE BAR]
1486 -"\u2C61" => "l"
1487 -
1488 -# ꝇ [LATIN SMALL LETTER BROKEN L]
1489 -"\uA747" => "l"
1490 -
1491 -# ꝉ [LATIN SMALL LETTER L WITH HIGH STROKE]
1492 -"\uA749" => "l"
1493 -
1494 -# ꞁ [LATIN SMALL LETTER TURNED L]
1495 -"\uA781" => "l"
1496 -
1497 -# l [FULLWIDTH LATIN SMALL LETTER L]
1498 -"\uFF4C" => "l"
1499 -
1500 -# LJ [LATIN CAPITAL LETTER LJ]
1501 -"\u01C7" => "LJ"
1502 -
1503 -# Ỻ [LATIN CAPITAL LETTER MIDDLE-WELSH LL]
1504 -"\u1EFA" => "LL"
1505 -
1506 -# Lj [LATIN CAPITAL LETTER L WITH SMALL LETTER J]
1507 -"\u01C8" => "Lj"
1508 -
1509 -# ⒧ [PARENTHESIZED LATIN SMALL LETTER L]
1510 -"\u24A7" => "(l)"
1511 -
1512 -# lj [LATIN SMALL LETTER LJ]
1513 -"\u01C9" => "lj"
1514 -
1515 -# ỻ [LATIN SMALL LETTER MIDDLE-WELSH LL]
1516 -"\u1EFB" => "ll"
1517 -
1518 -# ʪ [LATIN SMALL LETTER LS DIGRAPH]
1519 -"\u02AA" => "ls"
1520 -
1521 -# ʫ [LATIN SMALL LETTER LZ DIGRAPH]
1522 -"\u02AB" => "lz"
1523 -
1524 -# Ɯ [LATIN CAPITAL LETTER TURNED M]
1525 -"\u019C" => "M"
1526 -
1527 -# ᴍ [LATIN LETTER SMALL CAPITAL M]
1528 -"\u1D0D" => "M"
1529 -
1530 -# Ḿ [LATIN CAPITAL LETTER M WITH ACUTE]
1531 -"\u1E3E" => "M"
1532 -
1533 -# Ṁ [LATIN CAPITAL LETTER M WITH DOT ABOVE]
1534 -"\u1E40" => "M"
1535 -
1536 -# Ṃ [LATIN CAPITAL LETTER M WITH DOT BELOW]
1537 -"\u1E42" => "M"
1538 -
1539 -# Ⓜ [CIRCLED LATIN CAPITAL LETTER M]
1540 -"\u24C2" => "M"
1541 -
1542 -# Ɱ [LATIN CAPITAL LETTER M WITH HOOK]
1543 -"\u2C6E" => "M"
1544 -
1545 -# ꟽ [LATIN EPIGRAPHIC LETTER INVERTED M]
1546 -"\uA7FD" => "M"
1547 -
1548 -# ꟿ [LATIN EPIGRAPHIC LETTER ARCHAIC M]
1549 -"\uA7FF" => "M"
1550 -
1551 -# M [FULLWIDTH LATIN CAPITAL LETTER M]
1552 -"\uFF2D" => "M"
1553 -
1554 -# ɯ [LATIN SMALL LETTER TURNED M]
1555 -"\u026F" => "m"
1556 -
1557 -# ɰ [LATIN SMALL LETTER TURNED M WITH LONG LEG]
1558 -"\u0270" => "m"
1559 -
1560 -# ɱ [LATIN SMALL LETTER M WITH HOOK]
1561 -"\u0271" => "m"
1562 -
1563 -# ᵯ [LATIN SMALL LETTER M WITH MIDDLE TILDE]
1564 -"\u1D6F" => "m"
1565 -
1566 -# ᶆ [LATIN SMALL LETTER M WITH PALATAL HOOK]
1567 -"\u1D86" => "m"
1568 -
1569 -# ḿ [LATIN SMALL LETTER M WITH ACUTE]
1570 -"\u1E3F" => "m"
1571 -
1572 -# ṁ [LATIN SMALL LETTER M WITH DOT ABOVE]
1573 -"\u1E41" => "m"
1574 -
1575 -# ṃ [LATIN SMALL LETTER M WITH DOT BELOW]
1576 -"\u1E43" => "m"
1577 -
1578 -# ⓜ [CIRCLED LATIN SMALL LETTER M]
1579 -"\u24DC" => "m"
1580 -
1581 -# m [FULLWIDTH LATIN SMALL LETTER M]
1582 -"\uFF4D" => "m"
1583 -
1584 -# ⒨ [PARENTHESIZED LATIN SMALL LETTER M]
1585 -"\u24A8" => "(m)"
1586 -
1587 -# Ñ [LATIN CAPITAL LETTER N WITH TILDE]
1588 -"\u00D1" => "N"
1589 -
1590 -# Ń [LATIN CAPITAL LETTER N WITH ACUTE]
1591 -"\u0143" => "N"
1592 -
1593 -# Ņ [LATIN CAPITAL LETTER N WITH CEDILLA]
1594 -"\u0145" => "N"
1595 -
1596 -# Ň [LATIN CAPITAL LETTER N WITH CARON]
1597 -"\u0147" => "N"
1598 -
1599 -# Ŋ http://en.wikipedia.org/wiki/Eng_(letter) [LATIN CAPITAL LETTER ENG]
1600 -"\u014A" => "N"
1601 -
1602 -# Ɲ [LATIN CAPITAL LETTER N WITH LEFT HOOK]
1603 -"\u019D" => "N"
1604 -
1605 -# Ǹ [LATIN CAPITAL LETTER N WITH GRAVE]
1606 -"\u01F8" => "N"
1607 -
1608 -# Ƞ [LATIN CAPITAL LETTER N WITH LONG RIGHT LEG]
1609 -"\u0220" => "N"
1610 -
1611 -# ɴ [LATIN LETTER SMALL CAPITAL N]
1612 -"\u0274" => "N"
1613 -
1614 -# ᴎ [LATIN LETTER SMALL CAPITAL REVERSED N]
1615 -"\u1D0E" => "N"
1616 -
1617 -# Ṅ [LATIN CAPITAL LETTER N WITH DOT ABOVE]
1618 -"\u1E44" => "N"
1619 -
1620 -# Ṇ [LATIN CAPITAL LETTER N WITH DOT BELOW]
1621 -"\u1E46" => "N"
1622 -
1623 -# Ṉ [LATIN CAPITAL LETTER N WITH LINE BELOW]
1624 -"\u1E48" => "N"
1625 -
1626 -# Ṋ [LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW]
1627 -"\u1E4A" => "N"
1628 -
1629 -# Ⓝ [CIRCLED LATIN CAPITAL LETTER N]
1630 -"\u24C3" => "N"
1631 -
1632 -# N [FULLWIDTH LATIN CAPITAL LETTER N]
1633 -"\uFF2E" => "N"
1634 -
1635 -# ñ [LATIN SMALL LETTER N WITH TILDE]
1636 -"\u00F1" => "n"
1637 -
1638 -# ń [LATIN SMALL LETTER N WITH ACUTE]
1639 -"\u0144" => "n"
1640 -
1641 -# ņ [LATIN SMALL LETTER N WITH CEDILLA]
1642 -"\u0146" => "n"
1643 -
1644 -# ň [LATIN SMALL LETTER N WITH CARON]
1645 -"\u0148" => "n"
1646 -
1647 -# ʼn [LATIN SMALL LETTER N PRECEDED BY APOSTROPHE]
1648 -"\u0149" => "n"
1649 -
1650 -# ŋ http://en.wikipedia.org/wiki/Eng_(letter) [LATIN SMALL LETTER ENG]
1651 -"\u014B" => "n"
1652 -
1653 -# ƞ [LATIN SMALL LETTER N WITH LONG RIGHT LEG]
1654 -"\u019E" => "n"
1655 -
1656 -# ǹ [LATIN SMALL LETTER N WITH GRAVE]
1657 -"\u01F9" => "n"
1658 -
1659 -# ȵ [LATIN SMALL LETTER N WITH CURL]
1660 -"\u0235" => "n"
1661 -
1662 -# ɲ [LATIN SMALL LETTER N WITH LEFT HOOK]
1663 -"\u0272" => "n"
1664 -
1665 -# ɳ [LATIN SMALL LETTER N WITH RETROFLEX HOOK]
1666 -"\u0273" => "n"
1667 -
1668 -# ᵰ [LATIN SMALL LETTER N WITH MIDDLE TILDE]
1669 -"\u1D70" => "n"
1670 -
1671 -# ᶇ [LATIN SMALL LETTER N WITH PALATAL HOOK]
1672 -"\u1D87" => "n"
1673 -
1674 -# ṅ [LATIN SMALL LETTER N WITH DOT ABOVE]
1675 -"\u1E45" => "n"
1676 -
1677 -# ṇ [LATIN SMALL LETTER N WITH DOT BELOW]
1678 -"\u1E47" => "n"
1679 -
1680 -# ṉ [LATIN SMALL LETTER N WITH LINE BELOW]
1681 -"\u1E49" => "n"
1682 -
1683 -# ṋ [LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW]
1684 -"\u1E4B" => "n"
1685 -
1686 -# ⁿ [SUPERSCRIPT LATIN SMALL LETTER N]
1687 -"\u207F" => "n"
1688 -
1689 -# ⓝ [CIRCLED LATIN SMALL LETTER N]
1690 -"\u24DD" => "n"
1691 -
1692 -# n [FULLWIDTH LATIN SMALL LETTER N]
1693 -"\uFF4E" => "n"
1694 -
1695 -# NJ [LATIN CAPITAL LETTER NJ]
1696 -"\u01CA" => "NJ"
1697 -
1698 -# Nj [LATIN CAPITAL LETTER N WITH SMALL LETTER J]
1699 -"\u01CB" => "Nj"
1700 -
1701 -# ⒩ [PARENTHESIZED LATIN SMALL LETTER N]
1702 -"\u24A9" => "(n)"
1703 -
1704 -# nj [LATIN SMALL LETTER NJ]
1705 -"\u01CC" => "nj"
1706 -
1707 -# Ò [LATIN CAPITAL LETTER O WITH GRAVE]
1708 -"\u00D2" => "O"
1709 -
1710 -# Ó [LATIN CAPITAL LETTER O WITH ACUTE]
1711 -"\u00D3" => "O"
1712 -
1713 -# Ô [LATIN CAPITAL LETTER O WITH CIRCUMFLEX]
1714 -"\u00D4" => "O"
1715 -
1716 -# Õ [LATIN CAPITAL LETTER O WITH TILDE]
1717 -"\u00D5" => "O"
1718 -
1719 -# Ö [LATIN CAPITAL LETTER O WITH DIAERESIS]
1720 -"\u00D6" => "O"
1721 -
1722 -# Ø [LATIN CAPITAL LETTER O WITH STROKE]
1723 -"\u00D8" => "O"
1724 -
1725 -# Ō [LATIN CAPITAL LETTER O WITH MACRON]
1726 -"\u014C" => "O"
1727 -
1728 -# Ŏ [LATIN CAPITAL LETTER O WITH BREVE]
1729 -"\u014E" => "O"
1730 -
1731 -# Ő [LATIN CAPITAL LETTER O WITH DOUBLE ACUTE]
1732 -"\u0150" => "O"
1733 -
1734 -# Ɔ [LATIN CAPITAL LETTER OPEN O]
1735 -"\u0186" => "O"
1736 -
1737 -# Ɵ [LATIN CAPITAL LETTER O WITH MIDDLE TILDE]
1738 -"\u019F" => "O"
1739 -
1740 -# Ơ [LATIN CAPITAL LETTER O WITH HORN]
1741 -"\u01A0" => "O"
1742 -
1743 -# Ǒ [LATIN CAPITAL LETTER O WITH CARON]
1744 -"\u01D1" => "O"
1745 -
1746 -# Ǫ [LATIN CAPITAL LETTER O WITH OGONEK]
1747 -"\u01EA" => "O"
1748 -
1749 -# Ǭ [LATIN CAPITAL LETTER O WITH OGONEK AND MACRON]
1750 -"\u01EC" => "O"
1751 -
1752 -# Ǿ [LATIN CAPITAL LETTER O WITH STROKE AND ACUTE]
1753 -"\u01FE" => "O"
1754 -
1755 -# Ȍ [LATIN CAPITAL LETTER O WITH DOUBLE GRAVE]
1756 -"\u020C" => "O"
1757 -
1758 -# Ȏ [LATIN CAPITAL LETTER O WITH INVERTED BREVE]
1759 -"\u020E" => "O"
1760 -
1761 -# Ȫ [LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON]
1762 -"\u022A" => "O"
1763 -
1764 -# Ȭ [LATIN CAPITAL LETTER O WITH TILDE AND MACRON]
1765 -"\u022C" => "O"
1766 -
1767 -# Ȯ [LATIN CAPITAL LETTER O WITH DOT ABOVE]
1768 -"\u022E" => "O"
1769 -
1770 -# Ȱ [LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON]
1771 -"\u0230" => "O"
1772 -
1773 -# ᴏ [LATIN LETTER SMALL CAPITAL O]
1774 -"\u1D0F" => "O"
1775 -
1776 -# ᴐ [LATIN LETTER SMALL CAPITAL OPEN O]
1777 -"\u1D10" => "O"
1778 -
1779 -# Ṍ [LATIN CAPITAL LETTER O WITH TILDE AND ACUTE]
1780 -"\u1E4C" => "O"
1781 -
1782 -# Ṏ [LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS]
1783 -"\u1E4E" => "O"
1784 -
1785 -# Ṑ [LATIN CAPITAL LETTER O WITH MACRON AND GRAVE]
1786 -"\u1E50" => "O"
1787 -
1788 -# Ṓ [LATIN CAPITAL LETTER O WITH MACRON AND ACUTE]
1789 -"\u1E52" => "O"
1790 -
1791 -# Ọ [LATIN CAPITAL LETTER O WITH DOT BELOW]
1792 -"\u1ECC" => "O"
1793 -
1794 -# Ỏ [LATIN CAPITAL LETTER O WITH HOOK ABOVE]
1795 -"\u1ECE" => "O"
1796 -
1797 -# Ố [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE]
1798 -"\u1ED0" => "O"
1799 -
1800 -# Ồ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE]
1801 -"\u1ED2" => "O"
1802 -
1803 -# Ổ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE]
1804 -"\u1ED4" => "O"
1805 -
1806 -# Ỗ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE]
1807 -"\u1ED6" => "O"
1808 -
1809 -# Ộ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW]
1810 -"\u1ED8" => "O"
1811 -
1812 -# Ớ [LATIN CAPITAL LETTER O WITH HORN AND ACUTE]
1813 -"\u1EDA" => "O"
1814 -
1815 -# Ờ [LATIN CAPITAL LETTER O WITH HORN AND GRAVE]
1816 -"\u1EDC" => "O"
1817 -
1818 -# Ở [LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE]
1819 -"\u1EDE" => "O"
1820 -
1821 -# Ỡ [LATIN CAPITAL LETTER O WITH HORN AND TILDE]
1822 -"\u1EE0" => "O"
1823 -
1824 -# Ợ [LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW]
1825 -"\u1EE2" => "O"
1826 -
1827 -# Ⓞ [CIRCLED LATIN CAPITAL LETTER O]
1828 -"\u24C4" => "O"
1829 -
1830 -# Ꝋ [LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY]
1831 -"\uA74A" => "O"
1832 -
1833 -# Ꝍ [LATIN CAPITAL LETTER O WITH LOOP]
1834 -"\uA74C" => "O"
1835 -
1836 -# O [FULLWIDTH LATIN CAPITAL LETTER O]
1837 -"\uFF2F" => "O"
1838 -
1839 -# ò [LATIN SMALL LETTER O WITH GRAVE]
1840 -"\u00F2" => "o"
1841 -
1842 -# ó [LATIN SMALL LETTER O WITH ACUTE]
1843 -"\u00F3" => "o"
1844 -
1845 -# ô [LATIN SMALL LETTER O WITH CIRCUMFLEX]
1846 -"\u00F4" => "o"
1847 -
1848 -# õ [LATIN SMALL LETTER O WITH TILDE]
1849 -"\u00F5" => "o"
1850 -
1851 -# ö [LATIN SMALL LETTER O WITH DIAERESIS]
1852 -"\u00F6" => "o"
1853 -
1854 -# ø [LATIN SMALL LETTER O WITH STROKE]
1855 -"\u00F8" => "o"
1856 -
1857 -# ō [LATIN SMALL LETTER O WITH MACRON]
1858 -"\u014D" => "o"
1859 -
1860 -# ŏ [LATIN SMALL LETTER O WITH BREVE]
1861 -"\u014F" => "o"
1862 -
1863 -# ő [LATIN SMALL LETTER O WITH DOUBLE ACUTE]
1864 -"\u0151" => "o"
1865 -
1866 -# ơ [LATIN SMALL LETTER O WITH HORN]
1867 -"\u01A1" => "o"
1868 -
1869 -# ǒ [LATIN SMALL LETTER O WITH CARON]
1870 -"\u01D2" => "o"
1871 -
1872 -# ǫ [LATIN SMALL LETTER O WITH OGONEK]
1873 -"\u01EB" => "o"
1874 -
1875 -# ǭ [LATIN SMALL LETTER O WITH OGONEK AND MACRON]
1876 -"\u01ED" => "o"
1877 -
1878 -# ǿ [LATIN SMALL LETTER O WITH STROKE AND ACUTE]
1879 -"\u01FF" => "o"
1880 -
1881 -# ȍ [LATIN SMALL LETTER O WITH DOUBLE GRAVE]
1882 -"\u020D" => "o"
1883 -
1884 -# ȏ [LATIN SMALL LETTER O WITH INVERTED BREVE]
1885 -"\u020F" => "o"
1886 -
1887 -# ȫ [LATIN SMALL LETTER O WITH DIAERESIS AND MACRON]
1888 -"\u022B" => "o"
1889 -
1890 -# ȭ [LATIN SMALL LETTER O WITH TILDE AND MACRON]
1891 -"\u022D" => "o"
1892 -
1893 -# ȯ [LATIN SMALL LETTER O WITH DOT ABOVE]
1894 -"\u022F" => "o"
1895 -
1896 -# ȱ [LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON]
1897 -"\u0231" => "o"
1898 -
1899 -# ɔ [LATIN SMALL LETTER OPEN O]
1900 -"\u0254" => "o"
1901 -
1902 -# ɵ [LATIN SMALL LETTER BARRED O]
1903 -"\u0275" => "o"
1904 -
1905 -# ᴖ [LATIN SMALL LETTER TOP HALF O]
1906 -"\u1D16" => "o"
1907 -
1908 -# ᴗ [LATIN SMALL LETTER BOTTOM HALF O]
1909 -"\u1D17" => "o"
1910 -
1911 -# ᶗ [LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK]
1912 -"\u1D97" => "o"
1913 -
1914 -# ṍ [LATIN SMALL LETTER O WITH TILDE AND ACUTE]
1915 -"\u1E4D" => "o"
1916 -
1917 -# ṏ [LATIN SMALL LETTER O WITH TILDE AND DIAERESIS]
1918 -"\u1E4F" => "o"
1919 -
1920 -# ṑ [LATIN SMALL LETTER O WITH MACRON AND GRAVE]
1921 -"\u1E51" => "o"
1922 -
1923 -# ṓ [LATIN SMALL LETTER O WITH MACRON AND ACUTE]
1924 -"\u1E53" => "o"
1925 -
1926 -# ọ [LATIN SMALL LETTER O WITH DOT BELOW]
1927 -"\u1ECD" => "o"
1928 -
1929 -# ỏ [LATIN SMALL LETTER O WITH HOOK ABOVE]
1930 -"\u1ECF" => "o"
1931 -
1932 -# ố [LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE]
1933 -"\u1ED1" => "o"
1934 -
1935 -# ồ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE]
1936 -"\u1ED3" => "o"
1937 -
1938 -# ổ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE]
1939 -"\u1ED5" => "o"
1940 -
1941 -# ỗ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE]
1942 -"\u1ED7" => "o"
1943 -
1944 -# ộ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW]
1945 -"\u1ED9" => "o"
1946 -
1947 -# ớ [LATIN SMALL LETTER O WITH HORN AND ACUTE]
1948 -"\u1EDB" => "o"
1949 -
1950 -# ờ [LATIN SMALL LETTER O WITH HORN AND GRAVE]
1951 -"\u1EDD" => "o"
1952 -
1953 -# ở [LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE]
1954 -"\u1EDF" => "o"
1955 -
1956 -# ỡ [LATIN SMALL LETTER O WITH HORN AND TILDE]
1957 -"\u1EE1" => "o"
1958 -
1959 -# ợ [LATIN SMALL LETTER O WITH HORN AND DOT BELOW]
1960 -"\u1EE3" => "o"
1961 -
1962 -# ₒ [LATIN SUBSCRIPT SMALL LETTER O]
1963 -"\u2092" => "o"
1964 -
1965 -# ⓞ [CIRCLED LATIN SMALL LETTER O]
1966 -"\u24DE" => "o"
1967 -
1968 -# ⱺ [LATIN SMALL LETTER O WITH LOW RING INSIDE]
1969 -"\u2C7A" => "o"
1970 -
1971 -# ꝋ [LATIN SMALL LETTER O WITH LONG STROKE OVERLAY]
1972 -"\uA74B" => "o"
1973 -
1974 -# ꝍ [LATIN SMALL LETTER O WITH LOOP]
1975 -"\uA74D" => "o"
1976 -
1977 -# o [FULLWIDTH LATIN SMALL LETTER O]
1978 -"\uFF4F" => "o"
1979 -
1980 -# Œ [LATIN CAPITAL LIGATURE OE]
1981 -"\u0152" => "OE"
1982 -
1983 -# ɶ [LATIN LETTER SMALL CAPITAL OE]
1984 -"\u0276" => "OE"
1985 -
1986 -# Ꝏ [LATIN CAPITAL LETTER OO]
1987 -"\uA74E" => "OO"
1988 -
1989 -# Ȣ http://en.wikipedia.org/wiki/OU [LATIN CAPITAL LETTER OU]
1990 -"\u0222" => "OU"
1991 -
1992 -# ᴕ [LATIN LETTER SMALL CAPITAL OU]
1993 -"\u1D15" => "OU"
1994 -
1995 -# ⒪ [PARENTHESIZED LATIN SMALL LETTER O]
1996 -"\u24AA" => "(o)"
1997 -
1998 -# œ [LATIN SMALL LIGATURE OE]
1999 -"\u0153" => "oe"
2000 -
2001 -# ᴔ [LATIN SMALL LETTER TURNED OE]
2002 -"\u1D14" => "oe"
2003 -
2004 -# ꝏ [LATIN SMALL LETTER OO]
2005 -"\uA74F" => "oo"
2006 -
2007 -# ȣ http://en.wikipedia.org/wiki/OU [LATIN SMALL LETTER OU]
2008 -"\u0223" => "ou"
2009 -
2010 -# Ƥ [LATIN CAPITAL LETTER P WITH HOOK]
2011 -"\u01A4" => "P"
2012 -
2013 -# ᴘ [LATIN LETTER SMALL CAPITAL P]
2014 -"\u1D18" => "P"
2015 -
2016 -# Ṕ [LATIN CAPITAL LETTER P WITH ACUTE]
2017 -"\u1E54" => "P"
2018 -
2019 -# Ṗ [LATIN CAPITAL LETTER P WITH DOT ABOVE]
2020 -"\u1E56" => "P"
2021 -
2022 -# Ⓟ [CIRCLED LATIN CAPITAL LETTER P]
2023 -"\u24C5" => "P"
2024 -
2025 -# Ᵽ [LATIN CAPITAL LETTER P WITH STROKE]
2026 -"\u2C63" => "P"
2027 -
2028 -# Ꝑ [LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER]
2029 -"\uA750" => "P"
2030 -
2031 -# Ꝓ [LATIN CAPITAL LETTER P WITH FLOURISH]
2032 -"\uA752" => "P"
2033 -
2034 -# Ꝕ [LATIN CAPITAL LETTER P WITH SQUIRREL TAIL]
2035 -"\uA754" => "P"
2036 -
2037 -# P [FULLWIDTH LATIN CAPITAL LETTER P]
2038 -"\uFF30" => "P"
2039 -
2040 -# ƥ [LATIN SMALL LETTER P WITH HOOK]
2041 -"\u01A5" => "p"
2042 -
2043 -# ᵱ [LATIN SMALL LETTER P WITH MIDDLE TILDE]
2044 -"\u1D71" => "p"
2045 -
2046 -# ᵽ [LATIN SMALL LETTER P WITH STROKE]
2047 -"\u1D7D" => "p"
2048 -
2049 -# ᶈ [LATIN SMALL LETTER P WITH PALATAL HOOK]
2050 -"\u1D88" => "p"
2051 -
2052 -# ṕ [LATIN SMALL LETTER P WITH ACUTE]
2053 -"\u1E55" => "p"
2054 -
2055 -# ṗ [LATIN SMALL LETTER P WITH DOT ABOVE]
2056 -"\u1E57" => "p"
2057 -
2058 -# ⓟ [CIRCLED LATIN SMALL LETTER P]
2059 -"\u24DF" => "p"
2060 -
2061 -# ꝑ [LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER]
2062 -"\uA751" => "p"
2063 -
2064 -# ꝓ [LATIN SMALL LETTER P WITH FLOURISH]
2065 -"\uA753" => "p"
2066 -
2067 -# ꝕ [LATIN SMALL LETTER P WITH SQUIRREL TAIL]
2068 -"\uA755" => "p"
2069 -
2070 -# ꟼ [LATIN EPIGRAPHIC LETTER REVERSED P]
2071 -"\uA7FC" => "p"
2072 -
2073 -# p [FULLWIDTH LATIN SMALL LETTER P]
2074 -"\uFF50" => "p"
2075 -
2076 -# ⒫ [PARENTHESIZED LATIN SMALL LETTER P]
2077 -"\u24AB" => "(p)"
2078 -
2079 -# Ɋ [LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL]
2080 -"\u024A" => "Q"
2081 -
2082 -# Ⓠ [CIRCLED LATIN CAPITAL LETTER Q]
2083 -"\u24C6" => "Q"
2084 -
2085 -# Ꝗ [LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER]
2086 -"\uA756" => "Q"
2087 -
2088 -# Ꝙ [LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE]
2089 -"\uA758" => "Q"
2090 -
2091 -# Q [FULLWIDTH LATIN CAPITAL LETTER Q]
2092 -"\uFF31" => "Q"
2093 -
2094 -# ĸ http://en.wikipedia.org/wiki/Kra_(letter) [LATIN SMALL LETTER KRA]
2095 -"\u0138" => "q"
2096 -
2097 -# ɋ [LATIN SMALL LETTER Q WITH HOOK TAIL]
2098 -"\u024B" => "q"
2099 -
2100 -# ʠ [LATIN SMALL LETTER Q WITH HOOK]
2101 -"\u02A0" => "q"
2102 -
2103 -# ⓠ [CIRCLED LATIN SMALL LETTER Q]
2104 -"\u24E0" => "q"
2105 -
2106 -# ꝗ [LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER]
2107 -"\uA757" => "q"
2108 -
2109 -# ꝙ [LATIN SMALL LETTER Q WITH DIAGONAL STROKE]
2110 -"\uA759" => "q"
2111 -
2112 -# q [FULLWIDTH LATIN SMALL LETTER Q]
2113 -"\uFF51" => "q"
2114 -
2115 -# ⒬ [PARENTHESIZED LATIN SMALL LETTER Q]
2116 -"\u24AC" => "(q)"
2117 -
2118 -# ȹ [LATIN SMALL LETTER QP DIGRAPH]
2119 -"\u0239" => "qp"
2120 -
2121 -# Ŕ [LATIN CAPITAL LETTER R WITH ACUTE]
2122 -"\u0154" => "R"
2123 -
2124 -# Ŗ [LATIN CAPITAL LETTER R WITH CEDILLA]
2125 -"\u0156" => "R"
2126 -
2127 -# Ř [LATIN CAPITAL LETTER R WITH CARON]
2128 -"\u0158" => "R"
2129 -
2130 -# Ȓ [LATIN CAPITAL LETTER R WITH DOUBLE GRAVE]
2131 -"\u0210" => "R"
2132 -
2133 -# Ȓ [LATIN CAPITAL LETTER R WITH INVERTED BREVE]
2134 -"\u0212" => "R"
2135 -
2136 -# Ɍ [LATIN CAPITAL LETTER R WITH STROKE]
2137 -"\u024C" => "R"
2138 -
2139 -# ʀ [LATIN LETTER SMALL CAPITAL R]
2140 -"\u0280" => "R"
2141 -
2142 -# ʁ [LATIN LETTER SMALL CAPITAL INVERTED R]
2143 -"\u0281" => "R"
2144 -
2145 -# ᴙ [LATIN LETTER SMALL CAPITAL REVERSED R]
2146 -"\u1D19" => "R"
2147 -
2148 -# ᴚ [LATIN LETTER SMALL CAPITAL TURNED R]
2149 -"\u1D1A" => "R"
2150 -
2151 -# Ṙ [LATIN CAPITAL LETTER R WITH DOT ABOVE]
2152 -"\u1E58" => "R"
2153 -
2154 -# Ṛ [LATIN CAPITAL LETTER R WITH DOT BELOW]
2155 -"\u1E5A" => "R"
2156 -
2157 -# Ṝ [LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON]
2158 -"\u1E5C" => "R"
2159 -
2160 -# Ṟ [LATIN CAPITAL LETTER R WITH LINE BELOW]
2161 -"\u1E5E" => "R"
2162 -
2163 -# Ⓡ [CIRCLED LATIN CAPITAL LETTER R]
2164 -"\u24C7" => "R"
2165 -
2166 -# Ɽ [LATIN CAPITAL LETTER R WITH TAIL]
2167 -"\u2C64" => "R"
2168 -
2169 -# Ꝛ [LATIN CAPITAL LETTER R ROTUNDA]
2170 -"\uA75A" => "R"
2171 -
2172 -# Ꞃ [LATIN CAPITAL LETTER INSULAR R]
2173 -"\uA782" => "R"
2174 -
2175 -# R [FULLWIDTH LATIN CAPITAL LETTER R]
2176 -"\uFF32" => "R"
2177 -
2178 -# ŕ [LATIN SMALL LETTER R WITH ACUTE]
2179 -"\u0155" => "r"
2180 -
2181 -# ŗ [LATIN SMALL LETTER R WITH CEDILLA]
2182 -"\u0157" => "r"
2183 -
2184 -# ř [LATIN SMALL LETTER R WITH CARON]
2185 -"\u0159" => "r"
2186 -
2187 -# ȑ [LATIN SMALL LETTER R WITH DOUBLE GRAVE]
2188 -"\u0211" => "r"
2189 -
2190 -# ȓ [LATIN SMALL LETTER R WITH INVERTED BREVE]
2191 -"\u0213" => "r"
2192 -
2193 -# ɍ [LATIN SMALL LETTER R WITH STROKE]
2194 -"\u024D" => "r"
2195 -
2196 -# ɼ [LATIN SMALL LETTER R WITH LONG LEG]
2197 -"\u027C" => "r"
2198 -
2199 -# ɽ [LATIN SMALL LETTER R WITH TAIL]
2200 -"\u027D" => "r"
2201 -
2202 -# ɾ [LATIN SMALL LETTER R WITH FISHHOOK]
2203 -"\u027E" => "r"
2204 -
2205 -# ɿ [LATIN SMALL LETTER REVERSED R WITH FISHHOOK]
2206 -"\u027F" => "r"
2207 -
2208 -# ᵣ [LATIN SUBSCRIPT SMALL LETTER R]
2209 -"\u1D63" => "r"
2210 -
2211 -# ᵲ [LATIN SMALL LETTER R WITH MIDDLE TILDE]
2212 -"\u1D72" => "r"
2213 -
2214 -# ᵳ [LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE]
2215 -"\u1D73" => "r"
2216 -
2217 -# ᶉ [LATIN SMALL LETTER R WITH PALATAL HOOK]
2218 -"\u1D89" => "r"
2219 -
2220 -# ṙ [LATIN SMALL LETTER R WITH DOT ABOVE]
2221 -"\u1E59" => "r"
2222 -
2223 -# ṛ [LATIN SMALL LETTER R WITH DOT BELOW]
2224 -"\u1E5B" => "r"
2225 -
2226 -# ṝ [LATIN SMALL LETTER R WITH DOT BELOW AND MACRON]
2227 -"\u1E5D" => "r"
2228 -
2229 -# ṟ [LATIN SMALL LETTER R WITH LINE BELOW]
2230 -"\u1E5F" => "r"
2231 -
2232 -# ⓡ [CIRCLED LATIN SMALL LETTER R]
2233 -"\u24E1" => "r"
2234 -
2235 -# ꝛ [LATIN SMALL LETTER R ROTUNDA]
2236 -"\uA75B" => "r"
2237 -
2238 -# ꞃ [LATIN SMALL LETTER INSULAR R]
2239 -"\uA783" => "r"
2240 -
2241 -# r [FULLWIDTH LATIN SMALL LETTER R]
2242 -"\uFF52" => "r"
2243 -
2244 -# ⒭ [PARENTHESIZED LATIN SMALL LETTER R]
2245 -"\u24AD" => "(r)"
2246 -
2247 -# Ś [LATIN CAPITAL LETTER S WITH ACUTE]
2248 -"\u015A" => "S"
2249 -
2250 -# Ŝ [LATIN CAPITAL LETTER S WITH CIRCUMFLEX]
2251 -"\u015C" => "S"
2252 -
2253 -# Ş [LATIN CAPITAL LETTER S WITH CEDILLA]
2254 -"\u015E" => "S"
2255 -
2256 -# Š [LATIN CAPITAL LETTER S WITH CARON]
2257 -"\u0160" => "S"
2258 -
2259 -# Ș [LATIN CAPITAL LETTER S WITH COMMA BELOW]
2260 -"\u0218" => "S"
2261 -
2262 -# Ṡ [LATIN CAPITAL LETTER S WITH DOT ABOVE]
2263 -"\u1E60" => "S"
2264 -
2265 -# Ṣ [LATIN CAPITAL LETTER S WITH DOT BELOW]
2266 -"\u1E62" => "S"
2267 -
2268 -# Ṥ [LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE]
2269 -"\u1E64" => "S"
2270 -
2271 -# Ṧ [LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE]
2272 -"\u1E66" => "S"
2273 -
2274 -# Ṩ [LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE]
2275 -"\u1E68" => "S"
2276 -
2277 -# Ⓢ [CIRCLED LATIN CAPITAL LETTER S]
2278 -"\u24C8" => "S"
2279 -
2280 -# ꜱ [LATIN LETTER SMALL CAPITAL S]
2281 -"\uA731" => "S"
2282 -
2283 -# ꞅ [LATIN SMALL LETTER INSULAR S]
2284 -"\uA785" => "S"
2285 -
2286 -# S [FULLWIDTH LATIN CAPITAL LETTER S]
2287 -"\uFF33" => "S"
2288 -
2289 -# ś [LATIN SMALL LETTER S WITH ACUTE]
2290 -"\u015B" => "s"
2291 -
2292 -# ŝ [LATIN SMALL LETTER S WITH CIRCUMFLEX]
2293 -"\u015D" => "s"
2294 -
2295 -# ş [LATIN SMALL LETTER S WITH CEDILLA]
2296 -"\u015F" => "s"
2297 -
2298 -# š [LATIN SMALL LETTER S WITH CARON]
2299 -"\u0161" => "s"
2300 -
2301 -# ſ http://en.wikipedia.org/wiki/Long_S [LATIN SMALL LETTER LONG S]
2302 -"\u017F" => "s"
2303 -
2304 -# ș [LATIN SMALL LETTER S WITH COMMA BELOW]
2305 -"\u0219" => "s"
2306 -
2307 -# ȿ [LATIN SMALL LETTER S WITH SWASH TAIL]
2308 -"\u023F" => "s"
2309 -
2310 -# ʂ [LATIN SMALL LETTER S WITH HOOK]
2311 -"\u0282" => "s"
2312 -
2313 -# ᵴ [LATIN SMALL LETTER S WITH MIDDLE TILDE]
2314 -"\u1D74" => "s"
2315 -
2316 -# ᶊ [LATIN SMALL LETTER S WITH PALATAL HOOK]
2317 -"\u1D8A" => "s"
2318 -
2319 -# ṡ [LATIN SMALL LETTER S WITH DOT ABOVE]
2320 -"\u1E61" => "s"
2321 -
2322 -# ṣ [LATIN SMALL LETTER S WITH DOT BELOW]
2323 -"\u1E63" => "s"
2324 -
2325 -# ṥ [LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE]
2326 -"\u1E65" => "s"
2327 -
2328 -# ṧ [LATIN SMALL LETTER S WITH CARON AND DOT ABOVE]
2329 -"\u1E67" => "s"
2330 -
2331 -# ṩ [LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE]
2332 -"\u1E69" => "s"
2333 -
2334 -# ẜ [LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE]
2335 -"\u1E9C" => "s"
2336 -
2337 -# ẝ [LATIN SMALL LETTER LONG S WITH HIGH STROKE]
2338 -"\u1E9D" => "s"
2339 -
2340 -# ⓢ [CIRCLED LATIN SMALL LETTER S]
2341 -"\u24E2" => "s"
2342 -
2343 -# Ꞅ [LATIN CAPITAL LETTER INSULAR S]
2344 -"\uA784" => "s"
2345 -
2346 -# s [FULLWIDTH LATIN SMALL LETTER S]
2347 -"\uFF53" => "s"
2348 -
2349 -# ẞ [LATIN CAPITAL LETTER SHARP S]
2350 -"\u1E9E" => "SS"
2351 -
2352 -# ⒮ [PARENTHESIZED LATIN SMALL LETTER S]
2353 -"\u24AE" => "(s)"
2354 -
2355 -# ß [LATIN SMALL LETTER SHARP S]
2356 -"\u00DF" => "ss"
2357 -
2358 -# st [LATIN SMALL LIGATURE ST]
2359 -"\uFB06" => "st"
2360 -
2361 -# Ţ [LATIN CAPITAL LETTER T WITH CEDILLA]
2362 -"\u0162" => "T"
2363 -
2364 -# Ť [LATIN CAPITAL LETTER T WITH CARON]
2365 -"\u0164" => "T"
2366 -
2367 -# Ŧ [LATIN CAPITAL LETTER T WITH STROKE]
2368 -"\u0166" => "T"
2369 -
2370 -# Ƭ [LATIN CAPITAL LETTER T WITH HOOK]
2371 -"\u01AC" => "T"
2372 -
2373 -# Ʈ [LATIN CAPITAL LETTER T WITH RETROFLEX HOOK]
2374 -"\u01AE" => "T"
2375 -
2376 -# Ț [LATIN CAPITAL LETTER T WITH COMMA BELOW]
2377 -"\u021A" => "T"
2378 -
2379 -# Ⱦ [LATIN CAPITAL LETTER T WITH DIAGONAL STROKE]
2380 -"\u023E" => "T"
2381 -
2382 -# ᴛ [LATIN LETTER SMALL CAPITAL T]
2383 -"\u1D1B" => "T"
2384 -
2385 -# Ṫ [LATIN CAPITAL LETTER T WITH DOT ABOVE]
2386 -"\u1E6A" => "T"
2387 -
2388 -# Ṭ [LATIN CAPITAL LETTER T WITH DOT BELOW]
2389 -"\u1E6C" => "T"
2390 -
2391 -# Ṯ [LATIN CAPITAL LETTER T WITH LINE BELOW]
2392 -"\u1E6E" => "T"
2393 -
2394 -# Ṱ [LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW]
2395 -"\u1E70" => "T"
2396 -
2397 -# Ⓣ [CIRCLED LATIN CAPITAL LETTER T]
2398 -"\u24C9" => "T"
2399 -
2400 -# Ꞇ [LATIN CAPITAL LETTER INSULAR T]
2401 -"\uA786" => "T"
2402 -
2403 -# T [FULLWIDTH LATIN CAPITAL LETTER T]
2404 -"\uFF34" => "T"
2405 -
2406 -# ţ [LATIN SMALL LETTER T WITH CEDILLA]
2407 -"\u0163" => "t"
2408 -
2409 -# ť [LATIN SMALL LETTER T WITH CARON]
2410 -"\u0165" => "t"
2411 -
2412 -# ŧ [LATIN SMALL LETTER T WITH STROKE]
2413 -"\u0167" => "t"
2414 -
2415 -# ƫ [LATIN SMALL LETTER T WITH PALATAL HOOK]
2416 -"\u01AB" => "t"
2417 -
2418 -# ƭ [LATIN SMALL LETTER T WITH HOOK]
2419 -"\u01AD" => "t"
2420 -
2421 -# ț [LATIN SMALL LETTER T WITH COMMA BELOW]
2422 -"\u021B" => "t"
2423 -
2424 -# ȶ [LATIN SMALL LETTER T WITH CURL]
2425 -"\u0236" => "t"
2426 -
2427 -# ʇ [LATIN SMALL LETTER TURNED T]
2428 -"\u0287" => "t"
2429 -
2430 -# ʈ [LATIN SMALL LETTER T WITH RETROFLEX HOOK]
2431 -"\u0288" => "t"
2432 -
2433 -# ᵵ [LATIN SMALL LETTER T WITH MIDDLE TILDE]
2434 -"\u1D75" => "t"
2435 -
2436 -# ṫ [LATIN SMALL LETTER T WITH DOT ABOVE]
2437 -"\u1E6B" => "t"
2438 -
2439 -# ṭ [LATIN SMALL LETTER T WITH DOT BELOW]
2440 -"\u1E6D" => "t"
2441 -
2442 -# ṯ [LATIN SMALL LETTER T WITH LINE BELOW]
2443 -"\u1E6F" => "t"
2444 -
2445 -# ṱ [LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW]
2446 -"\u1E71" => "t"
2447 -
2448 -# ẗ [LATIN SMALL LETTER T WITH DIAERESIS]
2449 -"\u1E97" => "t"
2450 -
2451 -# ⓣ [CIRCLED LATIN SMALL LETTER T]
2452 -"\u24E3" => "t"
2453 -
2454 -# ⱦ [LATIN SMALL LETTER T WITH DIAGONAL STROKE]
2455 -"\u2C66" => "t"
2456 -
2457 -# t [FULLWIDTH LATIN SMALL LETTER T]
2458 -"\uFF54" => "t"
2459 -
2460 -# Þ [LATIN CAPITAL LETTER THORN]
2461 -"\u00DE" => "TH"
2462 -
2463 -# Ꝧ [LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER]
2464 -"\uA766" => "TH"
2465 -
2466 -# Ꜩ [LATIN CAPITAL LETTER TZ]
2467 -"\uA728" => "TZ"
2468 -
2469 -# ⒯ [PARENTHESIZED LATIN SMALL LETTER T]
2470 -"\u24AF" => "(t)"
2471 -
2472 -# ʨ [LATIN SMALL LETTER TC DIGRAPH WITH CURL]
2473 -"\u02A8" => "tc"
2474 -
2475 -# þ [LATIN SMALL LETTER THORN]
2476 -"\u00FE" => "th"
2477 -
2478 -# ᵺ [LATIN SMALL LETTER TH WITH STRIKETHROUGH]
2479 -"\u1D7A" => "th"
2480 -
2481 -# ꝧ [LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER]
2482 -"\uA767" => "th"
2483 -
2484 -# ʦ [LATIN SMALL LETTER TS DIGRAPH]
2485 -"\u02A6" => "ts"
2486 -
2487 -# ꜩ [LATIN SMALL LETTER TZ]
2488 -"\uA729" => "tz"
2489 -
2490 -# Ù [LATIN CAPITAL LETTER U WITH GRAVE]
2491 -"\u00D9" => "U"
2492 -
2493 -# Ú [LATIN CAPITAL LETTER U WITH ACUTE]
2494 -"\u00DA" => "U"
2495 -
2496 -# Û [LATIN CAPITAL LETTER U WITH CIRCUMFLEX]
2497 -"\u00DB" => "U"
2498 -
2499 -# Ü [LATIN CAPITAL LETTER U WITH DIAERESIS]
2500 -"\u00DC" => "U"
2501 -
2502 -# Ũ [LATIN CAPITAL LETTER U WITH TILDE]
2503 -"\u0168" => "U"
2504 -
2505 -# Ū [LATIN CAPITAL LETTER U WITH MACRON]
2506 -"\u016A" => "U"
2507 -
2508 -# Ŭ [LATIN CAPITAL LETTER U WITH BREVE]
2509 -"\u016C" => "U"
2510 -
2511 -# Ů [LATIN CAPITAL LETTER U WITH RING ABOVE]
2512 -"\u016E" => "U"
2513 -
2514 -# Ű [LATIN CAPITAL LETTER U WITH DOUBLE ACUTE]
2515 -"\u0170" => "U"
2516 -
2517 -# Ų [LATIN CAPITAL LETTER U WITH OGONEK]
2518 -"\u0172" => "U"
2519 -
2520 -# Ư [LATIN CAPITAL LETTER U WITH HORN]
2521 -"\u01AF" => "U"
2522 -
2523 -# Ǔ [LATIN CAPITAL LETTER U WITH CARON]
2524 -"\u01D3" => "U"
2525 -
2526 -# Ǖ [LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON]
2527 -"\u01D5" => "U"
2528 -
2529 -# Ǘ [LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE]
2530 -"\u01D7" => "U"
2531 -
2532 -# Ǚ [LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON]
2533 -"\u01D9" => "U"
2534 -
2535 -# Ǜ [LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE]
2536 -"\u01DB" => "U"
2537 -
2538 -# Ȕ [LATIN CAPITAL LETTER U WITH DOUBLE GRAVE]
2539 -"\u0214" => "U"
2540 -
2541 -# Ȗ [LATIN CAPITAL LETTER U WITH INVERTED BREVE]
2542 -"\u0216" => "U"
2543 -
2544 -# Ʉ [LATIN CAPITAL LETTER U BAR]
2545 -"\u0244" => "U"
2546 -
2547 -# ᴜ [LATIN LETTER SMALL CAPITAL U]
2548 -"\u1D1C" => "U"
2549 -
2550 -# ᵾ [LATIN SMALL CAPITAL LETTER U WITH STROKE]
2551 -"\u1D7E" => "U"
2552 -
2553 -# Ṳ [LATIN CAPITAL LETTER U WITH DIAERESIS BELOW]
2554 -"\u1E72" => "U"
2555 -
2556 -# Ṵ [LATIN CAPITAL LETTER U WITH TILDE BELOW]
2557 -"\u1E74" => "U"
2558 -
2559 -# Ṷ [LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW]
2560 -"\u1E76" => "U"
2561 -
2562 -# Ṹ [LATIN CAPITAL LETTER U WITH TILDE AND ACUTE]
2563 -"\u1E78" => "U"
2564 -
2565 -# Ṻ [LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS]
2566 -"\u1E7A" => "U"
2567 -
2568 -# Ụ [LATIN CAPITAL LETTER U WITH DOT BELOW]
2569 -"\u1EE4" => "U"
2570 -
2571 -# Ủ [LATIN CAPITAL LETTER U WITH HOOK ABOVE]
2572 -"\u1EE6" => "U"
2573 -
2574 -# Ứ [LATIN CAPITAL LETTER U WITH HORN AND ACUTE]
2575 -"\u1EE8" => "U"
2576 -
2577 -# Ừ [LATIN CAPITAL LETTER U WITH HORN AND GRAVE]
2578 -"\u1EEA" => "U"
2579 -
2580 -# Ử [LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE]
2581 -"\u1EEC" => "U"
2582 -
2583 -# Ữ [LATIN CAPITAL LETTER U WITH HORN AND TILDE]
2584 -"\u1EEE" => "U"
2585 -
2586 -# Ự [LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW]
2587 -"\u1EF0" => "U"
2588 -
2589 -# Ⓤ [CIRCLED LATIN CAPITAL LETTER U]
2590 -"\u24CA" => "U"
2591 -
2592 -# U [FULLWIDTH LATIN CAPITAL LETTER U]
2593 -"\uFF35" => "U"
2594 -
2595 -# ù [LATIN SMALL LETTER U WITH GRAVE]
2596 -"\u00F9" => "u"
2597 -
2598 -# ú [LATIN SMALL LETTER U WITH ACUTE]
2599 -"\u00FA" => "u"
2600 -
2601 -# û [LATIN SMALL LETTER U WITH CIRCUMFLEX]
2602 -"\u00FB" => "u"
2603 -
2604 -# ü [LATIN SMALL LETTER U WITH DIAERESIS]
2605 -"\u00FC" => "u"
2606 -
2607 -# ũ [LATIN SMALL LETTER U WITH TILDE]
2608 -"\u0169" => "u"
2609 -
2610 -# ū [LATIN SMALL LETTER U WITH MACRON]
2611 -"\u016B" => "u"
2612 -
2613 -# ŭ [LATIN SMALL LETTER U WITH BREVE]
2614 -"\u016D" => "u"
2615 -
2616 -# ů [LATIN SMALL LETTER U WITH RING ABOVE]
2617 -"\u016F" => "u"
2618 -
2619 -# ű [LATIN SMALL LETTER U WITH DOUBLE ACUTE]
2620 -"\u0171" => "u"
2621 -
2622 -# ų [LATIN SMALL LETTER U WITH OGONEK]
2623 -"\u0173" => "u"
2624 -
2625 -# ư [LATIN SMALL LETTER U WITH HORN]
2626 -"\u01B0" => "u"
2627 -
2628 -# ǔ [LATIN SMALL LETTER U WITH CARON]
2629 -"\u01D4" => "u"
2630 -
2631 -# ǖ [LATIN SMALL LETTER U WITH DIAERESIS AND MACRON]
2632 -"\u01D6" => "u"
2633 -
2634 -# ǘ [LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE]
2635 -"\u01D8" => "u"
2636 -
2637 -# ǚ [LATIN SMALL LETTER U WITH DIAERESIS AND CARON]
2638 -"\u01DA" => "u"
2639 -
2640 -# ǜ [LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE]
2641 -"\u01DC" => "u"
2642 -
2643 -# ȕ [LATIN SMALL LETTER U WITH DOUBLE GRAVE]
2644 -"\u0215" => "u"
2645 -
2646 -# ȗ [LATIN SMALL LETTER U WITH INVERTED BREVE]
2647 -"\u0217" => "u"
2648 -
2649 -# ʉ [LATIN SMALL LETTER U BAR]
2650 -"\u0289" => "u"
2651 -
2652 -# ᵤ [LATIN SUBSCRIPT SMALL LETTER U]
2653 -"\u1D64" => "u"
2654 -
2655 -# ᶙ [LATIN SMALL LETTER U WITH RETROFLEX HOOK]
2656 -"\u1D99" => "u"
2657 -
2658 -# ṳ [LATIN SMALL LETTER U WITH DIAERESIS BELOW]
2659 -"\u1E73" => "u"
2660 -
2661 -# ṵ [LATIN SMALL LETTER U WITH TILDE BELOW]
2662 -"\u1E75" => "u"
2663 -
2664 -# ṷ [LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW]
2665 -"\u1E77" => "u"
2666 -
2667 -# ṹ [LATIN SMALL LETTER U WITH TILDE AND ACUTE]
2668 -"\u1E79" => "u"
2669 -
2670 -# ṻ [LATIN SMALL LETTER U WITH MACRON AND DIAERESIS]
2671 -"\u1E7B" => "u"
2672 -
2673 -# ụ [LATIN SMALL LETTER U WITH DOT BELOW]
2674 -"\u1EE5" => "u"
2675 -
2676 -# ủ [LATIN SMALL LETTER U WITH HOOK ABOVE]
2677 -"\u1EE7" => "u"
2678 -
2679 -# ứ [LATIN SMALL LETTER U WITH HORN AND ACUTE]
2680 -"\u1EE9" => "u"
2681 -
2682 -# ừ [LATIN SMALL LETTER U WITH HORN AND GRAVE]
2683 -"\u1EEB" => "u"
2684 -
2685 -# ử [LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE]
2686 -"\u1EED" => "u"
2687 -
2688 -# ữ [LATIN SMALL LETTER U WITH HORN AND TILDE]
2689 -"\u1EEF" => "u"
2690 -
2691 -# ự [LATIN SMALL LETTER U WITH HORN AND DOT BELOW]
2692 -"\u1EF1" => "u"
2693 -
2694 -# ⓤ [CIRCLED LATIN SMALL LETTER U]
2695 -"\u24E4" => "u"
2696 -
2697 -# u [FULLWIDTH LATIN SMALL LETTER U]
2698 -"\uFF55" => "u"
2699 -
2700 -# ⒰ [PARENTHESIZED LATIN SMALL LETTER U]
2701 -"\u24B0" => "(u)"
2702 -
2703 -# ᵫ [LATIN SMALL LETTER UE]
2704 -"\u1D6B" => "ue"
2705 -
2706 -# Ʋ [LATIN CAPITAL LETTER V WITH HOOK]
2707 -"\u01B2" => "V"
2708 -
2709 -# Ʌ [LATIN CAPITAL LETTER TURNED V]
2710 -"\u0245" => "V"
2711 -
2712 -# ᴠ [LATIN LETTER SMALL CAPITAL V]
2713 -"\u1D20" => "V"
2714 -
2715 -# Ṽ [LATIN CAPITAL LETTER V WITH TILDE]
2716 -"\u1E7C" => "V"
2717 -
2718 -# Ṿ [LATIN CAPITAL LETTER V WITH DOT BELOW]
2719 -"\u1E7E" => "V"
2720 -
2721 -# Ỽ [LATIN CAPITAL LETTER MIDDLE-WELSH V]
2722 -"\u1EFC" => "V"
2723 -
2724 -# Ⓥ [CIRCLED LATIN CAPITAL LETTER V]
2725 -"\u24CB" => "V"
2726 -
2727 -# Ꝟ [LATIN CAPITAL LETTER V WITH DIAGONAL STROKE]
2728 -"\uA75E" => "V"
2729 -
2730 -# Ꝩ [LATIN CAPITAL LETTER VEND]
2731 -"\uA768" => "V"
2732 -
2733 -# V [FULLWIDTH LATIN CAPITAL LETTER V]
2734 -"\uFF36" => "V"
2735 -
2736 -# ʋ [LATIN SMALL LETTER V WITH HOOK]
2737 -"\u028B" => "v"
2738 -
2739 -# ʌ [LATIN SMALL LETTER TURNED V]
2740 -"\u028C" => "v"
2741 -
2742 -# ᵥ [LATIN SUBSCRIPT SMALL LETTER V]
2743 -"\u1D65" => "v"
2744 -
2745 -# ᶌ [LATIN SMALL LETTER V WITH PALATAL HOOK]
2746 -"\u1D8C" => "v"
2747 -
2748 -# ṽ [LATIN SMALL LETTER V WITH TILDE]
2749 -"\u1E7D" => "v"
2750 -
2751 -# ṿ [LATIN SMALL LETTER V WITH DOT BELOW]
2752 -"\u1E7F" => "v"
2753 -
2754 -# ⓥ [CIRCLED LATIN SMALL LETTER V]
2755 -"\u24E5" => "v"
2756 -
2757 -# ⱱ [LATIN SMALL LETTER V WITH RIGHT HOOK]
2758 -"\u2C71" => "v"
2759 -
2760 -# ⱴ [LATIN SMALL LETTER V WITH CURL]
2761 -"\u2C74" => "v"
2762 -
2763 -# ꝟ [LATIN SMALL LETTER V WITH DIAGONAL STROKE]
2764 -"\uA75F" => "v"
2765 -
2766 -# v [FULLWIDTH LATIN SMALL LETTER V]
2767 -"\uFF56" => "v"
2768 -
2769 -# Ꝡ [LATIN CAPITAL LETTER VY]
2770 -"\uA760" => "VY"
2771 -
2772 -# ⒱ [PARENTHESIZED LATIN SMALL LETTER V]
2773 -"\u24B1" => "(v)"
2774 -
2775 -# ꝡ [LATIN SMALL LETTER VY]
2776 -"\uA761" => "vy"
2777 -
2778 -# Ŵ [LATIN CAPITAL LETTER W WITH CIRCUMFLEX]
2779 -"\u0174" => "W"
2780 -
2781 -# Ƿ http://en.wikipedia.org/wiki/Wynn [LATIN CAPITAL LETTER WYNN]
2782 -"\u01F7" => "W"
2783 -
2784 -# ᴡ [LATIN LETTER SMALL CAPITAL W]
2785 -"\u1D21" => "W"
2786 -
2787 -# Ẁ [LATIN CAPITAL LETTER W WITH GRAVE]
2788 -"\u1E80" => "W"
2789 -
2790 -# Ẃ [LATIN CAPITAL LETTER W WITH ACUTE]
2791 -"\u1E82" => "W"
2792 -
2793 -# Ẅ [LATIN CAPITAL LETTER W WITH DIAERESIS]
2794 -"\u1E84" => "W"
2795 -
2796 -# Ẇ [LATIN CAPITAL LETTER W WITH DOT ABOVE]
2797 -"\u1E86" => "W"
2798 -
2799 -# Ẉ [LATIN CAPITAL LETTER W WITH DOT BELOW]
2800 -"\u1E88" => "W"
2801 -
2802 -# Ⓦ [CIRCLED LATIN CAPITAL LETTER W]
2803 -"\u24CC" => "W"
2804 -
2805 -# Ⱳ [LATIN CAPITAL LETTER W WITH HOOK]
2806 -"\u2C72" => "W"
2807 -
2808 -# W [FULLWIDTH LATIN CAPITAL LETTER W]
2809 -"\uFF37" => "W"
2810 -
2811 -# ŵ [LATIN SMALL LETTER W WITH CIRCUMFLEX]
2812 -"\u0175" => "w"
2813 -
2814 -# ƿ http://en.wikipedia.org/wiki/Wynn [LATIN LETTER WYNN]
2815 -"\u01BF" => "w"
2816 -
2817 -# ʍ [LATIN SMALL LETTER TURNED W]
2818 -"\u028D" => "w"
2819 -
2820 -# ẁ [LATIN SMALL LETTER W WITH GRAVE]
2821 -"\u1E81" => "w"
2822 -
2823 -# ẃ [LATIN SMALL LETTER W WITH ACUTE]
2824 -"\u1E83" => "w"
2825 -
2826 -# ẅ [LATIN SMALL LETTER W WITH DIAERESIS]
2827 -"\u1E85" => "w"
2828 -
2829 -# ẇ [LATIN SMALL LETTER W WITH DOT ABOVE]
2830 -"\u1E87" => "w"
2831 -
2832 -# ẉ [LATIN SMALL LETTER W WITH DOT BELOW]
2833 -"\u1E89" => "w"
2834 -
2835 -# ẘ [LATIN SMALL LETTER W WITH RING ABOVE]
2836 -"\u1E98" => "w"
2837 -
2838 -# ⓦ [CIRCLED LATIN SMALL LETTER W]
2839 -"\u24E6" => "w"
2840 -
2841 -# ⱳ [LATIN SMALL LETTER W WITH HOOK]
2842 -"\u2C73" => "w"
2843 -
2844 -# w [FULLWIDTH LATIN SMALL LETTER W]
2845 -"\uFF57" => "w"
2846 -
2847 -# ⒲ [PARENTHESIZED LATIN SMALL LETTER W]
2848 -"\u24B2" => "(w)"
2849 -
2850 -# Ẋ [LATIN CAPITAL LETTER X WITH DOT ABOVE]
2851 -"\u1E8A" => "X"
2852 -
2853 -# Ẍ [LATIN CAPITAL LETTER X WITH DIAERESIS]
2854 -"\u1E8C" => "X"
2855 -
2856 -# Ⓧ [CIRCLED LATIN CAPITAL LETTER X]
2857 -"\u24CD" => "X"
2858 -
2859 -# X [FULLWIDTH LATIN CAPITAL LETTER X]
2860 -"\uFF38" => "X"
2861 -
2862 -# ᶍ [LATIN SMALL LETTER X WITH PALATAL HOOK]
2863 -"\u1D8D" => "x"
2864 -
2865 -# ẋ [LATIN SMALL LETTER X WITH DOT ABOVE]
2866 -"\u1E8B" => "x"
2867 -
2868 -# ẍ [LATIN SMALL LETTER X WITH DIAERESIS]
2869 -"\u1E8D" => "x"
2870 -
2871 -# ₓ [LATIN SUBSCRIPT SMALL LETTER X]
2872 -"\u2093" => "x"
2873 -
2874 -# ⓧ [CIRCLED LATIN SMALL LETTER X]
2875 -"\u24E7" => "x"
2876 -
2877 -# x [FULLWIDTH LATIN SMALL LETTER X]
2878 -"\uFF58" => "x"
2879 -
2880 -# ⒳ [PARENTHESIZED LATIN SMALL LETTER X]
2881 -"\u24B3" => "(x)"
2882 -
2883 -# Ý [LATIN CAPITAL LETTER Y WITH ACUTE]
2884 -"\u00DD" => "Y"
2885 -
2886 -# Ŷ [LATIN CAPITAL LETTER Y WITH CIRCUMFLEX]
2887 -"\u0176" => "Y"
2888 -
2889 -# Ÿ [LATIN CAPITAL LETTER Y WITH DIAERESIS]
2890 -"\u0178" => "Y"
2891 -
2892 -# Ƴ [LATIN CAPITAL LETTER Y WITH HOOK]
2893 -"\u01B3" => "Y"
2894 -
2895 -# Ȳ [LATIN CAPITAL LETTER Y WITH MACRON]
2896 -"\u0232" => "Y"
2897 -
2898 -# Ɏ [LATIN CAPITAL LETTER Y WITH STROKE]
2899 -"\u024E" => "Y"
2900 -
2901 -# ʏ [LATIN LETTER SMALL CAPITAL Y]
2902 -"\u028F" => "Y"
2903 -
2904 -# Ẏ [LATIN CAPITAL LETTER Y WITH DOT ABOVE]
2905 -"\u1E8E" => "Y"
2906 -
2907 -# Ỳ [LATIN CAPITAL LETTER Y WITH GRAVE]
2908 -"\u1EF2" => "Y"
2909 -
2910 -# Ỵ [LATIN CAPITAL LETTER Y WITH DOT BELOW]
2911 -"\u1EF4" => "Y"
2912 -
2913 -# Ỷ [LATIN CAPITAL LETTER Y WITH HOOK ABOVE]
2914 -"\u1EF6" => "Y"
2915 -
2916 -# Ỹ [LATIN CAPITAL LETTER Y WITH TILDE]
2917 -"\u1EF8" => "Y"
2918 -
2919 -# Ỿ [LATIN CAPITAL LETTER Y WITH LOOP]
2920 -"\u1EFE" => "Y"
2921 -
2922 -# Ⓨ [CIRCLED LATIN CAPITAL LETTER Y]
2923 -"\u24CE" => "Y"
2924 -
2925 -# Y [FULLWIDTH LATIN CAPITAL LETTER Y]
2926 -"\uFF39" => "Y"
2927 -
2928 -# ý [LATIN SMALL LETTER Y WITH ACUTE]
2929 -"\u00FD" => "y"
2930 -
2931 -# ÿ [LATIN SMALL LETTER Y WITH DIAERESIS]
2932 -"\u00FF" => "y"
2933 -
2934 -# ŷ [LATIN SMALL LETTER Y WITH CIRCUMFLEX]
2935 -"\u0177" => "y"
2936 -
2937 -# ƴ [LATIN SMALL LETTER Y WITH HOOK]
2938 -"\u01B4" => "y"
2939 -
2940 -# ȳ [LATIN SMALL LETTER Y WITH MACRON]
2941 -"\u0233" => "y"
2942 -
2943 -# ɏ [LATIN SMALL LETTER Y WITH STROKE]
2944 -"\u024F" => "y"
2945 -
2946 -# ʎ [LATIN SMALL LETTER TURNED Y]
2947 -"\u028E" => "y"
2948 -
2949 -# ẏ [LATIN SMALL LETTER Y WITH DOT ABOVE]
2950 -"\u1E8F" => "y"
2951 -
2952 -# ẙ [LATIN SMALL LETTER Y WITH RING ABOVE]
2953 -"\u1E99" => "y"
2954 -
2955 -# ỳ [LATIN SMALL LETTER Y WITH GRAVE]
2956 -"\u1EF3" => "y"
2957 -
2958 -# ỵ [LATIN SMALL LETTER Y WITH DOT BELOW]
2959 -"\u1EF5" => "y"
2960 -
2961 -# ỷ [LATIN SMALL LETTER Y WITH HOOK ABOVE]
2962 -"\u1EF7" => "y"
2963 -
2964 -# ỹ [LATIN SMALL LETTER Y WITH TILDE]
2965 -"\u1EF9" => "y"
2966 -
2967 -# ỿ [LATIN SMALL LETTER Y WITH LOOP]
2968 -"\u1EFF" => "y"
2969 -
2970 -# ⓨ [CIRCLED LATIN SMALL LETTER Y]
2971 -"\u24E8" => "y"
2972 -
2973 -# y [FULLWIDTH LATIN SMALL LETTER Y]
2974 -"\uFF59" => "y"
2975 -
2976 -# ⒴ [PARENTHESIZED LATIN SMALL LETTER Y]
2977 -"\u24B4" => "(y)"
2978 -
2979 -# Ź [LATIN CAPITAL LETTER Z WITH ACUTE]
2980 -"\u0179" => "Z"
2981 -
2982 -# Ż [LATIN CAPITAL LETTER Z WITH DOT ABOVE]
2983 -"\u017B" => "Z"
2984 -
2985 -# Ž [LATIN CAPITAL LETTER Z WITH CARON]
2986 -"\u017D" => "Z"
2987 -
2988 -# Ƶ [LATIN CAPITAL LETTER Z WITH STROKE]
2989 -"\u01B5" => "Z"
2990 -
2991 -# Ȝ http://en.wikipedia.org/wiki/Yogh [LATIN CAPITAL LETTER YOGH]
2992 -"\u021C" => "Z"
2993 -
2994 -# Ȥ [LATIN CAPITAL LETTER Z WITH HOOK]
2995 -"\u0224" => "Z"
2996 -
2997 -# ᴢ [LATIN LETTER SMALL CAPITAL Z]
2998 -"\u1D22" => "Z"
2999 -
3000 -# Ẑ [LATIN CAPITAL LETTER Z WITH CIRCUMFLEX]
3001 -"\u1E90" => "Z"
3002 -
3003 -# Ẓ [LATIN CAPITAL LETTER Z WITH DOT BELOW]
3004 -"\u1E92" => "Z"
3005 -
3006 -# Ẕ [LATIN CAPITAL LETTER Z WITH LINE BELOW]
3007 -"\u1E94" => "Z"
3008 -
3009 -# Ⓩ [CIRCLED LATIN CAPITAL LETTER Z]
3010 -"\u24CF" => "Z"
3011 -
3012 -# Ⱬ [LATIN CAPITAL LETTER Z WITH DESCENDER]
3013 -"\u2C6B" => "Z"
3014 -
3015 -# Ꝣ [LATIN CAPITAL LETTER VISIGOTHIC Z]
3016 -"\uA762" => "Z"
3017 -
3018 -# Z [FULLWIDTH LATIN CAPITAL LETTER Z]
3019 -"\uFF3A" => "Z"
3020 -
3021 -# ź [LATIN SMALL LETTER Z WITH ACUTE]
3022 -"\u017A" => "z"
3023 -
3024 -# ż [LATIN SMALL LETTER Z WITH DOT ABOVE]
3025 -"\u017C" => "z"
3026 -
3027 -# ž [LATIN SMALL LETTER Z WITH CARON]
3028 -"\u017E" => "z"
3029 -
3030 -# ƶ [LATIN SMALL LETTER Z WITH STROKE]
3031 -"\u01B6" => "z"
3032 -
3033 -# ȝ http://en.wikipedia.org/wiki/Yogh [LATIN SMALL LETTER YOGH]
3034 -"\u021D" => "z"
3035 -
3036 -# ȥ [LATIN SMALL LETTER Z WITH HOOK]
3037 -"\u0225" => "z"
3038 -
3039 -# ɀ [LATIN SMALL LETTER Z WITH SWASH TAIL]
3040 -"\u0240" => "z"
3041 -
3042 -# ʐ [LATIN SMALL LETTER Z WITH RETROFLEX HOOK]
3043 -"\u0290" => "z"
3044 -
3045 -# ʑ [LATIN SMALL LETTER Z WITH CURL]
3046 -"\u0291" => "z"
3047 -
3048 -# ᵶ [LATIN SMALL LETTER Z WITH MIDDLE TILDE]
3049 -"\u1D76" => "z"
3050 -
3051 -# ᶎ [LATIN SMALL LETTER Z WITH PALATAL HOOK]
3052 -"\u1D8E" => "z"
3053 -
3054 -# ẑ [LATIN SMALL LETTER Z WITH CIRCUMFLEX]
3055 -"\u1E91" => "z"
3056 -
3057 -# ẓ [LATIN SMALL LETTER Z WITH DOT BELOW]
3058 -"\u1E93" => "z"
3059 -
3060 -# ẕ [LATIN SMALL LETTER Z WITH LINE BELOW]
3061 -"\u1E95" => "z"
3062 -
3063 -# ⓩ [CIRCLED LATIN SMALL LETTER Z]
3064 -"\u24E9" => "z"
3065 -
3066 -# ⱬ [LATIN SMALL LETTER Z WITH DESCENDER]
3067 -"\u2C6C" => "z"
3068 -
3069 -# ꝣ [LATIN SMALL LETTER VISIGOTHIC Z]
3070 -"\uA763" => "z"
3071 -
3072 -# z [FULLWIDTH LATIN SMALL LETTER Z]
3073 -"\uFF5A" => "z"
3074 -
3075 -# ⒵ [PARENTHESIZED LATIN SMALL LETTER Z]
3076 -"\u24B5" => "(z)"
3077 -
3078 -# ⁰ [SUPERSCRIPT ZERO]
3079 -"\u2070" => "0"
3080 -
3081 -# ₀ [SUBSCRIPT ZERO]
3082 -"\u2080" => "0"
3083 -
3084 -# ⓪ [CIRCLED DIGIT ZERO]
3085 -"\u24EA" => "0"
3086 -
3087 -# ⓿ [NEGATIVE CIRCLED DIGIT ZERO]
3088 -"\u24FF" => "0"
3089 -
3090 -# 0 [FULLWIDTH DIGIT ZERO]
3091 -"\uFF10" => "0"
3092 -
3093 -# ¹ [SUPERSCRIPT ONE]
3094 -"\u00B9" => "1"
3095 -
3096 -# ₁ [SUBSCRIPT ONE]
3097 -"\u2081" => "1"
3098 -
3099 -# ① [CIRCLED DIGIT ONE]
3100 -"\u2460" => "1"
3101 -
3102 -# ⓵ [DOUBLE CIRCLED DIGIT ONE]
3103 -"\u24F5" => "1"
3104 -
3105 -# ❶ [DINGBAT NEGATIVE CIRCLED DIGIT ONE]
3106 -"\u2776" => "1"
3107 -
3108 -# ➀ [DINGBAT CIRCLED SANS-SERIF DIGIT ONE]
3109 -"\u2780" => "1"
3110 -
3111 -# ➊ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE]
3112 -"\u278A" => "1"
3113 -
3114 -# 1 [FULLWIDTH DIGIT ONE]
3115 -"\uFF11" => "1"
3116 -
3117 -# ⒈ [DIGIT ONE FULL STOP]
3118 -"\u2488" => "1."
3119 -
3120 -# ⑴ [PARENTHESIZED DIGIT ONE]
3121 -"\u2474" => "(1)"
3122 -
3123 -# ² [SUPERSCRIPT TWO]
3124 -"\u00B2" => "2"
3125 -
3126 -# ₂ [SUBSCRIPT TWO]
3127 -"\u2082" => "2"
3128 -
3129 -# ② [CIRCLED DIGIT TWO]
3130 -"\u2461" => "2"
3131 -
3132 -# ⓶ [DOUBLE CIRCLED DIGIT TWO]
3133 -"\u24F6" => "2"
3134 -
3135 -# ❷ [DINGBAT NEGATIVE CIRCLED DIGIT TWO]
3136 -"\u2777" => "2"
3137 -
3138 -# ➁ [DINGBAT CIRCLED SANS-SERIF DIGIT TWO]
3139 -"\u2781" => "2"
3140 -
3141 -# ➋ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO]
3142 -"\u278B" => "2"
3143 -
3144 -# 2 [FULLWIDTH DIGIT TWO]
3145 -"\uFF12" => "2"
3146 -
3147 -# ⒉ [DIGIT TWO FULL STOP]
3148 -"\u2489" => "2."
3149 -
3150 -# ⑵ [PARENTHESIZED DIGIT TWO]
3151 -"\u2475" => "(2)"
3152 -
3153 -# ³ [SUPERSCRIPT THREE]
3154 -"\u00B3" => "3"
3155 -
3156 -# ₃ [SUBSCRIPT THREE]
3157 -"\u2083" => "3"
3158 -
3159 -# ③ [CIRCLED DIGIT THREE]
3160 -"\u2462" => "3"
3161 -
3162 -# ⓷ [DOUBLE CIRCLED DIGIT THREE]
3163 -"\u24F7" => "3"
3164 -
3165 -# ❸ [DINGBAT NEGATIVE CIRCLED DIGIT THREE]
3166 -"\u2778" => "3"
3167 -
3168 -# ➂ [DINGBAT CIRCLED SANS-SERIF DIGIT THREE]
3169 -"\u2782" => "3"
3170 -
3171 -# ➌ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE]
3172 -"\u278C" => "3"
3173 -
3174 -# 3 [FULLWIDTH DIGIT THREE]
3175 -"\uFF13" => "3"
3176 -
3177 -# ⒊ [DIGIT THREE FULL STOP]
3178 -"\u248A" => "3."
3179 -
3180 -# ⑶ [PARENTHESIZED DIGIT THREE]
3181 -"\u2476" => "(3)"
3182 -
3183 -# ⁴ [SUPERSCRIPT FOUR]
3184 -"\u2074" => "4"
3185 -
3186 -# ₄ [SUBSCRIPT FOUR]
3187 -"\u2084" => "4"
3188 -
3189 -# ④ [CIRCLED DIGIT FOUR]
3190 -"\u2463" => "4"
3191 -
3192 -# ⓸ [DOUBLE CIRCLED DIGIT FOUR]
3193 -"\u24F8" => "4"
3194 -
3195 -# ❹ [DINGBAT NEGATIVE CIRCLED DIGIT FOUR]
3196 -"\u2779" => "4"
3197 -
3198 -# ➃ [DINGBAT CIRCLED SANS-SERIF DIGIT FOUR]
3199 -"\u2783" => "4"
3200 -
3201 -# ➍ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR]
3202 -"\u278D" => "4"
3203 -
3204 -# 4 [FULLWIDTH DIGIT FOUR]
3205 -"\uFF14" => "4"
3206 -
3207 -# ⒋ [DIGIT FOUR FULL STOP]
3208 -"\u248B" => "4."
3209 -
3210 -# ⑷ [PARENTHESIZED DIGIT FOUR]
3211 -"\u2477" => "(4)"
3212 -
3213 -# ⁵ [SUPERSCRIPT FIVE]
3214 -"\u2075" => "5"
3215 -
3216 -# ₅ [SUBSCRIPT FIVE]
3217 -"\u2085" => "5"
3218 -
3219 -# ⑤ [CIRCLED DIGIT FIVE]
3220 -"\u2464" => "5"
3221 -
3222 -# ⓹ [DOUBLE CIRCLED DIGIT FIVE]
3223 -"\u24F9" => "5"
3224 -
3225 -# ❺ [DINGBAT NEGATIVE CIRCLED DIGIT FIVE]
3226 -"\u277A" => "5"
3227 -
3228 -# ➄ [DINGBAT CIRCLED SANS-SERIF DIGIT FIVE]
3229 -"\u2784" => "5"
3230 -
3231 -# ➎ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE]
3232 -"\u278E" => "5"
3233 -
3234 -# 5 [FULLWIDTH DIGIT FIVE]
3235 -"\uFF15" => "5"
3236 -
3237 -# ⒌ [DIGIT FIVE FULL STOP]
3238 -"\u248C" => "5."
3239 -
3240 -# ⑸ [PARENTHESIZED DIGIT FIVE]
3241 -"\u2478" => "(5)"
3242 -
3243 -# ⁶ [SUPERSCRIPT SIX]
3244 -"\u2076" => "6"
3245 -
3246 -# ₆ [SUBSCRIPT SIX]
3247 -"\u2086" => "6"
3248 -
3249 -# ⑥ [CIRCLED DIGIT SIX]
3250 -"\u2465" => "6"
3251 -
3252 -# ⓺ [DOUBLE CIRCLED DIGIT SIX]
3253 -"\u24FA" => "6"
3254 -
3255 -# ❻ [DINGBAT NEGATIVE CIRCLED DIGIT SIX]
3256 -"\u277B" => "6"
3257 -
3258 -# ➅ [DINGBAT CIRCLED SANS-SERIF DIGIT SIX]
3259 -"\u2785" => "6"
3260 -
3261 -# ➏ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX]
3262 -"\u278F" => "6"
3263 -
3264 -# 6 [FULLWIDTH DIGIT SIX]
3265 -"\uFF16" => "6"
3266 -
3267 -# ⒍ [DIGIT SIX FULL STOP]
3268 -"\u248D" => "6."
3269 -
3270 -# ⑹ [PARENTHESIZED DIGIT SIX]
3271 -"\u2479" => "(6)"
3272 -
3273 -# ⁷ [SUPERSCRIPT SEVEN]
3274 -"\u2077" => "7"
3275 -
3276 -# ₇ [SUBSCRIPT SEVEN]
3277 -"\u2087" => "7"
3278 -
3279 -# ⑦ [CIRCLED DIGIT SEVEN]
3280 -"\u2466" => "7"
3281 -
3282 -# ⓻ [DOUBLE CIRCLED DIGIT SEVEN]
3283 -"\u24FB" => "7"
3284 -
3285 -# ❼ [DINGBAT NEGATIVE CIRCLED DIGIT SEVEN]
3286 -"\u277C" => "7"
3287 -
3288 -# ➆ [DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN]
3289 -"\u2786" => "7"
3290 -
3291 -# ➐ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN]
3292 -"\u2790" => "7"
3293 -
3294 -# 7 [FULLWIDTH DIGIT SEVEN]
3295 -"\uFF17" => "7"
3296 -
3297 -# ⒎ [DIGIT SEVEN FULL STOP]
3298 -"\u248E" => "7."
3299 -
3300 -# ⑺ [PARENTHESIZED DIGIT SEVEN]
3301 -"\u247A" => "(7)"
3302 -
3303 -# ⁸ [SUPERSCRIPT EIGHT]
3304 -"\u2078" => "8"
3305 -
3306 -# ₈ [SUBSCRIPT EIGHT]
3307 -"\u2088" => "8"
3308 -
3309 -# ⑧ [CIRCLED DIGIT EIGHT]
3310 -"\u2467" => "8"
3311 -
3312 -# ⓼ [DOUBLE CIRCLED DIGIT EIGHT]
3313 -"\u24FC" => "8"
3314 -
3315 -# ❽ [DINGBAT NEGATIVE CIRCLED DIGIT EIGHT]
3316 -"\u277D" => "8"
3317 -
3318 -# ➇ [DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT]
3319 -"\u2787" => "8"
3320 -
3321 -# ➑ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT]
3322 -"\u2791" => "8"
3323 -
3324 -# 8 [FULLWIDTH DIGIT EIGHT]
3325 -"\uFF18" => "8"
3326 -
3327 -# ⒏ [DIGIT EIGHT FULL STOP]
3328 -"\u248F" => "8."
3329 -
3330 -# ⑻ [PARENTHESIZED DIGIT EIGHT]
3331 -"\u247B" => "(8)"
3332 -
3333 -# ⁹ [SUPERSCRIPT NINE]
3334 -"\u2079" => "9"
3335 -
3336 -# ₉ [SUBSCRIPT NINE]
3337 -"\u2089" => "9"
3338 -
3339 -# ⑨ [CIRCLED DIGIT NINE]
3340 -"\u2468" => "9"
3341 -
3342 -# ⓽ [DOUBLE CIRCLED DIGIT NINE]
3343 -"\u24FD" => "9"
3344 -
3345 -# ❾ [DINGBAT NEGATIVE CIRCLED DIGIT NINE]
3346 -"\u277E" => "9"
3347 -
3348 -# ➈ [DINGBAT CIRCLED SANS-SERIF DIGIT NINE]
3349 -"\u2788" => "9"
3350 -
3351 -# ➒ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE]
3352 -"\u2792" => "9"
3353 -
3354 -# 9 [FULLWIDTH DIGIT NINE]
3355 -"\uFF19" => "9"
3356 -
3357 -# ⒐ [DIGIT NINE FULL STOP]
3358 -"\u2490" => "9."
3359 -
3360 -# ⑼ [PARENTHESIZED DIGIT NINE]
3361 -"\u247C" => "(9)"
3362 -
3363 -# ⑩ [CIRCLED NUMBER TEN]
3364 -"\u2469" => "10"
3365 -
3366 -# ⓾ [DOUBLE CIRCLED NUMBER TEN]
3367 -"\u24FE" => "10"
3368 -
3369 -# ❿ [DINGBAT NEGATIVE CIRCLED NUMBER TEN]
3370 -"\u277F" => "10"
3371 -
3372 -# ➉ [DINGBAT CIRCLED SANS-SERIF NUMBER TEN]
3373 -"\u2789" => "10"
3374 -
3375 -# ➓ [DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN]
3376 -"\u2793" => "10"
3377 -
3378 -# ⒑ [NUMBER TEN FULL STOP]
3379 -"\u2491" => "10."
3380 -
3381 -# ⑽ [PARENTHESIZED NUMBER TEN]
3382 -"\u247D" => "(10)"
3383 -
3384 -# ⑪ [CIRCLED NUMBER ELEVEN]
3385 -"\u246A" => "11"
3386 -
3387 -# ⓫ [NEGATIVE CIRCLED NUMBER ELEVEN]
3388 -"\u24EB" => "11"
3389 -
3390 -# ⒒ [NUMBER ELEVEN FULL STOP]
3391 -"\u2492" => "11."
3392 -
3393 -# ⑾ [PARENTHESIZED NUMBER ELEVEN]
3394 -"\u247E" => "(11)"
3395 -
3396 -# ⑫ [CIRCLED NUMBER TWELVE]
3397 -"\u246B" => "12"
3398 -
3399 -# ⓬ [NEGATIVE CIRCLED NUMBER TWELVE]
3400 -"\u24EC" => "12"
3401 -
3402 -# ⒓ [NUMBER TWELVE FULL STOP]
3403 -"\u2493" => "12."
3404 -
3405 -# ⑿ [PARENTHESIZED NUMBER TWELVE]
3406 -"\u247F" => "(12)"
3407 -
3408 -# ⑬ [CIRCLED NUMBER THIRTEEN]
3409 -"\u246C" => "13"
3410 -
3411 -# ⓭ [NEGATIVE CIRCLED NUMBER THIRTEEN]
3412 -"\u24ED" => "13"
3413 -
3414 -# ⒔ [NUMBER THIRTEEN FULL STOP]
3415 -"\u2494" => "13."
3416 -
3417 -# ⒀ [PARENTHESIZED NUMBER THIRTEEN]
3418 -"\u2480" => "(13)"
3419 -
3420 -# ⑭ [CIRCLED NUMBER FOURTEEN]
3421 -"\u246D" => "14"
3422 -
3423 -# ⓮ [NEGATIVE CIRCLED NUMBER FOURTEEN]
3424 -"\u24EE" => "14"
3425 -
3426 -# ⒕ [NUMBER FOURTEEN FULL STOP]
3427 -"\u2495" => "14."
3428 -
3429 -# ⒁ [PARENTHESIZED NUMBER FOURTEEN]
3430 -"\u2481" => "(14)"
3431 -
3432 -# ⑮ [CIRCLED NUMBER FIFTEEN]
3433 -"\u246E" => "15"
3434 -
3435 -# ⓯ [NEGATIVE CIRCLED NUMBER FIFTEEN]
3436 -"\u24EF" => "15"
3437 -
3438 -# ⒖ [NUMBER FIFTEEN FULL STOP]
3439 -"\u2496" => "15."
3440 -
3441 -# ⒂ [PARENTHESIZED NUMBER FIFTEEN]
3442 -"\u2482" => "(15)"
3443 -
3444 -# ⑯ [CIRCLED NUMBER SIXTEEN]
3445 -"\u246F" => "16"
3446 -
3447 -# ⓰ [NEGATIVE CIRCLED NUMBER SIXTEEN]
3448 -"\u24F0" => "16"
3449 -
3450 -# ⒗ [NUMBER SIXTEEN FULL STOP]
3451 -"\u2497" => "16."
3452 -
3453 -# ⒃ [PARENTHESIZED NUMBER SIXTEEN]
3454 -"\u2483" => "(16)"
3455 -
3456 -# ⑰ [CIRCLED NUMBER SEVENTEEN]
3457 -"\u2470" => "17"
3458 -
3459 -# ⓱ [NEGATIVE CIRCLED NUMBER SEVENTEEN]
3460 -"\u24F1" => "17"
3461 -
3462 -# ⒘ [NUMBER SEVENTEEN FULL STOP]
3463 -"\u2498" => "17."
3464 -
3465 -# ⒄ [PARENTHESIZED NUMBER SEVENTEEN]
3466 -"\u2484" => "(17)"
3467 -
3468 -# ⑱ [CIRCLED NUMBER EIGHTEEN]
3469 -"\u2471" => "18"
3470 -
3471 -# ⓲ [NEGATIVE CIRCLED NUMBER EIGHTEEN]
3472 -"\u24F2" => "18"
3473 -
3474 -# ⒙ [NUMBER EIGHTEEN FULL STOP]
3475 -"\u2499" => "18."
3476 -
3477 -# ⒅ [PARENTHESIZED NUMBER EIGHTEEN]
3478 -"\u2485" => "(18)"
3479 -
3480 -# ⑲ [CIRCLED NUMBER NINETEEN]
3481 -"\u2472" => "19"
3482 -
3483 -# ⓳ [NEGATIVE CIRCLED NUMBER NINETEEN]
3484 -"\u24F3" => "19"
3485 -
3486 -# ⒚ [NUMBER NINETEEN FULL STOP]
3487 -"\u249A" => "19."
3488 -
3489 -# ⒆ [PARENTHESIZED NUMBER NINETEEN]
3490 -"\u2486" => "(19)"
3491 -
3492 -# ⑳ [CIRCLED NUMBER TWENTY]
3493 -"\u2473" => "20"
3494 -
3495 -# ⓴ [NEGATIVE CIRCLED NUMBER TWENTY]
3496 -"\u24F4" => "20"
3497 -
3498 -# ⒛ [NUMBER TWENTY FULL STOP]
3499 -"\u249B" => "20."
3500 -
3501 -# ⒇ [PARENTHESIZED NUMBER TWENTY]
3502 -"\u2487" => "(20)"
3503 -
3504 -# « [LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]
3505 -"\u00AB" => "\""
3506 -
3507 -# » [RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK]
3508 -"\u00BB" => "\""
3509 -
3510 -# “ [LEFT DOUBLE QUOTATION MARK]
3511 -"\u201C" => "\""
3512 -
3513 -# ” [RIGHT DOUBLE QUOTATION MARK]
3514 -"\u201D" => "\""
3515 -
3516 -# „ [DOUBLE LOW-9 QUOTATION MARK]
3517 -"\u201E" => "\""
3518 -
3519 -# ″ [DOUBLE PRIME]
3520 -"\u2033" => "\""
3521 -
3522 -# ‶ [REVERSED DOUBLE PRIME]
3523 -"\u2036" => "\""
3524 -
3525 -# ❝ [HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT]
3526 -"\u275D" => "\""
3527 -
3528 -# ❞ [HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT]
3529 -"\u275E" => "\""
3530 -
3531 -# ❮ [HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT]
3532 -"\u276E" => "\""
3533 -
3534 -# ❯ [HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT]
3535 -"\u276F" => "\""
3536 -
3537 -# " [FULLWIDTH QUOTATION MARK]
3538 -"\uFF02" => "\""
3539 -
3540 -# ‘ [LEFT SINGLE QUOTATION MARK]
3541 -"\u2018" => "\'"
3542 -
3543 -# ’ [RIGHT SINGLE QUOTATION MARK]
3544 -"\u2019" => "\'"
3545 -
3546 -# ‚ [SINGLE LOW-9 QUOTATION MARK]
3547 -"\u201A" => "\'"
3548 -
3549 -# ‛ [SINGLE HIGH-REVERSED-9 QUOTATION MARK]
3550 -"\u201B" => "\'"
3551 -
3552 -# ′ [PRIME]
3553 -"\u2032" => "\'"
3554 -
3555 -# ‵ [REVERSED PRIME]
3556 -"\u2035" => "\'"
3557 -
3558 -# ‹ [SINGLE LEFT-POINTING ANGLE QUOTATION MARK]
3559 -"\u2039" => "\'"
3560 -
3561 -# › [SINGLE RIGHT-POINTING ANGLE QUOTATION MARK]
3562 -"\u203A" => "\'"
3563 -
3564 -# ❛ [HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT]
3565 -"\u275B" => "\'"
3566 -
3567 -# ❜ [HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT]
3568 -"\u275C" => "\'"
3569 -
3570 -# ' [FULLWIDTH APOSTROPHE]
3571 -"\uFF07" => "\'"
3572 -
3573 -# ‐ [HYPHEN]
3574 -"\u2010" => "-"
3575 -
3576 -# ‑ [NON-BREAKING HYPHEN]
3577 -"\u2011" => "-"
3578 -
3579 -# ‒ [FIGURE DASH]
3580 -"\u2012" => "-"
3581 -
3582 -# – [EN DASH]
3583 -"\u2013" => "-"
3584 -
3585 -# — [EM DASH]
3586 -"\u2014" => "-"
3587 -
3588 -# ⁻ [SUPERSCRIPT MINUS]
3589 -"\u207B" => "-"
3590 -
3591 -# ₋ [SUBSCRIPT MINUS]
3592 -"\u208B" => "-"
3593 -
3594 -# - [FULLWIDTH HYPHEN-MINUS]
3595 -"\uFF0D" => "-"
3596 -
3597 -# ⁅ [LEFT SQUARE BRACKET WITH QUILL]
3598 -"\u2045" => "["
3599 -
3600 -# ❲ [LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT]
3601 -"\u2772" => "["
3602 -
3603 -# [ [FULLWIDTH LEFT SQUARE BRACKET]
3604 -"\uFF3B" => "["
3605 -
3606 -# ⁆ [RIGHT SQUARE BRACKET WITH QUILL]
3607 -"\u2046" => "]"
3608 -
3609 -# ❳ [LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT]
3610 -"\u2773" => "]"
3611 -
3612 -# ] [FULLWIDTH RIGHT SQUARE BRACKET]
3613 -"\uFF3D" => "]"
3614 -
3615 -# ⁽ [SUPERSCRIPT LEFT PARENTHESIS]
3616 -"\u207D" => "("
3617 -
3618 -# ₍ [SUBSCRIPT LEFT PARENTHESIS]
3619 -"\u208D" => "("
3620 -
3621 -# ❨ [MEDIUM LEFT PARENTHESIS ORNAMENT]
3622 -"\u2768" => "("
3623 -
3624 -# ❪ [MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT]
3625 -"\u276A" => "("
3626 -
3627 -# ( [FULLWIDTH LEFT PARENTHESIS]
3628 -"\uFF08" => "("
3629 -
3630 -# ⸨ [LEFT DOUBLE PARENTHESIS]
3631 -"\u2E28" => "(("
3632 -
3633 -# ⁾ [SUPERSCRIPT RIGHT PARENTHESIS]
3634 -"\u207E" => ")"
3635 -
3636 -# ₎ [SUBSCRIPT RIGHT PARENTHESIS]
3637 -"\u208E" => ")"
3638 -
3639 -# ❩ [MEDIUM RIGHT PARENTHESIS ORNAMENT]
3640 -"\u2769" => ")"
3641 -
3642 -# ❫ [MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT]
3643 -"\u276B" => ")"
3644 -
3645 -# ) [FULLWIDTH RIGHT PARENTHESIS]
3646 -"\uFF09" => ")"
3647 -
3648 -# ⸩ [RIGHT DOUBLE PARENTHESIS]
3649 -"\u2E29" => "))"
3650 -
3651 -# ❬ [MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT]
3652 -"\u276C" => "<"
3653 -
3654 -# ❰ [HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT]
3655 -"\u2770" => "<"
3656 -
3657 -# < [FULLWIDTH LESS-THAN SIGN]
3658 -"\uFF1C" => "<"
3659 -
3660 -# ❭ [MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT]
3661 -"\u276D" => ">"
3662 -
3663 -# ❱ [HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT]
3664 -"\u2771" => ">"
3665 -
3666 -# > [FULLWIDTH GREATER-THAN SIGN]
3667 -"\uFF1E" => ">"
3668 -
3669 -# ❴ [MEDIUM LEFT CURLY BRACKET ORNAMENT]
3670 -"\u2774" => "{"
3671 -
3672 -# { [FULLWIDTH LEFT CURLY BRACKET]
3673 -"\uFF5B" => "{"
3674 -
3675 -# ❵ [MEDIUM RIGHT CURLY BRACKET ORNAMENT]
3676 -"\u2775" => "}"
3677 -
3678 -# } [FULLWIDTH RIGHT CURLY BRACKET]
3679 -"\uFF5D" => "}"
3680 -
3681 -# ⁺ [SUPERSCRIPT PLUS SIGN]
3682 -"\u207A" => "+"
3683 -
3684 -# ₊ [SUBSCRIPT PLUS SIGN]
3685 -"\u208A" => "+"
3686 -
3687 -# + [FULLWIDTH PLUS SIGN]
3688 -"\uFF0B" => "+"
3689 -
3690 -# ⁼ [SUPERSCRIPT EQUALS SIGN]
3691 -"\u207C" => "="
3692 -
3693 -# ₌ [SUBSCRIPT EQUALS SIGN]
3694 -"\u208C" => "="
3695 -
3696 -# = [FULLWIDTH EQUALS SIGN]
3697 -"\uFF1D" => "="
3698 -
3699 -# ! [FULLWIDTH EXCLAMATION MARK]
3700 -"\uFF01" => "!"
3701 -
3702 -# ‼ [DOUBLE EXCLAMATION MARK]
3703 -"\u203C" => "!!"
3704 -
3705 -# ⁉ [EXCLAMATION QUESTION MARK]
3706 -"\u2049" => "!?"
3707 -
3708 -# # [FULLWIDTH NUMBER SIGN]
3709 -"\uFF03" => "#"
3710 -
3711 -# $ [FULLWIDTH DOLLAR SIGN]
3712 -"\uFF04" => "$"
3713 -
3714 -# ⁒ [COMMERCIAL MINUS SIGN]
3715 -"\u2052" => "%"
3716 -
3717 -# % [FULLWIDTH PERCENT SIGN]
3718 -"\uFF05" => "%"
3719 -
3720 -# & [FULLWIDTH AMPERSAND]
3721 -"\uFF06" => "&"
3722 -
3723 -# ⁎ [LOW ASTERISK]
3724 -"\u204E" => "*"
3725 -
3726 -# * [FULLWIDTH ASTERISK]
3727 -"\uFF0A" => "*"
3728 -
3729 -# , [FULLWIDTH COMMA]
3730 -"\uFF0C" => ","
3731 -
3732 -# . [FULLWIDTH FULL STOP]
3733 -"\uFF0E" => "."
3734 -
3735 -# ⁄ [FRACTION SLASH]
3736 -"\u2044" => "/"
3737 -
3738 -# / [FULLWIDTH SOLIDUS]
3739 -"\uFF0F" => "/"
3740 -
3741 -# : [FULLWIDTH COLON]
3742 -"\uFF1A" => ":"
3743 -
3744 -# ⁏ [REVERSED SEMICOLON]
3745 -"\u204F" => ";"
3746 -
3747 -# ; [FULLWIDTH SEMICOLON]
3748 -"\uFF1B" => ";"
3749 -
3750 -# ? [FULLWIDTH QUESTION MARK]
3751 -"\uFF1F" => "?"
3752 -
3753 -# ⁇ [DOUBLE QUESTION MARK]
3754 -"\u2047" => "??"
3755 -
3756 -# ⁈ [QUESTION EXCLAMATION MARK]
3757 -"\u2048" => "?!"
3758 -
3759 -# @ [FULLWIDTH COMMERCIAL AT]
3760 -"\uFF20" => "@"
3761 -
3762 -# \ [FULLWIDTH REVERSE SOLIDUS]
3763 -"\uFF3C" => "\\"
3764 -
3765 -# ‸ [CARET]
3766 -"\u2038" => "^"
3767 -
3768 -# ^ [FULLWIDTH CIRCUMFLEX ACCENT]
3769 -"\uFF3E" => "^"
3770 -
3771 -# _ [FULLWIDTH LOW LINE]
3772 -"\uFF3F" => "_"
3773 -
3774 -# ⁓ [SWUNG DASH]
3775 -"\u2053" => "~"
3776 -
3777 -# ~ [FULLWIDTH TILDE]
3778 -"\uFF5E" => "~"
3779 -
3780 -################################################################
3781 -# Below is the Perl script used to generate the above mappings #
3782 -# from ASCIIFoldingFilter.java: #
3783 -################################################################
3784 -#
3785 -# #!/usr/bin/perl
3786 -#
3787 -# use warnings;
3788 -# use strict;
3789 -#
3790 -# my @source_chars = ();
3791 -# my @source_char_descriptions = ();
3792 -# my $target = '';
3793 -#
3794 -# while (<>) {
3795 -# if (/case\s+'(\\u[A-F0-9]+)':\s*\/\/\s*(.*)/i) {
3796 -# push @source_chars, $1;
3797 -# push @source_char_descriptions, $2;
3798 -# next;
3799 -# }
3800 -# if (/output\[[^\]]+\]\s*=\s*'(\\'|\\\\|.)'/) {
3801 -# $target .= $1;
3802 -# next;
3803 -# }
3804 -# if (/break;/) {
3805 -# $target = "\\\"" if ($target eq '"');
3806 -# for my $source_char_num (0..$#source_chars) {
3807 -# print "# $source_char_descriptions[$source_char_num]\n";
3808 -# print "\"$source_chars[$source_char_num]\" => \"$target\"\n\n";
3809 -# }
3810 -# @source_chars = ();
3811 -# @source_char_descriptions = ();
3812 -# $target = '';
3813 -# }
3814 -# }
 2+# The ASF licenses this file to You under the Apache License, Version 2.0
 3+# (the "License"); you may not use this file except in compliance with
 4+# the License. You may obtain a copy of the License at
 5+#
 6+# http://www.apache.org/licenses/LICENSE-2.0
 7+#
 8+# Unless required by applicable law or agreed to in writing, software
 9+# distributed under the License is distributed on an "AS IS" BASIS,
 10+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 11+# See the License for the specific language governing permissions and
 12+# limitations under the License.
 13+
 14+
 15+# This map converts alphabetic, numeric, and symbolic Unicode characters
 16+# which are not in the first 127 ASCII characters (the "Basic Latin" Unicode
 17+# block) into their ASCII equivalents, if one exists.
 18+#
 19+# Characters from the following Unicode blocks are converted; however, only
 20+# those characters with reasonable ASCII alternatives are converted:
 21+#
 22+# - C1 Controls and Latin-1 Supplement: http://www.unicode.org/charts/PDF/U0080.pdf
 23+# - Latin Extended-A: http://www.unicode.org/charts/PDF/U0100.pdf
 24+# - Latin Extended-B: http://www.unicode.org/charts/PDF/U0180.pdf
 25+# - Latin Extended Additional: http://www.unicode.org/charts/PDF/U1E00.pdf
 26+# - Latin Extended-C: http://www.unicode.org/charts/PDF/U2C60.pdf
 27+# - Latin Extended-D: http://www.unicode.org/charts/PDF/UA720.pdf
 28+# - IPA Extensions: http://www.unicode.org/charts/PDF/U0250.pdf
 29+# - Phonetic Extensions: http://www.unicode.org/charts/PDF/U1D00.pdf
 30+# - Phonetic Extensions Supplement: http://www.unicode.org/charts/PDF/U1D80.pdf
 31+# - General Punctuation: http://www.unicode.org/charts/PDF/U2000.pdf
 32+# - Superscripts and Subscripts: http://www.unicode.org/charts/PDF/U2070.pdf
 33+# - Enclosed Alphanumerics: http://www.unicode.org/charts/PDF/U2460.pdf
 34+# - Dingbats: http://www.unicode.org/charts/PDF/U2700.pdf
 35+# - Supplemental Punctuation: http://www.unicode.org/charts/PDF/U2E00.pdf
 36+# - Alphabetic Presentation Forms: http://www.unicode.org/charts/PDF/UFB00.pdf
 37+# - Halfwidth and Fullwidth Forms: http://www.unicode.org/charts/PDF/UFF00.pdf
 38+#
 39+# See: http://en.wikipedia.org/wiki/Latin_characters_in_Unicode
 40+#
 41+# The set of character conversions supported by this map is a superset of
 42+# those supported by the map represented by mapping-ISOLatin1Accent.txt.
 43+#
 44+# See the bottom of this file for the Perl script used to generate the contents
 45+# of this file (without this header) from ASCIIFoldingFilter.java.
 46+
 47+
 48+# Syntax:
 49+# "source" => "target"
 50+# "source".length() > 0 (source cannot be empty.)
 51+# "target".length() >= 0 (target can be empty.)
 52+
 53+
 54+# À [LATIN CAPITAL LETTER A WITH GRAVE]
 55+"\u00C0" => "A"
 56+
 57+# Á [LATIN CAPITAL LETTER A WITH ACUTE]
 58+"\u00C1" => "A"
 59+
 60+# Â [LATIN CAPITAL LETTER A WITH CIRCUMFLEX]
 61+"\u00C2" => "A"
 62+
 63+# Ã [LATIN CAPITAL LETTER A WITH TILDE]
 64+"\u00C3" => "A"
 65+
 66+# Ä [LATIN CAPITAL LETTER A WITH DIAERESIS]
 67+"\u00C4" => "A"
 68+
 69+# Å [LATIN CAPITAL LETTER A WITH RING ABOVE]
 70+"\u00C5" => "A"
 71+
 72+# Ā [LATIN CAPITAL LETTER A WITH MACRON]
 73+"\u0100" => "A"
 74+
 75+# Ă [LATIN CAPITAL LETTER A WITH BREVE]
 76+"\u0102" => "A"
 77+
 78+# Ą [LATIN CAPITAL LETTER A WITH OGONEK]
 79+"\u0104" => "A"
 80+
 81+# Ə http://en.wikipedia.org/wiki/Schwa [LATIN CAPITAL LETTER SCHWA]
 82+"\u018F" => "A"
 83+
 84+# Ǎ [LATIN CAPITAL LETTER A WITH CARON]
 85+"\u01CD" => "A"
 86+
 87+# Ǟ [LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON]
 88+"\u01DE" => "A"
 89+
 90+# Ǡ [LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON]
 91+"\u01E0" => "A"
 92+
 93+# Ǻ [LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE]
 94+"\u01FA" => "A"
 95+
 96+# Ȁ [LATIN CAPITAL LETTER A WITH DOUBLE GRAVE]
 97+"\u0200" => "A"
 98+
 99+# Ȃ [LATIN CAPITAL LETTER A WITH INVERTED BREVE]
 100+"\u0202" => "A"
 101+
 102+# Ȧ [LATIN CAPITAL LETTER A WITH DOT ABOVE]
 103+"\u0226" => "A"
 104+
 105+# Ⱥ [LATIN CAPITAL LETTER A WITH STROKE]
 106+"\u023A" => "A"
 107+
 108+# ᴀ [LATIN LETTER SMALL CAPITAL A]
 109+"\u1D00" => "A"
 110+
 111+# Ḁ [LATIN CAPITAL LETTER A WITH RING BELOW]
 112+"\u1E00" => "A"
 113+
 114+# Ạ [LATIN CAPITAL LETTER A WITH DOT BELOW]
 115+"\u1EA0" => "A"
 116+
 117+# Ả [LATIN CAPITAL LETTER A WITH HOOK ABOVE]
 118+"\u1EA2" => "A"
 119+
 120+# Ấ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE]
 121+"\u1EA4" => "A"
 122+
 123+# Ầ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE]
 124+"\u1EA6" => "A"
 125+
 126+# Ẩ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE]
 127+"\u1EA8" => "A"
 128+
 129+# Ẫ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE]
 130+"\u1EAA" => "A"
 131+
 132+# Ậ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW]
 133+"\u1EAC" => "A"
 134+
 135+# Ắ [LATIN CAPITAL LETTER A WITH BREVE AND ACUTE]
 136+"\u1EAE" => "A"
 137+
 138+# Ằ [LATIN CAPITAL LETTER A WITH BREVE AND GRAVE]
 139+"\u1EB0" => "A"
 140+
 141+# Ẳ [LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE]
 142+"\u1EB2" => "A"
 143+
 144+# Ẵ [LATIN CAPITAL LETTER A WITH BREVE AND TILDE]
 145+"\u1EB4" => "A"
 146+
 147+# Ặ [LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW]
 148+"\u1EB6" => "A"
 149+
 150+# Ⓐ [CIRCLED LATIN CAPITAL LETTER A]
 151+"\u24B6" => "A"
 152+
 153+# A [FULLWIDTH LATIN CAPITAL LETTER A]
 154+"\uFF21" => "A"
 155+
 156+# à [LATIN SMALL LETTER A WITH GRAVE]
 157+"\u00E0" => "a"
 158+
 159+# á [LATIN SMALL LETTER A WITH ACUTE]
 160+"\u00E1" => "a"
 161+
 162+# â [LATIN SMALL LETTER A WITH CIRCUMFLEX]
 163+"\u00E2" => "a"
 164+
 165+# ã [LATIN SMALL LETTER A WITH TILDE]
 166+"\u00E3" => "a"
 167+
 168+# ä [LATIN SMALL LETTER A WITH DIAERESIS]
 169+"\u00E4" => "a"
 170+
 171+# å [LATIN SMALL LETTER A WITH RING ABOVE]
 172+"\u00E5" => "a"
 173+
 174+# ā [LATIN SMALL LETTER A WITH MACRON]
 175+"\u0101" => "a"
 176+
 177+# ă [LATIN SMALL LETTER A WITH BREVE]
 178+"\u0103" => "a"
 179+
 180+# ą [LATIN SMALL LETTER A WITH OGONEK]
 181+"\u0105" => "a"
 182+
 183+# ǎ [LATIN SMALL LETTER A WITH CARON]
 184+"\u01CE" => "a"
 185+
 186+# ǟ [LATIN SMALL LETTER A WITH DIAERESIS AND MACRON]
 187+"\u01DF" => "a"
 188+
 189+# ǡ [LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON]
 190+"\u01E1" => "a"
 191+
 192+# ǻ [LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE]
 193+"\u01FB" => "a"
 194+
 195+# ȁ [LATIN SMALL LETTER A WITH DOUBLE GRAVE]
 196+"\u0201" => "a"
 197+
 198+# ȃ [LATIN SMALL LETTER A WITH INVERTED BREVE]
 199+"\u0203" => "a"
 200+
 201+# ȧ [LATIN SMALL LETTER A WITH DOT ABOVE]
 202+"\u0227" => "a"
 203+
 204+# ɐ [LATIN SMALL LETTER TURNED A]
 205+"\u0250" => "a"
 206+
 207+# ə [LATIN SMALL LETTER SCHWA]
 208+"\u0259" => "a"
 209+
 210+# ɚ [LATIN SMALL LETTER SCHWA WITH HOOK]
 211+"\u025A" => "a"
 212+
 213+# ᶏ [LATIN SMALL LETTER A WITH RETROFLEX HOOK]
 214+"\u1D8F" => "a"
 215+
 216+# ᶕ [LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK]
 217+"\u1D95" => "a"
 218+
 219+# ạ [LATIN SMALL LETTER A WITH RING BELOW]
 220+"\u1E01" => "a"
 221+
 222+# ả [LATIN SMALL LETTER A WITH RIGHT HALF RING]
 223+"\u1E9A" => "a"
 224+
 225+# ạ [LATIN SMALL LETTER A WITH DOT BELOW]
 226+"\u1EA1" => "a"
 227+
 228+# ả [LATIN SMALL LETTER A WITH HOOK ABOVE]
 229+"\u1EA3" => "a"
 230+
 231+# ấ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE]
 232+"\u1EA5" => "a"
 233+
 234+# ầ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE]
 235+"\u1EA7" => "a"
 236+
 237+# ẩ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE]
 238+"\u1EA9" => "a"
 239+
 240+# ẫ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE]
 241+"\u1EAB" => "a"
 242+
 243+# ậ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW]
 244+"\u1EAD" => "a"
 245+
 246+# ắ [LATIN SMALL LETTER A WITH BREVE AND ACUTE]
 247+"\u1EAF" => "a"
 248+
 249+# ằ [LATIN SMALL LETTER A WITH BREVE AND GRAVE]
 250+"\u1EB1" => "a"
 251+
 252+# ẳ [LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE]
 253+"\u1EB3" => "a"
 254+
 255+# ẵ [LATIN SMALL LETTER A WITH BREVE AND TILDE]
 256+"\u1EB5" => "a"
 257+
 258+# ặ [LATIN SMALL LETTER A WITH BREVE AND DOT BELOW]
 259+"\u1EB7" => "a"
 260+
 261+# ₐ [LATIN SUBSCRIPT SMALL LETTER A]
 262+"\u2090" => "a"
 263+
 264+# ₔ [LATIN SUBSCRIPT SMALL LETTER SCHWA]
 265+"\u2094" => "a"
 266+
 267+# ⓐ [CIRCLED LATIN SMALL LETTER A]
 268+"\u24D0" => "a"
 269+
 270+# ⱥ [LATIN SMALL LETTER A WITH STROKE]
 271+"\u2C65" => "a"
 272+
 273+# Ɐ [LATIN CAPITAL LETTER TURNED A]
 274+"\u2C6F" => "a"
 275+
 276+# a [FULLWIDTH LATIN SMALL LETTER A]
 277+"\uFF41" => "a"
 278+
 279+# Ꜳ [LATIN CAPITAL LETTER AA]
 280+"\uA732" => "AA"
 281+
 282+# Æ [LATIN CAPITAL LETTER AE]
 283+"\u00C6" => "AE"
 284+
 285+# Ǣ [LATIN CAPITAL LETTER AE WITH MACRON]
 286+"\u01E2" => "AE"
 287+
 288+# Ǽ [LATIN CAPITAL LETTER AE WITH ACUTE]
 289+"\u01FC" => "AE"
 290+
 291+# ᴁ [LATIN LETTER SMALL CAPITAL AE]
 292+"\u1D01" => "AE"
 293+
 294+# Ꜵ [LATIN CAPITAL LETTER AO]
 295+"\uA734" => "AO"
 296+
 297+# Ꜷ [LATIN CAPITAL LETTER AU]
 298+"\uA736" => "AU"
 299+
 300+# Ꜹ [LATIN CAPITAL LETTER AV]
 301+"\uA738" => "AV"
 302+
 303+# Ꜻ [LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR]
 304+"\uA73A" => "AV"
 305+
 306+# Ꜽ [LATIN CAPITAL LETTER AY]
 307+"\uA73C" => "AY"
 308+
 309+# ⒜ [PARENTHESIZED LATIN SMALL LETTER A]
 310+"\u249C" => "(a)"
 311+
 312+# ꜳ [LATIN SMALL LETTER AA]
 313+"\uA733" => "aa"
 314+
 315+# æ [LATIN SMALL LETTER AE]
 316+"\u00E6" => "ae"
 317+
 318+# ǣ [LATIN SMALL LETTER AE WITH MACRON]
 319+"\u01E3" => "ae"
 320+
 321+# ǽ [LATIN SMALL LETTER AE WITH ACUTE]
 322+"\u01FD" => "ae"
 323+
 324+# ᴂ [LATIN SMALL LETTER TURNED AE]
 325+"\u1D02" => "ae"
 326+
 327+# ꜵ [LATIN SMALL LETTER AO]
 328+"\uA735" => "ao"
 329+
 330+# ꜷ [LATIN SMALL LETTER AU]
 331+"\uA737" => "au"
 332+
 333+# ꜹ [LATIN SMALL LETTER AV]
 334+"\uA739" => "av"
 335+
 336+# ꜻ [LATIN SMALL LETTER AV WITH HORIZONTAL BAR]
 337+"\uA73B" => "av"
 338+
 339+# ꜽ [LATIN SMALL LETTER AY]
 340+"\uA73D" => "ay"
 341+
 342+# Ɓ [LATIN CAPITAL LETTER B WITH HOOK]
 343+"\u0181" => "B"
 344+
 345+# Ƃ [LATIN CAPITAL LETTER B WITH TOPBAR]
 346+"\u0182" => "B"
 347+
 348+# Ƀ [LATIN CAPITAL LETTER B WITH STROKE]
 349+"\u0243" => "B"
 350+
 351+# ʙ [LATIN LETTER SMALL CAPITAL B]
 352+"\u0299" => "B"
 353+
 354+# ᴃ [LATIN LETTER SMALL CAPITAL BARRED B]
 355+"\u1D03" => "B"
 356+
 357+# Ḃ [LATIN CAPITAL LETTER B WITH DOT ABOVE]
 358+"\u1E02" => "B"
 359+
 360+# Ḅ [LATIN CAPITAL LETTER B WITH DOT BELOW]
 361+"\u1E04" => "B"
 362+
 363+# Ḇ [LATIN CAPITAL LETTER B WITH LINE BELOW]
 364+"\u1E06" => "B"
 365+
 366+# Ⓑ [CIRCLED LATIN CAPITAL LETTER B]
 367+"\u24B7" => "B"
 368+
 369+# B [FULLWIDTH LATIN CAPITAL LETTER B]
 370+"\uFF22" => "B"
 371+
 372+# ƀ [LATIN SMALL LETTER B WITH STROKE]
 373+"\u0180" => "b"
 374+
 375+# ƃ [LATIN SMALL LETTER B WITH TOPBAR]
 376+"\u0183" => "b"
 377+
 378+# ɓ [LATIN SMALL LETTER B WITH HOOK]
 379+"\u0253" => "b"
 380+
 381+# ᵬ [LATIN SMALL LETTER B WITH MIDDLE TILDE]
 382+"\u1D6C" => "b"
 383+
 384+# ᶀ [LATIN SMALL LETTER B WITH PALATAL HOOK]
 385+"\u1D80" => "b"
 386+
 387+# ḃ [LATIN SMALL LETTER B WITH DOT ABOVE]
 388+"\u1E03" => "b"
 389+
 390+# ḅ [LATIN SMALL LETTER B WITH DOT BELOW]
 391+"\u1E05" => "b"
 392+
 393+# ḇ [LATIN SMALL LETTER B WITH LINE BELOW]
 394+"\u1E07" => "b"
 395+
 396+# ⓑ [CIRCLED LATIN SMALL LETTER B]
 397+"\u24D1" => "b"
 398+
 399+# b [FULLWIDTH LATIN SMALL LETTER B]
 400+"\uFF42" => "b"
 401+
 402+# ⒝ [PARENTHESIZED LATIN SMALL LETTER B]
 403+"\u249D" => "(b)"
 404+
 405+# Ç [LATIN CAPITAL LETTER C WITH CEDILLA]
 406+"\u00C7" => "C"
 407+
 408+# Ć [LATIN CAPITAL LETTER C WITH ACUTE]
 409+"\u0106" => "C"
 410+
 411+# Ĉ [LATIN CAPITAL LETTER C WITH CIRCUMFLEX]
 412+"\u0108" => "C"
 413+
 414+# Ċ [LATIN CAPITAL LETTER C WITH DOT ABOVE]
 415+"\u010A" => "C"
 416+
 417+# Č [LATIN CAPITAL LETTER C WITH CARON]
 418+"\u010C" => "C"
 419+
 420+# Ƈ [LATIN CAPITAL LETTER C WITH HOOK]
 421+"\u0187" => "C"
 422+
 423+# Ȼ [LATIN CAPITAL LETTER C WITH STROKE]
 424+"\u023B" => "C"
 425+
 426+# ʗ [LATIN LETTER STRETCHED C]
 427+"\u0297" => "C"
 428+
 429+# ᴄ [LATIN LETTER SMALL CAPITAL C]
 430+"\u1D04" => "C"
 431+
 432+# Ḉ [LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE]
 433+"\u1E08" => "C"
 434+
 435+# Ⓒ [CIRCLED LATIN CAPITAL LETTER C]
 436+"\u24B8" => "C"
 437+
 438+# C [FULLWIDTH LATIN CAPITAL LETTER C]
 439+"\uFF23" => "C"
 440+
 441+# ç [LATIN SMALL LETTER C WITH CEDILLA]
 442+"\u00E7" => "c"
 443+
 444+# ć [LATIN SMALL LETTER C WITH ACUTE]
 445+"\u0107" => "c"
 446+
 447+# ĉ [LATIN SMALL LETTER C WITH CIRCUMFLEX]
 448+"\u0109" => "c"
 449+
 450+# ċ [LATIN SMALL LETTER C WITH DOT ABOVE]
 451+"\u010B" => "c"
 452+
 453+# č [LATIN SMALL LETTER C WITH CARON]
 454+"\u010D" => "c"
 455+
 456+# ƈ [LATIN SMALL LETTER C WITH HOOK]
 457+"\u0188" => "c"
 458+
 459+# ȼ [LATIN SMALL LETTER C WITH STROKE]
 460+"\u023C" => "c"
 461+
 462+# ɕ [LATIN SMALL LETTER C WITH CURL]
 463+"\u0255" => "c"
 464+
 465+# ḉ [LATIN SMALL LETTER C WITH CEDILLA AND ACUTE]
 466+"\u1E09" => "c"
 467+
 468+# ↄ [LATIN SMALL LETTER REVERSED C]
 469+"\u2184" => "c"
 470+
 471+# ⓒ [CIRCLED LATIN SMALL LETTER C]
 472+"\u24D2" => "c"
 473+
 474+# Ꜿ [LATIN CAPITAL LETTER REVERSED C WITH DOT]
 475+"\uA73E" => "c"
 476+
 477+# ꜿ [LATIN SMALL LETTER REVERSED C WITH DOT]
 478+"\uA73F" => "c"
 479+
 480+# c [FULLWIDTH LATIN SMALL LETTER C]
 481+"\uFF43" => "c"
 482+
 483+# ⒞ [PARENTHESIZED LATIN SMALL LETTER C]
 484+"\u249E" => "(c)"
 485+
 486+# Ð [LATIN CAPITAL LETTER ETH]
 487+"\u00D0" => "D"
 488+
 489+# Ď [LATIN CAPITAL LETTER D WITH CARON]
 490+"\u010E" => "D"
 491+
 492+# Đ [LATIN CAPITAL LETTER D WITH STROKE]
 493+"\u0110" => "D"
 494+
 495+# Ɖ [LATIN CAPITAL LETTER AFRICAN D]
 496+"\u0189" => "D"
 497+
 498+# Ɗ [LATIN CAPITAL LETTER D WITH HOOK]
 499+"\u018A" => "D"
 500+
 501+# Ƌ [LATIN CAPITAL LETTER D WITH TOPBAR]
 502+"\u018B" => "D"
 503+
 504+# ᴅ [LATIN LETTER SMALL CAPITAL D]
 505+"\u1D05" => "D"
 506+
 507+# ᴆ [LATIN LETTER SMALL CAPITAL ETH]
 508+"\u1D06" => "D"
 509+
 510+# Ḋ [LATIN CAPITAL LETTER D WITH DOT ABOVE]
 511+"\u1E0A" => "D"
 512+
 513+# Ḍ [LATIN CAPITAL LETTER D WITH DOT BELOW]
 514+"\u1E0C" => "D"
 515+
 516+# Ḏ [LATIN CAPITAL LETTER D WITH LINE BELOW]
 517+"\u1E0E" => "D"
 518+
 519+# Ḑ [LATIN CAPITAL LETTER D WITH CEDILLA]
 520+"\u1E10" => "D"
 521+
 522+# Ḓ [LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW]
 523+"\u1E12" => "D"
 524+
 525+# Ⓓ [CIRCLED LATIN CAPITAL LETTER D]
 526+"\u24B9" => "D"
 527+
 528+# Ꝺ [LATIN CAPITAL LETTER INSULAR D]
 529+"\uA779" => "D"
 530+
 531+# D [FULLWIDTH LATIN CAPITAL LETTER D]
 532+"\uFF24" => "D"
 533+
 534+# ð [LATIN SMALL LETTER ETH]
 535+"\u00F0" => "d"
 536+
 537+# ď [LATIN SMALL LETTER D WITH CARON]
 538+"\u010F" => "d"
 539+
 540+# đ [LATIN SMALL LETTER D WITH STROKE]
 541+"\u0111" => "d"
 542+
 543+# ƌ [LATIN SMALL LETTER D WITH TOPBAR]
 544+"\u018C" => "d"
 545+
 546+# ȡ [LATIN SMALL LETTER D WITH CURL]
 547+"\u0221" => "d"
 548+
 549+# ɖ [LATIN SMALL LETTER D WITH TAIL]
 550+"\u0256" => "d"
 551+
 552+# ɗ [LATIN SMALL LETTER D WITH HOOK]
 553+"\u0257" => "d"
 554+
 555+# ᵭ [LATIN SMALL LETTER D WITH MIDDLE TILDE]
 556+"\u1D6D" => "d"
 557+
 558+# ᶁ [LATIN SMALL LETTER D WITH PALATAL HOOK]
 559+"\u1D81" => "d"
 560+
 561+# ᶑ [LATIN SMALL LETTER D WITH HOOK AND TAIL]
 562+"\u1D91" => "d"
 563+
 564+# ḋ [LATIN SMALL LETTER D WITH DOT ABOVE]
 565+"\u1E0B" => "d"
 566+
 567+# ḍ [LATIN SMALL LETTER D WITH DOT BELOW]
 568+"\u1E0D" => "d"
 569+
 570+# ḏ [LATIN SMALL LETTER D WITH LINE BELOW]
 571+"\u1E0F" => "d"
 572+
 573+# ḑ [LATIN SMALL LETTER D WITH CEDILLA]
 574+"\u1E11" => "d"
 575+
 576+# ḓ [LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW]
 577+"\u1E13" => "d"
 578+
 579+# ⓓ [CIRCLED LATIN SMALL LETTER D]
 580+"\u24D3" => "d"
 581+
 582+# ꝺ [LATIN SMALL LETTER INSULAR D]
 583+"\uA77A" => "d"
 584+
 585+# d [FULLWIDTH LATIN SMALL LETTER D]
 586+"\uFF44" => "d"
 587+
 588+# DŽ [LATIN CAPITAL LETTER DZ WITH CARON]
 589+"\u01C4" => "DZ"
 590+
 591+# DZ [LATIN CAPITAL LETTER DZ]
 592+"\u01F1" => "DZ"
 593+
 594+# Dž [LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]
 595+"\u01C5" => "Dz"
 596+
 597+# Dz [LATIN CAPITAL LETTER D WITH SMALL LETTER Z]
 598+"\u01F2" => "Dz"
 599+
 600+# ⒟ [PARENTHESIZED LATIN SMALL LETTER D]
 601+"\u249F" => "(d)"
 602+
 603+# ȸ [LATIN SMALL LETTER DB DIGRAPH]
 604+"\u0238" => "db"
 605+
 606+# dž [LATIN SMALL LETTER DZ WITH CARON]
 607+"\u01C6" => "dz"
 608+
 609+# dz [LATIN SMALL LETTER DZ]
 610+"\u01F3" => "dz"
 611+
 612+# ʣ [LATIN SMALL LETTER DZ DIGRAPH]
 613+"\u02A3" => "dz"
 614+
 615+# ʥ [LATIN SMALL LETTER DZ DIGRAPH WITH CURL]
 616+"\u02A5" => "dz"
 617+
 618+# È [LATIN CAPITAL LETTER E WITH GRAVE]
 619+"\u00C8" => "E"
 620+
 621+# É [LATIN CAPITAL LETTER E WITH ACUTE]
 622+"\u00C9" => "E"
 623+
 624+# Ê [LATIN CAPITAL LETTER E WITH CIRCUMFLEX]
 625+"\u00CA" => "E"
 626+
 627+# Ë [LATIN CAPITAL LETTER E WITH DIAERESIS]
 628+"\u00CB" => "E"
 629+
 630+# Ē [LATIN CAPITAL LETTER E WITH MACRON]
 631+"\u0112" => "E"
 632+
 633+# Ĕ [LATIN CAPITAL LETTER E WITH BREVE]
 634+"\u0114" => "E"
 635+
 636+# Ė [LATIN CAPITAL LETTER E WITH DOT ABOVE]
 637+"\u0116" => "E"
 638+
 639+# Ę [LATIN CAPITAL LETTER E WITH OGONEK]
 640+"\u0118" => "E"
 641+
 642+# Ě [LATIN CAPITAL LETTER E WITH CARON]
 643+"\u011A" => "E"
 644+
 645+# Ǝ [LATIN CAPITAL LETTER REVERSED E]
 646+"\u018E" => "E"
 647+
 648+# Ɛ [LATIN CAPITAL LETTER OPEN E]
 649+"\u0190" => "E"
 650+
 651+# Ȅ [LATIN CAPITAL LETTER E WITH DOUBLE GRAVE]
 652+"\u0204" => "E"
 653+
 654+# Ȇ [LATIN CAPITAL LETTER E WITH INVERTED BREVE]
 655+"\u0206" => "E"
 656+
 657+# Ȩ [LATIN CAPITAL LETTER E WITH CEDILLA]
 658+"\u0228" => "E"
 659+
 660+# Ɇ [LATIN CAPITAL LETTER E WITH STROKE]
 661+"\u0246" => "E"
 662+
 663+# ᴇ [LATIN LETTER SMALL CAPITAL E]
 664+"\u1D07" => "E"
 665+
 666+# Ḕ [LATIN CAPITAL LETTER E WITH MACRON AND GRAVE]
 667+"\u1E14" => "E"
 668+
 669+# Ḗ [LATIN CAPITAL LETTER E WITH MACRON AND ACUTE]
 670+"\u1E16" => "E"
 671+
 672+# Ḙ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW]
 673+"\u1E18" => "E"
 674+
 675+# Ḛ [LATIN CAPITAL LETTER E WITH TILDE BELOW]
 676+"\u1E1A" => "E"
 677+
 678+# Ḝ [LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE]
 679+"\u1E1C" => "E"
 680+
 681+# Ẹ [LATIN CAPITAL LETTER E WITH DOT BELOW]
 682+"\u1EB8" => "E"
 683+
 684+# Ẻ [LATIN CAPITAL LETTER E WITH HOOK ABOVE]
 685+"\u1EBA" => "E"
 686+
 687+# Ẽ [LATIN CAPITAL LETTER E WITH TILDE]
 688+"\u1EBC" => "E"
 689+
 690+# Ế [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE]
 691+"\u1EBE" => "E"
 692+
 693+# Ề [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE]
 694+"\u1EC0" => "E"
 695+
 696+# Ể [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE]
 697+"\u1EC2" => "E"
 698+
 699+# Ễ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE]
 700+"\u1EC4" => "E"
 701+
 702+# Ệ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW]
 703+"\u1EC6" => "E"
 704+
 705+# Ⓔ [CIRCLED LATIN CAPITAL LETTER E]
 706+"\u24BA" => "E"
 707+
 708+# ⱻ [LATIN LETTER SMALL CAPITAL TURNED E]
 709+"\u2C7B" => "E"
 710+
 711+# E [FULLWIDTH LATIN CAPITAL LETTER E]
 712+"\uFF25" => "E"
 713+
 714+# è [LATIN SMALL LETTER E WITH GRAVE]
 715+"\u00E8" => "e"
 716+
 717+# é [LATIN SMALL LETTER E WITH ACUTE]
 718+"\u00E9" => "e"
 719+
 720+# ê [LATIN SMALL LETTER E WITH CIRCUMFLEX]
 721+"\u00EA" => "e"
 722+
 723+# ë [LATIN SMALL LETTER E WITH DIAERESIS]
 724+"\u00EB" => "e"
 725+
 726+# ē [LATIN SMALL LETTER E WITH MACRON]
 727+"\u0113" => "e"
 728+
 729+# ĕ [LATIN SMALL LETTER E WITH BREVE]
 730+"\u0115" => "e"
 731+
 732+# ė [LATIN SMALL LETTER E WITH DOT ABOVE]
 733+"\u0117" => "e"
 734+
 735+# ę [LATIN SMALL LETTER E WITH OGONEK]
 736+"\u0119" => "e"
 737+
 738+# ě [LATIN SMALL LETTER E WITH CARON]
 739+"\u011B" => "e"
 740+
 741+# ǝ [LATIN SMALL LETTER TURNED E]
 742+"\u01DD" => "e"
 743+
 744+# ȅ [LATIN SMALL LETTER E WITH DOUBLE GRAVE]
 745+"\u0205" => "e"
 746+
 747+# ȇ [LATIN SMALL LETTER E WITH INVERTED BREVE]
 748+"\u0207" => "e"
 749+
 750+# ȩ [LATIN SMALL LETTER E WITH CEDILLA]
 751+"\u0229" => "e"
 752+
 753+# ɇ [LATIN SMALL LETTER E WITH STROKE]
 754+"\u0247" => "e"
 755+
 756+# ɘ [LATIN SMALL LETTER REVERSED E]
 757+"\u0258" => "e"
 758+
 759+# ɛ [LATIN SMALL LETTER OPEN E]
 760+"\u025B" => "e"
 761+
 762+# ɜ [LATIN SMALL LETTER REVERSED OPEN E]
 763+"\u025C" => "e"
 764+
 765+# ɝ [LATIN SMALL LETTER REVERSED OPEN E WITH HOOK]
 766+"\u025D" => "e"
 767+
 768+# ɞ [LATIN SMALL LETTER CLOSED REVERSED OPEN E]
 769+"\u025E" => "e"
 770+
 771+# ʚ [LATIN SMALL LETTER CLOSED OPEN E]
 772+"\u029A" => "e"
 773+
 774+# ᴈ [LATIN SMALL LETTER TURNED OPEN E]
 775+"\u1D08" => "e"
 776+
 777+# ᶒ [LATIN SMALL LETTER E WITH RETROFLEX HOOK]
 778+"\u1D92" => "e"
 779+
 780+# ᶓ [LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK]
 781+"\u1D93" => "e"
 782+
 783+# ᶔ [LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK]
 784+"\u1D94" => "e"
 785+
 786+# ḕ [LATIN SMALL LETTER E WITH MACRON AND GRAVE]
 787+"\u1E15" => "e"
 788+
 789+# ḗ [LATIN SMALL LETTER E WITH MACRON AND ACUTE]
 790+"\u1E17" => "e"
 791+
 792+# ḙ [LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW]
 793+"\u1E19" => "e"
 794+
 795+# ḛ [LATIN SMALL LETTER E WITH TILDE BELOW]
 796+"\u1E1B" => "e"
 797+
 798+# ḝ [LATIN SMALL LETTER E WITH CEDILLA AND BREVE]
 799+"\u1E1D" => "e"
 800+
 801+# ẹ [LATIN SMALL LETTER E WITH DOT BELOW]
 802+"\u1EB9" => "e"
 803+
 804+# ẻ [LATIN SMALL LETTER E WITH HOOK ABOVE]
 805+"\u1EBB" => "e"
 806+
 807+# ẽ [LATIN SMALL LETTER E WITH TILDE]
 808+"\u1EBD" => "e"
 809+
 810+# ế [LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE]
 811+"\u1EBF" => "e"
 812+
 813+# ề [LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE]
 814+"\u1EC1" => "e"
 815+
 816+# ể [LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE]
 817+"\u1EC3" => "e"
 818+
 819+# ễ [LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE]
 820+"\u1EC5" => "e"
 821+
 822+# ệ [LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW]
 823+"\u1EC7" => "e"
 824+
 825+# ₑ [LATIN SUBSCRIPT SMALL LETTER E]
 826+"\u2091" => "e"
 827+
 828+# ⓔ [CIRCLED LATIN SMALL LETTER E]
 829+"\u24D4" => "e"
 830+
 831+# ⱸ [LATIN SMALL LETTER E WITH NOTCH]
 832+"\u2C78" => "e"
 833+
 834+# e [FULLWIDTH LATIN SMALL LETTER E]
 835+"\uFF45" => "e"
 836+
 837+# ⒠ [PARENTHESIZED LATIN SMALL LETTER E]
 838+"\u24A0" => "(e)"
 839+
 840+# Ƒ [LATIN CAPITAL LETTER F WITH HOOK]
 841+"\u0191" => "F"
 842+
 843+# Ḟ [LATIN CAPITAL LETTER F WITH DOT ABOVE]
 844+"\u1E1E" => "F"
 845+
 846+# Ⓕ [CIRCLED LATIN CAPITAL LETTER F]
 847+"\u24BB" => "F"
 848+
 849+# ꜰ [LATIN LETTER SMALL CAPITAL F]
 850+"\uA730" => "F"
 851+
 852+# Ꝼ [LATIN CAPITAL LETTER INSULAR F]
 853+"\uA77B" => "F"
 854+
 855+# ꟻ [LATIN EPIGRAPHIC LETTER REVERSED F]
 856+"\uA7FB" => "F"
 857+
 858+# F [FULLWIDTH LATIN CAPITAL LETTER F]
 859+"\uFF26" => "F"
 860+
 861+# ƒ [LATIN SMALL LETTER F WITH HOOK]
 862+"\u0192" => "f"
 863+
 864+# ᵮ [LATIN SMALL LETTER F WITH MIDDLE TILDE]
 865+"\u1D6E" => "f"
 866+
 867+# ᶂ [LATIN SMALL LETTER F WITH PALATAL HOOK]
 868+"\u1D82" => "f"
 869+
 870+# ḟ [LATIN SMALL LETTER F WITH DOT ABOVE]
 871+"\u1E1F" => "f"
 872+
 873+# ẛ [LATIN SMALL LETTER LONG S WITH DOT ABOVE]
 874+"\u1E9B" => "f"
 875+
 876+# ⓕ [CIRCLED LATIN SMALL LETTER F]
 877+"\u24D5" => "f"
 878+
 879+# ꝼ [LATIN SMALL LETTER INSULAR F]
 880+"\uA77C" => "f"
 881+
 882+# f [FULLWIDTH LATIN SMALL LETTER F]
 883+"\uFF46" => "f"
 884+
 885+# ⒡ [PARENTHESIZED LATIN SMALL LETTER F]
 886+"\u24A1" => "(f)"
 887+
 888+# ff [LATIN SMALL LIGATURE FF]
 889+"\uFB00" => "ff"
 890+
 891+# ffi [LATIN SMALL LIGATURE FFI]
 892+"\uFB03" => "ffi"
 893+
 894+# ffl [LATIN SMALL LIGATURE FFL]
 895+"\uFB04" => "ffl"
 896+
 897+# fi [LATIN SMALL LIGATURE FI]
 898+"\uFB01" => "fi"
 899+
 900+# fl [LATIN SMALL LIGATURE FL]
 901+"\uFB02" => "fl"
 902+
 903+# Ĝ [LATIN CAPITAL LETTER G WITH CIRCUMFLEX]
 904+"\u011C" => "G"
 905+
 906+# Ğ [LATIN CAPITAL LETTER G WITH BREVE]
 907+"\u011E" => "G"
 908+
 909+# Ġ [LATIN CAPITAL LETTER G WITH DOT ABOVE]
 910+"\u0120" => "G"
 911+
 912+# Ģ [LATIN CAPITAL LETTER G WITH CEDILLA]
 913+"\u0122" => "G"
 914+
 915+# Ɠ [LATIN CAPITAL LETTER G WITH HOOK]
 916+"\u0193" => "G"
 917+
 918+# Ǥ [LATIN CAPITAL LETTER G WITH STROKE]
 919+"\u01E4" => "G"
 920+
 921+# ǥ [LATIN SMALL LETTER G WITH STROKE]
 922+"\u01E5" => "G"
 923+
 924+# Ǧ [LATIN CAPITAL LETTER G WITH CARON]
 925+"\u01E6" => "G"
 926+
 927+# ǧ [LATIN SMALL LETTER G WITH CARON]
 928+"\u01E7" => "G"
 929+
 930+# Ǵ [LATIN CAPITAL LETTER G WITH ACUTE]
 931+"\u01F4" => "G"
 932+
 933+# ɢ [LATIN LETTER SMALL CAPITAL G]
 934+"\u0262" => "G"
 935+
 936+# ʛ [LATIN LETTER SMALL CAPITAL G WITH HOOK]
 937+"\u029B" => "G"
 938+
 939+# Ḡ [LATIN CAPITAL LETTER G WITH MACRON]
 940+"\u1E20" => "G"
 941+
 942+# Ⓖ [CIRCLED LATIN CAPITAL LETTER G]
 943+"\u24BC" => "G"
 944+
 945+# Ᵹ [LATIN CAPITAL LETTER INSULAR G]
 946+"\uA77D" => "G"
 947+
 948+# Ꝿ [LATIN CAPITAL LETTER TURNED INSULAR G]
 949+"\uA77E" => "G"
 950+
 951+# G [FULLWIDTH LATIN CAPITAL LETTER G]
 952+"\uFF27" => "G"
 953+
 954+# ĝ [LATIN SMALL LETTER G WITH CIRCUMFLEX]
 955+"\u011D" => "g"
 956+
 957+# ğ [LATIN SMALL LETTER G WITH BREVE]
 958+"\u011F" => "g"
 959+
 960+# ġ [LATIN SMALL LETTER G WITH DOT ABOVE]
 961+"\u0121" => "g"
 962+
 963+# ģ [LATIN SMALL LETTER G WITH CEDILLA]
 964+"\u0123" => "g"
 965+
 966+# ǵ [LATIN SMALL LETTER G WITH ACUTE]
 967+"\u01F5" => "g"
 968+
 969+# ɠ [LATIN SMALL LETTER G WITH HOOK]
 970+"\u0260" => "g"
 971+
 972+# ɡ [LATIN SMALL LETTER SCRIPT G]
 973+"\u0261" => "g"
 974+
 975+# ᵷ [LATIN SMALL LETTER TURNED G]
 976+"\u1D77" => "g"
 977+
 978+# ᵹ [LATIN SMALL LETTER INSULAR G]
 979+"\u1D79" => "g"
 980+
 981+# ᶃ [LATIN SMALL LETTER G WITH PALATAL HOOK]
 982+"\u1D83" => "g"
 983+
 984+# ḡ [LATIN SMALL LETTER G WITH MACRON]
 985+"\u1E21" => "g"
 986+
 987+# ⓖ [CIRCLED LATIN SMALL LETTER G]
 988+"\u24D6" => "g"
 989+
 990+# ꝿ [LATIN SMALL LETTER TURNED INSULAR G]
 991+"\uA77F" => "g"
 992+
 993+# g [FULLWIDTH LATIN SMALL LETTER G]
 994+"\uFF47" => "g"
 995+
 996+# ⒢ [PARENTHESIZED LATIN SMALL LETTER G]
 997+"\u24A2" => "(g)"
 998+
 999+# Ĥ [LATIN CAPITAL LETTER H WITH CIRCUMFLEX]
 1000+"\u0124" => "H"
 1001+
 1002+# Ħ [LATIN CAPITAL LETTER H WITH STROKE]
 1003+"\u0126" => "H"
 1004+
 1005+# Ȟ [LATIN CAPITAL LETTER H WITH CARON]
 1006+"\u021E" => "H"
 1007+
 1008+# ʜ [LATIN LETTER SMALL CAPITAL H]
 1009+"\u029C" => "H"
 1010+
 1011+# Ḣ [LATIN CAPITAL LETTER H WITH DOT ABOVE]
 1012+"\u1E22" => "H"
 1013+
 1014+# Ḥ [LATIN CAPITAL LETTER H WITH DOT BELOW]
 1015+"\u1E24" => "H"
 1016+
 1017+# Ḧ [LATIN CAPITAL LETTER H WITH DIAERESIS]
 1018+"\u1E26" => "H"
 1019+
 1020+# Ḩ [LATIN CAPITAL LETTER H WITH CEDILLA]
 1021+"\u1E28" => "H"
 1022+
 1023+# Ḫ [LATIN CAPITAL LETTER H WITH BREVE BELOW]
 1024+"\u1E2A" => "H"
 1025+
 1026+# Ⓗ [CIRCLED LATIN CAPITAL LETTER H]
 1027+"\u24BD" => "H"
 1028+
 1029+# Ⱨ [LATIN CAPITAL LETTER H WITH DESCENDER]
 1030+"\u2C67" => "H"
 1031+
 1032+# Ⱶ [LATIN CAPITAL LETTER HALF H]
 1033+"\u2C75" => "H"
 1034+
 1035+# H [FULLWIDTH LATIN CAPITAL LETTER H]
 1036+"\uFF28" => "H"
 1037+
 1038+# ĥ [LATIN SMALL LETTER H WITH CIRCUMFLEX]
 1039+"\u0125" => "h"
 1040+
 1041+# ħ [LATIN SMALL LETTER H WITH STROKE]
 1042+"\u0127" => "h"
 1043+
 1044+# ȟ [LATIN SMALL LETTER H WITH CARON]
 1045+"\u021F" => "h"
 1046+
 1047+# ɥ [LATIN SMALL LETTER TURNED H]
 1048+"\u0265" => "h"
 1049+
 1050+# ɦ [LATIN SMALL LETTER H WITH HOOK]
 1051+"\u0266" => "h"
 1052+
 1053+# ʮ [LATIN SMALL LETTER TURNED H WITH FISHHOOK]
 1054+"\u02AE" => "h"
 1055+
 1056+# ʯ [LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL]
 1057+"\u02AF" => "h"
 1058+
 1059+# ḣ [LATIN SMALL LETTER H WITH DOT ABOVE]
 1060+"\u1E23" => "h"
 1061+
 1062+# ḥ [LATIN SMALL LETTER H WITH DOT BELOW]
 1063+"\u1E25" => "h"
 1064+
 1065+# ḧ [LATIN SMALL LETTER H WITH DIAERESIS]
 1066+"\u1E27" => "h"
 1067+
 1068+# ḩ [LATIN SMALL LETTER H WITH CEDILLA]
 1069+"\u1E29" => "h"
 1070+
 1071+# ḫ [LATIN SMALL LETTER H WITH BREVE BELOW]
 1072+"\u1E2B" => "h"
 1073+
 1074+# ẖ [LATIN SMALL LETTER H WITH LINE BELOW]
 1075+"\u1E96" => "h"
 1076+
 1077+# ⓗ [CIRCLED LATIN SMALL LETTER H]
 1078+"\u24D7" => "h"
 1079+
 1080+# ⱨ [LATIN SMALL LETTER H WITH DESCENDER]
 1081+"\u2C68" => "h"
 1082+
 1083+# ⱶ [LATIN SMALL LETTER HALF H]
 1084+"\u2C76" => "h"
 1085+
 1086+# h [FULLWIDTH LATIN SMALL LETTER H]
 1087+"\uFF48" => "h"
 1088+
 1089+# Ƕ http://en.wikipedia.org/wiki/Hwair [LATIN CAPITAL LETTER HWAIR]
 1090+"\u01F6" => "HV"
 1091+
 1092+# ⒣ [PARENTHESIZED LATIN SMALL LETTER H]
 1093+"\u24A3" => "(h)"
 1094+
 1095+# ƕ [LATIN SMALL LETTER HV]
 1096+"\u0195" => "hv"
 1097+
 1098+# Ì [LATIN CAPITAL LETTER I WITH GRAVE]
 1099+"\u00CC" => "I"
 1100+
 1101+# Í [LATIN CAPITAL LETTER I WITH ACUTE]
 1102+"\u00CD" => "I"
 1103+
 1104+# Î [LATIN CAPITAL LETTER I WITH CIRCUMFLEX]
 1105+"\u00CE" => "I"
 1106+
 1107+# Ï [LATIN CAPITAL LETTER I WITH DIAERESIS]
 1108+"\u00CF" => "I"
 1109+
 1110+# Ĩ [LATIN CAPITAL LETTER I WITH TILDE]
 1111+"\u0128" => "I"
 1112+
 1113+# Ī [LATIN CAPITAL LETTER I WITH MACRON]
 1114+"\u012A" => "I"
 1115+
 1116+# Ĭ [LATIN CAPITAL LETTER I WITH BREVE]
 1117+"\u012C" => "I"
 1118+
 1119+# Į [LATIN CAPITAL LETTER I WITH OGONEK]
 1120+"\u012E" => "I"
 1121+
 1122+# İ [LATIN CAPITAL LETTER I WITH DOT ABOVE]
 1123+"\u0130" => "I"
 1124+
 1125+# Ɩ [LATIN CAPITAL LETTER IOTA]
 1126+"\u0196" => "I"
 1127+
 1128+# Ɨ [LATIN CAPITAL LETTER I WITH STROKE]
 1129+"\u0197" => "I"
 1130+
 1131+# Ǐ [LATIN CAPITAL LETTER I WITH CARON]
 1132+"\u01CF" => "I"
 1133+
 1134+# Ȉ [LATIN CAPITAL LETTER I WITH DOUBLE GRAVE]
 1135+"\u0208" => "I"
 1136+
 1137+# Ȋ [LATIN CAPITAL LETTER I WITH INVERTED BREVE]
 1138+"\u020A" => "I"
 1139+
 1140+# ɪ [LATIN LETTER SMALL CAPITAL I]
 1141+"\u026A" => "I"
 1142+
 1143+# ᵻ [LATIN SMALL CAPITAL LETTER I WITH STROKE]
 1144+"\u1D7B" => "I"
 1145+
 1146+# Ḭ [LATIN CAPITAL LETTER I WITH TILDE BELOW]
 1147+"\u1E2C" => "I"
 1148+
 1149+# Ḯ [LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE]
 1150+"\u1E2E" => "I"
 1151+
 1152+# Ỉ [LATIN CAPITAL LETTER I WITH HOOK ABOVE]
 1153+"\u1EC8" => "I"
 1154+
 1155+# Ị [LATIN CAPITAL LETTER I WITH DOT BELOW]
 1156+"\u1ECA" => "I"
 1157+
 1158+# Ⓘ [CIRCLED LATIN CAPITAL LETTER I]
 1159+"\u24BE" => "I"
 1160+
 1161+# ꟾ [LATIN EPIGRAPHIC LETTER I LONGA]
 1162+"\uA7FE" => "I"
 1163+
 1164+# I [FULLWIDTH LATIN CAPITAL LETTER I]
 1165+"\uFF29" => "I"
 1166+
 1167+# ì [LATIN SMALL LETTER I WITH GRAVE]
 1168+"\u00EC" => "i"
 1169+
 1170+# í [LATIN SMALL LETTER I WITH ACUTE]
 1171+"\u00ED" => "i"
 1172+
 1173+# î [LATIN SMALL LETTER I WITH CIRCUMFLEX]
 1174+"\u00EE" => "i"
 1175+
 1176+# ï [LATIN SMALL LETTER I WITH DIAERESIS]
 1177+"\u00EF" => "i"
 1178+
 1179+# ĩ [LATIN SMALL LETTER I WITH TILDE]
 1180+"\u0129" => "i"
 1181+
 1182+# ī [LATIN SMALL LETTER I WITH MACRON]
 1183+"\u012B" => "i"
 1184+
 1185+# ĭ [LATIN SMALL LETTER I WITH BREVE]
 1186+"\u012D" => "i"
 1187+
 1188+# į [LATIN SMALL LETTER I WITH OGONEK]
 1189+"\u012F" => "i"
 1190+
 1191+# ı [LATIN SMALL LETTER DOTLESS I]
 1192+"\u0131" => "i"
 1193+
 1194+# ǐ [LATIN SMALL LETTER I WITH CARON]
 1195+"\u01D0" => "i"
 1196+
 1197+# ȉ [LATIN SMALL LETTER I WITH DOUBLE GRAVE]
 1198+"\u0209" => "i"
 1199+
 1200+# ȋ [LATIN SMALL LETTER I WITH INVERTED BREVE]
 1201+"\u020B" => "i"
 1202+
 1203+# ɨ [LATIN SMALL LETTER I WITH STROKE]
 1204+"\u0268" => "i"
 1205+
 1206+# ᴉ [LATIN SMALL LETTER TURNED I]
 1207+"\u1D09" => "i"
 1208+
 1209+# ᵢ [LATIN SUBSCRIPT SMALL LETTER I]
 1210+"\u1D62" => "i"
 1211+
 1212+# ᵼ [LATIN SMALL LETTER IOTA WITH STROKE]
 1213+"\u1D7C" => "i"
 1214+
 1215+# ᶖ [LATIN SMALL LETTER I WITH RETROFLEX HOOK]
 1216+"\u1D96" => "i"
 1217+
 1218+# ḭ [LATIN SMALL LETTER I WITH TILDE BELOW]
 1219+"\u1E2D" => "i"
 1220+
 1221+# ḯ [LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE]
 1222+"\u1E2F" => "i"
 1223+
 1224+# ỉ [LATIN SMALL LETTER I WITH HOOK ABOVE]
 1225+"\u1EC9" => "i"
 1226+
 1227+# ị [LATIN SMALL LETTER I WITH DOT BELOW]
 1228+"\u1ECB" => "i"
 1229+
 1230+# ⁱ [SUPERSCRIPT LATIN SMALL LETTER I]
 1231+"\u2071" => "i"
 1232+
 1233+# ⓘ [CIRCLED LATIN SMALL LETTER I]
 1234+"\u24D8" => "i"
 1235+
 1236+# i [FULLWIDTH LATIN SMALL LETTER I]
 1237+"\uFF49" => "i"
 1238+
 1239+# IJ [LATIN CAPITAL LIGATURE IJ]
 1240+"\u0132" => "IJ"
 1241+
 1242+# ⒤ [PARENTHESIZED LATIN SMALL LETTER I]
 1243+"\u24A4" => "(i)"
 1244+
 1245+# ij [LATIN SMALL LIGATURE IJ]
 1246+"\u0133" => "ij"
 1247+
 1248+# Ĵ [LATIN CAPITAL LETTER J WITH CIRCUMFLEX]
 1249+"\u0134" => "J"
 1250+
 1251+# Ɉ [LATIN CAPITAL LETTER J WITH STROKE]
 1252+"\u0248" => "J"
 1253+
 1254+# ᴊ [LATIN LETTER SMALL CAPITAL J]
 1255+"\u1D0A" => "J"
 1256+
 1257+# Ⓙ [CIRCLED LATIN CAPITAL LETTER J]
 1258+"\u24BF" => "J"
 1259+
 1260+# J [FULLWIDTH LATIN CAPITAL LETTER J]
 1261+"\uFF2A" => "J"
 1262+
 1263+# ĵ [LATIN SMALL LETTER J WITH CIRCUMFLEX]
 1264+"\u0135" => "j"
 1265+
 1266+# ǰ [LATIN SMALL LETTER J WITH CARON]
 1267+"\u01F0" => "j"
 1268+
 1269+# ȷ [LATIN SMALL LETTER DOTLESS J]
 1270+"\u0237" => "j"
 1271+
 1272+# ɉ [LATIN SMALL LETTER J WITH STROKE]
 1273+"\u0249" => "j"
 1274+
 1275+# ɟ [LATIN SMALL LETTER DOTLESS J WITH STROKE]
 1276+"\u025F" => "j"
 1277+
 1278+# ʄ [LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK]
 1279+"\u0284" => "j"
 1280+
 1281+# ʝ [LATIN SMALL LETTER J WITH CROSSED-TAIL]
 1282+"\u029D" => "j"
 1283+
 1284+# ⓙ [CIRCLED LATIN SMALL LETTER J]
 1285+"\u24D9" => "j"
 1286+
 1287+# ⱼ [LATIN SUBSCRIPT SMALL LETTER J]
 1288+"\u2C7C" => "j"
 1289+
 1290+# j [FULLWIDTH LATIN SMALL LETTER J]
 1291+"\uFF4A" => "j"
 1292+
 1293+# ⒥ [PARENTHESIZED LATIN SMALL LETTER J]
 1294+"\u24A5" => "(j)"
 1295+
 1296+# Ķ [LATIN CAPITAL LETTER K WITH CEDILLA]
 1297+"\u0136" => "K"
 1298+
 1299+# Ƙ [LATIN CAPITAL LETTER K WITH HOOK]
 1300+"\u0198" => "K"
 1301+
 1302+# Ǩ [LATIN CAPITAL LETTER K WITH CARON]
 1303+"\u01E8" => "K"
 1304+
 1305+# ᴋ [LATIN LETTER SMALL CAPITAL K]
 1306+"\u1D0B" => "K"
 1307+
 1308+# Ḱ [LATIN CAPITAL LETTER K WITH ACUTE]
 1309+"\u1E30" => "K"
 1310+
 1311+# Ḳ [LATIN CAPITAL LETTER K WITH DOT BELOW]
 1312+"\u1E32" => "K"
 1313+
 1314+# Ḵ [LATIN CAPITAL LETTER K WITH LINE BELOW]
 1315+"\u1E34" => "K"
 1316+
 1317+# Ⓚ [CIRCLED LATIN CAPITAL LETTER K]
 1318+"\u24C0" => "K"
 1319+
 1320+# Ⱪ [LATIN CAPITAL LETTER K WITH DESCENDER]
 1321+"\u2C69" => "K"
 1322+
 1323+# Ꝁ [LATIN CAPITAL LETTER K WITH STROKE]
 1324+"\uA740" => "K"
 1325+
 1326+# Ꝃ [LATIN CAPITAL LETTER K WITH DIAGONAL STROKE]
 1327+"\uA742" => "K"
 1328+
 1329+# Ꝅ [LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE]
 1330+"\uA744" => "K"
 1331+
 1332+# K [FULLWIDTH LATIN CAPITAL LETTER K]
 1333+"\uFF2B" => "K"
 1334+
 1335+# ķ [LATIN SMALL LETTER K WITH CEDILLA]
 1336+"\u0137" => "k"
 1337+
 1338+# ƙ [LATIN SMALL LETTER K WITH HOOK]
 1339+"\u0199" => "k"
 1340+
 1341+# ǩ [LATIN SMALL LETTER K WITH CARON]
 1342+"\u01E9" => "k"
 1343+
 1344+# ʞ [LATIN SMALL LETTER TURNED K]
 1345+"\u029E" => "k"
 1346+
 1347+# ᶄ [LATIN SMALL LETTER K WITH PALATAL HOOK]
 1348+"\u1D84" => "k"
 1349+
 1350+# ḱ [LATIN SMALL LETTER K WITH ACUTE]
 1351+"\u1E31" => "k"
 1352+
 1353+# ḳ [LATIN SMALL LETTER K WITH DOT BELOW]
 1354+"\u1E33" => "k"
 1355+
 1356+# ḵ [LATIN SMALL LETTER K WITH LINE BELOW]
 1357+"\u1E35" => "k"
 1358+
 1359+# ⓚ [CIRCLED LATIN SMALL LETTER K]
 1360+"\u24DA" => "k"
 1361+
 1362+# ⱪ [LATIN SMALL LETTER K WITH DESCENDER]
 1363+"\u2C6A" => "k"
 1364+
 1365+# ꝁ [LATIN SMALL LETTER K WITH STROKE]
 1366+"\uA741" => "k"
 1367+
 1368+# ꝃ [LATIN SMALL LETTER K WITH DIAGONAL STROKE]
 1369+"\uA743" => "k"
 1370+
 1371+# ꝅ [LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE]
 1372+"\uA745" => "k"
 1373+
 1374+# k [FULLWIDTH LATIN SMALL LETTER K]
 1375+"\uFF4B" => "k"
 1376+
 1377+# ⒦ [PARENTHESIZED LATIN SMALL LETTER K]
 1378+"\u24A6" => "(k)"
 1379+
 1380+# Ĺ [LATIN CAPITAL LETTER L WITH ACUTE]
 1381+"\u0139" => "L"
 1382+
 1383+# Ļ [LATIN CAPITAL LETTER L WITH CEDILLA]
 1384+"\u013B" => "L"
 1385+
 1386+# Ľ [LATIN CAPITAL LETTER L WITH CARON]
 1387+"\u013D" => "L"
 1388+
 1389+# Ŀ [LATIN CAPITAL LETTER L WITH MIDDLE DOT]
 1390+"\u013F" => "L"
 1391+
 1392+# Ł [LATIN CAPITAL LETTER L WITH STROKE]
 1393+"\u0141" => "L"
 1394+
 1395+# Ƚ [LATIN CAPITAL LETTER L WITH BAR]
 1396+"\u023D" => "L"
 1397+
 1398+# ʟ [LATIN LETTER SMALL CAPITAL L]
 1399+"\u029F" => "L"
 1400+
 1401+# ᴌ [LATIN LETTER SMALL CAPITAL L WITH STROKE]
 1402+"\u1D0C" => "L"
 1403+
 1404+# Ḷ [LATIN CAPITAL LETTER L WITH DOT BELOW]
 1405+"\u1E36" => "L"
 1406+
 1407+# Ḹ [LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON]
 1408+"\u1E38" => "L"
 1409+
 1410+# Ḻ [LATIN CAPITAL LETTER L WITH LINE BELOW]
 1411+"\u1E3A" => "L"
 1412+
 1413+# Ḽ [LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW]
 1414+"\u1E3C" => "L"
 1415+
 1416+# Ⓛ [CIRCLED LATIN CAPITAL LETTER L]
 1417+"\u24C1" => "L"
 1418+
 1419+# Ⱡ [LATIN CAPITAL LETTER L WITH DOUBLE BAR]
 1420+"\u2C60" => "L"
 1421+
 1422+# Ɫ [LATIN CAPITAL LETTER L WITH MIDDLE TILDE]
 1423+"\u2C62" => "L"
 1424+
 1425+# Ꝇ [LATIN CAPITAL LETTER BROKEN L]
 1426+"\uA746" => "L"
 1427+
 1428+# Ꝉ [LATIN CAPITAL LETTER L WITH HIGH STROKE]
 1429+"\uA748" => "L"
 1430+
 1431+# Ꞁ [LATIN CAPITAL LETTER TURNED L]
 1432+"\uA780" => "L"
 1433+
 1434+# L [FULLWIDTH LATIN CAPITAL LETTER L]
 1435+"\uFF2C" => "L"
 1436+
 1437+# ĺ [LATIN SMALL LETTER L WITH ACUTE]
 1438+"\u013A" => "l"
 1439+
 1440+# ļ [LATIN SMALL LETTER L WITH CEDILLA]
 1441+"\u013C" => "l"
 1442+
 1443+# ľ [LATIN SMALL LETTER L WITH CARON]
 1444+"\u013E" => "l"
 1445+
 1446+# ŀ [LATIN SMALL LETTER L WITH MIDDLE DOT]
 1447+"\u0140" => "l"
 1448+
 1449+# ł [LATIN SMALL LETTER L WITH STROKE]
 1450+"\u0142" => "l"
 1451+
 1452+# ƚ [LATIN SMALL LETTER L WITH BAR]
 1453+"\u019A" => "l"
 1454+
 1455+# ȴ [LATIN SMALL LETTER L WITH CURL]
 1456+"\u0234" => "l"
 1457+
 1458+# ɫ [LATIN SMALL LETTER L WITH MIDDLE TILDE]
 1459+"\u026B" => "l"
 1460+
 1461+# ɬ [LATIN SMALL LETTER L WITH BELT]
 1462+"\u026C" => "l"
 1463+
 1464+# ɭ [LATIN SMALL LETTER L WITH RETROFLEX HOOK]
 1465+"\u026D" => "l"
 1466+
 1467+# ᶅ [LATIN SMALL LETTER L WITH PALATAL HOOK]
 1468+"\u1D85" => "l"
 1469+
 1470+# ḷ [LATIN SMALL LETTER L WITH DOT BELOW]
 1471+"\u1E37" => "l"
 1472+
 1473+# ḹ [LATIN SMALL LETTER L WITH DOT BELOW AND MACRON]
 1474+"\u1E39" => "l"
 1475+
 1476+# ḻ [LATIN SMALL LETTER L WITH LINE BELOW]
 1477+"\u1E3B" => "l"
 1478+
 1479+# ḽ [LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW]
 1480+"\u1E3D" => "l"
 1481+
 1482+# ⓛ [CIRCLED LATIN SMALL LETTER L]
 1483+"\u24DB" => "l"
 1484+
 1485+# ⱡ [LATIN SMALL LETTER L WITH DOUBLE BAR]
 1486+"\u2C61" => "l"
 1487+
 1488+# ꝇ [LATIN SMALL LETTER BROKEN L]
 1489+"\uA747" => "l"
 1490+
 1491+# ꝉ [LATIN SMALL LETTER L WITH HIGH STROKE]
 1492+"\uA749" => "l"
 1493+
 1494+# ꞁ [LATIN SMALL LETTER TURNED L]
 1495+"\uA781" => "l"
 1496+
 1497+# l [FULLWIDTH LATIN SMALL LETTER L]
 1498+"\uFF4C" => "l"
 1499+
 1500+# LJ [LATIN CAPITAL LETTER LJ]
 1501+"\u01C7" => "LJ"
 1502+
 1503+# Ỻ [LATIN CAPITAL LETTER MIDDLE-WELSH LL]
 1504+"\u1EFA" => "LL"
 1505+
 1506+# Lj [LATIN CAPITAL LETTER L WITH SMALL LETTER J]
 1507+"\u01C8" => "Lj"
 1508+
 1509+# ⒧ [PARENTHESIZED LATIN SMALL LETTER L]
 1510+"\u24A7" => "(l)"
 1511+
 1512+# lj [LATIN SMALL LETTER LJ]
 1513+"\u01C9" => "lj"
 1514+
 1515+# ỻ [LATIN SMALL LETTER MIDDLE-WELSH LL]
 1516+"\u1EFB" => "ll"
 1517+
 1518+# ʪ [LATIN SMALL LETTER LS DIGRAPH]
 1519+"\u02AA" => "ls"
 1520+
 1521+# ʫ [LATIN SMALL LETTER LZ DIGRAPH]
 1522+"\u02AB" => "lz"
 1523+
 1524+# Ɯ [LATIN CAPITAL LETTER TURNED M]
 1525+"\u019C" => "M"
 1526+
 1527+# ᴍ [LATIN LETTER SMALL CAPITAL M]
 1528+"\u1D0D" => "M"
 1529+
 1530+# Ḿ [LATIN CAPITAL LETTER M WITH ACUTE]
 1531+"\u1E3E" => "M"
 1532+
 1533+# Ṁ [LATIN CAPITAL LETTER M WITH DOT ABOVE]
 1534+"\u1E40" => "M"
 1535+
 1536+# Ṃ [LATIN CAPITAL LETTER M WITH DOT BELOW]
 1537+"\u1E42" => "M"
 1538+
 1539+# Ⓜ [CIRCLED LATIN CAPITAL LETTER M]
 1540+"\u24C2" => "M"
 1541+
 1542+# Ɱ [LATIN CAPITAL LETTER M WITH HOOK]
 1543+"\u2C6E" => "M"
 1544+
 1545+# ꟽ [LATIN EPIGRAPHIC LETTER INVERTED M]
 1546+"\uA7FD" => "M"
 1547+
 1548+# ꟿ [LATIN EPIGRAPHIC LETTER ARCHAIC M]
 1549+"\uA7FF" => "M"
 1550+
 1551+# M [FULLWIDTH LATIN CAPITAL LETTER M]
 1552+"\uFF2D" => "M"
 1553+
 1554+# ɯ [LATIN SMALL LETTER TURNED M]
 1555+"\u026F" => "m"
 1556+
 1557+# ɰ [LATIN SMALL LETTER TURNED M WITH LONG LEG]
 1558+"\u0270" => "m"
 1559+
 1560+# ɱ [LATIN SMALL LETTER M WITH HOOK]
 1561+"\u0271" => "m"
 1562+
 1563+# ᵯ [LATIN SMALL LETTER M WITH MIDDLE TILDE]
 1564+"\u1D6F" => "m"
 1565+
 1566+# ᶆ [LATIN SMALL LETTER M WITH PALATAL HOOK]
 1567+"\u1D86" => "m"
 1568+
 1569+# ḿ [LATIN SMALL LETTER M WITH ACUTE]
 1570+"\u1E3F" => "m"
 1571+
 1572+# ṁ [LATIN SMALL LETTER M WITH DOT ABOVE]
 1573+"\u1E41" => "m"
 1574+
 1575+# ṃ [LATIN SMALL LETTER M WITH DOT BELOW]
 1576+"\u1E43" => "m"
 1577+
 1578+# ⓜ [CIRCLED LATIN SMALL LETTER M]
 1579+"\u24DC" => "m"
 1580+
 1581+# m [FULLWIDTH LATIN SMALL LETTER M]
 1582+"\uFF4D" => "m"
 1583+
 1584+# ⒨ [PARENTHESIZED LATIN SMALL LETTER M]
 1585+"\u24A8" => "(m)"
 1586+
 1587+# Ñ [LATIN CAPITAL LETTER N WITH TILDE]
 1588+"\u00D1" => "N"
 1589+
 1590+# Ń [LATIN CAPITAL LETTER N WITH ACUTE]
 1591+"\u0143" => "N"
 1592+
 1593+# Ņ [LATIN CAPITAL LETTER N WITH CEDILLA]
 1594+"\u0145" => "N"
 1595+
 1596+# Ň [LATIN CAPITAL LETTER N WITH CARON]
 1597+"\u0147" => "N"
 1598+
 1599+# Ŋ http://en.wikipedia.org/wiki/Eng_(letter) [LATIN CAPITAL LETTER ENG]
 1600+"\u014A" => "N"
 1601+
 1602+# Ɲ [LATIN CAPITAL LETTER N WITH LEFT HOOK]
 1603+"\u019D" => "N"
 1604+
 1605+# Ǹ [LATIN CAPITAL LETTER N WITH GRAVE]
 1606+"\u01F8" => "N"
 1607+
 1608+# Ƞ [LATIN CAPITAL LETTER N WITH LONG RIGHT LEG]
 1609+"\u0220" => "N"
 1610+
 1611+# ɴ [LATIN LETTER SMALL CAPITAL N]
 1612+"\u0274" => "N"
 1613+
 1614+# ᴎ [LATIN LETTER SMALL CAPITAL REVERSED N]
 1615+"\u1D0E" => "N"
 1616+
 1617+# Ṅ [LATIN CAPITAL LETTER N WITH DOT ABOVE]
 1618+"\u1E44" => "N"
 1619+
 1620+# Ṇ [LATIN CAPITAL LETTER N WITH DOT BELOW]
 1621+"\u1E46" => "N"
 1622+
 1623+# Ṉ [LATIN CAPITAL LETTER N WITH LINE BELOW]
 1624+"\u1E48" => "N"
 1625+
 1626+# Ṋ [LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW]
 1627+"\u1E4A" => "N"
 1628+
 1629+# Ⓝ [CIRCLED LATIN CAPITAL LETTER N]
 1630+"\u24C3" => "N"
 1631+
 1632+# N [FULLWIDTH LATIN CAPITAL LETTER N]
 1633+"\uFF2E" => "N"
 1634+
 1635+# ñ [LATIN SMALL LETTER N WITH TILDE]
 1636+"\u00F1" => "n"
 1637+
 1638+# ń [LATIN SMALL LETTER N WITH ACUTE]
 1639+"\u0144" => "n"
 1640+
 1641+# ņ [LATIN SMALL LETTER N WITH CEDILLA]
 1642+"\u0146" => "n"
 1643+
 1644+# ň [LATIN SMALL LETTER N WITH CARON]
 1645+"\u0148" => "n"
 1646+
 1647+# ʼn [LATIN SMALL LETTER N PRECEDED BY APOSTROPHE]
 1648+"\u0149" => "n"
 1649+
 1650+# ŋ http://en.wikipedia.org/wiki/Eng_(letter) [LATIN SMALL LETTER ENG]
 1651+"\u014B" => "n"
 1652+
 1653+# ƞ [LATIN SMALL LETTER N WITH LONG RIGHT LEG]
 1654+"\u019E" => "n"
 1655+
 1656+# ǹ [LATIN SMALL LETTER N WITH GRAVE]
 1657+"\u01F9" => "n"
 1658+
 1659+# ȵ [LATIN SMALL LETTER N WITH CURL]
 1660+"\u0235" => "n"
 1661+
 1662+# ɲ [LATIN SMALL LETTER N WITH LEFT HOOK]
 1663+"\u0272" => "n"
 1664+
 1665+# ɳ [LATIN SMALL LETTER N WITH RETROFLEX HOOK]
 1666+"\u0273" => "n"
 1667+
 1668+# ᵰ [LATIN SMALL LETTER N WITH MIDDLE TILDE]
 1669+"\u1D70" => "n"
 1670+
 1671+# ᶇ [LATIN SMALL LETTER N WITH PALATAL HOOK]
 1672+"\u1D87" => "n"
 1673+
 1674+# ṅ [LATIN SMALL LETTER N WITH DOT ABOVE]
 1675+"\u1E45" => "n"
 1676+
 1677+# ṇ [LATIN SMALL LETTER N WITH DOT BELOW]
 1678+"\u1E47" => "n"
 1679+
 1680+# ṉ [LATIN SMALL LETTER N WITH LINE BELOW]
 1681+"\u1E49" => "n"
 1682+
 1683+# ṋ [LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW]
 1684+"\u1E4B" => "n"
 1685+
 1686+# ⁿ [SUPERSCRIPT LATIN SMALL LETTER N]
 1687+"\u207F" => "n"
 1688+
 1689+# ⓝ [CIRCLED LATIN SMALL LETTER N]
 1690+"\u24DD" => "n"
 1691+
 1692+# n [FULLWIDTH LATIN SMALL LETTER N]
 1693+"\uFF4E" => "n"
 1694+
 1695+# NJ [LATIN CAPITAL LETTER NJ]
 1696+"\u01CA" => "NJ"
 1697+
 1698+# Nj [LATIN CAPITAL LETTER N WITH SMALL LETTER J]
 1699+"\u01CB" => "Nj"
 1700+
 1701+# ⒩ [PARENTHESIZED LATIN SMALL LETTER N]
 1702+"\u24A9" => "(n)"
 1703+
 1704+# nj [LATIN SMALL LETTER NJ]
 1705+"\u01CC" => "nj"
 1706+
 1707+# Ò [LATIN CAPITAL LETTER O WITH GRAVE]
 1708+"\u00D2" => "O"
 1709+
 1710+# Ó [LATIN CAPITAL LETTER O WITH ACUTE]
 1711+"\u00D3" => "O"
 1712+
 1713+# Ô [LATIN CAPITAL LETTER O WITH CIRCUMFLEX]
 1714+"\u00D4" => "O"
 1715+
 1716+# Õ [LATIN CAPITAL LETTER O WITH TILDE]
 1717+"\u00D5" => "O"
 1718+
 1719+# Ö [LATIN CAPITAL LETTER O WITH DIAERESIS]
 1720+"\u00D6" => "O"
 1721+
 1722+# Ø [LATIN CAPITAL LETTER O WITH STROKE]
 1723+"\u00D8" => "O"
 1724+
 1725+# Ō [LATIN CAPITAL LETTER O WITH MACRON]
 1726+"\u014C" => "O"
 1727+
 1728+# Ŏ [LATIN CAPITAL LETTER O WITH BREVE]
 1729+"\u014E" => "O"
 1730+
 1731+# Ő [LATIN CAPITAL LETTER O WITH DOUBLE ACUTE]
 1732+"\u0150" => "O"
 1733+
 1734+# Ɔ [LATIN CAPITAL LETTER OPEN O]
 1735+"\u0186" => "O"
 1736+
 1737+# Ɵ [LATIN CAPITAL LETTER O WITH MIDDLE TILDE]
 1738+"\u019F" => "O"
 1739+
 1740+# Ơ [LATIN CAPITAL LETTER O WITH HORN]
 1741+"\u01A0" => "O"
 1742+
 1743+# Ǒ [LATIN CAPITAL LETTER O WITH CARON]
 1744+"\u01D1" => "O"
 1745+
 1746+# Ǫ [LATIN CAPITAL LETTER O WITH OGONEK]
 1747+"\u01EA" => "O"
 1748+
 1749+# Ǭ [LATIN CAPITAL LETTER O WITH OGONEK AND MACRON]
 1750+"\u01EC" => "O"
 1751+
 1752+# Ǿ [LATIN CAPITAL LETTER O WITH STROKE AND ACUTE]
 1753+"\u01FE" => "O"
 1754+
 1755+# Ȍ [LATIN CAPITAL LETTER O WITH DOUBLE GRAVE]
 1756+"\u020C" => "O"
 1757+
 1758+# Ȏ [LATIN CAPITAL LETTER O WITH INVERTED BREVE]
 1759+"\u020E" => "O"
 1760+
 1761+# Ȫ [LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON]
 1762+"\u022A" => "O"
 1763+
 1764+# Ȭ [LATIN CAPITAL LETTER O WITH TILDE AND MACRON]
 1765+"\u022C" => "O"
 1766+
 1767+# Ȯ [LATIN CAPITAL LETTER O WITH DOT ABOVE]
 1768+"\u022E" => "O"
 1769+
 1770+# Ȱ [LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON]
 1771+"\u0230" => "O"
 1772+
 1773+# ᴏ [LATIN LETTER SMALL CAPITAL O]
 1774+"\u1D0F" => "O"
 1775+
 1776+# ᴐ [LATIN LETTER SMALL CAPITAL OPEN O]
 1777+"\u1D10" => "O"
 1778+
 1779+# Ṍ [LATIN CAPITAL LETTER O WITH TILDE AND ACUTE]
 1780+"\u1E4C" => "O"
 1781+
 1782+# Ṏ [LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS]
 1783+"\u1E4E" => "O"
 1784+
 1785+# Ṑ [LATIN CAPITAL LETTER O WITH MACRON AND GRAVE]
 1786+"\u1E50" => "O"
 1787+
 1788+# Ṓ [LATIN CAPITAL LETTER O WITH MACRON AND ACUTE]
 1789+"\u1E52" => "O"
 1790+
 1791+# Ọ [LATIN CAPITAL LETTER O WITH DOT BELOW]
 1792+"\u1ECC" => "O"
 1793+
 1794+# Ỏ [LATIN CAPITAL LETTER O WITH HOOK ABOVE]
 1795+"\u1ECE" => "O"
 1796+
 1797+# Ố [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE]
 1798+"\u1ED0" => "O"
 1799+
 1800+# Ồ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE]
 1801+"\u1ED2" => "O"
 1802+
 1803+# Ổ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE]
 1804+"\u1ED4" => "O"
 1805+
 1806+# Ỗ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE]
 1807+"\u1ED6" => "O"
 1808+
 1809+# Ộ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW]
 1810+"\u1ED8" => "O"
 1811+
 1812+# Ớ [LATIN CAPITAL LETTER O WITH HORN AND ACUTE]
 1813+"\u1EDA" => "O"
 1814+
 1815+# Ờ [LATIN CAPITAL LETTER O WITH HORN AND GRAVE]
 1816+"\u1EDC" => "O"
 1817+
 1818+# Ở [LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE]
 1819+"\u1EDE" => "O"
 1820+
 1821+# Ỡ [LATIN CAPITAL LETTER O WITH HORN AND TILDE]
 1822+"\u1EE0" => "O"
 1823+
 1824+# Ợ [LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW]
 1825+"\u1EE2" => "O"
 1826+
 1827+# Ⓞ [CIRCLED LATIN CAPITAL LETTER O]
 1828+"\u24C4" => "O"
 1829+
 1830+# Ꝋ [LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY]
 1831+"\uA74A" => "O"
 1832+
 1833+# Ꝍ [LATIN CAPITAL LETTER O WITH LOOP]
 1834+"\uA74C" => "O"
 1835+
 1836+# O [FULLWIDTH LATIN CAPITAL LETTER O]
 1837+"\uFF2F" => "O"
 1838+
 1839+# ò [LATIN SMALL LETTER O WITH GRAVE]
 1840+"\u00F2" => "o"
 1841+
 1842+# ó [LATIN SMALL LETTER O WITH ACUTE]
 1843+"\u00F3" => "o"
 1844+
 1845+# ô [LATIN SMALL LETTER O WITH CIRCUMFLEX]
 1846+"\u00F4" => "o"
 1847+
 1848+# õ [LATIN SMALL LETTER O WITH TILDE]
 1849+"\u00F5" => "o"
 1850+
 1851+# ö [LATIN SMALL LETTER O WITH DIAERESIS]
 1852+"\u00F6" => "o"
 1853+
 1854+# ø [LATIN SMALL LETTER O WITH STROKE]
 1855+"\u00F8" => "o"
 1856+
 1857+# ō [LATIN SMALL LETTER O WITH MACRON]
 1858+"\u014D" => "o"
 1859+
 1860+# ŏ [LATIN SMALL LETTER O WITH BREVE]
 1861+"\u014F" => "o"
 1862+
 1863+# ő [LATIN SMALL LETTER O WITH DOUBLE ACUTE]
 1864+"\u0151" => "o"
 1865+
 1866+# ơ [LATIN SMALL LETTER O WITH HORN]
 1867+"\u01A1" => "o"
 1868+
 1869+# ǒ [LATIN SMALL LETTER O WITH CARON]
 1870+"\u01D2" => "o"
 1871+
 1872+# ǫ [LATIN SMALL LETTER O WITH OGONEK]
 1873+"\u01EB" => "o"
 1874+
 1875+# ǭ [LATIN SMALL LETTER O WITH OGONEK AND MACRON]
 1876+"\u01ED" => "o"
 1877+
 1878+# ǿ [LATIN SMALL LETTER O WITH STROKE AND ACUTE]
 1879+"\u01FF" => "o"
 1880+
 1881+# ȍ [LATIN SMALL LETTER O WITH DOUBLE GRAVE]
 1882+"\u020D" => "o"
 1883+
 1884+# ȏ [LATIN SMALL LETTER O WITH INVERTED BREVE]
 1885+"\u020F" => "o"
 1886+
 1887+# ȫ [LATIN SMALL LETTER O WITH DIAERESIS AND MACRON]
 1888+"\u022B" => "o"
 1889+
 1890+# ȭ [LATIN SMALL LETTER O WITH TILDE AND MACRON]
 1891+"\u022D" => "o"
 1892+
 1893+# ȯ [LATIN SMALL LETTER O WITH DOT ABOVE]
 1894+"\u022F" => "o"
 1895+
 1896+# ȱ [LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON]
 1897+"\u0231" => "o"
 1898+
 1899+# ɔ [LATIN SMALL LETTER OPEN O]
 1900+"\u0254" => "o"
 1901+
 1902+# ɵ [LATIN SMALL LETTER BARRED O]
 1903+"\u0275" => "o"
 1904+
 1905+# ᴖ [LATIN SMALL LETTER TOP HALF O]
 1906+"\u1D16" => "o"
 1907+
 1908+# ᴗ [LATIN SMALL LETTER BOTTOM HALF O]
 1909+"\u1D17" => "o"
 1910+
 1911+# ᶗ [LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK]
 1912+"\u1D97" => "o"
 1913+
 1914+# ṍ [LATIN SMALL LETTER O WITH TILDE AND ACUTE]
 1915+"\u1E4D" => "o"
 1916+
 1917+# ṏ [LATIN SMALL LETTER O WITH TILDE AND DIAERESIS]
 1918+"\u1E4F" => "o"
 1919+
 1920+# ṑ [LATIN SMALL LETTER O WITH MACRON AND GRAVE]
 1921+"\u1E51" => "o"
 1922+
 1923+# ṓ [LATIN SMALL LETTER O WITH MACRON AND ACUTE]
 1924+"\u1E53" => "o"
 1925+
 1926+# ọ [LATIN SMALL LETTER O WITH DOT BELOW]
 1927+"\u1ECD" => "o"
 1928+
 1929+# ỏ [LATIN SMALL LETTER O WITH HOOK ABOVE]
 1930+"\u1ECF" => "o"
 1931+
 1932+# ố [LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE]
 1933+"\u1ED1" => "o"
 1934+
 1935+# ồ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE]
 1936+"\u1ED3" => "o"
 1937+
 1938+# ổ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE]
 1939+"\u1ED5" => "o"
 1940+
 1941+# ỗ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE]
 1942+"\u1ED7" => "o"
 1943+
 1944+# ộ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW]
 1945+"\u1ED9" => "o"
 1946+
 1947+# ớ [LATIN SMALL LETTER O WITH HORN AND ACUTE]
 1948+"\u1EDB" => "o"
 1949+
 1950+# ờ [LATIN SMALL LETTER O WITH HORN AND GRAVE]
 1951+"\u1EDD" => "o"
 1952+
 1953+# ở [LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE]
 1954+"\u1EDF" => "o"
 1955+
 1956+# ỡ [LATIN SMALL LETTER O WITH HORN AND TILDE]
 1957+"\u1EE1" => "o"
 1958+
 1959+# ợ [LATIN SMALL LETTER O WITH HORN AND DOT BELOW]
 1960+"\u1EE3" => "o"
 1961+
 1962+# ₒ [LATIN SUBSCRIPT SMALL LETTER O]
 1963+"\u2092" => "o"
 1964+
 1965+# ⓞ [CIRCLED LATIN SMALL LETTER O]
 1966+"\u24DE" => "o"
 1967+
 1968+# ⱺ [LATIN SMALL LETTER O WITH LOW RING INSIDE]
 1969+"\u2C7A" => "o"
 1970+
 1971+# ꝋ [LATIN SMALL LETTER O WITH LONG STROKE OVERLAY]
 1972+"\uA74B" => "o"
 1973+
 1974+# ꝍ [LATIN SMALL LETTER O WITH LOOP]
 1975+"\uA74D" => "o"
 1976+
 1977+# o [FULLWIDTH LATIN SMALL LETTER O]
 1978+"\uFF4F" => "o"
 1979+
 1980+# Œ [LATIN CAPITAL LIGATURE OE]
 1981+"\u0152" => "OE"
 1982+
 1983+# ɶ [LATIN LETTER SMALL CAPITAL OE]
 1984+"\u0276" => "OE"
 1985+
 1986+# Ꝏ [LATIN CAPITAL LETTER OO]
 1987+"\uA74E" => "OO"
 1988+
 1989+# Ȣ http://en.wikipedia.org/wiki/OU [LATIN CAPITAL LETTER OU]
 1990+"\u0222" => "OU"
 1991+
 1992+# ᴕ [LATIN LETTER SMALL CAPITAL OU]
 1993+"\u1D15" => "OU"
 1994+
 1995+# ⒪ [PARENTHESIZED LATIN SMALL LETTER O]
 1996+"\u24AA" => "(o)"
 1997+
 1998+# œ [LATIN SMALL LIGATURE OE]
 1999+"\u0153" => "oe"
 2000+
 2001+# ᴔ [LATIN SMALL LETTER TURNED OE]
 2002+"\u1D14" => "oe"
 2003+
 2004+# ꝏ [LATIN SMALL LETTER OO]
 2005+"\uA74F" => "oo"
 2006+
 2007+# ȣ http://en.wikipedia.org/wiki/OU [LATIN SMALL LETTER OU]
 2008+"\u0223" => "ou"
 2009+
 2010+# Ƥ [LATIN CAPITAL LETTER P WITH HOOK]
 2011+"\u01A4" => "P"
 2012+
 2013+# ᴘ [LATIN LETTER SMALL CAPITAL P]
 2014+"\u1D18" => "P"
 2015+
 2016+# Ṕ [LATIN CAPITAL LETTER P WITH ACUTE]
 2017+"\u1E54" => "P"
 2018+
 2019+# Ṗ [LATIN CAPITAL LETTER P WITH DOT ABOVE]
 2020+"\u1E56" => "P"
 2021+
 2022+# Ⓟ [CIRCLED LATIN CAPITAL LETTER P]
 2023+"\u24C5" => "P"
 2024+
 2025+# Ᵽ [LATIN CAPITAL LETTER P WITH STROKE]
 2026+"\u2C63" => "P"
 2027+
 2028+# Ꝑ [LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER]
 2029+"\uA750" => "P"
 2030+
 2031+# Ꝓ [LATIN CAPITAL LETTER P WITH FLOURISH]
 2032+"\uA752" => "P"
 2033+
 2034+# Ꝕ [LATIN CAPITAL LETTER P WITH SQUIRREL TAIL]
 2035+"\uA754" => "P"
 2036+
 2037+# P [FULLWIDTH LATIN CAPITAL LETTER P]
 2038+"\uFF30" => "P"
 2039+
 2040+# ƥ [LATIN SMALL LETTER P WITH HOOK]
 2041+"\u01A5" => "p"
 2042+
 2043+# ᵱ [LATIN SMALL LETTER P WITH MIDDLE TILDE]
 2044+"\u1D71" => "p"
 2045+
 2046+# ᵽ [LATIN SMALL LETTER P WITH STROKE]
 2047+"\u1D7D" => "p"
 2048+
 2049+# ᶈ [LATIN SMALL LETTER P WITH PALATAL HOOK]
 2050+"\u1D88" => "p"
 2051+
 2052+# ṕ [LATIN SMALL LETTER P WITH ACUTE]
 2053+"\u1E55" => "p"
 2054+
 2055+# ṗ [LATIN SMALL LETTER P WITH DOT ABOVE]
 2056+"\u1E57" => "p"
 2057+
 2058+# ⓟ [CIRCLED LATIN SMALL LETTER P]
 2059+"\u24DF" => "p"
 2060+
 2061+# ꝑ [LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER]
 2062+"\uA751" => "p"
 2063+
 2064+# ꝓ [LATIN SMALL LETTER P WITH FLOURISH]
 2065+"\uA753" => "p"
 2066+
 2067+# ꝕ [LATIN SMALL LETTER P WITH SQUIRREL TAIL]
 2068+"\uA755" => "p"
 2069+
 2070+# ꟼ [LATIN EPIGRAPHIC LETTER REVERSED P]
 2071+"\uA7FC" => "p"
 2072+
 2073+# p [FULLWIDTH LATIN SMALL LETTER P]
 2074+"\uFF50" => "p"
 2075+
 2076+# ⒫ [PARENTHESIZED LATIN SMALL LETTER P]
 2077+"\u24AB" => "(p)"
 2078+
 2079+# Ɋ [LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL]
 2080+"\u024A" => "Q"
 2081+
 2082+# Ⓠ [CIRCLED LATIN CAPITAL LETTER Q]
 2083+"\u24C6" => "Q"
 2084+
 2085+# Ꝗ [LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER]
 2086+"\uA756" => "Q"
 2087+
 2088+# Ꝙ [LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE]
 2089+"\uA758" => "Q"
 2090+
 2091+# Q [FULLWIDTH LATIN CAPITAL LETTER Q]
 2092+"\uFF31" => "Q"
 2093+
 2094+# ĸ http://en.wikipedia.org/wiki/Kra_(letter) [LATIN SMALL LETTER KRA]
 2095+"\u0138" => "q"
 2096+
 2097+# ɋ [LATIN SMALL LETTER Q WITH HOOK TAIL]
 2098+"\u024B" => "q"
 2099+
 2100+# ʠ [LATIN SMALL LETTER Q WITH HOOK]
 2101+"\u02A0" => "q"
 2102+
 2103+# ⓠ [CIRCLED LATIN SMALL LETTER Q]
 2104+"\u24E0" => "q"
 2105+
 2106+# ꝗ [LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER]
 2107+"\uA757" => "q"
 2108+
 2109+# ꝙ [LATIN SMALL LETTER Q WITH DIAGONAL STROKE]
 2110+"\uA759" => "q"
 2111+
 2112+# q [FULLWIDTH LATIN SMALL LETTER Q]
 2113+"\uFF51" => "q"
 2114+
 2115+# ⒬ [PARENTHESIZED LATIN SMALL LETTER Q]
 2116+"\u24AC" => "(q)"
 2117+
 2118+# ȹ [LATIN SMALL LETTER QP DIGRAPH]
 2119+"\u0239" => "qp"
 2120+
 2121+# Ŕ [LATIN CAPITAL LETTER R WITH ACUTE]
 2122+"\u0154" => "R"
 2123+
 2124+# Ŗ [LATIN CAPITAL LETTER R WITH CEDILLA]
 2125+"\u0156" => "R"
 2126+
 2127+# Ř [LATIN CAPITAL LETTER R WITH CARON]
 2128+"\u0158" => "R"
 2129+
 2130+# Ȓ [LATIN CAPITAL LETTER R WITH DOUBLE GRAVE]
 2131+"\u0210" => "R"
 2132+
 2133+# Ȓ [LATIN CAPITAL LETTER R WITH INVERTED BREVE]
 2134+"\u0212" => "R"
 2135+
 2136+# Ɍ [LATIN CAPITAL LETTER R WITH STROKE]
 2137+"\u024C" => "R"
 2138+
 2139+# ʀ [LATIN LETTER SMALL CAPITAL R]
 2140+"\u0280" => "R"
 2141+
 2142+# ʁ [LATIN LETTER SMALL CAPITAL INVERTED R]
 2143+"\u0281" => "R"
 2144+
 2145+# ᴙ [LATIN LETTER SMALL CAPITAL REVERSED R]
 2146+"\u1D19" => "R"
 2147+
 2148+# ᴚ [LATIN LETTER SMALL CAPITAL TURNED R]
 2149+"\u1D1A" => "R"
 2150+
 2151+# Ṙ [LATIN CAPITAL LETTER R WITH DOT ABOVE]
 2152+"\u1E58" => "R"
 2153+
 2154+# Ṛ [LATIN CAPITAL LETTER R WITH DOT BELOW]
 2155+"\u1E5A" => "R"
 2156+
 2157+# Ṝ [LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON]
 2158+"\u1E5C" => "R"
 2159+
 2160+# Ṟ [LATIN CAPITAL LETTER R WITH LINE BELOW]
 2161+"\u1E5E" => "R"
 2162+
 2163+# Ⓡ [CIRCLED LATIN CAPITAL LETTER R]
 2164+"\u24C7" => "R"
 2165+
 2166+# Ɽ [LATIN CAPITAL LETTER R WITH TAIL]
 2167+"\u2C64" => "R"
 2168+
 2169+# Ꝛ [LATIN CAPITAL LETTER R ROTUNDA]
 2170+"\uA75A" => "R"
 2171+
 2172+# Ꞃ [LATIN CAPITAL LETTER INSULAR R]
 2173+"\uA782" => "R"
 2174+
 2175+# R [FULLWIDTH LATIN CAPITAL LETTER R]
 2176+"\uFF32" => "R"
 2177+
 2178+# ŕ [LATIN SMALL LETTER R WITH ACUTE]
 2179+"\u0155" => "r"
 2180+
 2181+# ŗ [LATIN SMALL LETTER R WITH CEDILLA]
 2182+"\u0157" => "r"
 2183+
 2184+# ř [LATIN SMALL LETTER R WITH CARON]
 2185+"\u0159" => "r"
 2186+
 2187+# ȑ [LATIN SMALL LETTER R WITH DOUBLE GRAVE]
 2188+"\u0211" => "r"
 2189+
 2190+# ȓ [LATIN SMALL LETTER R WITH INVERTED BREVE]
 2191+"\u0213" => "r"
 2192+
 2193+# ɍ [LATIN SMALL LETTER R WITH STROKE]
 2194+"\u024D" => "r"
 2195+
 2196+# ɼ [LATIN SMALL LETTER R WITH LONG LEG]
 2197+"\u027C" => "r"
 2198+
 2199+# ɽ [LATIN SMALL LETTER R WITH TAIL]
 2200+"\u027D" => "r"
 2201+
 2202+# ɾ [LATIN SMALL LETTER R WITH FISHHOOK]
 2203+"\u027E" => "r"
 2204+
 2205+# ɿ [LATIN SMALL LETTER REVERSED R WITH FISHHOOK]
 2206+"\u027F" => "r"
 2207+
 2208+# ᵣ [LATIN SUBSCRIPT SMALL LETTER R]
 2209+"\u1D63" => "r"
 2210+
 2211+# ᵲ [LATIN SMALL LETTER R WITH MIDDLE TILDE]
 2212+"\u1D72" => "r"
 2213+
 2214+# ᵳ [LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE]
 2215+"\u1D73" => "r"
 2216+
 2217+# ᶉ [LATIN SMALL LETTER R WITH PALATAL HOOK]
 2218+"\u1D89" => "r"
 2219+
 2220+# ṙ [LATIN SMALL LETTER R WITH DOT ABOVE]
 2221+"\u1E59" => "r"
 2222+
 2223+# ṛ [LATIN SMALL LETTER R WITH DOT BELOW]
 2224+"\u1E5B" => "r"
 2225+
 2226+# ṝ [LATIN SMALL LETTER R WITH DOT BELOW AND MACRON]
 2227+"\u1E5D" => "r"
 2228+
 2229+# ṟ [LATIN SMALL LETTER R WITH LINE BELOW]
 2230+"\u1E5F" => "r"
 2231+
 2232+# ⓡ [CIRCLED LATIN SMALL LETTER R]
 2233+"\u24E1" => "r"
 2234+
 2235+# ꝛ [LATIN SMALL LETTER R ROTUNDA]
 2236+"\uA75B" => "r"
 2237+
 2238+# ꞃ [LATIN SMALL LETTER INSULAR R]
 2239+"\uA783" => "r"
 2240+
 2241+# r [FULLWIDTH LATIN SMALL LETTER R]
 2242+"\uFF52" => "r"
 2243+
 2244+# ⒭ [PARENTHESIZED LATIN SMALL LETTER R]
 2245+"\u24AD" => "(r)"
 2246+
 2247+# Ś [LATIN CAPITAL LETTER S WITH ACUTE]
 2248+"\u015A" => "S"
 2249+
 2250+# Ŝ [LATIN CAPITAL LETTER S WITH CIRCUMFLEX]
 2251+"\u015C" => "S"
 2252+
 2253+# Ş [LATIN CAPITAL LETTER S WITH CEDILLA]
 2254+"\u015E" => "S"
 2255+
 2256+# Š [LATIN CAPITAL LETTER S WITH CARON]
 2257+"\u0160" => "S"
 2258+
 2259+# Ș [LATIN CAPITAL LETTER S WITH COMMA BELOW]
 2260+"\u0218" => "S"
 2261+
 2262+# Ṡ [LATIN CAPITAL LETTER S WITH DOT ABOVE]
 2263+"\u1E60" => "S"
 2264+
 2265+# Ṣ [LATIN CAPITAL LETTER S WITH DOT BELOW]
 2266+"\u1E62" => "S"
 2267+
 2268+# Ṥ [LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE]
 2269+"\u1E64" => "S"
 2270+
 2271+# Ṧ [LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE]
 2272+"\u1E66" => "S"
 2273+
 2274+# Ṩ [LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE]
 2275+"\u1E68" => "S"
 2276+
 2277+# Ⓢ [CIRCLED LATIN CAPITAL LETTER S]
 2278+"\u24C8" => "S"
 2279+
 2280+# ꜱ [LATIN LETTER SMALL CAPITAL S]
 2281+"\uA731" => "S"
 2282+
 2283+# ꞅ [LATIN SMALL LETTER INSULAR S]
 2284+"\uA785" => "S"
 2285+
 2286+# S [FULLWIDTH LATIN CAPITAL LETTER S]
 2287+"\uFF33" => "S"
 2288+
 2289+# ś [LATIN SMALL LETTER S WITH ACUTE]
 2290+"\u015B" => "s"
 2291+
 2292+# ŝ [LATIN SMALL LETTER S WITH CIRCUMFLEX]
 2293+"\u015D" => "s"
 2294+
 2295+# ş [LATIN SMALL LETTER S WITH CEDILLA]
 2296+"\u015F" => "s"
 2297+
 2298+# š [LATIN SMALL LETTER S WITH CARON]
 2299+"\u0161" => "s"
 2300+
 2301+# ſ http://en.wikipedia.org/wiki/Long_S [LATIN SMALL LETTER LONG S]
 2302+"\u017F" => "s"
 2303+
 2304+# ș [LATIN SMALL LETTER S WITH COMMA BELOW]
 2305+"\u0219" => "s"
 2306+
 2307+# ȿ [LATIN SMALL LETTER S WITH SWASH TAIL]
 2308+"\u023F" => "s"
 2309+
 2310+# ʂ [LATIN SMALL LETTER S WITH HOOK]
 2311+"\u0282" => "s"
 2312+
 2313+# ᵴ [LATIN SMALL LETTER S WITH MIDDLE TILDE]
 2314+"\u1D74" => "s"
 2315+
 2316+# ᶊ [LATIN SMALL LETTER S WITH PALATAL HOOK]
 2317+"\u1D8A" => "s"
 2318+
 2319+# ṡ [LATIN SMALL LETTER S WITH DOT ABOVE]
 2320+"\u1E61" => "s"
 2321+
 2322+# ṣ [LATIN SMALL LETTER S WITH DOT BELOW]
 2323+"\u1E63" => "s"
 2324+
 2325+# ṥ [LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE]
 2326+"\u1E65" => "s"
 2327+
 2328+# ṧ [LATIN SMALL LETTER S WITH CARON AND DOT ABOVE]
 2329+"\u1E67" => "s"
 2330+
 2331+# ṩ [LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE]
 2332+"\u1E69" => "s"
 2333+
 2334+# ẜ [LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE]
 2335+"\u1E9C" => "s"
 2336+
 2337+# ẝ [LATIN SMALL LETTER LONG S WITH HIGH STROKE]
 2338+"\u1E9D" => "s"
 2339+
 2340+# ⓢ [CIRCLED LATIN SMALL LETTER S]
 2341+"\u24E2" => "s"
 2342+
 2343+# Ꞅ [LATIN CAPITAL LETTER INSULAR S]
 2344+"\uA784" => "s"
 2345+
 2346+# s [FULLWIDTH LATIN SMALL LETTER S]
 2347+"\uFF53" => "s"
 2348+
 2349+# ẞ [LATIN CAPITAL LETTER SHARP S]
 2350+"\u1E9E" => "SS"
 2351+
 2352+# ⒮ [PARENTHESIZED LATIN SMALL LETTER S]
 2353+"\u24AE" => "(s)"
 2354+
 2355+# ß [LATIN SMALL LETTER SHARP S]
 2356+"\u00DF" => "ss"
 2357+
 2358+# st [LATIN SMALL LIGATURE ST]
 2359+"\uFB06" => "st"
 2360+
 2361+# Ţ [LATIN CAPITAL LETTER T WITH CEDILLA]
 2362+"\u0162" => "T"
 2363+
 2364+# Ť [LATIN CAPITAL LETTER T WITH CARON]
 2365+"\u0164" => "T"
 2366+
 2367+# Ŧ [LATIN CAPITAL LETTER T WITH STROKE]
 2368+"\u0166" => "T"
 2369+
 2370+# Ƭ [LATIN CAPITAL LETTER T WITH HOOK]
 2371+"\u01AC" => "T"
 2372+
 2373+# Ʈ [LATIN CAPITAL LETTER T WITH RETROFLEX HOOK]
 2374+"\u01AE" => "T"
 2375+
 2376+# Ț [LATIN CAPITAL LETTER T WITH COMMA BELOW]
 2377+"\u021A" => "T"
 2378+
 2379+# Ⱦ [LATIN CAPITAL LETTER T WITH DIAGONAL STROKE]
 2380+"\u023E" => "T"
 2381+
 2382+# ᴛ [LATIN LETTER SMALL CAPITAL T]
 2383+"\u1D1B" => "T"
 2384+
 2385+# Ṫ [LATIN CAPITAL LETTER T WITH DOT ABOVE]
 2386+"\u1E6A" => "T"
 2387+
 2388+# Ṭ [LATIN CAPITAL LETTER T WITH DOT BELOW]
 2389+"\u1E6C" => "T"
 2390+
 2391+# Ṯ [LATIN CAPITAL LETTER T WITH LINE BELOW]
 2392+"\u1E6E" => "T"
 2393+
 2394+# Ṱ [LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW]
 2395+"\u1E70" => "T"
 2396+
 2397+# Ⓣ [CIRCLED LATIN CAPITAL LETTER T]
 2398+"\u24C9" => "T"
 2399+
 2400+# Ꞇ [LATIN CAPITAL LETTER INSULAR T]
 2401+"\uA786" => "T"
 2402+
 2403+# T [FULLWIDTH LATIN CAPITAL LETTER T]
 2404+"\uFF34" => "T"
 2405+
 2406+# ţ [LATIN SMALL LETTER T WITH CEDILLA]
 2407+"\u0163" => "t"
 2408+
 2409+# ť [LATIN SMALL LETTER T WITH CARON]
 2410+"\u0165" => "t"
 2411+
 2412+# ŧ [LATIN SMALL LETTER T WITH STROKE]
 2413+"\u0167" => "t"
 2414+
 2415+# ƫ [LATIN SMALL LETTER T WITH PALATAL HOOK]
 2416+"\u01AB" => "t"
 2417+
 2418+# ƭ [LATIN SMALL LETTER T WITH HOOK]
 2419+"\u01AD" => "t"
 2420+
 2421+# ț [LATIN SMALL LETTER T WITH COMMA BELOW]
 2422+"\u021B" => "t"
 2423+
 2424+# ȶ [LATIN SMALL LETTER T WITH CURL]
 2425+"\u0236" => "t"
 2426+
 2427+# ʇ [LATIN SMALL LETTER TURNED T]
 2428+"\u0287" => "t"
 2429+
 2430+# ʈ [LATIN SMALL LETTER T WITH RETROFLEX HOOK]
 2431+"\u0288" => "t"
 2432+
 2433+# ᵵ [LATIN SMALL LETTER T WITH MIDDLE TILDE]
 2434+"\u1D75" => "t"
 2435+
 2436+# ṫ [LATIN SMALL LETTER T WITH DOT ABOVE]
 2437+"\u1E6B" => "t"
 2438+
 2439+# ṭ [LATIN SMALL LETTER T WITH DOT BELOW]
 2440+"\u1E6D" => "t"
 2441+
 2442+# ṯ [LATIN SMALL LETTER T WITH LINE BELOW]
 2443+"\u1E6F" => "t"
 2444+
 2445+# ṱ [LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW]
 2446+"\u1E71" => "t"
 2447+
 2448+# ẗ [LATIN SMALL LETTER T WITH DIAERESIS]
 2449+"\u1E97" => "t"
 2450+
 2451+# ⓣ [CIRCLED LATIN SMALL LETTER T]
 2452+"\u24E3" => "t"
 2453+
 2454+# ⱦ [LATIN SMALL LETTER T WITH DIAGONAL STROKE]
 2455+"\u2C66" => "t"
 2456+
 2457+# t [FULLWIDTH LATIN SMALL LETTER T]
 2458+"\uFF54" => "t"
 2459+
 2460+# Þ [LATIN CAPITAL LETTER THORN]
 2461+"\u00DE" => "TH"
 2462+
 2463+# Ꝧ [LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER]
 2464+"\uA766" => "TH"
 2465+
 2466+# Ꜩ [LATIN CAPITAL LETTER TZ]
 2467+"\uA728" => "TZ"
 2468+
 2469+# ⒯ [PARENTHESIZED LATIN SMALL LETTER T]
 2470+"\u24AF" => "(t)"
 2471+
 2472+# ʨ [LATIN SMALL LETTER TC DIGRAPH WITH CURL]
 2473+"\u02A8" => "tc"
 2474+
 2475+# þ [LATIN SMALL LETTER THORN]
 2476+"\u00FE" => "th"
 2477+
 2478+# ᵺ [LATIN SMALL LETTER TH WITH STRIKETHROUGH]
 2479+"\u1D7A" => "th"
 2480+
 2481+# ꝧ [LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER]
 2482+"\uA767" => "th"
 2483+
 2484+# ʦ [LATIN SMALL LETTER TS DIGRAPH]
 2485+"\u02A6" => "ts"
 2486+
 2487+# ꜩ [LATIN SMALL LETTER TZ]
 2488+"\uA729" => "tz"
 2489+
 2490+# Ù [LATIN CAPITAL LETTER U WITH GRAVE]
 2491+"\u00D9" => "U"
 2492+
 2493+# Ú [LATIN CAPITAL LETTER U WITH ACUTE]
 2494+"\u00DA" => "U"
 2495+
 2496+# Û [LATIN CAPITAL LETTER U WITH CIRCUMFLEX]
 2497+"\u00DB" => "U"
 2498+
 2499+# Ü [LATIN CAPITAL LETTER U WITH DIAERESIS]
 2500+"\u00DC" => "U"
 2501+
 2502+# Ũ [LATIN CAPITAL LETTER U WITH TILDE]
 2503+"\u0168" => "U"
 2504+
 2505+# Ū [LATIN CAPITAL LETTER U WITH MACRON]
 2506+"\u016A" => "U"
 2507+
 2508+# Ŭ [LATIN CAPITAL LETTER U WITH BREVE]
 2509+"\u016C" => "U"
 2510+
 2511+# Ů [LATIN CAPITAL LETTER U WITH RING ABOVE]
 2512+"\u016E" => "U"
 2513+
 2514+# Ű [LATIN CAPITAL LETTER U WITH DOUBLE ACUTE]
 2515+"\u0170" => "U"
 2516+
 2517+# Ų [LATIN CAPITAL LETTER U WITH OGONEK]
 2518+"\u0172" => "U"
 2519+
 2520+# Ư [LATIN CAPITAL LETTER U WITH HORN]
 2521+"\u01AF" => "U"
 2522+
 2523+# Ǔ [LATIN CAPITAL LETTER U WITH CARON]
 2524+"\u01D3" => "U"
 2525+
 2526+# Ǖ [LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON]
 2527+"\u01D5" => "U"
 2528+
 2529+# Ǘ [LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE]
 2530+"\u01D7" => "U"
 2531+
 2532+# Ǚ [LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON]
 2533+"\u01D9" => "U"
 2534+
 2535+# Ǜ [LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE]
 2536+"\u01DB" => "U"
 2537+
 2538+# Ȕ [LATIN CAPITAL LETTER U WITH DOUBLE GRAVE]
 2539+"\u0214" => "U"
 2540+
 2541+# Ȗ [LATIN CAPITAL LETTER U WITH INVERTED BREVE]
 2542+"\u0216" => "U"
 2543+
 2544+# Ʉ [LATIN CAPITAL LETTER U BAR]
 2545+"\u0244" => "U"
 2546+
 2547+# ᴜ [LATIN LETTER SMALL CAPITAL U]
 2548+"\u1D1C" => "U"
 2549+
 2550+# ᵾ [LATIN SMALL CAPITAL LETTER U WITH STROKE]
 2551+"\u1D7E" => "U"
 2552+
 2553+# Ṳ [LATIN CAPITAL LETTER U WITH DIAERESIS BELOW]
 2554+"\u1E72" => "U"
 2555+
 2556+# Ṵ [LATIN CAPITAL LETTER U WITH TILDE BELOW]
 2557+"\u1E74" => "U"
 2558+
 2559+# Ṷ [LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW]
 2560+"\u1E76" => "U"
 2561+
 2562+# Ṹ [LATIN CAPITAL LETTER U WITH TILDE AND ACUTE]
 2563+"\u1E78" => "U"
 2564+
 2565+# Ṻ [LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS]
 2566+"\u1E7A" => "U"
 2567+
 2568+# Ụ [LATIN CAPITAL LETTER U WITH DOT BELOW]
 2569+"\u1EE4" => "U"
 2570+
 2571+# Ủ [LATIN CAPITAL LETTER U WITH HOOK ABOVE]
 2572+"\u1EE6" => "U"
 2573+
 2574+# Ứ [LATIN CAPITAL LETTER U WITH HORN AND ACUTE]
 2575+"\u1EE8" => "U"
 2576+
 2577+# Ừ [LATIN CAPITAL LETTER U WITH HORN AND GRAVE]
 2578+"\u1EEA" => "U"
 2579+
 2580+# Ử [LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE]
 2581+"\u1EEC" => "U"
 2582+
 2583+# Ữ [LATIN CAPITAL LETTER U WITH HORN AND TILDE]
 2584+"\u1EEE" => "U"
 2585+
 2586+# Ự [LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW]
 2587+"\u1EF0" => "U"
 2588+
 2589+# Ⓤ [CIRCLED LATIN CAPITAL LETTER U]
 2590+"\u24CA" => "U"
 2591+
 2592+# U [FULLWIDTH LATIN CAPITAL LETTER U]
 2593+"\uFF35" => "U"
 2594+
 2595+# ù [LATIN SMALL LETTER U WITH GRAVE]
 2596+"\u00F9" => "u"
 2597+
 2598+# ú [LATIN SMALL LETTER U WITH ACUTE]
 2599+"\u00FA" => "u"
 2600+
 2601+# û [LATIN SMALL LETTER U WITH CIRCUMFLEX]
 2602+"\u00FB" => "u"
 2603+
 2604+# ü [LATIN SMALL LETTER U WITH DIAERESIS]
 2605+"\u00FC" => "u"
 2606+
 2607+# ũ [LATIN SMALL LETTER U WITH TILDE]
 2608+"\u0169" => "u"
 2609+
 2610+# ū [LATIN SMALL LETTER U WITH MACRON]
 2611+"\u016B" => "u"
 2612+
 2613+# ŭ [LATIN SMALL LETTER U WITH BREVE]
 2614+"\u016D" => "u"
 2615+
 2616+# ů [LATIN SMALL LETTER U WITH RING ABOVE]
 2617+"\u016F" => "u"
 2618+
 2619+# ű [LATIN SMALL LETTER U WITH DOUBLE ACUTE]
 2620+"\u0171" => "u"
 2621+
 2622+# ų [LATIN SMALL LETTER U WITH OGONEK]
 2623+"\u0173" => "u"
 2624+
 2625+# ư [LATIN SMALL LETTER U WITH HORN]
 2626+"\u01B0" => "u"
 2627+
 2628+# ǔ [LATIN SMALL LETTER U WITH CARON]
 2629+"\u01D4" => "u"
 2630+
 2631+# ǖ [LATIN SMALL LETTER U WITH DIAERESIS AND MACRON]
 2632+"\u01D6" => "u"
 2633+
 2634+# ǘ [LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE]
 2635+"\u01D8" => "u"
 2636+
 2637+# ǚ [LATIN SMALL LETTER U WITH DIAERESIS AND CARON]
 2638+"\u01DA" => "u"
 2639+
 2640+# ǜ [LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE]
 2641+"\u01DC" => "u"
 2642+
 2643+# ȕ [LATIN SMALL LETTER U WITH DOUBLE GRAVE]
 2644+"\u0215" => "u"
 2645+
 2646+# ȗ [LATIN SMALL LETTER U WITH INVERTED BREVE]
 2647+"\u0217" => "u"
 2648+
 2649+# ʉ [LATIN SMALL LETTER U BAR]
 2650+"\u0289" => "u"
 2651+
 2652+# ᵤ [LATIN SUBSCRIPT SMALL LETTER U]
 2653+"\u1D64" => "u"
 2654+
 2655+# ᶙ [LATIN SMALL LETTER U WITH RETROFLEX HOOK]
 2656+"\u1D99" => "u"
 2657+
 2658+# ṳ [LATIN SMALL LETTER U WITH DIAERESIS BELOW]
 2659+"\u1E73" => "u"
 2660+
 2661+# ṵ [LATIN SMALL LETTER U WITH TILDE BELOW]
 2662+"\u1E75" => "u"
 2663+
 2664+# ṷ [LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW]
 2665+"\u1E77" => "u"
 2666+
 2667+# ṹ [LATIN SMALL LETTER U WITH TILDE AND ACUTE]
 2668+"\u1E79" => "u"
 2669+
 2670+# ṻ [LATIN SMALL LETTER U WITH MACRON AND DIAERESIS]
 2671+"\u1E7B" => "u"
 2672+
 2673+# ụ [LATIN SMALL LETTER U WITH DOT BELOW]
 2674+"\u1EE5" => "u"
 2675+
 2676+# ủ [LATIN SMALL LETTER U WITH HOOK ABOVE]
 2677+"\u1EE7" => "u"
 2678+
 2679+# ứ [LATIN SMALL LETTER U WITH HORN AND ACUTE]
 2680+"\u1EE9" => "u"
 2681+
 2682+# ừ [LATIN SMALL LETTER U WITH HORN AND GRAVE]
 2683+"\u1EEB" => "u"
 2684+
 2685+# ử [LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE]
 2686+"\u1EED" => "u"
 2687+
 2688+# ữ [LATIN SMALL LETTER U WITH HORN AND TILDE]
 2689+"\u1EEF" => "u"
 2690+
 2691+# ự [LATIN SMALL LETTER U WITH HORN AND DOT BELOW]
 2692+"\u1EF1" => "u"
 2693+
 2694+# ⓤ [CIRCLED LATIN SMALL LETTER U]
 2695+"\u24E4" => "u"
 2696+
 2697+# u [FULLWIDTH LATIN SMALL LETTER U]
 2698+"\uFF55" => "u"
 2699+
 2700+# ⒰ [PARENTHESIZED LATIN SMALL LETTER U]
 2701+"\u24B0" => "(u)"
 2702+
 2703+# ᵫ [LATIN SMALL LETTER UE]
 2704+"\u1D6B" => "ue"
 2705+
 2706+# Ʋ [LATIN CAPITAL LETTER V WITH HOOK]
 2707+"\u01B2" => "V"
 2708+
 2709+# Ʌ [LATIN CAPITAL LETTER TURNED V]
 2710+"\u0245" => "V"
 2711+
 2712+# ᴠ [LATIN LETTER SMALL CAPITAL V]
 2713+"\u1D20" => "V"
 2714+
 2715+# Ṽ [LATIN CAPITAL LETTER V WITH TILDE]
 2716+"\u1E7C" => "V"
 2717+
 2718+# Ṿ [LATIN CAPITAL LETTER V WITH DOT BELOW]
 2719+"\u1E7E" => "V"
 2720+
 2721+# Ỽ [LATIN CAPITAL LETTER MIDDLE-WELSH V]
 2722+"\u1EFC" => "V"
 2723+
 2724+# Ⓥ [CIRCLED LATIN CAPITAL LETTER V]
 2725+"\u24CB" => "V"
 2726+
 2727+# Ꝟ [LATIN CAPITAL LETTER V WITH DIAGONAL STROKE]
 2728+"\uA75E" => "V"
 2729+
 2730+# Ꝩ [LATIN CAPITAL LETTER VEND]
 2731+"\uA768" => "V"
 2732+
 2733+# V [FULLWIDTH LATIN CAPITAL LETTER V]
 2734+"\uFF36" => "V"
 2735+
 2736+# ʋ [LATIN SMALL LETTER V WITH HOOK]
 2737+"\u028B" => "v"
 2738+
 2739+# ʌ [LATIN SMALL LETTER TURNED V]
 2740+"\u028C" => "v"
 2741+
 2742+# ᵥ [LATIN SUBSCRIPT SMALL LETTER V]
 2743+"\u1D65" => "v"
 2744+
 2745+# ᶌ [LATIN SMALL LETTER V WITH PALATAL HOOK]
 2746+"\u1D8C" => "v"
 2747+
 2748+# ṽ [LATIN SMALL LETTER V WITH TILDE]
 2749+"\u1E7D" => "v"
 2750+
 2751+# ṿ [LATIN SMALL LETTER V WITH DOT BELOW]
 2752+"\u1E7F" => "v"
 2753+
 2754+# ⓥ [CIRCLED LATIN SMALL LETTER V]
 2755+"\u24E5" => "v"
 2756+
 2757+# ⱱ [LATIN SMALL LETTER V WITH RIGHT HOOK]
 2758+"\u2C71" => "v"
 2759+
 2760+# ⱴ [LATIN SMALL LETTER V WITH CURL]
 2761+"\u2C74" => "v"
 2762+
 2763+# ꝟ [LATIN SMALL LETTER V WITH DIAGONAL STROKE]
 2764+"\uA75F" => "v"
 2765+
 2766+# v [FULLWIDTH LATIN SMALL LETTER V]
 2767+"\uFF56" => "v"
 2768+
 2769+# Ꝡ [LATIN CAPITAL LETTER VY]
 2770+"\uA760" => "VY"
 2771+
 2772+# ⒱ [PARENTHESIZED LATIN SMALL LETTER V]
 2773+"\u24B1" => "(v)"
 2774+
 2775+# ꝡ [LATIN SMALL LETTER VY]
 2776+"\uA761" => "vy"
 2777+
 2778+# Ŵ [LATIN CAPITAL LETTER W WITH CIRCUMFLEX]
 2779+"\u0174" => "W"
 2780+
 2781+# Ƿ http://en.wikipedia.org/wiki/Wynn [LATIN CAPITAL LETTER WYNN]
 2782+"\u01F7" => "W"
 2783+
 2784+# ᴡ [LATIN LETTER SMALL CAPITAL W]
 2785+"\u1D21" => "W"
 2786+
 2787+# Ẁ [LATIN CAPITAL LETTER W WITH GRAVE]
 2788+"\u1E80" => "W"
 2789+
 2790+# Ẃ [LATIN CAPITAL LETTER W WITH ACUTE]
 2791+"\u1E82" => "W"
 2792+
 2793+# Ẅ [LATIN CAPITAL LETTER W WITH DIAERESIS]
 2794+"\u1E84" => "W"
 2795+
 2796+# Ẇ [LATIN CAPITAL LETTER W WITH DOT ABOVE]
 2797+"\u1E86" => "W"
 2798+
 2799+# Ẉ [LATIN CAPITAL LETTER W WITH DOT BELOW]
 2800+"\u1E88" => "W"
 2801+
 2802+# Ⓦ [CIRCLED LATIN CAPITAL LETTER W]
 2803+"\u24CC" => "W"
 2804+
 2805+# Ⱳ [LATIN CAPITAL LETTER W WITH HOOK]
 2806+"\u2C72" => "W"
 2807+
 2808+# W [FULLWIDTH LATIN CAPITAL LETTER W]
 2809+"\uFF37" => "W"
 2810+
 2811+# ŵ [LATIN SMALL LETTER W WITH CIRCUMFLEX]
 2812+"\u0175" => "w"
 2813+
 2814+# ƿ http://en.wikipedia.org/wiki/Wynn [LATIN LETTER WYNN]
 2815+"\u01BF" => "w"
 2816+
 2817+# ʍ [LATIN SMALL LETTER TURNED W]
 2818+"\u028D" => "w"
 2819+
 2820+# ẁ [LATIN SMALL LETTER W WITH GRAVE]
 2821+"\u1E81" => "w"
 2822+
 2823+# ẃ [LATIN SMALL LETTER W WITH ACUTE]
 2824+"\u1E83" => "w"
 2825+
 2826+# ẅ [LATIN SMALL LETTER W WITH DIAERESIS]
 2827+"\u1E85" => "w"
 2828+
 2829+# ẇ [LATIN SMALL LETTER W WITH DOT ABOVE]
 2830+"\u1E87" => "w"
 2831+
 2832+# ẉ [LATIN SMALL LETTER W WITH DOT BELOW]
 2833+"\u1E89" => "w"
 2834+
 2835+# ẘ [LATIN SMALL LETTER W WITH RING ABOVE]
 2836+"\u1E98" => "w"
 2837+
 2838+# ⓦ [CIRCLED LATIN SMALL LETTER W]
 2839+"\u24E6" => "w"
 2840+
 2841+# ⱳ [LATIN SMALL LETTER W WITH HOOK]
 2842+"\u2C73" => "w"
 2843+
 2844+# w [FULLWIDTH LATIN SMALL LETTER W]
 2845+"\uFF57" => "w"
 2846+
 2847+# ⒲ [PARENTHESIZED LATIN SMALL LETTER W]
 2848+"\u24B2" => "(w)"
 2849+
 2850+# Ẋ [LATIN CAPITAL LETTER X WITH DOT ABOVE]
 2851+"\u1E8A" => "X"
 2852+
 2853+# Ẍ [LATIN CAPITAL LETTER X WITH DIAERESIS]
 2854+"\u1E8C" => "X"
 2855+
 2856+# Ⓧ [CIRCLED LATIN CAPITAL LETTER X]
 2857+"\u24CD" => "X"
 2858+
 2859+# X [FULLWIDTH LATIN CAPITAL LETTER X]
 2860+"\uFF38" => "X"
 2861+
 2862+# ᶍ [LATIN SMALL LETTER X WITH PALATAL HOOK]
 2863+"\u1D8D" => "x"
 2864+
 2865+# ẋ [LATIN SMALL LETTER X WITH DOT ABOVE]
 2866+"\u1E8B" => "x"
 2867+
 2868+# ẍ [LATIN SMALL LETTER X WITH DIAERESIS]
 2869+"\u1E8D" => "x"
 2870+
 2871+# ₓ [LATIN SUBSCRIPT SMALL LETTER X]
 2872+"\u2093" => "x"
 2873+
 2874+# ⓧ [CIRCLED LATIN SMALL LETTER X]
 2875+"\u24E7" => "x"
 2876+
 2877+# x [FULLWIDTH LATIN SMALL LETTER X]
 2878+"\uFF58" => "x"
 2879+
 2880+# ⒳ [PARENTHESIZED LATIN SMALL LETTER X]
 2881+"\u24B3" => "(x)"
 2882+
 2883+# Ý [LATIN CAPITAL LETTER Y WITH ACUTE]
 2884+"\u00DD" => "Y"
 2885+
 2886+# Ŷ [LATIN CAPITAL LETTER Y WITH CIRCUMFLEX]
 2887+"\u0176" => "Y"
 2888+
 2889+# Ÿ [LATIN CAPITAL LETTER Y WITH DIAERESIS]
 2890+"\u0178" => "Y"
 2891+
 2892+# Ƴ [LATIN CAPITAL LETTER Y WITH HOOK]
 2893+"\u01B3" => "Y"
 2894+
 2895+# Ȳ [LATIN CAPITAL LETTER Y WITH MACRON]
 2896+"\u0232" => "Y"
 2897+
 2898+# Ɏ [LATIN CAPITAL LETTER Y WITH STROKE]
 2899+"\u024E" => "Y"
 2900+
 2901+# ʏ [LATIN LETTER SMALL CAPITAL Y]
 2902+"\u028F" => "Y"
 2903+
 2904+# Ẏ [LATIN CAPITAL LETTER Y WITH DOT ABOVE]
 2905+"\u1E8E" => "Y"
 2906+
 2907+# Ỳ [LATIN CAPITAL LETTER Y WITH GRAVE]
 2908+"\u1EF2" => "Y"
 2909+
 2910+# Ỵ [LATIN CAPITAL LETTER Y WITH DOT BELOW]
 2911+"\u1EF4" => "Y"
 2912+
 2913+# Ỷ [LATIN CAPITAL LETTER Y WITH HOOK ABOVE]
 2914+"\u1EF6" => "Y"
 2915+
 2916+# Ỹ [LATIN CAPITAL LETTER Y WITH TILDE]
 2917+"\u1EF8" => "Y"
 2918+
 2919+# Ỿ [LATIN CAPITAL LETTER Y WITH LOOP]
 2920+"\u1EFE" => "Y"
 2921+
 2922+# Ⓨ [CIRCLED LATIN CAPITAL LETTER Y]
 2923+"\u24CE" => "Y"
 2924+
 2925+# Y [FULLWIDTH LATIN CAPITAL LETTER Y]
 2926+"\uFF39" => "Y"
 2927+
 2928+# ý [LATIN SMALL LETTER Y WITH ACUTE]
 2929+"\u00FD" => "y"
 2930+
 2931+# ÿ [LATIN SMALL LETTER Y WITH DIAERESIS]
 2932+"\u00FF" => "y"
 2933+
 2934+# ŷ [LATIN SMALL LETTER Y WITH CIRCUMFLEX]
 2935+"\u0177" => "y"
 2936+
 2937+# ƴ [LATIN SMALL LETTER Y WITH HOOK]
 2938+"\u01B4" => "y"
 2939+
 2940+# ȳ [LATIN SMALL LETTER Y WITH MACRON]
 2941+"\u0233" => "y"
 2942+
 2943+# ɏ [LATIN SMALL LETTER Y WITH STROKE]
 2944+"\u024F" => "y"
 2945+
 2946+# ʎ [LATIN SMALL LETTER TURNED Y]
 2947+"\u028E" => "y"
 2948+
 2949+# ẏ [LATIN SMALL LETTER Y WITH DOT ABOVE]
 2950+"\u1E8F" => "y"
 2951+
 2952+# ẙ [LATIN SMALL LETTER Y WITH RING ABOVE]
 2953+"\u1E99" => "y"
 2954+
 2955+# ỳ [LATIN SMALL LETTER Y WITH GRAVE]
 2956+"\u1EF3" => "y"
 2957+
 2958+# ỵ [LATIN SMALL LETTER Y WITH DOT BELOW]
 2959+"\u1EF5" => "y"
 2960+
 2961+# ỷ [LATIN SMALL LETTER Y WITH HOOK ABOVE]
 2962+"\u1EF7" => "y"
 2963+
 2964+# ỹ [LATIN SMALL LETTER Y WITH TILDE]
 2965+"\u1EF9" => "y"
 2966+
 2967+# ỿ [LATIN SMALL LETTER Y WITH LOOP]
 2968+"\u1EFF" => "y"
 2969+
 2970+# ⓨ [CIRCLED LATIN SMALL LETTER Y]
 2971+"\u24E8" => "y"
 2972+
 2973+# y [FULLWIDTH LATIN SMALL LETTER Y]
 2974+"\uFF59" => "y"
 2975+
 2976+# ⒴ [PARENTHESIZED LATIN SMALL LETTER Y]
 2977+"\u24B4" => "(y)"
 2978+
 2979+# Ź [LATIN CAPITAL LETTER Z WITH ACUTE]
 2980+"\u0179" => "Z"
 2981+
 2982+# Ż [LATIN CAPITAL LETTER Z WITH DOT ABOVE]
 2983+"\u017B" => "Z"
 2984+
 2985+# Ž [LATIN CAPITAL LETTER Z WITH CARON]
 2986+"\u017D" => "Z"
 2987+
 2988+# Ƶ [LATIN CAPITAL LETTER Z WITH STROKE]
 2989+"\u01B5" => "Z"
 2990+
 2991+# Ȝ http://en.wikipedia.org/wiki/Yogh [LATIN CAPITAL LETTER YOGH]
 2992+"\u021C" => "Z"
 2993+
 2994+# Ȥ [LATIN CAPITAL LETTER Z WITH HOOK]
 2995+"\u0224" => "Z"
 2996+
 2997+# ᴢ [LATIN LETTER SMALL CAPITAL Z]
 2998+"\u1D22" => "Z"
 2999+
 3000+# Ẑ [LATIN CAPITAL LETTER Z WITH CIRCUMFLEX]
 3001+"\u1E90" => "Z"
 3002+
 3003+# Ẓ [LATIN CAPITAL LETTER Z WITH DOT BELOW]
 3004+"\u1E92" => "Z"
 3005+
 3006+# Ẕ [LATIN CAPITAL LETTER Z WITH LINE BELOW]
 3007+"\u1E94" => "Z"
 3008+
 3009+# Ⓩ [CIRCLED LATIN CAPITAL LETTER Z]
 3010+"\u24CF" => "Z"
 3011+
 3012+# Ⱬ [LATIN CAPITAL LETTER Z WITH DESCENDER]
 3013+"\u2C6B" => "Z"
 3014+
 3015+# Ꝣ [LATIN CAPITAL LETTER VISIGOTHIC Z]
 3016+"\uA762" => "Z"
 3017+
 3018+# Z [FULLWIDTH LATIN CAPITAL LETTER Z]
 3019+"\uFF3A" => "Z"
 3020+
 3021+# ź [LATIN SMALL LETTER Z WITH ACUTE]
 3022+"\u017A" => "z"
 3023+
 3024+# ż [LATIN SMALL LETTER Z WITH DOT ABOVE]
 3025+"\u017C" => "z"
 3026+
 3027+# ž [LATIN SMALL LETTER Z WITH CARON]
 3028+"\u017E" => "z"
 3029+
 3030+# ƶ [LATIN SMALL LETTER Z WITH STROKE]
 3031+"\u01B6" => "z"
 3032+
 3033+# ȝ http://en.wikipedia.org/wiki/Yogh [LATIN SMALL LETTER YOGH]
 3034+"\u021D" => "z"
 3035+
 3036+# ȥ [LATIN SMALL LETTER Z WITH HOOK]
 3037+"\u0225" => "z"
 3038+
 3039+# ɀ [LATIN SMALL LETTER Z WITH SWASH TAIL]
 3040+"\u0240" => "z"
 3041+
 3042+# ʐ [LATIN SMALL LETTER Z WITH RETROFLEX HOOK]
 3043+"\u0290" => "z"
 3044+
 3045+# ʑ [LATIN SMALL LETTER Z WITH CURL]
 3046+"\u0291" => "z"
 3047+
 3048+# ᵶ [LATIN SMALL LETTER Z WITH MIDDLE TILDE]
 3049+"\u1D76" => "z"
 3050+
 3051+# ᶎ [LATIN SMALL LETTER Z WITH PALATAL HOOK]
 3052+"\u1D8E" => "z"
 3053+
 3054+# ẑ [LATIN SMALL LETTER Z WITH CIRCUMFLEX]
 3055+"\u1E91" => "z"
 3056+
 3057+# ẓ [LATIN SMALL LETTER Z WITH DOT BELOW]
 3058+"\u1E93" => "z"
 3059+
 3060+# ẕ [LATIN SMALL LETTER Z WITH LINE BELOW]
 3061+"\u1E95" => "z"
 3062+
 3063+# ⓩ [CIRCLED LATIN SMALL LETTER Z]
 3064+"\u24E9" => "z"
 3065+
 3066+# ⱬ [LATIN SMALL LETTER Z WITH DESCENDER]
 3067+"\u2C6C" => "z"
 3068+
 3069+# ꝣ [LATIN SMALL LETTER VISIGOTHIC Z]
 3070+"\uA763" => "z"
 3071+
 3072+# z [FULLWIDTH LATIN SMALL LETTER Z]
 3073+"\uFF5A" => "z"
 3074+
 3075+# ⒵ [PARENTHESIZED LATIN SMALL LETTER Z]
 3076+"\u24B5" => "(z)"
 3077+
 3078+# ⁰ [SUPERSCRIPT ZERO]
 3079+"\u2070" => "0"
 3080+
 3081+# ₀ [SUBSCRIPT ZERO]
 3082+"\u2080" => "0"
 3083+
 3084+# ⓪ [CIRCLED DIGIT ZERO]
 3085+"\u24EA" => "0"
 3086+
 3087+# ⓿ [NEGATIVE CIRCLED DIGIT ZERO]
 3088+"\u24FF" => "0"
 3089+
 3090+# 0 [FULLWIDTH DIGIT ZERO]
 3091+"\uFF10" => "0"
 3092+
 3093+# ¹ [SUPERSCRIPT ONE]
 3094+"\u00B9" => "1"
 3095+
 3096+# ₁ [SUBSCRIPT ONE]
 3097+"\u2081" => "1"
 3098+
 3099+# ① [CIRCLED DIGIT ONE]
 3100+"\u2460" => "1"
 3101+
 3102+# ⓵ [DOUBLE CIRCLED DIGIT ONE]
 3103+"\u24F5" => "1"
 3104+
 3105+# ❶ [DINGBAT NEGATIVE CIRCLED DIGIT ONE]
 3106+"\u2776" => "1"
 3107+
 3108+# ➀ [DINGBAT CIRCLED SANS-SERIF DIGIT ONE]
 3109+"\u2780" => "1"
 3110+
 3111+# ➊ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE]
 3112+"\u278A" => "1"
 3113+
 3114+# 1 [FULLWIDTH DIGIT ONE]
 3115+"\uFF11" => "1"
 3116+
 3117+# ⒈ [DIGIT ONE FULL STOP]
 3118+"\u2488" => "1."
 3119+
 3120+# ⑴ [PARENTHESIZED DIGIT ONE]
 3121+"\u2474" => "(1)"
 3122+
 3123+# ² [SUPERSCRIPT TWO]
 3124+"\u00B2" => "2"
 3125+
 3126+# ₂ [SUBSCRIPT TWO]
 3127+"\u2082" => "2"
 3128+
 3129+# ② [CIRCLED DIGIT TWO]
 3130+"\u2461" => "2"
 3131+
 3132+# ⓶ [DOUBLE CIRCLED DIGIT TWO]
 3133+"\u24F6" => "2"
 3134+
 3135+# ❷ [DINGBAT NEGATIVE CIRCLED DIGIT TWO]
 3136+"\u2777" => "2"
 3137+
 3138+# ➁ [DINGBAT CIRCLED SANS-SERIF DIGIT TWO]
 3139+"\u2781" => "2"
 3140+
 3141+# ➋ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO]
 3142+"\u278B" => "2"
 3143+
 3144+# 2 [FULLWIDTH DIGIT TWO]
 3145+"\uFF12" => "2"
 3146+
 3147+# ⒉ [DIGIT TWO FULL STOP]
 3148+"\u2489" => "2."
 3149+
 3150+# ⑵ [PARENTHESIZED DIGIT TWO]
 3151+"\u2475" => "(2)"
 3152+
 3153+# ³ [SUPERSCRIPT THREE]
 3154+"\u00B3" => "3"
 3155+
 3156+# ₃ [SUBSCRIPT THREE]
 3157+"\u2083" => "3"
 3158+
 3159+# ③ [CIRCLED DIGIT THREE]
 3160+"\u2462" => "3"
 3161+
 3162+# ⓷ [DOUBLE CIRCLED DIGIT THREE]
 3163+"\u24F7" => "3"
 3164+
 3165+# ❸ [DINGBAT NEGATIVE CIRCLED DIGIT THREE]
 3166+"\u2778" => "3"
 3167+
 3168+# ➂ [DINGBAT CIRCLED SANS-SERIF DIGIT THREE]
 3169+"\u2782" => "3"
 3170+
 3171+# ➌ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE]
 3172+"\u278C" => "3"
 3173+
 3174+# 3 [FULLWIDTH DIGIT THREE]
 3175+"\uFF13" => "3"
 3176+
 3177+# ⒊ [DIGIT THREE FULL STOP]
 3178+"\u248A" => "3."
 3179+
 3180+# ⑶ [PARENTHESIZED DIGIT THREE]
 3181+"\u2476" => "(3)"
 3182+
 3183+# ⁴ [SUPERSCRIPT FOUR]
 3184+"\u2074" => "4"
 3185+
 3186+# ₄ [SUBSCRIPT FOUR]
 3187+"\u2084" => "4"
 3188+
 3189+# ④ [CIRCLED DIGIT FOUR]
 3190+"\u2463" => "4"
 3191+
 3192+# ⓸ [DOUBLE CIRCLED DIGIT FOUR]
 3193+"\u24F8" => "4"
 3194+
 3195+# ❹ [DINGBAT NEGATIVE CIRCLED DIGIT FOUR]
 3196+"\u2779" => "4"
 3197+
 3198+# ➃ [DINGBAT CIRCLED SANS-SERIF DIGIT FOUR]
 3199+"\u2783" => "4"
 3200+
 3201+# ➍ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR]
 3202+"\u278D" => "4"
 3203+
 3204+# 4 [FULLWIDTH DIGIT FOUR]
 3205+"\uFF14" => "4"
 3206+
 3207+# ⒋ [DIGIT FOUR FULL STOP]
 3208+"\u248B" => "4."
 3209+
 3210+# ⑷ [PARENTHESIZED DIGIT FOUR]
 3211+"\u2477" => "(4)"
 3212+
 3213+# ⁵ [SUPERSCRIPT FIVE]
 3214+"\u2075" => "5"
 3215+
 3216+# ₅ [SUBSCRIPT FIVE]
 3217+"\u2085" => "5"
 3218+
 3219+# ⑤ [CIRCLED DIGIT FIVE]
 3220+"\u2464" => "5"
 3221+
 3222+# ⓹ [DOUBLE CIRCLED DIGIT FIVE]
 3223+"\u24F9" => "5"
 3224+
 3225+# ❺ [DINGBAT NEGATIVE CIRCLED DIGIT FIVE]
 3226+"\u277A" => "5"
 3227+
 3228+# ➄ [DINGBAT CIRCLED SANS-SERIF DIGIT FIVE]
 3229+"\u2784" => "5"
 3230+
 3231+# ➎ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE]
 3232+"\u278E" => "5"
 3233+
 3234+# 5 [FULLWIDTH DIGIT FIVE]
 3235+"\uFF15" => "5"
 3236+
 3237+# ⒌ [DIGIT FIVE FULL STOP]
 3238+"\u248C" => "5."
 3239+
 3240+# ⑸ [PARENTHESIZED DIGIT FIVE]
 3241+"\u2478" => "(5)"
 3242+
 3243+# ⁶ [SUPERSCRIPT SIX]
 3244+"\u2076" => "6"
 3245+
 3246+# ₆ [SUBSCRIPT SIX]
 3247+"\u2086" => "6"
 3248+
 3249+# ⑥ [CIRCLED DIGIT SIX]
 3250+"\u2465" => "6"
 3251+
 3252+# ⓺ [DOUBLE CIRCLED DIGIT SIX]
 3253+"\u24FA" => "6"
 3254+
 3255+# ❻ [DINGBAT NEGATIVE CIRCLED DIGIT SIX]
 3256+"\u277B" => "6"
 3257+
 3258+# ➅ [DINGBAT CIRCLED SANS-SERIF DIGIT SIX]
 3259+"\u2785" => "6"
 3260+
 3261+# ➏ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX]
 3262+"\u278F" => "6"
 3263+
 3264+# 6 [FULLWIDTH DIGIT SIX]
 3265+"\uFF16" => "6"
 3266+
 3267+# ⒍ [DIGIT SIX FULL STOP]
 3268+"\u248D" => "6."
 3269+
 3270+# ⑹ [PARENTHESIZED DIGIT SIX]
 3271+"\u2479" => "(6)"
 3272+
 3273+# ⁷ [SUPERSCRIPT SEVEN]
 3274+"\u2077" => "7"
 3275+
 3276+# ₇ [SUBSCRIPT SEVEN]
 3277+"\u2087" => "7"
 3278+
 3279+# ⑦ [CIRCLED DIGIT SEVEN]
 3280+"\u2466" => "7"
 3281+
 3282+# ⓻ [DOUBLE CIRCLED DIGIT SEVEN]
 3283+"\u24FB" => "7"
 3284+
 3285+# ❼ [DINGBAT NEGATIVE CIRCLED DIGIT SEVEN]
 3286+"\u277C" => "7"
 3287+
 3288+# ➆ [DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN]
 3289+"\u2786" => "7"
 3290+
 3291+# ➐ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN]
 3292+"\u2790" => "7"
 3293+
 3294+# 7 [FULLWIDTH DIGIT SEVEN]
 3295+"\uFF17" => "7"
 3296+
 3297+# ⒎ [DIGIT SEVEN FULL STOP]
 3298+"\u248E" => "7."
 3299+
 3300+# ⑺ [PARENTHESIZED DIGIT SEVEN]
 3301+"\u247A" => "(7)"
 3302+
 3303+# ⁸ [SUPERSCRIPT EIGHT]
 3304+"\u2078" => "8"
 3305+
 3306+# ₈ [SUBSCRIPT EIGHT]
 3307+"\u2088" => "8"
 3308+
 3309+# ⑧ [CIRCLED DIGIT EIGHT]
 3310+"\u2467" => "8"
 3311+
 3312+# ⓼ [DOUBLE CIRCLED DIGIT EIGHT]
 3313+"\u24FC" => "8"
 3314+
 3315+# ❽ [DINGBAT NEGATIVE CIRCLED DIGIT EIGHT]
 3316+"\u277D" => "8"
 3317+
 3318+# ➇ [DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT]
 3319+"\u2787" => "8"
 3320+
 3321+# ➑ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT]
 3322+"\u2791" => "8"
 3323+
 3324+# 8 [FULLWIDTH DIGIT EIGHT]
 3325+"\uFF18" => "8"
 3326+
 3327+# ⒏ [DIGIT EIGHT FULL STOP]
 3328+"\u248F" => "8."
 3329+
 3330+# ⑻ [PARENTHESIZED DIGIT EIGHT]
 3331+"\u247B" => "(8)"
 3332+
 3333+# ⁹ [SUPERSCRIPT NINE]
 3334+"\u2079" => "9"
 3335+
 3336+# ₉ [SUBSCRIPT NINE]
 3337+"\u2089" => "9"
 3338+
 3339+# ⑨ [CIRCLED DIGIT NINE]
 3340+"\u2468" => "9"
 3341+
 3342+# ⓽ [DOUBLE CIRCLED DIGIT NINE]
 3343+"\u24FD" => "9"
 3344+
 3345+# ❾ [DINGBAT NEGATIVE CIRCLED DIGIT NINE]
 3346+"\u277E" => "9"
 3347+
 3348+# ➈ [DINGBAT CIRCLED SANS-SERIF DIGIT NINE]
 3349+"\u2788" => "9"
 3350+
 3351+# ➒ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE]
 3352+"\u2792" => "9"
 3353+
 3354+# 9 [FULLWIDTH DIGIT NINE]
 3355+"\uFF19" => "9"
 3356+
 3357+# ⒐ [DIGIT NINE FULL STOP]
 3358+"\u2490" => "9."
 3359+
 3360+# ⑼ [PARENTHESIZED DIGIT NINE]
 3361+"\u247C" => "(9)"
 3362+
 3363+# ⑩ [CIRCLED NUMBER TEN]
 3364+"\u2469" => "10"
 3365+
 3366+# ⓾ [DOUBLE CIRCLED NUMBER TEN]
 3367+"\u24FE" => "10"
 3368+
 3369+# ❿ [DINGBAT NEGATIVE CIRCLED NUMBER TEN]
 3370+"\u277F" => "10"
 3371+
 3372+# ➉ [DINGBAT CIRCLED SANS-SERIF NUMBER TEN]
 3373+"\u2789" => "10"
 3374+
 3375+# ➓ [DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN]
 3376+"\u2793" => "10"
 3377+
 3378+# ⒑ [NUMBER TEN FULL STOP]
 3379+"\u2491" => "10."
 3380+
 3381+# ⑽ [PARENTHESIZED NUMBER TEN]
 3382+"\u247D" => "(10)"
 3383+
 3384+# ⑪ [CIRCLED NUMBER ELEVEN]
 3385+"\u246A" => "11"
 3386+
 3387+# ⓫ [NEGATIVE CIRCLED NUMBER ELEVEN]
 3388+"\u24EB" => "11"
 3389+
 3390+# ⒒ [NUMBER ELEVEN FULL STOP]
 3391+"\u2492" => "11."
 3392+
 3393+# ⑾ [PARENTHESIZED NUMBER ELEVEN]
 3394+"\u247E" => "(11)"
 3395+
 3396+# ⑫ [CIRCLED NUMBER TWELVE]
 3397+"\u246B" => "12"
 3398+
 3399+# ⓬ [NEGATIVE CIRCLED NUMBER TWELVE]
 3400+"\u24EC" => "12"
 3401+
 3402+# ⒓ [NUMBER TWELVE FULL STOP]
 3403+"\u2493" => "12."
 3404+
 3405+# ⑿ [PARENTHESIZED NUMBER TWELVE]
 3406+"\u247F" => "(12)"
 3407+
 3408+# ⑬ [CIRCLED NUMBER THIRTEEN]
 3409+"\u246C" => "13"
 3410+
 3411+# ⓭ [NEGATIVE CIRCLED NUMBER THIRTEEN]
 3412+"\u24ED" => "13"
 3413+
 3414+# ⒔ [NUMBER THIRTEEN FULL STOP]
 3415+"\u2494" => "13."
 3416+
 3417+# ⒀ [PARENTHESIZED NUMBER THIRTEEN]
 3418+"\u2480" => "(13)"
 3419+
 3420+# ⑭ [CIRCLED NUMBER FOURTEEN]
 3421+"\u246D" => "14"
 3422+
 3423+# ⓮ [NEGATIVE CIRCLED NUMBER FOURTEEN]
 3424+"\u24EE" => "14"
 3425+
 3426+# ⒕ [NUMBER FOURTEEN FULL STOP]
 3427+"\u2495" => "14."
 3428+
 3429+# ⒁ [PARENTHESIZED NUMBER FOURTEEN]
 3430+"\u2481" => "(14)"
 3431+
 3432+# ⑮ [CIRCLED NUMBER FIFTEEN]
 3433+"\u246E" => "15"
 3434+
 3435+# ⓯ [NEGATIVE CIRCLED NUMBER FIFTEEN]
 3436+"\u24EF" => "15"
 3437+
 3438+# ⒖ [NUMBER FIFTEEN FULL STOP]
 3439+"\u2496" => "15."
 3440+
 3441+# ⒂ [PARENTHESIZED NUMBER FIFTEEN]
 3442+"\u2482" => "(15)"
 3443+
 3444+# ⑯ [CIRCLED NUMBER SIXTEEN]
 3445+"\u246F" => "16"
 3446+
 3447+# ⓰ [NEGATIVE CIRCLED NUMBER SIXTEEN]
 3448+"\u24F0" => "16"
 3449+
 3450+# ⒗ [NUMBER SIXTEEN FULL STOP]
 3451+"\u2497" => "16."
 3452+
 3453+# ⒃ [PARENTHESIZED NUMBER SIXTEEN]
 3454+"\u2483" => "(16)"
 3455+
 3456+# ⑰ [CIRCLED NUMBER SEVENTEEN]
 3457+"\u2470" => "17"
 3458+
 3459+# ⓱ [NEGATIVE CIRCLED NUMBER SEVENTEEN]
 3460+"\u24F1" => "17"
 3461+
 3462+# ⒘ [NUMBER SEVENTEEN FULL STOP]
 3463+"\u2498" => "17."
 3464+
 3465+# ⒄ [PARENTHESIZED NUMBER SEVENTEEN]
 3466+"\u2484" => "(17)"
 3467+
 3468+# ⑱ [CIRCLED NUMBER EIGHTEEN]
 3469+"\u2471" => "18"
 3470+
 3471+# ⓲ [NEGATIVE CIRCLED NUMBER EIGHTEEN]
 3472+"\u24F2" => "18"
 3473+
 3474+# ⒙ [NUMBER EIGHTEEN FULL STOP]
 3475+"\u2499" => "18."
 3476+
 3477+# ⒅ [PARENTHESIZED NUMBER EIGHTEEN]
 3478+"\u2485" => "(18)"
 3479+
 3480+# ⑲ [CIRCLED NUMBER NINETEEN]
 3481+"\u2472" => "19"
 3482+
 3483+# ⓳ [NEGATIVE CIRCLED NUMBER NINETEEN]
 3484+"\u24F3" => "19"
 3485+
 3486+# ⒚ [NUMBER NINETEEN FULL STOP]
 3487+"\u249A" => "19."
 3488+
 3489+# ⒆ [PARENTHESIZED NUMBER NINETEEN]
 3490+"\u2486" => "(19)"
 3491+
 3492+# ⑳ [CIRCLED NUMBER TWENTY]
 3493+"\u2473" => "20"
 3494+
 3495+# ⓴ [NEGATIVE CIRCLED NUMBER TWENTY]
 3496+"\u24F4" => "20"
 3497+
 3498+# ⒛ [NUMBER TWENTY FULL STOP]
 3499+"\u249B" => "20."
 3500+
 3501+# ⒇ [PARENTHESIZED NUMBER TWENTY]
 3502+"\u2487" => "(20)"
 3503+
 3504+# « [LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]
 3505+"\u00AB" => "\""
 3506+
 3507+# » [RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK]
 3508+"\u00BB" => "\""
 3509+
 3510+# “ [LEFT DOUBLE QUOTATION MARK]
 3511+"\u201C" => "\""
 3512+
 3513+# ” [RIGHT DOUBLE QUOTATION MARK]
 3514+"\u201D" => "\""
 3515+
 3516+# „ [DOUBLE LOW-9 QUOTATION MARK]
 3517+"\u201E" => "\""
 3518+
 3519+# ″ [DOUBLE PRIME]
 3520+"\u2033" => "\""
 3521+
 3522+# ‶ [REVERSED DOUBLE PRIME]
 3523+"\u2036" => "\""
 3524+
 3525+# ❝ [HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT]
 3526+"\u275D" => "\""
 3527+
 3528+# ❞ [HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT]
 3529+"\u275E" => "\""
 3530+
 3531+# ❮ [HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT]
 3532+"\u276E" => "\""
 3533+
 3534+# ❯ [HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT]
 3535+"\u276F" => "\""
 3536+
 3537+# " [FULLWIDTH QUOTATION MARK]
 3538+"\uFF02" => "\""
 3539+
 3540+# ‘ [LEFT SINGLE QUOTATION MARK]
 3541+"\u2018" => "\'"
 3542+
 3543+# ’ [RIGHT SINGLE QUOTATION MARK]
 3544+"\u2019" => "\'"
 3545+
 3546+# ‚ [SINGLE LOW-9 QUOTATION MARK]
 3547+"\u201A" => "\'"
 3548+
 3549+# ‛ [SINGLE HIGH-REVERSED-9 QUOTATION MARK]
 3550+"\u201B" => "\'"
 3551+
 3552+# ′ [PRIME]
 3553+"\u2032" => "\'"
 3554+
 3555+# ‵ [REVERSED PRIME]
 3556+"\u2035" => "\'"
 3557+
 3558+# ‹ [SINGLE LEFT-POINTING ANGLE QUOTATION MARK]
 3559+"\u2039" => "\'"
 3560+
 3561+# › [SINGLE RIGHT-POINTING ANGLE QUOTATION MARK]
 3562+"\u203A" => "\'"
 3563+
 3564+# ❛ [HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT]
 3565+"\u275B" => "\'"
 3566+
 3567+# ❜ [HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT]
 3568+"\u275C" => "\'"
 3569+
 3570+# ' [FULLWIDTH APOSTROPHE]
 3571+"\uFF07" => "\'"
 3572+
 3573+# ‐ [HYPHEN]
 3574+"\u2010" => "-"
 3575+
 3576+# ‑ [NON-BREAKING HYPHEN]
 3577+"\u2011" => "-"
 3578+
 3579+# ‒ [FIGURE DASH]
 3580+"\u2012" => "-"
 3581+
 3582+# – [EN DASH]
 3583+"\u2013" => "-"
 3584+
 3585+# — [EM DASH]
 3586+"\u2014" => "-"
 3587+
 3588+# ⁻ [SUPERSCRIPT MINUS]
 3589+"\u207B" => "-"
 3590+
 3591+# ₋ [SUBSCRIPT MINUS]
 3592+"\u208B" => "-"
 3593+
 3594+# - [FULLWIDTH HYPHEN-MINUS]
 3595+"\uFF0D" => "-"
 3596+
 3597+# ⁅ [LEFT SQUARE BRACKET WITH QUILL]
 3598+"\u2045" => "["
 3599+
 3600+# ❲ [LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT]
 3601+"\u2772" => "["
 3602+
 3603+# [ [FULLWIDTH LEFT SQUARE BRACKET]
 3604+"\uFF3B" => "["
 3605+
 3606+# ⁆ [RIGHT SQUARE BRACKET WITH QUILL]
 3607+"\u2046" => "]"
 3608+
 3609+# ❳ [LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT]
 3610+"\u2773" => "]"
 3611+
 3612+# ] [FULLWIDTH RIGHT SQUARE BRACKET]
 3613+"\uFF3D" => "]"
 3614+
 3615+# ⁽ [SUPERSCRIPT LEFT PARENTHESIS]
 3616+"\u207D" => "("
 3617+
 3618+# ₍ [SUBSCRIPT LEFT PARENTHESIS]
 3619+"\u208D" => "("
 3620+
 3621+# ❨ [MEDIUM LEFT PARENTHESIS ORNAMENT]
 3622+"\u2768" => "("
 3623+
 3624+# ❪ [MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT]
 3625+"\u276A" => "("
 3626+
 3627+# ( [FULLWIDTH LEFT PARENTHESIS]
 3628+"\uFF08" => "("
 3629+
 3630+# ⸨ [LEFT DOUBLE PARENTHESIS]
 3631+"\u2E28" => "(("
 3632+
 3633+# ⁾ [SUPERSCRIPT RIGHT PARENTHESIS]
 3634+"\u207E" => ")"
 3635+
 3636+# ₎ [SUBSCRIPT RIGHT PARENTHESIS]
 3637+"\u208E" => ")"
 3638+
 3639+# ❩ [MEDIUM RIGHT PARENTHESIS ORNAMENT]
 3640+"\u2769" => ")"
 3641+
 3642+# ❫ [MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT]
 3643+"\u276B" => ")"
 3644+
 3645+# ) [FULLWIDTH RIGHT PARENTHESIS]
 3646+"\uFF09" => ")"
 3647+
 3648+# ⸩ [RIGHT DOUBLE PARENTHESIS]
 3649+"\u2E29" => "))"
 3650+
 3651+# ❬ [MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT]
 3652+"\u276C" => "<"
 3653+
 3654+# ❰ [HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT]
 3655+"\u2770" => "<"
 3656+
 3657+# < [FULLWIDTH LESS-THAN SIGN]
 3658+"\uFF1C" => "<"
 3659+
 3660+# ❭ [MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT]
 3661+"\u276D" => ">"
 3662+
 3663+# ❱ [HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT]
 3664+"\u2771" => ">"
 3665+
 3666+# > [FULLWIDTH GREATER-THAN SIGN]
 3667+"\uFF1E" => ">"
 3668+
 3669+# ❴ [MEDIUM LEFT CURLY BRACKET ORNAMENT]
 3670+"\u2774" => "{"
 3671+
 3672+# { [FULLWIDTH LEFT CURLY BRACKET]
 3673+"\uFF5B" => "{"
 3674+
 3675+# ❵ [MEDIUM RIGHT CURLY BRACKET ORNAMENT]
 3676+"\u2775" => "}"
 3677+
 3678+# } [FULLWIDTH RIGHT CURLY BRACKET]
 3679+"\uFF5D" => "}"
 3680+
 3681+# ⁺ [SUPERSCRIPT PLUS SIGN]
 3682+"\u207A" => "+"
 3683+
 3684+# ₊ [SUBSCRIPT PLUS SIGN]
 3685+"\u208A" => "+"
 3686+
 3687+# + [FULLWIDTH PLUS SIGN]
 3688+"\uFF0B" => "+"
 3689+
 3690+# ⁼ [SUPERSCRIPT EQUALS SIGN]
 3691+"\u207C" => "="
 3692+
 3693+# ₌ [SUBSCRIPT EQUALS SIGN]
 3694+"\u208C" => "="
 3695+
 3696+# = [FULLWIDTH EQUALS SIGN]
 3697+"\uFF1D" => "="
 3698+
 3699+# ! [FULLWIDTH EXCLAMATION MARK]
 3700+"\uFF01" => "!"
 3701+
 3702+# ‼ [DOUBLE EXCLAMATION MARK]
 3703+"\u203C" => "!!"
 3704+
 3705+# ⁉ [EXCLAMATION QUESTION MARK]
 3706+"\u2049" => "!?"
 3707+
 3708+# # [FULLWIDTH NUMBER SIGN]
 3709+"\uFF03" => "#"
 3710+
 3711+# $ [FULLWIDTH DOLLAR SIGN]
 3712+"\uFF04" => "$"
 3713+
 3714+# ⁒ [COMMERCIAL MINUS SIGN]
 3715+"\u2052" => "%"
 3716+
 3717+# % [FULLWIDTH PERCENT SIGN]
 3718+"\uFF05" => "%"
 3719+
 3720+# & [FULLWIDTH AMPERSAND]
 3721+"\uFF06" => "&"
 3722+
 3723+# ⁎ [LOW ASTERISK]
 3724+"\u204E" => "*"
 3725+
 3726+# * [FULLWIDTH ASTERISK]
 3727+"\uFF0A" => "*"
 3728+
 3729+# , [FULLWIDTH COMMA]
 3730+"\uFF0C" => ","
 3731+
 3732+# . [FULLWIDTH FULL STOP]
 3733+"\uFF0E" => "."
 3734+
 3735+# ⁄ [FRACTION SLASH]
 3736+"\u2044" => "/"
 3737+
 3738+# / [FULLWIDTH SOLIDUS]
 3739+"\uFF0F" => "/"
 3740+
 3741+# : [FULLWIDTH COLON]
 3742+"\uFF1A" => ":"
 3743+
 3744+# ⁏ [REVERSED SEMICOLON]
 3745+"\u204F" => ";"
 3746+
 3747+# ; [FULLWIDTH SEMICOLON]
 3748+"\uFF1B" => ";"
 3749+
 3750+# ? [FULLWIDTH QUESTION MARK]
 3751+"\uFF1F" => "?"
 3752+
 3753+# ⁇ [DOUBLE QUESTION MARK]
 3754+"\u2047" => "??"
 3755+
 3756+# ⁈ [QUESTION EXCLAMATION MARK]
 3757+"\u2048" => "?!"
 3758+
 3759+# @ [FULLWIDTH COMMERCIAL AT]
 3760+"\uFF20" => "@"
 3761+
 3762+# \ [FULLWIDTH REVERSE SOLIDUS]
 3763+"\uFF3C" => "\\"
 3764+
 3765+# ‸ [CARET]
 3766+"\u2038" => "^"
 3767+
 3768+# ^ [FULLWIDTH CIRCUMFLEX ACCENT]
 3769+"\uFF3E" => "^"
 3770+
 3771+# _ [FULLWIDTH LOW LINE]
 3772+"\uFF3F" => "_"
 3773+
 3774+# ⁓ [SWUNG DASH]
 3775+"\u2053" => "~"
 3776+
 3777+# ~ [FULLWIDTH TILDE]
 3778+"\uFF5E" => "~"
 3779+
 3780+################################################################
 3781+# Below is the Perl script used to generate the above mappings #
 3782+# from ASCIIFoldingFilter.java: #
 3783+################################################################
 3784+#
 3785+# #!/usr/bin/perl
 3786+#
 3787+# use warnings;
 3788+# use strict;
 3789+#
 3790+# my @source_chars = ();
 3791+# my @source_char_descriptions = ();
 3792+# my $target = '';
 3793+#
 3794+# while (<>) {
 3795+# if (/case\s+'(\\u[A-F0-9]+)':\s*\/\/\s*(.*)/i) {
 3796+# push @source_chars, $1;
 3797+# push @source_char_descriptions, $2;
 3798+# next;
 3799+# }
 3800+# if (/output\[[^\]]+\]\s*=\s*'(\\'|\\\\|.)'/) {
 3801+# $target .= $1;
 3802+# next;
 3803+# }
 3804+# if (/break;/) {
 3805+# $target = "\\\"" if ($target eq '"');
 3806+# for my $source_char_num (0..$#source_chars) {
 3807+# print "# $source_char_descriptions[$source_char_num]\n";
 3808+# print "\"$source_chars[$source_char_num]\" => \"$target\"\n\n";
 3809+# }
 3810+# @source_chars = ();
 3811+# @source_char_descriptions = ();
 3812+# $target = '';
 3813+# }
 3814+# }
Property changes on: trunk/extensions/SolrStore/solr-example/core0/conf/mapping-FoldToASCII.txt
___________________________________________________________________
Added: svn:eol-style
38153815 + native
Index: trunk/extensions/SolrStore/solr-example/core0/conf/mapping-ISOLatin1Accent.txt
@@ -1,246 +1,246 @@
2 -# The ASF licenses this file to You under the Apache License, Version 2.0
3 -# (the "License"); you may not use this file except in compliance with
4 -# the License. You may obtain a copy of the License at
5 -#
6 -# http://www.apache.org/licenses/LICENSE-2.0
7 -#
8 -# Unless required by applicable law or agreed to in writing, software
9 -# distributed under the License is distributed on an "AS IS" BASIS,
10 -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 -# See the License for the specific language governing permissions and
12 -# limitations under the License.
13 -
14 -# Syntax:
15 -# "source" => "target"
16 -# "source".length() > 0 (source cannot be empty.)
17 -# "target".length() >= 0 (target can be empty.)
18 -
19 -# example:
20 -# "À" => "A"
21 -# "\u00C0" => "A"
22 -# "\u00C0" => "\u0041"
23 -# "ß" => "ss"
24 -# "\t" => " "
25 -# "\n" => ""
26 -
27 -# À => A
28 -"\u00C0" => "A"
29 -
30 -# Á => A
31 -"\u00C1" => "A"
32 -
33 -# Â => A
34 -"\u00C2" => "A"
35 -
36 -# Ã => A
37 -"\u00C3" => "A"
38 -
39 -# Ä => A
40 -"\u00C4" => "A"
41 -
42 -# Å => A
43 -"\u00C5" => "A"
44 -
45 -# Æ => AE
46 -"\u00C6" => "AE"
47 -
48 -# Ç => C
49 -"\u00C7" => "C"
50 -
51 -# È => E
52 -"\u00C8" => "E"
53 -
54 -# É => E
55 -"\u00C9" => "E"
56 -
57 -# Ê => E
58 -"\u00CA" => "E"
59 -
60 -# Ë => E
61 -"\u00CB" => "E"
62 -
63 -# Ì => I
64 -"\u00CC" => "I"
65 -
66 -# Í => I
67 -"\u00CD" => "I"
68 -
69 -# Î => I
70 -"\u00CE" => "I"
71 -
72 -# Ï => I
73 -"\u00CF" => "I"
74 -
75 -# IJ => IJ
76 -"\u0132" => "IJ"
77 -
78 -# Ð => D
79 -"\u00D0" => "D"
80 -
81 -# Ñ => N
82 -"\u00D1" => "N"
83 -
84 -# Ò => O
85 -"\u00D2" => "O"
86 -
87 -# Ó => O
88 -"\u00D3" => "O"
89 -
90 -# Ô => O
91 -"\u00D4" => "O"
92 -
93 -# Õ => O
94 -"\u00D5" => "O"
95 -
96 -# Ö => O
97 -"\u00D6" => "O"
98 -
99 -# Ø => O
100 -"\u00D8" => "O"
101 -
102 -# Œ => OE
103 -"\u0152" => "OE"
104 -
105 -# Þ
106 -"\u00DE" => "TH"
107 -
108 -# Ù => U
109 -"\u00D9" => "U"
110 -
111 -# Ú => U
112 -"\u00DA" => "U"
113 -
114 -# Û => U
115 -"\u00DB" => "U"
116 -
117 -# Ü => U
118 -"\u00DC" => "U"
119 -
120 -# Ý => Y
121 -"\u00DD" => "Y"
122 -
123 -# Ÿ => Y
124 -"\u0178" => "Y"
125 -
126 -# à => a
127 -"\u00E0" => "a"
128 -
129 -# á => a
130 -"\u00E1" => "a"
131 -
132 -# â => a
133 -"\u00E2" => "a"
134 -
135 -# ã => a
136 -"\u00E3" => "a"
137 -
138 -# ä => a
139 -"\u00E4" => "a"
140 -
141 -# å => a
142 -"\u00E5" => "a"
143 -
144 -# æ => ae
145 -"\u00E6" => "ae"
146 -
147 -# ç => c
148 -"\u00E7" => "c"
149 -
150 -# è => e
151 -"\u00E8" => "e"
152 -
153 -# é => e
154 -"\u00E9" => "e"
155 -
156 -# ê => e
157 -"\u00EA" => "e"
158 -
159 -# ë => e
160 -"\u00EB" => "e"
161 -
162 -# ì => i
163 -"\u00EC" => "i"
164 -
165 -# í => i
166 -"\u00ED" => "i"
167 -
168 -# î => i
169 -"\u00EE" => "i"
170 -
171 -# ï => i
172 -"\u00EF" => "i"
173 -
174 -# ij => ij
175 -"\u0133" => "ij"
176 -
177 -# ð => d
178 -"\u00F0" => "d"
179 -
180 -# ñ => n
181 -"\u00F1" => "n"
182 -
183 -# ò => o
184 -"\u00F2" => "o"
185 -
186 -# ó => o
187 -"\u00F3" => "o"
188 -
189 -# ô => o
190 -"\u00F4" => "o"
191 -
192 -# õ => o
193 -"\u00F5" => "o"
194 -
195 -# ö => o
196 -"\u00F6" => "o"
197 -
198 -# ø => o
199 -"\u00F8" => "o"
200 -
201 -# œ => oe
202 -"\u0153" => "oe"
203 -
204 -# ß => ss
205 -"\u00DF" => "ss"
206 -
207 -# þ => th
208 -"\u00FE" => "th"
209 -
210 -# ù => u
211 -"\u00F9" => "u"
212 -
213 -# ú => u
214 -"\u00FA" => "u"
215 -
216 -# û => u
217 -"\u00FB" => "u"
218 -
219 -# ü => u
220 -"\u00FC" => "u"
221 -
222 -# ý => y
223 -"\u00FD" => "y"
224 -
225 -# ÿ => y
226 -"\u00FF" => "y"
227 -
228 -# ff => ff
229 -"\uFB00" => "ff"
230 -
231 -# fi => fi
232 -"\uFB01" => "fi"
233 -
234 -# fl => fl
235 -"\uFB02" => "fl"
236 -
237 -# ffi => ffi
238 -"\uFB03" => "ffi"
239 -
240 -# ffl => ffl
241 -"\uFB04" => "ffl"
242 -
243 -# ſt => ft
244 -"\uFB05" => "ft"
245 -
246 -# st => st
247 -"\uFB06" => "st"
 2+# The ASF licenses this file to You under the Apache License, Version 2.0
 3+# (the "License"); you may not use this file except in compliance with
 4+# the License. You may obtain a copy of the License at
 5+#
 6+# http://www.apache.org/licenses/LICENSE-2.0
 7+#
 8+# Unless required by applicable law or agreed to in writing, software
 9+# distributed under the License is distributed on an "AS IS" BASIS,
 10+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 11+# See the License for the specific language governing permissions and
 12+# limitations under the License.
 13+
 14+# Syntax:
 15+# "source" => "target"
 16+# "source".length() > 0 (source cannot be empty.)
 17+# "target".length() >= 0 (target can be empty.)
 18+
 19+# example:
 20+# "À" => "A"
 21+# "\u00C0" => "A"
 22+# "\u00C0" => "\u0041"
 23+# "ß" => "ss"
 24+# "\t" => " "
 25+# "\n" => ""
 26+
 27+# À => A
 28+"\u00C0" => "A"
 29+
 30+# Á => A
 31+"\u00C1" => "A"
 32+
 33+# Â => A
 34+"\u00C2" => "A"
 35+
 36+# Ã => A
 37+"\u00C3" => "A"
 38+
 39+# Ä => A
 40+"\u00C4" => "A"
 41+
 42+# Å => A
 43+"\u00C5" => "A"
 44+
 45+# Æ => AE
 46+"\u00C6" => "AE"
 47+
 48+# Ç => C
 49+"\u00C7" => "C"
 50+
 51+# È => E
 52+"\u00C8" => "E"
 53+
 54+# É => E
 55+"\u00C9" => "E"
 56+
 57+# Ê => E
 58+"\u00CA" => "E"
 59+
 60+# Ë => E
 61+"\u00CB" => "E"
 62+
 63+# Ì => I
 64+"\u00CC" => "I"
 65+
 66+# Í => I
 67+"\u00CD" => "I"
 68+
 69+# Î => I
 70+"\u00CE" => "I"
 71+
 72+# Ï => I
 73+"\u00CF" => "I"
 74+
 75+# IJ => IJ
 76+"\u0132" => "IJ"
 77+
 78+# Ð => D
 79+"\u00D0" => "D"
 80+
 81+# Ñ => N
 82+"\u00D1" => "N"
 83+
 84+# Ò => O
 85+"\u00D2" => "O"
 86+
 87+# Ó => O
 88+"\u00D3" => "O"
 89+
 90+# Ô => O
 91+"\u00D4" => "O"
 92+
 93+# Õ => O
 94+"\u00D5" => "O"
 95+
 96+# Ö => O
 97+"\u00D6" => "O"
 98+
 99+# Ø => O
 100+"\u00D8" => "O"
 101+
 102+# Œ => OE
 103+"\u0152" => "OE"
 104+
 105+# Þ
 106+"\u00DE" => "TH"
 107+
 108+# Ù => U
 109+"\u00D9" => "U"
 110+
 111+# Ú => U
 112+"\u00DA" => "U"
 113+
 114+# Û => U
 115+"\u00DB" => "U"
 116+
 117+# Ü => U
 118+"\u00DC" => "U"
 119+
 120+# Ý => Y
 121+"\u00DD" => "Y"
 122+
 123+# Ÿ => Y
 124+"\u0178" => "Y"
 125+
 126+# à => a
 127+"\u00E0" => "a"
 128+
 129+# á => a
 130+"\u00E1" => "a"
 131+
 132+# â => a
 133+"\u00E2" => "a"
 134+
 135+# ã => a
 136+"\u00E3" => "a"
 137+
 138+# ä => a
 139+"\u00E4" => "a"
 140+
 141+# å => a
 142+"\u00E5" => "a"
 143+
 144+# æ => ae
 145+"\u00E6" => "ae"
 146+
 147+# ç => c
 148+"\u00E7" => "c"
 149+
 150+# è => e
 151+"\u00E8" => "e"
 152+
 153+# é => e
 154+"\u00E9" => "e"
 155+
 156+# ê => e
 157+"\u00EA" => "e"
 158+
 159+# ë => e
 160+"\u00EB" => "e"
 161+
 162+# ì => i
 163+"\u00EC" => "i"
 164+
 165+# í => i
 166+"\u00ED" => "i"
 167+
 168+# î => i
 169+"\u00EE" => "i"
 170+
 171+# ï => i
 172+"\u00EF" => "i"
 173+
 174+# ij => ij
 175+"\u0133" => "ij"
 176+
 177+# ð => d
 178+"\u00F0" => "d"
 179+
 180+# ñ => n
 181+"\u00F1" => "n"
 182+
 183+# ò => o
 184+"\u00F2" => "o"
 185+
 186+# ó => o
 187+"\u00F3" => "o"
 188+
 189+# ô => o
 190+"\u00F4" => "o"
 191+
 192+# õ => o
 193+"\u00F5" => "o"
 194+
 195+# ö => o
 196+"\u00F6" => "o"
 197+
 198+# ø => o
 199+"\u00F8" => "o"
 200+
 201+# œ => oe
 202+"\u0153" => "oe"
 203+
 204+# ß => ss
 205+"\u00DF" => "ss"
 206+
 207+# þ => th
 208+"\u00FE" => "th"
 209+
 210+# ù => u
 211+"\u00F9" => "u"
 212+
 213+# ú => u
 214+"\u00FA" => "u"
 215+
 216+# û => u
 217+"\u00FB" => "u"
 218+
 219+# ü => u
 220+"\u00FC" => "u"
 221+
 222+# ý => y
 223+"\u00FD" => "y"
 224+
 225+# ÿ => y
 226+"\u00FF" => "y"
 227+
 228+# ff => ff
 229+"\uFB00" => "ff"
 230+
 231+# fi => fi
 232+"\uFB01" => "fi"
 233+
 234+# fl => fl
 235+"\uFB02" => "fl"
 236+
 237+# ffi => ffi
 238+"\uFB03" => "ffi"
 239+
 240+# ffl => ffl
 241+"\uFB04" => "ffl"
 242+
 243+# ſt => ft
 244+"\uFB05" => "ft"
 245+
 246+# st => st
 247+"\uFB06" => "st"
Property changes on: trunk/extensions/SolrStore/solr-example/core0/conf/mapping-ISOLatin1Accent.txt
___________________________________________________________________
Added: svn:eol-style
248248 + native
Index: trunk/extensions/SolrStore/solr-example/core0/conf/synonyms.txt
@@ -1,31 +1,31 @@
2 -# The ASF licenses this file to You under the Apache License, Version 2.0
3 -# (the "License"); you may not use this file except in compliance with
4 -# the License. You may obtain a copy of the License at
5 -#
6 -# http://www.apache.org/licenses/LICENSE-2.0
7 -#
8 -# Unless required by applicable law or agreed to in writing, software
9 -# distributed under the License is distributed on an "AS IS" BASIS,
10 -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 -# See the License for the specific language governing permissions and
12 -# limitations under the License.
13 -
14 -#-----------------------------------------------------------------------
15 -#some test synonym mappings unlikely to appear in real input text
16 -aaa => aaaa
17 -bbb => bbbb1 bbbb2
18 -ccc => cccc1,cccc2
19 -a\=>a => b\=>b
20 -a\,a => b\,b
21 -fooaaa,baraaa,bazaaa
22 -
23 -# Some synonym groups specific to this example
24 -GB,gib,gigabyte,gigabytes
25 -MB,mib,megabyte,megabytes
26 -Television, Televisions, TV, TVs
27 -#notice we use "gib" instead of "GiB" so any WordDelimiterFilter coming
28 -#after us won't split it into two words.
29 -
30 -# Synonym mappings can be used for spelling correction too
31 -pixima => pixma
32 -
 2+# The ASF licenses this file to You under the Apache License, Version 2.0
 3+# (the "License"); you may not use this file except in compliance with
 4+# the License. You may obtain a copy of the License at
 5+#
 6+# http://www.apache.org/licenses/LICENSE-2.0
 7+#
 8+# Unless required by applicable law or agreed to in writing, software
 9+# distributed under the License is distributed on an "AS IS" BASIS,
 10+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 11+# See the License for the specific language governing permissions and
 12+# limitations under the License.
 13+
 14+#-----------------------------------------------------------------------
 15+#some test synonym mappings unlikely to appear in real input text
 16+aaa => aaaa
 17+bbb => bbbb1 bbbb2
 18+ccc => cccc1,cccc2
 19+a\=>a => b\=>b
 20+a\,a => b\,b
 21+fooaaa,baraaa,bazaaa
 22+
 23+# Some synonym groups specific to this example
 24+GB,gib,gigabyte,gigabytes
 25+MB,mib,megabyte,megabytes
 26+Television, Televisions, TV, TVs
 27+#notice we use "gib" instead of "GiB" so any WordDelimiterFilter coming
 28+#after us won't split it into two words.
 29+
 30+# Synonym mappings can be used for spelling correction too
 31+pixima => pixma
 32+
Property changes on: trunk/extensions/SolrStore/solr-example/core0/conf/synonyms.txt
___________________________________________________________________
Added: svn:eol-style
3333 + native
Index: trunk/extensions/SolrStore/solr-example/core0/conf/spellings.txt
@@ -1,2 +1,2 @@
2 -pizza
3 -history
 2+pizza
 3+history
Property changes on: trunk/extensions/SolrStore/solr-example/core0/conf/spellings.txt
___________________________________________________________________
Added: svn:eol-style
44 + native
Index: trunk/extensions/SolrStore/solr-example/core1/conf/schema.xml
@@ -1,41 +1,41 @@
2 -<?xml version="1.0" ?>
3 -<!--
4 - Licensed to the Apache Software Foundation (ASF) under one or more
5 - contributor license agreements. See the NOTICE file distributed with
6 - this work for additional information regarding copyright ownership.
7 - The ASF licenses this file to You under the Apache License, Version 2.0
8 - (the "License"); you may not use this file except in compliance with
9 - the License. You may obtain a copy of the License at
10 -
11 - http://www.apache.org/licenses/LICENSE-2.0
12 -
13 - Unless required by applicable law or agreed to in writing, software
14 - distributed under the License is distributed on an "AS IS" BASIS,
15 - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 - See the License for the specific language governing permissions and
17 - limitations under the License.
18 -
19 -<schema name="example core zero" version="1.1">
20 - <types>
21 - <fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
22 - </types>
23 -
24 - <fields>
25 - <!-- general -->
26 - <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
27 - <field name="type" type="string" indexed="true" stored="true" multiValued="false" />
28 - <field name="name" type="string" indexed="true" stored="true" multiValued="false" />
29 - <field name="core0" type="string" indexed="true" stored="true" multiValued="false" />
30 - </fields>
31 -
32 - <!-- field to use to determine and enforce document uniqueness. -->
33 - <uniqueKey>id</uniqueKey>
34 -
35 - <!-- field for the QueryParser to use when an explicit fieldname is absent -->
36 - <defaultSearchField>name</defaultSearchField>
37 -
38 - <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
39 - <solrQueryParser defaultOperator="OR"/>
40 -</schema>
41 -
 2+<?xml version="1.0" ?>
 3+<!--
 4+ Licensed to the Apache Software Foundation (ASF) under one or more
 5+ contributor license agreements. See the NOTICE file distributed with
 6+ this work for additional information regarding copyright ownership.
 7+ The ASF licenses this file to You under the Apache License, Version 2.0
 8+ (the "License"); you may not use this file except in compliance with
 9+ the License. You may obtain a copy of the License at
 10+
 11+ http://www.apache.org/licenses/LICENSE-2.0
 12+
 13+ Unless required by applicable law or agreed to in writing, software
 14+ distributed under the License is distributed on an "AS IS" BASIS,
 15+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 16+ See the License for the specific language governing permissions and
 17+ limitations under the License.
 18+-->
 19+
 20+<schema name="example core zero" version="1.1">
 21+ <types>
 22+ <fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
 23+ </types>
 24+
 25+ <fields>
 26+ <!-- general -->
 27+ <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
 28+ <field name="type" type="string" indexed="true" stored="true" multiValued="false" />
 29+ <field name="name" type="string" indexed="true" stored="true" multiValued="false" />
 30+ <field name="core0" type="string" indexed="true" stored="true" multiValued="false" />
 31+ </fields>
 32+
 33+ <!-- field to use to determine and enforce document uniqueness. -->
 34+ <uniqueKey>id</uniqueKey>
 35+
 36+ <!-- field for the QueryParser to use when an explicit fieldname is absent -->
 37+ <defaultSearchField>name</defaultSearchField>
 38+
 39+ <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
 40+ <solrQueryParser defaultOperator="OR"/>
 41+</schema>
 42+
Property changes on: trunk/extensions/SolrStore/solr-example/core1/conf/schema.xml
___________________________________________________________________
Added: svn:eol-style
4243 + native
Index: trunk/extensions/SolrStore/solr-example/core1/conf/solrconfig.xml
@@ -1,47 +1,47 @@
2 -<?xml version="1.0" encoding="UTF-8" ?>
3 -<!--
4 - Licensed to the Apache Software Foundation (ASF) under one or more
5 - contributor license agreements. See the NOTICE file distributed with
6 - this work for additional information regarding copyright ownership.
7 - The ASF licenses this file to You under the Apache License, Version 2.0
8 - (the "License"); you may not use this file except in compliance with
9 - the License. You may obtain a copy of the License at
10 -
11 - http://www.apache.org/licenses/LICENSE-2.0
12 -
13 - Unless required by applicable law or agreed to in writing, software
14 - distributed under the License is distributed on an "AS IS" BASIS,
15 - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 - See the License for the specific language governing permissions and
17 - limitations under the License.
18 -
19 -<!--
20 - This is a stripped down config file used for a simple example...
21 - It is *not* a good example to work from.
22 -<config>
23 - <luceneMatchVersion>LUCENE_35</luceneMatchVersion>
24 - <!-- The DirectoryFactory to use for indexes.
25 - solr.StandardDirectoryFactory, the default, is filesystem based.
26 - solr.RAMDirectoryFactory is memory based, not persistent, and doesn't work with replication. -->
27 - <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/>
28 -
29 -
30 - <updateHandler class="solr.DirectUpdateHandler2" />
31 -
32 - <requestDispatcher handleSelect="true" >
33 - <requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" />
34 - </requestDispatcher>
35 -
36 - <requestHandler name="standard" class="solr.StandardRequestHandler" default="true" />
37 - <requestHandler name="/update" class="solr.XmlUpdateRequestHandler" />
38 - <requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" />
39 -
40 - <!-- config for the admin interface -->
41 - <admin>
42 - <defaultQuery>solr</defaultQuery>
43 - </admin>
44 -
45 -</config>
46 -
 2+<?xml version="1.0" encoding="UTF-8" ?>
 3+<!--
 4+ Licensed to the Apache Software Foundation (ASF) under one or more
 5+ contributor license agreements. See the NOTICE file distributed with
 6+ this work for additional information regarding copyright ownership.
 7+ The ASF licenses this file to You under the Apache License, Version 2.0
 8+ (the "License"); you may not use this file except in compliance with
 9+ the License. You may obtain a copy of the License at
 10+
 11+ http://www.apache.org/licenses/LICENSE-2.0
 12+
 13+ Unless required by applicable law or agreed to in writing, software
 14+ distributed under the License is distributed on an "AS IS" BASIS,
 15+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 16+ See the License for the specific language governing permissions and
 17+ limitations under the License.
 18+-->
 19+
 20+<!--
 21+ This is a stripped down config file used for a simple example...
 22+ It is *not* a good example to work from.
 23+-->
 24+<config>
 25+ <luceneMatchVersion>LUCENE_35</luceneMatchVersion>
 26+ <!-- The DirectoryFactory to use for indexes.
 27+ solr.StandardDirectoryFactory, the default, is filesystem based.
 28+ solr.RAMDirectoryFactory is memory based, not persistent, and doesn't work with replication. -->
 29+ <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/>
 30+
 31+
 32+ <updateHandler class="solr.DirectUpdateHandler2" />
 33+
 34+ <requestDispatcher handleSelect="true" >
 35+ <requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" />
 36+ </requestDispatcher>
 37+
 38+ <requestHandler name="standard" class="solr.StandardRequestHandler" default="true" />
 39+ <requestHandler name="/update" class="solr.XmlUpdateRequestHandler" />
 40+ <requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" />
 41+
 42+ <!-- config for the admin interface -->
 43+ <admin>
 44+ <defaultQuery>solr</defaultQuery>
 45+ </admin>
 46+
 47+</config>
 48+
Property changes on: trunk/extensions/SolrStore/solr-example/core1/conf/solrconfig.xml
___________________________________________________________________
Added: svn:eol-style
4749 + native
Index: trunk/extensions/SolrStore/solr-example/README.txt
@@ -1,3 +1,3 @@
2 -This is an Example Configuration for Solr to use with the SolrStore Extension for the Semantic Mediawiki.
3 -
 2+This is an Example Configuration for Solr to use with the SolrStore Extension for the Semantic Mediawiki.
 3+
44 Copy it to your solr dir, or just replace your config with one of our cores. You may need to Edit the solr.xml
\ No newline at end of file
Property changes on: trunk/extensions/SolrStore/solr-example/README.txt
___________________________________________________________________
Added: svn:eol-style
55 + native
Index: trunk/extensions/SolrStore/solr-example/solr.xml
@@ -1,35 +1,35 @@
2 -<?xml version="1.0" encoding="UTF-8" ?>
3 -<!--
4 - Licensed to the Apache Software Foundation (ASF) under one or more
5 - contributor license agreements. See the NOTICE file distributed with
6 - this work for additional information regarding copyright ownership.
7 - The ASF licenses this file to You under the Apache License, Version 2.0
8 - (the "License"); you may not use this file except in compliance with
9 - the License. You may obtain a copy of the License at
10 -
11 - http://www.apache.org/licenses/LICENSE-2.0
12 -
13 - Unless required by applicable law or agreed to in writing, software
14 - distributed under the License is distributed on an "AS IS" BASIS,
15 - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 - See the License for the specific language governing permissions and
17 - limitations under the License.
18 -
19 -<!--
20 - All (relative) paths are relative to the installation path
21 -
22 - persistent: Save changes made via the API to this file
23 - sharedLib: path to a lib directory that will be shared across all cores
24 -<solr persistent="false">
25 -
26 - <!--
27 - adminPath: RequestHandler path to manage cores.
28 - If 'null' (or absent), cores will not be manageable via request handler
29 - -->
30 - <cores adminPath="/admin/cores">
31 - <core name="core1" instanceDir="core1" dataDir="/var/solr/core1" />
32 - <core name="core0" instanceDir="core0" dataDir="/var/solr/core0" />
33 - </cores>
34 -</solr>
 2+<?xml version="1.0" encoding="UTF-8" ?>
 3+<!--
 4+ Licensed to the Apache Software Foundation (ASF) under one or more
 5+ contributor license agreements. See the NOTICE file distributed with
 6+ this work for additional information regarding copyright ownership.
 7+ The ASF licenses this file to You under the Apache License, Version 2.0
 8+ (the "License"); you may not use this file except in compliance with
 9+ the License. You may obtain a copy of the License at
 10+
 11+ http://www.apache.org/licenses/LICENSE-2.0
 12+
 13+ Unless required by applicable law or agreed to in writing, software
 14+ distributed under the License is distributed on an "AS IS" BASIS,
 15+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 16+ See the License for the specific language governing permissions and
 17+ limitations under the License.
 18+-->
 19+
 20+<!--
 21+ All (relative) paths are relative to the installation path
 22+
 23+ persistent: Save changes made via the API to this file
 24+ sharedLib: path to a lib directory that will be shared across all cores
 25+-->
 26+<solr persistent="false">
 27+
 28+ <!--
 29+ adminPath: RequestHandler path to manage cores.
 30+ If 'null' (or absent), cores will not be manageable via request handler
 31+ -->
 32+ <cores adminPath="/admin/cores">
 33+ <core name="core1" instanceDir="core1" dataDir="/var/solr/core1" />
 34+ <core name="core0" instanceDir="core0" dataDir="/var/solr/core0" />
 35+ </cores>
 36+</solr>
Property changes on: trunk/extensions/SolrStore/solr-example/solr.xml
___________________________________________________________________
Added: svn:eol-style
3537 + native
Property changes on: trunk/extensions/SolrStore/SolrDoc.php
___________________________________________________________________
Added: svn:eol-style
3638 + native
Property changes on: trunk/extensions/SolrStore/SolrSearch.php
___________________________________________________________________
Added: svn:eol-style
3739 + native
Property changes on: trunk/extensions/SolrStore/SolrSearchFieldSet.php
___________________________________________________________________
Added: svn:eol-style
3840 + native
Property changes on: trunk/extensions/SolrStore/SpecialSolrSearch.php
___________________________________________________________________
Added: svn:eol-style
3941 + native
Property changes on: trunk/extensions/SolrStore/SolrConnectorStore.php
___________________________________________________________________
Added: svn:eol-style
4042 + native
Index: trunk/extensions/SolrStore/SolrConnector.i18n.php
@@ -1,26 +1,26 @@
2 -<?php
3 -/**
4 - * SolrStore: The SolrStore Extesion is Semantic Mediawiki Searchprovieder based on Apache Solr.
5 - *
6 - * @defgroup SolrStore
7 - * @author Simon Bachenberg
8 - */
9 -$messages = array();
10 -$specialPageAliases = array();
11 -
12 -$messages['en'] = array(
13 - 'solrsearch' => 'SolrSearch',
14 - 'searchFieldSets' => 'SolrSearch',
15 - 'searchFieldSets-select' => 'Please select a SearchSet',
16 - 'searchFieldSets-title' => 'SolrSearch: SearchSet Select',
17 -);
18 -$messages['de'] = array(
19 - 'solrsearch' => 'SolrSuche',
20 - 'searchFieldSets' => 'SolrSuche',
21 - 'searchFieldSets-select' => 'Bitte wählen Sie ein SearchSet aus',
22 - 'searchFieldSets-title' => 'SolrSearch: SearchSet Auswahl',
23 -);
24 -
25 -$specialPageAliases['en'] = array('solrsearch' => array('SolrSearch', 'SpecialSolrSearch'));
26 -$specialPageAliases['de'] = array('solrsearch' => array('SolrSearch', 'SpecialSolrSearch'));
27 -?>
 2+<?php
 3+/**
 4+ * SolrStore: The SolrStore Extesion is Semantic Mediawiki Searchprovieder based on Apache Solr.
 5+ *
 6+ * @defgroup SolrStore
 7+ * @author Simon Bachenberg
 8+ */
 9+$messages = array();
 10+$specialPageAliases = array();
 11+
 12+$messages['en'] = array(
 13+ 'solrsearch' => 'SolrSearch',
 14+ 'searchFieldSets' => 'SolrSearch',
 15+ 'searchFieldSets-select' => 'Please select a SearchSet',
 16+ 'searchFieldSets-title' => 'SolrSearch: SearchSet Select',
 17+);
 18+$messages['de'] = array(
 19+ 'solrsearch' => 'SolrSuche',
 20+ 'searchFieldSets' => 'SolrSuche',
 21+ 'searchFieldSets-select' => 'Bitte wählen Sie ein SearchSet aus',
 22+ 'searchFieldSets-title' => 'SolrSearch: SearchSet Auswahl',
 23+);
 24+
 25+$specialPageAliases['en'] = array('solrsearch' => array('SolrSearch', 'SpecialSolrSearch'));
 26+$specialPageAliases['de'] = array('solrsearch' => array('SolrSearch', 'SpecialSolrSearch'));
 27+?>
Property changes on: trunk/extensions/SolrStore/SolrConnector.i18n.php
___________________________________________________________________
Added: svn:eol-style
2828 + native
Property changes on: trunk/extensions/EducationProgram/specials/SpecialEditInstitution.php
___________________________________________________________________
Added: svn:eol-style
2929 + native
Property changes on: trunk/extensions/EducationProgram/specials/SpecialEPFormPage.php
___________________________________________________________________
Added: svn:eol-style
3030 + native
Property changes on: trunk/extensions/MobileFrontend/FooterTemplate.php
___________________________________________________________________
Added: svn:eol-style
3131 + native
Property changes on: trunk/extensions/MobileFrontend/LeaveFeedbackTemplate.php
___________________________________________________________________
Added: svn:eol-style
3232 + native
Property changes on: trunk/extensions/MobileFrontend/ApplicationTemplate.php
___________________________________________________________________
Added: svn:eol-style
3333 + native
Property changes on: trunk/extensions/MobileFrontend/DisableTemplate.php
___________________________________________________________________
Added: svn:eol-style
3434 + native
Property changes on: trunk/extensions/MobileFrontend/SearchTemplate.php
___________________________________________________________________
Added: svn:eol-style
3535 + native
Property changes on: trunk/extensions/MobileFrontend/MobileFrontendTemplate.php
___________________________________________________________________
Added: svn:eol-style
3636 + native
Property changes on: trunk/extensions/MobileFrontend/javascripts/filepage.js
___________________________________________________________________
Added: svn:eol-style
3737 + native
Property changes on: trunk/extensions/MobileFrontend/ApplicationWmlTemplate.php
___________________________________________________________________
Added: svn:eol-style
3838 + native
Property changes on: trunk/extensions/MobileFrontend/OptInTemplate.php
___________________________________________________________________
Added: svn:eol-style
3939 + native
Property changes on: trunk/extensions/MobileFrontend/OptOutTemplate.php
___________________________________________________________________
Added: svn:eol-style
4040 + native
Property changes on: trunk/extensions/MobileFrontend/ThanksNoticeTemplate.php
___________________________________________________________________
Added: svn:eol-style
4141 + native
Property changes on: trunk/extensions/MobileFrontend/stylesheets/filepage.css
___________________________________________________________________
Added: svn:eol-style
4242 + native
Property changes on: trunk/extensions/MoodBar/include/MoodBarHTMLMailerJob.php
___________________________________________________________________
Added: svn:eol-style
4343 + native
Property changes on: trunk/extensions/MoodBar/include/MoodBarHTMLEmailNotification.php
___________________________________________________________________
Added: svn:eol-style
4444 + native
Property changes on: trunk/extensions/SelectionSifter/SelectionSifter.alias.php
___________________________________________________________________
Added: svn:eol-style
4545 + native
Property changes on: trunk/extensions/SelectionSifter/SelectionSifter.i18n.php
___________________________________________________________________
Added: svn:eol-style
4646 + native
Index: trunk/extensions/skins/Synagonism/skins/synagonism/csshover.htc
@@ -1,284 +1,284 @@
2 -<public:attach event="ondocumentready" onevent="CSSHover()" />
3 -<script>
4 -/**
5 - * Whatever:hover - V3.11
6 - * ------------------------------------------------------------
7 - * Author - Peter Nederlof, http://www.xs4all.nl/~peterned
8 - * License - http://creativecommons.org/licenses/LGPL/2.1
9 - *
10 - * Special thanks to Sergiu Dumitriu, http://purl.org/net/sergiu,
11 - * for fixing the expression loop.
12 - *
13 - * Whatever:hover is free software; you can redistribute it and/or
14 - * modify it under the terms of the GNU Lesser General Public
15 - * License as published by the Free Software Foundation; either
16 - * version 2.1 of the License, or (at your option) any later version.
17 - *
18 - * Whatever:hover is distributed in the hope that it will be useful,
19 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 - * Lesser General Public License for more details.
22 - *
23 - * howto: body { behavior:url("csshover3.htc"); }
24 - * ------------------------------------------------------------
25 - */
26 -
27 -window.CSSHover = (function(){
28 -
29 - // regular expressions, used and explained later on.
30 - var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;
31 - var REG_AFFECTED = /(.*?)\:(hover|active|focus)/i;
32 - var REG_PSEUDO = /[^:]+:([a-z\-]+).*/i;
33 - var REG_SELECT = /(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;
34 - var REG_CLASS = /\.([a-z0-9_\-]*on(hover|active|focus))/i;
35 - var REG_MSIE = /msie (5|6|7)/i;
36 - var REG_COMPAT = /backcompat/i;
37 -
38 - // property mapping, real css properties must be used in order to clear expressions later on...
39 - // Uses obscure css properties that no-one is likely to use. The properties are borrowed to
40 - // set an expression, and are then restored to the most likely correct value.
41 - var Properties = {
42 - index: 0,
43 - list: ['text-kashida', 'text-kashida-space', 'text-justify'],
44 - get: function() {
45 - return this.list[(this.index++)%this.list.length];
46 - }
47 - };
48 -
49 - // camelize is used to convert css properties from (eg) text-kashida to textKashida
50 - var camelize = function(str) {
51 - return str.replace(/-(.)/mg, function(result, match){
52 - return match.toUpperCase();
53 - });
54 - };
55 -
56 - /**
57 - * Local CSSHover object
58 - * --------------------------
59 - */
60 -
61 - var CSSHover = {
62 -
63 - // array of CSSHoverElements, used to unload created events
64 - elements: [],
65 -
66 - // buffer used for checking on duplicate expressions
67 - callbacks: {},
68 -
69 - // init, called once ondomcontentready via the exposed window.CSSHover function
70 - init:function() {
71 - // don't run in IE8 standards; expressions don't work in standards mode anyway,
72 - // and the stuff we're trying to fix should already work properly
73 - if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) {
74 - return;
75 - }
76 -
77 - // start parsing the existing stylesheets
78 - var sheets = window.document.styleSheets, l = sheets.length;
79 - for(var i=0; i<l; i++) {
80 - this.parseStylesheet(sheets[i]);
81 - }
82 - },
83 -
84 - // called from init, parses individual stylesheets
85 - parseStylesheet:function(sheet) {
86 - // check sheet imports and parse those recursively
87 - if(sheet.imports) {
88 - try {
89 - var imports = sheet.imports;
90 - var l = imports.length;
91 - for(var i=0; i<l; i++) {
92 - this.parseStylesheet(sheet.imports[i]);
93 - }
94 - } catch(securityException){
95 - // trycatch for various possible errors
96 - }
97 - }
98 -
99 - // interate the sheet's rules and send them to the parser
100 - try {
101 - var rules = sheet.rules;
102 - var r = rules.length;
103 - for(var j=0; j<r; j++) {
104 - this.parseCSSRule(rules[j], sheet);
105 - }
106 - } catch(someException){
107 - // trycatch for various errors, most likely accessing the sheet's rules.
108 - }
109 - },
110 -
111 - // magic starts here ...
112 - parseCSSRule:function(rule, sheet) {
113 -
114 - // The sheet is used to insert new rules into, this must be the same sheet the rule
115 - // came from, to ensure that relative paths keep pointing to the right location.
116 -
117 - // only parse a rule if it contains an interactive pseudo.
118 - var select = rule.selectorText;
119 - if(REG_INTERACTIVE.test(select)) {
120 - var style = rule.style.cssText;
121 -
122 - // affected elements are found by truncating the selector after the interactive pseudo,
123 - // eg: "div li:hover" >> "div li"
124 - var affected = REG_AFFECTED.exec(select)[1];
125 -
126 - // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active)
127 - // eg: "li:hover" >> "onhover"
128 - var pseudo = select.replace(REG_PSEUDO, 'on$1');
129 -
130 - // the new selector is going to use that classname in a new css rule,
131 - // since IE6 doesn't support multiple classnames, this is merged into one classname
132 - // eg: "li:hover" >> "li.onhover", "li.folder:hover" >> "li.folderonhover"
133 - var newSelect = select.replace(REG_SELECT, '.$2' + pseudo);
134 -
135 - // the classname is needed for the events that are going to be set on affected nodes
136 - // eg: "li.folder:hover" >> "folderonhover"
137 - var className = REG_CLASS.exec(newSelect)[1];
138 -
139 - // no need to set the same callback more than once when the same selector uses the same classname
140 - var hash = affected + className;
141 - if(!this.callbacks[hash]) {
142 -
143 - // affected elements are given an expression under a borrowed css property, because fake properties
144 - // can't have their expressions cleared. Different properties are used per pseudo, to avoid
145 - // expressions from overwriting eachother. The expression does a callback to CSSHover.patch,
146 - // rerouted via the exposed window.CSSHover function.
147 - var property = Properties.get();
148 - var atRuntime = camelize(property);
149 -
150 - // because the expression is added to the stylesheet, and styles are always applied to html that is
151 - // dynamically added to the dom, the expression will also trigger for those new elements (provided
152 - // they are selected by the affected selector).
153 - sheet.addRule(affected, property + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'", "'+atRuntime+'"))');
154 -
155 - // hash it, so an identical selector/class combo does not duplicate the expression
156 - this.callbacks[hash] = true;
157 - }
158 -
159 - // duplicate expressions need not be set, but the style could differ
160 - sheet.addRule(newSelect, style);
161 - }
162 - },
163 -
164 - // called via the expression, patches individual nodes
165 - patch:function(node, type, className, property) {
166 -
167 - // restores the borrowed css property to the value of its immediate parent, clearing
168 - // the expression so that it's not repeatedly called.
169 - try {
170 - var value = node.parentNode.currentStyle[property];
171 - node.style[property] = value;
172 - } catch(e) {
173 - // the above reset should never fail, but just in case, clear the runtimeStyle if it does.
174 - // this will also stop the expression.
175 - node.runtimeStyle[property] = '';
176 - }
177 -
178 - // just to make sure, also keep track of patched classnames locally on the node
179 - if(!node.csshover) {
180 - node.csshover = [];
181 - }
182 -
183 - // and check for it to prevent duplicate events with the same classname from being set
184 - if(!node.csshover[className]) {
185 - node.csshover[className] = true;
186 -
187 - // create an instance for the given type and class
188 - var element = new CSSHoverElement(node, type, className);
189 -
190 - // and store that instance for unloading later on
191 - this.elements.push(element);
192 - }
193 -
194 - // returns a dummy value to the expression
195 - return type;
196 - },
197 -
198 - // unload stuff onbeforeunload
199 - unload:function() {
200 - try {
201 -
202 - // remove events
203 - var l = this.elements.length;
204 - for(var i=0; i<l; i++) {
205 - this.elements[i].unload();
206 - }
207 -
208 - // and set properties to null
209 - this.elements = [];
210 - this.callbacks = {};
211 -
212 - } catch (e) {
213 - }
214 - }
215 - };
216 -
217 - /**
218 - * CSSHoverElement
219 - * --------------------------
220 - */
221 -
222 - // the event types associated with the interactive pseudos
223 - var CSSEvents = {
224 - onhover: { activator: 'onmouseenter', deactivator: 'onmouseleave' },
225 - onactive: { activator: 'onmousedown', deactivator: 'onmouseup' },
226 - onfocus: { activator: 'onfocus', deactivator: 'onblur' }
227 - };
228 -
229 - // CSSHoverElement constructor, called via CSSHover.patch
230 - function CSSHoverElement(node, type, className) {
231 -
232 - // the CSSHoverElement patches individual nodes by manually applying the events that should
233 - // have fired by the css pseudoclasses, eg mouseenter and mouseleave for :hover.
234 -
235 - this.node = node;
236 - this.type = type;
237 - var replacer = new RegExp('(^|\\s)'+className+'(\\s|$)', 'g');
238 -
239 - // store event handlers for removal onunload
240 - this.activator = function(){ node.className += ' ' + className; };
241 - this.deactivator = function(){ node.className = node.className.replace(replacer, ' '); };
242 -
243 - // add the events
244 - node.attachEvent(CSSEvents[type].activator, this.activator);
245 - node.attachEvent(CSSEvents[type].deactivator, this.deactivator);
246 - }
247 -
248 - CSSHoverElement.prototype = {
249 - // onbeforeunload, called via CSSHover.unload
250 - unload:function() {
251 -
252 - // remove events
253 - this.node.detachEvent(CSSEvents[this.type].activator, this.activator);
254 - this.node.detachEvent(CSSEvents[this.type].deactivator, this.deactivator);
255 -
256 - // and set properties to null
257 - this.activator = null;
258 - this.deactivator = null;
259 - this.node = null;
260 - this.type = null;
261 - }
262 - };
263 -
264 - // add the unload to the onbeforeunload event
265 - window.attachEvent('onbeforeunload', function(){
266 - CSSHover.unload();
267 - });
268 -
269 - /**
270 - * Public hook
271 - * --------------------------
272 - */
273 -
274 - return function(node, type, className, property) {
275 - if(node) {
276 - // called via the css expression; patches individual nodes
277 - return CSSHover.patch(node, type, className, property);
278 - } else {
279 - // called ondomcontentready via the public:attach node
280 - CSSHover.init();
281 - }
282 - };
283 -
284 -})();
 2+<public:attach event="ondocumentready" onevent="CSSHover()" />
 3+<script>
 4+/**
 5+ * Whatever:hover - V3.11
 6+ * ------------------------------------------------------------
 7+ * Author - Peter Nederlof, http://www.xs4all.nl/~peterned
 8+ * License - http://creativecommons.org/licenses/LGPL/2.1
 9+ *
 10+ * Special thanks to Sergiu Dumitriu, http://purl.org/net/sergiu,
 11+ * for fixing the expression loop.
 12+ *
 13+ * Whatever:hover is free software; you can redistribute it and/or
 14+ * modify it under the terms of the GNU Lesser General Public
 15+ * License as published by the Free Software Foundation; either
 16+ * version 2.1 of the License, or (at your option) any later version.
 17+ *
 18+ * Whatever:hover is distributed in the hope that it will be useful,
 19+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
 20+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 21+ * Lesser General Public License for more details.
 22+ *
 23+ * howto: body { behavior:url("csshover3.htc"); }
 24+ * ------------------------------------------------------------
 25+ */
 26+
 27+window.CSSHover = (function(){
 28+
 29+ // regular expressions, used and explained later on.
 30+ var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;
 31+ var REG_AFFECTED = /(.*?)\:(hover|active|focus)/i;
 32+ var REG_PSEUDO = /[^:]+:([a-z\-]+).*/i;
 33+ var REG_SELECT = /(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;
 34+ var REG_CLASS = /\.([a-z0-9_\-]*on(hover|active|focus))/i;
 35+ var REG_MSIE = /msie (5|6|7)/i;
 36+ var REG_COMPAT = /backcompat/i;
 37+
 38+ // property mapping, real css properties must be used in order to clear expressions later on...
 39+ // Uses obscure css properties that no-one is likely to use. The properties are borrowed to
 40+ // set an expression, and are then restored to the most likely correct value.
 41+ var Properties = {
 42+ index: 0,
 43+ list: ['text-kashida', 'text-kashida-space', 'text-justify'],
 44+ get: function() {
 45+ return this.list[(this.index++)%this.list.length];
 46+ }
 47+ };
 48+
 49+ // camelize is used to convert css properties from (eg) text-kashida to textKashida
 50+ var camelize = function(str) {
 51+ return str.replace(/-(.)/mg, function(result, match){
 52+ return match.toUpperCase();
 53+ });
 54+ };
 55+
 56+ /**
 57+ * Local CSSHover object
 58+ * --------------------------
 59+ */
 60+
 61+ var CSSHover = {
 62+
 63+ // array of CSSHoverElements, used to unload created events
 64+ elements: [],
 65+
 66+ // buffer used for checking on duplicate expressions
 67+ callbacks: {},
 68+
 69+ // init, called once ondomcontentready via the exposed window.CSSHover function
 70+ init:function() {
 71+ // don't run in IE8 standards; expressions don't work in standards mode anyway,
 72+ // and the stuff we're trying to fix should already work properly
 73+ if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) {
 74+ return;
 75+ }
 76+
 77+ // start parsing the existing stylesheets
 78+ var sheets = window.document.styleSheets, l = sheets.length;
 79+ for(var i=0; i<l; i++) {
 80+ this.parseStylesheet(sheets[i]);
 81+ }
 82+ },
 83+
 84+ // called from init, parses individual stylesheets
 85+ parseStylesheet:function(sheet) {
 86+ // check sheet imports and parse those recursively
 87+ if(sheet.imports) {
 88+ try {
 89+ var imports = sheet.imports;
 90+ var l = imports.length;
 91+ for(var i=0; i<l; i++) {
 92+ this.parseStylesheet(sheet.imports[i]);
 93+ }
 94+ } catch(securityException){
 95+ // trycatch for various possible errors
 96+ }
 97+ }
 98+
 99+ // interate the sheet's rules and send them to the parser
 100+ try {
 101+ var rules = sheet.rules;
 102+ var r = rules.length;
 103+ for(var j=0; j<r; j++) {
 104+ this.parseCSSRule(rules[j], sheet);
 105+ }
 106+ } catch(someException){
 107+ // trycatch for various errors, most likely accessing the sheet's rules.
 108+ }
 109+ },
 110+
 111+ // magic starts here ...
 112+ parseCSSRule:function(rule, sheet) {
 113+
 114+ // The sheet is used to insert new rules into, this must be the same sheet the rule
 115+ // came from, to ensure that relative paths keep pointing to the right location.
 116+
 117+ // only parse a rule if it contains an interactive pseudo.
 118+ var select = rule.selectorText;
 119+ if(REG_INTERACTIVE.test(select)) {
 120+ var style = rule.style.cssText;
 121+
 122+ // affected elements are found by truncating the selector after the interactive pseudo,
 123+ // eg: "div li:hover" >> "div li"
 124+ var affected = REG_AFFECTED.exec(select)[1];
 125+
 126+ // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active)
 127+ // eg: "li:hover" >> "onhover"
 128+ var pseudo = select.replace(REG_PSEUDO, 'on$1');
 129+
 130+ // the new selector is going to use that classname in a new css rule,
 131+ // since IE6 doesn't support multiple classnames, this is merged into one classname
 132+ // eg: "li:hover" >> "li.onhover", "li.folder:hover" >> "li.folderonhover"
 133+ var newSelect = select.replace(REG_SELECT, '.$2' + pseudo);
 134+
 135+ // the classname is needed for the events that are going to be set on affected nodes
 136+ // eg: "li.folder:hover" >> "folderonhover"
 137+ var className = REG_CLASS.exec(newSelect)[1];
 138+
 139+ // no need to set the same callback more than once when the same selector uses the same classname
 140+ var hash = affected + className;
 141+ if(!this.callbacks[hash]) {
 142+
 143+ // affected elements are given an expression under a borrowed css property, because fake properties
 144+ // can't have their expressions cleared. Different properties are used per pseudo, to avoid
 145+ // expressions from overwriting eachother. The expression does a callback to CSSHover.patch,
 146+ // rerouted via the exposed window.CSSHover function.
 147+ var property = Properties.get();
 148+ var atRuntime = camelize(property);
 149+
 150+ // because the expression is added to the stylesheet, and styles are always applied to html that is
 151+ // dynamically added to the dom, the expression will also trigger for those new elements (provided
 152+ // they are selected by the affected selector).
 153+ sheet.addRule(affected, property + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'", "'+atRuntime+'"))');
 154+
 155+ // hash it, so an identical selector/class combo does not duplicate the expression
 156+ this.callbacks[hash] = true;
 157+ }
 158+
 159+ // duplicate expressions need not be set, but the style could differ
 160+ sheet.addRule(newSelect, style);
 161+ }
 162+ },
 163+
 164+ // called via the expression, patches individual nodes
 165+ patch:function(node, type, className, property) {
 166+
 167+ // restores the borrowed css property to the value of its immediate parent, clearing
 168+ // the expression so that it's not repeatedly called.
 169+ try {
 170+ var value = node.parentNode.currentStyle[property];
 171+ node.style[property] = value;
 172+ } catch(e) {
 173+ // the above reset should never fail, but just in case, clear the runtimeStyle if it does.
 174+ // this will also stop the expression.
 175+ node.runtimeStyle[property] = '';
 176+ }
 177+
 178+ // just to make sure, also keep track of patched classnames locally on the node
 179+ if(!node.csshover) {
 180+ node.csshover = [];
 181+ }
 182+
 183+ // and check for it to prevent duplicate events with the same classname from being set
 184+ if(!node.csshover[className]) {
 185+ node.csshover[className] = true;
 186+
 187+ // create an instance for the given type and class
 188+ var element = new CSSHoverElement(node, type, className);
 189+
 190+ // and store that instance for unloading later on
 191+ this.elements.push(element);
 192+ }
 193+
 194+ // returns a dummy value to the expression
 195+ return type;
 196+ },
 197+
 198+ // unload stuff onbeforeunload
 199+ unload:function() {
 200+ try {
 201+
 202+ // remove events
 203+ var l = this.elements.length;
 204+ for(var i=0; i<l; i++) {
 205+ this.elements[i].unload();
 206+ }
 207+
 208+ // and set properties to null
 209+ this.elements = [];
 210+ this.callbacks = {};
 211+
 212+ } catch (e) {
 213+ }
 214+ }
 215+ };
 216+
 217+ /**
 218+ * CSSHoverElement
 219+ * --------------------------
 220+ */
 221+
 222+ // the event types associated with the interactive pseudos
 223+ var CSSEvents = {
 224+ onhover: { activator: 'onmouseenter', deactivator: 'onmouseleave' },
 225+ onactive: { activator: 'onmousedown', deactivator: 'onmouseup' },
 226+ onfocus: { activator: 'onfocus', deactivator: 'onblur' }
 227+ };
 228+
 229+ // CSSHoverElement constructor, called via CSSHover.patch
 230+ function CSSHoverElement(node, type, className) {
 231+
 232+ // the CSSHoverElement patches individual nodes by manually applying the events that should
 233+ // have fired by the css pseudoclasses, eg mouseenter and mouseleave for :hover.
 234+
 235+ this.node = node;
 236+ this.type = type;
 237+ var replacer = new RegExp('(^|\\s)'+className+'(\\s|$)', 'g');
 238+
 239+ // store event handlers for removal onunload
 240+ this.activator = function(){ node.className += ' ' + className; };
 241+ this.deactivator = function(){ node.className = node.className.replace(replacer, ' '); };
 242+
 243+ // add the events
 244+ node.attachEvent(CSSEvents[type].activator, this.activator);
 245+ node.attachEvent(CSSEvents[type].deactivator, this.deactivator);
 246+ }
 247+
 248+ CSSHoverElement.prototype = {
 249+ // onbeforeunload, called via CSSHover.unload
 250+ unload:function() {
 251+
 252+ // remove events
 253+ this.node.detachEvent(CSSEvents[this.type].activator, this.activator);
 254+ this.node.detachEvent(CSSEvents[this.type].deactivator, this.deactivator);
 255+
 256+ // and set properties to null
 257+ this.activator = null;
 258+ this.deactivator = null;
 259+ this.node = null;
 260+ this.type = null;
 261+ }
 262+ };
 263+
 264+ // add the unload to the onbeforeunload event
 265+ window.attachEvent('onbeforeunload', function(){
 266+ CSSHover.unload();
 267+ });
 268+
 269+ /**
 270+ * Public hook
 271+ * --------------------------
 272+ */
 273+
 274+ return function(node, type, className, property) {
 275+ if(node) {
 276+ // called via the css expression; patches individual nodes
 277+ return CSSHover.patch(node, type, className, property);
 278+ } else {
 279+ // called ondomcontentready via the public:attach node
 280+ CSSHover.init();
 281+ }
 282+ };
 283+
 284+})();
285285 </script>
\ No newline at end of file
Property changes on: trunk/extensions/skins/Synagonism/skins/synagonism/csshover.htc
___________________________________________________________________
Added: svn:eol-style
286286 + native
Index: trunk/extensions/skins/Synagonism/skins/synagonism/csshover.min.htc
@@ -1,12 +1,12 @@
2 -<public:attach event="ondocumentready" onevent="CSSHover()" />
3 -<script>
4 -/**
5 - * Whatever:hover - V3.11
6 - * http://www.xs4all.nl/~peterned/
7 - *
8 - * Copyright (c) 2009 Peter Nederlof
9 - * Licensed under the LGPL license
10 - * http://creativecommons.org/licenses/LGPL/2.1
11 - */
12 -window.CSSHover=(function(){var m=/(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;var n=/(.*?)\:(hover|active|focus)/i;var o=/[^:]+:([a-z\-]+).*/i;var p=/(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;var q=/\.([a-z0-9_\-]*on(hover|active|focus))/i;var s=/msie (5|6|7)/i;var t=/backcompat/i;var u={index:0,list:['text-kashida','text-kashida-space','text-justify'],get:function(){return this.list[(this.index++)%this.list.length]}};var v=function(c){return c.replace(/-(.)/mg,function(a,b){return b.toUpperCase()})};var w={elements:[],callbacks:{},init:function(){if(!s.test(navigator.userAgent)&&!t.test(window.document.compatMode)){return}var a=window.document.styleSheets,l=a.length;for(var i=0;i<l;i++){this.parseStylesheet(a[i])}},parseStylesheet:function(a){if(a.imports){try{var b=a.imports;var l=b.length;for(var i=0;i<l;i++){this.parseStylesheet(a.imports[i])}}catch(securityException){}}try{var c=a.rules;var r=c.length;for(var j=0;j<r;j++){this.parseCSSRule(c[j],a)}}catch(someException){}},parseCSSRule:function(a,b){var c=a.selectorText;if(m.test(c)){var d=a.style.cssText;var e=n.exec(c)[1];var f=c.replace(o,'on$1');var g=c.replace(p,'.$2'+f);var h=q.exec(g)[1];var i=e+h;if(!this.callbacks[i]){var j=u.get();var k=v(j);b.addRule(e,j+':expression(CSSHover(this, "'+f+'", "'+h+'", "'+k+'"))');this.callbacks[i]=true}b.addRule(g,d)}},patch:function(a,b,c,d){try{var f=a.parentNode.currentStyle[d];a.style[d]=f}catch(e){a.runtimeStyle[d]=''}if(!a.csshover){a.csshover=[]}if(!a.csshover[c]){a.csshover[c]=true;var g=new CSSHoverElement(a,b,c);this.elements.push(g)}return b},unload:function(){try{var l=this.elements.length;for(var i=0;i<l;i++){this.elements[i].unload()}this.elements=[];this.callbacks={}}catch(e){}}};var x={onhover:{activator:'onmouseenter',deactivator:'onmouseleave'},onactive:{activator:'onmousedown',deactivator:'onmouseup'},onfocus:{activator:'onfocus',deactivator:'onblur'}};function CSSHoverElement(a,b,c){this.node=a;this.type=b;var d=new RegExp('(^|\\s)'+c+'(\\s|$)','g');this.activator=function(){a.className+=' '+c};this.deactivator=function(){a.className=a.className.replace(d,' ')};a.attachEvent(x[b].activator,this.activator);a.attachEvent(x[b].deactivator,this.deactivator)}CSSHoverElement.prototype={unload:function(){this.node.detachEvent(x[this.type].activator,this.activator);this.node.detachEvent(x[this.type].deactivator,this.deactivator);this.activator=null;this.deactivator=null;this.node=null;this.type=null}};window.attachEvent('onbeforeunload',function(){w.unload()});return function(a,b,c,d){if(a){return w.patch(a,b,c,d)}else{w.init()}}})();
13 -</script>
 2+<public:attach event="ondocumentready" onevent="CSSHover()" />
 3+<script>
 4+/**
 5+ * Whatever:hover - V3.11
 6+ * http://www.xs4all.nl/~peterned/
 7+ *
 8+ * Copyright (c) 2009 Peter Nederlof
 9+ * Licensed under the LGPL license
 10+ * http://creativecommons.org/licenses/LGPL/2.1
 11+ */
 12+window.CSSHover=(function(){var m=/(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;var n=/(.*?)\:(hover|active|focus)/i;var o=/[^:]+:([a-z\-]+).*/i;var p=/(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;var q=/\.([a-z0-9_\-]*on(hover|active|focus))/i;var s=/msie (5|6|7)/i;var t=/backcompat/i;var u={index:0,list:['text-kashida','text-kashida-space','text-justify'],get:function(){return this.list[(this.index++)%this.list.length]}};var v=function(c){return c.replace(/-(.)/mg,function(a,b){return b.toUpperCase()})};var w={elements:[],callbacks:{},init:function(){if(!s.test(navigator.userAgent)&&!t.test(window.document.compatMode)){return}var a=window.document.styleSheets,l=a.length;for(var i=0;i<l;i++){this.parseStylesheet(a[i])}},parseStylesheet:function(a){if(a.imports){try{var b=a.imports;var l=b.length;for(var i=0;i<l;i++){this.parseStylesheet(a.imports[i])}}catch(securityException){}}try{var c=a.rules;var r=c.length;for(var j=0;j<r;j++){this.parseCSSRule(c[j],a)}}catch(someException){}},parseCSSRule:function(a,b){var c=a.selectorText;if(m.test(c)){var d=a.style.cssText;var e=n.exec(c)[1];var f=c.replace(o,'on$1');var g=c.replace(p,'.$2'+f);var h=q.exec(g)[1];var i=e+h;if(!this.callbacks[i]){var j=u.get();var k=v(j);b.addRule(e,j+':expression(CSSHover(this, "'+f+'", "'+h+'", "'+k+'"))');this.callbacks[i]=true}b.addRule(g,d)}},patch:function(a,b,c,d){try{var f=a.parentNode.currentStyle[d];a.style[d]=f}catch(e){a.runtimeStyle[d]=''}if(!a.csshover){a.csshover=[]}if(!a.csshover[c]){a.csshover[c]=true;var g=new CSSHoverElement(a,b,c);this.elements.push(g)}return b},unload:function(){try{var l=this.elements.length;for(var i=0;i<l;i++){this.elements[i].unload()}this.elements=[];this.callbacks={}}catch(e){}}};var x={onhover:{activator:'onmouseenter',deactivator:'onmouseleave'},onactive:{activator:'onmousedown',deactivator:'onmouseup'},onfocus:{activator:'onfocus',deactivator:'onblur'}};function CSSHoverElement(a,b,c){this.node=a;this.type=b;var d=new RegExp('(^|\\s)'+c+'(\\s|$)','g');this.activator=function(){a.className+=' '+c};this.deactivator=function(){a.className=a.className.replace(d,' ')};a.attachEvent(x[b].activator,this.activator);a.attachEvent(x[b].deactivator,this.deactivator)}CSSHoverElement.prototype={unload:function(){this.node.detachEvent(x[this.type].activator,this.activator);this.node.detachEvent(x[this.type].deactivator,this.deactivator);this.activator=null;this.deactivator=null;this.node=null;this.type=null}};window.attachEvent('onbeforeunload',function(){w.unload()});return function(a,b,c,d){if(a){return w.patch(a,b,c,d)}else{w.init()}}})();
 13+</script>
Property changes on: trunk/extensions/skins/Synagonism/skins/synagonism/csshover.min.htc
___________________________________________________________________
Added: svn:eol-style
1414 + native

Status & tagging log