{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-bp2019/src/components/widgets/lively-handwriting.js"],"names":["Morph","pt","LivelyHandwriting","initialize","windowTitle","registerButtons","addEventListener","evt","onMouseDown","extent","lively","recording","points","text","changed","setExtent","get","getExtent","height","y","width","x","fontHeight","onKeyDown","notify","charCode","onFirstButton","livelyExample","characterFromStrokes","aCollection","strokesWithDiagonals","aPointCollection","seq","map","ea","join","diag","textContent","match","pointInUpper","last","inTextArea","shiftDown","undefined","directionFromTo","aPoint","anotherPoint","directions","directionAngle","length","sub","subPt","angle","theta","Math","PI","index","round","result","alphaNumberSpaceRatio","drawOn","canvas","scale","ctx","getContext","fillStyle","fillRect","font","fillText","cursorStart","measureText","strokeStyle","lineWidth","beginPath","moveTo","lineTo","stroke","i","start","end","direction","left","right","up","down","innerHTML","capslock","setAttribute","style","debugMode","debugCanvas","document","body","querySelector","appendChild","debugLog","openWorkspace","parentElement","id","_debugLog","s","value","stopPropagation","preventDefault","onMouseMove","onMouseUp","push","getPosition","getGlobalPosition","p","isolateDirections","strokes","currentDirection","from","to","smoothingThresholdSquared","a","thinPoints","newPoints","currentPoint","lastTheta","point","distSquared","removeEventListener","originalPoints","character","lastCharacter","toUpperCase","toLowerCase","slice","applyCharacter","JSON","stringify","rawPoints","char","activeElement","target","localName","fake","pointInLeft","aNumber","stop","refX","abs","refY"],"mappings":"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","file":"lively-handwriting.js","sourcesContent":["\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport {pt} from 'src/client/graphics.js';\n\n/*MD \n\n# HandWriting \n\n## Based on Tom's Smalltalk Grafiti Implementation \n\n![](lively-handwriting.png){width=\"50%\"}\n\n## Idea: \n\n- (1) Convert Strokes to a String of Directions\n- (2) User Regular Expressions to match Characters\n\n \nMD*/\n\nexport default class LivelyHandwriting extends Morph {\n  async initialize() {\n    this.windowTitle = \"LivelyHandwriting\";\n    this.registerButtons()\n\n    // lively.html.registerKeys(this); // automatically installs handler for some methods\n\n    // lively.addEventListener(\"livelyhandwriting\", this, \"pointerdown\", evt => this.onMouseDown(evt))\n    this.addEventListener(\"pointerdown\", evt => this.onMouseDown(evt), true)\n    \n    this.extent = lively.pt(400,200)\n    this.recording = false;\n    this.points = []\n    this.text = ''\n\n    // this.debugMode = true\n    \n    this.changed()\n   // instanceVariableNames: 'points recording text'\n  }\n\n  set extent(extent) {\n    lively.setExtent(this, extent)\n    lively.setExtent(this.get(\"#content\"), extent)\n  }\n\n  get extent() {\n    return lively.getExtent(this)\n  }\n\n  get height() {\n    return lively.getExtent(this).y\n  }\n  \n  get width() {\n    return lively.getExtent(this).x\n  }\n  \n  get fontHeight() {\n    return 50\n  }\n  \n  \n  // this method is autmatically registered through the ``registerKeys`` method\n  onKeyDown(evt) {\n    lively.notify(\"Key Down!\" + evt.charCode)\n  }\n  \n  // this method is automatically registered as handler through ``registerButtons``\n  onFirstButton() {\n    lively.notify(\"hello\")\n  }\n\n  \n  async livelyExample() {\n \n  }\n  \n\n\n  characterFromStrokes(aCollection, strokesWithDiagonals,  aPointCollection) {\n     \n    let seq = aCollection.map(ea => ea[0]).join(\"\"); \n    let diag = strokesWithDiagonals.map(ea => ea[0]).join(\"\"); \n    \n    this.get(\"#log\").textContent = \"seq=\" +seq + \" diag=\" + diag\n    \n    if(diag.match(/^C$/)) {return \"\\n\"}\n    if(diag.match(/^A$/)) {return \"leftArrow\"}\n    if(diag.match(/^B$/)) {return \"rightArrow\"}\n    \n    if(seq.match(/^r$/)) {return \" \"}\n    if(seq.match(/^l$/)) {return \"\\b\"}\n\n    if(seq.match(/^ur?dl?r?$/)) {return \"A\"}\n    if(seq.match(/^durdl?rd?l$/)) {return \"B\"}\n    if(seq.match(/^u?ldru?$/)) {return \"C\"}\n    if(seq.match(/^dur?dl$/)) {\n      return this.pointInUpper(aPointCollection.last, 0.7, aPointCollection) ? \"P\" : \"D\"\n    }\n    if(seq.match(/^ld?r?l?d?r$/)) {return \"E\"}\n    if(seq.match(/^lr?d$/)) {return \"F\"}\n    if(seq.match(/^l?drul?rd?$/)) {\n      return this.pointInUpper(aPointCollection.last, 0.2, aPointCollection) ? \"Q\" : \"G\"\n    }\n    if(seq.match(/^dr?u?r?d$/)) {return \"H\"}\n    if(seq.match(/^d$/)) {\n      return this.inTextArea(aPointCollection) ? \"I\" : \"1\"\n    }\n    if(seq.match(/^dl$/)) {return \"J\"}\n    if(seq.match(/^l?dlurdr?$/)) {return \"K\"}\n    if(seq.match(/^dr$/)) {\n      return (aPointCollection.last.y > (this.height * 0.6)) ? \"L\" : \"4\" // potentially wonky, maybe relative? \n    }\n    if(seq.match(/^ur?dr?u?r?d$/)) {return \"M\"}\n    if(seq.match(/^ur?dr?u$/)) {return \"N\"}\n    \n    if(seq.match(/^l?drul$/)) {\n      return (this.pointInUpper(aPointCollection.last, 0.3, aPointCollection)) ? \"O\" : \"6\"\n    }\n\n    if(seq.match(/^dur?dl?d?r?$/)) {return \"R\"}\n    // disambiguate against 8 by checking that we ended in a low area\n    if(seq.match(/^ld?r?d?lu?r?$/) && !(this.pointInUpper(aPointCollection.last, 0.3, aPointCollection))) {\n      return \"S\"\n    }\n    if(seq.match(/^rd$/)) {\n      return this.inTextArea(aPointCollection) ? \"T\" : \"7\"\n\n      // return (this.pointInUpper(aPointCollection.last, 0.6, aPointCollection)) ? \"7\" : \"T\"\n    }\n    if(seq.match(/^drud?$/)) {return \"U\"}\n    if(seq.match(/^dur?$/)) {return \"V\"}\n    if(seq.match(/^dr?u?dr?u$/)) {return \"W\"}\n    if(seq.match(/^dlur?$/)) {return \"X\"}\n    if(seq.match(/^dru?d?l?ur?$/)) {return \"Y\"}\n    if(seq.match(/^rl?dl?d?r$/)) {\n      return this.inTextArea(aPointCollection) ? \"Z\" : \"2\"\n    }\n\n    if(seq.match(/^u$/)) {\n      this.shiftDown = !this.shiftDown;\n      return \"SHIFT\"\n    }\n    // if(seq.match(/^u$/)) {return \"1\"}\n    \n    if(seq.match(/^rdlur$/)) {return \"0\"}\n    if(seq.match(/^urdl?d?r$/)) {return \"2\"}\n    if(seq.match(/^u?rdl?d?rdlu?$/)) {return \"3\"}\n    if(seq.match(/^drdlu?$/)) {return \"5\"}\n    if(seq.match(/^u?l?dr?d?lur?u?l?$/)) {return \"8\"}\n    if(seq.match(/^ldrudl?u?r?$/)) {return \"9\"}\n\n    return undefined\n  }\n  \n//   directionFromTo(aPoint, anotherPoint) {\n//     if (!aPoint || !anotherPoint) return\n    \n//     let sub = (aPoint.subPt(anotherPoint))\n//     let delta = pt(Math.abs(sub.x), Math.abs(sub.y))\n//     if (delta.x > delta.y) {\n//       return (aPoint.x > anotherPoint.x) ? \"left\" : \"right\"\n//     } else {\n//       return (aPoint.y > anotherPoint.y) ? \"up\" : \"down\"\n//     }\n//   }\n  \n  \n  directionFromTo(aPoint, anotherPoint, directions) {\n    if (!directions) directions = [\"left\", \"up\", \"right\", \"down\"]\n    \n    if (!aPoint || !anotherPoint) return\n    \n    var directionAngle = 360 / directions.length\n    let sub = (aPoint.subPt(anotherPoint))\n    var angle = sub.theta() / (2*Math.PI) * 360\n    if (angle < 0) angle = angle + 360\n    \n    var index = Math.round(angle / directionAngle)\n    if ((index >= directions.length) || (index < 0)) index = 0\n    var result = directions[index]\n    \n    return result\n  }\n\n  get alphaNumberSpaceRatio() {\n    return 0.7\n  }\n   \n  drawOn(canvas, scale=1) {\n    var extent = lively.getExtent(this)\n    const ctx = canvas.getContext('2d');\n\n    ctx.fillStyle = \"lightgray\"\n    ctx.fillRect(0, 0, scale * extent.x, scale * extent.y)\n\n    ctx.fillStyle = \"black\"\n    ctx.font = this.fontHeight + 'px arial';\n    ctx.fillText(this.text, 0, this.fontHeight);\n    \n    var cursorStart = pt(ctx.measureText(this.text).width, 0)\n\n    ctx.strokeStyle = \"gray\"\n    ctx.lineWidth = \"1px\"\n    ctx.beginPath();\n    ctx.moveTo(this.width * this.alphaNumberSpaceRatio, scale * 0);\n    ctx.lineTo(this.width * this.alphaNumberSpaceRatio, scale * 10);\n\n    ctx.moveTo(this.width * this.alphaNumberSpaceRatio, scale * this.height);\n    ctx.lineTo(this.width * this.alphaNumberSpaceRatio, scale * this.height - 10);\n\n    ctx.stroke();\n    \n    ctx.strokeStyle = \"red\"\n    ctx.lineWidth = \"2px\"\n    ctx.beginPath();\n    ctx.moveTo(cursorStart.x,  cursorStart.y);\n    ctx.lineTo( cursorStart.x,  (cursorStart.y + this.fontHeight));\n    ctx.stroke();\n    \n    \n    for(let i=0; i < this.points.length - 1; i++) {\n      let start = this.points[i]\n      let end = this.points[i+1]\n      let direction = this.directionFromTo(start,  end)\n      \n      ctx.fillStyle = \"red\"\n      ctx.fillRect(scale * start.x - 1, scale * start.y - 1, 2, 2)\n      \n      ctx.lineWidth = \"1px\"\n      ctx.strokeStyle = ({\n          left: \"red\",\n          right: \"green\",\n          up: \"blue\",\n          down: \"gray\"\n      })[direction]\n    \n    ctx.beginPath();\n    ctx.moveTo(scale * start.x, scale * start.y);\n    ctx.lineTo(scale * end.x, scale *end.y);\n    ctx.stroke();\n    } \n  } \n  \n  \n  async changed() {\n    \n    if (this.shiftDown) {\n      this.get(\"#mode\").innerHTML = `<i class=\"fa fa-arrow-circle-o-up\" aria-hidden=\"true\"></i>`\n    } else if (this.capslock) {\n      this.get(\"#mode\").innerHTML = `<i class=\"fa fa-arrow-circle-up\" aria-hidden=\"true\"></i>`\n    } else {\n      this.get(\"#mode\").innerHTML = \"\"\n    }\n    \n    let canvas = this.get(\"canvas\")\n    var extent = lively.getExtent(this)\n    canvas.setAttribute(\"width\",  extent.x)\n    canvas.setAttribute(\"height\", extent.y)\n\n    canvas.style.width =  extent.x + \"px\"\n    canvas.style.height =  extent.y + \"px\"\n    this.drawOn(canvas)\n    \n    if (this.debugMode) {\n      \n      var debugCanvas = document.body.querySelector(\"#HandwritingDebug\") \n      if (!debugCanvas) {\n        debugCanvas = <canvas id=\"HandwritingDebug\"></canvas>\n        document.body.appendChild(debugCanvas)\n      }\n      \n      var debugLog = document.body.querySelector(\"#HandwritingDebugLog\") \n      if (!debugLog) {\n        debugLog = await lively.openWorkspace()\n        debugLog.parentElement.setAttribute(\"title\", \"Handwriting DebugLog\")\n        debugLog.id = \"HandwritingDebugLog\"\n      }\n      this._debugLog = debugLog\n\n      const ctx = debugCanvas.getContext('2d');\n        \n      var scale = 3\n     \n      debugCanvas.width =  scale * extent.x \n      debugCanvas.height = scale * extent.y \n      debugCanvas.style.width =  scale * extent.x + \"px\"\n      debugCanvas.style.height =   scale * extent.y + \"px\"\n      \n      this.drawOn(debugCanvas, scale)\n      \n      \n    }\n    \n    \n     \n  }\n  \n  debugLog(s) {\n    if (!this._debugLog) return;\n    this._debugLog.value += s + \"\\n\"\n  }\n\n  onMouseDown(evt) {\n    evt.stopPropagation()\n    evt.preventDefault()\n    \n    lively.addEventListener(\"livelyhandwriting\", document.body, \"pointermove\", evt => this.onMouseMove(evt))\n    lively.addEventListener(\"livelyhandwriting\", document.body, \"pointerup\", evt => this.onMouseUp(evt))\n    \n    \n    this.recording = true\n    this.points = []\n    this.points.push(lively.getPosition(evt).subPt(lively.getGlobalPosition(this)))\n    this.changed()\n  }\n\n  onMouseMove(evt) {\n    evt.stopPropagation()\n    evt.preventDefault()\n    \n    \n    if (!this.recording) return \n    var p = lively.getPosition(evt).subPt(lively.getGlobalPosition(this))\n    // console.log(\"p\", lively.getPosition(evt))\n    this.points.push(p)\n    this.changed()\n\n  }\n\n  isolateDirections(directions) {\n   let strokes = []\n    let currentDirection\n    for(let i=0; i < this.points.length - 1; i++) {\n      let from = this.points[i]\n      let to = this.points[i+1]\n      let direction = this.directionFromTo(from,  to, directions)\n      if (direction != currentDirection) {\n        strokes.push(direction)\n        currentDirection = direction\n      }\n    }   \n    return strokes\n  }\n  \n  smoothingThresholdSquared() {\n    var a = 20\n    return a * a\n  } \n\n//   angleThreshold() {\n//     return 20\n//   } \n\n//   thetaDEG(pointA, pointB) {\n//     var thetaDiff =  (pointA.subPt(pointB)).theta() / (2 * Math.PI) * 360\n//     return (thetaDiff + 180) % 360 - 180\n//   }\n  \n  // #TOOD a more intelligent point thining seems not to be better\n//   thinPoints(points) {\n//     // #TODO maybe use inject?\n//     let newPoints = []\n//     let currentPoint = points[0]  \n//     let smoothPoint = points[0]\n//     newPoints.push(currentPoint) \n//     let lastTheta = 0 \n//     for(let i=1; i < points.length - 1; i++) {\n//       let point = points[i]\n//       let theta =  this.thetaDEG(point, smoothPoint) \n//       let thetaDiff = (lastTheta - theta) \n            \n//       // use angle and distance to thin point list\n//       // ignore point\n      \n      \n//       if (Math.abs(thetaDiff) > this.angleThreshold())  {\n\n        \n//         currentPoint = points[i-1]\n//         lastTheta = this.thetaDEG(point, currentPoint) \n//         newPoints.push(currentPoint)   \n        \n//       } \n      \n//       if ((currentPoint.distSquared(point) < this.smoothingThresholdSquared())) {\n        \n//         smoothPoint = point\n//       }\n//       console.log(\"theta \", theta,lastTheta,  thetaDiff )\n//     }\n//     newPoints.push(points.last)\n//     return  newPoints\n//   }\n\n  thinPoints(points) {\n    let newPoints = []\n    let currentPoint = points[0]  \n    newPoints.push(currentPoint) \n    let lastTheta\n    for(let i=1; i < points.length; i++) {\n      let point = points[i]\n      let theta = (currentPoint.subPt(point)).theta\n      // use angle and distance to thin point list\n      if (currentPoint.distSquared(point) < this.smoothingThresholdSquared()) {\n        // ignore point\n      } else {\n        currentPoint = point\n        lastTheta = theta\n        newPoints.push(currentPoint)\n      }\n\n    }\n    return  newPoints\n  }\n\n  \n  onMouseUp(evt) {\n    evt.stopPropagation()\n    evt.preventDefault()\n   \n    \n    lively.removeEventListener(\"livelyhandwriting\", document.body)\n\n    this.recording = false;\n    if(this.points.length == 1) {\n      this.text = ''\n      this.changed()\n      return\n    }\n      \n    var originalPoints = this.points\n    this.points = this.thinPoints(this.points)\n  \n    let strokes = this.isolateDirections()\n    let strokesWithDiagonals = this.isolateDirections([\"left\", \"A\", \"up\", \"B\", \"right\", \"D\", \"down\", \"C\"])\n    \n    let character = this.characterFromStrokes(strokes, strokesWithDiagonals, this.points)\n    if (character) {\n      \n      if (character.length > 1) { // control symbols\n        if (character == \"SHIFT\") {\n          if (this.capslock) {\n            this.capslock =  false\n            this.shiftDown = false\n          } else {\n            if (this.lastCharacter == \"SHIFT\") {\n              this.capslock = true  \n            } else {\n              this.shiftDown = true\n            }\n          }\n          \n        } \n      \n      } else {\n        if (this.shiftDown || this.capslock) {\n          character = character.toUpperCase()\n          this.shiftDown = false\n        } else {\n          character = character.toLowerCase()\n        }\n\n        if (character == '\\b') {\n          this.text = this.text.slice(0, this.text.length - 1)\n        }  else {\n          this.text += character\n        }        \n      }\n      this.applyCharacter(character)  \n      this.lastCharacter = character\n    }\n    this.changed()\n    if (this.debugMode) {\n      this.debugLog(JSON.stringify({\n        character: character,\n        points: this.points,\n        rawPoints: originalPoints,\n        strokes: strokes,\n        strokesWithDiagonals: strokesWithDiagonals\n      }, undefined, 0))\n    }\n  }\n  \n  applyCharacter(char) {\n    var activeElement = this.target //  || lively.activeElement(document, \"lively-code-mirror\")\n    if (activeElement && activeElement.localName == \"lively-code-mirror\") {\n      activeElement.fake(char)\n    }\n  }\n\n  inTextArea(aPointCollection) {\n    return aPointCollection.last.x < (this.width * this.alphaNumberSpaceRatio)\n  }  \n  \n  pointInLeft(aPoint, aNumber, aCollection) {\n    var start = 9e8\n    var stop = 0\n    for (var point of aCollection) {\n      if (point.x < start) { start = point.x }\n      if (point.x > stop) { stop = point.x }\n    }\n    \n    let refX= aPoint.x - start;\n    return (refX / Math.abs(start - stop)) < aNumber\n  }\n\n  pointInUpper(aPoint, aNumber, aCollection) {\n\n    var start = 9e8\n    var stop = 0\n    for (var point of aCollection) {\n      if (point.y < start) {start = point.y}\n      if (point.y > stop) { stop = point.y}\n    }\n    \n    let refY = aPoint.y - start;\n    return (refY / Math.abs(start - stop)) < aNumber\n  }\n\n  \n}"]}