├── .gitignore ├── output └── zlm-manri.otf ├── test ├── font │ ├── zlm-manri.otf │ ├── zbalermorna-latin.otf │ └── zbalermorna-manri.otf ├── preview.js └── index.html ├── package.json ├── gulpfile.js ├── ime ├── zlm.ibus └── zlm-suzil__old-unicode-range.ibus ├── LICENSE ├── tools ├── zlm.ibus.ls └── zlm.feature.ls ├── src ├── sfd-template.ls └── zlm.feature ├── readme.md └── doc └── unicode-layout.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | todo.md 3 | -------------------------------------------------------------------------------- /output/zlm-manri.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lakmeer/zbalermorna/HEAD/output/zlm-manri.otf -------------------------------------------------------------------------------- /test/font/zlm-manri.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lakmeer/zbalermorna/HEAD/test/font/zlm-manri.otf -------------------------------------------------------------------------------- /test/font/zbalermorna-latin.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lakmeer/zbalermorna/HEAD/test/font/zbalermorna-latin.otf -------------------------------------------------------------------------------- /test/font/zbalermorna-manri.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lakmeer/zbalermorna/HEAD/test/font/zbalermorna-manri.otf -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "zbalermorna-font-development-kit", 3 | "version": "1.0.0", 4 | "description": "Tools and processes for designing typefaces for Zbalermorna", 5 | "main": "index.js", 6 | "directories": { 7 | "doc": "doc", 8 | "test": "test" 9 | }, 10 | "dependencies": { 11 | "gulp": "^3.9.1", 12 | "gulp-connect": "^5.0.0", 13 | "gulp-livereload": "^3.8.1", 14 | "gulp-shell": "^0.5.2" 15 | }, 16 | "devDependencies": {}, 17 | "scripts": { 18 | "test": "echo \"Error: no test specified\" && exit 1" 19 | }, 20 | "author": "la kmir", 21 | "license": "ISC" 22 | } 23 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | 2 | var gulp = require('gulp'), 3 | connect = require('gulp-connect'), 4 | shell = require('gulp-shell'); 5 | 6 | 7 | // Tasks 8 | 9 | gulp.task('compile', function () { 10 | gulp.src('src/*.sfd') 11 | .pipe( shell("./build.sh <%= file.relative.split('.')[0] %> --update-test")); //path.split('.sfd')[0] %>")); 12 | }); 13 | 14 | gulp.task('preview', function () { 15 | connect.server({ root: 'test', livereload: true }); 16 | gulp.watch([ 'src/*' ], [ 'compile' ]); 17 | //gulp.watch([ 'output/*' ], [ 'copy-output-to-test' ]); 18 | gulp.watch([ 'test/font/*' ], [ 'reload-fonts' ]); 19 | gulp.watch([ 'test/*' ], [ 'reload-js' ]); 20 | }); 21 | 22 | gulp.task('reload-fonts', function () { 23 | gulp.src('test/fonts/*').pipe(connect.reload()); 24 | }); 25 | 26 | gulp.task('reload-js', function () { 27 | gulp.src('test/*.js').pipe(connect.reload()); 28 | }); 29 | 30 | gulp.task('default', [ 'compile' ], function () { 31 | console.log('Rebuilding fonts'); 32 | }); 33 | 34 | -------------------------------------------------------------------------------- /ime/zlm.ibus: -------------------------------------------------------------------------------- 1 | SCIM_Generic_Table_Phrase_Library_TEXT 2 | VERSION_1_0 3 | 4 | BEGIN_DEFINITION 5 | LICENSE = LGPL 6 | UUID = 26d097fd-0bb6-4fb6-a358-73dbc6754408 7 | SERIAL_NUMBER = 20161224 8 | ICON = zybu.svg 9 | PAGE_SIZE = 0 10 | SYMBOL = ZLM 11 | NAME = Zbalermorna 12 | DESCRIPTION = Basic input method for Zbalermorna text. Requires ligature support in font engine. 13 | LANGUAGES = jbo 14 | AUTHOR = la kmir joi la suzil 15 | STATUS_PROMPT = ZLM 16 | VALID_INPUT_CHARS = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.?!1234567890()":;#/' 17 | LAYOUT = us 18 | MAX_KEY_LENGTH = 1 19 | AUTO_COMMIT = TRUE 20 | AUTO_SELECT = TRUE 21 | DEF_FULL_WIDTH_PUNCT = TRUE 22 | DEF_FULL_WIDTH_LETTER = TRUE 23 | USER_CAN_DEFINE_PHRASE = FALSE 24 | PINYIN_MODE = FALSE 25 | DYNAMIC_ADJUST = FALSE 26 | END_DEFINITION 27 | BEGIN_TABLE 28 | ' 󢌐 1 29 | h 󢌐 1 30 | p 󢌠 1 31 | t 󢌰 1 32 | k 󢍀 1 33 | f 󢍐 1 34 | l 󢍠 1 35 | s 󢍰 1 36 | c 󢎀 1 37 | m 󢎐 1 38 | x 󢎠 1 39 | b 󢎰 1 40 | d 󢏀 1 41 | g 󢏐 1 42 | v 󢏠 1 43 | r 󢏰 1 44 | z 󢐀 1 45 | j 󢐐 1 46 | n 󢐠 1 47 | q 󢐰 1 48 | w 󢑀 1 49 | a 󢑐 1 50 | e 󢑠 1 51 | i 󢑰 1 52 | o 󢒀 1 53 | u 󢒐 1 54 | y 󢒠 1 55 | END_TABLE 56 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /tools/zlm.ibus.ls: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # Setup 4 | # 5 | 6 | # Generic helpers 7 | 8 | log = console.log.bind console 9 | floor = Math.floor 10 | hex = (.to-string 16) 11 | map = (λ, xs) --> [ λ x for x in xs ] 12 | join = (.join '') 13 | rnd = (n) -> floor Math.random! * n 14 | rnd-chr = (n) -> [ rnd 16 for i from 0 til n ] |> map hex |> join 15 | uuid4 = -> "#{ rnd-chr 8 }-#{ rnd-chr 4 }-4#{ rnd-chr 3 }-#{ hex (rnd 16) .&. 0x3 .|. 0x8 }#{ rnd-chr 3 }-#{ rnd-chr 12 }" 16 | datestamp = do (now = new Date) -> "#{ now.get-full-year! }#{ now.get-month! + 1 }#{ now.get-date! }" 17 | 18 | 19 | # Data 20 | 21 | ibus-preamble = ({ name, symbol, author, desc }) -> log """ 22 | SCIM_Generic_Table_Phrase_Library_TEXT 23 | VERSION_1_0 24 | 25 | BEGIN_DEFINITION 26 | LICENSE = LGPL 27 | UUID = #{uuid4!} 28 | SERIAL_NUMBER = #datestamp 29 | ICON = zybu.svg 30 | PAGE_SIZE = 0 31 | SYMBOL = #symbol 32 | NAME = #name 33 | DESCRIPTION = #desc 34 | LANGUAGES = jbo 35 | AUTHOR = #author 36 | STATUS_PROMPT = #symbol 37 | VALID_INPUT_CHARS = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.?!1234567890()":;#/' 38 | LAYOUT = us 39 | MAX_KEY_LENGTH = 1 40 | AUTO_COMMIT = TRUE 41 | AUTO_SELECT = TRUE 42 | DEF_FULL_WIDTH_PUNCT = TRUE 43 | DEF_FULL_WIDTH_LETTER = TRUE 44 | USER_CAN_DEFINE_PHRASE = FALSE 45 | PINYIN_MODE = FALSE 46 | DYNAMIC_ADJUST = FALSE 47 | END_DEFINITION 48 | """ 49 | 50 | table = (λ) -> 51 | log \BEGIN_TABLE 52 | λ! 53 | log \END_TABLE 54 | 55 | entry = (input, codepoint) -> 56 | log input, (String.from-code-point codepoint), \1 57 | 58 | 59 | # Data 60 | 61 | INPUTS = <[ ' h p t k f l s c m x b d g v r z j n q w a e i o u y ]> 62 | OFFSET = 0xE2300 63 | 64 | 65 | # Output 66 | 67 | ibus-preamble do 68 | name: \Zbalermorna 69 | symbol: \ZLM 70 | author: "la kmir joi la suzil" 71 | desc: "Basic input method for Zbalermorna text. Requires ligature support in font engine." 72 | 73 | table -> 74 | for input, ix in INPUTS 75 | if input is \' 76 | entry input, OFFSET + 0x10 77 | else 78 | entry input, OFFSET + ix * 0x10 79 | 80 | 81 | -------------------------------------------------------------------------------- /src/sfd-template.ls: -------------------------------------------------------------------------------- 1 | exports.PREAMBLE = """ 2 | SplineFontDB: 3.0 3 | FontName: zbalermorna-manri 4 | FullName: Zbalermorna zei Manri 5 | FamilyName: zbalermorna 6 | Weight: Regular 7 | Copyright: Copyright (c) 2016, la kmir 8 | UComments: "2016-12-9: Created with FontForge (http://fontforge.org)" 9 | Version: 001.000 10 | ItalicAngle: 0 11 | UnderlinePosition: -90 12 | UnderlineWidth: 464 13 | Ascent: 800 14 | Descent: 200 15 | InvalidEm: 0 16 | LayerCount: 2 17 | Layer: 0 0 "Back" 1 18 | Layer: 1 0 "Fore" 0 19 | XUID: [1021 15 -1537435809 229010] 20 | FSType: 0 21 | OS2Version: 0 22 | OS2_WeightWidthSlopeOnly: 0 23 | OS2_UseTypoMetrics: 1 24 | CreationTime: 1481267425 25 | ModificationTime: 1481273085 26 | PfmFamily: 17 27 | TTFWeight: 400 28 | TTFWidth: 5 29 | LineGap: 90 30 | VLineGap: 0 31 | OS2TypoAscent: 0 32 | OS2TypoAOffset: 1 33 | OS2TypoDescent: 0 34 | OS2TypoDOffset: 1 35 | OS2TypoLinegap: 82 36 | OS2WinAscent: 0 37 | OS2WinAOffset: 1 38 | OS2WinDescent: 0 39 | OS2WinDOffset: 1 40 | HheadAscent: 0 41 | HheadAOffset: 1 42 | HheadDescent: 0 43 | HheadDOffset: 1 44 | OS2Vendor: 'PfEd' 45 | MarkAttachClasses: 2 46 | "vowel" 0 47 | DEI: 91125 48 | LangName: 1033 49 | Encoding: Custom 50 | UnicodeInterp: none 51 | NameList: AGL For New Fonts 52 | DisplaySize: -48 53 | AntiAlias: 1 54 | FitToEm: 0 55 | WinInfo: 0 28 12 56 | BeginPrivate: 0 57 | EndPrivate 58 | Grid 59 | -1000 680 m 0 60 | 2000 680 l 1024 61 | Named: "vowel" 62 | -1000 -255 m 0 63 | 2000 -255 l 1024 64 | Named: "descender" 65 | 0 725 m 4 66 | 800 725 l 1024 67 | Named: "ascender" 68 | 270 1200 m 0 69 | 270 0 l 1024 70 | Named: "narrow" 71 | 50 1000 m 0 72 | 50 -300 l 1024 73 | Named: "left" 74 | 150 1300 m 0 75 | 150 -300 l 1024 76 | Named: "instem" 77 | 550 1000 m 0 78 | 550 -300 l 1024 79 | Named: "right" 80 | 450 1300 m 0 81 | 450 -300 l 1024 82 | Named: "instem" 83 | 0 470 m 0 84 | 1000 470 l 1024 85 | Named: "x-height" 86 | 300 1000 m 0 87 | 300 -200 l 1024 88 | Named: "center" 89 | -1000 235 m 0 90 | 1000 235 l 1024 91 | Named: "midpoint" 92 | -1000 0 m 0 93 | 1000 0 l 1024 94 | Named: "baseline" 95 | EndSplineSet 96 | BeginChars: 341 341 97 | 98 | """ 99 | 100 | exports.FINAL = """ 101 | 102 | EndChars 103 | EndSplineFont 104 | """ 105 | 106 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | 2 | # Zbalermorna Font Development Kit 3 | 4 | A collection of tools and processes for using and developing typefaces for 5 | Zbalermorna, an alternative orthography for the constructed language Lojban. 6 | 7 | ## Project status 8 | 9 | ###### Done 10 | 11 | - Design unicode layout 12 | - Create reference glyphs 13 | - Complete opentype features declaration 14 | - Complete first working ZLM font 15 | 16 | 17 | ###### To Do 18 | 19 | - More complete sample jufra for test page 20 | - Create ibus config for new unicode range 21 | - Finalise buid process for new ont development 22 | - Port the old ZLM font, now called 'Drakono' to new system 23 | - Create alternate typefaces and add them to this repo 24 | 25 | 26 | ### How to type ZLM text 27 | 28 | - Install an IME file and a ZLM font 29 | - Type native ZLM directly into any app or website 30 | 31 | **or** 32 | 33 | - Clone this repo 34 | - Open `test/index.html` and use the IME emulator 35 | - Copy-paste the generated ZLM text 36 | 37 | Soon we will also have an online version of the IME emulator you can use to play 38 | with ZLM text. You'll still need a font to support the generated ZLM text~ 39 | 40 | 41 | ### How a ZLM font works 42 | 43 | Zbalermorna uses special glpyhs which live in the Unicode Supplementary 44 | Special Purpose plane, covering the region from 0xE2320 -> 0xE24FF. 45 | 46 | A method of inputting these glyphs requires in IME for your particular 47 | operating system, such as `ibus` or `scim`. This project attempts to provide 48 | configurations for as many IMEs as possible. 49 | 50 | Once a IME and an appropriate configuration is loaded, it can be used to type 51 | ZLM glyphs, which a correctly constructed ZLM font will automatically display 52 | as assembled composite glpyhs using OpenType features. 53 | 54 | 55 | ### Currently Supported IMEs 56 | 57 | None so far. 58 | 59 | 60 | #### IME support roadmap 61 | 62 | - `ibus` - just need to convert la suzil's original ibus config to the proper 63 | range and create a non-ligating version. 64 | 65 | 66 | ### Creating a new Zbalermorna typeface 67 | 68 | ``` 69 | This procedure is still incomplete - build script and feature file have bugs 70 | ``` 71 | 72 | - Install [FontForge](http://fontforge.github.io) 73 | - Launch the Preview page: `gulp preview` 74 | - Clone and rename `src/zlm-manri.sfd` to create your own copy 75 | - Open your new copy using FontForge 76 | - Modify vector shapes for component glyphs; composite glyphs will auto-update 77 | - Self-assembling composites can also be manually overriden with real vectors, 78 | if your typeface wants to use special forms for certain composites. 79 | - When your `.sfd` file is saved, Gulp will automatically recompile it into a 80 | TrueType font, and refresh the preview page so you can see how your updates 81 | effect ligatures and kerning. 82 | 83 | -------------------------------------------------------------------------------- /test/preview.js: -------------------------------------------------------------------------------- 1 | 2 | // Shims 3 | 4 | HTMLTextAreaElement.prototype.insertAtCaret = function (text) { 5 | if (this.selectionStart || this.selectionStart === 0) { 6 | var startPos = this.selectionStart, 7 | endPos = this.selectionEnd, 8 | before = this.value.substring(0, startPos), 9 | after = this.value.substring(endPos, this.value.length); 10 | this.value = before + text + after; 11 | this.selectionStart = startPos + text.length; 12 | this.selectionEnd = startPos + text.length; 13 | } else { 14 | this.value += text; 15 | } 16 | }; 17 | 18 | 19 | // Config 20 | 21 | const KEY_CODE_APOSTROPHE = 222; 22 | const UNICODE_RANGE_START = 0xE2300; 23 | const PARSE_MODE_TEXT = 0; 24 | const PARSE_MODE_TAG = 1; 25 | 26 | const lerfu = ".'ptkflscmxbdgvrzjnqwaeiouy"; 27 | 28 | 29 | // Global Helpers 30 | 31 | var log = console.log.bind(console); 32 | 33 | function id (x) { 34 | return x; 35 | } 36 | 37 | function trim (str) { 38 | return str.trim(); 39 | } 40 | 41 | function toArray (list) { 42 | return Array.prototype.slice.apply(list); 43 | } 44 | 45 | function Q (sel, parent) { 46 | return toArray((parent || document).querySelectorAll(sel)); 47 | }; 48 | 49 | function comp (a, b) { 50 | return function (x) { return a(b(x)); } 51 | } 52 | 53 | function defer (λ) { 54 | return setTimeout(λ, 0); 55 | } 56 | 57 | function deferOf (λ) { 58 | return function () { defer(λ); }; 59 | } 60 | 61 | 62 | // Domain Helpers 63 | 64 | function formatUnicode (point) { 65 | return "&#x" + point.toString(16) + ";"; 66 | } 67 | 68 | function translate (text) { 69 | return toArray(text).map(comp(formatUnicode, latinToZLM)).join(''); 70 | } 71 | 72 | function latinToZLM (chr) { 73 | if (chr === "h" || chr === "'") 74 | return UNICODE_RANGE_START + 16; 75 | if (-1 < lerfu.indexOf(chr)) 76 | return UNICODE_RANGE_START + lerfu.indexOf(chr) * 16; 77 | return chr.codePointAt(0); 78 | } 79 | 80 | function keyCodeToZLM (code) { 81 | if (code === KEY_CODE_APOSTROPHE) 82 | return UNICODE_RANGE_START + 16; 83 | if (code > 64 && code < 92) 84 | return latinToZLM(String.fromCharCode(code).toLowerCase()); 85 | return code; 86 | } 87 | 88 | 89 | // Translate test cases into appropriate unicode 90 | 91 | Q('[data-zlm-translate]').forEach(function (phrase) { 92 | phrase.innerHTML = translate(phrase.innerHTML); 93 | return; 94 | 95 | var output = ""; 96 | var chars = phrase.innerHTML; 97 | var mode = PARSE_MODE_TEXT; 98 | 99 | for (var i = 0, max = chars.length - 1; i < max; i++) { 100 | var c = chars[i]; 101 | 102 | if (c === '<') { mode = PARSE_MODE_TAG; } 103 | if (c === '>') { mode = PARSE_MODE_TEXT; } 104 | 105 | switch (mode) { 106 | case PARSE_MODE_TEXT: output += translate(c); break; 107 | case PARSE_MODE_TAG: output += c; break; 108 | } 109 | } 110 | 111 | phrase.innerHTML = output; 112 | }); 113 | 114 | 115 | // Intercept typing in IME zone 116 | 117 | Q('[data-ime-emulation]').forEach(function (textarea) { 118 | output = Q('[data-ime-output]')[0] 119 | function update () { output.innerHTML = translate( textarea.value ); } 120 | textarea.addEventListener('keydown', deferOf(update)); 121 | update(); 122 | }); 123 | 124 | 125 | -------------------------------------------------------------------------------- /tools/zlm.feature.ls: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # Setup 4 | # 5 | 6 | # Generic helpers 7 | 8 | log = console.log.bind console 9 | join = (.join '') 10 | spaces = (.join ' ') 11 | debug = -> &0 = "---- " + &0; log ... 12 | map = (λ, xs) --> [ λ x for x in xs ] 13 | filter = (λ, xs) --> [ x for x in xs when λ x ] 14 | contains = (xs, needle) -> (xs.index-of needle) > -1 15 | 16 | 17 | # ZLM DSL 18 | 19 | glyph = (g) -> 20 | if SEMIV `contains` g 21 | \ZLM_SEMIVOWEL_ + g 22 | else if CONSN `contains` g 23 | \ZLM_ + g 24 | else if ALL_VOWELS `contains` g 25 | \ZLM_DIACRITIC_ + g 26 | else 27 | \ZLM_ + g 28 | 29 | dot = (g) -> \ZLM_DOT_ + g 30 | cas = (before, after) -> \ZLM_CAS_ + join before ++ \H ++ after 31 | list = spaces << map glyph 32 | to-v = (q) -> if q is \Q then \I else if q is \W then \U else \UNKNOWN 33 | 34 | 35 | # Features DSL 36 | 37 | def-class = (name, members) -> 38 | if typeof members is \string 39 | log "@#name = [ #members ];" 40 | else 41 | log "@#name = [ #{ list members } ];" 42 | 43 | comment = (text) -> log "\n# #text\n" 44 | big-comment = (text) -> log "\n\n#\n# #text\n#\n" 45 | description = (title, λ) -> big-comment title; λ! 46 | section = (name, λ) -> big-comment name; λ! 47 | feature = (name, λ) -> comment name; log "feature rlig {"; λ!; log "} rlig;" 48 | sub = (...parts, lig) -> log " sub #{ map glyph, parts |> spaces } by #lig;" 49 | sub-tick = (...parts, lig) -> log " sub #{ map glyph, parts |> map (+ \') |> spaces } by #lig;" 50 | ignore = (ctx, ...gs) -> log " ignore sub #ctx #{ map (+ \'), gs |> spaces };" 51 | 52 | 53 | # Data 54 | 55 | SEMIV = <[ Q W ]> 56 | CONSN = <[ P T K F L S C M X B D G V R Z J N H ]> 57 | VOWELS = <[ A E I O U Y ]> 58 | DIPHTH = <[ AI EI OI AU ]> 59 | 60 | ALL_CONSN = CONSN ++ SEMIV 61 | ALL_VOWELS = VOWELS ++ DIPHTH 62 | 63 | 64 | description "ZLM OpenType Feature Table Definitions", -> 65 | 66 | def-class \consonant, ALL_CONSN 67 | def-class \vowel, ALL_VOWELS 68 | def-class \anything, "@consonant @vowel" 69 | 70 | section "5-part ligatures", -> 71 | feature \VV'VV, -> 72 | ignore \@consonant \@vowel \@vowel \ZLM_H \@vowel \@vowel 73 | for [ a, b ] in DIPHTH 74 | for [ c, d ] in DIPHTH 75 | sub-tick a, b, \H, c, d, cas [ a, b ], [ c, d ] 76 | 77 | section "4-part ligatures", -> 78 | feature \VV'V, -> 79 | ignore \@consonant \@vowel \@vowel \ZLM_H \@vowel 80 | for [ a, b ] in DIPHTH 81 | for v in VOWELS 82 | sub-tick a, b, \H, v, cas [ a, b ], [ v ] 83 | feature \V'VV, -> 84 | ignore \@consonant \@vowel \ZLM_H \@vowel \@vowel 85 | for v in VOWELS 86 | for [ a, b ] in DIPHTH 87 | sub-tick v, \H, a, b, cas [ v ], [ a, b ] 88 | 89 | section "3-part ligatures", -> 90 | feature \V'V, -> 91 | ignore \@consonant \@vowel \ZLM_H \@vowel 92 | for a in VOWELS 93 | for b in VOWELS 94 | sub-tick a, \H, b, cas [ a ], [ b ] 95 | feature \QVV, -> 96 | for q in SEMIV 97 | for [ a, b ] in DIPHTH 98 | sub-tick q, a, b, glyph q + a + b 99 | feature \WVV, -> 100 | ignore \@consonant \@vowel \@vowel \@vowel" 101 | for q in SEMIV 102 | for [ a, b ] in DIPHTH 103 | sub-tick (to-v q), a, b, glyph q + a + b 104 | feature \CVV, -> 105 | for c in CONSN 106 | for [ a, b ] in DIPHTH 107 | sub c, a, b, glyph c + a + b 108 | 109 | section "2-part ligatures", -> 110 | feature \QV, -> 111 | for q in SEMIV 112 | for v in VOWELS 113 | sub-tick q, v, glyph q + v 114 | feature \WV, -> 115 | ignore \@consonant \@vowel \@vowel 116 | for q in SEMIV 117 | for v in VOWELS 118 | sub-tick (to-v q), v, glyph q + v 119 | feature \CV, -> 120 | for c in CONSN 121 | for v in VOWELS 122 | sub c, v, glyph c + v 123 | feature \VV, -> 124 | for [ a, b ] in DIPHTH 125 | sub a, b, glyph a + b 126 | 127 | section "Single Substitutions", -> 128 | feature ".V", -> 129 | ignore \@anything \@vowel 130 | for v in ALL_VOWELS 131 | sub-tick v, dot v 132 | 133 | 134 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ZLM FDK Test Page 6 | 7 | 70 | 71 | 72 | 73 |

