aboutsummaryrefslogblamecommitdiffstats
path: root/res/compose
blob: 2cc509b2ceee63d72fe203740c2f16a7209b1667 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

















                                                                       

                                             

 


















                                                     





                                         
              


               
 

                  
                     







                                      
                     


























































































                                          


































































                                                     



















































                                                                 


                                  



































                                     
                                  


















                                                                 












































                                                      








                                              






































                                                                          





































































































































                                                                               






































                                                 




                                           

                   


                                      

                      

                      
       

                       
       

                       
       

                      
       

                      
       

                      
       

                        
       

                       
       
                                    
         






                                                                      

                              

                                        


         













































































































































                                             






















































                                                                       











                                              


                            
                                     
 
# mds — A micro-display server
# Copyright © 2014  Mattias Andrée (maandree@member.fsf.org)
# 
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.



# Based on the Unicode Character Database 7.0



macro dead_ascii/1
  <dead letter \1> [" " <dead letter \1>] : "\1"
  <compose> "\1" : <dead letter \1>
end macro
macro dead_ascii/2
  <dead letter \1> [" " "\2" <dead letter \1>] : "\1"
  <compose> ["\1" "\2"] : <dead letter \1>
end macro

macro composite/3
  <dead letter \2> "\1" : "\3"
  <compose> "\1" "\2" : "\3"
end macro
macro composite/4
  <dead letter \2> "\1" : "\4"
  <compose> "\1" ["\2" "\3"] : "\4"
end macro


<compose> "u" "+" : <dead hexcompose>
<compose> "U" "+" : <dead longhexcompose>


# TODO C0 Controls

# Basic Latin:
dead_ascii("^")
dead_ascii("`")
dead_ascii("~")

# TODO C1 Controls

# Latin-1 Supplement:
<compose> "!" "!" : "¡"
<compose> ("/" "c") : "¢"
<compose> ("|" ["c" "L"]) : "¢"
<compose> ("-" ["l" "L"]) : "£"
<compose> (["o" "O"] ["x" "X"]) : "¤"
<compose> (["-" "="] ["y" "Y"]) : "¥"
<compose> ("!" "|") : "¦"
<compose> (["o" "O"] ["s" "S"]) : "§"
dead_ascii("¨" "\"")
<compose> (["o" "O"] ["c" "C"]) : "©"
(<compose> <dead letter ~>) "_" "a" : "ª"
<compose> "<" "<" : "«"
<compose> ("-" ",") : "¬"
<compose> "-" "-" " " : "­"
<compose> (["o" "O"] ["r" "R"]) : "®"
<compose> "-" : <dead letter ¯>
<compose> "o" : <dead letter °>
dead_ascii("°")
<compose> "+" "-" : "±"
<dead letter ^> "2" : "²"
<dead letter ^> "3" : "³"
dead_ascii("´" "'")
<compose> "m" "u" : "µ"
<compose> ["p" "P"] ["p" "P" "!"] : "¶"
<compose> "!" ["p" "P"] : "¶"
<compose> "." "-" : "·"
dead_ascii("," ",")
<dead letter ^> "1" : "¹"
(<compose> <dead letter ~>) "_" "o" : "º"
<compose> ">" ">" : "»"
<compose> "1" "4" : "¼"
<compose> "1" "2" : "½"
<compose> "3" "4" : "¾"
<compose> "?" "?" : "¿"
composite("`" "A" "À")
composite("´" "'" "A" "Á")
composite("~" "A" "Ã")
composite("¨" "\"" "A" "Ä")
<dead letter °> "A" : "Å"
<compose> "A" "E" : "Æ"
composite("¸" "," "C" "Ç")
composite("`" "E" "È")
composite("´" "'" "E" "É")
composite("^" "E" "Ê")
composite("¨" "\"" "E" "Ë")
composite("`" "I" "Ì")
composite("´" "'" "I" "Í")
composite("^" "I" "Î")
composite("¨" "\"" "I" "Ï")
<compose> "-" : <dead letter ->
composite("-" "D" "Đ")
<compose> "/" : <dead letter />
composite("/" "D" "Đ")
composite("~" "N" "Ñ")
composite("`" "O" "Ò")
composite("´" "'" "O" "Ó")
composite("^" "O" "Ô")
composite("~" "O" "Õ")
composite("¨" "\"" "O" "Ö")
<compose> "x" "x" : "×"
composite("/" "O" "Ø")
composite("`" "U" "Ù")
composite("´" "'" "U" "Ú")
composite("^" "U" "Û")
composite("¨" "\"" "U" "Ü")
composite("´" "'" "Y" "Ý")
<compose> "T" "H" : "Þ"
<compose> "s" "s" : "ß"
<compose> "ſ" "s" : "ß"
composite("`" "a" "à")
composite("´" "'" "a" "á")
composite("~" "a" "ã")
composite("¨" "\"" "a" "ä")
<dead letter °> "a" : "å"
<compose> "a" "e" : "æ"
composite("¸" "," "c" "ç")
composite("`" "e" "è")
composite("´" "'" "e" "é")
composite("^" "e" "ê")
composite("¨" "\"" "e" "ë")
composite("`" "i" "ì")
composite("´" "'" "i" "í")
composite("^" "i" "î")
composite("¨" "\"" "i" "ï")
composite("/" "d" "ð")
composite("~" "n" "ñ")
composite("`" "o" "ò")
composite("´" "'" "o" "ó")
composite("^" "o" "ô")
composite("~" "o" "õ")
composite("¨" "\"" "o" "ö")
<compose> ":" "-" : "÷"
composite("/" "o" "ø")
composite("`" "u" "ù")
composite("´" "'" "u" "ú")
composite("^" "u" "û")
composite("¨" "\"" "u" "ü")
composite("´" "'" "y" "ý")
<compose> "t" "h" : "þ"
composite("¨" "\"" "y" "ÿ")

