mirror.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. # This file is part of python-bidi
  2. #
  3. # python-bidi is free software: you can redistribute it and/or modify
  4. # it under the terms of the GNU Lesser General Public License as published by
  5. # the Free Software Foundation, either version 3 of the License, or
  6. # (at your option) any later version.
  7. #
  8. # This program is distributed in the hope that it will be useful,
  9. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. # GNU Lesser General Public License for more details.
  12. #
  13. # You should have received a copy of the GNU Lesser General Public License
  14. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. # Copyright (C) 2008-2010 Yaacov Zamir <kzamir_a_walla.co.il>,
  16. # Copyright (C) 2010-2015 Meir kriheli <mkriheli@gmail.com>.
  17. """Mirrored chars"""
  18. # Can't seem to get this data from python's unicode data, so this is imported
  19. # from http://www.unicode.org/Public/UNIDATA/BidiMirroring.txt
  20. MIRRORED = {
  21. "\u0028": "\u0029", # LEFT PARENTHESIS
  22. "\u0029": "\u0028", # RIGHT PARENTHESIS
  23. "\u003C": "\u003E", # LESS-THAN SIGN
  24. "\u003E": "\u003C", # GREATER-THAN SIGN
  25. "\u005B": "\u005D", # LEFT SQUARE BRACKET
  26. "\u005D": "\u005B", # RIGHT SQUARE BRACKET
  27. "\u007B": "\u007D", # LEFT CURLY BRACKET
  28. "\u007D": "\u007B", # RIGHT CURLY BRACKET
  29. "\u00AB": "\u00BB", # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
  30. "\u00BB": "\u00AB", # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
  31. "\u0F3A": "\u0F3B", # TIBETAN MARK GUG RTAGS GYON
  32. "\u0F3B": "\u0F3A", # TIBETAN MARK GUG RTAGS GYAS
  33. "\u0F3C": "\u0F3D", # TIBETAN MARK ANG KHANG GYON
  34. "\u0F3D": "\u0F3C", # TIBETAN MARK ANG KHANG GYAS
  35. "\u169B": "\u169C", # OGHAM FEATHER MARK
  36. "\u169C": "\u169B", # OGHAM REVERSED FEATHER MARK
  37. "\u2039": "\u203A", # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
  38. "\u203A": "\u2039", # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
  39. "\u2045": "\u2046", # LEFT SQUARE BRACKET WITH QUILL
  40. "\u2046": "\u2045", # RIGHT SQUARE BRACKET WITH QUILL
  41. "\u207D": "\u207E", # SUPERSCRIPT LEFT PARENTHESIS
  42. "\u207E": "\u207D", # SUPERSCRIPT RIGHT PARENTHESIS
  43. "\u208D": "\u208E", # SUBSCRIPT LEFT PARENTHESIS
  44. "\u208E": "\u208D", # SUBSCRIPT RIGHT PARENTHESIS
  45. "\u2208": "\u220B", # ELEMENT OF
  46. "\u2209": "\u220C", # NOT AN ELEMENT OF
  47. "\u220A": "\u220D", # SMALL ELEMENT OF
  48. "\u220B": "\u2208", # CONTAINS AS MEMBER
  49. "\u220C": "\u2209", # DOES NOT CONTAIN AS MEMBER
  50. "\u220D": "\u220A", # SMALL CONTAINS AS MEMBER
  51. "\u2215": "\u29F5", # DIVISION SLASH
  52. "\u223C": "\u223D", # TILDE OPERATOR
  53. "\u223D": "\u223C", # REVERSED TILDE
  54. "\u2243": "\u22CD", # ASYMPTOTICALLY EQUAL TO
  55. "\u2252": "\u2253", # APPROXIMATELY EQUAL TO OR THE IMAGE OF
  56. "\u2253": "\u2252", # IMAGE OF OR APPROXIMATELY EQUAL TO
  57. "\u2254": "\u2255", # COLON EQUALS
  58. "\u2255": "\u2254", # EQUALS COLON
  59. "\u2264": "\u2265", # LESS-THAN OR EQUAL TO
  60. "\u2265": "\u2264", # GREATER-THAN OR EQUAL TO
  61. "\u2266": "\u2267", # LESS-THAN OVER EQUAL TO
  62. "\u2267": "\u2266", # GREATER-THAN OVER EQUAL TO
  63. "\u2268": "\u2269", # [BEST FIT] LESS-THAN BUT NOT EQUAL TO
  64. "\u2269": "\u2268", # [BEST FIT] GREATER-THAN BUT NOT EQUAL TO
  65. "\u226A": "\u226B", # MUCH LESS-THAN
  66. "\u226B": "\u226A", # MUCH GREATER-THAN
  67. "\u226E": "\u226F", # [BEST FIT] NOT LESS-THAN
  68. "\u226F": "\u226E", # [BEST FIT] NOT GREATER-THAN
  69. "\u2270": "\u2271", # [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO
  70. "\u2271": "\u2270", # [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO
  71. "\u2272": "\u2273", # [BEST FIT] LESS-THAN OR EQUIVALENT TO
  72. "\u2273": "\u2272", # [BEST FIT] GREATER-THAN OR EQUIVALENT TO
  73. "\u2274": "\u2275", # [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO
  74. "\u2275": "\u2274", # [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO
  75. "\u2276": "\u2277", # LESS-THAN OR GREATER-THAN
  76. "\u2277": "\u2276", # GREATER-THAN OR LESS-THAN
  77. "\u2278": "\u2279", # [BEST FIT] NEITHER LESS-THAN NOR GREATER-THAN
  78. "\u2279": "\u2278", # [BEST FIT] NEITHER GREATER-THAN NOR LESS-THAN
  79. "\u227A": "\u227B", # PRECEDES
  80. "\u227B": "\u227A", # SUCCEEDS
  81. "\u227C": "\u227D", # PRECEDES OR EQUAL TO
  82. "\u227D": "\u227C", # SUCCEEDS OR EQUAL TO
  83. "\u227E": "\u227F", # [BEST FIT] PRECEDES OR EQUIVALENT TO
  84. "\u227F": "\u227E", # [BEST FIT] SUCCEEDS OR EQUIVALENT TO
  85. "\u2280": "\u2281", # [BEST FIT] DOES NOT PRECEDE
  86. "\u2281": "\u2280", # [BEST FIT] DOES NOT SUCCEED
  87. "\u2282": "\u2283", # SUBSET OF
  88. "\u2283": "\u2282", # SUPERSET OF
  89. "\u2284": "\u2285", # [BEST FIT] NOT A SUBSET OF
  90. "\u2285": "\u2284", # [BEST FIT] NOT A SUPERSET OF
  91. "\u2286": "\u2287", # SUBSET OF OR EQUAL TO
  92. "\u2287": "\u2286", # SUPERSET OF OR EQUAL TO
  93. "\u2288": "\u2289", # [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO
  94. "\u2289": "\u2288", # [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO
  95. "\u228A": "\u228B", # [BEST FIT] SUBSET OF WITH NOT EQUAL TO
  96. "\u228B": "\u228A", # [BEST FIT] SUPERSET OF WITH NOT EQUAL TO
  97. "\u228F": "\u2290", # SQUARE IMAGE OF
  98. "\u2290": "\u228F", # SQUARE ORIGINAL OF
  99. "\u2291": "\u2292", # SQUARE IMAGE OF OR EQUAL TO
  100. "\u2292": "\u2291", # SQUARE ORIGINAL OF OR EQUAL TO
  101. "\u2298": "\u29B8", # CIRCLED DIVISION SLASH
  102. "\u22A2": "\u22A3", # RIGHT TACK
  103. "\u22A3": "\u22A2", # LEFT TACK
  104. "\u22A6": "\u2ADE", # ASSERTION
  105. "\u22A8": "\u2AE4", # TRUE
  106. "\u22A9": "\u2AE3", # FORCES
  107. "\u22AB": "\u2AE5", # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
  108. "\u22B0": "\u22B1", # PRECEDES UNDER RELATION
  109. "\u22B1": "\u22B0", # SUCCEEDS UNDER RELATION
  110. "\u22B2": "\u22B3", # NORMAL SUBGROUP OF
  111. "\u22B3": "\u22B2", # CONTAINS AS NORMAL SUBGROUP
  112. "\u22B4": "\u22B5", # NORMAL SUBGROUP OF OR EQUAL TO
  113. "\u22B5": "\u22B4", # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
  114. "\u22B6": "\u22B7", # ORIGINAL OF
  115. "\u22B7": "\u22B6", # IMAGE OF
  116. "\u22C9": "\u22CA", # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
  117. "\u22CA": "\u22C9", # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
  118. "\u22CB": "\u22CC", # LEFT SEMIDIRECT PRODUCT
  119. "\u22CC": "\u22CB", # RIGHT SEMIDIRECT PRODUCT
  120. "\u22CD": "\u2243", # REVERSED TILDE EQUALS
  121. "\u22D0": "\u22D1", # DOUBLE SUBSET
  122. "\u22D1": "\u22D0", # DOUBLE SUPERSET
  123. "\u22D6": "\u22D7", # LESS-THAN WITH DOT
  124. "\u22D7": "\u22D6", # GREATER-THAN WITH DOT
  125. "\u22D8": "\u22D9", # VERY MUCH LESS-THAN
  126. "\u22D9": "\u22D8", # VERY MUCH GREATER-THAN
  127. "\u22DA": "\u22DB", # LESS-THAN EQUAL TO OR GREATER-THAN
  128. "\u22DB": "\u22DA", # GREATER-THAN EQUAL TO OR LESS-THAN
  129. "\u22DC": "\u22DD", # EQUAL TO OR LESS-THAN
  130. "\u22DD": "\u22DC", # EQUAL TO OR GREATER-THAN
  131. "\u22DE": "\u22DF", # EQUAL TO OR PRECEDES
  132. "\u22DF": "\u22DE", # EQUAL TO OR SUCCEEDS
  133. "\u22E0": "\u22E1", # [BEST FIT] DOES NOT PRECEDE OR EQUAL
  134. "\u22E1": "\u22E0", # [BEST FIT] DOES NOT SUCCEED OR EQUAL
  135. "\u22E2": "\u22E3", # [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO
  136. "\u22E3": "\u22E2", # [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO
  137. "\u22E4": "\u22E5", # [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO
  138. "\u22E5": "\u22E4", # [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO
  139. "\u22E6": "\u22E7", # [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO
  140. "\u22E7": "\u22E6", # [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO
  141. "\u22E8": "\u22E9", # [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO
  142. "\u22E9": "\u22E8", # [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO
  143. "\u22EA": "\u22EB", # [BEST FIT] NOT NORMAL SUBGROUP OF
  144. "\u22EB": "\u22EA", # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP
  145. "\u22EC": "\u22ED", # [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO
  146. # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
  147. "\u22ED": "\u22EC",
  148. "\u22F0": "\u22F1", # UP RIGHT DIAGONAL ELLIPSIS
  149. "\u22F1": "\u22F0", # DOWN RIGHT DIAGONAL ELLIPSIS
  150. "\u22F2": "\u22FA", # ELEMENT OF WITH LONG HORIZONTAL STROKE
  151. "\u22F3": "\u22FB", # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
  152. "\u22F4": "\u22FC", # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
  153. "\u22F6": "\u22FD", # ELEMENT OF WITH OVERBAR
  154. "\u22F7": "\u22FE", # SMALL ELEMENT OF WITH OVERBAR
  155. "\u22FA": "\u22F2", # CONTAINS WITH LONG HORIZONTAL STROKE
  156. "\u22FB": "\u22F3", # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
  157. "\u22FC": "\u22F4", # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
  158. "\u22FD": "\u22F6", # CONTAINS WITH OVERBAR
  159. "\u22FE": "\u22F7", # SMALL CONTAINS WITH OVERBAR
  160. "\u2308": "\u2309", # LEFT CEILING
  161. "\u2309": "\u2308", # RIGHT CEILING
  162. "\u230A": "\u230B", # LEFT FLOOR
  163. "\u230B": "\u230A", # RIGHT FLOOR
  164. "\u2329": "\u232A", # LEFT-POINTING ANGLE BRACKET
  165. "\u232A": "\u2329", # RIGHT-POINTING ANGLE BRACKET
  166. "\u2768": "\u2769", # MEDIUM LEFT PARENTHESIS ORNAMENT
  167. "\u2769": "\u2768", # MEDIUM RIGHT PARENTHESIS ORNAMENT
  168. "\u276A": "\u276B", # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
  169. "\u276B": "\u276A", # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
  170. "\u276C": "\u276D", # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
  171. "\u276D": "\u276C", # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
  172. "\u276E": "\u276F", # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
  173. "\u276F": "\u276E", # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
  174. "\u2770": "\u2771", # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
  175. "\u2771": "\u2770", # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
  176. "\u2772": "\u2773", # LIGHT LEFT TORTOISE SHELL BRACKET
  177. "\u2773": "\u2772", # LIGHT RIGHT TORTOISE SHELL BRACKET
  178. "\u2774": "\u2775", # MEDIUM LEFT CURLY BRACKET ORNAMENT
  179. "\u2775": "\u2774", # MEDIUM RIGHT CURLY BRACKET ORNAMENT
  180. "\u27C3": "\u27C4", # OPEN SUBSET
  181. "\u27C4": "\u27C3", # OPEN SUPERSET
  182. "\u27C5": "\u27C6", # LEFT S-SHAPED BAG DELIMITER
  183. "\u27C6": "\u27C5", # RIGHT S-SHAPED BAG DELIMITER
  184. "\u27C8": "\u27C9", # REVERSE SOLIDUS PRECEDING SUBSET
  185. "\u27C9": "\u27C8", # SUPERSET PRECEDING SOLIDUS
  186. "\u27D5": "\u27D6", # LEFT OUTER JOIN
  187. "\u27D6": "\u27D5", # RIGHT OUTER JOIN
  188. "\u27DD": "\u27DE", # LONG RIGHT TACK
  189. "\u27DE": "\u27DD", # LONG LEFT TACK
  190. "\u27E2": "\u27E3", # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
  191. "\u27E3": "\u27E2", # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
  192. "\u27E4": "\u27E5", # WHITE SQUARE WITH LEFTWARDS TICK
  193. "\u27E5": "\u27E4", # WHITE SQUARE WITH RIGHTWARDS TICK
  194. "\u27E6": "\u27E7", # MATHEMATICAL LEFT WHITE SQUARE BRACKET
  195. "\u27E7": "\u27E6", # MATHEMATICAL RIGHT WHITE SQUARE BRACKET
  196. "\u27E8": "\u27E9", # MATHEMATICAL LEFT ANGLE BRACKET
  197. "\u27E9": "\u27E8", # MATHEMATICAL RIGHT ANGLE BRACKET
  198. "\u27EA": "\u27EB", # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
  199. "\u27EB": "\u27EA", # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
  200. "\u27EC": "\u27ED", # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
  201. "\u27ED": "\u27EC", # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
  202. "\u27EE": "\u27EF", # MATHEMATICAL LEFT FLATTENED PARENTHESIS
  203. "\u27EF": "\u27EE", # MATHEMATICAL RIGHT FLATTENED PARENTHESIS
  204. "\u2983": "\u2984", # LEFT WHITE CURLY BRACKET
  205. "\u2984": "\u2983", # RIGHT WHITE CURLY BRACKET
  206. "\u2985": "\u2986", # LEFT WHITE PARENTHESIS
  207. "\u2986": "\u2985", # RIGHT WHITE PARENTHESIS
  208. "\u2987": "\u2988", # Z NOTATION LEFT IMAGE BRACKET
  209. "\u2988": "\u2987", # Z NOTATION RIGHT IMAGE BRACKET
  210. "\u2989": "\u298A", # Z NOTATION LEFT BINDING BRACKET
  211. "\u298A": "\u2989", # Z NOTATION RIGHT BINDING BRACKET
  212. "\u298B": "\u298C", # LEFT SQUARE BRACKET WITH UNDERBAR
  213. "\u298C": "\u298B", # RIGHT SQUARE BRACKET WITH UNDERBAR
  214. "\u298D": "\u2990", # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
  215. "\u298E": "\u298F", # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
  216. "\u298F": "\u298E", # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
  217. "\u2990": "\u298D", # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
  218. "\u2991": "\u2992", # LEFT ANGLE BRACKET WITH DOT
  219. "\u2992": "\u2991", # RIGHT ANGLE BRACKET WITH DOT
  220. "\u2993": "\u2994", # LEFT ARC LESS-THAN BRACKET
  221. "\u2994": "\u2993", # RIGHT ARC GREATER-THAN BRACKET
  222. "\u2995": "\u2996", # DOUBLE LEFT ARC GREATER-THAN BRACKET
  223. "\u2996": "\u2995", # DOUBLE RIGHT ARC LESS-THAN BRACKET
  224. "\u2997": "\u2998", # LEFT BLACK TORTOISE SHELL BRACKET
  225. "\u2998": "\u2997", # RIGHT BLACK TORTOISE SHELL BRACKET
  226. "\u29B8": "\u2298", # CIRCLED REVERSE SOLIDUS
  227. "\u29C0": "\u29C1", # CIRCLED LESS-THAN
  228. "\u29C1": "\u29C0", # CIRCLED GREATER-THAN
  229. "\u29C4": "\u29C5", # SQUARED RISING DIAGONAL SLASH
  230. "\u29C5": "\u29C4", # SQUARED FALLING DIAGONAL SLASH
  231. "\u29CF": "\u29D0", # LEFT TRIANGLE BESIDE VERTICAL BAR
  232. "\u29D0": "\u29CF", # VERTICAL BAR BESIDE RIGHT TRIANGLE
  233. "\u29D1": "\u29D2", # BOWTIE WITH LEFT HALF BLACK
  234. "\u29D2": "\u29D1", # BOWTIE WITH RIGHT HALF BLACK
  235. "\u29D4": "\u29D5", # TIMES WITH LEFT HALF BLACK
  236. "\u29D5": "\u29D4", # TIMES WITH RIGHT HALF BLACK
  237. "\u29D8": "\u29D9", # LEFT WIGGLY FENCE
  238. "\u29D9": "\u29D8", # RIGHT WIGGLY FENCE
  239. "\u29DA": "\u29DB", # LEFT DOUBLE WIGGLY FENCE
  240. "\u29DB": "\u29DA", # RIGHT DOUBLE WIGGLY FENCE
  241. "\u29F5": "\u2215", # REVERSE SOLIDUS OPERATOR
  242. "\u29F8": "\u29F9", # BIG SOLIDUS
  243. "\u29F9": "\u29F8", # BIG REVERSE SOLIDUS
  244. "\u29FC": "\u29FD", # LEFT-POINTING CURVED ANGLE BRACKET
  245. "\u29FD": "\u29FC", # RIGHT-POINTING CURVED ANGLE BRACKET
  246. "\u2A2B": "\u2A2C", # MINUS SIGN WITH FALLING DOTS
  247. "\u2A2C": "\u2A2B", # MINUS SIGN WITH RISING DOTS
  248. "\u2A2D": "\u2A2E", # PLUS SIGN IN LEFT HALF CIRCLE
  249. "\u2A2E": "\u2A2D", # PLUS SIGN IN RIGHT HALF CIRCLE
  250. "\u2A34": "\u2A35", # MULTIPLICATION SIGN IN LEFT HALF CIRCLE
  251. "\u2A35": "\u2A34", # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
  252. "\u2A3C": "\u2A3D", # INTERIOR PRODUCT
  253. "\u2A3D": "\u2A3C", # RIGHTHAND INTERIOR PRODUCT
  254. "\u2A64": "\u2A65", # Z NOTATION DOMAIN ANTIRESTRICTION
  255. "\u2A65": "\u2A64", # Z NOTATION RANGE ANTIRESTRICTION
  256. "\u2A79": "\u2A7A", # LESS-THAN WITH CIRCLE INSIDE
  257. "\u2A7A": "\u2A79", # GREATER-THAN WITH CIRCLE INSIDE
  258. "\u2A7D": "\u2A7E", # LESS-THAN OR SLANTED EQUAL TO
  259. "\u2A7E": "\u2A7D", # GREATER-THAN OR SLANTED EQUAL TO
  260. "\u2A7F": "\u2A80", # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
  261. "\u2A80": "\u2A7F", # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
  262. "\u2A81": "\u2A82", # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
  263. "\u2A82": "\u2A81", # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
  264. "\u2A83": "\u2A84", # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
  265. "\u2A84": "\u2A83", # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
  266. "\u2A8B": "\u2A8C", # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
  267. "\u2A8C": "\u2A8B", # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
  268. "\u2A91": "\u2A92", # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
  269. "\u2A92": "\u2A91", # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
  270. # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
  271. "\u2A93": "\u2A94",
  272. # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
  273. "\u2A94": "\u2A93",
  274. "\u2A95": "\u2A96", # SLANTED EQUAL TO OR LESS-THAN
  275. "\u2A96": "\u2A95", # SLANTED EQUAL TO OR GREATER-THAN
  276. "\u2A97": "\u2A98", # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
  277. "\u2A98": "\u2A97", # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
  278. "\u2A99": "\u2A9A", # DOUBLE-LINE EQUAL TO OR LESS-THAN
  279. "\u2A9A": "\u2A99", # DOUBLE-LINE EQUAL TO OR GREATER-THAN
  280. "\u2A9B": "\u2A9C", # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
  281. "\u2A9C": "\u2A9B", # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
  282. "\u2AA1": "\u2AA2", # DOUBLE NESTED LESS-THAN
  283. "\u2AA2": "\u2AA1", # DOUBLE NESTED GREATER-THAN
  284. "\u2AA6": "\u2AA7", # LESS-THAN CLOSED BY CURVE
  285. "\u2AA7": "\u2AA6", # GREATER-THAN CLOSED BY CURVE
  286. "\u2AA8": "\u2AA9", # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
  287. "\u2AA9": "\u2AA8", # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
  288. "\u2AAA": "\u2AAB", # SMALLER THAN
  289. "\u2AAB": "\u2AAA", # LARGER THAN
  290. "\u2AAC": "\u2AAD", # SMALLER THAN OR EQUAL TO
  291. "\u2AAD": "\u2AAC", # LARGER THAN OR EQUAL TO
  292. "\u2AAF": "\u2AB0", # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
  293. "\u2AB0": "\u2AAF", # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
  294. "\u2AB3": "\u2AB4", # PRECEDES ABOVE EQUALS SIGN
  295. "\u2AB4": "\u2AB3", # SUCCEEDS ABOVE EQUALS SIGN
  296. "\u2ABB": "\u2ABC", # DOUBLE PRECEDES
  297. "\u2ABC": "\u2ABB", # DOUBLE SUCCEEDS
  298. "\u2ABD": "\u2ABE", # SUBSET WITH DOT
  299. "\u2ABE": "\u2ABD", # SUPERSET WITH DOT
  300. "\u2ABF": "\u2AC0", # SUBSET WITH PLUS SIGN BELOW
  301. "\u2AC0": "\u2ABF", # SUPERSET WITH PLUS SIGN BELOW
  302. "\u2AC1": "\u2AC2", # SUBSET WITH MULTIPLICATION SIGN BELOW
  303. "\u2AC2": "\u2AC1", # SUPERSET WITH MULTIPLICATION SIGN BELOW
  304. "\u2AC3": "\u2AC4", # SUBSET OF OR EQUAL TO WITH DOT ABOVE
  305. "\u2AC4": "\u2AC3", # SUPERSET OF OR EQUAL TO WITH DOT ABOVE
  306. "\u2AC5": "\u2AC6", # SUBSET OF ABOVE EQUALS SIGN
  307. "\u2AC6": "\u2AC5", # SUPERSET OF ABOVE EQUALS SIGN
  308. "\u2ACD": "\u2ACE", # SQUARE LEFT OPEN BOX OPERATOR
  309. "\u2ACE": "\u2ACD", # SQUARE RIGHT OPEN BOX OPERATOR
  310. "\u2ACF": "\u2AD0", # CLOSED SUBSET
  311. "\u2AD0": "\u2ACF", # CLOSED SUPERSET
  312. "\u2AD1": "\u2AD2", # CLOSED SUBSET OR EQUAL TO
  313. "\u2AD2": "\u2AD1", # CLOSED SUPERSET OR EQUAL TO
  314. "\u2AD3": "\u2AD4", # SUBSET ABOVE SUPERSET
  315. "\u2AD4": "\u2AD3", # SUPERSET ABOVE SUBSET
  316. "\u2AD5": "\u2AD6", # SUBSET ABOVE SUBSET
  317. "\u2AD6": "\u2AD5", # SUPERSET ABOVE SUPERSET
  318. "\u2ADE": "\u22A6", # SHORT LEFT TACK
  319. "\u2AE3": "\u22A9", # DOUBLE VERTICAL BAR LEFT TURNSTILE
  320. "\u2AE4": "\u22A8", # VERTICAL BAR DOUBLE LEFT TURNSTILE
  321. "\u2AE5": "\u22AB", # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
  322. "\u2AEC": "\u2AED", # DOUBLE STROKE NOT SIGN
  323. "\u2AED": "\u2AEC", # REVERSED DOUBLE STROKE NOT SIGN
  324. "\u2AF7": "\u2AF8", # TRIPLE NESTED LESS-THAN
  325. "\u2AF8": "\u2AF7", # TRIPLE NESTED GREATER-THAN
  326. "\u2AF9": "\u2AFA", # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
  327. "\u2AFA": "\u2AF9", # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
  328. "\u2E02": "\u2E03", # LEFT SUBSTITUTION BRACKET
  329. "\u2E03": "\u2E02", # RIGHT SUBSTITUTION BRACKET
  330. "\u2E04": "\u2E05", # LEFT DOTTED SUBSTITUTION BRACKET
  331. "\u2E05": "\u2E04", # RIGHT DOTTED SUBSTITUTION BRACKET
  332. "\u2E09": "\u2E0A", # LEFT TRANSPOSITION BRACKET
  333. "\u2E0A": "\u2E09", # RIGHT TRANSPOSITION BRACKET
  334. "\u2E0C": "\u2E0D", # LEFT RAISED OMISSION BRACKET
  335. "\u2E0D": "\u2E0C", # RIGHT RAISED OMISSION BRACKET
  336. "\u2E1C": "\u2E1D", # LEFT LOW PARAPHRASE BRACKET
  337. "\u2E1D": "\u2E1C", # RIGHT LOW PARAPHRASE BRACKET
  338. "\u2E20": "\u2E21", # LEFT VERTICAL BAR WITH QUILL
  339. "\u2E21": "\u2E20", # RIGHT VERTICAL BAR WITH QUILL
  340. "\u2E22": "\u2E23", # TOP LEFT HALF BRACKET
  341. "\u2E23": "\u2E22", # TOP RIGHT HALF BRACKET
  342. "\u2E24": "\u2E25", # BOTTOM LEFT HALF BRACKET
  343. "\u2E25": "\u2E24", # BOTTOM RIGHT HALF BRACKET
  344. "\u2E26": "\u2E27", # LEFT SIDEWAYS U BRACKET
  345. "\u2E27": "\u2E26", # RIGHT SIDEWAYS U BRACKET
  346. "\u2E28": "\u2E29", # LEFT DOUBLE PARENTHESIS
  347. "\u2E29": "\u2E28", # RIGHT DOUBLE PARENTHESIS
  348. "\u3008": "\u3009", # LEFT ANGLE BRACKET
  349. "\u3009": "\u3008", # RIGHT ANGLE BRACKET
  350. "\u300A": "\u300B", # LEFT DOUBLE ANGLE BRACKET
  351. "\u300B": "\u300A", # RIGHT DOUBLE ANGLE BRACKET
  352. "\u300C": "\u300D", # [BEST FIT] LEFT CORNER BRACKET
  353. "\u300D": "\u300C", # [BEST FIT] RIGHT CORNER BRACKET
  354. "\u300E": "\u300F", # [BEST FIT] LEFT WHITE CORNER BRACKET
  355. "\u300F": "\u300E", # [BEST FIT] RIGHT WHITE CORNER BRACKET
  356. "\u3010": "\u3011", # LEFT BLACK LENTICULAR BRACKET
  357. "\u3011": "\u3010", # RIGHT BLACK LENTICULAR BRACKET
  358. "\u3014": "\u3015", # LEFT TORTOISE SHELL BRACKET
  359. "\u3015": "\u3014", # RIGHT TORTOISE SHELL BRACKET
  360. "\u3016": "\u3017", # LEFT WHITE LENTICULAR BRACKET
  361. "\u3017": "\u3016", # RIGHT WHITE LENTICULAR BRACKET
  362. "\u3018": "\u3019", # LEFT WHITE TORTOISE SHELL BRACKET
  363. "\u3019": "\u3018", # RIGHT WHITE TORTOISE SHELL BRACKET
  364. "\u301A": "\u301B", # LEFT WHITE SQUARE BRACKET
  365. "\u301B": "\u301A", # RIGHT WHITE SQUARE BRACKET
  366. "\uFE59": "\uFE5A", # SMALL LEFT PARENTHESIS
  367. "\uFE5A": "\uFE59", # SMALL RIGHT PARENTHESIS
  368. "\uFE5B": "\uFE5C", # SMALL LEFT CURLY BRACKET
  369. "\uFE5C": "\uFE5B", # SMALL RIGHT CURLY BRACKET
  370. "\uFE5D": "\uFE5E", # SMALL LEFT TORTOISE SHELL BRACKET
  371. "\uFE5E": "\uFE5D", # SMALL RIGHT TORTOISE SHELL BRACKET
  372. "\uFE64": "\uFE65", # SMALL LESS-THAN SIGN
  373. "\uFE65": "\uFE64", # SMALL GREATER-THAN SIGN
  374. "\uFF08": "\uFF09", # FULLWIDTH LEFT PARENTHESIS
  375. "\uFF09": "\uFF08", # FULLWIDTH RIGHT PARENTHESIS
  376. "\uFF1C": "\uFF1E", # FULLWIDTH LESS-THAN SIGN
  377. "\uFF1E": "\uFF1C", # FULLWIDTH GREATER-THAN SIGN
  378. "\uFF3B": "\uFF3D", # FULLWIDTH LEFT SQUARE BRACKET
  379. "\uFF3D": "\uFF3B", # FULLWIDTH RIGHT SQUARE BRACKET
  380. "\uFF5B": "\uFF5D", # FULLWIDTH LEFT CURLY BRACKET
  381. "\uFF5D": "\uFF5B", # FULLWIDTH RIGHT CURLY BRACKET
  382. "\uFF5F": "\uFF60", # FULLWIDTH LEFT WHITE PARENTHESIS
  383. "\uFF60": "\uFF5F", # FULLWIDTH RIGHT WHITE PARENTHESIS
  384. "\uFF62": "\uFF63", # [BEST FIT] HALFWIDTH LEFT CORNER BRACKET
  385. "\uFF63": "\uFF62", # [BEST FIT] HALFWIDTH RIGHT CORNER BRACKET
  386. }