├── .gitignore ├── LICENSE ├── README.md ├── additional ├── UnicodeData.txt └── unicode-license.txt ├── generate-maps.sh ├── haxelib.json ├── org └── zamedev │ └── lib │ ├── Transliteration.hx │ ├── Utf8Ext.hx │ └── internal │ ├── CaseMapsGenerator.hx │ ├── TransliterationInternalBe.hx │ ├── TransliterationInternalRu.hx │ └── Utf8ExtInternal.hx ├── publish-release.sh ├── test ├── TestSuite.hx ├── internal │ ├── EthalonCaseMapsGenerator.hx │ └── Utf8ExtInternalEthalon.hx ├── lix-haxe3 │ ├── .haxerc │ └── haxe_libraries │ │ ├── hashlink.hxml │ │ ├── hxcpp.hxml │ │ ├── hxcs.hxml │ │ ├── hxjava.hxml │ │ └── utest.hxml ├── lix-haxe4 │ ├── .haxerc │ └── haxe_libraries │ │ ├── hashlink.hxml │ │ ├── hxcpp.hxml │ │ ├── hxcs.hxml │ │ ├── hxjava.hxml │ │ ├── utest.hxml │ │ └── zame-miscutils.hxml └── test │ ├── CaseMapsGeneratorTest.hx │ ├── TransliterationTest.hx │ └── Utf8ExtTest.hx └── unit-test.sh /.gitignore: -------------------------------------------------------------------------------- 1 | /.build 2 | /.haxerc 3 | /haxe_libraries 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Viachaslau Tratsiak 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # String utils for Haxe 2 | 3 | - Utf8Ext 4 | - Transliteration 5 | 6 | [About](http://blog.zame-dev.org/5-more-things-i-dont-like-in-haxe-and-how-to-fix-them/) 7 | 8 | ## Installation 9 | 10 | ``` 11 | haxelib git zame-stringutils https://github.com/restorer/zame-haxe-stringutils.git 12 | ``` 13 | 14 | ### Utf8Ext 15 | 16 | Haxe have excellent `haxe.Utf8` class, which allows us to work with utf-8 in a cross-platform way. 17 | 18 | But what about cross-platform `toLowerCase()` or `toUpperCase()`? What regular expression should I write to replace all non-letters (including unicode ones) with, say, spaces? 19 | 20 | `Utf8Ext` will take care about this on `neko`, `cpp` and `php`, with fallback to native implementation for other platforms. 21 | 22 | - Use `Utf8Ext.toLoweCase()` to convert utf-8 string to lover case, across all platforms. 23 | - Use `Utf8Ext.toUpperCase()` to convert utf-8 string to upper case, across all platforms. 24 | - Use `Utf8Ext.getUnicodeRe()` to get regular expression that matches all characters, including unicode (like `/[\p{L}]/` in PCRE). 25 | - Use `Utf8Ext.getUnicodeRe("^")` to get regular expression that matches all non-characters (like `/[\P{L}]/` in PCRE). 26 | - `Utf8Ext.getUnicodeRe("0-9")` will match numbers and characters, while `Utf8Ext.getUnicodeRe("^0-9")` will match anything, except numbers and characters. 27 | 28 | ### Transliteration 29 | 30 | Allows you to generate cool-looking SEO-friendly URL from string on belarusian or russian language. 31 | 32 | ```haxe 33 | trace(Transliteration.be("Уладзімір Караткевіч - Хрыстос Прызямліўся Ў Гародні")); 34 | ``` 35 | 36 | will give you `uladzimir-karatkievich-khrystos-pryziamliwsia-w-harodni`, and 37 | 38 | ```haxe 39 | trace(Transliteration.ru("Съешь же ещё этих мягких французских булок да выпей чаю")); 40 | ``` 41 | 42 | will give you `s-esh-zhe-eschyo-ehtikh-myagkikh-francuzskikh-bulok-da-vypej-chaju`. 43 | 44 | ## Product support 45 | 46 | This library is finished. Later I have plant to merge several smaller libraries into bigger one. 47 | 48 | | Feature | Support status | 49 | |---|---| 50 | | New features | No | 51 | | Non-critical bugfixes | No | 52 | | Critical bugfixes | Yes | 53 | | Pull requests | Accepted (after review) | 54 | | Issues | Monitored, but if you want to change something - submit a pull request | 55 | | Estimated end-of-life | Up to 2017 (new library will be created later) | 56 | 57 | ## Runnint tests 58 | 59 | ``` 60 | cd tests 61 | haxelib run munit test 62 | ``` 63 | 64 | To run tests for specific target: 65 | 66 | - `haxelib run munit test -neko` 67 | - `haxelib run munit test -cpp` 68 | - `haxelib run munit test -js` 69 | - `haxelib run munit test -as3` 70 | 71 | ### Roadmap for future 72 | 73 | - [x] Add russian language support to Transliteration class 74 | -------------------------------------------------------------------------------- /additional/unicode-license.txt: -------------------------------------------------------------------------------- 1 | UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE 2 | 3 | Unicode Data Files include all data files under the directories 4 | http://www.unicode.org/Public/, http://www.unicode.org/reports/, and 5 | http://www.unicode.org/cldr/data/. Unicode Data Files do not include PDF 6 | online code charts under the directory http://www.unicode.org/Public/. 7 | Software includes any source code published in the Unicode Standard or under 8 | the directories http://www.unicode.org/Public/, 9 | http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/. 10 | 11 | NOTICE TO USER: Carefully read the following legal agreement. BY 12 | DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES 13 | ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND 14 | AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF 15 | YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA 16 | FILES OR SOFTWARE. 17 | 18 | COPYRIGHT AND PERMISSION NOTICE 19 | 20 | Copyright © 1991-2015 Unicode, Inc. All rights reserved. Distributed under 21 | the Terms of Use in http://www.unicode.org/copyright.html. 22 | 23 | Permission is hereby granted, free of charge, to any person obtaining a 24 | copy of the Unicode data files and any associated documentation (the "Data 25 | Files") or Unicode software and any associated documentation (the "Software") 26 | to deal in the Data Files or Software without restriction, including without 27 | limitation the rights to use, copy, modify, merge, publish, distribute, and/or 28 | sell copies of the Data Files or Software, and to permit persons to whom the 29 | Data Files or Software are furnished to do so, provided that (a) the above 30 | copyright notice(s) and this permission notice appear with all copies of the 31 | Data Files or Software, (b) both the above copyright notice(s) and this 32 | permission notice appear in associated documentation, and (c) there is clear 33 | notice in each modified Data File or in the Software as well as in the 34 | documentation associated with the Data File(s) or Software that the data or 35 | software has been modified. 36 | 37 | THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY 38 | KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 39 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD 40 | PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN 41 | THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL 42 | DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 43 | PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 44 | ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE 45 | DATA FILES OR SOFTWARE. 46 | 47 | Except as contained in this notice, the name of a copyright holder shall 48 | not be used in advertising or otherwise to promote the sale, use or other 49 | dealings in these Data Files or Software without prior written authorization 50 | of the copyright holder. 51 | -------------------------------------------------------------------------------- /generate-maps.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd $(dirname "$0") 4 | 5 | cleanup () { 6 | [ -L haxe_libraries ] && rm haxe_libraries 7 | [ -L .haxerc ] && rm .haxerc 8 | } 9 | 10 | setup_lix () { 11 | cleanup 12 | 13 | ln -s "test/lix-$1/haxe_libraries" haxe_libraries 14 | ln -s "test/lix-$1/.haxerc" .haxerc 15 | } 16 | 17 | setup_lix haxe4 18 | haxe -lib zame-miscutils -cp ./test -main internal.EthalonCaseMapsGenerator --interp 19 | haxe -lib zame-miscutils -cp . -main org.zamedev.lib.internal.CaseMapsGenerator --interp 20 | cleanup 21 | -------------------------------------------------------------------------------- /haxelib.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "zame-stringutils", 3 | "url": "https://github.com/restorer/zame-haxe-stringutils", 4 | "license": "MIT", 5 | "tags": [], 6 | "description": "String utils for Haxe", 7 | "version": "1.0.0", 8 | "releasenote": "Initial release", 9 | "contributors": [ 10 | "restorer" 11 | ] 12 | } -------------------------------------------------------------------------------- /org/zamedev/lib/Transliteration.hx: -------------------------------------------------------------------------------- 1 | package org.zamedev.lib; 2 | 3 | import org.zamedev.lib.internal.TransliterationInternalBe; 4 | import org.zamedev.lib.internal.TransliterationInternalRu; 5 | 6 | #if (haxe_ver < "4.0.0") 7 | import haxe.Utf8; 8 | #elseif neko 9 | import neko.Utf8; 10 | #end 11 | 12 | class Transliteration { 13 | public static var mapNot : Map; 14 | public static var mapBe : Map; 15 | public static var mapRu : Map; 16 | 17 | static function __init__() { 18 | mapNot = new Map(); 19 | 20 | #if ((haxe_ver < "4.0.0") || neko) 21 | Utf8.iter("0123456789ABCDEFJHIJKLMNOPQRSTUVWXYZabcdefjhijklmnopqrstuvwxyz", function(v : Int) : Void { 22 | mapNot[v] = true; 23 | }); 24 | #else 25 | for (v in ("0123456789ABCDEFJHIJKLMNOPQRSTUVWXYZabcdefjhijklmnopqrstuvwxyz" : UnicodeString)) { 26 | mapNot[v] = true; 27 | } 28 | #end 29 | 30 | mapBe = new Map(); 31 | TransliterationInternalBe.fillMap(mapBe); 32 | 33 | mapRu = new Map(); 34 | TransliterationInternalRu.fillMap(mapRu); 35 | } 36 | 37 | public static function transliterate(s : String, map : Map) : String { 38 | var r = new StringBuf(); 39 | 40 | #if ((haxe_ver < "4.0.0") || neko) 41 | Utf8.iter(s, function(v : Int) : Void { 42 | r.add(map.exists(v) ? map[v] : (mapNot.exists(v) ? String.fromCharCode(v) : "-")); 43 | }); 44 | #else 45 | for (v in (s : UnicodeString)) { 46 | r.add(map.exists(v) ? map[v] : (mapNot.exists(v) ? String.fromCharCode(v) : "-")); 47 | } 48 | #end 49 | 50 | var t = r.toString().toLowerCase(); 51 | 52 | t = ~/\-{2,}/g.replace(t, "-"); 53 | t = ~/^\-\-*/.replace(t, ""); 54 | t = ~/\-\-*$/.replace(t, ""); 55 | 56 | return t; 57 | } 58 | 59 | public static function be(s : String) : String { 60 | return transliterate(s, mapBe); 61 | } 62 | 63 | public static function ru(s : String) : String { 64 | return transliterate(s, mapRu); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /org/zamedev/lib/Utf8Ext.hx: -------------------------------------------------------------------------------- 1 | package org.zamedev.lib; 2 | 3 | #if (haxe_ver < "4.0.0") 4 | import haxe.Utf8; 5 | import org.zamedev.lib.internal.Utf8ExtInternal; 6 | #elseif neko 7 | import neko.Utf8; 8 | import org.zamedev.lib.internal.Utf8ExtInternal; 9 | #end 10 | 11 | class Utf8Ext { 12 | private static var charsRe : String; 13 | 14 | #if ((haxe_ver < "4.0.0") || neko || lua) 15 | #if (neko || php || cpp || lua) 16 | private static var lcaseMap : Map; 17 | private static var ucaseMap : Map; 18 | #end 19 | #end 20 | 21 | static function __init__() { 22 | charsRe = "\u0041-\u005A\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1" 23 | + "\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5" 24 | + "\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F" 25 | + "\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA" 26 | + "\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950" 27 | + "\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9" 28 | + "\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33" 29 | + "\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2" 30 | + "\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33" 31 | + "\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C" 32 | + "\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33" 33 | + "\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD" 34 | + "\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F" 35 | + "\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84" 36 | + "\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3" 37 | + "\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055" 38 | + "\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248" 39 | + "\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0" 40 | + "\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F" 41 | + "\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3" 42 | + "\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB" 43 | + "\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5" 44 | + "\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D" 45 | + "\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4" 46 | + "\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107" 47 | + "\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183" 48 | + "\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F" 49 | + "\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6" 50 | + "\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF" 51 | + "\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD" 52 | + "\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E" 53 | + "\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3" 54 | + "\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B" 55 | + "\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4" 56 | + "\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6" 57 | + "\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E" 58 | + "\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC" 59 | + "\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC"; 60 | 61 | #if ((haxe_ver < "4.0.0") || neko || lua) 62 | #if (neko || php || cpp || lua) 63 | lcaseMap = new Map(); 64 | ucaseMap = new Map(); 65 | 66 | Utf8ExtInternal.fillUpperToLowerMap(lcaseMap); 67 | Utf8ExtInternal.fillLowerToUpperMap(ucaseMap); 68 | #end 69 | #end 70 | } 71 | 72 | public static function toLowerCase(s : String) : String { 73 | #if ((haxe_ver < "4.0.0") || neko || lua) 74 | #if (neko || php || cpp || lua) 75 | var r = new Utf8(); 76 | 77 | Utf8.iter(s, function(v : Int) : Void { 78 | r.addChar(lcaseMap.exists(v) ? lcaseMap[v] : v); 79 | }); 80 | 81 | return r.toString(); 82 | #else 83 | return s.toLowerCase(); 84 | #end 85 | #else 86 | return s.toLowerCase(); 87 | #end 88 | } 89 | 90 | public static function toUpperCase(s : String) : String { 91 | #if ((haxe_ver < "4.0.0") || neko || lua) 92 | #if (neko || php || cpp || lua) 93 | var r = new Utf8(); 94 | 95 | Utf8.iter(s, function(v : Int) : Void { 96 | r.addChar(ucaseMap.exists(v) ? ucaseMap[v] : v); 97 | }); 98 | 99 | return r.toString(); 100 | #else 101 | return s.toUpperCase(); 102 | #end 103 | #else 104 | return s.toUpperCase(); 105 | #end 106 | } 107 | 108 | public static function getUnicodeRe(prepend : String = "") : EReg { 109 | return new EReg("[" + prepend + charsRe + "]", "gu"); 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /org/zamedev/lib/internal/CaseMapsGenerator.hx: -------------------------------------------------------------------------------- 1 | package org.zamedev.lib.internal; 2 | 3 | import haxe.io.Eof; 4 | import haxe.io.Path; 5 | import sys.io.File; 6 | import org.zamedev.lib.ds.LinkedMap; 7 | 8 | #if neko 9 | import neko.Utf8; 10 | #end 11 | 12 | using StringTools; 13 | 14 | /** 15 | * Map generator for Utf8ExtInternal 16 | * Can generate from ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt 17 | * 18 | * Reference - ftp://ftp.unicode.org/Public/3.2-Update/UnicodeData-3.2.0.html 19 | * 20 | * Thanks to https://github.com/RblSb for code generator optimizing ideas 21 | */ 22 | class CaseMapsGenerator { 23 | private static inline var IDX_CODE_POINT : Int = 0; 24 | private static inline var IDX_CHARACTER_NAME : Int = 1; 25 | private static inline var IDX_GENERAL_CATEGORY : Int = 2; 26 | // Canonical Combining Classes = 3 27 | // Bidirectional Category = 4 28 | private static inline var IDX_CHARACTER_DECOMPOSITION_MAPPING : Int = 5; 29 | // Decimal digit value = 6 30 | // Digit value = 7 31 | // Numeric value = 8 32 | // Mirrored = 9 33 | // Unicode 1.0 Name = 10 34 | // 10646 comment field = 11 35 | private static inline var IDX_UPPERCASE_MAPPING : Int = 12; 36 | private static inline var IDX_LOWERCASE_MAPPING : Int = 13; 37 | // Titlecase Mapping = 14 38 | private static inline var IDX_LAST : Int = 15; 39 | 40 | private static var unicodeMap : LinkedMap>; 41 | private static var seqFirstCodePoint : Int = -1; 42 | private static var seqFirstMappedCodePoint : Int = -1; 43 | private static var seqFirstCharacterName : String = null; 44 | private static var seqLastCodePoint : Int = -1; 45 | private static var seqLastMappedCodePoint : Int = -1; 46 | private static var seqLastCharacterName : String = null; 47 | private static var seqStep : Int = 0; 48 | private static var seqLength : Int = 0; 49 | private static var linesGenerated : Int = 0; 50 | 51 | macro private static function resolveThisPath() { 52 | return macro $v{ haxe.macro.Context.resolvePath("org/zamedev/lib/internal/CaseMapsGenerator.hx") }; 53 | } 54 | 55 | private static function resolveThisDir() : String { 56 | return Path.directory(resolveThisPath()); 57 | } 58 | 59 | private static function readUnicodeData() : Void { 60 | var fi = File.read("additional/UnicodeData.txt", true); 61 | unicodeMap = new LinkedMap>(); 62 | 63 | while (true) { 64 | var row : Array; 65 | 66 | try { 67 | row = fi.readLine().split(";"); 68 | } catch (ex : Eof) { 69 | break; 70 | } 71 | 72 | if (row.length < IDX_LAST || (row[IDX_GENERAL_CATEGORY] != "Lu" && row[IDX_GENERAL_CATEGORY] != "Ll")) { 73 | continue; 74 | } 75 | 76 | unicodeMap[row[IDX_CODE_POINT]] = row; 77 | } 78 | 79 | fi.close(); 80 | } 81 | 82 | private static function initSequence(codePoint : Int, mappedCodePoint : Int, characterName : String) : Void { 83 | seqFirstCodePoint = codePoint; 84 | seqFirstMappedCodePoint = mappedCodePoint; 85 | seqFirstCharacterName = characterName; 86 | 87 | seqLastCodePoint = codePoint; 88 | seqLastMappedCodePoint = mappedCodePoint; 89 | seqLastCharacterName = characterName; 90 | 91 | seqStep = 0; 92 | seqLength = 1; 93 | } 94 | 95 | private static function appendCodePoint(sb : StringBuf, codePoint : Int) : Void { 96 | #if neko 97 | var r = new Utf8(); 98 | r.addChar(codePoint); 99 | sb.add(r.toString()); 100 | #else 101 | sb.add(String.fromCharCode(codePoint)); 102 | #end 103 | } 104 | 105 | private static function appendSequence(sb : StringBuf) : Void { 106 | if (seqLength <= 0) { 107 | return; 108 | } 109 | 110 | var codePointStr = "0x" + StringTools.hex(seqFirstCodePoint); 111 | var mappedCodePointStr = "0x" + StringTools.hex(seqFirstMappedCodePoint); 112 | 113 | sb.add("\t\t"); 114 | 115 | if (seqLength == 1) { 116 | sb.add('map[${codePointStr}] = ${mappedCodePointStr};'); 117 | } else if (seqStep == 1) { 118 | sb.add('for (i in 0 ... ${seqLength}) { map[${codePointStr} + i] = ${mappedCodePointStr} + i; }'); 119 | } else { // seqStep = 2 120 | sb.add('for (i in 0 ... ${seqLength}) { map[${codePointStr} + i + i] = ${mappedCodePointStr} + i + i; }'); 121 | } 122 | 123 | sb.add(" // "); 124 | appendCodePoint(sb, seqFirstCodePoint); 125 | 126 | if (seqLength > 1) { 127 | sb.add(" - "); 128 | appendCodePoint(sb, seqLastCodePoint); 129 | } 130 | 131 | sb.add(" => "); 132 | appendCodePoint(sb, seqFirstMappedCodePoint); 133 | 134 | if (seqLength > 1) { 135 | sb.add(" - "); 136 | appendCodePoint(sb, seqLastMappedCodePoint); 137 | } 138 | 139 | sb.add(' (${seqFirstCharacterName}'); 140 | 141 | if (seqLength > 1) { 142 | sb.add(' - ${seqLastCharacterName}'); 143 | } 144 | 145 | sb.add(")\n"); 146 | linesGenerated++; 147 | } 148 | 149 | private static function appendMapperFunc(sb : StringBuf, funcName : String, generalCategory : String, mappingIdx : Int) : Void { 150 | println('Generating ${funcName}...'); 151 | sb.add('\tpublic static function ${funcName}(map : Map) : Void {\n'); 152 | 153 | seqFirstCodePoint = -1; 154 | linesGenerated = 0; 155 | 156 | for (codePoint in unicodeMap.keys()) { 157 | var row : Array = unicodeMap[codePoint]; 158 | 159 | if (row[IDX_GENERAL_CATEGORY] != generalCategory) { 160 | continue; 161 | } 162 | 163 | while (row != null && row[mappingIdx] == "" && row[IDX_CHARACTER_DECOMPOSITION_MAPPING] != "") { 164 | row = unicodeMap[row[IDX_CHARACTER_DECOMPOSITION_MAPPING].split(" ")[0]]; 165 | } 166 | 167 | if (row == null || row[mappingIdx] == "") { 168 | continue; 169 | } 170 | 171 | var codePoint : Int = Std.parseInt('0x' + codePoint); 172 | var mappedCodePoint : Int = Std.parseInt('0x' + row[mappingIdx]); 173 | var characterName : String = row[IDX_CHARACTER_NAME]; 174 | 175 | if (seqFirstCodePoint == -1) { 176 | initSequence(codePoint, mappedCodePoint, characterName); 177 | continue; 178 | } 179 | 180 | var step = codePoint - seqLastCodePoint; 181 | 182 | if ((step != 1 && step != 2) 183 | || (mappedCodePoint - seqLastMappedCodePoint != step) 184 | || (seqStep != 0 && seqStep != step) 185 | ) { 186 | appendSequence(sb); 187 | initSequence(codePoint, mappedCodePoint, characterName); 188 | continue; 189 | } 190 | 191 | seqStep = step; 192 | seqLastCodePoint = codePoint; 193 | seqLastMappedCodePoint = mappedCodePoint; 194 | seqLastCharacterName = characterName; 195 | seqLength++; 196 | } 197 | 198 | appendSequence(sb); 199 | sb.add("\t}\n"); 200 | 201 | println("Lines: " + linesGenerated); 202 | } 203 | 204 | public static function main() : Void { 205 | println("Preparing..."); 206 | 207 | readUnicodeData(); 208 | 209 | var sb = new StringBuf(); 210 | 211 | sb.add("package org.zamedev.lib.internal;\n"); 212 | sb.add("\n"); 213 | sb.add("// Use org.zamedev.lib.internal.CaseMapsGenerator to generate this file.\n"); 214 | sb.add("\n"); 215 | sb.add("class Utf8ExtInternal {\n"); 216 | appendMapperFunc(sb, "fillUpperToLowerMap", "Lu", IDX_LOWERCASE_MAPPING); 217 | sb.add("\n"); 218 | appendMapperFunc(sb, "fillLowerToUpperMap", "Ll", IDX_UPPERCASE_MAPPING); 219 | sb.add("}\n"); 220 | 221 | println("Writing result file..."); 222 | File.saveContent(resolveThisDir() + "/Utf8ExtInternal.hx" , sb.toString()); 223 | 224 | println("Done"); 225 | } 226 | 227 | private static function println(message : String) : Void { 228 | #if sys 229 | Sys.print(message + "\n"); 230 | #elseif neko 231 | neko.Lib.println(message); 232 | #else 233 | trace(message); 234 | #end 235 | } 236 | } 237 | -------------------------------------------------------------------------------- /org/zamedev/lib/internal/TransliterationInternalBe.hx: -------------------------------------------------------------------------------- 1 | package org.zamedev.lib.internal; 2 | 3 | class TransliterationInternalBe { 4 | public static function fillMap(map : Map) : Void { 5 | map[0x0410] = "A"; // А 6 | map[0x0430] = "a"; // а 7 | map[0x0411] = "B"; // Б 8 | map[0x0431] = "b"; // б 9 | map[0x0412] = "V"; // В 10 | map[0x0432] = "v"; // в 11 | map[0x0413] = "H"; // Г 12 | map[0x0433] = "h"; // г 13 | map[0x0414] = "D"; // Д 14 | map[0x0434] = "d"; // д 15 | map[0x0415] = "Je"; // Е 16 | map[0x0435] = "ie"; // е 17 | map[0x0401] = "Jo"; // Ё 18 | map[0x0451] = "io"; // ё 19 | map[0x0416] = "Zh"; // Ж 20 | map[0x0436] = "zh"; // ж 21 | map[0x0417] = "Z"; // З 22 | map[0x0437] = "z"; // з 23 | map[0x0406] = "I"; // І 24 | map[0x0456] = "i"; // і 25 | map[0x0419] = "J"; // Й 26 | map[0x0439] = "j"; // й 27 | map[0x041A] = "K"; // К 28 | map[0x043A] = "k"; // к 29 | map[0x041B] = "L"; // Л 30 | map[0x043B] = "l"; // л 31 | map[0x041C] = "M"; // М 32 | map[0x043C] = "m"; // м 33 | map[0x041D] = "N"; // Н 34 | map[0x043D] = "n"; // н 35 | map[0x041E] = "O"; // О 36 | map[0x043E] = "o"; // о 37 | map[0x041F] = "P"; // П 38 | map[0x043F] = "p"; // п 39 | map[0x0420] = "R"; // Р 40 | map[0x0440] = "r"; // р 41 | map[0x0421] = "S"; // С 42 | map[0x0441] = "s"; // с 43 | map[0x0422] = "T"; // Т 44 | map[0x0442] = "t"; // т 45 | map[0x0423] = "U"; // У 46 | map[0x0443] = "u"; // у 47 | map[0x040E] = "W"; // Ў 48 | map[0x045E] = "w"; // ў 49 | map[0x0424] = "F"; // Ф 50 | map[0x0444] = "f"; // ф 51 | map[0x0425] = "Kh"; // Х 52 | map[0x0445] = "kh"; // х 53 | map[0x0426] = "Ts"; // Ц 54 | map[0x0446] = "ts"; // ц 55 | map[0x0427] = "Ch"; // Ч 56 | map[0x0447] = "ch"; // ч 57 | map[0x0428] = "Sh"; // Ш 58 | map[0x0448] = "sh"; // ш 59 | map[0x042B] = "Y"; // Ы 60 | map[0x044B] = "y"; // ы 61 | map[0x042D] = "E"; // Э 62 | map[0x044D] = "e"; // э 63 | map[0x042E] = "Ju"; // Ю 64 | map[0x044E] = "iu"; // ю 65 | map[0x042F] = "Ja"; // Я 66 | map[0x044F] = "ia"; // я 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /org/zamedev/lib/internal/TransliterationInternalRu.hx: -------------------------------------------------------------------------------- 1 | package org.zamedev.lib.internal; 2 | 3 | class TransliterationInternalRu { 4 | // Translit 5 | public static function fillMap(map : Map) : Void { 6 | map[0x0410] = "A"; // А 7 | map[0x0430] = "a"; // а 8 | map[0x0411] = "B"; // Б 9 | map[0x0431] = "b"; // б 10 | map[0x0412] = "V"; // В 11 | map[0x0432] = "v"; // в 12 | map[0x0413] = "G"; // Г 13 | map[0x0433] = "g"; // г 14 | map[0x0414] = "D"; // Д 15 | map[0x0434] = "d"; // д 16 | map[0x0415] = "E"; // Е 17 | map[0x0435] = "e"; // е 18 | map[0x0401] = "Yo"; // Ё 19 | map[0x0451] = "yo"; // ё 20 | map[0x0416] = "Zh"; // Ж 21 | map[0x0436] = "zh"; // ж 22 | map[0x0417] = "Z"; // З 23 | map[0x0437] = "z"; // з 24 | map[0x0418] = "I"; // И 25 | map[0x0438] = "i"; // и 26 | map[0x0419] = "J"; // Й 27 | map[0x0439] = "j"; // й 28 | map[0x041A] = "K"; // К 29 | map[0x043A] = "k"; // к 30 | map[0x041B] = "L"; // Л 31 | map[0x043B] = "l"; // л 32 | map[0x041C] = "M"; // М 33 | map[0x043C] = "m"; // м 34 | map[0x041D] = "N"; // Н 35 | map[0x043D] = "n"; // н 36 | map[0x041E] = "O"; // О 37 | map[0x043E] = "o"; // о 38 | map[0x041F] = "P"; // П 39 | map[0x043F] = "p"; // п 40 | map[0x0420] = "R"; // Р 41 | map[0x0440] = "r"; // р 42 | map[0x0421] = "S"; // С 43 | map[0x0441] = "s"; // с 44 | map[0x0422] = "T"; // Т 45 | map[0x0442] = "t"; // т 46 | map[0x0423] = "U"; // У 47 | map[0x0443] = "u"; // у 48 | map[0x0424] = "F"; // Ф 49 | map[0x0444] = "f"; // ф 50 | map[0x0425] = "Kh"; // Х 51 | map[0x0445] = "kh"; // х 52 | map[0x0426] = "C"; // Ц 53 | map[0x0446] = "c"; // ц 54 | map[0x0427] = "Ch"; // Ч 55 | map[0x0447] = "ch"; // ч 56 | map[0x0428] = "Sh"; // Ш 57 | map[0x0448] = "sh"; // ш 58 | map[0x0429] = "Sch"; // Щ 59 | map[0x0449] = "sch"; // щ 60 | map[0x042B] = "Y"; // Ы 61 | map[0x044B] = "y"; // ы 62 | map[0x042D] = "Eh"; // Э 63 | map[0x044D] = "eh"; // э 64 | map[0x042E] = "Ju"; // Ю 65 | map[0x044E] = "ju"; // ю 66 | map[0x042F] = "Ya"; // Я 67 | map[0x044F] = "ya"; // я 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /org/zamedev/lib/internal/Utf8ExtInternal.hx: -------------------------------------------------------------------------------- 1 | package org.zamedev.lib.internal; 2 | 3 | // Use org.zamedev.lib.internal.CaseMapsGenerator to generate this file. 4 | 5 | class Utf8ExtInternal { 6 | public static function fillUpperToLowerMap(map : Map) : Void { 7 | for (i in 0 ... 26) { map[0x41 + i] = 0x61 + i; } // A - Z => a - z (LATIN CAPITAL LETTER A - LATIN CAPITAL LETTER Z) 8 | for (i in 0 ... 23) { map[0xC0 + i] = 0xE0 + i; } // À - Ö => à - ö (LATIN CAPITAL LETTER A WITH GRAVE - LATIN CAPITAL LETTER O WITH DIAERESIS) 9 | for (i in 0 ... 7) { map[0xD8 + i] = 0xF8 + i; } // Ø - Þ => ø - þ (LATIN CAPITAL LETTER O WITH STROKE - LATIN CAPITAL LETTER THORN) 10 | for (i in 0 ... 24) { map[0x100 + i + i] = 0x101 + i + i; } // Ā - Į => ā - į (LATIN CAPITAL LETTER A WITH MACRON - LATIN CAPITAL LETTER I WITH OGONEK) 11 | map[0x130] = 0x69; // İ => i (LATIN CAPITAL LETTER I WITH DOT ABOVE) 12 | for (i in 0 ... 3) { map[0x132 + i + i] = 0x133 + i + i; } // IJ - Ķ => ij - ķ (LATIN CAPITAL LIGATURE IJ - LATIN CAPITAL LETTER K WITH CEDILLA) 13 | for (i in 0 ... 8) { map[0x139 + i + i] = 0x13A + i + i; } // Ĺ - Ň => ĺ - ň (LATIN CAPITAL LETTER L WITH ACUTE - LATIN CAPITAL LETTER N WITH CARON) 14 | for (i in 0 ... 23) { map[0x14A + i + i] = 0x14B + i + i; } // Ŋ - Ŷ => ŋ - ŷ (LATIN CAPITAL LETTER ENG - LATIN CAPITAL LETTER Y WITH CIRCUMFLEX) 15 | map[0x178] = 0xFF; // Ÿ => ÿ (LATIN CAPITAL LETTER Y WITH DIAERESIS) 16 | for (i in 0 ... 3) { map[0x179 + i + i] = 0x17A + i + i; } // Ź - Ž => ź - ž (LATIN CAPITAL LETTER Z WITH ACUTE - LATIN CAPITAL LETTER Z WITH CARON) 17 | map[0x181] = 0x253; // Ɓ => ɓ (LATIN CAPITAL LETTER B WITH HOOK) 18 | for (i in 0 ... 2) { map[0x182 + i + i] = 0x183 + i + i; } // Ƃ - Ƅ => ƃ - ƅ (LATIN CAPITAL LETTER B WITH TOPBAR - LATIN CAPITAL LETTER TONE SIX) 19 | map[0x186] = 0x254; // Ɔ => ɔ (LATIN CAPITAL LETTER OPEN O) 20 | map[0x187] = 0x188; // Ƈ => ƈ (LATIN CAPITAL LETTER C WITH HOOK) 21 | for (i in 0 ... 2) { map[0x189 + i] = 0x256 + i; } // Ɖ - Ɗ => ɖ - ɗ (LATIN CAPITAL LETTER AFRICAN D - LATIN CAPITAL LETTER D WITH HOOK) 22 | map[0x18B] = 0x18C; // Ƌ => ƌ (LATIN CAPITAL LETTER D WITH TOPBAR) 23 | map[0x18E] = 0x1DD; // Ǝ => ǝ (LATIN CAPITAL LETTER REVERSED E) 24 | map[0x18F] = 0x259; // Ə => ə (LATIN CAPITAL LETTER SCHWA) 25 | map[0x190] = 0x25B; // Ɛ => ɛ (LATIN CAPITAL LETTER OPEN E) 26 | map[0x191] = 0x192; // Ƒ => ƒ (LATIN CAPITAL LETTER F WITH HOOK) 27 | map[0x193] = 0x260; // Ɠ => ɠ (LATIN CAPITAL LETTER G WITH HOOK) 28 | map[0x194] = 0x263; // Ɣ => ɣ (LATIN CAPITAL LETTER GAMMA) 29 | map[0x196] = 0x269; // Ɩ => ɩ (LATIN CAPITAL LETTER IOTA) 30 | map[0x197] = 0x268; // Ɨ => ɨ (LATIN CAPITAL LETTER I WITH STROKE) 31 | map[0x198] = 0x199; // Ƙ => ƙ (LATIN CAPITAL LETTER K WITH HOOK) 32 | map[0x19C] = 0x26F; // Ɯ => ɯ (LATIN CAPITAL LETTER TURNED M) 33 | map[0x19D] = 0x272; // Ɲ => ɲ (LATIN CAPITAL LETTER N WITH LEFT HOOK) 34 | map[0x19F] = 0x275; // Ɵ => ɵ (LATIN CAPITAL LETTER O WITH MIDDLE TILDE) 35 | for (i in 0 ... 3) { map[0x1A0 + i + i] = 0x1A1 + i + i; } // Ơ - Ƥ => ơ - ƥ (LATIN CAPITAL LETTER O WITH HORN - LATIN CAPITAL LETTER P WITH HOOK) 36 | map[0x1A6] = 0x280; // Ʀ => ʀ (LATIN LETTER YR) 37 | map[0x1A7] = 0x1A8; // Ƨ => ƨ (LATIN CAPITAL LETTER TONE TWO) 38 | map[0x1A9] = 0x283; // Ʃ => ʃ (LATIN CAPITAL LETTER ESH) 39 | map[0x1AC] = 0x1AD; // Ƭ => ƭ (LATIN CAPITAL LETTER T WITH HOOK) 40 | map[0x1AE] = 0x288; // Ʈ => ʈ (LATIN CAPITAL LETTER T WITH RETROFLEX HOOK) 41 | map[0x1AF] = 0x1B0; // Ư => ư (LATIN CAPITAL LETTER U WITH HORN) 42 | for (i in 0 ... 2) { map[0x1B1 + i] = 0x28A + i; } // Ʊ - Ʋ => ʊ - ʋ (LATIN CAPITAL LETTER UPSILON - LATIN CAPITAL LETTER V WITH HOOK) 43 | for (i in 0 ... 2) { map[0x1B3 + i + i] = 0x1B4 + i + i; } // Ƴ - Ƶ => ƴ - ƶ (LATIN CAPITAL LETTER Y WITH HOOK - LATIN CAPITAL LETTER Z WITH STROKE) 44 | map[0x1B7] = 0x292; // Ʒ => ʒ (LATIN CAPITAL LETTER EZH) 45 | map[0x1B8] = 0x1B9; // Ƹ => ƹ (LATIN CAPITAL LETTER EZH REVERSED) 46 | map[0x1BC] = 0x1BD; // Ƽ => ƽ (LATIN CAPITAL LETTER TONE FIVE) 47 | map[0x1C4] = 0x1C6; // DŽ => dž (LATIN CAPITAL LETTER DZ WITH CARON) 48 | map[0x1C7] = 0x1C9; // LJ => lj (LATIN CAPITAL LETTER LJ) 49 | map[0x1CA] = 0x1CC; // NJ => nj (LATIN CAPITAL LETTER NJ) 50 | for (i in 0 ... 8) { map[0x1CD + i + i] = 0x1CE + i + i; } // Ǎ - Ǜ => ǎ - ǜ (LATIN CAPITAL LETTER A WITH CARON - LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE) 51 | for (i in 0 ... 9) { map[0x1DE + i + i] = 0x1DF + i + i; } // Ǟ - Ǯ => ǟ - ǯ (LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON - LATIN CAPITAL LETTER EZH WITH CARON) 52 | map[0x1F1] = 0x1F3; // DZ => dz (LATIN CAPITAL LETTER DZ) 53 | map[0x1F4] = 0x1F5; // Ǵ => ǵ (LATIN CAPITAL LETTER G WITH ACUTE) 54 | map[0x1F6] = 0x195; // Ƕ => ƕ (LATIN CAPITAL LETTER HWAIR) 55 | map[0x1F7] = 0x1BF; // Ƿ => ƿ (LATIN CAPITAL LETTER WYNN) 56 | for (i in 0 ... 20) { map[0x1F8 + i + i] = 0x1F9 + i + i; } // Ǹ - Ȟ => ǹ - ȟ (LATIN CAPITAL LETTER N WITH GRAVE - LATIN CAPITAL LETTER H WITH CARON) 57 | map[0x220] = 0x19E; // Ƞ => ƞ (LATIN CAPITAL LETTER N WITH LONG RIGHT LEG) 58 | for (i in 0 ... 9) { map[0x222 + i + i] = 0x223 + i + i; } // Ȣ - Ȳ => ȣ - ȳ (LATIN CAPITAL LETTER OU - LATIN CAPITAL LETTER Y WITH MACRON) 59 | map[0x23A] = 0x2C65; // Ⱥ => ⱥ (LATIN CAPITAL LETTER A WITH STROKE) 60 | map[0x23B] = 0x23C; // Ȼ => ȼ (LATIN CAPITAL LETTER C WITH STROKE) 61 | map[0x23D] = 0x19A; // Ƚ => ƚ (LATIN CAPITAL LETTER L WITH BAR) 62 | map[0x23E] = 0x2C66; // Ⱦ => ⱦ (LATIN CAPITAL LETTER T WITH DIAGONAL STROKE) 63 | map[0x241] = 0x242; // Ɂ => ɂ (LATIN CAPITAL LETTER GLOTTAL STOP) 64 | map[0x243] = 0x180; // Ƀ => ƀ (LATIN CAPITAL LETTER B WITH STROKE) 65 | map[0x244] = 0x289; // Ʉ => ʉ (LATIN CAPITAL LETTER U BAR) 66 | map[0x245] = 0x28C; // Ʌ => ʌ (LATIN CAPITAL LETTER TURNED V) 67 | for (i in 0 ... 5) { map[0x246 + i + i] = 0x247 + i + i; } // Ɇ - Ɏ => ɇ - ɏ (LATIN CAPITAL LETTER E WITH STROKE - LATIN CAPITAL LETTER Y WITH STROKE) 68 | for (i in 0 ... 2) { map[0x370 + i + i] = 0x371 + i + i; } // Ͱ - Ͳ => ͱ - ͳ (GREEK CAPITAL LETTER HETA - GREEK CAPITAL LETTER ARCHAIC SAMPI) 69 | map[0x376] = 0x377; // Ͷ => ͷ (GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA) 70 | map[0x37F] = 0x3F3; // Ϳ => ϳ (GREEK CAPITAL LETTER YOT) 71 | map[0x386] = 0x3AC; // Ά => ά (GREEK CAPITAL LETTER ALPHA WITH TONOS) 72 | for (i in 0 ... 3) { map[0x388 + i] = 0x3AD + i; } // Έ - Ί => έ - ί (GREEK CAPITAL LETTER EPSILON WITH TONOS - GREEK CAPITAL LETTER IOTA WITH TONOS) 73 | map[0x38C] = 0x3CC; // Ό => ό (GREEK CAPITAL LETTER OMICRON WITH TONOS) 74 | for (i in 0 ... 2) { map[0x38E + i] = 0x3CD + i; } // Ύ - Ώ => ύ - ώ (GREEK CAPITAL LETTER UPSILON WITH TONOS - GREEK CAPITAL LETTER OMEGA WITH TONOS) 75 | for (i in 0 ... 17) { map[0x391 + i] = 0x3B1 + i; } // Α - Ρ => α - ρ (GREEK CAPITAL LETTER ALPHA - GREEK CAPITAL LETTER RHO) 76 | for (i in 0 ... 9) { map[0x3A3 + i] = 0x3C3 + i; } // Σ - Ϋ => σ - ϋ (GREEK CAPITAL LETTER SIGMA - GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA) 77 | map[0x3CF] = 0x3D7; // Ϗ => ϗ (GREEK CAPITAL KAI SYMBOL) 78 | for (i in 0 ... 12) { map[0x3D8 + i + i] = 0x3D9 + i + i; } // Ϙ - Ϯ => ϙ - ϯ (GREEK LETTER ARCHAIC KOPPA - COPTIC CAPITAL LETTER DEI) 79 | map[0x3F4] = 0x3B8; // ϴ => θ (GREEK CAPITAL THETA SYMBOL) 80 | map[0x3F7] = 0x3F8; // Ϸ => ϸ (GREEK CAPITAL LETTER SHO) 81 | map[0x3F9] = 0x3F2; // Ϲ => ϲ (GREEK CAPITAL LUNATE SIGMA SYMBOL) 82 | map[0x3FA] = 0x3FB; // Ϻ => ϻ (GREEK CAPITAL LETTER SAN) 83 | for (i in 0 ... 3) { map[0x3FD + i] = 0x37B + i; } // Ͻ - Ͽ => ͻ - ͽ (GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL - GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL) 84 | for (i in 0 ... 16) { map[0x400 + i] = 0x450 + i; } // Ѐ - Џ => ѐ - џ (CYRILLIC CAPITAL LETTER IE WITH GRAVE - CYRILLIC CAPITAL LETTER DZHE) 85 | for (i in 0 ... 32) { map[0x410 + i] = 0x430 + i; } // А - Я => а - я (CYRILLIC CAPITAL LETTER A - CYRILLIC CAPITAL LETTER YA) 86 | for (i in 0 ... 17) { map[0x460 + i + i] = 0x461 + i + i; } // Ѡ - Ҁ => ѡ - ҁ (CYRILLIC CAPITAL LETTER OMEGA - CYRILLIC CAPITAL LETTER KOPPA) 87 | for (i in 0 ... 27) { map[0x48A + i + i] = 0x48B + i + i; } // Ҋ - Ҿ => ҋ - ҿ (CYRILLIC CAPITAL LETTER SHORT I WITH TAIL - CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER) 88 | map[0x4C0] = 0x4CF; // Ӏ => ӏ (CYRILLIC LETTER PALOCHKA) 89 | for (i in 0 ... 7) { map[0x4C1 + i + i] = 0x4C2 + i + i; } // Ӂ - Ӎ => ӂ - ӎ (CYRILLIC CAPITAL LETTER ZHE WITH BREVE - CYRILLIC CAPITAL LETTER EM WITH TAIL) 90 | for (i in 0 ... 48) { map[0x4D0 + i + i] = 0x4D1 + i + i; } // Ӑ - Ԯ => ӑ - ԯ (CYRILLIC CAPITAL LETTER A WITH BREVE - CYRILLIC CAPITAL LETTER EL WITH DESCENDER) 91 | for (i in 0 ... 38) { map[0x531 + i] = 0x561 + i; } // Ա - Ֆ => ա - ֆ (ARMENIAN CAPITAL LETTER AYB - ARMENIAN CAPITAL LETTER FEH) 92 | for (i in 0 ... 38) { map[0x10A0 + i] = 0x2D00 + i; } // Ⴀ - Ⴥ => ⴀ - ⴥ (GEORGIAN CAPITAL LETTER AN - GEORGIAN CAPITAL LETTER HOE) 93 | map[0x10C7] = 0x2D27; // Ⴧ => ⴧ (GEORGIAN CAPITAL LETTER YN) 94 | map[0x10CD] = 0x2D2D; // Ⴭ => ⴭ (GEORGIAN CAPITAL LETTER AEN) 95 | for (i in 0 ... 80) { map[0x13A0 + i] = 0xAB70 + i; } // Ꭰ - Ꮿ => ꭰ - ꮿ (CHEROKEE LETTER A - CHEROKEE LETTER YA) 96 | for (i in 0 ... 6) { map[0x13F0 + i] = 0x13F8 + i; } // Ᏸ - Ᏽ => ᏸ - ᏽ (CHEROKEE LETTER YE - CHEROKEE LETTER MV) 97 | for (i in 0 ... 75) { map[0x1E00 + i + i] = 0x1E01 + i + i; } // Ḁ - Ẕ => ḁ - ẕ (LATIN CAPITAL LETTER A WITH RING BELOW - LATIN CAPITAL LETTER Z WITH LINE BELOW) 98 | map[0x1E9E] = 0xDF; // ẞ => ß (LATIN CAPITAL LETTER SHARP S) 99 | for (i in 0 ... 48) { map[0x1EA0 + i + i] = 0x1EA1 + i + i; } // Ạ - Ỿ => ạ - ỿ (LATIN CAPITAL LETTER A WITH DOT BELOW - LATIN CAPITAL LETTER Y WITH LOOP) 100 | for (i in 0 ... 8) { map[0x1F08 + i] = 0x1F00 + i; } // Ἀ - Ἇ => ἀ - ἇ (GREEK CAPITAL LETTER ALPHA WITH PSILI - GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI) 101 | for (i in 0 ... 6) { map[0x1F18 + i] = 0x1F10 + i; } // Ἐ - Ἕ => ἐ - ἕ (GREEK CAPITAL LETTER EPSILON WITH PSILI - GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA) 102 | for (i in 0 ... 8) { map[0x1F28 + i] = 0x1F20 + i; } // Ἠ - Ἧ => ἠ - ἧ (GREEK CAPITAL LETTER ETA WITH PSILI - GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI) 103 | for (i in 0 ... 8) { map[0x1F38 + i] = 0x1F30 + i; } // Ἰ - Ἷ => ἰ - ἷ (GREEK CAPITAL LETTER IOTA WITH PSILI - GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI) 104 | for (i in 0 ... 6) { map[0x1F48 + i] = 0x1F40 + i; } // Ὀ - Ὅ => ὀ - ὅ (GREEK CAPITAL LETTER OMICRON WITH PSILI - GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA) 105 | for (i in 0 ... 4) { map[0x1F59 + i + i] = 0x1F51 + i + i; } // Ὑ - Ὗ => ὑ - ὗ (GREEK CAPITAL LETTER UPSILON WITH DASIA - GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI) 106 | for (i in 0 ... 8) { map[0x1F68 + i] = 0x1F60 + i; } // Ὠ - Ὧ => ὠ - ὧ (GREEK CAPITAL LETTER OMEGA WITH PSILI - GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI) 107 | for (i in 0 ... 2) { map[0x1FB8 + i] = 0x1FB0 + i; } // Ᾰ - Ᾱ => ᾰ - ᾱ (GREEK CAPITAL LETTER ALPHA WITH VRACHY - GREEK CAPITAL LETTER ALPHA WITH MACRON) 108 | for (i in 0 ... 2) { map[0x1FBA + i] = 0x1F70 + i; } // Ὰ - Ά => ὰ - ά (GREEK CAPITAL LETTER ALPHA WITH VARIA - GREEK CAPITAL LETTER ALPHA WITH OXIA) 109 | for (i in 0 ... 4) { map[0x1FC8 + i] = 0x1F72 + i; } // Ὲ - Ή => ὲ - ή (GREEK CAPITAL LETTER EPSILON WITH VARIA - GREEK CAPITAL LETTER ETA WITH OXIA) 110 | for (i in 0 ... 2) { map[0x1FD8 + i] = 0x1FD0 + i; } // Ῐ - Ῑ => ῐ - ῑ (GREEK CAPITAL LETTER IOTA WITH VRACHY - GREEK CAPITAL LETTER IOTA WITH MACRON) 111 | for (i in 0 ... 2) { map[0x1FDA + i] = 0x1F76 + i; } // Ὶ - Ί => ὶ - ί (GREEK CAPITAL LETTER IOTA WITH VARIA - GREEK CAPITAL LETTER IOTA WITH OXIA) 112 | for (i in 0 ... 2) { map[0x1FE8 + i] = 0x1FE0 + i; } // Ῠ - Ῡ => ῠ - ῡ (GREEK CAPITAL LETTER UPSILON WITH VRACHY - GREEK CAPITAL LETTER UPSILON WITH MACRON) 113 | for (i in 0 ... 2) { map[0x1FEA + i] = 0x1F7A + i; } // Ὺ - Ύ => ὺ - ύ (GREEK CAPITAL LETTER UPSILON WITH VARIA - GREEK CAPITAL LETTER UPSILON WITH OXIA) 114 | map[0x1FEC] = 0x1FE5; // Ῥ => ῥ (GREEK CAPITAL LETTER RHO WITH DASIA) 115 | for (i in 0 ... 2) { map[0x1FF8 + i] = 0x1F78 + i; } // Ὸ - Ό => ὸ - ό (GREEK CAPITAL LETTER OMICRON WITH VARIA - GREEK CAPITAL LETTER OMICRON WITH OXIA) 116 | for (i in 0 ... 2) { map[0x1FFA + i] = 0x1F7C + i; } // Ὼ - Ώ => ὼ - ώ (GREEK CAPITAL LETTER OMEGA WITH VARIA - GREEK CAPITAL LETTER OMEGA WITH OXIA) 117 | map[0x2126] = 0x3C9; // Ω => ω (OHM SIGN) 118 | map[0x212A] = 0x6B; // K => k (KELVIN SIGN) 119 | map[0x212B] = 0xE5; // Å => å (ANGSTROM SIGN) 120 | map[0x2132] = 0x214E; // Ⅎ => ⅎ (TURNED CAPITAL F) 121 | map[0x2183] = 0x2184; // Ↄ => ↄ (ROMAN NUMERAL REVERSED ONE HUNDRED) 122 | for (i in 0 ... 47) { map[0x2C00 + i] = 0x2C30 + i; } // Ⰰ - Ⱞ => ⰰ - ⱞ (GLAGOLITIC CAPITAL LETTER AZU - GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE) 123 | map[0x2C60] = 0x2C61; // Ⱡ => ⱡ (LATIN CAPITAL LETTER L WITH DOUBLE BAR) 124 | map[0x2C62] = 0x26B; // Ɫ => ɫ (LATIN CAPITAL LETTER L WITH MIDDLE TILDE) 125 | map[0x2C63] = 0x1D7D; // Ᵽ => ᵽ (LATIN CAPITAL LETTER P WITH STROKE) 126 | map[0x2C64] = 0x27D; // Ɽ => ɽ (LATIN CAPITAL LETTER R WITH TAIL) 127 | for (i in 0 ... 3) { map[0x2C67 + i + i] = 0x2C68 + i + i; } // Ⱨ - Ⱬ => ⱨ - ⱬ (LATIN CAPITAL LETTER H WITH DESCENDER - LATIN CAPITAL LETTER Z WITH DESCENDER) 128 | map[0x2C6D] = 0x251; // Ɑ => ɑ (LATIN CAPITAL LETTER ALPHA) 129 | map[0x2C6E] = 0x271; // Ɱ => ɱ (LATIN CAPITAL LETTER M WITH HOOK) 130 | map[0x2C6F] = 0x250; // Ɐ => ɐ (LATIN CAPITAL LETTER TURNED A) 131 | map[0x2C70] = 0x252; // Ɒ => ɒ (LATIN CAPITAL LETTER TURNED ALPHA) 132 | map[0x2C72] = 0x2C73; // Ⱳ => ⱳ (LATIN CAPITAL LETTER W WITH HOOK) 133 | map[0x2C75] = 0x2C76; // Ⱶ => ⱶ (LATIN CAPITAL LETTER HALF H) 134 | for (i in 0 ... 2) { map[0x2C7E + i] = 0x23F + i; } // Ȿ - Ɀ => ȿ - ɀ (LATIN CAPITAL LETTER S WITH SWASH TAIL - LATIN CAPITAL LETTER Z WITH SWASH TAIL) 135 | for (i in 0 ... 50) { map[0x2C80 + i + i] = 0x2C81 + i + i; } // Ⲁ - Ⳣ => ⲁ - ⳣ (COPTIC CAPITAL LETTER ALFA - COPTIC CAPITAL LETTER OLD NUBIAN WAU) 136 | for (i in 0 ... 2) { map[0x2CEB + i + i] = 0x2CEC + i + i; } // Ⳬ - Ⳮ => ⳬ - ⳮ (COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI - COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA) 137 | map[0x2CF2] = 0x2CF3; // Ⳳ => ⳳ (COPTIC CAPITAL LETTER BOHAIRIC KHEI) 138 | for (i in 0 ... 23) { map[0xA640 + i + i] = 0xA641 + i + i; } // Ꙁ - Ꙭ => ꙁ - ꙭ (CYRILLIC CAPITAL LETTER ZEMLYA - CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O) 139 | for (i in 0 ... 14) { map[0xA680 + i + i] = 0xA681 + i + i; } // Ꚁ - Ꚛ => ꚁ - ꚛ (CYRILLIC CAPITAL LETTER DWE - CYRILLIC CAPITAL LETTER CROSSED O) 140 | for (i in 0 ... 7) { map[0xA722 + i + i] = 0xA723 + i + i; } // Ꜣ - Ꜯ => ꜣ - ꜯ (LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF - LATIN CAPITAL LETTER CUATRILLO WITH COMMA) 141 | for (i in 0 ... 31) { map[0xA732 + i + i] = 0xA733 + i + i; } // Ꜳ - Ꝯ => ꜳ - ꝯ (LATIN CAPITAL LETTER AA - LATIN CAPITAL LETTER CON) 142 | for (i in 0 ... 2) { map[0xA779 + i + i] = 0xA77A + i + i; } // Ꝺ - Ꝼ => ꝺ - ꝼ (LATIN CAPITAL LETTER INSULAR D - LATIN CAPITAL LETTER INSULAR F) 143 | map[0xA77D] = 0x1D79; // Ᵹ => ᵹ (LATIN CAPITAL LETTER INSULAR G) 144 | for (i in 0 ... 5) { map[0xA77E + i + i] = 0xA77F + i + i; } // Ꝿ - Ꞇ => ꝿ - ꞇ (LATIN CAPITAL LETTER TURNED INSULAR G - LATIN CAPITAL LETTER INSULAR T) 145 | map[0xA78B] = 0xA78C; // Ꞌ => ꞌ (LATIN CAPITAL LETTER SALTILLO) 146 | map[0xA78D] = 0x265; // Ɥ => ɥ (LATIN CAPITAL LETTER TURNED H) 147 | for (i in 0 ... 2) { map[0xA790 + i + i] = 0xA791 + i + i; } // Ꞑ - Ꞓ => ꞑ - ꞓ (LATIN CAPITAL LETTER N WITH DESCENDER - LATIN CAPITAL LETTER C WITH BAR) 148 | for (i in 0 ... 10) { map[0xA796 + i + i] = 0xA797 + i + i; } // Ꞗ - Ꞩ => ꞗ - ꞩ (LATIN CAPITAL LETTER B WITH FLOURISH - LATIN CAPITAL LETTER S WITH OBLIQUE STROKE) 149 | map[0xA7AA] = 0x266; // Ɦ => ɦ (LATIN CAPITAL LETTER H WITH HOOK) 150 | map[0xA7AB] = 0x25C; // Ɜ => ɜ (LATIN CAPITAL LETTER REVERSED OPEN E) 151 | map[0xA7AC] = 0x261; // Ɡ => ɡ (LATIN CAPITAL LETTER SCRIPT G) 152 | map[0xA7AD] = 0x26C; // Ɬ => ɬ (LATIN CAPITAL LETTER L WITH BELT) 153 | map[0xA7AE] = 0x26A; // Ɪ => ɪ (LATIN CAPITAL LETTER SMALL CAPITAL I) 154 | map[0xA7B0] = 0x29E; // Ʞ => ʞ (LATIN CAPITAL LETTER TURNED K) 155 | map[0xA7B1] = 0x287; // Ʇ => ʇ (LATIN CAPITAL LETTER TURNED T) 156 | map[0xA7B2] = 0x29D; // Ʝ => ʝ (LATIN CAPITAL LETTER J WITH CROSSED-TAIL) 157 | map[0xA7B3] = 0xAB53; // Ꭓ => ꭓ (LATIN CAPITAL LETTER CHI) 158 | for (i in 0 ... 2) { map[0xA7B4 + i + i] = 0xA7B5 + i + i; } // Ꞵ - Ꞷ => ꞵ - ꞷ (LATIN CAPITAL LETTER BETA - LATIN CAPITAL LETTER OMEGA) 159 | for (i in 0 ... 26) { map[0xFF21 + i] = 0xFF41 + i; } // A - Z => a - z (FULLWIDTH LATIN CAPITAL LETTER A - FULLWIDTH LATIN CAPITAL LETTER Z) 160 | for (i in 0 ... 40) { map[0x10400 + i] = 0x10428 + i; } // 𐐀 - 𐐧 => 𐐨 - 𐑏 (DESERET CAPITAL LETTER LONG I - DESERET CAPITAL LETTER EW) 161 | for (i in 0 ... 36) { map[0x104B0 + i] = 0x104D8 + i; } // 𐒰 - 𐓓 => 𐓘 - 𐓻 (OSAGE CAPITAL LETTER A - OSAGE CAPITAL LETTER ZHA) 162 | for (i in 0 ... 51) { map[0x10C80 + i] = 0x10CC0 + i; } // 𐲀 - 𐲲 => 𐳀 - 𐳲 (OLD HUNGARIAN CAPITAL LETTER A - OLD HUNGARIAN CAPITAL LETTER US) 163 | for (i in 0 ... 32) { map[0x118A0 + i] = 0x118C0 + i; } // 𑢠 - 𑢿 => 𑣀 - 𑣟 (WARANG CITI CAPITAL LETTER NGAA - WARANG CITI CAPITAL LETTER VIYO) 164 | for (i in 0 ... 34) { map[0x1E900 + i] = 0x1E922 + i; } // 𞤀 - 𞤡 => 𞤢 - 𞥃 (ADLAM CAPITAL LETTER ALIF - ADLAM CAPITAL LETTER SHA) 165 | } 166 | 167 | public static function fillLowerToUpperMap(map : Map) : Void { 168 | for (i in 0 ... 26) { map[0x61 + i] = 0x41 + i; } // a - z => A - Z (LATIN SMALL LETTER A - LATIN SMALL LETTER Z) 169 | map[0xB5] = 0x39C; // µ => Μ (MICRO SIGN) 170 | for (i in 0 ... 23) { map[0xE0 + i] = 0xC0 + i; } // à - ö => À - Ö (LATIN SMALL LETTER A WITH GRAVE - LATIN SMALL LETTER O WITH DIAERESIS) 171 | for (i in 0 ... 7) { map[0xF8 + i] = 0xD8 + i; } // ø - þ => Ø - Þ (LATIN SMALL LETTER O WITH STROKE - LATIN SMALL LETTER THORN) 172 | map[0xFF] = 0x178; // ÿ => Ÿ (LATIN SMALL LETTER Y WITH DIAERESIS) 173 | for (i in 0 ... 24) { map[0x101 + i + i] = 0x100 + i + i; } // ā - į => Ā - Į (LATIN SMALL LETTER A WITH MACRON - LATIN SMALL LETTER I WITH OGONEK) 174 | map[0x131] = 0x49; // ı => I (LATIN SMALL LETTER DOTLESS I) 175 | for (i in 0 ... 3) { map[0x133 + i + i] = 0x132 + i + i; } // ij - ķ => IJ - Ķ (LATIN SMALL LIGATURE IJ - LATIN SMALL LETTER K WITH CEDILLA) 176 | for (i in 0 ... 8) { map[0x13A + i + i] = 0x139 + i + i; } // ĺ - ň => Ĺ - Ň (LATIN SMALL LETTER L WITH ACUTE - LATIN SMALL LETTER N WITH CARON) 177 | for (i in 0 ... 23) { map[0x14B + i + i] = 0x14A + i + i; } // ŋ - ŷ => Ŋ - Ŷ (LATIN SMALL LETTER ENG - LATIN SMALL LETTER Y WITH CIRCUMFLEX) 178 | for (i in 0 ... 3) { map[0x17A + i + i] = 0x179 + i + i; } // ź - ž => Ź - Ž (LATIN SMALL LETTER Z WITH ACUTE - LATIN SMALL LETTER Z WITH CARON) 179 | map[0x17F] = 0x53; // ſ => S (LATIN SMALL LETTER LONG S) 180 | map[0x180] = 0x243; // ƀ => Ƀ (LATIN SMALL LETTER B WITH STROKE) 181 | for (i in 0 ... 2) { map[0x183 + i + i] = 0x182 + i + i; } // ƃ - ƅ => Ƃ - Ƅ (LATIN SMALL LETTER B WITH TOPBAR - LATIN SMALL LETTER TONE SIX) 182 | map[0x188] = 0x187; // ƈ => Ƈ (LATIN SMALL LETTER C WITH HOOK) 183 | map[0x18C] = 0x18B; // ƌ => Ƌ (LATIN SMALL LETTER D WITH TOPBAR) 184 | map[0x192] = 0x191; // ƒ => Ƒ (LATIN SMALL LETTER F WITH HOOK) 185 | map[0x195] = 0x1F6; // ƕ => Ƕ (LATIN SMALL LETTER HV) 186 | map[0x199] = 0x198; // ƙ => Ƙ (LATIN SMALL LETTER K WITH HOOK) 187 | map[0x19A] = 0x23D; // ƚ => Ƚ (LATIN SMALL LETTER L WITH BAR) 188 | map[0x19E] = 0x220; // ƞ => Ƞ (LATIN SMALL LETTER N WITH LONG RIGHT LEG) 189 | for (i in 0 ... 3) { map[0x1A1 + i + i] = 0x1A0 + i + i; } // ơ - ƥ => Ơ - Ƥ (LATIN SMALL LETTER O WITH HORN - LATIN SMALL LETTER P WITH HOOK) 190 | map[0x1A8] = 0x1A7; // ƨ => Ƨ (LATIN SMALL LETTER TONE TWO) 191 | map[0x1AD] = 0x1AC; // ƭ => Ƭ (LATIN SMALL LETTER T WITH HOOK) 192 | map[0x1B0] = 0x1AF; // ư => Ư (LATIN SMALL LETTER U WITH HORN) 193 | for (i in 0 ... 2) { map[0x1B4 + i + i] = 0x1B3 + i + i; } // ƴ - ƶ => Ƴ - Ƶ (LATIN SMALL LETTER Y WITH HOOK - LATIN SMALL LETTER Z WITH STROKE) 194 | map[0x1B9] = 0x1B8; // ƹ => Ƹ (LATIN SMALL LETTER EZH REVERSED) 195 | map[0x1BD] = 0x1BC; // ƽ => Ƽ (LATIN SMALL LETTER TONE FIVE) 196 | map[0x1BF] = 0x1F7; // ƿ => Ƿ (LATIN LETTER WYNN) 197 | map[0x1C6] = 0x1C4; // dž => DŽ (LATIN SMALL LETTER DZ WITH CARON) 198 | map[0x1C9] = 0x1C7; // lj => LJ (LATIN SMALL LETTER LJ) 199 | map[0x1CC] = 0x1CA; // nj => NJ (LATIN SMALL LETTER NJ) 200 | for (i in 0 ... 8) { map[0x1CE + i + i] = 0x1CD + i + i; } // ǎ - ǜ => Ǎ - Ǜ (LATIN SMALL LETTER A WITH CARON - LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE) 201 | map[0x1DD] = 0x18E; // ǝ => Ǝ (LATIN SMALL LETTER TURNED E) 202 | for (i in 0 ... 9) { map[0x1DF + i + i] = 0x1DE + i + i; } // ǟ - ǯ => Ǟ - Ǯ (LATIN SMALL LETTER A WITH DIAERESIS AND MACRON - LATIN SMALL LETTER EZH WITH CARON) 203 | map[0x1F0] = 0x4A; // ǰ => J (LATIN SMALL LETTER J) 204 | map[0x1F3] = 0x1F1; // dz => DZ (LATIN SMALL LETTER DZ) 205 | map[0x1F5] = 0x1F4; // ǵ => Ǵ (LATIN SMALL LETTER G WITH ACUTE) 206 | for (i in 0 ... 20) { map[0x1F9 + i + i] = 0x1F8 + i + i; } // ǹ - ȟ => Ǹ - Ȟ (LATIN SMALL LETTER N WITH GRAVE - LATIN SMALL LETTER H WITH CARON) 207 | for (i in 0 ... 9) { map[0x223 + i + i] = 0x222 + i + i; } // ȣ - ȳ => Ȣ - Ȳ (LATIN SMALL LETTER OU - LATIN SMALL LETTER Y WITH MACRON) 208 | map[0x23C] = 0x23B; // ȼ => Ȼ (LATIN SMALL LETTER C WITH STROKE) 209 | for (i in 0 ... 2) { map[0x23F + i] = 0x2C7E + i; } // ȿ - ɀ => Ȿ - Ɀ (LATIN SMALL LETTER S WITH SWASH TAIL - LATIN SMALL LETTER Z WITH SWASH TAIL) 210 | map[0x242] = 0x241; // ɂ => Ɂ (LATIN SMALL LETTER GLOTTAL STOP) 211 | for (i in 0 ... 5) { map[0x247 + i + i] = 0x246 + i + i; } // ɇ - ɏ => Ɇ - Ɏ (LATIN SMALL LETTER E WITH STROKE - LATIN SMALL LETTER Y WITH STROKE) 212 | map[0x250] = 0x2C6F; // ɐ => Ɐ (LATIN SMALL LETTER TURNED A) 213 | map[0x251] = 0x2C6D; // ɑ => Ɑ (LATIN SMALL LETTER ALPHA) 214 | map[0x252] = 0x2C70; // ɒ => Ɒ (LATIN SMALL LETTER TURNED ALPHA) 215 | map[0x253] = 0x181; // ɓ => Ɓ (LATIN SMALL LETTER B WITH HOOK) 216 | map[0x254] = 0x186; // ɔ => Ɔ (LATIN SMALL LETTER OPEN O) 217 | for (i in 0 ... 2) { map[0x256 + i] = 0x189 + i; } // ɖ - ɗ => Ɖ - Ɗ (LATIN SMALL LETTER D WITH TAIL - LATIN SMALL LETTER D WITH HOOK) 218 | map[0x259] = 0x18F; // ə => Ə (LATIN SMALL LETTER SCHWA) 219 | map[0x25B] = 0x190; // ɛ => Ɛ (LATIN SMALL LETTER OPEN E) 220 | map[0x25C] = 0xA7AB; // ɜ => Ɜ (LATIN SMALL LETTER REVERSED OPEN E) 221 | map[0x260] = 0x193; // ɠ => Ɠ (LATIN SMALL LETTER G WITH HOOK) 222 | map[0x261] = 0xA7AC; // ɡ => Ɡ (LATIN SMALL LETTER SCRIPT G) 223 | map[0x263] = 0x194; // ɣ => Ɣ (LATIN SMALL LETTER GAMMA) 224 | map[0x265] = 0xA78D; // ɥ => Ɥ (LATIN SMALL LETTER TURNED H) 225 | map[0x266] = 0xA7AA; // ɦ => Ɦ (LATIN SMALL LETTER H WITH HOOK) 226 | map[0x268] = 0x197; // ɨ => Ɨ (LATIN SMALL LETTER I WITH STROKE) 227 | map[0x269] = 0x196; // ɩ => Ɩ (LATIN SMALL LETTER IOTA) 228 | map[0x26A] = 0xA7AE; // ɪ => Ɪ (LATIN LETTER SMALL CAPITAL I) 229 | map[0x26B] = 0x2C62; // ɫ => Ɫ (LATIN SMALL LETTER L WITH MIDDLE TILDE) 230 | map[0x26C] = 0xA7AD; // ɬ => Ɬ (LATIN SMALL LETTER L WITH BELT) 231 | map[0x26F] = 0x19C; // ɯ => Ɯ (LATIN SMALL LETTER TURNED M) 232 | map[0x271] = 0x2C6E; // ɱ => Ɱ (LATIN SMALL LETTER M WITH HOOK) 233 | map[0x272] = 0x19D; // ɲ => Ɲ (LATIN SMALL LETTER N WITH LEFT HOOK) 234 | map[0x275] = 0x19F; // ɵ => Ɵ (LATIN SMALL LETTER BARRED O) 235 | map[0x27D] = 0x2C64; // ɽ => Ɽ (LATIN SMALL LETTER R WITH TAIL) 236 | map[0x280] = 0x1A6; // ʀ => Ʀ (LATIN LETTER SMALL CAPITAL R) 237 | map[0x283] = 0x1A9; // ʃ => Ʃ (LATIN SMALL LETTER ESH) 238 | map[0x287] = 0xA7B1; // ʇ => Ʇ (LATIN SMALL LETTER TURNED T) 239 | map[0x288] = 0x1AE; // ʈ => Ʈ (LATIN SMALL LETTER T WITH RETROFLEX HOOK) 240 | map[0x289] = 0x244; // ʉ => Ʉ (LATIN SMALL LETTER U BAR) 241 | for (i in 0 ... 2) { map[0x28A + i] = 0x1B1 + i; } // ʊ - ʋ => Ʊ - Ʋ (LATIN SMALL LETTER UPSILON - LATIN SMALL LETTER V WITH HOOK) 242 | map[0x28C] = 0x245; // ʌ => Ʌ (LATIN SMALL LETTER TURNED V) 243 | map[0x292] = 0x1B7; // ʒ => Ʒ (LATIN SMALL LETTER EZH) 244 | map[0x29D] = 0xA7B2; // ʝ => Ʝ (LATIN SMALL LETTER J WITH CROSSED-TAIL) 245 | map[0x29E] = 0xA7B0; // ʞ => Ʞ (LATIN SMALL LETTER TURNED K) 246 | for (i in 0 ... 2) { map[0x371 + i + i] = 0x370 + i + i; } // ͱ - ͳ => Ͱ - Ͳ (GREEK SMALL LETTER HETA - GREEK SMALL LETTER ARCHAIC SAMPI) 247 | map[0x377] = 0x376; // ͷ => Ͷ (GREEK SMALL LETTER PAMPHYLIAN DIGAMMA) 248 | for (i in 0 ... 3) { map[0x37B + i] = 0x3FD + i; } // ͻ - ͽ => Ͻ - Ͽ (GREEK SMALL REVERSED LUNATE SIGMA SYMBOL - GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL) 249 | map[0x390] = 0x3AA; // ΐ => Ϊ (GREEK SMALL LETTER IOTA WITH DIALYTIKA) 250 | map[0x3AC] = 0x386; // ά => Ά (GREEK SMALL LETTER ALPHA WITH TONOS) 251 | for (i in 0 ... 3) { map[0x3AD + i] = 0x388 + i; } // έ - ί => Έ - Ί (GREEK SMALL LETTER EPSILON WITH TONOS - GREEK SMALL LETTER IOTA WITH TONOS) 252 | map[0x3B0] = 0x3AB; // ΰ => Ϋ (GREEK SMALL LETTER UPSILON WITH DIALYTIKA) 253 | for (i in 0 ... 17) { map[0x3B1 + i] = 0x391 + i; } // α - ρ => Α - Ρ (GREEK SMALL LETTER ALPHA - GREEK SMALL LETTER RHO) 254 | map[0x3C2] = 0x3A3; // ς => Σ (GREEK SMALL LETTER FINAL SIGMA) 255 | for (i in 0 ... 9) { map[0x3C3 + i] = 0x3A3 + i; } // σ - ϋ => Σ - Ϋ (GREEK SMALL LETTER SIGMA - GREEK SMALL LETTER UPSILON WITH DIALYTIKA) 256 | map[0x3CC] = 0x38C; // ό => Ό (GREEK SMALL LETTER OMICRON WITH TONOS) 257 | for (i in 0 ... 2) { map[0x3CD + i] = 0x38E + i; } // ύ - ώ => Ύ - Ώ (GREEK SMALL LETTER UPSILON WITH TONOS - GREEK SMALL LETTER OMEGA WITH TONOS) 258 | map[0x3D0] = 0x392; // ϐ => Β (GREEK BETA SYMBOL) 259 | map[0x3D1] = 0x398; // ϑ => Θ (GREEK THETA SYMBOL) 260 | map[0x3D5] = 0x3A6; // ϕ => Φ (GREEK PHI SYMBOL) 261 | map[0x3D6] = 0x3A0; // ϖ => Π (GREEK PI SYMBOL) 262 | map[0x3D7] = 0x3CF; // ϗ => Ϗ (GREEK KAI SYMBOL) 263 | for (i in 0 ... 12) { map[0x3D9 + i + i] = 0x3D8 + i + i; } // ϙ - ϯ => Ϙ - Ϯ (GREEK SMALL LETTER ARCHAIC KOPPA - COPTIC SMALL LETTER DEI) 264 | map[0x3F0] = 0x39A; // ϰ => Κ (GREEK KAPPA SYMBOL) 265 | map[0x3F1] = 0x3A1; // ϱ => Ρ (GREEK RHO SYMBOL) 266 | map[0x3F2] = 0x3F9; // ϲ => Ϲ (GREEK LUNATE SIGMA SYMBOL) 267 | map[0x3F3] = 0x37F; // ϳ => Ϳ (GREEK LETTER YOT) 268 | map[0x3F5] = 0x395; // ϵ => Ε (GREEK LUNATE EPSILON SYMBOL) 269 | map[0x3F8] = 0x3F7; // ϸ => Ϸ (GREEK SMALL LETTER SHO) 270 | map[0x3FB] = 0x3FA; // ϻ => Ϻ (GREEK SMALL LETTER SAN) 271 | for (i in 0 ... 32) { map[0x430 + i] = 0x410 + i; } // а - я => А - Я (CYRILLIC SMALL LETTER A - CYRILLIC SMALL LETTER YA) 272 | for (i in 0 ... 16) { map[0x450 + i] = 0x400 + i; } // ѐ - џ => Ѐ - Џ (CYRILLIC SMALL LETTER IE WITH GRAVE - CYRILLIC SMALL LETTER DZHE) 273 | for (i in 0 ... 17) { map[0x461 + i + i] = 0x460 + i + i; } // ѡ - ҁ => Ѡ - Ҁ (CYRILLIC SMALL LETTER OMEGA - CYRILLIC SMALL LETTER KOPPA) 274 | for (i in 0 ... 27) { map[0x48B + i + i] = 0x48A + i + i; } // ҋ - ҿ => Ҋ - Ҿ (CYRILLIC SMALL LETTER SHORT I WITH TAIL - CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER) 275 | for (i in 0 ... 7) { map[0x4C2 + i + i] = 0x4C1 + i + i; } // ӂ - ӎ => Ӂ - Ӎ (CYRILLIC SMALL LETTER ZHE WITH BREVE - CYRILLIC SMALL LETTER EM WITH TAIL) 276 | map[0x4CF] = 0x4C0; // ӏ => Ӏ (CYRILLIC SMALL LETTER PALOCHKA) 277 | for (i in 0 ... 48) { map[0x4D1 + i + i] = 0x4D0 + i + i; } // ӑ - ԯ => Ӑ - Ԯ (CYRILLIC SMALL LETTER A WITH BREVE - CYRILLIC SMALL LETTER EL WITH DESCENDER) 278 | for (i in 0 ... 38) { map[0x561 + i] = 0x531 + i; } // ա - ֆ => Ա - Ֆ (ARMENIAN SMALL LETTER AYB - ARMENIAN SMALL LETTER FEH) 279 | for (i in 0 ... 6) { map[0x13F8 + i] = 0x13F0 + i; } // ᏸ - ᏽ => Ᏸ - Ᏽ (CHEROKEE SMALL LETTER YE - CHEROKEE SMALL LETTER MV) 280 | map[0x1C80] = 0x412; // ᲀ => В (CYRILLIC SMALL LETTER ROUNDED VE) 281 | map[0x1C81] = 0x414; // ᲁ => Д (CYRILLIC SMALL LETTER LONG-LEGGED DE) 282 | map[0x1C82] = 0x41E; // ᲂ => О (CYRILLIC SMALL LETTER NARROW O) 283 | for (i in 0 ... 2) { map[0x1C83 + i] = 0x421 + i; } // ᲃ - ᲄ => С - Т (CYRILLIC SMALL LETTER WIDE ES - CYRILLIC SMALL LETTER TALL TE) 284 | map[0x1C85] = 0x422; // ᲅ => Т (CYRILLIC SMALL LETTER THREE-LEGGED TE) 285 | map[0x1C86] = 0x42A; // ᲆ => Ъ (CYRILLIC SMALL LETTER TALL HARD SIGN) 286 | map[0x1C87] = 0x462; // ᲇ => Ѣ (CYRILLIC SMALL LETTER TALL YAT) 287 | map[0x1C88] = 0xA64A; // ᲈ => Ꙋ (CYRILLIC SMALL LETTER UNBLENDED UK) 288 | map[0x1D79] = 0xA77D; // ᵹ => Ᵹ (LATIN SMALL LETTER INSULAR G) 289 | map[0x1D7D] = 0x2C63; // ᵽ => Ᵽ (LATIN SMALL LETTER P WITH STROKE) 290 | for (i in 0 ... 75) { map[0x1E01 + i + i] = 0x1E00 + i + i; } // ḁ - ẕ => Ḁ - Ẕ (LATIN SMALL LETTER A WITH RING BELOW - LATIN SMALL LETTER Z WITH LINE BELOW) 291 | map[0x1E96] = 0x48; // ẖ => H (LATIN SMALL LETTER H) 292 | map[0x1E97] = 0x54; // ẗ => T (LATIN SMALL LETTER T) 293 | map[0x1E98] = 0x57; // ẘ => W (LATIN SMALL LETTER W) 294 | map[0x1E99] = 0x59; // ẙ => Y (LATIN SMALL LETTER Y) 295 | map[0x1E9B] = 0x1E60; // ẛ => Ṡ (LATIN SMALL LETTER LONG S WITH DOT ABOVE) 296 | for (i in 0 ... 48) { map[0x1EA1 + i + i] = 0x1EA0 + i + i; } // ạ - ỿ => Ạ - Ỿ (LATIN SMALL LETTER A WITH DOT BELOW - LATIN SMALL LETTER Y WITH LOOP) 297 | for (i in 0 ... 8) { map[0x1F00 + i] = 0x1F08 + i; } // ἀ - ἇ => Ἀ - Ἇ (GREEK SMALL LETTER ALPHA WITH PSILI - GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI) 298 | for (i in 0 ... 6) { map[0x1F10 + i] = 0x1F18 + i; } // ἐ - ἕ => Ἐ - Ἕ (GREEK SMALL LETTER EPSILON WITH PSILI - GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA) 299 | for (i in 0 ... 8) { map[0x1F20 + i] = 0x1F28 + i; } // ἠ - ἧ => Ἠ - Ἧ (GREEK SMALL LETTER ETA WITH PSILI - GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI) 300 | for (i in 0 ... 8) { map[0x1F30 + i] = 0x1F38 + i; } // ἰ - ἷ => Ἰ - Ἷ (GREEK SMALL LETTER IOTA WITH PSILI - GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI) 301 | for (i in 0 ... 6) { map[0x1F40 + i] = 0x1F48 + i; } // ὀ - ὅ => Ὀ - Ὅ (GREEK SMALL LETTER OMICRON WITH PSILI - GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA) 302 | map[0x1F50] = 0x3A5; // ὐ => Υ (GREEK SMALL LETTER UPSILON) 303 | map[0x1F51] = 0x1F59; // ὑ => Ὑ (GREEK SMALL LETTER UPSILON WITH DASIA) 304 | map[0x1F52] = 0x3A5; // ὒ => Υ (GREEK SMALL LETTER UPSILON) 305 | map[0x1F53] = 0x1F5B; // ὓ => Ὓ (GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA) 306 | map[0x1F54] = 0x3A5; // ὔ => Υ (GREEK SMALL LETTER UPSILON) 307 | map[0x1F55] = 0x1F5D; // ὕ => Ὕ (GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA) 308 | map[0x1F56] = 0x3A5; // ὖ => Υ (GREEK SMALL LETTER UPSILON) 309 | map[0x1F57] = 0x1F5F; // ὗ => Ὗ (GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI) 310 | for (i in 0 ... 8) { map[0x1F60 + i] = 0x1F68 + i; } // ὠ - ὧ => Ὠ - Ὧ (GREEK SMALL LETTER OMEGA WITH PSILI - GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI) 311 | for (i in 0 ... 2) { map[0x1F70 + i] = 0x1FBA + i; } // ὰ - ά => Ὰ - Ά (GREEK SMALL LETTER ALPHA WITH VARIA - GREEK SMALL LETTER ALPHA WITH OXIA) 312 | for (i in 0 ... 4) { map[0x1F72 + i] = 0x1FC8 + i; } // ὲ - ή => Ὲ - Ή (GREEK SMALL LETTER EPSILON WITH VARIA - GREEK SMALL LETTER ETA WITH OXIA) 313 | for (i in 0 ... 2) { map[0x1F76 + i] = 0x1FDA + i; } // ὶ - ί => Ὶ - Ί (GREEK SMALL LETTER IOTA WITH VARIA - GREEK SMALL LETTER IOTA WITH OXIA) 314 | for (i in 0 ... 2) { map[0x1F78 + i] = 0x1FF8 + i; } // ὸ - ό => Ὸ - Ό (GREEK SMALL LETTER OMICRON WITH VARIA - GREEK SMALL LETTER OMICRON WITH OXIA) 315 | for (i in 0 ... 2) { map[0x1F7A + i] = 0x1FEA + i; } // ὺ - ύ => Ὺ - Ύ (GREEK SMALL LETTER UPSILON WITH VARIA - GREEK SMALL LETTER UPSILON WITH OXIA) 316 | for (i in 0 ... 2) { map[0x1F7C + i] = 0x1FFA + i; } // ὼ - ώ => Ὼ - Ώ (GREEK SMALL LETTER OMEGA WITH VARIA - GREEK SMALL LETTER OMEGA WITH OXIA) 317 | for (i in 0 ... 8) { map[0x1F80 + i] = 0x1F88 + i; } // ᾀ - ᾇ => ᾈ - ᾏ (GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI - GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI) 318 | for (i in 0 ... 8) { map[0x1F90 + i] = 0x1F98 + i; } // ᾐ - ᾗ => ᾘ - ᾟ (GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI - GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI) 319 | for (i in 0 ... 8) { map[0x1FA0 + i] = 0x1FA8 + i; } // ᾠ - ᾧ => ᾨ - ᾯ (GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI - GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI) 320 | for (i in 0 ... 3) { map[0x1FB0 + i] = 0x1FB8 + i; } // ᾰ - ᾲ => Ᾰ - Ὰ (GREEK SMALL LETTER ALPHA WITH VRACHY - GREEK SMALL LETTER ALPHA WITH VARIA) 321 | map[0x1FB3] = 0x1FBC; // ᾳ => ᾼ (GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI) 322 | map[0x1FB4] = 0x386; // ᾴ => Ά (GREEK SMALL LETTER ALPHA WITH TONOS) 323 | map[0x1FB6] = 0x391; // ᾶ => Α (GREEK SMALL LETTER ALPHA) 324 | map[0x1FB7] = 0x391; // ᾷ => Α (GREEK SMALL LETTER ALPHA) 325 | map[0x1FBE] = 0x399; // ι => Ι (GREEK PROSGEGRAMMENI) 326 | map[0x1FC2] = 0x1FCA; // ῂ => Ὴ (GREEK SMALL LETTER ETA WITH VARIA) 327 | map[0x1FC3] = 0x1FCC; // ῃ => ῌ (GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI) 328 | map[0x1FC4] = 0x389; // ῄ => Ή (GREEK SMALL LETTER ETA WITH TONOS) 329 | map[0x1FC6] = 0x397; // ῆ => Η (GREEK SMALL LETTER ETA) 330 | map[0x1FC7] = 0x397; // ῇ => Η (GREEK SMALL LETTER ETA) 331 | for (i in 0 ... 2) { map[0x1FD0 + i] = 0x1FD8 + i; } // ῐ - ῑ => Ῐ - Ῑ (GREEK SMALL LETTER IOTA WITH VRACHY - GREEK SMALL LETTER IOTA WITH MACRON) 332 | map[0x1FD2] = 0x3AA; // ῒ => Ϊ (GREEK SMALL LETTER IOTA WITH DIALYTIKA) 333 | map[0x1FD3] = 0x3AA; // ΐ => Ϊ (GREEK SMALL LETTER IOTA WITH DIALYTIKA) 334 | map[0x1FD6] = 0x399; // ῖ => Ι (GREEK SMALL LETTER IOTA) 335 | map[0x1FD7] = 0x3AA; // ῗ => Ϊ (GREEK SMALL LETTER IOTA WITH DIALYTIKA) 336 | for (i in 0 ... 2) { map[0x1FE0 + i] = 0x1FE8 + i; } // ῠ - ῡ => Ῠ - Ῡ (GREEK SMALL LETTER UPSILON WITH VRACHY - GREEK SMALL LETTER UPSILON WITH MACRON) 337 | map[0x1FE2] = 0x3AB; // ῢ => Ϋ (GREEK SMALL LETTER UPSILON WITH DIALYTIKA) 338 | map[0x1FE3] = 0x3AB; // ΰ => Ϋ (GREEK SMALL LETTER UPSILON WITH DIALYTIKA) 339 | map[0x1FE4] = 0x3A1; // ῤ => Ρ (GREEK SMALL LETTER RHO) 340 | map[0x1FE5] = 0x1FEC; // ῥ => Ῥ (GREEK SMALL LETTER RHO WITH DASIA) 341 | map[0x1FE6] = 0x3A5; // ῦ => Υ (GREEK SMALL LETTER UPSILON) 342 | map[0x1FE7] = 0x3AB; // ῧ => Ϋ (GREEK SMALL LETTER UPSILON WITH DIALYTIKA) 343 | map[0x1FF2] = 0x1FFA; // ῲ => Ὼ (GREEK SMALL LETTER OMEGA WITH VARIA) 344 | map[0x1FF3] = 0x1FFC; // ῳ => ῼ (GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI) 345 | map[0x1FF4] = 0x38F; // ῴ => Ώ (GREEK SMALL LETTER OMEGA WITH TONOS) 346 | map[0x1FF6] = 0x3A9; // ῶ => Ω (GREEK SMALL LETTER OMEGA) 347 | map[0x1FF7] = 0x3A9; // ῷ => Ω (GREEK SMALL LETTER OMEGA) 348 | map[0x214E] = 0x2132; // ⅎ => Ⅎ (TURNED SMALL F) 349 | map[0x2184] = 0x2183; // ↄ => Ↄ (LATIN SMALL LETTER REVERSED C) 350 | for (i in 0 ... 47) { map[0x2C30 + i] = 0x2C00 + i; } // ⰰ - ⱞ => Ⰰ - Ⱞ (GLAGOLITIC SMALL LETTER AZU - GLAGOLITIC SMALL LETTER LATINATE MYSLITE) 351 | map[0x2C61] = 0x2C60; // ⱡ => Ⱡ (LATIN SMALL LETTER L WITH DOUBLE BAR) 352 | map[0x2C65] = 0x23A; // ⱥ => Ⱥ (LATIN SMALL LETTER A WITH STROKE) 353 | map[0x2C66] = 0x23E; // ⱦ => Ⱦ (LATIN SMALL LETTER T WITH DIAGONAL STROKE) 354 | for (i in 0 ... 3) { map[0x2C68 + i + i] = 0x2C67 + i + i; } // ⱨ - ⱬ => Ⱨ - Ⱬ (LATIN SMALL LETTER H WITH DESCENDER - LATIN SMALL LETTER Z WITH DESCENDER) 355 | map[0x2C73] = 0x2C72; // ⱳ => Ⱳ (LATIN SMALL LETTER W WITH HOOK) 356 | map[0x2C76] = 0x2C75; // ⱶ => Ⱶ (LATIN SMALL LETTER HALF H) 357 | for (i in 0 ... 50) { map[0x2C81 + i + i] = 0x2C80 + i + i; } // ⲁ - ⳣ => Ⲁ - Ⳣ (COPTIC SMALL LETTER ALFA - COPTIC SMALL LETTER OLD NUBIAN WAU) 358 | for (i in 0 ... 2) { map[0x2CEC + i + i] = 0x2CEB + i + i; } // ⳬ - ⳮ => Ⳬ - Ⳮ (COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI - COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA) 359 | map[0x2CF3] = 0x2CF2; // ⳳ => Ⳳ (COPTIC SMALL LETTER BOHAIRIC KHEI) 360 | for (i in 0 ... 38) { map[0x2D00 + i] = 0x10A0 + i; } // ⴀ - ⴥ => Ⴀ - Ⴥ (GEORGIAN SMALL LETTER AN - GEORGIAN SMALL LETTER HOE) 361 | map[0x2D27] = 0x10C7; // ⴧ => Ⴧ (GEORGIAN SMALL LETTER YN) 362 | map[0x2D2D] = 0x10CD; // ⴭ => Ⴭ (GEORGIAN SMALL LETTER AEN) 363 | for (i in 0 ... 23) { map[0xA641 + i + i] = 0xA640 + i + i; } // ꙁ - ꙭ => Ꙁ - Ꙭ (CYRILLIC SMALL LETTER ZEMLYA - CYRILLIC SMALL LETTER DOUBLE MONOCULAR O) 364 | for (i in 0 ... 14) { map[0xA681 + i + i] = 0xA680 + i + i; } // ꚁ - ꚛ => Ꚁ - Ꚛ (CYRILLIC SMALL LETTER DWE - CYRILLIC SMALL LETTER CROSSED O) 365 | for (i in 0 ... 7) { map[0xA723 + i + i] = 0xA722 + i + i; } // ꜣ - ꜯ => Ꜣ - Ꜯ (LATIN SMALL LETTER EGYPTOLOGICAL ALEF - LATIN SMALL LETTER CUATRILLO WITH COMMA) 366 | for (i in 0 ... 31) { map[0xA733 + i + i] = 0xA732 + i + i; } // ꜳ - ꝯ => Ꜳ - Ꝯ (LATIN SMALL LETTER AA - LATIN SMALL LETTER CON) 367 | for (i in 0 ... 2) { map[0xA77A + i + i] = 0xA779 + i + i; } // ꝺ - ꝼ => Ꝺ - Ꝼ (LATIN SMALL LETTER INSULAR D - LATIN SMALL LETTER INSULAR F) 368 | for (i in 0 ... 5) { map[0xA77F + i + i] = 0xA77E + i + i; } // ꝿ - ꞇ => Ꝿ - Ꞇ (LATIN SMALL LETTER TURNED INSULAR G - LATIN SMALL LETTER INSULAR T) 369 | map[0xA78C] = 0xA78B; // ꞌ => Ꞌ (LATIN SMALL LETTER SALTILLO) 370 | for (i in 0 ... 2) { map[0xA791 + i + i] = 0xA790 + i + i; } // ꞑ - ꞓ => Ꞑ - Ꞓ (LATIN SMALL LETTER N WITH DESCENDER - LATIN SMALL LETTER C WITH BAR) 371 | for (i in 0 ... 10) { map[0xA797 + i + i] = 0xA796 + i + i; } // ꞗ - ꞩ => Ꞗ - Ꞩ (LATIN SMALL LETTER B WITH FLOURISH - LATIN SMALL LETTER S WITH OBLIQUE STROKE) 372 | for (i in 0 ... 2) { map[0xA7B5 + i + i] = 0xA7B4 + i + i; } // ꞵ - ꞷ => Ꞵ - Ꞷ (LATIN SMALL LETTER BETA - LATIN SMALL LETTER OMEGA) 373 | map[0xAB53] = 0xA7B3; // ꭓ => Ꭓ (LATIN SMALL LETTER CHI) 374 | for (i in 0 ... 80) { map[0xAB70 + i] = 0x13A0 + i; } // ꭰ - ꮿ => Ꭰ - Ꮿ (CHEROKEE SMALL LETTER A - CHEROKEE SMALL LETTER YA) 375 | for (i in 0 ... 26) { map[0xFF41 + i] = 0xFF21 + i; } // a - z => A - Z (FULLWIDTH LATIN SMALL LETTER A - FULLWIDTH LATIN SMALL LETTER Z) 376 | for (i in 0 ... 40) { map[0x10428 + i] = 0x10400 + i; } // 𐐨 - 𐑏 => 𐐀 - 𐐧 (DESERET SMALL LETTER LONG I - DESERET SMALL LETTER EW) 377 | for (i in 0 ... 36) { map[0x104D8 + i] = 0x104B0 + i; } // 𐓘 - 𐓻 => 𐒰 - 𐓓 (OSAGE SMALL LETTER A - OSAGE SMALL LETTER ZHA) 378 | for (i in 0 ... 51) { map[0x10CC0 + i] = 0x10C80 + i; } // 𐳀 - 𐳲 => 𐲀 - 𐲲 (OLD HUNGARIAN SMALL LETTER A - OLD HUNGARIAN SMALL LETTER US) 379 | for (i in 0 ... 32) { map[0x118C0 + i] = 0x118A0 + i; } // 𑣀 - 𑣟 => 𑢠 - 𑢿 (WARANG CITI SMALL LETTER NGAA - WARANG CITI SMALL LETTER VIYO) 380 | for (i in 0 ... 34) { map[0x1E922 + i] = 0x1E900 + i; } // 𞤢 - 𞥃 => 𞤀 - 𞤡 (ADLAM SMALL LETTER ALIF - ADLAM SMALL LETTER SHA) 381 | } 382 | } 383 | -------------------------------------------------------------------------------- /publish-release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd $(dirname "$0") 4 | BRANCH="$(git rev-parse --abbrev-ref HEAD)" 5 | 6 | if [ "$BRANCH" == "HEAD" ] ; then 7 | echo "Publishing is not allowed from \"detached HEAD\"" 8 | echo "Switch to \"master\", \"develop\" or other valid branch and retry" 9 | exit 10 | fi 11 | 12 | if [ "$(git status -s)" != "" ] ; then 13 | echo "Seems that you have uncommitted changes. Commit and push first, than publish." 14 | git status -s 15 | exit 16 | fi 17 | 18 | if [ "$(git log --format=format:%H origin/${BRANCH}..${BRANCH})" != "" ] ; then 19 | echo "Seems that you have unpushed changes. Pull/push first, than publish." 20 | git log --format=format:"%C(auto)%H %C(green)%an%C(reset) %s" "origin/${BRANCH}..${BRANCH}" 21 | exit 22 | fi 23 | 24 | VERSION="$(cat "./haxelib.json" | grep -e '^[[:space:]]*"version"[[:space:]]*:[[:space:]]*"[0-9.]*"[[:space:]]*,[[:space:]]*$' | sed 's/[^0-9.]//g')" 25 | ESCAPED_VERSION="$(echo "$VERSION" | sed 's/\./\\./g')" 26 | HAS_TAG="$(git tag | grep -e "^v${ESCAPED_VERSION}$")" 27 | 28 | if [ "$HAS_TAG" != "" ] ; then 29 | if [ "$1" == "--retag" ] || [ "$2" == "--retag" ] ; then 30 | git tag -d "v${VERSION}" 31 | git push origin ":v${VERSION}" 32 | else 33 | echo "Git tag v${VERSION} already exists. If you want to recreate tag, use:" 34 | echo "$0 --retag" 35 | exit 36 | fi 37 | fi 38 | 39 | if [ "$1" == "--dry-run" ] || [ "$2" == "--dry-run" ] ; then 40 | exit 41 | fi 42 | 43 | echo "Tagging v${VERSION} ..." 44 | git tag "v${VERSION}" && git push --tags 45 | -------------------------------------------------------------------------------- /test/TestSuite.hx: -------------------------------------------------------------------------------- 1 | package ; 2 | 3 | import utest.UTest; 4 | 5 | class TestSuite { 6 | public static function main() { 7 | UTest.run([ 8 | new test.CaseMapsGeneratorTest(), 9 | new test.Utf8ExtTest(), 10 | new test.TransliterationTest(), 11 | ]); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/internal/EthalonCaseMapsGenerator.hx: -------------------------------------------------------------------------------- 1 | package internal; 2 | 3 | import haxe.io.Eof; 4 | import haxe.io.Path; 5 | import sys.io.File; 6 | import org.zamedev.lib.ds.LinkedMap; 7 | 8 | #if neko 9 | import neko.Utf8; 10 | #end 11 | 12 | /** 13 | * Map generator for Utf8ExtInternal 14 | * Can generate from ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt 15 | * 16 | * Reference - ftp://ftp.unicode.org/Public/3.2-Update/UnicodeData-3.2.0.html 17 | */ 18 | class EthalonCaseMapsGenerator { 19 | private static inline var IDX_CODE_POINT : Int = 0; 20 | private static inline var IDX_CHARACTER_NAME : Int = 1; 21 | private static inline var IDX_GENERAL_CATEGORY : Int = 2; 22 | // Canonical Combining Classes = 3 23 | // Bidirectional Category = 4 24 | private static inline var IDX_CHARACTER_DECOMPOSITION_MAPPING : Int = 5; 25 | // Decimal digit value = 6 26 | // Digit value = 7 27 | // Numeric value = 8 28 | // Mirrored = 9 29 | // Unicode 1.0 Name = 10 30 | // 10646 comment field = 11 31 | private static inline var IDX_UPPERCASE_MAPPING : Int = 12; 32 | private static inline var IDX_LOWERCASE_MAPPING : Int = 13; 33 | // Titlecase Mapping = 14 34 | private static inline var IDX_LAST : Int = 15; 35 | 36 | private static var unicodeMap : LinkedMap>; 37 | 38 | macro private static function resolveThisPath() { 39 | return macro $v{ haxe.macro.Context.resolvePath("test/internal/EthalonCaseMapsGenerator.hx") }; 40 | } 41 | 42 | private static function resolveThisDir() : String { 43 | return Path.directory(resolveThisPath()); 44 | } 45 | 46 | private static function readUnicodeData() : Void { 47 | var fi = File.read("additional/UnicodeData.txt", true); 48 | unicodeMap = new LinkedMap>(); 49 | 50 | while (true) { 51 | var row : Array; 52 | 53 | try { 54 | row = fi.readLine().split(";"); 55 | } catch (ex : Eof) { 56 | break; 57 | } 58 | 59 | if (row.length < IDX_LAST || (row[IDX_GENERAL_CATEGORY] != "Lu" && row[IDX_GENERAL_CATEGORY] != "Ll")) { 60 | continue; 61 | } 62 | 63 | unicodeMap[row[IDX_CODE_POINT]] = row; 64 | } 65 | 66 | fi.close(); 67 | } 68 | 69 | private static function appendMapperFunc(sb : StringBuf, funcName : String, generalCategory : String, mappingIdx : Int) : Void { 70 | println('Generating ${funcName}...'); 71 | sb.add('\tpublic static function ${funcName}(map : Map) : Void {\n'); 72 | 73 | for (codePoint in unicodeMap.keys()) { 74 | var row : Array = unicodeMap[codePoint]; 75 | 76 | if (row[IDX_GENERAL_CATEGORY] != generalCategory) { 77 | continue; 78 | } 79 | 80 | while (row != null && row[mappingIdx] == "" && row[IDX_CHARACTER_DECOMPOSITION_MAPPING] != "") { 81 | row = unicodeMap[row[IDX_CHARACTER_DECOMPOSITION_MAPPING].split(" ")[0]]; 82 | } 83 | 84 | if (row == null || row[mappingIdx] == "") { 85 | continue; 86 | } 87 | 88 | sb.add('\t\tmap[0x${codePoint}] = 0x${row[mappingIdx]}; // '); 89 | 90 | #if neko 91 | var r = new Utf8(); 92 | r.addChar(Std.parseInt('0x${codePoint}')); 93 | sb.add(r.toString()); 94 | #else 95 | sb.add(String.fromCharCode(Std.parseInt('0x${codePoint}'))); 96 | #end 97 | 98 | sb.add(" --> "); 99 | 100 | #if neko 101 | var r = new Utf8(); 102 | r.addChar(Std.parseInt('0x${row[mappingIdx]}')); 103 | sb.add(r.toString()); 104 | #else 105 | sb.add(String.fromCharCode(Std.parseInt('0x${row[mappingIdx]}'))); 106 | #end 107 | 108 | sb.add(' (${row[IDX_CHARACTER_NAME]})\n'); 109 | } 110 | 111 | sb.add("\t}\n"); 112 | } 113 | 114 | public static function main() : Void { 115 | println("Preparing..."); 116 | 117 | readUnicodeData(); 118 | 119 | var sb = new StringBuf(); 120 | 121 | sb.add("package internal;\n"); 122 | sb.add("\n"); 123 | sb.add("// Use internal.EthalonCaseMapsGenerator to generate this file.\n"); 124 | sb.add("\n"); 125 | sb.add("class Utf8ExtInternalEthalon {\n"); 126 | appendMapperFunc(sb, "fillUpperToLowerMap", "Lu", IDX_LOWERCASE_MAPPING); 127 | sb.add("\n"); 128 | appendMapperFunc(sb, "fillLowerToUpperMap", "Ll", IDX_UPPERCASE_MAPPING); 129 | sb.add("}\n"); 130 | 131 | println("Writing result file..."); 132 | File.saveContent(resolveThisDir() + "/Utf8ExtInternalEthalon.hx" , sb.toString()); 133 | 134 | println("Done"); 135 | } 136 | 137 | private static function println(message : String) : Void { 138 | #if sys 139 | Sys.print(message + "\n"); 140 | #elseif neko 141 | neko.Lib.println(message); 142 | #else 143 | trace(message); 144 | #end 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /test/lix-haxe3/.haxerc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "3.4.7", 3 | "resolveLibs": "scoped" 4 | } -------------------------------------------------------------------------------- /test/lix-haxe3/haxe_libraries/hashlink.hxml: -------------------------------------------------------------------------------- 1 | # @install: lix --silent download "haxelib:/hashlink#0.1.0" into hashlink/0.1.0/haxelib 2 | # @run: haxelib run-dir hashlink ${HAXE_LIBCACHE}/hashlink/0.1.0/haxelib 3 | -cp ${HAXE_LIBCACHE}/hashlink/0.1.0/haxelib/ 4 | -D hashlink=0.1.0 5 | -------------------------------------------------------------------------------- /test/lix-haxe3/haxe_libraries/hxcpp.hxml: -------------------------------------------------------------------------------- 1 | # @install: lix --silent download "haxelib:/hxcpp#4.0.64" into hxcpp/4.0.64/haxelib 2 | # @run: haxelib run-dir hxcpp ${HAXE_LIBCACHE}/hxcpp/4.0.64/haxelib 3 | -cp ${HAXE_LIBCACHE}/hxcpp/4.0.64/haxelib/ 4 | -D hxcpp=4.0.64 5 | -------------------------------------------------------------------------------- /test/lix-haxe3/haxe_libraries/hxcs.hxml: -------------------------------------------------------------------------------- 1 | # @install: lix --silent download "haxelib:/hxcs#3.4.0" into hxcs/3.4.0/haxelib 2 | # @run: haxelib run-dir hxcs ${HAXE_LIBCACHE}/hxcs/3.4.0/haxelib 3 | -cp ${HAXE_LIBCACHE}/hxcs/3.4.0/haxelib/ 4 | -D hxcs=3.4.0 5 | -------------------------------------------------------------------------------- /test/lix-haxe3/haxe_libraries/hxjava.hxml: -------------------------------------------------------------------------------- 1 | # @install: lix --silent download "haxelib:/hxjava#3.2.0" into hxjava/3.2.0/haxelib 2 | # @run: haxelib run-dir hxjava ${HAXE_LIBCACHE}/hxjava/3.2.0/haxelib 3 | -cp ${HAXE_LIBCACHE}/hxjava/3.2.0/haxelib/ 4 | -D hxjava=3.2.0 5 | -java-lib lib/hxjava-std.jar 6 | -------------------------------------------------------------------------------- /test/lix-haxe3/haxe_libraries/utest.hxml: -------------------------------------------------------------------------------- 1 | # @install: lix --silent download "haxelib:/utest#1.10.1" into utest/1.10.1/haxelib 2 | -cp ${HAXE_LIBCACHE}/utest/1.10.1/haxelib/src 3 | -D utest=1.10.1 4 | -------------------------------------------------------------------------------- /test/lix-haxe4/.haxerc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "4.0.5", 3 | "resolveLibs": "scoped" 4 | } -------------------------------------------------------------------------------- /test/lix-haxe4/haxe_libraries/hashlink.hxml: -------------------------------------------------------------------------------- 1 | # @install: lix --silent download "haxelib:/hashlink#0.1.0" into hashlink/0.1.0/haxelib 2 | # @run: haxelib run-dir hashlink ${HAXE_LIBCACHE}/hashlink/0.1.0/haxelib 3 | -cp ${HAXE_LIBCACHE}/hashlink/0.1.0/haxelib/ 4 | -D hashlink=0.1.0 5 | -------------------------------------------------------------------------------- /test/lix-haxe4/haxe_libraries/hxcpp.hxml: -------------------------------------------------------------------------------- 1 | # @install: lix --silent download "haxelib:/hxcpp#4.0.64" into hxcpp/4.0.64/haxelib 2 | # @run: haxelib run-dir hxcpp ${HAXE_LIBCACHE}/hxcpp/4.0.64/haxelib 3 | -cp ${HAXE_LIBCACHE}/hxcpp/4.0.64/haxelib/ 4 | -D hxcpp=4.0.64 5 | -------------------------------------------------------------------------------- /test/lix-haxe4/haxe_libraries/hxcs.hxml: -------------------------------------------------------------------------------- 1 | # @install: lix --silent download "haxelib:/hxcs#3.4.0" into hxcs/3.4.0/haxelib 2 | # @run: haxelib run-dir hxcs ${HAXE_LIBCACHE}/hxcs/3.4.0/haxelib 3 | -cp ${HAXE_LIBCACHE}/hxcs/3.4.0/haxelib/ 4 | -D hxcs=3.4.0 5 | -------------------------------------------------------------------------------- /test/lix-haxe4/haxe_libraries/hxjava.hxml: -------------------------------------------------------------------------------- 1 | # @install: lix --silent download "haxelib:/hxjava#3.2.0" into hxjava/3.2.0/haxelib 2 | # @run: haxelib run-dir hxjava ${HAXE_LIBCACHE}/hxjava/3.2.0/haxelib 3 | -cp ${HAXE_LIBCACHE}/hxjava/3.2.0/haxelib/ 4 | -D hxjava=3.2.0 5 | -java-lib lib/hxjava-std.jar 6 | -------------------------------------------------------------------------------- /test/lix-haxe4/haxe_libraries/utest.hxml: -------------------------------------------------------------------------------- 1 | # @install: lix --silent download "haxelib:/utest#1.10.1" into utest/1.10.1/haxelib 2 | -cp ${HAXE_LIBCACHE}/utest/1.10.1/haxelib/src 3 | -D utest=1.10.1 4 | -------------------------------------------------------------------------------- /test/lix-haxe4/haxe_libraries/zame-miscutils.hxml: -------------------------------------------------------------------------------- 1 | # @install: lix --silent download "gh://github.com/restorer/zame-haxe-miscutils#54e170fec87f781addc2608f67b27e73efd047fd" into zame-miscutils/1.0.0/github/54e170fec87f781addc2608f67b27e73efd047fd 2 | -cp ${HAXE_LIBCACHE}/zame-miscutils/1.0.0/github/54e170fec87f781addc2608f67b27e73efd047fd/ 3 | -D zame-miscutils=1.0.0 4 | -------------------------------------------------------------------------------- /test/test/CaseMapsGeneratorTest.hx: -------------------------------------------------------------------------------- 1 | package test; 2 | 3 | import internal.Utf8ExtInternalEthalon; 4 | import org.zamedev.lib.internal.Utf8ExtInternal; 5 | import utest.Assert; 6 | import utest.Test; 7 | 8 | class CaseMapsGeneratorTest extends Test { 9 | public function testUpperToLowerMapping() : Void { 10 | var ethalonMap = new Map(); 11 | var testMap = new Map(); 12 | 13 | Utf8ExtInternalEthalon.fillUpperToLowerMap(ethalonMap); 14 | Utf8ExtInternal.fillUpperToLowerMap(testMap); 15 | 16 | for (key in ethalonMap.keys()) { 17 | Assert.isTrue(testMap.exists(key)); 18 | Assert.equals(ethalonMap[key], testMap[key]); 19 | } 20 | 21 | for (key in testMap.keys()) { 22 | Assert.isTrue(ethalonMap.exists(key)); 23 | } 24 | } 25 | 26 | public function testLowerToUpperMapping() : Void { 27 | var ethalonMap = new Map(); 28 | var testMap = new Map(); 29 | 30 | Utf8ExtInternalEthalon.fillLowerToUpperMap(ethalonMap); 31 | Utf8ExtInternal.fillLowerToUpperMap(testMap); 32 | 33 | for (key in ethalonMap.keys()) { 34 | Assert.isTrue(testMap.exists(key)); 35 | Assert.equals(ethalonMap[key], testMap[key]); 36 | } 37 | 38 | for (key in testMap.keys()) { 39 | Assert.isTrue(ethalonMap.exists(key)); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /test/test/TransliterationTest.hx: -------------------------------------------------------------------------------- 1 | package test; 2 | 3 | import org.zamedev.lib.Transliteration; 4 | import utest.Assert; 5 | import utest.Test; 6 | 7 | class TransliterationTest extends Test { 8 | public function testBe() : Void { 9 | Assert.equals( 10 | "uladzimir-karatkievich-khrystos-pryziamliwsia-w-harodni", 11 | Transliteration.be("Уладзімір Караткевіч - Хрыстос Прызямліўся Ў Гародні") 12 | ); 13 | } 14 | 15 | public function testRu() : Void { 16 | Assert.equals( 17 | "s-esh-zhe-eschyo-ehtikh-myagkikh-francuzskikh-bulok-da-vypej-chaju", 18 | Transliteration.ru("Съешь же ещё этих мягких французских булок да выпей чаю") 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /test/test/Utf8ExtTest.hx: -------------------------------------------------------------------------------- 1 | package test; 2 | 3 | import org.zamedev.lib.Utf8Ext; 4 | import utest.Assert; 5 | import utest.Test; 6 | 7 | class Utf8ExtTest extends Test { 8 | public function testToLowerCase() : Void { 9 | var str = "This is thE test. Привет! Миру миР! αβγδεζηθικλμνξοπρστυφχψωςάέήίόύΰώϊΐϋ"; 10 | var lcStr = "this is the test. привет! миру мир! αβγδεζηθικλμνξοπρστυφχψωςάέήίόύΰώϊΐϋ"; 11 | 12 | Assert.equals(lcStr, Utf8Ext.toLowerCase(str)); 13 | Assert.equals("日本語", Utf8Ext.toLowerCase("日本語")); 14 | } 15 | 16 | public function testToUpperCase() : Void { 17 | #if neko 18 | // Neko for sure use internal implementation. Other targets may use native implementation (especially on Haxe 4) 19 | var str = "This is thE test. Привет! Миру миР! αβγδεζηθικλμνξοπρστυφχψωςάέήίόύώϊϋ ΰΐ"; 20 | var ucStr = "THIS IS THE TEST. ПРИВЕТ! МИРУ МИР! ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΣΆΈΉΊΌΎΏΪΫ ΫΪ"; 21 | #else 22 | var str = "This is thE test. Привет! Миру миР! αβγδεζηθικλμνξοπρστυφχψωςάέήίόύώϊϋ"; 23 | var ucStr = "THIS IS THE TEST. ПРИВЕТ! МИРУ МИР! ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΣΆΈΉΊΌΎΏΪΫ"; 24 | #end 25 | 26 | Assert.equals(ucStr, Utf8Ext.toUpperCase(str)); 27 | Assert.equals("日本語", Utf8Ext.toUpperCase("日本語")); 28 | } 29 | 30 | public function testGetUnicodeRe() : Void { 31 | var str = "This is thE test. Привет! Миру миР! αβγδεζηθικλμνξοπρστυφχψωςάέήίόύΰώϊΐϋ"; 32 | var replA = "---- -- --- ----. ------! ---- ---! ------------------------------------"; 33 | var replB = "This-is-thE-test--Привет--Миру-миР--αβγδεζηθικλμνξοπρστυφχψωςάέήίόύΰώϊΐϋ"; 34 | 35 | Assert.equals(replA, Utf8Ext.getUnicodeRe().replace(str, "-")); 36 | Assert.equals(replB, Utf8Ext.getUnicodeRe("^").replace(str, "-")); 37 | } 38 | 39 | public function testUpperToLowerMapping() : Void { 40 | Assert.equals(" ", Utf8Ext.toLowerCase(" ")); 41 | Assert.equals(".", Utf8Ext.toLowerCase(".")); 42 | Assert.equals(",", Utf8Ext.toLowerCase(",")); 43 | Assert.equals("!", Utf8Ext.toLowerCase("!")); 44 | Assert.equals("0", Utf8Ext.toLowerCase("0")); 45 | Assert.equals("1", Utf8Ext.toLowerCase("1")); 46 | Assert.equals("2", Utf8Ext.toLowerCase("2")); 47 | Assert.equals("3", Utf8Ext.toLowerCase("3")); 48 | Assert.equals("4", Utf8Ext.toLowerCase("4")); 49 | Assert.equals("5", Utf8Ext.toLowerCase("5")); 50 | Assert.equals("6", Utf8Ext.toLowerCase("6")); 51 | Assert.equals("7", Utf8Ext.toLowerCase("7")); 52 | Assert.equals("8", Utf8Ext.toLowerCase("8")); 53 | Assert.equals("9", Utf8Ext.toLowerCase("9")); 54 | 55 | Assert.equals("a", Utf8Ext.toLowerCase("A")); 56 | Assert.equals("b", Utf8Ext.toLowerCase("B")); 57 | Assert.equals("c", Utf8Ext.toLowerCase("C")); 58 | Assert.equals("d", Utf8Ext.toLowerCase("D")); 59 | Assert.equals("e", Utf8Ext.toLowerCase("E")); 60 | Assert.equals("f", Utf8Ext.toLowerCase("F")); 61 | Assert.equals("g", Utf8Ext.toLowerCase("G")); 62 | Assert.equals("h", Utf8Ext.toLowerCase("H")); 63 | Assert.equals("i", Utf8Ext.toLowerCase("I")); 64 | Assert.equals("j", Utf8Ext.toLowerCase("J")); 65 | Assert.equals("k", Utf8Ext.toLowerCase("K")); 66 | Assert.equals("l", Utf8Ext.toLowerCase("L")); 67 | Assert.equals("m", Utf8Ext.toLowerCase("M")); 68 | Assert.equals("n", Utf8Ext.toLowerCase("N")); 69 | Assert.equals("o", Utf8Ext.toLowerCase("O")); 70 | Assert.equals("p", Utf8Ext.toLowerCase("P")); 71 | Assert.equals("q", Utf8Ext.toLowerCase("Q")); 72 | Assert.equals("r", Utf8Ext.toLowerCase("R")); 73 | Assert.equals("s", Utf8Ext.toLowerCase("S")); 74 | Assert.equals("t", Utf8Ext.toLowerCase("T")); 75 | Assert.equals("u", Utf8Ext.toLowerCase("U")); 76 | Assert.equals("v", Utf8Ext.toLowerCase("V")); 77 | Assert.equals("w", Utf8Ext.toLowerCase("W")); 78 | Assert.equals("x", Utf8Ext.toLowerCase("X")); 79 | Assert.equals("y", Utf8Ext.toLowerCase("Y")); 80 | Assert.equals("z", Utf8Ext.toLowerCase("Z")); 81 | 82 | Assert.equals("а", Utf8Ext.toLowerCase("А")); 83 | Assert.equals("б", Utf8Ext.toLowerCase("Б")); 84 | Assert.equals("в", Utf8Ext.toLowerCase("В")); 85 | Assert.equals("г", Utf8Ext.toLowerCase("Г")); 86 | Assert.equals("д", Utf8Ext.toLowerCase("Д")); 87 | Assert.equals("е", Utf8Ext.toLowerCase("Е")); 88 | Assert.equals("ё", Utf8Ext.toLowerCase("Ё")); 89 | Assert.equals("ж", Utf8Ext.toLowerCase("Ж")); 90 | Assert.equals("з", Utf8Ext.toLowerCase("З")); 91 | Assert.equals("и", Utf8Ext.toLowerCase("И")); 92 | Assert.equals("й", Utf8Ext.toLowerCase("Й")); 93 | Assert.equals("к", Utf8Ext.toLowerCase("К")); 94 | Assert.equals("л", Utf8Ext.toLowerCase("Л")); 95 | Assert.equals("м", Utf8Ext.toLowerCase("М")); 96 | Assert.equals("н", Utf8Ext.toLowerCase("Н")); 97 | Assert.equals("о", Utf8Ext.toLowerCase("О")); 98 | Assert.equals("п", Utf8Ext.toLowerCase("П")); 99 | Assert.equals("р", Utf8Ext.toLowerCase("Р")); 100 | Assert.equals("с", Utf8Ext.toLowerCase("С")); 101 | Assert.equals("т", Utf8Ext.toLowerCase("Т")); 102 | Assert.equals("у", Utf8Ext.toLowerCase("У")); 103 | Assert.equals("ф", Utf8Ext.toLowerCase("Ф")); 104 | Assert.equals("х", Utf8Ext.toLowerCase("Х")); 105 | Assert.equals("ц", Utf8Ext.toLowerCase("Ц")); 106 | Assert.equals("ч", Utf8Ext.toLowerCase("Ч")); 107 | Assert.equals("ш", Utf8Ext.toLowerCase("Ш")); 108 | Assert.equals("щ", Utf8Ext.toLowerCase("Щ")); 109 | Assert.equals("ъ", Utf8Ext.toLowerCase("Ъ")); 110 | Assert.equals("ы", Utf8Ext.toLowerCase("Ы")); 111 | Assert.equals("ь", Utf8Ext.toLowerCase("Ь")); 112 | Assert.equals("э", Utf8Ext.toLowerCase("Э")); 113 | Assert.equals("ю", Utf8Ext.toLowerCase("Ю")); 114 | Assert.equals("я", Utf8Ext.toLowerCase("Я")); 115 | 116 | Assert.equals("ä", Utf8Ext.toLowerCase("Ä")); 117 | 118 | Assert.equals("α", Utf8Ext.toLowerCase("Α")); 119 | Assert.equals("β", Utf8Ext.toLowerCase("Β")); 120 | Assert.equals("γ", Utf8Ext.toLowerCase("Γ")); 121 | Assert.equals("δ", Utf8Ext.toLowerCase("Δ")); 122 | Assert.equals("ε", Utf8Ext.toLowerCase("Ε")); 123 | Assert.equals("ζ", Utf8Ext.toLowerCase("Ζ")); 124 | Assert.equals("η", Utf8Ext.toLowerCase("Η")); 125 | Assert.equals("θ", Utf8Ext.toLowerCase("Θ")); 126 | Assert.equals("ι", Utf8Ext.toLowerCase("Ι")); 127 | Assert.equals("κ", Utf8Ext.toLowerCase("Κ")); 128 | Assert.equals("λ", Utf8Ext.toLowerCase("Λ")); 129 | Assert.equals("μ", Utf8Ext.toLowerCase("Μ")); 130 | Assert.equals("ν", Utf8Ext.toLowerCase("Ν")); 131 | Assert.equals("ξ", Utf8Ext.toLowerCase("Ξ")); 132 | Assert.equals("ο", Utf8Ext.toLowerCase("Ο")); 133 | Assert.equals("π", Utf8Ext.toLowerCase("Π")); 134 | Assert.equals("ρ", Utf8Ext.toLowerCase("Ρ")); 135 | 136 | #if (!js) 137 | // Chrome = "ς", Firefox = "σ", Safari = "σ" 138 | Assert.equals("σ", Utf8Ext.toLowerCase("Σ")); 139 | #end 140 | 141 | Assert.equals("τ", Utf8Ext.toLowerCase("Τ")); 142 | Assert.equals("υ", Utf8Ext.toLowerCase("Υ")); 143 | Assert.equals("φ", Utf8Ext.toLowerCase("Φ")); 144 | Assert.equals("χ", Utf8Ext.toLowerCase("Χ")); 145 | Assert.equals("ψ", Utf8Ext.toLowerCase("Ψ")); 146 | Assert.equals("ω", Utf8Ext.toLowerCase("Ω")); 147 | Assert.equals("ς", Utf8Ext.toLowerCase("ς")); 148 | Assert.equals("ά", Utf8Ext.toLowerCase("Ά")); 149 | Assert.equals("έ", Utf8Ext.toLowerCase("Έ")); 150 | Assert.equals("ή", Utf8Ext.toLowerCase("Ή")); 151 | Assert.equals("ί", Utf8Ext.toLowerCase("Ί")); 152 | Assert.equals("ό", Utf8Ext.toLowerCase("Ό")); 153 | Assert.equals("ύ", Utf8Ext.toLowerCase("Ύ")); 154 | Assert.equals("ΰ", Utf8Ext.toLowerCase("Ϋ́")); 155 | Assert.equals("ώ", Utf8Ext.toLowerCase("Ώ")); 156 | Assert.equals("ϊ", Utf8Ext.toLowerCase("Ϊ")); 157 | Assert.equals("ΐ", Utf8Ext.toLowerCase("Ϊ́")); 158 | Assert.equals("ϋ", Utf8Ext.toLowerCase("Ϋ")); 159 | } 160 | 161 | @Test 162 | public function testLowerToUpperMapping() : Void { 163 | Assert.equals(" ", Utf8Ext.toUpperCase(" ")); 164 | Assert.equals(".", Utf8Ext.toUpperCase(".")); 165 | Assert.equals(",", Utf8Ext.toUpperCase(",")); 166 | Assert.equals("!", Utf8Ext.toUpperCase("!")); 167 | Assert.equals("0", Utf8Ext.toUpperCase("0")); 168 | Assert.equals("1", Utf8Ext.toUpperCase("1")); 169 | Assert.equals("2", Utf8Ext.toUpperCase("2")); 170 | Assert.equals("3", Utf8Ext.toUpperCase("3")); 171 | Assert.equals("4", Utf8Ext.toUpperCase("4")); 172 | Assert.equals("5", Utf8Ext.toUpperCase("5")); 173 | Assert.equals("6", Utf8Ext.toUpperCase("6")); 174 | Assert.equals("7", Utf8Ext.toUpperCase("7")); 175 | Assert.equals("8", Utf8Ext.toUpperCase("8")); 176 | Assert.equals("9", Utf8Ext.toUpperCase("9")); 177 | 178 | Assert.equals("A", Utf8Ext.toUpperCase("a")); 179 | Assert.equals("B", Utf8Ext.toUpperCase("b")); 180 | Assert.equals("C", Utf8Ext.toUpperCase("c")); 181 | Assert.equals("D", Utf8Ext.toUpperCase("d")); 182 | Assert.equals("E", Utf8Ext.toUpperCase("e")); 183 | Assert.equals("F", Utf8Ext.toUpperCase("f")); 184 | Assert.equals("G", Utf8Ext.toUpperCase("g")); 185 | Assert.equals("H", Utf8Ext.toUpperCase("h")); 186 | Assert.equals("I", Utf8Ext.toUpperCase("i")); 187 | Assert.equals("J", Utf8Ext.toUpperCase("j")); 188 | Assert.equals("K", Utf8Ext.toUpperCase("k")); 189 | Assert.equals("L", Utf8Ext.toUpperCase("l")); 190 | Assert.equals("M", Utf8Ext.toUpperCase("m")); 191 | Assert.equals("N", Utf8Ext.toUpperCase("n")); 192 | Assert.equals("O", Utf8Ext.toUpperCase("o")); 193 | Assert.equals("P", Utf8Ext.toUpperCase("p")); 194 | Assert.equals("Q", Utf8Ext.toUpperCase("q")); 195 | Assert.equals("R", Utf8Ext.toUpperCase("r")); 196 | Assert.equals("S", Utf8Ext.toUpperCase("s")); 197 | Assert.equals("T", Utf8Ext.toUpperCase("t")); 198 | Assert.equals("U", Utf8Ext.toUpperCase("u")); 199 | Assert.equals("V", Utf8Ext.toUpperCase("v")); 200 | Assert.equals("W", Utf8Ext.toUpperCase("w")); 201 | Assert.equals("X", Utf8Ext.toUpperCase("x")); 202 | Assert.equals("Y", Utf8Ext.toUpperCase("y")); 203 | Assert.equals("Z", Utf8Ext.toUpperCase("z")); 204 | 205 | Assert.equals("А", Utf8Ext.toUpperCase("а")); 206 | Assert.equals("Б", Utf8Ext.toUpperCase("б")); 207 | Assert.equals("В", Utf8Ext.toUpperCase("в")); 208 | Assert.equals("Г", Utf8Ext.toUpperCase("г")); 209 | Assert.equals("Д", Utf8Ext.toUpperCase("д")); 210 | Assert.equals("Е", Utf8Ext.toUpperCase("е")); 211 | Assert.equals("Ё", Utf8Ext.toUpperCase("ё")); 212 | Assert.equals("Ж", Utf8Ext.toUpperCase("ж")); 213 | Assert.equals("З", Utf8Ext.toUpperCase("з")); 214 | Assert.equals("И", Utf8Ext.toUpperCase("и")); 215 | Assert.equals("Й", Utf8Ext.toUpperCase("й")); 216 | Assert.equals("К", Utf8Ext.toUpperCase("к")); 217 | Assert.equals("Л", Utf8Ext.toUpperCase("л")); 218 | Assert.equals("М", Utf8Ext.toUpperCase("м")); 219 | Assert.equals("Н", Utf8Ext.toUpperCase("н")); 220 | Assert.equals("О", Utf8Ext.toUpperCase("о")); 221 | Assert.equals("П", Utf8Ext.toUpperCase("п")); 222 | Assert.equals("Р", Utf8Ext.toUpperCase("р")); 223 | Assert.equals("С", Utf8Ext.toUpperCase("с")); 224 | Assert.equals("Т", Utf8Ext.toUpperCase("т")); 225 | Assert.equals("У", Utf8Ext.toUpperCase("у")); 226 | Assert.equals("Ф", Utf8Ext.toUpperCase("ф")); 227 | Assert.equals("Х", Utf8Ext.toUpperCase("х")); 228 | Assert.equals("Ц", Utf8Ext.toUpperCase("ц")); 229 | Assert.equals("Ч", Utf8Ext.toUpperCase("ч")); 230 | Assert.equals("Ш", Utf8Ext.toUpperCase("ш")); 231 | Assert.equals("Щ", Utf8Ext.toUpperCase("щ")); 232 | Assert.equals("Ъ", Utf8Ext.toUpperCase("ъ")); 233 | Assert.equals("Ы", Utf8Ext.toUpperCase("ы")); 234 | Assert.equals("Ь", Utf8Ext.toUpperCase("ь")); 235 | Assert.equals("Э", Utf8Ext.toUpperCase("э")); 236 | Assert.equals("Ю", Utf8Ext.toUpperCase("ю")); 237 | Assert.equals("Я", Utf8Ext.toUpperCase("я")); 238 | 239 | Assert.equals("Ä", Utf8Ext.toUpperCase("ä")); 240 | 241 | Assert.equals("Α", Utf8Ext.toUpperCase("α")); 242 | Assert.equals("Β", Utf8Ext.toUpperCase("β")); 243 | Assert.equals("Γ", Utf8Ext.toUpperCase("γ")); 244 | Assert.equals("Δ", Utf8Ext.toUpperCase("δ")); 245 | Assert.equals("Ε", Utf8Ext.toUpperCase("ε")); 246 | Assert.equals("Ζ", Utf8Ext.toUpperCase("ζ")); 247 | Assert.equals("Η", Utf8Ext.toUpperCase("η")); 248 | Assert.equals("Θ", Utf8Ext.toUpperCase("θ")); 249 | Assert.equals("Ι", Utf8Ext.toUpperCase("ι")); 250 | Assert.equals("Κ", Utf8Ext.toUpperCase("κ")); 251 | Assert.equals("Λ", Utf8Ext.toUpperCase("λ")); 252 | Assert.equals("Μ", Utf8Ext.toUpperCase("μ")); 253 | Assert.equals("Ν", Utf8Ext.toUpperCase("ν")); 254 | Assert.equals("Ξ", Utf8Ext.toUpperCase("ξ")); 255 | Assert.equals("Ο", Utf8Ext.toUpperCase("ο")); 256 | Assert.equals("Π", Utf8Ext.toUpperCase("π")); 257 | Assert.equals("Ρ", Utf8Ext.toUpperCase("ρ")); 258 | Assert.equals("Σ", Utf8Ext.toUpperCase("σ")); 259 | Assert.equals("Τ", Utf8Ext.toUpperCase("τ")); 260 | Assert.equals("Υ", Utf8Ext.toUpperCase("υ")); 261 | Assert.equals("Φ", Utf8Ext.toUpperCase("φ")); 262 | Assert.equals("Χ", Utf8Ext.toUpperCase("χ")); 263 | Assert.equals("Ψ", Utf8Ext.toUpperCase("ψ")); 264 | Assert.equals("Ω", Utf8Ext.toUpperCase("ω")); 265 | 266 | #if (!flash) 267 | // Flash = "΢" 268 | Assert.equals("Σ", Utf8Ext.toUpperCase("ς")); 269 | #end 270 | 271 | Assert.equals("Ά", Utf8Ext.toUpperCase("ά")); 272 | Assert.equals("Έ", Utf8Ext.toUpperCase("έ")); 273 | Assert.equals("Ή", Utf8Ext.toUpperCase("ή")); 274 | Assert.equals("Ί", Utf8Ext.toUpperCase("ί")); 275 | Assert.equals("Ό", Utf8Ext.toUpperCase("ό")); 276 | Assert.equals("Ύ", Utf8Ext.toUpperCase("ύ")); 277 | 278 | #if neko 279 | // Chrome = "Ϋ́", Firefox = "ΰ", Safari = "Ϋ́", Flash = "ΰ", Interp = "Ϋ" 280 | Assert.equals("Ϋ", Utf8Ext.toUpperCase("ΰ")); 281 | #end 282 | 283 | Assert.equals("Ϋ́", Utf8Ext.toUpperCase("ΰ")); 284 | Assert.equals("Ώ", Utf8Ext.toUpperCase("ώ")); 285 | Assert.equals("Ϊ", Utf8Ext.toUpperCase("ϊ")); 286 | Assert.equals("Ϊ́", Utf8Ext.toUpperCase("ΐ")); 287 | 288 | #if neko 289 | // Chrome = "Ϊ́", Firefox = "ΐ", Safari = "Ϊ́", Flash = "ΐ", Interp = "Ϊ" 290 | Assert.equals("Ϊ", Utf8Ext.toUpperCase("ΐ")); 291 | #end 292 | 293 | Assert.equals("Ϋ", Utf8Ext.toUpperCase("ϋ")); 294 | } 295 | } 296 | -------------------------------------------------------------------------------- /unit-test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd $(dirname "$0") 4 | 5 | target_interp () { 6 | cat << EOF >> "$2" 7 | -cmd echo ">>>> Interp" 8 | --next 9 | --interp 10 | --next 11 | EOF 12 | } 13 | 14 | target_neko () { 15 | cat << EOF >> "$2" 16 | -cmd echo ">>>> Neko" 17 | --next 18 | -neko $1/neko/test.n 19 | -cmd neko $1/neko/test.n 20 | --next 21 | EOF 22 | } 23 | 24 | target_js () { 25 | cat << EOF >> "$2" 26 | -cmd echo ">>>> JS" 27 | --next 28 | -js $1/js/test.js 29 | -cmd node $1/js/test.js 30 | --next 31 | EOF 32 | } 33 | 34 | target_cpp () { 35 | cat << EOF >> "$2" 36 | -cmd echo ">>>> CPP" 37 | --next 38 | -D nostrip 39 | -cpp $1/cpp 40 | -cmd $1/cpp/TestSuite 41 | --next 42 | EOF 43 | } 44 | 45 | target_hl () { 46 | cat << EOF >> "$2" 47 | -cmd echo ">>>> HL" 48 | --next 49 | -hl $1/hl/test.hl 50 | -cmd hl $1/hl/test.hl 51 | --next 52 | EOF 53 | } 54 | 55 | target_hlc () { 56 | cat << EOF >> "$2" 57 | -cmd echo ">>>> HL/C" 58 | --next 59 | -hl $1/hlc/test.c 60 | -cmd gcc -O3 -o $1/hlc/test_hlc -std=c11 -I /usr/local/include/hl -I $1/hlc $1/hlc/test.c -lhl && $1/hlc/test_hlc 61 | --next 62 | EOF 63 | } 64 | 65 | target_php () { 66 | cat << EOF >> "$2" 67 | -cmd echo ">>>> PHP" 68 | --next 69 | -D php7 70 | -php $1/php 71 | -cmd php $1/php/index.php 72 | --next 73 | EOF 74 | } 75 | 76 | target_java () { 77 | cat << EOF >> "$2" 78 | -cmd echo ">>>> Java" 79 | --next 80 | -java $1/java 81 | -cmd java -jar $1/java/TestSuite.jar 82 | --next 83 | EOF 84 | } 85 | 86 | target_python () { 87 | cat << EOF >> "$2" 88 | -cmd echo ">>>> Python" 89 | --next 90 | -python $1/python3/test.py 91 | -cmd python3 $1/python3/test.py 92 | --next 93 | EOF 94 | } 95 | 96 | target_cs () { 97 | cat << EOF >> "$2" 98 | -cmd echo ">>>> CS" 99 | --next 100 | -cs $1/cs 101 | -cmd mono $1/cs/bin/TestSuite.exe 102 | --next 103 | EOF 104 | } 105 | 106 | target_cppia () { 107 | cat << EOF >> "$2" 108 | -cmd echo ">>>> CPPIA" 109 | --next 110 | -cppia $1/test.cppia 111 | -cmd haxelib run hxcpp $1/test.cppia 112 | --next 113 | EOF 114 | } 115 | 116 | target_lua () { 117 | cat << EOF >> "$2" 118 | -cmd echo ">>>> LUA" 119 | --next 120 | -lua $1/lua/test.lua 121 | -cmd lua $1/lua/test.lua 122 | --next 123 | EOF 124 | } 125 | 126 | target_lua_vanilla () { 127 | cat << EOF >> "$2" 128 | -cmd echo ">>>> LUA/vanilla" 129 | --next 130 | -D lua_vanilla 131 | -lua $1/lua_vanilla/test.lua 132 | -cmd lua $1/lua_vanilla/test.lua 133 | --next 134 | EOF 135 | } 136 | 137 | has_target () { 138 | TARGET="$1" 139 | shift 140 | 141 | [[ " $@ " =~ " -${TARGET} " ]] && return 1 142 | [[ " $@ " =~ " $TARGET " ]] && return 0 143 | 144 | while [[ $# -gt 0 ]] ; do 145 | [ "${1:0:1}" != "-" ] && return 1 146 | shift 147 | done 148 | 149 | return 0 150 | } 151 | 152 | cleanup () { 153 | [ -L haxe_libraries ] && rm haxe_libraries 154 | [ -L .haxerc ] && rm .haxerc 155 | } 156 | 157 | setup_lix () { 158 | cleanup 159 | 160 | ln -s "test/lix-$1/haxe_libraries" haxe_libraries 161 | ln -s "test/lix-$1/.haxerc" .haxerc 162 | } 163 | 164 | run_tests () { 165 | HAXE="$1" 166 | shift 167 | 168 | BUILD=".build/$HAXE" 169 | mkdir -p "$BUILD" 170 | 171 | HXML="$BUILD/test.hxml" 172 | 173 | cat << EOF > "$HXML" 174 | -cp . 175 | -cp ./test 176 | -lib utest 177 | -main TestSuite 178 | --each 179 | EOF 180 | 181 | has_target interp "$@" && target_interp "$BUILD" "$HXML" 182 | has_target neko "$@" && target_neko "$BUILD" "$HXML" 183 | has_target js "$@" && target_js "$BUILD" "$HXML" 184 | has_target cpp "$@" && target_cpp "$BUILD" "$HXML" 185 | has_target hl "$@" && target_hl "$BUILD" "$HXML" 186 | has_target hlc "$@" && target_hlc "$BUILD" "$HXML" 187 | has_target php "$@" && target_php "$BUILD" "$HXML" 188 | has_target java "$@" && target_java "$BUILD" "$HXML" 189 | has_target python "$@" && target_python "$BUILD" "$HXML" 190 | # has_target cs "$@" && target_cs "$BUILD" "$HXML" 191 | has_target cppia "$@" && target_cppia "$BUILD" "$HXML" 192 | has_target lua "$@" && target_lua "$BUILD" "$HXML" 193 | has_target lua_vanilla "$@" && target_lua_vanilla "$BUILD" "$HXML" 194 | 195 | cat << EOF >> "$HXML" 196 | -cmd echo ">>>> Done" 197 | EOF 198 | 199 | echo "==== $HAXE ====" 200 | echo 201 | 202 | setup_lix "$HAXE" 203 | haxe "$HXML" 204 | } 205 | 206 | run_tests haxe3 -hl -hlc -cppia "$@" && run_tests haxe4 -lua -lua_vanilla "$@" 207 | RESULT="$?" 208 | 209 | cleanup 210 | exit "$RESULT" 211 | --------------------------------------------------------------------------------