# TODO Latin Extended-A
# TODO Latin Extended-B
# TODO IPA Extensions
# TODO Spacing Modifier Letter
# TODO Combining Diacritical Marks
# TODO Greek and Coptic
# TODO Cyrillic
# TODO Cyrillic Supplement
# TODO Armenian
# TODO Hebrew
# TODO Arabic
# TODO Syriac
# TODO Arabic Supplement
# TODO Thaana
# TODO NKo
# TODO Samaritan
# TODO Mandaic
# TODO Arabic Extended-A
# TODO Devanagari
# TODO Bengali
# TODO Gurmukhi
# TODO Gujarati
# TODO Oriya
# TODO Tamil
# TODO Telugu
# TODO Kannada
# TODO Malayalam
# TODO Sinhala
# TODO Thai
# TODO Lao
# TODO Tibetan
# TODO Myanmar
# TODO Georgian
# TODO Hangul Jamo
# TODO Ethiopic
# TODO Ethiopic Supplement
# TODO Cherokee
# TODO Unified Canadian Aboriginal Syllabics
# TODO Ogham
# TODO Runic
# TODO Tagalog
# TODO Hanunoo
# TODO Buhid
# TODO Tagbanwa
# TODO Khmer
# TODO Mongolian
# TODO Unified Canadian Aboriginal Syllabics Extended
# TODO Limbu
# TODO Tai Le
# TODO New Tai Lue
# TODO Khmer Symbols
# TODO Buginese
# TODO Tai Tham
# TODO Combining Diacritical Marks Extended
# TODO Balinese
# TODO Sundanese
# TODO Batak
# TODO Lepcha
# TODO Ol Chiki
# TODO Sundanese Supplement
# TODO Vedic Extensions
# TODO Phonetic Extensions
# TODO Phonetic Extensions Supplement
# TODO Combining Diacritical Marks Supplement
# TODO Latin Extended Additional
# TODO Greek Extended