ZLM FDK Test Page

74 | 75 |
76 |

CV ligatures

77 |

78 | pa pe pi po pu py pai pei poi pau 79 | ta te ti to tu ty tai tei toi tau 80 | ka ke ki ko ku ky kai kei koi kau 81 | fa fe fi fo fu fy fai fei foi fau 82 | la le li lo lu ly lai lei loi lau 83 | sa se si so su sy sai sei soi sau 84 | ca ce ci co cu cy cai cei coi cau 85 | ma me mi mo mu my mai mei moi mau 86 | xa xe xi xo xu xy xai xei xoi xau 87 | ba be bi bo bu by bai bei boi bau 88 | da de di do du dy dai dei doi dau 89 | ga ge gi go gu gy gai gei goi gau 90 | va ve vi vo vu vy vai vei voi vau 91 | ra re ri ro ru ry rai rei roi rau 92 | za ze zi zo zu zy zai zei zoi zau 93 | ja je ji jo ju jy jai jei joi jau 94 | na ne ni no nu ny nai nei noi nau 95 |

96 | 97 | 98 |

Self-dotting vowels

99 |

100 | a e i o u y ai ei oi au 101 |

102 | 103 |

Attitudinal ligatures

104 |

105 | a'a a'e a'i a'o a'u a'y a'ai a'ei a'oi a'au 106 | e'a e'e e'i e'o e'u e'y e'ai e'ei e'oi e'au 107 | i'a i'e i'i i'o i'u i'y i'ai i'ei i'oi i'au 108 | o'a o'e o'i o'o o'u o'y o'ai o'ei o'oi o'au 109 | u'a u'e u'i u'o u'u u'y u'ai u'ei u'oi u'au 110 | i'a i'e i'i i'o i'u i'y i'ai i'ei i'oi i'au 111 | y'a y'e y'i y'o y'u y'y y'ai y'ei y'oi y'au 112 | ai'a ai'e ai'i ai'o ai'u ai'y ai'ai ai'ei ai'oi ai'au 113 | ei'a ei'e ei'i ei'o ei'u ei'y ei'ai ei'ei ei'oi ei'au 114 | oi'a oi'e oi'i oi'o oi'u oi'y oi'ai oi'ei oi'oi oi'au 115 | au'a au'e au'i au'o au'u au'y au'ai au'ei au'oi au'au 116 |

