{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?0cd3","webpack:///./src/images/MemZayin64PaleGreen.png","webpack:///./src/components/InputPopup.vue?0170","webpack:///./src/App.vue?f7a6","webpack:///./src/components/TypingPractice.vue?cd63","webpack:///./src/components/FontPicker.vue?7e05","webpack:///./src/components/FontPicker.vue","webpack:///./src/components/FontPicker.vue?498c","webpack:///./src/components/FontPicker.vue?1a5f","webpack:///./src/components/InputPopup.vue?a31b","webpack:///./src/components/InputPopup.vue","webpack:///./src/components/InputPopup.vue?e5d5","webpack:///./src/components/InputPopup.vue?19cc","webpack:///./src/database/Library.ts","webpack:///./src/database/TypingDb.ts","webpack:///./src/components/TypingPractice.ts","webpack:///./src/components/TypingPractice.ts?cd82","webpack:///./src/components/TypingPractice.vue","webpack:///./src/App.vue","webpack:///./src/App.vue?24ba","webpack:///./src/App.vue?622c","webpack:///./src/main.ts","webpack:///./src/components/FontPicker.vue?413a","webpack:///./src/components/TypingPractice.css?225e"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","render","_vm","this","_h","$createElement","_c","_self","attrs","_m","staticRenderFns","_v","FONT_LIST","PREFERRED_FONT","on","fontHandler","directives","rawName","expression","$event","$$selectedVal","Array","filter","target","options","selected","map","val","_value","curTextsize","multiple","_l","ts","domProps","_s","isArray","showCorrections","_i","$$a","$$el","$$c","checked","$$v","$$i","concat","practiceButtonDisabled","practiceHdlr","clearButtonDisabled","clearHdlr","restartButtonDisabled","restartHdlr","typingRate","style","librarySelectListDisabled","selectedText","handleLibrarySelection","textId","saveButtonDisabled","saveHdlr","deleteButtonDisabled","deleteHdlr","refTextareaRows","refTextareaCols","PLACEHOLDER_TEXT","composing","reftext","typedPracticeText","annotatedRefLine","annotatedTypedLine","textExampleLine","practiceLineText","enterHdlr","yetToBeTypedPracticeText","validationErrorText","handleSaveName","handleCancel","_e","staticStyle","handleSelection","font","initiallySelectedFont","DEFAULT_FONTS","DEFAULT_FONT","installedFonts","undefined","fonts","sort","preferredFont","includes","getInstalledFonts","rv","testTexts","spanElt","document","createElement","textContent","getElementById","body","appendChild","styleBase","refWidths","refHeights","setAttribute","forEach","f","offsetWidth","offsetHeight","console","log","getComputedStyle","getPropertyValue","fontBeingTested","testWidths","testHeights","remove","event","$emit","FontPicker","component","title","prompt","enteredText","validationError","saveHelpText","saveButtonName","saveButtonHdlr","confirmButtonDisabled","confirmHelpText","confirmButtonName","confirmButtonHdlr","cancelButtonHdlr","default","InputPopup","db","loadLibraryTextNames","Promise","resolve","reject","txn","transaction","library","objectStore","getReq","getAll","onsuccess","libraryTexts","id","onerror","Error","error","addUpdateEntry","text","put","oncomplete","e","loadLibraryTextById","deleteEntry","delReq","delete","dbName","version","destroyed","open","openRequest","indexedDB","onupgradeneeded","oldVersion","createObjectStore","keyPath","onversionchange","close","onblocked","destroy","dReq","deleteDatabase","returnValue","getLibrary","then","catch","COLOR_ADDED","COLOR_OMITTED","COLOR_DIFFERENT","lineComplete","referenceTextLines","referenceTextNextLine","referencePaneVisble","DEFAULT_REF_TEXTAREA_ROWS","DEFAULT_REF_TEXTAREA_COLS","disablePracticeButton","textsizes","DEFAULT_TEXT_SIZE","typingPaneVisible","numTypedPracticeLines","nextYetToBeTypedPracticeLine","disableRestartButton","notStarted","showSaveNameDialog","disableSaveButton","wordsTyped","lastTimeStartedTyping","totalTypingTime","currentlyTyping","chosenFont","DATABASE_NAME","DATABASE_VERSION","database","TypingPractice","created","lib","libraryDb","texts","display","visibility","resize","rate","toFixed","showTypingPane","applyLineBreaks","stripTabs","hideReferencePane","linesToAdd","textToAdd","idx","pBox","setTimeout","focus","replace","hideTypingPane","showReferencePane","txt","loadLibraryTexts","reason","loadNamedText","saveTextToLibrary","alert","message","saveName","libraryTextsList","showTypingErrors","typedLine","annotatedEnteredLine","refTextNFD","trim","normalize","enteredTextNFD","refTextNFDGrWords","split","enteredTextNFDGrWords","done","currentRefWord","currentEnteredWord","numRefWords","numEnteredWords","errorsFound","wordsToCopy","k","diffMetric","annotatedRefWord","annotatedEnteredWord","adjacentMatch","diffWord","dM","aRW","aEW","trimEnd","enteredWord","refWord","gs","refWordNFDGr","splitGraphemes","enteredWordNFDGr","refLen","enteredLen","currentRef","currentEntered","gsToCopy","keyCode","Date","now","inputElt","search","substr","lineBreak","strTextAreaId","oTextarea","strRawValue","nEmptyWidth","scrollWidth","testBreak","strTest","findNextBreakLength","strSource","nLeft","nRight","nCurrent","Math","max","bLonger","strRawArray","strRaw","breakOffset","nLineLength","curChar","charAt","components","App","config","productionTip","h","$mount"],"mappings":"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","file":"js/app.e4ad4001.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAuIwAALiMBeKU/dgAABCRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjMwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+MzAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NjQ8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjY0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGRjOnN1YmplY3Q+CiAgICAgICAgICAgIDxyZGY6QmFnLz4KICAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNy0wMy0zMVQxOTowMzoyMzwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGl4ZWxtYXRvciAzLjY8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CuygCKkAAAgbSURBVHgB7VpbbBRVGP5mttttKYUiVwVNuUlAVLwBPrRdqBCBoDGKD2oIiYkxgAkxmIgaA0QSiDfiJfAigvKgAQQhgXCxlEJAQJFEeMA0BAgYooUCve5ud8bvTHe2s7NnbksxMc4kzfnPfzvnfPP/5/x7pkD4hAiECIQIhAiECIQIhAiECIQI/C8RiPyXVr18OdRjwOgBDyHVfg7J3pi74uUkWoXFuoKZfUqx4NZeXPfS9yMviaOyS8P6iI5PE4ex14+N0IlWY76uY1NGv52Tb1QU7NRVbEvV47RfP1Y9VwDK4hiWSOMiDYo50OloDHPa9+NPq4Og9JhZiF1sw0ku5EEoSHMC62JlWNm6B397+Squxsuajs0yPc7vZ/p6LdmA32VyJ57qJBD8hI6X2BQLmhOelEzgPCNiQ6wGM+JxFAl+0OdCK940Fi8MdURIL+5sxVW+3RNc4AfROB538qkqzuDTz1SC82txFVY42cv4BM354aQ20fF8qYaCGzTep6jY1a8ffmzaiRapnoUpQDui4QIXPtzCziP5Ns8wKqbbo4KLe14DtuYZ2BgEajUjYZmNLe26RgAn+oDUSjB1VBCcF7U0vr3RjMZYHE876mYERyOY4LV4w7WOick2zLD701SMs/NkfUbC24zUJTKZnecKADe/YXYDh/6QdBq7RQg7yA22pmGAmzwrU3D1vjJsy/ZNQkfcJL1aHVhTUo2RXnquACg6Gr0cWOQKkV/WdxYGW3g5ZEU5TomNL4cp6ag6NjTuQcIqilVjJqMnLyqsOja6mAOttvHyuq4ARBSspEUqz8qZoSbaMNtJLPYJ7hvrneQmXynCNyYt2th0jGbuf2nl+aFFikan4TE3XVcAOhtQVxTFWFXFh3TS7ObIInPcxYVOeRne4SbnHlkaRpn+eOLMTaeMY3OMyQvUpvGKm77rKWA1LKvF0EQKXzMMZ1n5ebSCt7oa8FEe38IQvpIp7OEbesTC7iFZ3LBzjCm4gLmcu/GJFOLx2aPsTnGBl3giVBJ0usp/fAMgTEURw3NcFCzloi97mDbPJhqMBcjEWd5ylrWrD2FaVxpTGYYlnJ7KTbeMoCykUpQTvsC2jn+HlChOs2q8NnAgrl/ego4BT6F/u46hWhemQMNs2s2lfRl1pQ8XOSV1GCdkwkAACAesDRo4yUlMi7VsLxLW5zj4nIzzZGkEw1vq0SQbzI1XEUdFWxq7qFPK2mJVoh47nN6a3U8mot7jXF7nXPILNAVLGZUf2+0C96NxTCqqQloUJFZjnrmTCcxxtp9Z+X5psQDanyqqxlK/NjK9khpMo48mzlG3/tH3VzJ9wQsUAXR6gDa10ShGdNThipPTIHwRzq1J7GMarGDq7A5iK9NlQTYmreEkI6HClHORx5kCU82+tXU9BayKPE4eZr+Wfy29tfjKOEq4+J18DZt7Y/FivkydRqbnG4I2H6bGeJO2t74BUNJ4IWNcfs9c9LE7KqR/RcMX3EdupQ7h80LsnWyS9cYvRutvhn6DnpFv3L4BIIrTzQGb2lFp0oW2xTWYx8W/yo3u/UJ9uNmVFnNDZElt6rQ3o69JW1vfADCnhmYNU5iUpQsgxNtg2byOiz+casBvBbjwNGn5CdeotNZU5MXD7QHACMjW+Dx3p5mOC2n563EJAR1I242F2AewOWzqEnBp7eI/AlgCmM5YfBQMgCiAGJqLhC+e90ezPu8AMW4ofuFYncK1rsoLJd8A8Ci5ZM6R0TC6tBr3mv0g7ap6TM6k0/XEQZwLYhtU9+wWJDnvk252vgFg2J+3OupSELf2fdMay1c+zP8zfis9374ligSgO8pUxq3k8Q0AbRty7HXU5PT9dhRMFKqMIrFJ3fGHJ41xEvCHlfQewjcASgT7bbOttvV9dXUNI4Ui30yvXLF7Dqqi3dBR5PcavgF4t4bHldLz1ojs2D5VuNtzAjYFhv2QDOuGTXRHuhzPAIAbbodsAN8AcPfW+NbqrE60iO23ulXoQGePU/78dVDpXbbWDQCv2dpkjoNNQslNA+4qI2ROXXl6poxW0N9Vr5eEzH1j4aUqpBEXCABeduTsA7zldb3fl65ByXxogc8bYqkT/8x0hACwFmg+gJsyq0AAdNbzlkZBq+mI+dVi0r5bvRsA6lf4trkNRUXDOEbBH04u8m9PnDQzfDq7xDyeILrMq8se6jni8loM7Eh25z79GJ/cchQsHW6ySikvOFjBuepZTPJIlr/jefov4ovanifMMAIDwAi4IQ5x8XCAQAB0pnuqRxZW0pzs9swPknEsIQifyE9vU8tfyyN8o5NmoBTIOOlnOouVBgOAEZMtn3miNJl+ZC0XXyPjB+Xx7Z9IHsRZJ7vAAPDlm2d/c8te70/a1oHTes+xSQC8osf1+4LVrwe9wU0eCADjVqX7Z6yo5bfzL5MMbkPkyOJmj7aHTNreGgWWxxdku41Dv6NvMb5zkBnsQADcbMEo0xkNvzdpP+28efyYoaPK0FWQGDwER5zs0qrz/wg42cj4BPkHp+PP1A8EAHfusYahgqYn1dyq0HTo1O74C49SZuwfDP8d4gOHky7D6gknWRB+JMIvWR5PIAC46xsRwAVsra9Hl4fvHHF2U1MMuzU5QluH49x2/vPtX+DtdU7pbhvG6AYCgLv4XTwGbxbxy43MmRuPoImr6SQnttDrHpC64rrsdh6N6baKYwXdo9zHjNXi/pI4Kt215NIy/sNVeRyD5NKQGyIQIhAiECIQIhAiECIQIhAiECIQIhAi8K8i8A8qfBj+JospSAAAAABJRU5ErkJggg==\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputPopup.vue?vue&type=style&index=0&id=3b6e9bc6&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputPopup.vue?vue&type=style&index=0&id=3b6e9bc6&scoped=true&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_vm._m(0),_c('TypingPractice')],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('header',[_c('span',[_vm._v(\"Typing Practice Tool\")]),_c('a',{attrs:{\"href\":\"http://47rooks.com\"}},[_c('img',{attrs:{\"id\":\"logo\",\"src\":require(\"./images/MemZayin64PaleGreen.png\")}})])])}]\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"typing-practice\"}},[_c('div',{attrs:{\"id\":\"control-pane\"}},[_c('ul',[_c('li',[_c('font-picker',{attrs:{\"fonts\":_vm.FONT_LIST,\"preferred-font\":_vm.PREFERRED_FONT},on:{\"selected\":_vm.fontHandler}})],1),_c('li',[_c('span',[_vm._v(\"Text size\")]),_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.curTextsize),expression:\"curTextsize\"}],on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.curTextsize=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.textsizes),function(ts){return _c('option',{key:ts,domProps:{\"value\":ts,\"selected\":ts === _vm.curTextsize ? true : false}},[_vm._v(_vm._s(ts))])}),0)]),_c('li',[_c('span',[_vm._v(\"Highlight errors\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.showCorrections),expression:\"showCorrections\"}],attrs:{\"type\":\"checkbox\",\"id\":\"show-correction\"},domProps:{\"checked\":Array.isArray(_vm.showCorrections)?_vm._i(_vm.showCorrections,null)>-1:(_vm.showCorrections)},on:{\"change\":function($event){var $$a=_vm.showCorrections,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.showCorrections=$$a.concat([$$v]))}else{$$i>-1&&(_vm.showCorrections=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.showCorrections=$$c}}}})]),_c('li',[_c('button',{attrs:{\"id\":\"practice-button\",\"type\":\"button\",\"disabled\":_vm.practiceButtonDisabled,\"title\":\"Begin practicing with this text\"},on:{\"click\":_vm.practiceHdlr}},[_vm._v(\" Practice \")])]),_c('li',[_c('button',{attrs:{\"id\":\"clear-button\",\"type\":\"button\",\"disabled\":_vm.clearButtonDisabled,\"title\":\"Clear current state and reset to initial state\"},on:{\"click\":_vm.clearHdlr}},[_vm._v(\" Clear \")])]),_c('li',[_c('button',{attrs:{\"id\":\"restart-button\",\"type\":\"Restart\",\"disabled\":_vm.restartButtonDisabled,\"title\":\"Restart the same practice text\"},on:{\"click\":_vm.restartHdlr}},[_vm._v(\" Restart \")])]),_c('li',[_c('span',[_vm._v(\"Words/minute \"+_vm._s(_vm.typingRate))])])]),_c('ul',{style:(_vm.correctionsKeyStyle)},[_vm._m(0),_vm._m(1),_vm._m(2)])]),_c('div',{attrs:{\"id\":\"library-pane\"}},[_c('ul',[_c('li',[_c('span',[_vm._v(\"Library\")]),_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedText),expression:\"selectedText\"}],attrs:{\"disabled\":_vm.librarySelectListDisabled},on:{\"change\":[function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.selectedText=$event.target.multiple ? $$selectedVal : $$selectedVal[0]},_vm.handleLibrarySelection]}},[_c('option',{attrs:{\"value\":\"none\",\"disabled\":\"\",\"hidden\":\"\"}},[_vm._v(\" Select a text from the library or paste in new text \")]),_vm._l((_vm.libraryTextsList),function(textId){return _c('option',{key:textId,domProps:{\"value\":textId}},[_vm._v(_vm._s(textId))])})],2)]),_c('li',[_c('button',{attrs:{\"id\":\"save-button\",\"type\":\"Save\",\"disabled\":_vm.saveButtonDisabled,\"title\":\"Save the current practice text to the library\"},on:{\"click\":_vm.saveHdlr}},[_vm._v(\" Save \")])]),_c('li',[_c('button',{attrs:{\"id\":\"delete-button\",\"type\":\"Delete\",\"disabled\":_vm.deleteButtonDisabled,\"title\":\"Delete the selected library text from the library\"},on:{\"click\":_vm.deleteHdlr}},[_vm._v(\" Delete \")])])])]),_c('div',{style:(_vm.referencePaneStyle),attrs:{\"id\":\"reference-pane\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.reftext),expression:\"reftext\"}],style:(_vm.textareaStyle),attrs:{\"id\":\"reference-ta\",\"rows\":_vm.refTextareaRows,\"cols\":_vm.refTextareaCols,\"placeholder\":_vm.PLACEHOLDER_TEXT},domProps:{\"value\":(_vm.reftext)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.reftext=$event.target.value}}})]),_c('div',{style:(_vm.typingPaneStyle),attrs:{\"id\":\"typing-pane\"}},[_c('div',{attrs:{\"id\":\"typing-pane-color-layer\"}},[_c('div',{attrs:{\"id\":\"typed-text-pane\"}},[_c('p',{style:(_vm.typedTextStyle),attrs:{\"id\":\"typed-text\"}},[_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.typedPracticeText)}})])]),_c('div',{style:(_vm.correctionsPaneStyle),attrs:{\"id\":\"correction-pane-vis\"}},[_c('div',{attrs:{\"id\":\"corrections-pane\"}},[_c('table',[_c('tr',[_c('td',[_vm._v(\"Reference\")]),_c('td',{attrs:{\"id\":\"annotated-ref-line\"}},[_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.annotatedRefLine)}})])]),_c('tr',[_c('td',[_vm._v(\"Typed\")]),_c('td',{attrs:{\"id\":\"annotated-typed-line\"}},[_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.annotatedTypedLine)}})])])])])]),_c('p',{attrs:{\"id\":\"ref-line\"}},[_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.textExampleLine)}})]),_c('input',{style:(_vm.practiceInputStyle),attrs:{\"id\":\"practice-line\",\"size\":\"80\"},domProps:{\"value\":_vm.practiceLineText},on:{\"keydown\":_vm.enterHdlr}}),_c('div',{attrs:{\"id\":\"yet-to-be-typed-text-pane\"}},[_c('p',{style:(_vm.typedTextStyle),attrs:{\"id\":\"yet-to-be-typed-text\"}},[_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.yetToBeTypedPracticeText)}})])])])]),(_vm.promptForSaveName)?_c('input-popup',{attrs:{\"title\":\"Save current text to library\",\"prompt\":\"Enter a name for the text\",\"save-help-text\":\"Save the current text to the library\",\"save-button-name\":\"Save\",\"validation-error\":_vm.validationErrorText,\"confirm-help-text\":\"Confirm use of name\",\"confirm-button-name\":\"Confirm\"},on:{\"input-name\":_vm.handleSaveName,\"input-cancelled\":_vm.handleCancel}}):_vm._e()],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('li',[_c('span',{staticStyle:{\"color\":\"orange\"}},[_vm._v(\"Orange text, added\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('li',[_c('span',{staticStyle:{\"color\":\"blue\"}},[_vm._v(\"Blue text, omitted, marked on reference\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('li',[_c('span',{staticStyle:{\"color\":\"red\"}},[_vm._v(\"Red text, incorrect\")])])}]\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('span',[_vm._v(\"Font\")]),_c('select',{on:{\"change\":_vm.handleSelection}},_vm._l((_vm.fontList),function(font){return _c('option',{key:font,domProps:{\"value\":font,\"selected\":font === _vm.initiallySelectedFont ? true : false}},[_vm._v(_vm._s(font))])}),0)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport {\n Component, Vue, Prop,\n} from 'vue-property-decorator';\n\n@Component\nexport default class FontPicker extends Vue {\n private DEFAULT_FONTS = ['sans-serif'];\n\n DEFAULT_FONT = 'sans-serif';\n\n @Prop() fonts!: string[];\n\n installedFonts: string[] = [];\n\n @Prop() preferredFont!: string;\n\n initiallySelectedFont!: string;\n\n /**\n * Get the list of fonts for the SELECT element.\n */\n get fontList(): string[] {\n // FIXME Testing for installed fonts commented out for now. See notes for\n // getInstalledFonts().\n // this.installedFonts = this.getInstalledFonts();\n if (this.fonts === undefined) {\n this.installedFonts = this.DEFAULT_FONTS;\n } else {\n this.installedFonts = this.fonts;\n }\n this.installedFonts.sort();\n if (this.preferredFont && this.installedFonts.includes(this.preferredFont)) {\n this.initiallySelectedFont = this.preferredFont;\n } else {\n [this.initiallySelectedFont] = this.installedFonts;\n }\n return this.installedFonts;\n }\n\n /**\n * Check that the fonts are present on this machine.\n * Checking whether a font is installed on a machine is in fact not possible from a\n * browser. The implementation below is a modification of a common but flawed approach\n * to determining whether a font is installed. It iterates over the list of fonts\n * supplied and renders a span of text and measures how wide it is. This is then compared\n * to some standard font which is assumed to be present on most machines and assumed to\n * be the fallback font. If it renders to a different length then the font must be installed.\n *\n * The weaknesses in this approach are several and it will have both false positives and\n * false negatives. Weaknesses include:\n *\n * 1. reference font is not installed, so fallback is used\n * 2. font being tested just happens to render the test string to the same number of\n * pixels\n * 3. font fallback is to a different font for different classes of fonts, serif, sans-serif\n * or monospace\n * 4. font fallback is not to the reference font, but reference font is present. If the\n * fallback font and reference font render to different widths many fonts may be\n * accepted as though installed\n * 5. test string is either too short or insufficiently complex to result in a pixel or\n * more difference in width\n *\n * Given these weaknesses this routine is not used though it is retained for future reference\n * in case it should be useful. In any case it provides a single point of testing a font\n * if another method is found.\n *\n * Note that this code below uses multiple test strings, aimed to test variations in width\n * of characters. It also experiements with multiple reference fonts but that buys one\n * nothing really as one still does not know if any are installed.\n *\n * @returns the list of fonts installed, and if none then the default list\n */\n private getInstalledFonts(): string[] {\n if (this.fonts === undefined) {\n return this.DEFAULT_FONTS;\n }\n const rv: string[] = [];\n // Create a test span in the document\n const testTexts: string[] = ['ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmonpqrstuvwxyz',\n 'IIIIIIIIIII', '..............'];\n const spanElt = document.createElement('span');\n spanElt.textContent = 'MWImwiNSns';\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const tpDiv = document.getElementById('typing-practice') as Node;\n document.body.appendChild(spanElt);\n // Get reference widths\n const styleBase = 'display: inline-block; visibility: visible; font-family: sans-serif';\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const testFonts = ['sans-serif', 'monospace', 'serif'];\n const refWidths: number[] = [];\n const refHeights: number[] = [];\n spanElt.setAttribute(\n 'style',\n styleBase,\n );\n testTexts.forEach((f) => {\n // spanElt.setAttribute(\n // 'style',\n // `${styleBase}${f}`,\n // );\n spanElt.textContent = f;\n refWidths.push(spanElt.offsetWidth);\n refHeights.push(spanElt.offsetHeight);\n console.log(`Computed style=${window.getComputedStyle(spanElt, null).getPropertyValue('font-family')}`);\n });\n console.log(`widths = ${refWidths}`);\n console.log(`heights = ${refHeights}`);\n\n // eslint-disable-next-line arrow-parens\n this.fonts.forEach(fontBeingTested => {\n // Get length of font being tested\n spanElt.setAttribute(\n 'style',\n `display: inline-block; visibility: visible; font-family: ${fontBeingTested}`,\n );\n console.log(`Computed style=${window.getComputedStyle(spanElt, null).getPropertyValue('font-family')}`);\n\n const testWidths: number[] = [];\n const testHeights: number[] = [];\n testTexts.forEach((t) => {\n spanElt.textContent = t;\n testWidths.push(spanElt.offsetWidth);\n testHeights.push(spanElt.offsetHeight);\n });\n // const testWidth = spanElt.offsetWidth;\n console.log(`font: ${fontBeingTested} testWidths = ${testWidths}`);\n console.log(`font: ${fontBeingTested} testHeights = ${testHeights}`);\n // if (!refWidths.every(() => w === testWidth)) {\n for (let i = 1; i < 4; i += 1) {\n if (refWidths[i] !== testWidths[i]) {\n rv.push(fontBeingTested);\n break;\n }\n }\n // if (refWidths !== testWidths) {\n // rv.push(fontBeingTested);\n // }\n });\n spanElt.remove();\n return rv;\n }\n\n /**\n * Forward the selection on to any @selected listener.\n */\n handleSelection(event: Event): void {\n const font = (event.target as HTMLSelectElement).value;\n this.$emit('selected', font);\n }\n}\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader/index.js??ref--13-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FontPicker.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader/index.js??ref--13-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FontPicker.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./FontPicker.vue?vue&type=template&id=cc6717fc&scoped=true&\"\nimport script from \"./FontPicker.vue?vue&type=script&lang=ts&\"\nexport * from \"./FontPicker.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FontPicker.vue?vue&type=style&index=0&id=cc6717fc&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"cc6717fc\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"input-popup-pane\"}},[_c('form',[_c('div',[_c('span',[_vm._v(_vm._s(_vm.title))])]),_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.enteredText),expression:\"enteredText\"}],attrs:{\"id\":\"input\",\"placeholder\":_vm.prompt,\"onInput\":\"\"},domProps:{\"value\":(_vm.enteredText)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.enteredText=$event.target.value}}})]),_c('div',[(_vm.validationError !== '')?_c('span',[_vm._v(\" \"+_vm._s(_vm.validationError))]):_vm._e()]),_c('div',[_c('button',{attrs:{\"id\":\"saveButton\",\"type\":\"button\",\"disabled\":_vm.saveButtonDisabled,\"title\":_vm.saveHelpText,\"value\":_vm.saveButtonName},on:{\"click\":_vm.saveButtonHdlr}},[_vm._v(\" \"+_vm._s(_vm.saveButtonName)+\" \")]),(_vm.validationError !== '')?_c('button',{attrs:{\"id\":\"confirmButton\",\"type\":\"button\",\"disabled\":_vm.confirmButtonDisabled,\"title\":_vm.confirmHelpText,\"value\":_vm.confirmButtonName},on:{\"click\":_vm.confirmButtonHdlr}},[_vm._v(\" \"+_vm._s(_vm.confirmButtonName)+\" \")]):_vm._e(),_c('button',{attrs:{\"id\":\"cancelButton\",\"type\":\"button\",\"title\":\"Cancel, abort saving\"},on:{\"click\":_vm.cancelButtonHdlr}},[_vm._v(\" Cancel \")])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport {\n Component, Vue, Prop,\n} from 'vue-property-decorator';\n\n@Component\nexport default class InputPopup extends Vue {\n @Prop({ default: 'Please set \\'title\\' attribute' }) title!: string;\n\n @Prop({ default: 'Please set \\'prompt\\' attibute' }) prompt!: string; // Prompt text string\n\n @Prop({ default: '' }) saveHelpText!: string; // Help string displayed on mouseover of button\n\n @Prop({ default: 'Ok' }) saveButtonName!: string; // Text to display on button\n\n @Prop({ default: '' }) confirmHelpText!: string; // Help string displayed on mouseover of button\n\n @Prop({ default: 'Ok' }) confirmButtonName!: string; // Text to display on button\n\n @Prop({ default: '' }) validationError!: string; // Validation error\n\n enteredText = '';\n\n /**\n * Forward the input on to any input-name listener.\n */\n saveButtonHdlr(): void {\n console.log(`Got ${this.enteredText}`);\n this.$emit('input-name', this.enteredText);\n }\n\n /**\n * Disable the save button when:\n * there is no text in the reference text area,\n * when the text in textarea is an unmodified library item\n */\n get saveButtonDisabled(): boolean {\n return this.enteredText === '';\n }\n\n /**\n * Send input-confirmed to any listeners.\n */\n confirmButtonHdlr(): void {\n console.log(`Got ${this.enteredText}`);\n this.$emit('input-confirmed', this.enteredText);\n }\n\n /**\n * Disable the save button when:\n * there is no text in the reference text area,\n * when the text in textarea is an unmodified library item\n */\n get confirmButtonDisabled(): boolean {\n return this.validationError === '';\n }\n\n /**\n * Cancel the save operation. Notify any listeners\n */\n cancelButtonHdlr(): void {\n this.$emit('input-cancelled');\n }\n}\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader/index.js??ref--13-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputPopup.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader/index.js??ref--13-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputPopup.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./InputPopup.vue?vue&type=template&id=3b6e9bc6&scoped=true&\"\nimport script from \"./InputPopup.vue?vue&type=script&lang=ts&\"\nexport * from \"./InputPopup.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./InputPopup.vue?vue&type=style&index=0&id=3b6e9bc6&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3b6e9bc6\",\n null\n \n)\n\nexport default component.exports","\nexport type LibraryText = {\n id: string;\n text: string;\n}\n\nexport default class Library {\n db: IDBDatabase;\n\n /**\n * Constructor\n *\n * This should not normally called by database clients but rather is used by the\n * Library getter on the database object.\n *\n * @param db the IDBDatabase containing this objects backing data.\n */\n constructor(db: IDBDatabase) {\n this.db = db;\n }\n\n /**\n * Get the list of names of texts stored in the Library.\n */\n public loadLibraryTextNames(): Promise {\n return new Promise((resolve, reject) => {\n // Read the list of texts\n const txn = this.db.transaction('library');\n const library = txn.objectStore('library');\n const getReq = library.getAll();\n getReq.onsuccess = () => {\n const libraryTexts: string[] = [];\n getReq.result.forEach((t) => {\n libraryTexts.push(t.id);\n });\n console.log(`Current texts=${libraryTexts}`);\n resolve(libraryTexts);\n };\n\n getReq.onerror = () => {\n reject(new Error('Failed to read texts from library.'\n + ` Will continue without it. Error = ${getReq.error}`));\n };\n });\n }\n\n\n /**\n * Add a new entry to the Library or update and existing one.\n *\n * If the name is already in the Library the entry is updated, otherwise\n * a new entry is created.\n *\n * @param name the name of the entry\n * @param text the text data\n */\n public addUpdateEntry(name: string, text: string): Promise {\n return new Promise((resolve, reject) => {\n // Read the list of texts\n const txn = this.db.transaction('library', 'readwrite');\n const library = txn.objectStore('library');\n try {\n const getReq = library.put({ id: `${name}`, text: `${text}` });\n txn.oncomplete = () => {\n resolve(this);\n };\n\n txn.onerror = () => {\n reject(new Error('Failed to save text to library.'\n + ` Will continue without it.Error = ${getReq.error} `));\n };\n } catch (e) {\n reject(new Error(`Library operation failed: ${e} `));\n }\n });\n }\n\n /**\n * Load a specified text.\n *\n * @param name the name of the text to load\n */\n public loadLibraryTextById(name: string): Promise {\n return new Promise((resolve, reject) => {\n // Read the list of texts\n const txn = this.db.transaction('library');\n const library = txn.objectStore('library');\n const getReq = library.get(`${name}`);\n getReq.onsuccess = () => {\n resolve(getReq.result);\n };\n\n getReq.onerror = () => {\n reject(new Error(`Failed to read text ${name} from library.Error = ${getReq.error} `));\n };\n });\n }\n\n /**\n * Delete the specified entry.\n *\n * @param name the name of the text to delete\n */\n public deleteEntry(name: string): Promise {\n return new Promise((resolve, reject) => {\n const txn = this.db.transaction('library', 'readwrite');\n const library = txn.objectStore('library');\n const delReq = library.delete(name);\n delReq.onsuccess = () => {\n resolve();\n };\n delReq.onerror = () => {\n reject(new Error(`Delete of '${name}' failed.Error = ${delReq.error} `));\n };\n });\n }\n}\n","import Library from './Library';\n\n/**\n * TypingDb instances are a database for the entire TypingPractice application.\n * Subsections of the database are exposed through class instances returned from\n * getters on instances of this class. Those classes encapsulate the persistence\n * operations documented in their contracts.\n */\nexport default class TypingDb {\n dbName: string;\n\n version: number;\n\n db!: IDBDatabase;\n\n destroyed: boolean;\n\n /**\n * Constructor\n * @param dbName the name of the database\n * @param version the version, initial version is 1\n */\n constructor(dbName: string, version: number) {\n this.dbName = dbName;\n this.version = version;\n this.destroyed = false;\n }\n\n /**\n * @internal\n */\n private open(): Promise {\n return new Promise((resolve, reject) => {\n if (this.destroyed) {\n reject(new Error('Cannot use a destroyed db'));\n return;\n }\n const openRequest = indexedDB.open(this.dbName, 1);\n\n openRequest.onupgradeneeded = (event: IDBVersionChangeEvent) => {\n // FIXME Handle upgrade case\n console.log('initialization required');\n const db = openRequest.result;\n switch (event.oldVersion) {\n case 0:\n // Create DB for first time\n // Create 'library' object store\n db.createObjectStore('library', { keyPath: 'id' });\n break;\n case 1:\n // At v1 - for now do nothing\n break;\n default:\n // do nothing\n }\n };\n\n openRequest.onsuccess = () => {\n const db = openRequest.result;\n\n db.onversionchange = () => {\n db.close();\n // alert('Library database is out of date. Please reload the page');\n reject();\n };\n\n this.db = db;\n resolve(true);\n };\n\n openRequest.onerror = (event: Event) => {\n // console.log(`open failed with ${event}`);\n reject(event);\n };\n\n openRequest.onblocked = () => {\n // FIXME handle blocked case\n };\n });\n }\n\n /**\n * Close the database, closing the backing store.\n */\n public close(): Promise {\n return new Promise((resolve, reject) => {\n if (this.destroyed) {\n reject(new Error('Cannot use a destroyed db'));\n return;\n }\n\n try {\n if (this.db) {\n this.db.close();\n }\n resolve(this);\n } catch (e) {\n reject(e);\n }\n });\n }\n\n /**\n * Destroy the entire database and backing store.\n * No further operations are permitted against this TypingDb instance after ```destroy()```\n * is called.\n */\n public destroy(): Promise {\n return new Promise((resolve, reject) => {\n if (this.destroyed) {\n reject(new Error('Cannot use a destroyed db'));\n return;\n }\n\n if (this.dbName) {\n const dReq = indexedDB.deleteDatabase(this.dbName);\n /* eslint-disable-next-line @typescript-eslint/no-this-alias */\n const me = this;\n dReq.onerror = function errorHndlr(event) {\n console.log(`Error deleting database. ${event}`);\n };\n\n dReq.onsuccess = function successHndlr(event) {\n console.log(`destroy() Database deleted successfully. ${event}`);\n me.destroyed = true;\n resolve();\n };\n\n dReq.onblocked = function blockHndlr(event: Event) {\n console.log('Database delete blocked');\n console.log(event.returnValue); // should be undefined\n reject(new Error(`db deletion blocked. Error=${event.returnValue}`));\n };\n } else {\n resolve();\n }\n });\n }\n\n /**\n * Get the Library instance for this database.\n */\n public getLibrary(): Promise {\n return new Promise((resolve, reject) => {\n if (this.destroyed) {\n reject(new Error('Cannot use a destroyed db'));\n return;\n }\n\n if (this.db === undefined) {\n this.open()\n .then(() => {\n console.log(`open done returning db = ${this.db}`);\n resolve(new Library(this.db));\n })\n .catch(() => {\n reject(new Error('Could not open the library'));\n });\n } else {\n console.log(`non-null returning db = ${this.db}`);\n resolve(new Library(this.db));\n }\n });\n }\n}\n","import { Component, Vue } from 'vue-property-decorator';\nimport GraphemeSplitter from 'grapheme-splitter';\nimport FontPicker from './FontPicker.vue';\nimport InputPopup from './InputPopup.vue';\nimport Library from '../database/Library';\nimport TypingDb from '../database/TypingDb';\n\nconst COLOR_ADDED = 'color:orange';\nconst COLOR_OMITTED = 'color:blue';\nconst COLOR_DIFFERENT = 'color:red';\n\n/*\n * Typing practice Vue component\n */\n@Component({\n components: {\n 'font-picker': FontPicker,\n 'input-popup': InputPopup,\n },\n})\nexport default class TypingPractice extends Vue {\n // ----------- Private-use member variables\n\n // User has finished typing the current practice line, currently indicated by\n // hitting return.\n private lineComplete = false;\n\n // Array containing lines of text that are each as long as their corresponding line\n // in the input textarea when they are wrapped. This is used to step the user through\n // the lines of the test text, in a way that looks exacctly like that text.\n private referenceTextLines: string[] = [];\n\n // Next referenceTextLines entry to display to user\n private referenceTextNextLine = 0;\n\n private referencePaneVisble = true;\n\n private readonly DEFAULT_REF_TEXTAREA_ROWS = 28;\n\n private refTextareaRows = this.DEFAULT_REF_TEXTAREA_ROWS;\n\n private readonly DEFAULT_REF_TEXTAREA_COLS = 80;\n\n private refTextareaCols = this.DEFAULT_REF_TEXTAREA_COLS;\n\n // Vue related data (member vars), computed properties (get and set)\n // Reference textarea prompt text.\n private readonly PLACEHOLDER_TEXT = `\n Welcome to the Typing Practice Tool.\n \n Paste your practice text into this window. Then choose the display font you want to use.\n Set the size. Edit out any bits of the text you don't want to practice. Resize the textarea\n to set the basic line length you want.\n \n Hit the Practice button and you will be led through the practice text one line at a time.\n Hit return at the end of each line to progress to the next line.\n \n When you are done hit the Clear button to reset and paste in new text.`;\n\n // Reference text that the user pasted in to use as a typing exercise.\n private reftext = '';\n\n // Whether to report the Practice button as disabled or not, true if disabled.\n private disablePracticeButton = false;\n\n // Text size options for reference text textarea\n private textsizes = [7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40];\n\n private readonly DEFAULT_TEXT_SIZE = 14;\n\n private curTextsize = this.DEFAULT_TEXT_SIZE;\n\n // The actual practice typing pane data.\n // Whether the pane is visible or not. Initially not.\n private typingPaneVisible = false;\n\n // The text the user has typed, ideally it matches the practice text.\n private typedPracticeText = '';\n\n private numTypedPracticeLines = 0;\n\n // Practice text that the user has not got to yet.\n private yetToBeTypedPracticeText = '';\n\n // The next line in the to-be-practiced text.\n private nextYetToBeTypedPracticeLine = 0;\n\n // The current line the user is practicing typing.\n private textExampleLine = '';\n\n // The element text that the user types. This is the user's practice for\n // the current line. It is not currently compared to the reference or checked for\n // accuracy.\n private practiceLineText = '';\n\n // Correction marking members\n private showCorrections = true;\n\n annotatedRefLine = '';\n\n annotatedTypedLine = '';\n\n // Restart button support\n disableRestartButton = false;\n\n notStarted = true;\n\n // Database for persisting application state\n database: TypingDb;\n\n // Library support\n private libraryDb!: Library;\n\n libraryTexts: string[] = [];\n\n selectedText = 'none';\n\n showSaveNameDialog = false;\n\n validationErrorText = ''; // Report validation error to dialog to reprompt for name\n\n disableSaveButton = false;\n\n // Timer support for typing rate\n private wordsTyped = 0;\n\n private lastTimeStartedTyping = 0;\n\n private totalTypingTime = 0;\n\n private currentlyTyping = false;\n\n // List of fonts to be presented by the font-picker\n FONT_LIST = [\n 'Accordance',\n 'Cardo',\n 'Times New Roman',\n 'Helvetica',\n 'Arial',\n 'sans-serif',\n ];\n\n PREFERRED_FONT = 'Accordance';\n\n // The selected font in which to render all text\n private chosenFont = this.PREFERRED_FONT;\n\n // Database name\n DATABASE_NAME = 'typingdb';\n\n // Database version\n DATABASE_VERSION = 1;\n\n constructor() {\n super();\n this.database = new TypingDb(this.DATABASE_NAME, this.DATABASE_VERSION);\n }\n\n created() {\n // Launch the library text load\n this.database.getLibrary()\n .then((lib) => {\n this.libraryDb = lib;\n lib.loadLibraryTextNames()\n .then((texts) => {\n texts.forEach((t) => this.libraryTexts.push(t));\n });\n });\n }\n\n /**\n * ---------------------------------------------------\n * Computed properties for the Reference pane - pane 1\n * ---------------------------------------------------\n */\n\n /**\n * Reference div visibility\n */\n get referencePaneStyle(): object {\n if (this.referencePaneVisble) {\n return {\n display: 'inline',\n visibility: 'visible',\n };\n }\n return {\n display: 'none',\n visibility: 'hidden',\n };\n }\n\n /**\n * Computed overall style for the textarea, which receives the practice text\n */\n get textareaStyle(): object {\n return {\n resize: 'horizontal',\n 'font-family': `${this.chosenFont}`,\n 'font-size': `${this.curTextsize}px`,\n };\n }\n\n /**\n * ---------------------------------------------------\n * Computed properties for the Practice pane - pane 2\n * ---------------------------------------------------\n */\n\n /**\n * Computed overall style for the typing pane - the app's second page\n */\n get typingPaneStyle(): object {\n if (this.typingPaneVisible) {\n return {\n 'background-color': 'red',\n display: 'inline',\n visibility: 'visible',\n 'font-family': `${this.chosenFont}`,\n };\n }\n return {\n display: 'none',\n visibility: 'hidden',\n };\n }\n\n /**\n * Computed style for the reference text before it is typed and the typed text, after\n * it is typed and scrolling up the screen.\n */\n get typedTextStyle(): object {\n return {\n 'text-align': 'justify',\n 'font-family': `${this.chosenFont}`,\n };\n }\n\n /**\n * Computed element font style\n */\n get practiceInputStyle(): object {\n return {\n 'font-family': `${this.chosenFont}; font-size: ${this.curTextsize}px`,\n };\n }\n\n /**\n * Computed visibility for corrections pane\n */\n get correctionsPaneStyle(): object {\n if (this.showCorrections && (this.annotatedRefLine !== '' || this.annotatedTypedLine !== '')) {\n return {\n display: 'inline',\n visibility: 'visible',\n };\n }\n return {\n display: 'none',\n visibility: 'hidden',\n };\n }\n\n /**\n * Computed visibility for the corrections color key\n */\n get correctionsKeyStyle() {\n if (this.showCorrections) {\n return {\n display: 'inline',\n visibility: 'visible',\n };\n }\n return {\n display: 'none',\n visibility: 'hidden',\n };\n }\n\n /**\n * Computed property for enabling the practice button.\n */\n get practiceButtonDisabled(): boolean {\n return this.reftext === '' || this.disablePracticeButton;\n }\n\n /**\n * Computed property for disabling the clear button.\n */\n get clearButtonDisabled(): boolean {\n return this.reftext === '';\n }\n\n get restartButtonDisabled(): boolean {\n return this.reftext === '' || this.notStarted;\n }\n\n /**\n * Return the typing rate in words per minute\n */\n get typingRate(): string {\n const rate = this.totalTypingTime > 0 ? this.wordsTyped / (this.totalTypingTime / 60000) : 0.0;\n return rate.toFixed(1);\n }\n\n /**\n * Handle the font selected by the user. The member variable feeds the various\n * computed properties which style their fonts.\n * @param chosenFont the font name the user chose\n */\n fontHandler(chosenFont: string): void {\n this.chosenFont = chosenFont;\n }\n\n /**\n * Handler function for the Practice button.\n * This function takes the input text and splits it into lines to present to the user\n * switches from the reference text pane to the typing pane, setting button states\n * appropriately.\n */\n practiceHdlr(): void {\n // Make the typing pane visible and populate it\n this.showTypingPane();\n // Create the array of lines to practice through\n this.referenceTextLines = this.applyLineBreaks('reference-ta');\n // Strip out tabs as they cannot be entered easily in a browser while typing\n // and they result in invisible errors being flagged.\n this.referenceTextLines = this.referenceTextLines.map((s) => TypingPractice.stripTabs(s));\n // Hide the reference-pane\n this.hideReferencePane();\n // Disable practice button\n this.disablePracticeButton = true;\n // Get the practice box, clear it and set focus\n this.textExampleLine = this.referenceTextLines[this.referenceTextNextLine];\n this.referenceTextNextLine += 1;\n this.practiceLineText = '';\n // Set up the yet-to-be-typed-text\n const linesToAdd = this.referenceTextLines.length > 6 ? 6 : this.referenceTextLines.length;\n const textToAdd = this.referenceTextLines.slice(1, linesToAdd);\n textToAdd.forEach((t, idx) => {\n if (idx === 0) {\n this.yetToBeTypedPracticeText = `${t}`;\n } else {\n this.yetToBeTypedPracticeText = `${this.yetToBeTypedPracticeText}
${t}`;\n }\n });\n this.nextYetToBeTypedPracticeLine = linesToAdd;\n\n // Enable the restart button\n this.notStarted = false;\n\n // disable Save button\n this.disableSaveButton = true;\n\n // Set focus in the text input box with a delay so it renders before focus is made.\n const pBox = document.getElementById('practice-line') as HTMLInputElement;\n setTimeout(() => {\n pBox.focus();\n }, 30);\n }\n\n /**\n * Replace tabs in a string with a space and then replace all multiple spaces with just one.\n * @param s string to replace spaces in.\n */\n private static stripTabs(s: string): string {\n let rv = '';\n // first convert tabs to spaces\n rv = s.replace(/\\t/g, ' ');\n // convert any multiple spaces to single ones\n rv = rv.replace(/ +/, ' ');\n return rv;\n }\n\n /**\n * Handler function for the Clear button.\n * This function resets all state and switches back to the reference text paste-in page.\n */\n clearHdlr(): void {\n this.reftext = '';\n // enable the Practice and Clear buttons\n this.disablePracticeButton = false;\n\n this.hideTypingPane();\n this.showReferencePane();\n // Reset the practice text variables\n this.practiceLineText = '';\n this.referenceTextLines = [];\n this.referenceTextNextLine = 0;\n this.textExampleLine = '';\n this.lineComplete = false;\n this.typedPracticeText = '';\n this.numTypedPracticeLines = 0;\n // Reset default text input box parameters\n this.curTextsize = this.DEFAULT_TEXT_SIZE;\n this.refTextareaCols = this.DEFAULT_REF_TEXTAREA_COLS;\n this.refTextareaRows = this.DEFAULT_REF_TEXTAREA_ROWS;\n // Reset corrections pane\n this.annotatedTypedLine = '';\n this.annotatedRefLine = '';\n // Reset timing\n this.currentlyTyping = false;\n this.lastTimeStartedTyping = 0;\n this.totalTypingTime = 0;\n this.wordsTyped = 0;\n // Clear the restart button\n this.notStarted = true;\n // Reset library selection\n this.selectedText = 'none';\n this.disableSaveButton = false;\n }\n\n restartHdlr(): void {\n const txt = this.reftext;\n this.clearHdlr();\n this.reftext = txt;\n }\n\n /**\n * Disable the save button when:\n * there is no text in the reference text area,\n * when the text in textarea is an unmodified library item,\n * when in practice mode\n */\n get saveButtonDisabled(): boolean {\n return this.reftext === '' || this.disablePracticeButton;\n }\n\n /**\n * Disable the delete button when:\n * there is no selected text,\n * when in practice mode\n */\n get deleteButtonDisabled(): boolean {\n return this.selectedText === 'none';\n }\n\n /**\n * Disabled when there is no library, or once a text is in use\n */\n get librarySelectListDisabled(): boolean {\n return this.libraryTexts?.length === 0;\n }\n\n /**\n * Get the list of saved library texts\n */\n private loadLibraryTexts(): void {\n if (this.libraryDb) {\n this.libraryDb.loadLibraryTextNames()\n .then((texts) => {\n this.libraryTexts = texts;\n })\n .catch((reason: Error) => {\n this.libraryTexts = [];\n });\n } else {\n this.libraryTexts = [];\n }\n }\n\n get libraryTextsList(): string[] {\n return this.libraryTexts;\n }\n\n /**\n * Load a specific library text as the practice text\n */\n private loadNamedText(textId: string): void {\n this.libraryDb.loadLibraryTextById(textId)\n .then((text) => {\n this.reftext = text.text;\n });\n }\n\n /**\n * Handle the text selection - retrieve the selected text.\n */\n handleLibrarySelection(event: Event): void {\n const textId = (event.target as HTMLSelectElement).value;\n // Load the selected text\n this.loadNamedText(textId);\n }\n\n private saveTextToLibrary(name: string) {\n if (this.libraryDb) {\n this.libraryDb.addUpdateEntry(name, this.reftext)\n .catch((reason: Error) => {\n alert(`Failed to save text. Reason ${reason.message}`);\n });\n } else {\n alert('No library reference - not saving');\n }\n }\n\n /**\n * Receive and handle the name to save the current text.\n */\n handleSaveName(saveName: string): void {\n if (this.libraryTextsList.includes(saveName)) {\n this.validationErrorText = `Name ${saveName} already in use. Enter new name or confirm overwrite ?`;\n return;\n }\n this.showSaveNameDialog = false;\n this.saveTextToLibrary(saveName);\n this.loadLibraryTexts();\n }\n\n /**\n * Vue computed property to determine whether to display the popup to prompt for the\n * name to save the text under or not.\n */\n get promptForSaveName(): boolean {\n return this.showSaveNameDialog;\n }\n\n /**\n * Handle the Save button click\n */\n saveHdlr(): void {\n this.showSaveNameDialog = true;\n }\n\n /**\n * Delete the selected text from the library.\n */\n deleteHdlr(): void {\n this.libraryDb.deleteEntry(this.selectedText)\n .then(() => {\n this.loadLibraryTexts();\n this.reftext = '';\n this.selectedText = 'none';\n });\n }\n\n handleCancel(): void {\n this.showSaveNameDialog = false;\n }\n\n /**\n * This function is called from the enterHdlr function to ensure that the character entered\n * matches the corresponding one in the practice text.\n * @param event KeyboardEvent for the key release\n */\n showTypingErrors(typedLine: string): void {\n // const f = this.curTextsize;\n // const gs = new GraphemeSplitter();\n // let annotatedEnteredLine = '';\n // let annotatedRefLine = '';\n let annotatedEnteredLine = '';\n let annotatedRefLine = '';\n const refTextNFD = this.textExampleLine.trim().normalize('NFD');\n const enteredTextNFD = typedLine.trim().normalize('NFD');\n // Split on whitespace to get \"words\" - this constrains the corrections so we don't\n // incorrectly mark the whole remaining string in error if characters are added or\n // omitted in a word.\n const refTextNFDGrWords: string[] = refTextNFD.split(' ');\n const enteredTextNFDGrWords: string[] = enteredTextNFD.split(' ');\n let done = false;\n let currentRefWord = 0;\n let currentEnteredWord = 0;\n const numRefWords = refTextNFDGrWords.length;\n const numEnteredWords = enteredTextNFDGrWords.length;\n let errorsFound = false;\n\n while (!done) {\n if (currentRefWord === numRefWords && currentEnteredWord < numEnteredWords) {\n // entered line has more words than reference\n annotatedEnteredLine += ``;\n const wordsToCopy = numEnteredWords - currentEnteredWord;\n for (let k = 0; k < wordsToCopy; k += 1) {\n annotatedEnteredLine += `${enteredTextNFDGrWords[currentEnteredWord + k]} `;\n }\n annotatedEnteredLine += '';\n currentEnteredWord += wordsToCopy;\n errorsFound = true;\n } else if (currentRefWord < numRefWords && currentEnteredWord === numEnteredWords) {\n // reference line has more words than the typed line\n annotatedRefLine += ``;\n const wordsToCopy = numRefWords - currentRefWord;\n for (let k = 0; k < wordsToCopy; k += 1) {\n annotatedRefLine += `${refTextNFDGrWords[currentRefWord + k]} `;\n }\n annotatedRefLine += '';\n currentRefWord += wordsToCopy;\n errorsFound = true;\n } else {\n const { diffMetric, annotatedRefWord, annotatedEnteredWord } = TypingPractice.diffWord(\n enteredTextNFDGrWords[currentEnteredWord], refTextNFDGrWords[currentRefWord],\n );\n if (diffMetric === 0) {\n // current words match\n annotatedEnteredLine += `${annotatedEnteredWord} `;\n annotatedRefLine += `${annotatedRefWord} `;\n currentRefWord += 1;\n currentEnteredWord += 1;\n } else {\n errorsFound = true;\n let adjacentMatch = false;\n if (currentRefWord + 1 < numRefWords) {\n // entered line is missing word in the current slot\n const rv = TypingPractice.diffWord(\n enteredTextNFDGrWords[currentEnteredWord], refTextNFDGrWords[currentRefWord + 1],\n );\n const { diffMetric: dM, annotatedRefWord: aRW, annotatedEnteredWord: aEW } = rv;\n if (dM === 0) {\n annotatedRefLine += `${refTextNFDGrWords[currentRefWord]} `;\n annotatedRefLine += `${aRW} `;\n currentRefWord += 2;\n annotatedEnteredLine += `${aEW} `;\n currentEnteredWord += 1;\n adjacentMatch = true;\n }\n }\n if (currentEnteredWord + 1 < numEnteredWords && !adjacentMatch) {\n // entered line has an extra word in the current slot\n const rv = TypingPractice.diffWord(\n enteredTextNFDGrWords[currentEnteredWord + 1], refTextNFDGrWords[currentRefWord],\n );\n const { diffMetric: dM, annotatedRefWord: aRW, annotatedEnteredWord: aEW } = rv;\n if (dM === 0) {\n annotatedEnteredLine += `${enteredTextNFDGrWords[currentEnteredWord]} `;\n annotatedEnteredLine += `${aEW} `;\n currentEnteredWord += 2;\n annotatedRefLine += `${aRW} `;\n currentRefWord += 1;\n adjacentMatch = true;\n }\n }\n if (!adjacentMatch) {\n // Just this word is wrong or there are multiple errors in sequence - give up for now\n // Assume the former and update reference as ok and entered as different\n annotatedRefLine += `${annotatedRefWord} `;\n // annotatedEnteredLine +=\n // `${annotatedEnteredWord} `;\n annotatedEnteredLine += `${annotatedEnteredWord} `;\n currentRefWord += 1;\n currentEnteredWord += 1;\n }\n }\n }\n\n // Check termination condition for diffing\n if (currentRefWord >= numRefWords && currentEnteredWord >= numEnteredWords) {\n done = true;\n }\n }\n if (errorsFound) {\n this.annotatedRefLine = annotatedRefLine.trimEnd();\n this.annotatedTypedLine = annotatedEnteredLine.trimEnd();\n } else {\n this.annotatedRefLine = '';\n this.annotatedTypedLine = '';\n }\n }\n\n private static diffWord(enteredWord: string, refWord: string): {\n diffMetric: number; annotatedRefWord: string; annotatedEnteredWord: string;\n } {\n const gs = new GraphemeSplitter();\n const refWordNFDGr: string[] = gs.splitGraphemes(refWord);\n const enteredWordNFDGr: string[] = gs.splitGraphemes(enteredWord);\n // let annotatedEnteredWord = '';\n // let annotatedRefWord = '';\n let annotatedEnteredWord = '';\n let annotatedRefWord = '';\n const refLen = refWordNFDGr.length;\n const enteredLen = enteredWordNFDGr.length;\n // const checkedRef: boolean[] = [];\n // const checkedEntered: boolean[] = [];\n let currentRef = 0;\n let currentEntered = 0;\n let done = false;\n let diffMetric = 0;\n\n while (!done) {\n if (currentRef === refLen && currentEntered < enteredLen) {\n // Extra graphemes left over in entered word\n annotatedEnteredWord += ``;\n const gsToCopy = enteredLen - currentEntered;\n for (let k = 0; k < gsToCopy; k += 1) {\n annotatedEnteredWord += enteredWordNFDGr[currentEntered + k];\n }\n annotatedEnteredWord += '';\n currentEntered += gsToCopy;\n diffMetric = 1;\n } else if (currentRef < refLen && currentEntered === enteredLen) {\n // Extra graphemes left over in the reference word\n annotatedRefWord += ``;\n const gsToCopy = refLen - currentRef;\n for (let k = 0; k < gsToCopy; k += 1) {\n annotatedRefWord += refWordNFDGr[currentRef + k];\n }\n annotatedRefWord += '';\n currentRef += gsToCopy;\n diffMetric = 1;\n } else if (refWordNFDGr[currentRef] === enteredWordNFDGr[currentEntered]) {\n // current graphemes match\n annotatedEnteredWord += `${enteredWordNFDGr[currentEntered]}`;\n annotatedRefWord += refWordNFDGr[currentRef];\n currentRef += 1;\n currentEntered += 1;\n } else if (currentRef + 1 < refLen\n && refWordNFDGr[currentRef + 1] === enteredWordNFDGr[currentEntered]) {\n // entered word is missing character in the current slot\n annotatedRefWord += `${refWordNFDGr[currentRef]}`;\n annotatedRefWord += refWordNFDGr[currentRef + 1];\n currentRef += 2;\n annotatedEnteredWord += `${enteredWordNFDGr[currentEntered]}`;\n currentEntered += 1;\n diffMetric = 1;\n } else if (currentEntered + 1 < enteredLen\n && refWordNFDGr[currentRef] === enteredWordNFDGr[currentEntered + 1]) {\n // entered word has an extra character in the current slot\n annotatedEnteredWord += `${enteredWordNFDGr[currentEntered]}`;\n annotatedEnteredWord += enteredWordNFDGr[currentEntered + 1];\n currentEntered += 2;\n annotatedRefWord += `${refWordNFDGr[currentRef]}`;\n currentRef += 1;\n diffMetric = 1;\n } else {\n // Just this character is wrong or there are multiple errors in sequence - give up for now\n // Assume the former and update reference as ok and entered as different\n annotatedRefWord += refWordNFDGr[currentRef];\n annotatedEnteredWord += `${enteredWordNFDGr[currentEntered]}`;\n currentRef += 1;\n currentEntered += 1;\n diffMetric = 1;\n }\n\n // Check termination condition for diffing\n if (currentRef >= refLen && currentEntered >= enteredLen) {\n done = true;\n }\n }\n // annotatedRefWord += '';\n // annotatedEnteredWord += '';\n return { diffMetric, annotatedRefWord, annotatedEnteredWord };\n }\n\n /**\n * Handler function for the end of each typed line.\n * This function handles the end of line:\n * - moving the typed text from the input box to the output text\n * - moving the next line in from the yet-to-be-typed text\n * - handles intervening blank lines\n * - handles completion of the practice text\n * @param event event containing the typed character\n */\n enterHdlr(event: KeyboardEvent): void {\n if (event && event.keyCode === 13) {\n // Halt the timer and add the time to the total\n this.totalTypingTime += Date.now() - this.lastTimeStartedTyping;\n this.currentlyTyping = false;\n\n // Get entered text\n const inputElt = document.getElementById('practice-line') as HTMLInputElement;\n\n // Update the number of words typed\n this.wordsTyped += inputElt.value.split(' ').length;\n\n // Validate entered line against the practice text line\n if (this.showCorrections) {\n this.showTypingErrors(inputElt.value);\n }\n\n // let textToAdd = inputElt.value;\n let textToAdd = this.textExampleLine;\n\n // Copy line to typed area\n if (textToAdd.length === 0 || textToAdd === '\\n' || textToAdd === '') {\n textToAdd = ' ';\n }\n if (this.typedPracticeText.length > 0) {\n if (this.numTypedPracticeLines > 4) {\n const idx = this.typedPracticeText.search('
') + 4;\n this.typedPracticeText = this.typedPracticeText.substr(idx);\n }\n this.typedPracticeText = `${this.typedPracticeText}
${textToAdd}`;\n // this.typedPracticeText = `${this.typedPracticeText}
${correctedText}`;\n } else {\n this.typedPracticeText = textToAdd;\n // this.typedPracticeText = correctedText;\n }\n this.numTypedPracticeLines += 1;\n\n // Exit if we are done.\n if (this.referenceTextNextLine >= this.referenceTextLines.length) {\n this.textExampleLine = 'You are done';\n return;\n }\n\n // Display next copy line\n this.textExampleLine = this.referenceTextLines[this.referenceTextNextLine];\n if (this.textExampleLine.length === 0 || this.textExampleLine === '\\n' || this.textExampleLine === '') {\n this.textExampleLine = ' ';\n }\n this.referenceTextNextLine += 1;\n this.practiceLineText = '';\n\n // Shuffle the yet-to-be-typed-text\n const lineBreak = '
';\n let idx = this.yetToBeTypedPracticeText.search(lineBreak);\n if (idx === -1) {\n this.yetToBeTypedPracticeText = '';\n } else {\n idx += lineBreak.length;\n this.yetToBeTypedPracticeText = this.yetToBeTypedPracticeText.substr(idx);\n if (this.nextYetToBeTypedPracticeLine < this.referenceTextLines.length) {\n textToAdd = this.referenceTextLines[this.nextYetToBeTypedPracticeLine];\n if (textToAdd.length === 0 || textToAdd === '\\n' || textToAdd === '') {\n textToAdd = ' ';\n }\n this.yetToBeTypedPracticeText = `${this.yetToBeTypedPracticeText}
${textToAdd}`;\n this.nextYetToBeTypedPracticeLine += 1;\n }\n }\n } else if (!this.currentlyTyping) {\n this.lastTimeStartedTyping = Date.now();\n this.currentlyTyping = true;\n }\n }\n\n /**\n * Create a list of lines broken as the textarea breaks them.\n * This is done by cloning the text area and using the clone as a way to test\n * each line break. This technique is an adaptation of the code found at:\n * https://stackoverflow.com/questions/4719777/finding-line-breaks-in-textarea-that-is-word-wrapping-arabic-text\n * Many thanx to the contributors.\n * Apart from using a separate area and not replacing the original which I need to keep\n * this version:\n * is adjusted to handle, and retain, blank lines in the input text,\n * is converted to Typescript\n * fixes the bug where the original would move the last word of a line to the next\n * line if the breaking character was whitespace. Actually it only moves the bug\n * to cause the break too early in some cases.\n */\n /* eslint-disable-next-line class-methods-use-this */\n private applyLineBreaks(strTextAreaId: string): string[] {\n // Clone the textarea so that we can use the clone to size the lines\n const oTextarea = document.getElementById(\n strTextAreaId,\n ) as HTMLTextAreaElement;\n oTextarea.setAttribute('wrap', 'off');\n\n // Get the textarea raw string and scrollwidth,\n // zero out the textarea so we can use it to size the lines\n const strRawValue = oTextarea.value;\n oTextarea.value = '';\n const nEmptyWidth = oTextarea.scrollWidth;\n\n /**\n * Check if the string is rendered wider than the width of the textarea.\n * @param oTextarea test area to render the string in\n * @param nEmptyWidth the width of the test textarea empty, that is, where the break should be\n * @param strTest string to test\n * @returns true if it does render wider, false if not.\n */\n function testBreak(strTest: string): boolean {\n /* eslint-disable no-param-reassign */\n oTextarea.value = strTest;\n return oTextarea.scrollWidth > nEmptyWidth;\n }\n\n /**\n * Find the next break. This uses recursion to break the string up. Hopefully the\n * stack doesn't blow with large strings. If necessary we'll unroll it.\n * @param strSource string to place breaks in\n * @param oTextarea textarea to test rendering in\n * @param nEmptyWidth the width of the test textarea empty, that is, where the break should be\n * @param nLeft the current left hand end of the approximation of the line break location\n * @param nRight the current right hand end of the approximation of the line break location\n */\n function findNextBreakLength(strSource: string,\n nLeft?: number, nRight?: number): number | null {\n let nCurrent: number;\n if (typeof (nLeft) === 'undefined' || typeof (nRight) === 'undefined') {\n // Set initial estimates on first call.\n nLeft = 0;\n nRight = -1;\n nCurrent = 64;\n } else if (nRight === -1) {\n nCurrent = nLeft * 2;\n } else if (nRight - nLeft <= 1) {\n // Termination condition, nRight holds the break location if > 2, else break at 2.\n return Math.max(2, nRight);\n } else {\n nCurrent = nLeft + (nRight - nLeft) / 2;\n }\n\n const strTest = strSource.substr(0, nCurrent);\n const bLonger = testBreak(strTest);\n if (bLonger) {\n nRight = nCurrent;\n } else {\n if (nCurrent >= strSource.length) {\n return null;\n }\n nLeft = nCurrent;\n }\n return findNextBreakLength(strSource, nLeft, nRight);\n }\n\n // Return arrays of strings - each string is broken at or before the width of the\n // input textarea, on word boundaries (whitespace delimited sequences of non-whitespace chars),\n // with n:1 grapheme composition accounted for.\n const rv: string[] = [];\n\n const strRawArray = strRawValue.split('\\n');\n strRawArray.forEach((strRaw) => {\n let i = 0;\n let j: number;\n if (strRaw.length === 0) {\n rv.push('\\n');\n } else {\n while (i < strRaw.length) {\n const breakOffset = findNextBreakLength(strRaw.substr(i));\n if (breakOffset === null) {\n // Terminate iteration - we are at the end of the input text.\n rv.push(strRaw.substr(i));\n break;\n }\n\n // Now backoff from the break point to the nearest preceding whitespace\n let nLineLength = breakOffset;\n for (j = nLineLength - 1; j >= 0; j -= 1) {\n const curChar = strRaw.charAt(i + j);\n if (curChar === ' ' || curChar === '-' || curChar === '+') {\n nLineLength = j + 1;\n break;\n }\n }\n rv.push(strRaw.substr(i, nLineLength));\n i += nLineLength;\n }\n }\n });\n oTextarea.setAttribute('wrap', 'on');\n oTextarea.value = '';\n return rv;\n }\n\n private showTypingPane(): void {\n this.typingPaneVisible = true;\n }\n\n private hideTypingPane(): void {\n this.typingPaneVisible = false;\n }\n\n private showReferencePane(): void {\n this.referencePaneVisble = true;\n }\n\n private hideReferencePane(): void {\n this.referencePaneVisble = false;\n }\n}\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader/index.js??ref--13-2!../../node_modules/@vue/cli-plugin-eslint/node_modules/eslint-loader/index.js??ref--12-0!./TypingPractice.ts?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader/index.js??ref--13-2!../../node_modules/@vue/cli-plugin-eslint/node_modules/eslint-loader/index.js??ref--12-0!./TypingPractice.ts?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./TypingPractice.vue?vue&type=template&id=d0a97aae&scoped=true&\"\nimport script from \"./TypingPractice.ts?vue&type=script&lang=ts&\"\nexport * from \"./TypingPractice.ts?vue&type=script&lang=ts&\"\nimport style0 from \"./TypingPractice.css?vue&type=style&index=0&id=d0a97aae&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d0a97aae\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n\n\n\n\n\n\n\n\nimport { Component, Vue } from 'vue-property-decorator';\nimport TypingPractice from '@/components/TypingPractice.vue';\n\n@Component({\n name: 'App',\n components: {\n TypingPractice,\n },\n})\nexport default class App extends Vue {}\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--13-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader/index.js??ref--13-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--13-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader/index.js??ref--13-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=f316014e&\"\nimport script from \"./App.vue?vue&type=script&lang=ts&\"\nexport * from \"./App.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import Vue from 'vue';\nimport App from './App.vue';\n\nVue.config.productionTip = false;\n\nnew Vue({\n render: (h) => h(App),\n}).$mount('#app');\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FontPicker.vue?vue&type=style&index=0&id=cc6717fc&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FontPicker.vue?vue&type=style&index=0&id=cc6717fc&scoped=true&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!./TypingPractice.css?vue&type=style&index=0&id=d0a97aae&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!./TypingPractice.css?vue&type=style&index=0&id=d0a97aae&scoped=true&lang=css&\""],"sourceRoot":""}