# General Punctuation:
<compose> <space> "_" "." : "\u2000" # en quad
<compose> <space> "_" "_" : "\u2001" # em quad
<compose> <space> "-" "." : "\u2002" # en space
<compose> <space> "-" "-" : "\u2003" # em space
<compose> <space> "3" : "\u2004" # three-per-em space
<compose> <space> "4" : "\u2005" # four-per-em space
<compose> <space> "6" : "\u2006" # six-per-em space
<compose> <space> "f" : "\u2007" # figure space
<compose> <space> "." : "\u2008" # punctuation space
<compose> <space> "t" : "\u2009" # thin space
<compose> <space> "h" : "\u200A" # hairspace
<compose> <space> "0" : "\u200B" # zero width space
<compose> <space> "J" : "\u200C" # zero width non-joiner
<compose> <space> "j" : "\u200D" # zero width joiner
<compose> <space> "l" : "\u200E" # left-to-right mark
<compose> <space> "r" : "\u200F" # right-to-left mark
<compose> "-" <space> : "\u2010" # hyphen
<compose> "-" " " : "\u2011" # non-breaking hyphen
<compose> "-" "-" "f" : "\u2012" # figure dash
<compose> "-" "-" "." : "\u2013" # en dash
<compose> "-" "-" "-" : "\u2014" # em dash
<compose> "-" "-" "_" : "\u2015" # horizontal bar
<compose> "|" "|" : "\u2016" # double verical line
<compose> "-" "_" : "\u2017" # double low line
<compose> ("(" "'") : "‘"
<compose> (")" "'") : "’"
<compose> ("(" ",") : "‚"
<compose> (")" ",") : "‛"
<compose> ("(" "\"") : "“"
<compose> (")" "\"") : "”"
<compose> ("(" ";") : "„"
<compose> (")" ";") : "‟"
<compose> "+" "T" : "†"
<compose> "+" "+" "T" : "‡"
<shift compose> "." "." : "•"
<shift compose> "|" ">" : "‣"
<compose> "." "," : "\u2024" # one dot leader
<compose> "." ";" : "\u2025" # two dot leader
<compose> "." "." : "…"
<compose> "-" "." : "\u2027" # hyphenation point
<compose> "l" <space> : "\u2028" # line separator
<compose> "p" <space> : "\u2029" # paragraph separator
<compose> <space> "e" "l" : "\u202A" # left-to-right embedding
<compose> <space> "e" "r" : "\u202B" # right-to-left embedding
<compose> <space> "e" "p" : "\u202C" # pop directional formatting
<compose> <space> "o" "l" : "\u202D" # left-to-right override
<compose> <space> "o" "r" : "\u202E" # right-to-left override
<compose> "m" " " : "\u202F" # narrow no-break space
<compose> "%" ["o" "."] : "‰"
<compose> "%" ["O" ":"] : "‱"
<compose> ("1" ["'" "´"]) : "′"
<compose> ("2" ["'" "´"]) : "″"
<compose> ("3" ["'" "´"]) : "‴"
<compose> ("1" "`") : "‵"
<compose> ("2" "`") : "‶"
<compose> ("3" "`") : "‷"
<shift compose> ("." "^") : "‸"
<shift compose> ("." "<") : "‹"
<shift compose> ("." ">") : "›"
<compose> ("x" "+") : "※"
<shift compose> "!" "!" : "‼"
<compose> "!" "?" : "‽"
<shift compose> "^" "_" : "‾"
<shift compose> ("_" "u") : "‿"
<shift compose> ("^" "u") : "⁀"
<shift compose> "/" "/" : "⁁"
<compose> "*" "*" : "⁂"
<shift compose> "-" "-" : "⁃"
<compose> "/" "/" : "⁄"
<compose> ("[" "-") : "⁅"
<compose> ("]" "-") : "⁆"
<shift compose> "?" "?" : "⁇"
<shift compose> "?" "!" : "⁈"
<shift compose> "!" "?" : "⁉"
<compose> ("/" "7"): "⁊"
<compose> "¶" "¶" : "⁋"
<compose> ("?" ["p" "P"]) : "⁋"
<compose> "(" "|" : "⁌"
<compose> "|" ")" : "⁍"
<compose> ("*" ".") : "⁎"
<compose> ";" ";" : "⁏"
<shift compose> "(" ")": "⁐"
<compose> ("*" ":") : "⁑"
<compose> "%" "%" : "⁒"
<shift compose> "~" ["-" "~"] : "⁓"
<shift compose> "-" "~" : "⁓"
<sjift compose> ("_" "U") : "⁔"
<compose> ("x" "*") : "⁕"
<compose> "." ":" <space>  : "⁖"
<compose> ("4" ["'" "´"]) : "⁗"
<compose> "." ":" "." : "⁘"
<compose> ":" "." ":" : "⁙"
<compose> "|" "." "." : "⁚"
<shift compose> "." ":" "." : "⁛"
<compose> ("x" ":") : "⁜"
<compose> "|" ":" "." : "⁝"
<compose> "|" ":" ":" : "⁞"
<compose> <space> "m" : "\u205F" # medium mathematical space
<compose> <space> "w" : "\u2060" # word joiner
<shift compose> ("f" " ") : "\u2061" # function application
<shift compose> (["x" "×" "*"] " ") : "\u2062" # invisible times
<shift compose> (["," "."] " ") : "\u2063" # invisible separator
<shift compose> ("+" " ") : "\u2064" # invisible plus
<compose> <space> "i" "l" : "\u2066" # left-to-right isolate
<compose> <space> "i" "r" : "\u2067" # right-to-left isolate
<compose> <space> "i" "s" : "\u2068" # first strong isolate
<compose> <space> "i" "p" : "\u2069" # pop directional isolate
# U+206A through U+206C are deprecated