117 | 118 |

Auto semivowels

119 |

120 | ia ie ii io iu iy iai iei ioi iau 121 | ua ue ui uo uu uy uai uei uoi uau 122 |

123 | 124 |

Diacritic vertical alignment

125 |

a e i o u y ai ei oi au

126 | 127 | 128 |

Ligature precedence

129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 |
output should be
co'o ci'izra 󢎄󢌔 󢎃󢌓󢐀󢏱
uau je'u do'oi 󢑊 󢐒󢌕 󢏄󢌙
plukauaii 󢌠󢍥󢍁󢑁󢐳
147 |
148 | 149 | 161 | 162 |

IME Emulation

163 |
164 | 169 |
󢎉
170 |
171 | 172 | 173 | 174 | -------------------------------------------------------------------------------- /ime/zlm-suzil__old-unicode-range.ibus: -------------------------------------------------------------------------------- 1 | ### File header must not be modified 2 | ### This file must be encoded into UTF-8. 3 | ### This table under LGPL 4 | ### comments start with ### not single # 5 | ### Derive from the format of SCIM Table, so you can modify the table from 6 | ### scim-tables' table 7 | SCIM_Generic_Table_Phrase_Library_TEXT 8 | VERSION_1_0 9 | 10 | ### Begin Table definition. 11 | BEGIN_DEFINITION 12 | 13 | ### License 14 | LICENSE = LGPL 15 | 16 | ### An unique id to distinguish this table among others. 17 | ### Use uuidgen to generate this kind of id. 18 | UUID = cfcdc3e2-ffab-415c-b6f7-f91b4ce52bfa 19 | 20 | ### A unique number indicates the version of this file. 21 | ### For example the last modified date of this file. 22 | ### This number must be less than 2^32. 23 | ### Just make your table version-able 24 | SERIAL_NUMBER = 20161123 25 | 26 | ### ICON can be any format as long as your pygtk can recognized 27 | ### the most widely ones are "png" and "svg", letter one is recommended 28 | ICON = mlatu.svg 29 | 30 | ### Attempt to disable the annoying popup table 31 | PAGE_SIZE = 0 32 | 33 | ### The symbol to be displayed in IM switchers 34 | SYMBOL = Zba 35 | 36 | ### The default name of this table, this is needed 37 | NAME = Zbalermorna 38 | 39 | ### The local names of this table, this is optional 40 | ### NAME.zh_CN = 形码 41 | ### NAME.zh_HK = 形碼 42 | ### NAME.zh_TW = 形碼 43 | 44 | ### Description 45 | DESCRIPTION = This is a template engine table for IBus Table. 46 | 47 | ### Supported languages of this table 48 | ### sigle "zh_CN" just be recognized as zh_CN, 49 | ### but "zh_CN, zh_HK" or more zh_XX will be recognized as zh; 50 | ### and "en_US, zh_CN" will be just ignored. 51 | LANGUAGES = en_US 52 | 53 | ### The author of this table 54 | AUTHOR = suzil 55 | 56 | ### Prompt string to be displayed in the status area, CN will be replaced by 57 | ### the gettext tools in runtime as 中. 58 | STATUS_PROMPT = Zba 59 | 60 | ### Valid input chars. 61 | VALID_INPUT_CHARS = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.?!1234567890()":;#/' 62 | 63 | ### Layout 64 | LAYOUT = us 65 | 66 | ### The max number of input keys for every phrase or character. 67 | MAX_KEY_LENGTH = 3 68 | 69 | ### Use auto_commit mode as default 70 | AUTO_COMMIT = TRUE 71 | 72 | ### Automatically selects the first phrase when typing 73 | AUTO_SELECT = TRUE 74 | 75 | ### Use full width punctuation by default 76 | DEF_FULL_WIDTH_PUNCT = TRUE 77 | ### Not use full width letter by default 78 | DEF_FULL_WIDTH_LETTER = TRUE 79 | 80 | ### Whether user are allow to define phrase, default is true 81 | ### You have to define the word construction rules below. 82 | ### For input methods which do not input phrases, set this to False 83 | USER_CAN_DEFINE_PHRASE = FALSE 84 | 85 | ### Whether support PinYin Mode, default is true. 86 | ### this feature is just for Chinese, set it to False if your IM is not 87 | ### Chinese. 88 | PINYIN_MODE = FALSE 89 | 90 | ### If true then the phrases' frequencies will be adjusted dynamically 91 | ### according your using frequency. 92 | DYNAMIC_ADJUST = FALSE 93 | 94 | ### Some characters whose frequencies should be fix all the time, e.g. 95 | ### some punctuations 96 | ### NO_CHECK_CHARS = 97 | 98 | ### Rules for constructing user defined phrase 99 | ### "ce" stands for "ci equal", a Chinese English :), means "phrase length 100 | ### equal to", thus ce2 -> phrase length equal to 2; and "ca" means "phrase 101 | ### length equal or above", so ca4 -> phrase length equal or above 4. 102 | ### p21 -> the 1st key of 2nd character in the phrase, and so on. 103 | ### Each rule separate via ";". 104 | ### Example below is a complete rule-set, 105 | ### becuase [2,2] ∩ [3,3] ∩ [4,+∞] = [2,+∞], which is the range of length 106 | ### of phrase. This have to be satisfied if you need ibus-table to build up 107 | ### your own inputed phrase via your daily using. 108 | ### RULES = ce2:p11+p12+p21+p22;ce3:p11+p21+p22+p31;ca4:p11+p21+p31+p41 109 | 110 | ### The key strokes to page up the lookup table. 111 | ### PAGE_UP_KEYS = Page_Up,KP_Page_Up,minus,comma 112 | 113 | ### The key strokes to page down. 114 | ### PAGE_DOWN_KEYS = Page_Down,KP_Page_Down,equal,period 115 | 116 | END_DEFINITION 117 | 118 | ### Begin Table data. 119 | ### Format of every line whose formated in "input_keys\tphrase\tfreq\n" is an 120 | ### entry. 121 | ### From left to right, the 1st column are the input key combination that you 122 | ### entered via keyboard; the 2nd column are presented character or phrase of 123 | ### the key combination you want; the 3rd column are frequency of the character 124 | ### or phrase. 125 | BEGIN_TABLE 126 | b 󢍟 1 127 | by 󢍠 2 128 | bu 󢍡 2 129 | bo 󢍢 2 130 | bi 󢍣 2 131 | be 󢍤 2 132 | ba 󢍥 2 133 | bai 󢍦 3 134 | bau 󢍧 3 135 | bei 󢍨 3 136 | boi 󢍩 3 137 | c 󢍪 1 138 | cy 󢍫 2 139 | cu 󢍬 2 140 | co 󢍭 2 141 | ci 󢍮 2 142 | ce 󢍯 2 143 | ca 󢍰 2 144 | cai 󢍱 3 145 | cau 󢍲 3 146 | cei 󢍳 3 147 | coi 󢍴 3 148 | d 󢍵 1 149 | dy 󢍶 2 150 | du 󢍷 2 151 | do 󢍸 2 152 | di 󢍹 2 153 | de 󢍺 2 154 | da 󢍻 2 155 | dai 󢍼 3 156 | dau 󢍽 3 157 | dei 󢍾 3 158 | doi 󢍿 3 159 | f 󢎀 1 160 | fy 󢎁 2 161 | fu 󢎂 2 162 | fo 󢎃 2 163 | fi 󢎄 2 164 | fe 󢎅 2 165 | fa 󢎆 2 166 | fai 󢎇 3 167 | fau 󢎈 3 168 | fei 󢎉 3 169 | foi 󢎊 3 170 | j 󢎋 1 171 | jy 󢎌 2 172 | ju 󢎍 2 173 | jo 󢎎 2 174 | ji 󢎏 2 175 | je 󢎐 2 176 | ja 󢎑 2 177 | jai 󢎒 3 178 | jau 󢎓 3 179 | jei 󢎔 3 180 | joi 󢎕 3 181 | k 󢎖 1 182 | ky 󢎗 2 183 | ku 󢎘 2 184 | ko 󢎙 2 185 | ki 󢎚 2 186 | ke 󢎛 2 187 | ka 󢎜 2 188 | kai 󢎝 3 189 | kau 󢎞 3 190 | kei 󢎟 3 191 | koi 󢎠 3 192 | l 󢎡 1 193 | ly 󢎢 2 194 | lu 󢎣 2 195 | lo 󢎤 2 196 | li 󢎥 2 197 | le 󢎦 2 198 | la 󢎧 2 199 | lai 󢎨 3 200 | lau 󢎩 3 201 | lei 󢎪 3 202 | loi 󢎫 3 203 | m 󢎬 1 204 | my 󢎭 2 205 | mu 󢎮 2 206 | mo 󢎯 2 207 | mi 󢎰 2 208 | me 󢎱 2 209 | ma 󢎲 2 210 | mai 󢎳 3 211 | mau 󢎴 3 212 | mei 󢎵 3 213 | moi 󢎶 3 214 | n 󢎷 1 215 | ny 󢎸 2 216 | nu 󢎹 2 217 | no 󢎺 2 218 | ni 󢎻 2 219 | ne 󢎼 2 220 | na 󢎽 2 221 | nai 󢎾 3 222 | nau 󢎿 3 223 | nei 󢏀 3 224 | noi 󢏁 3 225 | p 󢏂 1 226 | py 󢏃 1 227 | pu 󢏄 2 228 | po 󢏅 2 229 | pi 󢏆 2 230 | pe 󢏇 2 231 | pa 󢏈 2 232 | pai 󢏉 3 233 | pau 󢏊 3 234 | pei 󢏋 3 235 | poi 󢏌 3 236 | r 󢏍 1 237 | ry 󢏎 2 238 | ru 󢏏 2 239 | ro 󢏐 2 240 | ri 󢏑 2 241 | re 󢏒 2 242 | ra 󢏓 2 243 | rai 󢏔 3 244 | rau 󢏕 3 245 | rei 󢏖 3 246 | roi 󢏗 3 247 | s 󢏘 1 248 | sy 󢏙 2 249 | su 󢏚 2 250 | so 󢏛 2 251 | si 󢏜 2 252 | se 󢏝 2 253 | sa 󢏞 2 254 | sai 󢏟 3 255 | sau 󢏠 3 256 | sei 󢏡 3 257 | soi 󢏢 3 258 | t 󢏣 1 259 | ty 󢏤 2 260 | tu 󢏥 2 261 | to 󢏦 2 262 | ti 󢏧 2 263 | te 󢏨 2 264 | ta 󢏩 2 265 | tai 󢏪 3 266 | tau 󢏫 3 267 | tei 󢏬 3 268 | toi 󢏭 3 269 | v 󢏮 1 270 | vy 󢏯 2 271 | vu 󢏰 2 272 | vo 󢏱 2 273 | vi 󢏲 2 274 | ve 󢏳 2 275 | va 󢏴 2 276 | vai 󢏵 3 277 | vau 󢏶 3 278 | vei 󢏷 3 279 | voi 󢏸 3 280 | z 󢏹 1 281 | zy 󢏺 2 282 | zu 󢏻 2 283 | zo 󢏼 2 284 | zi 󢏽 2 285 | ze 󢏾 2 286 | za 󢏿 2 287 | zai 󢐀 3 288 | zau 󢐁 3 289 | zei 󢐂 3 290 | zoi 󢐃 3 291 | g 󢐄 1 292 | gy 󢐅 2 293 | gu 󢐆 2 294 | go 󢐇 2 295 | gi 󢐈 2 296 | ge 󢐉 2 297 | ga 󢐊 2 298 | gai 󢐋 3 299 | gau 󢐌 3 300 | gei 󢐍 3 301 | goi 󢐎 3 302 | ' 󢐏 1 303 | 'y 󢐐 2 304 | 'u 󢐑 2 305 | 'o 󢐒 2 306 | 'i 󢐓 2 307 | 'e 󢐔 2 308 | 'a 󢐕 2 309 | 'ai 󢐖 3 310 | 'au 󢐗 3 311 | 'ei 󢐘 3 312 | 'oi 󢐙 3 313 | iy 󢐚 5 314 | iu 󢐛 5 315 | io 󢐜 5 316 | ii 󢐝 5 317 | ie 󢐞 5 318 | ia 󢐟 5 319 | uy 󢐠 5 320 | uu 󢐡 5 321 | uo 󢐢 5 322 | ui 󢐣 5 323 | ue 󢐤 5 324 | ua 󢐥 5 325 | y'y 󢐦 5 326 | u'y 󢐧 5 327 | e'y 󢐨 5 328 | i'y 󢐩 5 329 | o'y 󢐪 5 330 | a'y 󢐫 5 331 | u'u 󢐬 5 332 | e'u 󢐭 5 333 | i'u 󢐮 5 334 | o'u 󢐯 5 335 | a'u 󢐰 5 336 | u'i 󢐱 5 337 | e'i 󢐲 5 338 | i'i 󢐳 5 339 | o'i 󢐴 5 340 | a'i 󢐵 5 341 | u'o 󢐶 5 342 | e'o 󢐷 5 343 | i'o 󢐸 5 344 | o'o 󢐹 5 345 | a'o 󢐺 5 346 | u'a 󢐻 5 347 | e'a 󢐼 5 348 | i'a 󢐽 5 349 | o'a 󢐾 5 350 | a'a 󢐿 5 351 | u'e 󢑀 5 352 | e'e 󢑁 5 353 | i'e 󢑂 5 354 | o'e 󢑃 5 355 | a'e 󢑄 5 356 | ai'y 󢑅 5 357 | oi'y 󢑆 5 358 | ei'y 󢑇 5 359 | au'y 󢑈 5 360 | oi 󢍕 3 361 | ei 󢍖 3 362 | au 󢍗 3 363 | ai 󢍘 3 364 | a 󢍙 1 365 | e 󢍚 1 366 | i 󢍛 1 367 | o 󢍜 1 368 | u 󢍝 1 369 | y 󢍞 1 370 | x 󢑉 1 371 | xy 󢑊 2 372 | xai 󢑐 3 373 | xau 󢑑 3 374 | xei 󢑒 3 375 | xoi 󢑓 3 376 | xu 󢑋 2 377 | xo 󢑌 2 378 | xi 󢑍 2 379 | xe 󢑎 2 380 | xa 󢑏 2 381 | END_TABlE 382 | 383 | ### Since some input methods use different table for every character to make 384 | ### phrase, such as ZhengMa, they need explict define the goucima (the 385 | ### phrase-building code for the given character), the format of every entry is 386 | ### "character\tgoucima\n". 387 | ### For the input method which just use the full code as word-building code 388 | ### just skip this field. The ibus-table will build the codes needed from 389 | ### above TABLE. 390 | ### if you don't need different word-building code, please comment out the 391 | ### next few lines with ###, just like these lines you are look at now. 392 | ### BEGIN_GOUCI 393 | ### character_1 goucima_1 394 | ### character_1 goucima_2 395 | ### END_GOUCI 396 | -------------------------------------------------------------------------------- /doc/unicode-layout.md: -------------------------------------------------------------------------------- 1 | 2 | # Zbalermorna Glyph Layout and Unicode mapping 3 | 4 | 5 | ``` 6 | Unicode 7 | ┌───────┐ 8 | Unicode │ YYY │ ← Glyph Number 9 | │ XXX │ ← Glyph Symbol 10 | └───────┘ 11 | 12 | 13 | _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A . . . _F 14 | ┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬─╌╌╌╌╌─┬───────┐ 15 | │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ │ 15 │ 16 | E230_ │ • │ •a │ •e │ •i │ •o │ •u │ •y │ •ai │ •ei │ •oi │ •au │ │ | │ 17 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 18 | │ 16 │ 17 │ 18 │ 19 │ 20 │ 21 │ 22 │ 23 │ 24 │ 25 │ 26 │ │ 31 │ 19 | E231_ │ ' │ 'a │ 'e │ 'i │ 'o │ 'u │ 'y │ 'ai │ 'ei │ 'oi │ 'au │ │ / │ 20 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 21 | │ 32 │ 33 │ 34 │ 35 │ 36 │ 37 │ 38 │ 39 │ 40 │ 41 │ 42 │ │ 47 │ 22 | E232_ │ p │ pa │ pe │ pi │ po │ pu │ py │ pai │ pei │ poi │ pau │ │ \ │ 23 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 24 | │ 48 │ 49 │ 50 │ 51 │ 52 │ 53 │ 54 │ 55 │ 56 │ 57 │ 58 │ │ 63 │ 25 | E233_ │ t │ ta │ te │ ti │ to │ tu │ ty │ tai │ tei │ toi │ tau │ │ /\ │ 26 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 27 | │ 64 │ 65 │ 66 │ 67 │ 68 │ 69 │ 70 │ 71 │ 72 │ 73 │ 74 │ │ 79 │ 28 | E234_ │ k │ ka │ ke │ ki │ ko │ ku │ ky │ kai │ kei │ koi │ kau │ │ \/ │ 29 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 30 | │ 80 │ 81 │ 82 │ 83 │ 84 │ 85 │ 86 │ 87 │ 88 │ 89 │ 90 │ │ 95 │ 31 | E235_ │ f │ fa │ fe │ fi │ fo │ fu │ fy │ fai │ fei │ foi │ fau │ │ ! │ 32 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 33 | │ 96 │ 97 │ 98 │ 99 │ 100 │ 101 │ 102 │ 103 │ 104 │ 105 │ 106 │ │ 111 │ 34 | E236_ │ l │ la │ le │ li │ lo │ lu │ ly │ lai │ lei │ loi │ lau │ │ !! │ 35 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 36 | │ 112 │ 113 │ 114 │ 115 │ 116 │ 117 │ 118 │ 119 │ 120 │ 121 │ 122 │ │ 127 │ 37 | E237_ │ s │ sa │ se │ si │ so │ su │ sy │ sai │ sei │ soi │ sau │ │ !!! │ 38 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 39 | │ 128 │ 129 │ 130 │ 131 │ 132 │ 133 │ 134 │ 135 │ 136 │ 137 │ 138 │ │ 143 │ 40 | E238_ │ c │ ca │ ce │ ci │ co │ cu │ cy │ cai │ cei │ coi │ cau │ │ ___ │ 41 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 42 | │ 144 │ 145 │ 146 │ 147 │ 148 │ 149 │ 150 │ 151 │ 152 │ 153 │ 154 │ │ 159 │ 43 | E239_ │ m │ ma │ me │ mi │ mo │ mu │ my │ mai │ mei │ moi │ mau │ │ |-- │ 44 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 45 | │ 160 │ 161 │ 162 │ 163 │ 164 │ 165 │ 166 │ 167 │ 168 │ 169 │ 170 │ │ 175 │ 46 | E23A_ │ x │ xa │ xe │ xi │ xo │ xu │ xy │ xai │ xei │ xoi │ xau │ │ --- │ 47 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 48 | │ 176 │ 177 │ 178 │ 179 │ 180 │ 181 │ 182 │ 183 │ 184 │ 185 │ 186 │ │ 191 │ 49 | E23B_ │ b │ ba │ be │ bi │ bo │ bu │ by │ bai │ bei │ boi │ bau │ │ --| │ 50 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 51 | │ 192 │ 193 │ 194 │ 195 │ 196 │ 197 │ 198 │ 199 │ 200 │ 201 │ 202 │ │ 207 │ 52 | E23C_ │ d │ da │ de │ di │ do │ du │ dy │ dai │ dei │ doi │ dau │ │ |-| │ 53 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 54 | │ 208 │ 209 │ 210 │ 211 │ 212 │ 213 │ 214 │ 215 │ 216 │ 217 │ 218 │ │ 223 │ 55 | E23D_ │ g │ ga │ ge │ gi │ go │ gu │ gy │ gai │ gei │ goi │ gau │ │ │ 56 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 57 | │ 224 │ 225 │ 226 │ 227 │ 228 │ 229 │ 230 │ 231 │ 232 │ 233 │ 234 │ │ 239 │ 58 | E23E_ │ v │ va │ ve │ vi │ vo │ vu │ vy │ vai │ vei │ voi │ vau │ │ │ 59 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 60 | │ 240 │ 241 │ 242 │ 243 │ 244 │ 245 │ 246 │ 247 │ 248 │ 249 │ 250 │ │ 255 │ 61 | E23F_ │ r │ ra │ re │ ri │ ro │ ru │ ry │ rai │ rei │ roi │ rau │ │ │ 62 | └───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴─╌╌╌╌╌─┴───────┘ 63 | 64 | _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A . . . _F 65 | ┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬─╌╌╌╌╌─┬───────┐ 66 | │ 256 │ 257 │ 258 │ 259 │ 260 │ 261 │ 262 │ 263 │ 264 │ 265 │ 266 │ │ 271 │ 67 | E240_ │ z │ za │ ze │ zi │ zo │ zu │ zy │ zai │ zei │ zoi │ zau │ │ │ 68 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 69 | │ 272 │ 273 │ 274 │ 275 │ 276 │ 277 │ 278 │ 279 │ 280 │ 281 │ 282 │ │ 287 │ 70 | E241_ │ j │ ja │ je │ ji │ jo │ ju │ jy │ jai │ jei │ joi │ jau │ │ │ 71 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 72 | │ 288 │ 289 │ 290 │ 291 │ 292 │ 293 │ 294 │ 295 │ 296 │ 297 │ 298 │ │ 303 │ 73 | E242_ │ n │ na │ ne │ ni │ no │ nu │ ny │ nai │ nei │ noi │ nau │ │ │ 74 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 75 | │ 304 │ 305 │ 306 │ 307 │ 308 │ 309 │ 310 │ 311 │ 312 │ 313 │ 314 │ │ 319 │ 76 | E243_ │ q │ qa │ qe │ qi │ qo │ qu │ qy │ qai │ qei │ qoi │ qau │ │ │ 77 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 78 | │ 320 │ 321 │ 322 │ 323 │ 324 │ 325 │ 326 │ 327 │ 328 │ 329 │ 330 │ │ 335 │ 79 | E244_ │ w │ wa │ we │ wi │ wo │ wu │ wy │ wai │ wei │ woi │ wau │ │ │ 80 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 81 | │ 336 │ 337 │ 338 │ 339 │ 340 │ 341 │ 342 │ 343 │ 344 │ 345 │ 346 │ │ 351 │ 82 | E245_ │ a │ a:a │ a:e │ a:i │ a:o │ a:u │ a:y │ a:ai │ a:ei │ a:oi │ a:au │ │ │ 83 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 84 | │ 352 │ 353 │ 354 │ 355 │ 356 │ 357 │ 358 │ 359 │ 360 │ 361 │ 362 │ │ 367 │ 85 | E246_ │ e │ e:a │ e:e │ e:i │ e:o │ e:u │ e:y │ e:ai │ e:ei │ e:oi │ e:au │ │ │ 86 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 87 | │ 368 │ 369 │ 370 │ 371 │ 372 │ 373 │ 374 │ 375 │ 376 │ 377 │ 378 │ │ 383 │ 88 | E247_ │ i │ i:a │ i:e │ i:i │ i:o │ i:u │ i:y │ i:ai │ i:ei │ i:oi │ i:au │ │ │ 89 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 90 | │ 384 │ 385 │ 386 │ 387 │ 388 │ 389 │ 390 │ 391 │ 392 │ 393 │ 394 │ │ 399 │ 91 | E248_ │ o │ o:a │ o:e │ o:i │ o:o │ o:u │ o:y │ o:ai │ o:ei │ o:oi │ o:au │ │ │ 92 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 93 | │ 400 │ 401 │ 402 │ 403 │ 404 │ 405 │ 406 │ 407 │ 408 │ 409 │ 410 │ │ 415 │ 94 | E249_ │ u │ u:a │ u:e │ u:i │ u:o │ u:u │ u:y │ u:ai │ u:ei │ u:oi │ u:au │ │ │ 95 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 96 | │ 416 │ 417 │ 418 │ 419 │ 420 │ 421 │ 422 │ 423 │ 424 │ 425 │ 426 │ │ 431 │ 97 | E24A_ │ y │ y:a │ y:e │ y:i │ y:o │ y:u │ y:y │ y:ai │ y:ei │ y:oi │ y:au │ │ │ 98 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 99 | │ 432 │ 433 │ 434 │ 435 │ 436 │ 437 │ 438 │ 439 │ 440 │ 441 │ 442 │ │ 447 │ 100 | E24B_ │ ai │ ai:ai │ ai:ei │ ai:ii │ ai:oi │ ai:ui │ ai:yi │ ai:ai │ ai:ei │ ai:oi │ ai:ai │ │ │ 101 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 102 | │ 448 │ 449 │ 450 │ 451 │ 452 │ 453 │ 454 │ 455 │ 456 │ 457 │ 458 │ │ 463 │ 103 | E24C_ │ ei │ ei:ai │ ei:ei │ ei:ii │ ei:oi │ ei:ui │ ei:yi │ ei:ai │ ei:ei │ ei:oi │ ei:ai │ │ │ 104 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 105 | │ 464 │ 465 │ 466 │ 467 │ 468 │ 469 │ 470 │ 471 │ 472 │ 473 │ 474 │ │ 479 │ 106 | E24D_ │ oi │ oi:ai │ oi:ei │ oi:ii │ oi:oi │ oi:ui │ oi:yi │ oi:ai │ oi:ei │ oi:oi │ oi:ai │ │ │ 107 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 108 | │ 480 │ 481 │ 482 │ 483 │ 484 │ 485 │ 486 │ 487 │ 488 │ 489 │ 490 │ │ 495 │ 109 | E24E_ │ au │ au:a │ au:e │ au:i │ au:o │ au:u │ au:y │ au:ai │ au:ei │ au:oi │ au:au │ │ │ 110 | ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─╌╌╌╌╌─┼───────┤ 111 | │ 496 │ 497 │ 498 │ 499 │ 500 │ 501 │ 502 │ 503 │ 504 │ 505 │ 506 │ │ 511 │ 112 | E24F_ │ CAS │ A │ E │ I │ O │ U │ Y │ AI │ EI │ OI │ AU │ │ │ 113 | └───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴─╌╌╌╌╌─┴───────┘ 114 | ``` 115 | 116 | 117 | ### Punctuation Key 118 | 119 | - `|` - {slakabu} syllabalic 120 | - `/` - tone mark: up 121 | - `\` - tone mark: down 122 | - `/\` - tone mark: up-down 123 | - `\/` - tone mark: down-up 124 | - `!` - {bahebu} emphasis mark 125 | - `!!` - {bahebu} double emphasis mark 126 | - `!!!` - {bahebu} triple emphasis mark 127 | - `___` - stretch 128 | - `|--` - {smajibu} silence dash [initial] 129 | - `---` - {smajibu} silence dash [medial] 130 | - `--|` - {smajibu} silence dash [final] 131 | - `|-|` - {smajibu} silence dash [isolated] 132 | 133 | -------------------------------------------------------------------------------- /src/zlm.feature: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 4 | # ZLM OpenType Feature Table Definitions 5 | # 6 | 7 | @consonant = [ ZLM_P ZLM_T ZLM_K ZLM_F ZLM_L ZLM_S ZLM_C ZLM_M ZLM_X ZLM_B ZLM_D ZLM_G ZLM_V ZLM_R ZLM_Z ZLM_J ZLM_N ZLM_H ZLM_SEMIVOWEL_Q ZLM_SEMIVOWEL_W ]; 8 | @vowel = [ ZLM_DIACRITIC_A ZLM_DIACRITIC_E ZLM_DIACRITIC_I ZLM_DIACRITIC_O ZLM_DIACRITIC_U ZLM_DIACRITIC_Y ZLM_DIACRITIC_AI ZLM_DIACRITIC_EI ZLM_DIACRITIC_OI ZLM_DIACRITIC_AU ]; 9 | @anything = [ @consonant @vowel ]; 10 | 11 | 12 | # 13 | # 5-part ligatures 14 | # 15 | 16 | 17 | # VV'VV 18 | 19 | feature rlig { 20 | ignore sub @consonant @vowel' @vowel' ZLM_H' @vowel' @vowel'; 21 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_CAS_AIHAI; 22 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_CAS_AIHEI; 23 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_CAS_AIHOI; 24 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_CAS_AIHAU; 25 | sub ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_CAS_EIHAI; 26 | sub ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_CAS_EIHEI; 27 | sub ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_CAS_EIHOI; 28 | sub ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_CAS_EIHAU; 29 | sub ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_CAS_OIHAI; 30 | sub ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_CAS_OIHEI; 31 | sub ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_CAS_OIHOI; 32 | sub ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_CAS_OIHAU; 33 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_CAS_AUHAI; 34 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_CAS_AUHEI; 35 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_CAS_AUHOI; 36 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_CAS_AUHAU; 37 | } rlig; 38 | 39 | 40 | # 41 | # 4-part ligatures 42 | # 43 | 44 | 45 | # VV'V 46 | 47 | feature rlig { 48 | ignore sub @consonant @vowel' @vowel' ZLM_H' @vowel'; 49 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_A' by ZLM_CAS_AIHA; 50 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_E' by ZLM_CAS_AIHE; 51 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_I' by ZLM_CAS_AIHI; 52 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_O' by ZLM_CAS_AIHO; 53 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_U' by ZLM_CAS_AIHU; 54 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_Y' by ZLM_CAS_AIHY; 55 | sub ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_A' by ZLM_CAS_EIHA; 56 | sub ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_E' by ZLM_CAS_EIHE; 57 | sub ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_I' by ZLM_CAS_EIHI; 58 | sub ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_O' by ZLM_CAS_EIHO; 59 | sub ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_U' by ZLM_CAS_EIHU; 60 | sub ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_Y' by ZLM_CAS_EIHY; 61 | sub ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_A' by ZLM_CAS_OIHA; 62 | sub ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_E' by ZLM_CAS_OIHE; 63 | sub ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_I' by ZLM_CAS_OIHI; 64 | sub ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_O' by ZLM_CAS_OIHO; 65 | sub ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_U' by ZLM_CAS_OIHU; 66 | sub ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_Y' by ZLM_CAS_OIHY; 67 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_A' by ZLM_CAS_AUHA; 68 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_E' by ZLM_CAS_AUHE; 69 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_I' by ZLM_CAS_AUHI; 70 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_O' by ZLM_CAS_AUHO; 71 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_U' by ZLM_CAS_AUHU; 72 | sub ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_Y' by ZLM_CAS_AUHY; 73 | } rlig; 74 | 75 | # V'VV 76 | 77 | feature rlig { 78 | ignore sub @consonant @vowel' ZLM_H' @vowel' @vowel'; 79 | sub ZLM_DIACRITIC_A' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_CAS_AHAI; 80 | sub ZLM_DIACRITIC_A' ZLM_H' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_CAS_AHEI; 81 | sub ZLM_DIACRITIC_A' ZLM_H' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_CAS_AHOI; 82 | sub ZLM_DIACRITIC_A' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_CAS_AHAU; 83 | sub ZLM_DIACRITIC_E' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_CAS_EHAI; 84 | sub ZLM_DIACRITIC_E' ZLM_H' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_CAS_EHEI; 85 | sub ZLM_DIACRITIC_E' ZLM_H' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_CAS_EHOI; 86 | sub ZLM_DIACRITIC_E' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_CAS_EHAU; 87 | sub ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_CAS_IHAI; 88 | sub ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_CAS_IHEI; 89 | sub ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_CAS_IHOI; 90 | sub ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_CAS_IHAU; 91 | sub ZLM_DIACRITIC_O' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_CAS_OHAI; 92 | sub ZLM_DIACRITIC_O' ZLM_H' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_CAS_OHEI; 93 | sub ZLM_DIACRITIC_O' ZLM_H' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_CAS_OHOI; 94 | sub ZLM_DIACRITIC_O' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_CAS_OHAU; 95 | sub ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_CAS_UHAI; 96 | sub ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_CAS_UHEI; 97 | sub ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_CAS_UHOI; 98 | sub ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_CAS_UHAU; 99 | sub ZLM_DIACRITIC_Y' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_CAS_YHAI; 100 | sub ZLM_DIACRITIC_Y' ZLM_H' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_CAS_YHEI; 101 | sub ZLM_DIACRITIC_Y' ZLM_H' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_CAS_YHOI; 102 | sub ZLM_DIACRITIC_Y' ZLM_H' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_CAS_YHAU; 103 | } rlig; 104 | 105 | 106 | # 107 | # 3-part ligatures 108 | # 109 | 110 | 111 | # V'V 112 | 113 | feature rlig { 114 | ignore sub @consonant @vowel' ZLM_H' @vowel'; 115 | sub ZLM_DIACRITIC_A' ZLM_H' ZLM_DIACRITIC_A' by ZLM_CAS_AHA; 116 | sub ZLM_DIACRITIC_A' ZLM_H' ZLM_DIACRITIC_E' by ZLM_CAS_AHE; 117 | sub ZLM_DIACRITIC_A' ZLM_H' ZLM_DIACRITIC_I' by ZLM_CAS_AHI; 118 | sub ZLM_DIACRITIC_A' ZLM_H' ZLM_DIACRITIC_O' by ZLM_CAS_AHO; 119 | sub ZLM_DIACRITIC_A' ZLM_H' ZLM_DIACRITIC_U' by ZLM_CAS_AHU; 120 | sub ZLM_DIACRITIC_A' ZLM_H' ZLM_DIACRITIC_Y' by ZLM_CAS_AHY; 121 | sub ZLM_DIACRITIC_E' ZLM_H' ZLM_DIACRITIC_A' by ZLM_CAS_EHA; 122 | sub ZLM_DIACRITIC_E' ZLM_H' ZLM_DIACRITIC_E' by ZLM_CAS_EHE; 123 | sub ZLM_DIACRITIC_E' ZLM_H' ZLM_DIACRITIC_I' by ZLM_CAS_EHI; 124 | sub ZLM_DIACRITIC_E' ZLM_H' ZLM_DIACRITIC_O' by ZLM_CAS_EHO; 125 | sub ZLM_DIACRITIC_E' ZLM_H' ZLM_DIACRITIC_U' by ZLM_CAS_EHU; 126 | sub ZLM_DIACRITIC_E' ZLM_H' ZLM_DIACRITIC_Y' by ZLM_CAS_EHY; 127 | sub ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_A' by ZLM_CAS_IHA; 128 | sub ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_E' by ZLM_CAS_IHE; 129 | sub ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_I' by ZLM_CAS_IHI; 130 | sub ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_O' by ZLM_CAS_IHO; 131 | sub ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_U' by ZLM_CAS_IHU; 132 | sub ZLM_DIACRITIC_I' ZLM_H' ZLM_DIACRITIC_Y' by ZLM_CAS_IHY; 133 | sub ZLM_DIACRITIC_O' ZLM_H' ZLM_DIACRITIC_A' by ZLM_CAS_OHA; 134 | sub ZLM_DIACRITIC_O' ZLM_H' ZLM_DIACRITIC_E' by ZLM_CAS_OHE; 135 | sub ZLM_DIACRITIC_O' ZLM_H' ZLM_DIACRITIC_I' by ZLM_CAS_OHI; 136 | sub ZLM_DIACRITIC_O' ZLM_H' ZLM_DIACRITIC_O' by ZLM_CAS_OHO; 137 | sub ZLM_DIACRITIC_O' ZLM_H' ZLM_DIACRITIC_U' by ZLM_CAS_OHU; 138 | sub ZLM_DIACRITIC_O' ZLM_H' ZLM_DIACRITIC_Y' by ZLM_CAS_OHY; 139 | sub ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_A' by ZLM_CAS_UHA; 140 | sub ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_E' by ZLM_CAS_UHE; 141 | sub ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_I' by ZLM_CAS_UHI; 142 | sub ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_O' by ZLM_CAS_UHO; 143 | sub ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_U' by ZLM_CAS_UHU; 144 | sub ZLM_DIACRITIC_U' ZLM_H' ZLM_DIACRITIC_Y' by ZLM_CAS_UHY; 145 | sub ZLM_DIACRITIC_Y' ZLM_H' ZLM_DIACRITIC_A' by ZLM_CAS_YHA; 146 | sub ZLM_DIACRITIC_Y' ZLM_H' ZLM_DIACRITIC_E' by ZLM_CAS_YHE; 147 | sub ZLM_DIACRITIC_Y' ZLM_H' ZLM_DIACRITIC_I' by ZLM_CAS_YHI; 148 | sub ZLM_DIACRITIC_Y' ZLM_H' ZLM_DIACRITIC_O' by ZLM_CAS_YHO; 149 | sub ZLM_DIACRITIC_Y' ZLM_H' ZLM_DIACRITIC_U' by ZLM_CAS_YHU; 150 | sub ZLM_DIACRITIC_Y' ZLM_H' ZLM_DIACRITIC_Y' by ZLM_CAS_YHY; 151 | } rlig; 152 | 153 | # QVV 154 | 155 | feature rlig { 156 | sub ZLM_SEMIVOWEL_Q' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_QAI; 157 | sub ZLM_SEMIVOWEL_Q' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_QEI; 158 | sub ZLM_SEMIVOWEL_Q' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_QOI; 159 | sub ZLM_SEMIVOWEL_Q' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_QAU; 160 | sub ZLM_SEMIVOWEL_W' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_WAI; 161 | sub ZLM_SEMIVOWEL_W' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_WEI; 162 | sub ZLM_SEMIVOWEL_W' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_WOI; 163 | sub ZLM_SEMIVOWEL_W' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_WAU; 164 | } rlig; 165 | 166 | # WVV 167 | 168 | feature rlig { 169 | ignore sub @consonant @vowel' @vowel' @vowel"'; 170 | sub ZLM_DIACRITIC_I' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_QAI; 171 | sub ZLM_DIACRITIC_I' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_QEI; 172 | sub ZLM_DIACRITIC_I' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_QOI; 173 | sub ZLM_DIACRITIC_I' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_QAU; 174 | sub ZLM_DIACRITIC_U' ZLM_DIACRITIC_A' ZLM_DIACRITIC_I' by ZLM_WAI; 175 | sub ZLM_DIACRITIC_U' ZLM_DIACRITIC_E' ZLM_DIACRITIC_I' by ZLM_WEI; 176 | sub ZLM_DIACRITIC_U' ZLM_DIACRITIC_O' ZLM_DIACRITIC_I' by ZLM_WOI; 177 | sub ZLM_DIACRITIC_U' ZLM_DIACRITIC_A' ZLM_DIACRITIC_U' by ZLM_WAU; 178 | } rlig; 179 | 180 | # CVV 181 | 182 | feature rlig { 183 | sub ZLM_P ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_PAI; 184 | sub ZLM_P ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_PEI; 185 | sub ZLM_P ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_POI; 186 | sub ZLM_P ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_PAU; 187 | sub ZLM_T ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_TAI; 188 | sub ZLM_T ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_TEI; 189 | sub ZLM_T ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_TOI; 190 | sub ZLM_T ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_TAU; 191 | sub ZLM_K ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_KAI; 192 | sub ZLM_K ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_KEI; 193 | sub ZLM_K ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_KOI; 194 | sub ZLM_K ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_KAU; 195 | sub ZLM_F ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_FAI; 196 | sub ZLM_F ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_FEI; 197 | sub ZLM_F ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_FOI; 198 | sub ZLM_F ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_FAU; 199 | sub ZLM_L ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_LAI; 200 | sub ZLM_L ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_LEI; 201 | sub ZLM_L ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_LOI; 202 | sub ZLM_L ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_LAU; 203 | sub ZLM_S ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_SAI; 204 | sub ZLM_S ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_SEI; 205 | sub ZLM_S ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_SOI; 206 | sub ZLM_S ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_SAU; 207 | sub ZLM_C ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_CAI; 208 | sub ZLM_C ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_CEI; 209 | sub ZLM_C ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_COI; 210 | sub ZLM_C ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_CAU; 211 | sub ZLM_M ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_MAI; 212 | sub ZLM_M ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_MEI; 213 | sub ZLM_M ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_MOI; 214 | sub ZLM_M ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_MAU; 215 | sub ZLM_X ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_XAI; 216 | sub ZLM_X ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_XEI; 217 | sub ZLM_X ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_XOI; 218 | sub ZLM_X ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_XAU; 219 | sub ZLM_B ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_BAI; 220 | sub ZLM_B ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_BEI; 221 | sub ZLM_B ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_BOI; 222 | sub ZLM_B ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_BAU; 223 | sub ZLM_D ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_DAI; 224 | sub ZLM_D ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_DEI; 225 | sub ZLM_D ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_DOI; 226 | sub ZLM_D ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_DAU; 227 | sub ZLM_G ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_GAI; 228 | sub ZLM_G ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_GEI; 229 | sub ZLM_G ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_GOI; 230 | sub ZLM_G ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_GAU; 231 | sub ZLM_V ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_VAI; 232 | sub ZLM_V ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_VEI; 233 | sub ZLM_V ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_VOI; 234 | sub ZLM_V ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_VAU; 235 | sub ZLM_R ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_RAI; 236 | sub ZLM_R ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_REI; 237 | sub ZLM_R ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_ROI; 238 | sub ZLM_R ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_RAU; 239 | sub ZLM_Z ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_ZAI; 240 | sub ZLM_Z ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_ZEI; 241 | sub ZLM_Z ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_ZOI; 242 | sub ZLM_Z ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_ZAU; 243 | sub ZLM_J ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_JAI; 244 | sub ZLM_J ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_JEI; 245 | sub ZLM_J ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_JOI; 246 | sub ZLM_J ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_JAU; 247 | sub ZLM_N ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_NAI; 248 | sub ZLM_N ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_NEI; 249 | sub ZLM_N ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_NOI; 250 | sub ZLM_N ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_NAU; 251 | sub ZLM_H ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_HAI; 252 | sub ZLM_H ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_HEI; 253 | sub ZLM_H ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_HOI; 254 | sub ZLM_H ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_HAU; 255 | } rlig; 256 | 257 | 258 | # 259 | # 2-part ligatures 260 | # 261 | 262 | 263 | # QV 264 | 265 | feature rlig { 266 | sub ZLM_SEMIVOWEL_Q' ZLM_DIACRITIC_A' by ZLM_QA; 267 | sub ZLM_SEMIVOWEL_Q' ZLM_DIACRITIC_E' by ZLM_QE; 268 | sub ZLM_SEMIVOWEL_Q' ZLM_DIACRITIC_I' by ZLM_QI; 269 | sub ZLM_SEMIVOWEL_Q' ZLM_DIACRITIC_O' by ZLM_QO; 270 | sub ZLM_SEMIVOWEL_Q' ZLM_DIACRITIC_U' by ZLM_QU; 271 | sub ZLM_SEMIVOWEL_Q' ZLM_DIACRITIC_Y' by ZLM_QY; 272 | sub ZLM_SEMIVOWEL_W' ZLM_DIACRITIC_A' by ZLM_WA; 273 | sub ZLM_SEMIVOWEL_W' ZLM_DIACRITIC_E' by ZLM_WE; 274 | sub ZLM_SEMIVOWEL_W' ZLM_DIACRITIC_I' by ZLM_WI; 275 | sub ZLM_SEMIVOWEL_W' ZLM_DIACRITIC_O' by ZLM_WO; 276 | sub ZLM_SEMIVOWEL_W' ZLM_DIACRITIC_U' by ZLM_WU; 277 | sub ZLM_SEMIVOWEL_W' ZLM_DIACRITIC_Y' by ZLM_WY; 278 | } rlig; 279 | 280 | # WV 281 | 282 | feature rlig { 283 | ignore sub @consonant @vowel' @vowel'; 284 | sub ZLM_DIACRITIC_I' ZLM_DIACRITIC_A' by ZLM_QA; 285 | sub ZLM_DIACRITIC_I' ZLM_DIACRITIC_E' by ZLM_QE; 286 | sub ZLM_DIACRITIC_I' ZLM_DIACRITIC_I' by ZLM_QI; 287 | sub ZLM_DIACRITIC_I' ZLM_DIACRITIC_O' by ZLM_QO; 288 | sub ZLM_DIACRITIC_I' ZLM_DIACRITIC_U' by ZLM_QU; 289 | sub ZLM_DIACRITIC_I' ZLM_DIACRITIC_Y' by ZLM_QY; 290 | sub ZLM_DIACRITIC_U' ZLM_DIACRITIC_A' by ZLM_WA; 291 | sub ZLM_DIACRITIC_U' ZLM_DIACRITIC_E' by ZLM_WE; 292 | sub ZLM_DIACRITIC_U' ZLM_DIACRITIC_I' by ZLM_WI; 293 | sub ZLM_DIACRITIC_U' ZLM_DIACRITIC_O' by ZLM_WO; 294 | sub ZLM_DIACRITIC_U' ZLM_DIACRITIC_U' by ZLM_WU; 295 | sub ZLM_DIACRITIC_U' ZLM_DIACRITIC_Y' by ZLM_WY; 296 | } rlig; 297 | 298 | # CV 299 | 300 | feature rlig { 301 | sub ZLM_P ZLM_DIACRITIC_A by ZLM_PA; 302 | sub ZLM_P ZLM_DIACRITIC_E by ZLM_PE; 303 | sub ZLM_P ZLM_DIACRITIC_I by ZLM_PI; 304 | sub ZLM_P ZLM_DIACRITIC_O by ZLM_PO; 305 | sub ZLM_P ZLM_DIACRITIC_U by ZLM_PU; 306 | sub ZLM_P ZLM_DIACRITIC_Y by ZLM_PY; 307 | sub ZLM_T ZLM_DIACRITIC_A by ZLM_TA; 308 | sub ZLM_T ZLM_DIACRITIC_E by ZLM_TE; 309 | sub ZLM_T ZLM_DIACRITIC_I by ZLM_TI; 310 | sub ZLM_T ZLM_DIACRITIC_O by ZLM_TO; 311 | sub ZLM_T ZLM_DIACRITIC_U by ZLM_TU; 312 | sub ZLM_T ZLM_DIACRITIC_Y by ZLM_TY; 313 | sub ZLM_K ZLM_DIACRITIC_A by ZLM_KA; 314 | sub ZLM_K ZLM_DIACRITIC_E by ZLM_KE; 315 | sub ZLM_K ZLM_DIACRITIC_I by ZLM_KI; 316 | sub ZLM_K ZLM_DIACRITIC_O by ZLM_KO; 317 | sub ZLM_K ZLM_DIACRITIC_U by ZLM_KU; 318 | sub ZLM_K ZLM_DIACRITIC_Y by ZLM_KY; 319 | sub ZLM_F ZLM_DIACRITIC_A by ZLM_FA; 320 | sub ZLM_F ZLM_DIACRITIC_E by ZLM_FE; 321 | sub ZLM_F ZLM_DIACRITIC_I by ZLM_FI; 322 | sub ZLM_F ZLM_DIACRITIC_O by ZLM_FO; 323 | sub ZLM_F ZLM_DIACRITIC_U by ZLM_FU; 324 | sub ZLM_F ZLM_DIACRITIC_Y by ZLM_FY; 325 | sub ZLM_L ZLM_DIACRITIC_A by ZLM_LA; 326 | sub ZLM_L ZLM_DIACRITIC_E by ZLM_LE; 327 | sub ZLM_L ZLM_DIACRITIC_I by ZLM_LI; 328 | sub ZLM_L ZLM_DIACRITIC_O by ZLM_LO; 329 | sub ZLM_L ZLM_DIACRITIC_U by ZLM_LU; 330 | sub ZLM_L ZLM_DIACRITIC_Y by ZLM_LY; 331 | sub ZLM_S ZLM_DIACRITIC_A by ZLM_SA; 332 | sub ZLM_S ZLM_DIACRITIC_E by ZLM_SE; 333 | sub ZLM_S ZLM_DIACRITIC_I by ZLM_SI; 334 | sub ZLM_S ZLM_DIACRITIC_O by ZLM_SO; 335 | sub ZLM_S ZLM_DIACRITIC_U by ZLM_SU; 336 | sub ZLM_S ZLM_DIACRITIC_Y by ZLM_SY; 337 | sub ZLM_C ZLM_DIACRITIC_A by ZLM_CA; 338 | sub ZLM_C ZLM_DIACRITIC_E by ZLM_CE; 339 | sub ZLM_C ZLM_DIACRITIC_I by ZLM_CI; 340 | sub ZLM_C ZLM_DIACRITIC_O by ZLM_CO; 341 | sub ZLM_C ZLM_DIACRITIC_U by ZLM_CU; 342 | sub ZLM_C ZLM_DIACRITIC_Y by ZLM_CY; 343 | sub ZLM_M ZLM_DIACRITIC_A by ZLM_MA; 344 | sub ZLM_M ZLM_DIACRITIC_E by ZLM_ME; 345 | sub ZLM_M ZLM_DIACRITIC_I by ZLM_MI; 346 | sub ZLM_M ZLM_DIACRITIC_O by ZLM_MO; 347 | sub ZLM_M ZLM_DIACRITIC_U by ZLM_MU; 348 | sub ZLM_M ZLM_DIACRITIC_Y by ZLM_MY; 349 | sub ZLM_X ZLM_DIACRITIC_A by ZLM_XA; 350 | sub ZLM_X ZLM_DIACRITIC_E by ZLM_XE; 351 | sub ZLM_X ZLM_DIACRITIC_I by ZLM_XI; 352 | sub ZLM_X ZLM_DIACRITIC_O by ZLM_XO; 353 | sub ZLM_X ZLM_DIACRITIC_U by ZLM_XU; 354 | sub ZLM_X ZLM_DIACRITIC_Y by ZLM_XY; 355 | sub ZLM_B ZLM_DIACRITIC_A by ZLM_BA; 356 | sub ZLM_B ZLM_DIACRITIC_E by ZLM_BE; 357 | sub ZLM_B ZLM_DIACRITIC_I by ZLM_BI; 358 | sub ZLM_B ZLM_DIACRITIC_O by ZLM_BO; 359 | sub ZLM_B ZLM_DIACRITIC_U by ZLM_BU; 360 | sub ZLM_B ZLM_DIACRITIC_Y by ZLM_BY; 361 | sub ZLM_D ZLM_DIACRITIC_A by ZLM_DA; 362 | sub ZLM_D ZLM_DIACRITIC_E by ZLM_DE; 363 | sub ZLM_D ZLM_DIACRITIC_I by ZLM_DI; 364 | sub ZLM_D ZLM_DIACRITIC_O by ZLM_DO; 365 | sub ZLM_D ZLM_DIACRITIC_U by ZLM_DU; 366 | sub ZLM_D ZLM_DIACRITIC_Y by ZLM_DY; 367 | sub ZLM_G ZLM_DIACRITIC_A by ZLM_GA; 368 | sub ZLM_G ZLM_DIACRITIC_E by ZLM_GE; 369 | sub ZLM_G ZLM_DIACRITIC_I by ZLM_GI; 370 | sub ZLM_G ZLM_DIACRITIC_O by ZLM_GO; 371 | sub ZLM_G ZLM_DIACRITIC_U by ZLM_GU; 372 | sub ZLM_G ZLM_DIACRITIC_Y by ZLM_GY; 373 | sub ZLM_V ZLM_DIACRITIC_A by ZLM_VA; 374 | sub ZLM_V ZLM_DIACRITIC_E by ZLM_VE; 375 | sub ZLM_V ZLM_DIACRITIC_I by ZLM_VI; 376 | sub ZLM_V ZLM_DIACRITIC_O by ZLM_VO; 377 | sub ZLM_V ZLM_DIACRITIC_U by ZLM_VU; 378 | sub ZLM_V ZLM_DIACRITIC_Y by ZLM_VY; 379 | sub ZLM_R ZLM_DIACRITIC_A by ZLM_RA; 380 | sub ZLM_R ZLM_DIACRITIC_E by ZLM_RE; 381 | sub ZLM_R ZLM_DIACRITIC_I by ZLM_RI; 382 | sub ZLM_R ZLM_DIACRITIC_O by ZLM_RO; 383 | sub ZLM_R ZLM_DIACRITIC_U by ZLM_RU; 384 | sub ZLM_R ZLM_DIACRITIC_Y by ZLM_RY; 385 | sub ZLM_Z ZLM_DIACRITIC_A by ZLM_ZA; 386 | sub ZLM_Z ZLM_DIACRITIC_E by ZLM_ZE; 387 | sub ZLM_Z ZLM_DIACRITIC_I by ZLM_ZI; 388 | sub ZLM_Z ZLM_DIACRITIC_O by ZLM_ZO; 389 | sub ZLM_Z ZLM_DIACRITIC_U by ZLM_ZU; 390 | sub ZLM_Z ZLM_DIACRITIC_Y by ZLM_ZY; 391 | sub ZLM_J ZLM_DIACRITIC_A by ZLM_JA; 392 | sub ZLM_J ZLM_DIACRITIC_E by ZLM_JE; 393 | sub ZLM_J ZLM_DIACRITIC_I by ZLM_JI; 394 | sub ZLM_J ZLM_DIACRITIC_O by ZLM_JO; 395 | sub ZLM_J ZLM_DIACRITIC_U by ZLM_JU; 396 | sub ZLM_J ZLM_DIACRITIC_Y by ZLM_JY; 397 | sub ZLM_N ZLM_DIACRITIC_A by ZLM_NA; 398 | sub ZLM_N ZLM_DIACRITIC_E by ZLM_NE; 399 | sub ZLM_N ZLM_DIACRITIC_I by ZLM_NI; 400 | sub ZLM_N ZLM_DIACRITIC_O by ZLM_NO; 401 | sub ZLM_N ZLM_DIACRITIC_U by ZLM_NU; 402 | sub ZLM_N ZLM_DIACRITIC_Y by ZLM_NY; 403 | sub ZLM_H ZLM_DIACRITIC_A by ZLM_HA; 404 | sub ZLM_H ZLM_DIACRITIC_E by ZLM_HE; 405 | sub ZLM_H ZLM_DIACRITIC_I by ZLM_HI; 406 | sub ZLM_H ZLM_DIACRITIC_O by ZLM_HO; 407 | sub ZLM_H ZLM_DIACRITIC_U by ZLM_HU; 408 | sub ZLM_H ZLM_DIACRITIC_Y by ZLM_HY; 409 | } rlig; 410 | 411 | # VV 412 | 413 | feature rlig { 414 | sub ZLM_DIACRITIC_A ZLM_DIACRITIC_I by ZLM_DIACRITIC_AI; 415 | sub ZLM_DIACRITIC_E ZLM_DIACRITIC_I by ZLM_DIACRITIC_EI; 416 | sub ZLM_DIACRITIC_O ZLM_DIACRITIC_I by ZLM_DIACRITIC_OI; 417 | sub ZLM_DIACRITIC_A ZLM_DIACRITIC_U by ZLM_DIACRITIC_AU; 418 | } rlig; 419 | 420 | 421 | # 422 | # Single Substitutions 423 | # 424 | 425 | 426 | # .V 427 | 428 | feature rlig { 429 | ignore sub @anything @vowel'; 430 | sub ZLM_DIACRITIC_A' by ZLM_DOT_A; 431 | sub ZLM_DIACRITIC_E' by ZLM_DOT_E; 432 | sub ZLM_DIACRITIC_I' by ZLM_DOT_I; 433 | sub ZLM_DIACRITIC_O' by ZLM_DOT_O; 434 | sub ZLM_DIACRITIC_U' by ZLM_DOT_U; 435 | sub ZLM_DIACRITIC_Y' by ZLM_DOT_Y; 436 | sub ZLM_DIACRITIC_AI' by ZLM_DOT_AI; 437 | sub ZLM_DIACRITIC_EI' by ZLM_DOT_EI; 438 | sub ZLM_DIACRITIC_OI' by ZLM_DOT_OI; 439 | sub ZLM_DIACRITIC_AU' by ZLM_DOT_AU; 440 | } rlig; 441 | --------------------------------------------------------------------------------