Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 1257x 1257x 4x 4x 1256x 1257x 1x 1x 1x 1256x 1257x 1257x 1253x 1257x 42x 42x 42x 1211x 1229x 1210x 1257x 1257x 1257x 2x 2x 2x 2x 2x 1115x 1115x 12x 12x 1114x 1115x 646x 646x 646x 468x 468x 468x 931x 82x 931x 57x 57x 468x 930x 233x 931x 104x 104x 468x 468x 1115x 2x 2x 2x 2x 2x 2x 2x 2x 141x 141x 4x 4x 140x 141x 4x 4x 4x 136x 136x 141x 141x 141x 2x 2x 2x 2x 2x 551x 551x 4x 4x 550x 551x 20x 20x 20x 530x 530x 551x 2x 2x 2x 2x 2x 2x 2x | 'use strict'; const { NumberIsNaN, } = primordials; const { codes: { ERR_INVALID_ARG_VALUE, ERR_INVALID_CURSOR_POS, }, } = require('internal/errors'); const { validateFunction, } = require('internal/validators'); const { CSI, } = require('internal/readline/utils'); const { kClearLine, kClearScreenDown, kClearToLineBeginning, kClearToLineEnd, } = CSI; /** * moves the cursor to the x and y coordinate on the given stream */ function cursorTo(stream, x, y, callback) { if (callback !== undefined) { validateFunction(callback, 'callback'); } if (typeof y === 'function') { callback = y; y = undefined; } if (NumberIsNaN(x)) throw new ERR_INVALID_ARG_VALUE('x', x); if (NumberIsNaN(y)) throw new ERR_INVALID_ARG_VALUE('y', y); if (stream == null || (typeof x !== 'number' && typeof y !== 'number')) { if (typeof callback === 'function') process.nextTick(callback, null); return true; } if (typeof x !== 'number') throw new ERR_INVALID_CURSOR_POS(); const data = typeof y !== 'number' ? CSI`${x + 1}G` : CSI`${y + 1};${x + 1}H`; return stream.write(data, callback); } /** * moves the cursor relative to its current location */ function moveCursor(stream, dx, dy, callback) { if (callback !== undefined) { validateFunction(callback, 'callback'); } if (stream == null || !(dx || dy)) { if (typeof callback === 'function') process.nextTick(callback, null); return true; } let data = ''; if (dx < 0) { data += CSI`${-dx}D`; } else if (dx > 0) { data += CSI`${dx}C`; } if (dy < 0) { data += CSI`${-dy}A`; } else if (dy > 0) { data += CSI`${dy}B`; } return stream.write(data, callback); } /** * clears the current line the cursor is on: * -1 for left of the cursor * +1 for right of the cursor * 0 for the entire line */ function clearLine(stream, dir, callback) { if (callback !== undefined) { validateFunction(callback, 'callback'); } if (stream === null || stream === undefined) { if (typeof callback === 'function') process.nextTick(callback, null); return true; } const type = dir < 0 ? kClearToLineBeginning : dir > 0 ? kClearToLineEnd : kClearLine; return stream.write(type, callback); } /** * clears the screen from the current position of the cursor down */ function clearScreenDown(stream, callback) { if (callback !== undefined) { validateFunction(callback, 'callback'); } if (stream === null || stream === undefined) { if (typeof callback === 'function') process.nextTick(callback, null); return true; } return stream.write(kClearScreenDown, callback); } module.exports = { clearLine, clearScreenDown, cursorTo, moveCursor, }; |