# Superscripts and Subscripts:
<dead letter ^> "0" : "⁰"
<shift compose> ["^" <dead letter "^">] "i" : "ⁱ"
<dead letter ^> "4" : "⁴"
<dead letter ^> "5" : "⁵"
<dead letter ^> "6" : "⁶"
<dead letter ^> "7" : "⁷"
<dead letter ^> "8" : "⁸"
<dead letter ^> "9" : "⁹"
<dead letter ^> "+" : "⁺"
<dead letter ^> "-" : "⁻"
<dead letter ^> "=" : "⁼"
<dead letter ^> "(" : "⁽"
<dead letter ^> ")" : "⁾"
<shift compose> ["^" <dead letter "^">] "n" : "ⁿ"
dead_ascii("ˇ")
<dead letter ˇ> "0" : "₀"
<dead letter ˇ> "1" : "₁"
<dead letter ˇ> "2" : "₂"
<dead letter ˇ> "3" : "₃"
<dead letter ˇ> "4" : "₄"
<dead letter ˇ> "5" : "₅"
<dead letter ˇ> "6" : "₆"
<dead letter ˇ> "7" : "₇"
<dead letter ˇ> "8" : "₈"
<dead letter ˇ> "9" : "₉"
<dead letter ˇ> "+" : "₊"
<dead letter ˇ> "-" : "₋"
<dead letter ˇ> "=" : "₌"
<dead letter ˇ> "(" : "₍"
<dead letter ˇ> ")" : "₎"
<shift compose> ["ˇ" <dead letter "ˇ">] "a" : "ₐ"
<shift compose> ["ˇ" <dead letter "ˇ">] "e" : "ₑ"
<shift compose> ["ˇ" <dead letter "ˇ">] "o" : "ₒ"
<shift compose> ["ˇ" <dead letter "ˇ">] "x" : "ₓ"
<shift compose> ["ˇ" <dead letter "ˇ">] "ə" : "ₔ"
<shift compose> ["ˇ" <dead letter "ˇ">] "h" : "ₕ"
<shift compose> ["ˇ" <dead letter "ˇ">] "k" : "ₖ"
<shift compose> ["ˇ" <dead letter "ˇ">] "l" : "ₗ"
<shift compose> ["ˇ" <dead letter "ˇ">] "m" : "ₘ"
<shift compose> ["ˇ" <dead letter "ˇ">] "n" : "ₙ"
<shift compose> ["ˇ" <dead letter "ˇ">] "p" : "ₚ"
<shift compose> ["ˇ" <dead letter "ˇ">] "s" : "ₛ"
<shift compose> ["ˇ" <dead letter "ˇ">] "t" : "ₜ"

# TODO Currency Symbols
# TODO Combining Diacritical Marks for Symbols
# TODO Letterlike Symbols
# TODO Number Forms
# TODO Arrows
# TODO Mathematical Operators
# TODO Miscellaneous Technical
# TODO Control Pictures
# TODO Optical Character Recognition

# Enclosed Alphanumerics:
for "1" to "9" as \1
  <compose> "(" "\1" ")"             : "\add(\u2460 \sub(\1 "1"))"
  <compose> "(" " " "\1" [" " .] ")" : "\add(\u2474 \sub(\1 "1"))"
  <compose> "(" "\1" " " ")"         : "\add(\u2474 \sub(\1 "1"))"
  <compose> "\1" "."                 : "\add(\u2488 \sub(\1 "1"))"
end for
for "0" to "9" as \1
  <compose> "(" "1" "\1" ")"             : "\add(\u2469 \sub(\1 "0"))"
  <compose> "(" " " "1" "\1" [" " .] ")" : "\add(\u247D \sub(\1 "0"))"
  <compose> "(" "1" "\1" " " ")"         : "\add(\u247D \sub(\1 "0"))"
  <compose> "1" "\1" "."                 : "\add(\u2491 \sub(\1 "0"))"
end for
<compose> "(" "2" "0" ")"             : "\u2473"
<compose> "(" " " "2" "0" [" " .] ")" : "\u2487"
<compose> "(" "2" "0" " " ")"         : "\u2473"
<compose> "2" "0" "."                 : "\u2498"
for "a" to "z" as \1
  <compose> "(" " " "\1" [" " .] ")" : "\add(\u249C \sub(\1 "a"))"
  <compose> "(" "\1" " " ")"         : "\add(\u249C \sub(\1 "a"))"
end for
for "A" to "Z" as \1
  <compose> "(" "\1" ")" : "\add(\u24B6 \sub(\1 "A"))"
end for
for "a" to "z" as \1
  <compose> "(" "\1" ")" : "\add(\u24D0 \sub(\1 "a"))"
end for
<compose> "(" "0" ")" : "\u24EA"
for "1" to "9" as \1
  <compose> "(" "(" "(" "1" "\1" ")" ")" ")" : "\add(\u24EB \sub(\1 "1"))"
end for
<compose> "(" "(" "(" "2" "0" ")" ")" ")" : "\u24F4"
for "1" to "9" as \1
  <compose> "(" "(" "\1" ")" ")" : "\add(\u24F5 \sub(\1 "1"))"
end for
<compose> "(" "(" "1" "0" ")" ")" : "\u24FE"
<compose> "(" "(" "(" "0" ")" ")" ")" : "\u24FF"

