ansi.dart 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import 'dart:collection';
  2. import 'package:xterm/terminal/csi.dart';
  3. import 'package:xterm/terminal/osc.dart';
  4. import 'package:xterm/terminal/terminal.dart';
  5. typedef AnsiHandler = void Function(Queue<int>, Terminal);
  6. void ansiHandler(Queue<int> queue, Terminal terminal) {
  7. final charAfterEsc = String.fromCharCode(queue.removeFirst());
  8. final handler = _ansiHandlers[charAfterEsc];
  9. if (handler != null) {
  10. if (handler != csiHandler && handler != oscHandler) {
  11. terminal.debug.onEsc(charAfterEsc);
  12. }
  13. return handler(queue, terminal);
  14. }
  15. terminal.debug.onError('unsupported ansi sequence: $charAfterEsc');
  16. }
  17. final _ansiHandlers = <String, AnsiHandler>{
  18. '[': csiHandler,
  19. ']': oscHandler,
  20. '7': _ansiSaveCursorHandler,
  21. '8': _ansiRestoreCursorHandler,
  22. 'D': _ansiIndexHandler,
  23. 'E': _ansiNextLineHandler,
  24. 'H': _ansiTabSetHandler,
  25. 'M': _ansiReverseIndexHandler,
  26. 'P': _unsupportedHandler, // Sixel
  27. 'c': _unsupportedHandler,
  28. '#': _unsupportedHandler,
  29. '(': _scsHandler(0), // G0
  30. ')': _scsHandler(1), // G1
  31. '*': _voidHandler(1), // TODO: G2 (vt220)
  32. '+': _voidHandler(1), // TODO: G3 (vt220)
  33. '>': _voidHandler(0), // TODO: Normal Keypad
  34. '=': _voidHandler(0), // TODO: Application Keypad
  35. };
  36. AnsiHandler _voidHandler(int sequenceLength) {
  37. return (queue, terminal) {
  38. queue.take(sequenceLength);
  39. };
  40. }
  41. void _unsupportedHandler(Queue<int> queue, Terminal terminal) async {
  42. // print('unimplemented ansi sequence.');
  43. }
  44. void _ansiSaveCursorHandler(Queue<int> queue, Terminal terminal) {
  45. terminal.buffer.saveCursor();
  46. }
  47. void _ansiRestoreCursorHandler(Queue<int> queue, Terminal terminal) {
  48. terminal.buffer.restoreCursor();
  49. }
  50. void _ansiIndexHandler(Queue<int> queue, Terminal terminal) {
  51. terminal.buffer.index();
  52. }
  53. void _ansiReverseIndexHandler(Queue<int> queue, Terminal terminal) {
  54. terminal.buffer.reverseIndex();
  55. }
  56. AnsiHandler _scsHandler(int which) {
  57. return (Queue<int> queue, Terminal terminal) {
  58. final name = String.fromCharCode(queue.removeFirst());
  59. terminal.buffer.charset.designate(which, name);
  60. };
  61. }
  62. void _ansiNextLineHandler(Queue<int> queue, Terminal terminal) {
  63. terminal.buffer.newLine();
  64. terminal.buffer.setCursorX(0);
  65. }
  66. void _ansiTabSetHandler(Queue<int> queue, Terminal terminal) {
  67. terminal.tabSetAtCursor();
  68. }