charset.dart 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. typedef CharsetTranslator = int Function(int);
  2. final _charsets = <int, CharsetTranslator>{
  3. '0'.codeUnitAt(0): decSpecGraphicsTranslator,
  4. 'B'.codeUnitAt(0): asciiTranslator,
  5. };
  6. class Charset {
  7. var _charsetMap = <int, CharsetTranslator>{};
  8. var _currentIndex = 0;
  9. var _savedCharsetMap = <int, CharsetTranslator>{};
  10. var _savedIndex = 0;
  11. var _cached = asciiTranslator;
  12. void _updateCache() {
  13. _cached = _charsetMap[_currentIndex] ?? asciiTranslator;
  14. }
  15. int translate(int codePoint) {
  16. return _cached(codePoint);
  17. }
  18. void designate(int index, int name) {
  19. final charset = _charsets[name];
  20. if (charset != null) {
  21. _charsetMap[index] = charset;
  22. _updateCache();
  23. }
  24. }
  25. void use(int index) {
  26. _currentIndex = index;
  27. _updateCache();
  28. }
  29. void save() {
  30. _savedCharsetMap = Map.from(_charsetMap);
  31. _savedIndex = _currentIndex;
  32. }
  33. void restore() {
  34. _charsetMap = _savedCharsetMap;
  35. _currentIndex = _savedIndex;
  36. _updateCache();
  37. }
  38. }
  39. const decSpecGraphics = <int, int>{
  40. 0x5f: 0x00A0, // NO-BREAK SPACE
  41. 0x60: 0x25C6, // BLACK DIAMOND
  42. 0x61: 0x2592, // MEDIUM SHADE
  43. 0x62: 0x2409, // SYMBOL FOR HORIZONTAL TABULATION
  44. 0x63: 0x240C, // SYMBOL FOR FORM FEED
  45. 0x64: 0x240D, // SYMBOL FOR CARRIAGE RETURN
  46. 0x65: 0x240A, // SYMBOL FOR LINE FEED
  47. 0x66: 0x00B0, // DEGREE SIGN
  48. 0x67: 0x00B1, // PLUS-MINUS SIGN
  49. 0x68: 0x2424, // SYMBOL FOR NEWLINE
  50. 0x69: 0x240B, // SYMBOL FOR VERTICAL TABULATION
  51. 0x6a: 0x2518, // BOX DRAWINGS LIGHT UP AND LEFT
  52. 0x6b: 0x2510, // BOX DRAWINGS LIGHT DOWN AND LEFT
  53. 0x6c: 0x250C, // BOX DRAWINGS LIGHT DOWN AND RIGHT
  54. 0x6d: 0x2514, // BOX DRAWINGS LIGHT UP AND RIGHT
  55. 0x6e: 0x253C, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
  56. 0x6f: 0x23BA, // HORIZONTAL SCAN LINE-1
  57. 0x70: 0x23BB, // HORIZONTAL SCAN LINE-3
  58. 0x71: 0x2500, // BOX DRAWINGS LIGHT HORIZONTAL
  59. 0x72: 0x23BC, // HORIZONTAL SCAN LINE-7
  60. 0x73: 0x23BD, // HORIZONTAL SCAN LINE-9
  61. 0x74: 0x251C, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT
  62. 0x75: 0x2524, // BOX DRAWINGS LIGHT VERTICAL AND LEFT
  63. 0x76: 0x2534, // BOX DRAWINGS LIGHT UP AND HORIZONTAL
  64. 0x77: 0x252C, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
  65. 0x78: 0x2502, // BOX DRAWINGS LIGHT VERTICAL
  66. 0x79: 0x2264, // LESS-THAN OR EQUAL TO
  67. 0x7a: 0x2265, // GREATER-THAN OR EQUAL TO
  68. 0x7b: 0x03C0, // GREEK SMALL LETTER PI
  69. 0x7c: 0x2260, // NOT EQUAL TO
  70. 0x7d: 0x00A3, // POUND SIGN
  71. 0x7e: 0x00B7, // MIDDLE DOT
  72. };
  73. int asciiTranslator(int codePoint) {
  74. return codePoint;
  75. }
  76. int decSpecGraphicsTranslator(int codePoint) {
  77. if (codePoint >= 127) {
  78. return codePoint;
  79. }
  80. return decSpecGraphics[codePoint] ?? codePoint;
  81. }