# Box Drawing:
<compose> ("╴" "╶") : "─"
<compose> ("╸" "╺") : "━"
<shift compose> "b" "-" : "─"
<shift compose> "B" "-" : "━"
<shift compose> "b" "|" : "│"
<shift compose> "B" "|" : "┃"
<shift compose> "b" "." "-" : "┄"
<shift compose> "B" "." "-" : "┅"
<compose> "┄" "┄" : "┅"
<shift compose> "b" "." "|" : "┆"
<shift compose> "B" "." "|" : "┇"
<compose> "┆" "┆" : "┇"
<shift compose> "b" ":" "-" : "┈"
<shift compose> "B" ":" "-" : "┉"
<compose> "┈" "┈" : "┉"
<shift compose> "b" ":" "|" : "┊"
<shift compose> "B" ":" "|" : "┋"
<compose> "┊" "┊" : "┋"
macro boxes/2
  let \3 : {
    3 48 12 192      999 999 999 999  999 999 999 999  10 40 130 160
    9 24 129 144     6 36 66 96       5 20 65 80       14 44 74 132
    194 104 164 224  13 28 73 133     193 88 146 208   11 26 41 56
    131 146 161 176  7 22 37 52       67 82 97 112     15 30 45 60
    75 135 195 90    105 150 165 120  180 210 225 240  999 999 999 999
    999 999 999 999  999 999 999 999  999 999 999 999  999 999 999 999
    999 999 999 999  999 999 999 999  999 999 999 999  999 999 999 999
    999 999 999 999  1 4 2 8          16 64 32 128     33 132 18 40
  }
  let \4 : \get(\3 \1)
  let \5 : \get(\3 \2)
  if \or(\equals(\4 999) \equals(\5 999))
    return
  endif
  let \6 : { \and(\4 16) \and(\4 32) \and(\4 64) \and(\4 128) }
  let \7 : { \and(\5 16) \and(\5 32) \and(\5 64) \and(\5 128) }
  let \4 : { \and(\4 1) \and(\4 2) \and(\4 4) \and(\4 8) }
  let \5 : { \and(\5 1) \and(\5 2) \and(\5 4) \and(\5 8) }
  for 0 to 3 as \8
    \set(\4 \8 \add(\rsh(\get(\4 \8) \8) \mul(2 \rsh(\get(\6 \8)))))
    \set(\5 \8 \add(\rsh(\get(\5 \8) \8) \mul(2 \rsh(\get(\7 \8)))))
    \set(\4 \8 \add(\get(\4 \8) \get(\4 \8)))
    if \greater(\get(\4 \8), 2)
      \set(\4, \8, 2)
    endif
  end for
  for 0 to 127 as \5
    let \6 : \get(\3 \5)
    if \equals(\4 999)
      continue
    endif
    let \7 : { \and(\6 16) \and(\6 32) \and(\6 64) \and(\6 128) }
    let \6 : { \and(\6 1) \and(\6 2) \and(\6 4) \and(\6 8) }
    for 0 to 3 as \8
      \set(\6 \8 \add(\rsh(\get(\6 \8) \8) \mul(2 \rsh(\get(\7 \8)))))
    end for
    if \equals(\get(\6 0) \get(\4 0))
      if \equals(\get(\6 1) \get(\4 1))
        if \equals(\get(\6 2) \get(\4 2))
          if \equals(\get(\6 3) \get(\4 3))
            <compose> ("\add(\u2500 \1)" "\add(\u2500 \2)") : "\add(\u2500 \5)"
          end if
        end if
      end if
    end if
  end for
end macro
for 0 to 127 as \1
  for \1 to 127 as \2
    boxes(\1 \2)
  end for
