From 7b6e04356068566fb937ede6af2299940495fdda Mon Sep 17 00:00:00 2001 From: f1lt3r Date: Sat, 26 Oct 2019 16:19:39 -0400 Subject: [PATCH 1/3] non text chars and lesson chaining --- .editorconfig | 22 ++++++ .index.js.swp | Bin 0 -> 32768 bytes index.js | 141 +++++++++++++++++++++-------------- kata/tao-te-ching/chapter-07 | 2 +- package.json | 2 +- yarn.lock | 98 ------------------------ 6 files changed, 110 insertions(+), 155 deletions(-) create mode 100644 .editorconfig create mode 100644 .index.js.swp diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..2c9b82a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,22 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true + +# Matches multiple files with brace expansion notation +# Set default charset +[*.{js}] +charset = utf-8 + +# Indentation override for all JS under lib directory +[lib/**.js] +indent_style = tab +indent_size = 2 + +# Matches the exact files either package.json or .travis.yml +[{package.json,.travis.yml}] +indent_style = space +indent_size = 2 diff --git a/.index.js.swp b/.index.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..5ff6fd0cf7bcef99fa043970d4db930be5ab6154 GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/index.js b/index.js index 1a0a740..cdb98a9 100644 --- a/index.js +++ b/index.js @@ -190,18 +190,35 @@ const loadLesson = filename => { return lines; }; -const start = file => { - const lines = loadLesson(file); - beginLesson(lines); +const start = (file, list, index) => { + let callback; + if (index === list.length - 1) { + callback = () => { + console.log('Well done!'); + process.stdin.pause(); + } + } else { + callback = () => { + const nextIndex = parseInt(index) + 1; + const nextFile = list[nextIndex]; + start(nextFile, list, nextIndex); + } + } + const lines = loadLesson(file.path); + beginLesson(lines, callback); }; -function beginLesson (lines) { - var fail = clc.bgRed.white.bold.underline; +function beginLesson (lines, callback) { + var fail = clc.bgRed.white; var pass = clc.green; var complete = clc.green.underline; var white = clc; + let dim = clc.magenta; var green = clc.green; - var titleStyle = clc.underline; + var titleStyle = clc.cyan.underline; + + // Extra line so test ends in correct place + lines.push(''); // Log the lesson title const firstLine = `${lines[0]}`; @@ -210,13 +227,13 @@ function beginLesson (lines) { // Remove the lesson title from the lesson lines lines.shift(); - var cursorLine = 0; - var currentLine; - var cursorColumn = 0; - var lineErrors= 0; - var trace = ''; - var totalErrors = 0; - var start = (+ new Date()); + let cursorLine = 0; + let currentLine; + let cursorColumn = 0; + let lineErrors= 0; + let trace = ''; + let totalErrors = 0; + let start = (+ new Date()); // Load the first line nextLine(); @@ -226,34 +243,37 @@ function beginLesson (lines) { cursorColumn = 0; trace = ''; currentLine = lines[cursorLine]; - console.log(white('\n' + currentLine)); + console.log(white('\n' + currentLine.replace(/\s/g, dim('⠐')) + dim('¬'))); + + process.stdout.write(dim('_')); if (cursorLine === lines.length-1) { + //if (cursorLine === 1) { lessonComplete(); } cursorLine +=1; } function lessonComplete () { - var end = (+ new Date()); - var time = end - start; - var wordCount = lines.join(' ').split(' ').length - 1; - var msPerWord = time / wordCount; - var wpm = (60 * 1000 / msPerWord).toFixed(2); - + var end = (+ new Date()); + var time = end - start; + var wordCount = lines.join(' ').split(' ').length - 1; + var msPerWord = time / wordCount; + var wpm = (60 * 1000 / msPerWord).toFixed(2); + + console.log(); console.log(complete('Lesson complete!')); console.log(white('Total errors: ' + totalErrors)); console.log(white('Words Per Minute: ' + wpm)); - console.log(); - - process.stdin.pause(); + console.log(); + process.stdin.removeListener('keypress', onKeyPress); + callback(); } - // Begin reading keys - keypress(process.stdin); - - process.stdin.on('keypress', function (ch, key) { - if (key && key.hasOwnProperty('name')) { + // Begin reading keys + keypress(process.stdin); + function onKeyPress (ch, key) { + if (key && key.hasOwnProperty('name')) { // Quit on Ctrl+C if (key && key.ctrl && key.name == 'c') { @@ -264,19 +284,21 @@ function beginLesson (lines) { // Ignore keys // if (key.name === 'return' || key.name === 'tab') { - if ( key.name === 'tab') { + if (key.name === 'tab') { return; } if (key.name === 'backspace') { if (cursorColumn > 0) { - process.stdout.write(clc.move.left(1)); - process.stdout.write(clc.erase.lineRight); + process.stdout.write(clc.move.left(2)); + process.stdout.write(clc.erase.lineRight); + process.stdout.write(clc.erase.lineRight); cursorColumn -= 1; if (trace[cursorColumn] === '0') { lineErrors-=1; } trace = trace.substr(0, trace.length-1); + process.stdout.write(dim('_')); } return; @@ -285,13 +307,19 @@ function beginLesson (lines) { if (ch === currentLine[cursorColumn]) { if (!returned) { - process.stdout.write(pass(ch)); + process.stdout.write(clc.move.left(1)); + process.stdout.write(clc.erase.lineRight); + process.stdout.write(pass(ch).replace(/\s/, dim('⠐'))); + process.stdout.write(dim('_')); trace += '1'; } } else { if (!returned) { process.stdout.write('\u0007'); + process.stdout.write(clc.move.left(1)); + process.stdout.write(clc.erase.lineRight); process.stdout.write(fail(ch)); + process.stdout.write(dim('_')); lineErrors += 1; totalErrors += 1; trace += '0'; @@ -301,19 +329,21 @@ function beginLesson (lines) { cursorColumn += 1; } - // console.log(cursorColumn, currentLine.length, returned); - if (cursorColumn >= currentLine.length && !lineErrors && returned) { - nextLine(); - } - }); - - if (typeof process.stdin.setRawMode == 'function') { - process.stdin.setRawMode(true); - } else { - tty.setRawMode(true); - } - - process.stdin.resume(); + if (cursorColumn >= currentLine.length && !lineErrors && returned) { + process.stdout.write(clc.move.left(1)); + process.stdout.write(clc.erase.lineRight); + process.stdout.write(dim('¬')); + nextLine(); + } + }; + process.stdin.on('keypress', onKeyPress); + if (typeof process.stdin.setRawMode == 'function') { + process.stdin.setRawMode(true); + } else { + tty.setRawMode(true); + } + + process.stdin.resume(); } const generateTOC = () => new Promise((resolve, reject) => { @@ -363,10 +393,10 @@ const menu = { sub: async list => { const choices = []; - list.forEach(file => { + list.forEach((file, idx) => { choices.push({ message: file.title, - name: file.path + name: String(idx) }); }); @@ -375,10 +405,11 @@ const menu = { message: 'Choose your beginning', limit: 5, choices - }); + }); - const answer = await prompt.run(); - return answer; + const idx = await prompt.run(); + const file = list[idx]; + return [file, idx]; }, help: () => program.outputHelp(), @@ -395,11 +426,11 @@ const startWithMenu = () => generateTOC() if (Reflect.has(menu, type)) { return menu[type](); } - + const list = type === 'lessons' ? TOC.lessons : TOC.katas[type]; - - menu.sub(list).then(file => { - start(file); + + menu.sub(list).then(([file, idx]) => { + start(file, list, idx); }) }); @@ -409,4 +440,4 @@ const startWithFile = () => {} program.keyboard && drawKeyboard(); fileToLoad && startWithFile(fileToLoad) || - startWithMenu(); \ No newline at end of file + startWithMenu(); diff --git a/kata/tao-te-ching/chapter-07 b/kata/tao-te-ching/chapter-07 index 398e204..5782d8a 100644 --- a/kata/tao-te-ching/chapter-07 +++ b/kata/tao-te-ching/chapter-07 @@ -5,4 +5,4 @@ Hence, they are long lived. Thus, although the saint puts himself last, finds himself in the lead. Although he is not self-concerned, finds himself accomplished. It is because he is not focused on self-interests and hence can fulfill his true nature. -he Way of a saint is to act naturally without contention. \ No newline at end of file +The Way of a saint is to act naturally without contention. diff --git a/package.json b/package.json index 0dda0fb..1be51d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dvorak-programmers-tutorial", - "version": "2.0.4", + "version": "2.0.5", "description": "Dvorak Programmer CLI Tutorial", "bin": { "dvorak": "index.js" diff --git a/yarn.lock b/yarn.lock index 9f39f09..c12ebf3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,43 +5,36 @@ ansi-colors@^3.2.1: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== ansi-escapes@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" - integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q== dependencies: type-fest "^0.5.2" ansi-regex@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.1.0.tgz#d3ba8047b818293eaaa7978321dd61bff9842cfc" - integrity sha512-Qts4KCLKG+waHc9C4m07weIY8qyeixoS0h6RnbsNVD6Fw+pEZGW3vTyObL3WXpE09Mq4Oi7/lBEyLmOiLtlYWQ== dependencies: color-convert "^2.0.1" camel-case@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" - integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= dependencies: no-case "^2.2.0" upper-case "^1.1.1" @@ -49,7 +42,6 @@ camel-case@^3.0.0: cfonts@^2.4.5: version "2.4.5" resolved "https://registry.yarnpkg.com/cfonts/-/cfonts-2.4.5.tgz#fe7e6152b5042f5eb5b50fa935da84d4064c67d7" - integrity sha512-ExzrOeUSR27B1/qUdaP+2KlHJC4baWMppryPrqoiNdE8kEb5ygD7BamhEuplZOwMtYYAZjNnmpuSDpjPqLxRAw== dependencies: ansi-styles "^4.1.0" chalk "^2.4.2" @@ -59,7 +51,6 @@ cfonts@^2.4.5: chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -68,7 +59,6 @@ chalk@^2.4.2: change-case@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.1.0.tgz#0e611b7edc9952df2e8513b27b42de72647dd17e" - integrity sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw== dependencies: camel-case "^3.0.0" constant-case "^2.0.0" @@ -92,12 +82,10 @@ change-case@^3.1.0: chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== cli-color@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.4.0.tgz#7d10738f48526824f8fe7da51857cb0f572fe01f" - integrity sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w== dependencies: ansi-regex "^2.1.1" d "1" @@ -109,48 +97,40 @@ cli-color@^1.1.0: cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== commander@^2.9.0: version "2.20.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.1.tgz#3863ce3ca92d0831dcf2a102f5fb4b5926afd0f9" - integrity sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg== constant-case@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" - integrity sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY= dependencies: snake-case "^2.1.0" upper-case "^1.1.1" @@ -158,7 +138,6 @@ constant-case@^2.0.0: d@1, d@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== dependencies: es5-ext "^0.10.50" type "^1.0.1" @@ -166,46 +145,28 @@ d@1, d@^1.0.1: define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" dot-case@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" - integrity sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4= dependencies: no-case "^2.2.0" -dvorak-programmers-tutorial@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dvorak-programmers-tutorial/-/dvorak-programmers-tutorial-2.0.0.tgz#de066398a98d1fbb71b72aea6ad4ee59b3197831" - integrity sha512-ESyQ/+MXEUAW1uRgggUb7V6mLKhlUYeonaLPf/6Zcwb6tpJiMsqzx/HbvF4bxEs5AL67GDnfHj5LljZs5cgIkQ== - dependencies: - cfonts "^2.4.5" - cli-color "^1.1.0" - commander "^2.9.0" - enquirer "^2.3.2" - inquirer "^7.0.0" - keypress "^0.2.1" - readline "^1.3.0" - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== enquirer@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.2.tgz#1c30284907cadff5ed2404bd8396036dd3da070e" - integrity sha512-PLhTMPUXlnaIv9D3Cq3/Zr1xb7soeDDgunobyCmYLUG19n24dvC8i+ZZgm2DekGpDnx7JvFSHV7lxfM58PMtbA== dependencies: ansi-colors "^3.2.1" es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.51, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: version "0.10.51" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.51.tgz#ed2d7d9d48a12df86e0299287e93a09ff478842f" - integrity sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ== dependencies: es6-iterator "~2.0.3" es6-symbol "~3.1.1" @@ -214,7 +175,6 @@ es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@ es6-iterator@^2.0.3, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= dependencies: d "1" es5-ext "^0.10.35" @@ -223,7 +183,6 @@ es6-iterator@^2.0.3, es6-iterator@~2.0.3: es6-symbol@^3.1.1, es6-symbol@~3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.2.tgz#859fdd34f32e905ff06d752e7171ddd4444a7ed1" - integrity sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ== dependencies: d "^1.0.1" es5-ext "^0.10.51" @@ -231,7 +190,6 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.1: es6-weak-map@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== dependencies: d "1" es5-ext "^0.10.46" @@ -241,12 +199,10 @@ es6-weak-map@^2.0.2: escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= event-emitter@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= dependencies: d "1" es5-ext "~0.10.14" @@ -254,7 +210,6 @@ event-emitter@^0.3.5: external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" iconv-lite "^0.4.24" @@ -263,19 +218,16 @@ external-editor@^3.0.3: figures@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" - integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== dependencies: escape-string-regexp "^1.0.5" has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= header-case@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" - integrity sha1-lTWXMZfBRLCWE81l0xfvGZY70C0= dependencies: no-case "^2.2.0" upper-case "^1.1.3" @@ -283,14 +235,12 @@ header-case@^1.0.0: iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" inquirer@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" - integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== dependencies: ansi-escapes "^4.2.1" chalk "^2.4.2" @@ -309,26 +259,22 @@ inquirer@^7.0.0: is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-descriptor@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -337,79 +283,66 @@ is-descriptor@^1.0.0: is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-lower-case@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" - integrity sha1-fhR75HaNxGbbO/shzGCzHmrWk5M= dependencies: lower-case "^1.1.0" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-promise@^2.1, is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-upper-case@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" - integrity sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8= dependencies: upper-case "^1.1.0" keypress@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/keypress/-/keypress-0.2.1.tgz#1e80454250018dbad4c3fe94497d6e67b6269c77" - integrity sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc= kind-of@^3.0.2: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== lower-case-first@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" - integrity sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E= dependencies: lower-case "^1.1.2" lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= lru-queue@0.1: version "0.1.0" resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= dependencies: es5-ext "~0.10.2" memoizee@^0.4.14: version "0.4.14" resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" - integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== dependencies: d "1" es5-ext "^0.10.45" @@ -423,48 +356,40 @@ memoizee@^0.4.14: mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== next-tick@1, next-tick@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= no-case@^2.2.0, no-case@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" - integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== dependencies: lower-case "^1.1.1" onetime@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== dependencies: mimic-fn "^2.1.0" os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= param-case@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" - integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= dependencies: no-case "^2.2.0" pascal-case@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" - integrity sha1-LVeNNFX2YNpl7KGO+VtODekSdh4= dependencies: camel-case "^3.0.0" upper-case-first "^1.1.0" @@ -472,19 +397,16 @@ pascal-case@^2.0.0: path-case@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" - integrity sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU= dependencies: no-case "^2.2.0" readline@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" - integrity sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw= restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" signal-exit "^3.0.2" @@ -492,26 +414,22 @@ restore-cursor@^3.1.0: run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" rxjs@^6.4.0: version "6.5.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== dependencies: tslib "^1.9.0" "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sentence-case@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" - integrity sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ= dependencies: no-case "^2.2.0" upper-case-first "^1.1.2" @@ -519,19 +437,16 @@ sentence-case@^2.1.0: signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= snake-case@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" - integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= dependencies: no-case "^2.2.0" string-width@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" - integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" @@ -540,21 +455,18 @@ string-width@^4.1.0: strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" swap-case@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" - integrity sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM= dependencies: lower-case "^1.1.1" upper-case "^1.1.1" @@ -562,12 +474,10 @@ swap-case@^1.1.0: through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= timers-ext@^0.1.5: version "0.1.7" resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" - integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== dependencies: es5-ext "~0.10.46" next-tick "1" @@ -575,7 +485,6 @@ timers-ext@^0.1.5: title-case@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" - integrity sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o= dependencies: no-case "^2.2.0" upper-case "^1.0.3" @@ -583,41 +492,34 @@ title-case@^2.1.0: tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" tslib@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== type-fest@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" - integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== type@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== upper-case-first@^1.1.0, upper-case-first@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" - integrity sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU= dependencies: upper-case "^1.1.1" upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" - integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= window-size@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/window-size/-/window-size-1.1.1.tgz#9858586580ada78ab26ecd6978a6e03115c1af20" - integrity sha512-5D/9vujkmVQ7pSmc0SCBmHXbkv6eaHwXEx65MywhmUMsI8sGqJ972APq1lotfcwMKPFLuCFfL8xGHLIp7jaBmA== dependencies: define-property "^1.0.0" is-number "^3.0.0" From c15c28b59f82d5335151a0e82f33c15106c162e4 Mon Sep 17 00:00:00 2001 From: f1lt3r Date: Sat, 26 Oct 2019 22:08:42 -0400 Subject: [PATCH 2/3] right edge handling --- .index.js.swp | Bin 32768 -> 32768 bytes index.js | 12 +++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.index.js.swp b/.index.js.swp index 5ff6fd0cf7bcef99fa043970d4db930be5ab6154..9fd4ddd31ad2e7dab3052373838534411af9b03e 100644 GIT binary patch delta 974 zcmZ|NPe>GD7{~E%@%?-hzKkOT^u10NIV3w>M%)mowTWPIY=xA!??&i!!X0}TN zLXu?@9Xb^eXlWT!BvBHSfktR_C=jCPV23V2bx5+lqY@bS!e@Ag_kG@B-rti**b@nR zdQEm&@lKiN&k+o_5M`4OsvP?L^pM+@YaDlbY*Dkzt!;A+CkydZnc0(TEG=z6xOTA+ zsaSxqMMCu9Ca&Q;&f+v$QGz_!Fp(m}OFY9l)WVNHoNj%=(xaF^OFNT|vC37;qt%+0 zsmgyN+8j~qG>!MmagQ+`_ZoZKHnVe7np~fgFRXPn64rD%TN{vStXYdR7fx@IUO7*3L14PJ&3F@9QSPe@`?6*Z zQZ2G!A8w-um(Ym|C`AUGm>~Hl7{DWRqYEuKi5i69g$qfTqAPym1BP)I37klY z3lV10gbM7zGEC7r-|-p)=*K-=#3}4XA@Z>mX%LvCxqsm^USR~?FrZ^Uc3}sK;H~1} z#+QXcyvGQJ@B-J-jtGvR5k=UJHIVS&2l0*LIR;_H*@7!h)8@G9AZ@?iVDttzn!UkK XPIF&du|4I#7Ec^Vavt(!(R+UZG>gme delta 747 zcmXBSPe@cz6vy#1uji^d9xWY)~0H z;;B@_W<)KT`_!3anVPags`vC)Z+N5Jz2mt{^oA0(tJyOMh z$US6`hJ_^BA^7O08)R_>eK?E`L=l39zlO*Xcag&gQn-c$ zPN5&$@SE|x#}nMd1RPjM;t0CYf<~+|swFI90rQx_9gL#KXNz>PIfxGI!gef^<^o=z zfC=2d7zS_@^{9r9E%;F(@)oc03bV*V!GeiH*ois>;2&gJEf@KQIZQ(#hugS-7&@^Z z?eN3EFJk+N6%_FRw~$3C(!AI8=mlNn 0) { + process.stdout.write('\n'); + } + const atEdge = cursorColumn % process.stdout.columns >= + process.stdout.columns -1; + !atEdge && process.stdout.write(clc.move.left(1)); process.stdout.write(clc.erase.lineRight); process.stdout.write(pass(ch).replace(/\s/, dim('⠐'))); - process.stdout.write(dim('_')); + !atEdge && process.stdout.write(dim('_')); trace += '1'; } } else { From 6cbb710d61179fa61797420605f0f86732d4e4ff Mon Sep 17 00:00:00 2001 From: f1lt3r Date: Sat, 26 Oct 2019 23:55:04 -0400 Subject: [PATCH 3/3] fixing backspace --- .index.js.swp | Bin 32768 -> 0 bytes index.js | 37 +++++++++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 10 deletions(-) delete mode 100644 .index.js.swp diff --git a/.index.js.swp b/.index.js.swp deleted file mode 100644 index 9fd4ddd31ad2e7dab3052373838534411af9b03e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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 O=&|cHW3&?SLjMCjei~K) diff --git a/index.js b/index.js index 746f300..cbb53e8 100644 --- a/index.js +++ b/index.js @@ -273,6 +273,9 @@ function beginLesson (lines, callback) { // Begin reading keys keypress(process.stdin); function onKeyPress (ch, key) { + const cols = process.stdout.columns; + const atEdge = cursorColumn > 0 && cursorColumn % cols >= cols -1; + //atEdge && console.log('edge'); if (key && key.hasOwnProperty('name')) { // Quit on Ctrl+C @@ -287,19 +290,35 @@ function beginLesson (lines, callback) { if (key.name === 'tab') { return; } - + const modCol = cursorColumn % cols; + const byEdge = cursorColumn > 0 && modCol > cols -2; + const edge = cursorColumn > 0 && modCol === 0; + const preEdge = cursorColumn > 0 && modCol < cols; + //edge && console.log('edge'); + //adEdge && console.log('atEdge'); + //byEdge && console.log('byEdge'); if (key.name === 'backspace') { if (cursorColumn > 0) { - process.stdout.write(clc.move.left(2)); - process.stdout.write(clc.erase.lineRight); - process.stdout.write(clc.erase.lineRight); + if (byEdge) { + process.stdout.write(clc.move.left(1)); + process.stdout.write(clc.erase.lineRight); + process.stdout.write(dim('_')); + } else if (atEdge) { + process.stdout.write(clc.move.left(1)); + } else if (preEdge) { + process.stdout.write(clc.move.left(2)); + process.stdout.write(clc.erase.lineRight); + process.stdout.write(clc.erase.lineRight); + process.stdout.write(dim('_')); + } + } + cursorColumn -= 1; if (trace[cursorColumn] === '0') { lineErrors-=1; } trace = trace.substr(0, trace.length-1); - process.stdout.write(dim('_')); - } + return; } @@ -311,8 +330,6 @@ function beginLesson (lines, callback) { cursorColumn > 0) { process.stdout.write('\n'); } - const atEdge = cursorColumn % process.stdout.columns >= - process.stdout.columns -1; !atEdge && process.stdout.write(clc.move.left(1)); process.stdout.write(clc.erase.lineRight); process.stdout.write(pass(ch).replace(/\s/, dim('⠐'))); @@ -322,8 +339,8 @@ function beginLesson (lines, callback) { } else { if (!returned) { process.stdout.write('\u0007'); - process.stdout.write(clc.move.left(1)); - process.stdout.write(clc.erase.lineRight); + process.stdout.write(clc.move.left(1)); + process.stdout.write(clc.erase.lineRight); process.stdout.write(fail(ch)); process.stdout.write(dim('_')); lineErrors += 1;