UNPKG

math-figures

Version:

Draw ascii math figures digits, operators and tokens in terminal

674 lines (668 loc) 19 kB
import figureSet from 'figures'; import ansiEscapes from 'ansi-escapes'; import * as R from 'ramda'; import { times } from 'ramda'; import stringWidth from 'string-width'; import chalk from 'chalk'; R.flip(R.times)(7); const sixTimes = R.flip(R.times)(6); const fiveTimes = R.flip(R.times)(5); const fourTimes = R.flip(R.times)(4); const threeTimes = R.flip(R.times)(3); const twoTimes = R.flip(R.times)(2); const writeRel = (x, y, subject) => { process.stdout.write(ansiEscapes.cursorMove(x, y)); process.stdout.write(subject); return [x + stringWidth(subject), y]; }; const writeCur = (subject) => { process.stdout.write(subject); return [stringWidth(subject), 0]; }; const goToRel = (x, y) => { process.stdout.write(ansiEscapes.cursorMove(x, y)); return [x, y]; }; const cls = () => { writeCur(ansiEscapes.clearTerminal); }; const drawSuccess = () => { let offsetX = 0; let offsetY = 0; let offsets = []; offsets = writeRel(0, 0, ansiEscapes.cursorSavePosition); offsetX += offsets[0]; offsetY += offsets[1]; offsets = writeRel(1, 3, chalk.green(figureSet.lineBackslash)); offsetX += offsets[0]; offsetY += offsets[1]; offsets = writeRel(0, 0, chalk.green(figureSet.lineSlash)); offsetX += offsets[0]; offsetY += offsets[1]; offsets = writeRel(0, -1, chalk.green(figureSet.lineSlash)); offsetX += offsets[0]; offsetY += offsets[1]; offsets = writeRel(0, 0, ansiEscapes.cursorRestorePosition); offsetX += offsets[0]; offsetY += offsets[1]; return [offsetX, offsetY]; }; const drawError = () => { let offsetX = 0; let offsetY = 0; let offsets = []; offsets = writeRel(1, 3, chalk.red(figureSet.lineSlash)); offsetX += offsets[0]; offsetY += offsets[1]; offsets = writeRel(0, -1, chalk.red(figureSet.lineSlash)); offsetX += offsets[0]; offsetY += offsets[1]; offsets = writeRel(-2, 0, chalk.red(figureSet.lineBackslash)); offsetX += offsets[0]; offsetY += offsets[1]; offsets = writeRel(0, 1, chalk.red(figureSet.lineBackslash)); offsetX += offsets[0]; offsetY += offsets[1]; return [offsetX, offsetY]; }; const drawZero = () => { writeRel(0, 0, figureSet.lineDownDoubleRightDouble); times(() => { process.stdout.write(figureSet.lineDouble); }, 7); times((i) => { if (i === 0) { writeRel(0, 0, figureSet.lineDownDoubleLeftDouble); } else { writeRel(-1, 1, figureSet.lineVerticalDouble); } }, 6); times((i) => { if (i === 0) { writeRel(-1, 1, figureSet.lineUpDoubleLeftDouble); } else { writeRel(-2, 0, figureSet.lineDouble); } }, 8); times((i) => { if (i === 0) { writeRel(-2, 0, figureSet.lineUpDoubleRightDouble); } else { writeRel(-1, -1, figureSet.lineVerticalDouble); } }, 6); process.stdout.write(ansiEscapes.cursorMove(8, 5)); return [5, 7]; }; const drawOne = () => { let offsetX = 0; let offsetY = 0; let offsets; offsets = writeRel(0, 1, figureSet.lineSlash); offsetX += offsets[0]; offsetY += offsets[1]; offsets = writeRel(0, -1, figureSet.lineSlash); offsetX += offsets[0]; offsetY += offsets[1]; offsets = writeCur(figureSet.lineVerticalBold); offsetX += offsets[0]; offsetY += offsets[1]; sixTimes(() => { offsets = writeRel(-1, 1, figureSet.lineVerticalBold); offsetX += offsets[0]; offsetY += offsets[1]; }); return [offsetX, offsetY]; }; const drawTwo = () => { let offsetX = 0; let offsetY = 0; let offsets; offsets = writeCur(figureSet.lineDownDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; times(() => { offsets = writeCur(figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; }, 5); writeCur(figureSet.lineDownDoubleLeftDouble); threeTimes(() => { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(-1, 0, figureSet.lineUpDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; offsets = writeRel(-2, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; fourTimes((i) => { if (i === 0) { offsets = writeRel(-2, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; } else { offsets = writeRel(-2, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; } }); offsets = writeRel(-2, 0, figureSet.lineDownDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; threeTimes(() => { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(-1, 0, figureSet.lineUpDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; fiveTimes((i) => { offsets = writeRel(0, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeCur(figureSet.lineUpDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; return [offsetX, offsetY]; }; const drawThree = () => { let offsetX = 0; let offsetY = 0; let offsets; offsets = writeRel(0, 0, figureSet.lineDownDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; fiveTimes(() => { offsets = writeRel(0, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(0, 0, figureSet.lineDownDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; threeTimes(() => { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); times(() => { offsets = writeRel(-2, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; }, 5); offsets = goToRel(4, 0); offsetX += offsets[0]; offsetY += offsets[1]; offsets = writeRel(0, 0, figureSet.lineUpDoubleDownDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; times(() => { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }, 2); offsets = writeRel(-1, 1, figureSet.lineUpDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; times(() => { offsets = writeRel(-2, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; }, 5); offsets = writeRel(-2, 0, figureSet.lineUpDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; offsets = goToRel(6, 0); offsetX += offsets[0]; offsetY += offsets[1]; return [offsetX, offsetY]; }; const drawFour = () => { let offsetX = 0; let offsetY = 0; let offsets; threeTimes((i) => { if (i === 0) { offsets = writeRel(0, 0, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; } else { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; } }); offsets = writeRel(-1, 1, figureSet.lineUpDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; times(() => { offsets = writeRel(0, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; }, 4); offsets = writeRel(0, 0, figureSet.lineUpDoubleDownDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; offsets = writeRel(-1, -1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; offsets = writeRel(-1, -1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; times((i) => { if (i === 0) { offsets = writeRel(-1, 3, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; } else { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; } }, 3); return [offsetX, offsetY]; }; const drawFive = () => { let offsetX = 0; let offsetY = 0; let offsets = []; times((i) => { if (i !== 0) { offsets = writeRel(0, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; } else { offsets = writeRel(0, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; } }, 7); offsets = writeRel(-7, 0, figureSet.lineDownDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; twoTimes(() => { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(-1, 1, figureSet.lineUpDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; fiveTimes(() => { offsets = writeRel(0, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(0, 0, figureSet.lineDownDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; twoTimes(() => { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(-1, 1, figureSet.lineUpDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; fiveTimes(() => { offsets = writeRel(-2, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(-2, 0, figureSet.lineUpDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; offsets = goToRel(6, 0); offsetX += offsets[0]; offsetY += offsets[1]; return [offsetX, offsetY]; }; const drawSix = () => { let offsetX = 0; let offsetY = 0; let offsets = []; times((i) => { if (i !== 0) { offsets = writeRel(0, 0, figureSet.lineDouble); } else { offsets = writeRel(0, 0, figureSet.lineDownDoubleRightDouble); } offsetX += offsets[0]; offsetY += offsets[1]; }, 7); offsets = goToRel(-6, 0); offsetX += offsets[0]; offsetY += offsets[1]; fiveTimes(() => { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(-1, 1, figureSet.lineUpDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; let maxHorOffset = 0; fiveTimes(() => { offsets = writeRel(0, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; maxHorOffset++; }); offsets = writeRel(0, 0, figureSet.lineUpDoubleLeftDouble); maxHorOffset++; offsetX += offsets[0]; offsetY += offsets[1]; twoTimes(() => { offsets = writeRel(-1, -1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(-1, -1, figureSet.lineDownDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; fiveTimes(() => { offsets = writeRel(-2, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(-2, 0, figureSet.lineUpDoubleDownDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; offsets = goToRel(maxHorOffset, 3); offsetX += offsets[0]; offsetY += offsets[1]; return [offsetX, offsetY]; }; const drawSeven = () => { let offsetX = 0; let offsetY = 0; let offsets = []; offsets = writeRel(0, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; times((i) => { if (i === 0) { offsets = writeRel(-1, -1, figureSet.lineDownDoubleRightDouble); } else { offsets = writeRel(0, 0, figureSet.lineDouble); } offsetX += offsets[0]; offsetY += offsets[1]; }, 7); offsets = writeRel(0, 0, figureSet.lineDownDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; sixTimes(() => { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); return [offsetX, offsetY]; }; const drawEight = () => { let offsetX = 0; let offsetY = 0; let offsets = []; sixTimes((i) => { if (i === 0) { offsets = writeRel(0, 0, figureSet.lineDownDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; } else { offsets = writeRel(0, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; } }); fourTimes((i) => { if (i === 0) { offsets = writeRel(0, 0, figureSet.lineDownDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; } else { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; } }); sixTimes((i) => { if (i === 0) { offsets = writeRel(-1, 0, figureSet.lineUpDoubleDownDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; } else { offsets = writeRel(-2, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; } }); threeTimes((i) => { if (i === 0) { offsets = writeRel(-2, 0, figureSet.lineUpDoubleDownDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; } else { offsets = writeRel(-1, -1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; } }); offsets = goToRel(0, 2); offsetX += offsets[0]; offsetY += offsets[1]; fourTimes((i) => { if (i === 3) { offsets = writeRel(-1, 0, figureSet.lineUpDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; } else { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; } }); sixTimes((i) => { if (i === 5) { offsets = writeRel(0, 0, figureSet.lineUpDoubleLeftDouble); } else { offsets = writeRel(0, 0, figureSet.lineDouble); } offsetX += offsets[0]; offsetY += offsets[1]; }); twoTimes((i) => { offsets = writeRel(-1, -1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = goToRel(0, 2); offsetX += offsets[0]; offsetY += offsets[1]; return [offsetX, offsetY]; }; const drawNine = () => { let offsetX = 0; let offsetY = 0; let offsets = []; offsets = writeRel(5, 3, figureSet.lineUpDoubleDownDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; twoTimes((i) => { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(-1, 1, figureSet.lineUpDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; fiveTimes((i) => { offsets = writeRel( -2, 0, i === 4 ? figureSet.lineUpDoubleRightDouble : figureSet.lineDouble ); offsetX += offsets[0]; offsetY += offsets[1]; }); fiveTimes((i) => { if (i === 0) { offsets = writeRel(3, -3, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; } else { offsets = writeRel( -2, 0, i === 4 ? figureSet.lineUpDoubleRightDouble : figureSet.lineDouble ); offsetX += offsets[0]; offsetY += offsets[1]; } }); twoTimes((i) => { offsets = writeRel(-1, -1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); sixTimes((i) => { if (i === 0) { offsets = writeRel(-1, -1, figureSet.lineDownDoubleRightDouble); } else { offsets = writeRel( 0, 0, i === 5 ? figureSet.lineDownDoubleLeftDouble : figureSet.lineDouble ); } offsetX += offsets[0]; offsetY += offsets[1]; }); twoTimes((i) => { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = goToRel(0, 4); offsetX += offsets[0]; offsetY += offsets[1]; return [offsetX, offsetY]; }; const drawPlus = () => { fourTimes((i) => { if (i === 0) { writeRel(1, 3, figureSet.lineDouble); } else if (i === 3) { writeRel(0, 0, figureSet.lineUpDoubleDownDoubleLeftDoubleRightDouble); } else { writeRel(0, 0, figureSet.lineDouble); } }); writeRel(-1, -1, figureSet.lineVerticalDouble); threeTimes((i) => { if (i === 0) { writeRel(0, 1, figureSet.lineDouble); } else { writeRel(0, 0, figureSet.lineDouble); } }); writeRel(-4, 1, figureSet.lineVerticalDouble); goToRel(3, 0); return [9, 10]; }; const drawMinus = () => { fourTimes((i) => { if (i === 0) { writeRel(1, 3, figureSet.lineDouble); } else { writeRel(0, 0, figureSet.lineDouble); } }); return [6, 4]; }; const drawDivide = () => { let [offsetX, offsetY] = writeRel(2, 2, figureSet.checkboxOff); const currOffset = writeRel(-1, 2, figureSet.checkboxOff); offsetX += currOffset[0]; offsetY += currOffset[1]; return [offsetX, offsetY]; }; const drawMultiply = () => { writeRel(1, 3, figureSet.bullet); return [4, 3]; }; const drawEqual = () => { let offsetX = 0; let offsetY = 0; let currOffsets; fourTimes((i) => { if (i === 0) { currOffsets = writeRel(1, 2, figureSet.lineDouble); offsetX += currOffsets[0]; offsetY += currOffsets[1]; } else { currOffsets = writeRel(0, 0, figureSet.lineDouble); offsetX += currOffsets[0]; offsetY += currOffsets[1]; } }); currOffsets = writeRel(-4, 1, figureSet.lineDouble); offsetX += currOffsets[0]; offsetY += currOffsets[1]; threeTimes(() => { currOffsets = writeRel(0, 0, figureSet.lineDouble); offsetX += currOffsets[0]; offsetY += currOffsets[1]; }); return [offsetX, offsetY]; }; const drawDot = () => { return writeRel(1, 0, figureSet.squareSmall); }; const drawQuestion = () => { let offsetX = 0; let offsetY = 0; let offsets; fiveTimes((i) => { if (i === 0) { offsets = writeCur(figureSet.lineDownDoubleRightDouble); } else { offsets = writeCur(figureSet.lineDouble); } offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeCur(figureSet.lineDownDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; twoTimes((i) => { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(-1, 1, figureSet.lineUpDoubleLeftDouble); offsetX += offsets[0]; offsetY += offsets[1]; twoTimes(() => { offsets = writeRel(-2, 0, figureSet.lineDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(-2, 0, figureSet.lineDownDoubleRightDouble); offsetX += offsets[0]; offsetY += offsets[1]; twoTimes(() => { offsets = writeRel(-1, 1, figureSet.lineVerticalDouble); offsetX += offsets[0]; offsetY += offsets[1]; }); offsets = writeRel(-1, 1, figureSet.bullet); offsetX += offsets[0]; offsetY += offsets[1]; return [offsetX, offsetY]; }; export { cls as clearTerminal, cls, drawDivide, drawDot, drawEight, drawEqual, drawError, drawFive, drawFour, drawMinus, drawMultiply, drawNine, drawOne, drawPlus, drawQuestion, drawSeven, drawSix, drawSuccess, drawThree, drawTwo, drawZero };