end for
<shift compose> "b" "+" : "┼"
<shift compose> "B" "+" : "╋"
<compose> (["-" "─"] ["|" "│"]) : "┼"
<shift compose> "b" "." "." : "╌"
<shift compose> "B" "." "." : "╍"
<compose> "╌" "╌" : "╍"
<shift compose> "b" "¦" : "╎"
<shift compose> "b" "." ":" : "╎"
<shift compose> "B" "¦" : "╏"
<shift compose> "B" "." ":" : "╏"
<compose> "╎" "╎" : "╏"
<shift compose> "b" "=" "-" : "═"
<compose> ("=" "─") : "═"
<shift compose> "b" "=" "|" : "║"
<compose> ("=" "│") : "║"
<compose> ("+" "┍") : "╒"
<compose> ("+" "┎") : "╓"
<compose> ("+" ["┌" "┏"]) : "╔"
<compose> ("+" "┑") : "╕"
<compose> ("+" "┒") : "╖"
<compose> ("+" ["┐" "┓"]) : "╗"
<compose> ("+" "┕") : "╘"
<compose> ("+" "┖") : "╙"
<compose> ("+" ["└" "┗"]) : "╚"
<compose> ("+" "┙") : "╛"
<compose> ("+" "┚") : "╜"
<compose> ("+" ["┘" "┛"]) : "╝"
<compose> ("+" "┝") : "╞"
<compose> ("+" "┠") : "╟"
<compose> ("+" ["├" "┣"]) : "╠"
<compose> ("+" "┥") : "╡"
<compose> ("+" "┨") : "╢"
<compose> ("+" ["┤" "┫"]) : "╣"
<compose> ("+" "┯") : "╤"
<compose> ("+" "┰") : "╥"
<compose> ("+" ["┬" "┳"]) : "╦"
<compose> ("+" "┷") : "╧"
<compose> ("+" "┸") : "╨"
<compose> ("+" ["┴" "┻"]) : "╩"
<compose> ("+" "┿") : "╪"
<compose> ("+" "╂") : "╫"
<compose> ("+" ["┼" "╋"]) : "╬"
<shift compose> "b" "=" "+" : "╬"
<compose> ("=" "┼") : "╬"
<compose> (["o" "O"] "┌") : "╭"
<compose> (["o" "O"] "┐") : "╮"
<compose> (["o" "O"] "┘") : "╯"
<compose> (["o" "O"] "└") : "╰"
<shift compose> "b" "/" : "╱"
<shift compose> "b" "\" : "╲"
<compose> ("╱" "╲") : "╳"
<shift compose> "b" "X" : "╳"
<shift compose> "b" ["<" "←"] : "╴"
<shift compose> "b" [<dead letter ^> "^" "↑"] : "╵"
<shift compose> "b" [">" "→"] : "╶"
<shift compose> "b" ["v" "," "↓"] : "╷"
<shift compose> "B" ["<" "←"] : "╸"
<shift compose> "B" [<dead letter ^> "^" "↑"] : "╹"
<shift compose> "B" [">" "→"] : "╺"
<shift compose> "B" ["v" "," "↓"] : "╻"

# Block Elements:
<shift compose> "B" <compose> : <dead letter █>
dead_ascii("█")
<dead letter █> "|" : <dead letter ▀>
dead_ascii("▀")
<dead letter ▀> "0" : "▀"
<dead letter ▀> "1" : "▁"
<dead letter ▀> "2" : "▂"
<dead letter ▀> "3" : "▃"
<dead letter ▀> "4" : "▄"
<dead letter ▀> "5" : "▅"
<dead letter ▀> "6" : "▆"
<dead letter ▀> "7" : "▇"
<dead letter █> "-" : <dead letter ▐>
dead_ascii("▐")
<dead letter ▐> "7" : "▉"
<dead letter ▐> "6" : "▊"
<dead letter ▐> "5" : "▋"
<dead letter ▐> "4" : "▌"
<dead letter ▐> "3" : "▍"
<dead letter ▐> "2" : "▎"
<dead letter ▐> "1" : "▏"
<dead letter ▐> "0" : "▐"
<dead letter █> "1" : "░"
<dead letter █> "2" : "▒"
<dead letter █> "3" : "▓"
<dead letter ▀> "-" : "▔"
<dead letter ▐> "|" : "▕"
<dead letter █> "," : "▖"
<dead letter █> "." : "▗"
<dead letter █> ";" : "▘"
<dead letter █> "▝" : "▙"
<compose> "▗" "▘" : "▚"
<dead letter █> "▗" : "▛"
<dead letter █> "▖" : "▜"
<dead letter █> ":" : "▝"
<compose> "▖" "▝" : "▞"
<dead letter █> "▘" : "▟"

# TODO Geometric Shapes
# TODO Miscellaneous Symbols
# TODO Dingbats
# TODO Miscellaneous Mathematical Symbols-A
# TODO Supplemental Arrows-A

# Braille Patterns:
function braille/1
  \or(\lsh(1 \sub("\1" "0")) "\u2800")
end function
macro braille_double/1
  let \2 : "\u2800"
  if \and(\1 1) = 1
    let \2 : \or(\2 8)
  endif
  if \and(\1 2) = 2
    let \2 : \or(\2 16)
  endif
  if \and(\1 4) = 4
    let \2 : \or(\2 32)
  endif
  if \and(\1 8) = 8
    let \2 : \or(\2 1)
  endif
  if \and(\1 16) = 16
    let \2 : \or(\2 2)
  endif
  if \and(\1 32) = 32
    let \2 : \or(\2 4)
  endif
  if \and(\1 64) = 64
    let \2 : \or(\2 128)
  endif
  if \and(\1 128) = 128
    let \2 : \or(\2 64)
  endif
  <compose> "\1" "\1" : "\or(\1 \2)"
