move.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. "use strict";
  2. var d = require("d")
  3. , trunc = require("es5-ext/math/trunc");
  4. var up, down, right, left, abs = Math.abs, floor = Math.floor, max = Math.max;
  5. var getMove = function (control) {
  6. return function (num) {
  7. num = isNaN(num) ? 0 : max(floor(num), 0);
  8. return num ? "\x1b[" + num + control : "";
  9. };
  10. };
  11. module.exports = Object.defineProperties(
  12. function (x, y) {
  13. x = isNaN(x) ? 0 : floor(x);
  14. y = isNaN(y) ? 0 : floor(y);
  15. return (x > 0 ? right(x) : left(-x)) + (y > 0 ? down(y) : up(-y));
  16. },
  17. {
  18. up: d((up = getMove("A"))),
  19. down: d((down = getMove("B"))),
  20. right: d((right = getMove("C"))),
  21. left: d((left = getMove("D"))),
  22. to: d(function (x, y) {
  23. x = isNaN(x) ? 1 : max(floor(x), 0) + 1;
  24. y = isNaN(y) ? 1 : max(floor(y), 0) + 1;
  25. return "\x1b[" + y + ";" + x + "H";
  26. }),
  27. lines: d(function (n) {
  28. var dir;
  29. n = trunc(n) || 0;
  30. dir = n >= 0 ? "B" : "A";
  31. n = floor(abs(n));
  32. return "\x1b[" + n + dir + "\x1b[1G";
  33. }),
  34. top: d("\x1b[5000F"),
  35. bottom: d("\x1b[5000B"),
  36. lineBegin: d("\x1b[5000D"),
  37. lineEnd: d("\x1b[5000C")
  38. }
  39. );