end macro
<shift compose> "b" <space> : "\u2800"
for "1" to "8" as \1
  <shift compose> "b" "\1" : "\braille(\1)"
  for \add(\1 1) to "8" as \2
    <shift compose> "B" ("\1" "\2") : "\or(\braille(\1) \braille(\2))"
  end for
end for
for "\u2800" to "\u28FF" as \1
  braille_double(\1)
  for \add(\1 1) to "\u28FF" as \2
    <compose> ("\1" "\2") : "\or(\1 \2)"
  end for
end for

# TODO Supplemental Arrows-B
# TODO Miscellaneous Mathematical Symbols-B
# TODO Supplemental Mathematical Operators
# TODO Miscellaneous Symbols and Arrows
# TODO Glagolitic
# TODO Latin Extended-C
# TODO Coptic
# TODO Georgian Supplement
# TODO Tifinagh
# TODO Ethiopic Extended
# TODO Cyrillic Extended-A
# TODO Supplemental Punctuation
# TODO CJK Radicals Supplement
# TODO Kangxi Radicals
# TODO Ideographic Description Characters
# TODO CJK Symbols and Punctuation
# TODO Hiragana
# TODO Katakana
# TODO Bopomofo
# TODO Hangul Compatibility Jamo
# TODO Kanbun
# TODO Bopomofo Extended
# TODO CJK Strokes
# TODO Katakana Phonetic Extensions
# TODO Enclosed CJK Letters and Months
# TODO CJK Compatibility
# TODO CJK Unified Ideographs Extension A
# TODO Yijing Hexagram Symbols
# TODO CJK Unified Ideographs
# TODO Yi Syllables
# TODO Yi Radicals
# TODO Lisu
# TODO Vai
# TODO Cyrillic Extended-B
# TODO Bamum
# TODO Modifier Tone Letters
# TODO Latin Extended-D
# TODO Syloti Nagri
# TODO Common Indic Number Forms
# TODO Phags-pa
# TODO Saurashtra
# TODO Devanagari Extended
# TODO Kayah Li
# TODO Rejang
# TODO Hangul Jamo Extended-A
# TODO Javanese
# TODO Myanmar Extended-B
# TODO Cham
# TODO Myanmar Extended-A
# TODO Tai Viet
# TODO Meetei Mayek Extensions
# TODO Ethiopic Extended-A
# TODO Latin Extended-E
# TODO Meetei Mayek
# TODO Hangul Syllables
# TODO Hangul Jamo Extended-B
# TODO CJK Compatibility Ideographs
# TODO Alphabetic Presentation Forms
# TODO Arabic Presentation Forms-A
# TODO Variation Selectors
# TODO Vertical Forms
# TODO Combining Half Marks
# TODO CJK Compatibility Forms
# TODO Small Form Variants
# TODO Arabic Presentation Forms-B
# TODO Halfwidth and Fullwidth Forms
# TODO Specials
# TODO Linear B Syllabary
# TODO Linear B Ideograms
# TODO Aegean Numbers
# TODO Ancient Greek Numbers
# TODO Ancient Symbols
# TODO Phaistos Disc
# TODO Lycian
# TODO Carian
# TODO Coptic Epact Numbers
# TODO Old Italic
# TODO Gothic
# TODO Old Permic
# TODO Ugaritic
# TODO Old Persian
# TODO Deseret
# TODO Shavian
# TODO Osmanya
# TODO Elbasan
# TODO Caucasian Albanian
# TODO Linear A
# TODO Cypriot Syllabary
# TODO Imperial Aramaic
# TODO Palmyrene
# TODO Nabataean
# TODO Phoenician
# TODO Lydian
# TODO Meroitic Hieroglyphs
# TODO Meroitic Cursive
# TODO Kharoshthi
# TODO Old South Arabian
# TODO Old North Arabian
# TODO Manichaean
# TODO Avestan
# TODO Inscriptional Parthian
# TODO Psalter Pahlavi
# TODO Old Turkic
# TODO Rumi Numeral Symbols
# TODO Brahmi
# TODO Kaithi
# TODO Sora Sompeng
# TODO Chakma
# TODO Mahajani
# TODO Sharada
# TODO Sinhala Archaic Numbers
# TODO Khojki
# TODO Khudawadi
# TODO Grantha
# TODO Tirhuta
# TODO Siddham
# TODO Modi
# TODO Takri
# TODO Warang Citi
# TODO Pau Cin Hau
# TODO Cuneiform
# TODO Cuneiform Numbers and Punctuation
# TODO Egyptian Hieroglyphs
# TODO Bamum Supplement
# TODO Mro
# TODO Bassa Vah
# TODO Pahawh Hmong
# TODO Miao
# TODO Kana Supplement
# TODO Duployan
# TODO Shorthand Format Controls
# TODO Byzantine Musical Symbols
# TODO Musical Symbols
# TODO Ancient Greek Musical Notation
# TODO Tai Xuan Jing Symbols
# TODO Counting Rod Numerals
# TODO Mathematical Alphanumeric Symbols
# TODO Mende Kikakui
# TODO Arabic Mathematical Alphabetic Symbols
# TODO Mahjong Tiles
# TODO Domino Tiles
# TODO Playing Cards

# Enclosed Alphanumeric Supplement:
<compose> "0" "." : "\u1F100"
for "0" to "9" as \1
  <compose> "\1" "," : "\add(\u1F101 \sub(\1 "0")"
end for
<compose> "(" "0" "." ")" : "\u1F10B"
<compose> "(" "(" "(" "0" "." ")" ")" ")" : "\u1F10C"
for "A" to "Z" as \1
  <compose> "(" " " "\1" [" " .] ")" : "\add(\u1F110 \sub(\1 "A"))"
  <compose> "(" "\1" " " ")"         : "\add(\u1F110 \sub(\1 "A"))"
end for
<compose> "[" " " "S" [" " .] "]" : "\u1F12A"
<compose> "[" "S" " " "]"         : "\u1F12A"
<compose> "(" "/" "C" ["/" .] ")" : "\u1F12B"
<compose> "(" "C" "/" ")"         : "\u1F12B"
<compose> "(" "/" "R" ["/" .] ")" : "\u1F12C"
<compose> "(" "R" "/" ")"         : "\u1F12C"
<compose> "(" "C" "D" ")"         : "\u1F12D"
<compose> "(" "W" "z" ")"         : "\u1F12E"
for "A" to "Z" as \1
  <compose> "[" "\1" "]"                 : "\add(\u1F130 \sub(\1 "A"))"
  <compose> "(" "(" "(" "\1" ")" ")" ")" : "\add(\u1F160 \sub(\1 "A"))"
  <compose> "[" "[" "[" "\1" "]" "]" "]" : "\add(\u1F170 \sub(\1 "A"))"
end for
<compose> "[" "H" "V" "]" : "\u1F14A"
<compose> "[" "M" "V" "]" : "\u1F14B"
<compose> "[" "S" "D" "]" : "\u1F14C"
<compose> "[" "S" "S" "]" : "\u1F14D"
<compose> "[" "P" "P" "V" "]" : "\u1F14E"
<compose> "[" "W" "C" "]" : "\u1F14F"
<compose> "(" "M" "C" ")" : "\u1F16A"
<compose> "(" "M" "D" ")" : "\u1F16B"
<compose> "[" "[" "[" "X" "P" "]" "]" "]" : "\u1F18A"
<compose> "[" "[" "[" "I" "C" "]" "]" "]" : "\u1F18B"
<compose> "[" "[" "[" "P" "A" "]" "]" "]" : "\u1F18C"
<compose> "[" "[" "[" "S" "A" "]" "]" "]" : "\u1F18D"
<compose> "[" "[" "[" "A" "B" "]" "]" "]" : "\u1F18E"
<compose> "[" "[" "[" "W" "C" "]" "]" "]" : "\u1F18F"
<compose> "[" "D" "J" "]" : "\u1F190"
<compose> "[" "C" "L" "]" : "\u1F191"
<compose> "[" "C" "O" "O" "L" "]" : "\u1F192"
<compose> "[" "F" "R" "E" "E" "]" : "\u1F193"
<compose> "[" "I" "D" "]" : "\u1F194"
<compose> "[" "N" "E" "W" "]" : "\u1F195"
<compose> "[" "N" "G" "]" : "\u1F196"
<compose> "[" "O" "K" "]" : "\u1F197"
<compose> "[" "S" "O" "S" "]" : "\u1F198"
<compose> "[" "U" "P" "]" : "\u1F199
<compose> "[" "U" "P" "!" "]" : "\u1F199
<compose> "[" "V" "S" "]" : "\u1F19A
for "a" to "z" as \1
  <compose> "[" "r" "\1" "]" : "\add(\u1F1E6 \sub(\1 "a"))"
end for

# TODO Enclosed Ideographic Supplement
# TODO Miscellaneous Symbols and Pictographs
# TODO Emoticons
# TODO Ornamental Dingbats
# TODO Transport and Map Symbols
# TODO Alchemical Symbols
# TODO Geometric Shapes Extended
# TODO Supplemental Arrows-C
# TODO CJK Unified Ideographs Extension B
# TODO CJK Unified Ideographs Extension C
# TODO CJK Unified Ideographs Extension D
# TODO CJK Compatibility Ideographs Supplement

# Tags: These are deprecated

# TODO Variation Selectors Supplement