{"version":3,"sources":["../yjs/node_modules/browser-pack/_prelude.js","src/Text.js"],"names":[],"mappings":"AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"y-text.es6","sourceRoot":"/source/","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})","/* global Y, Element */\n'use strict'\n\nfunction extend (Y) {\n  Y.requestModules(['Array']).then(function () {\n    class YText extends Y.Array.typeDefinition['class'] {\n      constructor (os, _model, _content) {\n        super(os, _model, _content)\n        this.textfields = []\n        this.aceInstances = []\n      }\n      _destroy () {\n        this.unbindAll()\n        this.textfields = null\n        this.aceInstances = null\n        super._destroy()\n      }\n      toString () {\n        return this._content.map(function (c) {\n          return c.val\n        }).join('')\n      }\n      insert (pos, content) {\n        super.insert(pos, content.split(''))\n      }\n      unbindAll () {\n        for (let i = this.textfields.length - 1; i >= 0; i--) {\n          this.unbindTextarea(this.textfields[i].editor)\n        }\n        for (let i = this.aceInstances.length - 1; i >= 0; i--) {\n          this.unbindAce(this.aceInstances[i].editor)\n        }\n      }\n      unbindAce (ace) {\n        var i = this.aceInstances.findIndex(function (binding) {\n          return binding.editor === ace\n        })\n        if (i >= 0) {\n          var binding = this.aceInstances[i]\n          this.unobserve(binding.yCallback)\n          binding.editor.off('change', binding.aceCallback)\n          this.aceInstances.splice(i, 1)\n        }\n      }\n      bindAce (ace, options) {\n        var self = this\n\n        // this function makes sure that either the\n        // ace event is executed, or the yjs observer is executed\n        var token = true\n        function mutualExcluse (f) {\n          if (token) {\n            token = false\n            try {\n              f()\n            } catch (e) {\n              token = true\n              throw new Error(e)\n            }\n            token = true\n          }\n        }\n        ace.markers = []\n        var disableMarkers = false\n\n        if (typeof options === 'object') {\n          if (typeof options.disableMarkers !== 'undefined') {\n            disableMarkers = options.disableMarkers\n          }\n        }\n\n        ace.setValue(this.toString())\n\n        function aceCallback (delta) {\n          mutualExcluse(function () {\n            var start = 0\n            var length = 0\n\n            var aceDocument = ace.getSession().getDocument()\n            if (delta.action === 'insert') {\n              start = aceDocument.positionToIndex(delta.start, 0)\n              self.insert(start, delta.lines.join('\\n'))\n            } else if (delta.action === 'remove') {\n              start = aceDocument.positionToIndex(delta.start, 0)\n              length = delta.lines.join('\\n').length\n              self.delete(start, length)\n            }\n          })\n        }\n        ace.on('change', aceCallback)\n\n        if (!disableMarkers) {\n          if (this.inteval) {\n            clearInterval(this.inteval)\n          }\n          this.inteval = setInterval(function () {\n            var i = 0\n            var now = Date.now()\n            var timeVisible = 800\n\n            while (i < ace.markers.length) {\n              var marker = ace.markers[i]\n\n              if (marker.timestamp + timeVisible < now) {\n                ace.getSession().removeMarker(marker.id)\n                ace.markers.splice(i, 1)\n                i--\n              }\n              i++\n            }\n          }, 1000)\n        }\n        var Range = window.ace.require('ace/range').Range\n        function setMarker (start, end, klazz) {\n          if (disableMarkers) {\n            return\n          }\n          var offset = 0\n          if (start.row === end.row && start.column === end.column) {\n            offset = 1\n          }\n          var range = new Range(start.row, start.column, end.row, end.column + offset)\n          var marker = ace.session.addMarker(range, klazz, 'text')\n          ace.markers.push({id: marker, timestamp: Date.now()})\n        }\n\n        function yCallback (event) {\n          var aceDocument = ace.getSession().getDocument()\n          mutualExcluse(function () {\n            if (event.type === 'insert') {\n              let start = aceDocument.indexToPosition(event.index, 0)\n              let end = aceDocument.indexToPosition(event.index + event.length, 0)\n              aceDocument.insert(start, event.values.join(''))\n\n              setMarker(start, end, 'inserted')\n            } else if (event.type === 'delete') {\n              let start = aceDocument.indexToPosition(event.index, 0)\n              let end = aceDocument.indexToPosition(event.index + event.length, 0)\n              var range = new Range(start.row, start.column, end.row, end.column)\n              aceDocument.remove(range)\n\n              setMarker(start, end, 'deleted')\n            }\n          })\n        }\n        this.observe(yCallback)\n        this.aceInstances.push({\n          editor: ace,\n          yCallback: yCallback,\n          aceCallback: aceCallback\n        })\n      }\n      bind () {\n        var e = arguments[0]\n        if (e instanceof Element) {\n          this.bindTextarea.apply(this, arguments)\n        } else if (e != null && e.session != null && e.getSession != null && e.setValue != null) {\n          this.bindAce.apply(this, arguments)\n        } else {\n          console.error('Cannot bind, unsupported editor!')\n        }\n      }\n      unbindTextarea (textarea) {\n        var i = this.textfields.findIndex(function (binding) {\n          return binding.editor === textarea\n        })\n        if (i >= 0) {\n          var binding = this.textfields[i]\n          this.unobserve(binding.yCallback)\n          var e = binding.editor\n          e.onkeydown = null\n          e.onkeyup = null\n          e.onkeypress = null\n          e.onpaste = null\n          e.oncut = null\n          this.textfields.splice(i, 1)\n        }\n      }\n      bindTextarea (textfield, domRoot) {\n        domRoot = domRoot || window; // eslint-disable-line\n        if (domRoot.getSelection == null) {\n          domRoot = window; // eslint-disable-line\n        }\n\n        // don't duplicate!\n        for (var t = 0; t < this.textfields.length; t++) {\n          if (this.textfields[t].editor === textfield) {\n            return\n          }\n        }\n        var creatorToken = false\n\n        var word = this\n        textfield.value = this.toString()\n\n        var createRange, writeRange, writeContent\n        if (textfield.selectionStart != null && textfield.setSelectionRange != null) {\n          createRange = function (fix) {\n            var left = textfield.selectionStart\n            var right = textfield.selectionEnd\n            if (fix != null) {\n              left = fix(left)\n              right = fix(right)\n            }\n            return {\n              left: left,\n              right: right\n            }\n          }\n          writeRange = function (range) {\n            writeContent(word.toString())\n            textfield.setSelectionRange(range.left, range.right)\n          }\n          writeContent = function (content) {\n            textfield.value = content\n          }\n        } else {\n          createRange = function (fix) {\n            var range = {}\n            var s = domRoot.getSelection()\n            var clength = textfield.textContent.length\n            range.left = Math.min(s.anchorOffset, clength)\n            range.right = Math.min(s.focusOffset, clength)\n            if (fix != null) {\n              range.left = fix(range.left)\n              range.right = fix(range.right)\n            }\n            var editedElement = s.focusNode\n            if (editedElement === textfield || editedElement === textfield.childNodes[0]) {\n              range.isReal = true\n            } else {\n              range.isReal = false\n            }\n            return range\n          }\n\n          writeRange = function (range) {\n            writeContent(word.toString())\n            var textnode = textfield.childNodes[0]\n            if (range.isReal && textnode != null) {\n              if (range.left < 0) {\n                range.left = 0\n              }\n              range.right = Math.max(range.left, range.right)\n              if (range.right > textnode.length) {\n                range.right = textnode.length\n              }\n              range.left = Math.min(range.left, range.right)\n              var r = document.createRange(); // eslint-disable-line\n              r.setStart(textnode, range.left)\n              r.setEnd(textnode, range.right)\n              var s = window.getSelection(); // eslint-disable-line\n              s.removeAllRanges()\n              s.addRange(r)\n            }\n          }\n          writeContent = function (content) {\n            var contentArray = content.replace(new RegExp('\\n', 'g'), ' ').split(' '); // eslint-disable-line\n            textfield.innerText = ''\n            for (var i = 0; i < contentArray.length; i++) {\n              var c = contentArray[i]\n              textfield.innerText += c\n              if (i !== contentArray.length - 1) {\n                textfield.innerHTML += '&nbsp;'\n              }\n            }\n          }\n        }\n        writeContent(this.toString())\n\n        function yCallback (event) {\n          if (!creatorToken) {\n            var oPos, fix\n            if (event.type === 'insert') {\n              oPos = event.index\n              fix = function (cursor) { // eslint-disable-line\n                if (cursor <= oPos) {\n                  return cursor\n                } else {\n                  cursor += 1\n                  return cursor\n                }\n              }\n              var r = createRange(fix)\n              writeRange(r)\n            } else if (event.type === 'delete') {\n              oPos = event.index\n              fix = function (cursor) { // eslint-disable-line\n                if (cursor < oPos) {\n                  return cursor\n                } else {\n                  cursor -= 1\n                  return cursor\n                }\n              }\n              r = createRange(fix)\n              writeRange(r)\n            }\n          }\n        }\n        this.observe(yCallback)\n        // consume all text-insert changes.\n        textfield.onkeypress = function (event) {\n          if (word.is_deleted) {\n            // if word is deleted, do not do anything ever again\n            textfield.onkeypress = null\n            return true\n          }\n          creatorToken = true\n          var char\n          if (event.keyCode === 13) {\n            char = '\\n'\n          } else if (event.key != null) {\n            if (event.charCode === 32) {\n              char = ' '\n            } else {\n              char = event.key\n            }\n          } else {\n            char = window.String.fromCharCode(event.keyCode); // eslint-disable-line\n          }\n          if (char.length > 1) {\n            return true\n          } else if (char.length > 0) {\n            var r = createRange()\n            var pos = Math.min(r.left, r.right, word.length)\n            var diff = Math.abs(r.right - r.left)\n            word.delete(pos, diff)\n            word.insert(pos, char)\n            r.left = pos + char.length\n            r.right = r.left\n            writeRange(r)\n          }\n          event.preventDefault()\n          creatorToken = false\n          return false\n        }\n        textfield.onpaste = function (event) {\n          if (word.is_deleted) {\n            // if word is deleted, do not do anything ever again\n            textfield.onpaste = null\n            return true\n          }\n          event.preventDefault()\n        }\n        textfield.oncut = function (event) {\n          if (word.is_deleted) {\n            // if word is deleted, do not do anything ever again\n            textfield.oncut = null\n            return true\n          }\n          event.preventDefault()\n        }\n        //\n        // consume deletes. Note that\n        //   chrome: won't consume deletions on keypress event.\n        //   keyCode is deprecated. BUT: I don't see another way.\n        //     since event.key is not implemented in the current version of chrome.\n        //     Every browser supports keyCode. Let's stick with it for now..\n        //\n        textfield.onkeydown = function (event) {\n          creatorToken = true\n          if (word.is_deleted) {\n            // if word is deleted, do not do anything ever again\n            textfield.onkeydown = null\n            return true\n          }\n          var r = createRange()\n          var pos = Math.min(r.left, r.right, word.toString().length)\n          var diff = Math.abs(r.left - r.right)\n          if (event.keyCode != null && event.keyCode === 8) { // Backspace\n            if (diff > 0) {\n              word.delete(pos, diff)\n              r.left = pos\n              r.right = pos\n              writeRange(r)\n            } else {\n              if (event.ctrlKey != null && event.ctrlKey) {\n                var val = word.toString()\n                var newPos = pos\n                var delLength = 0\n                if (pos > 0) {\n                  newPos--\n                  delLength++\n                }\n                while (newPos > 0 && val[newPos] !== ' ' && val[newPos] !== '\\n') {\n                  newPos--\n                  delLength++\n                }\n                word.delete(newPos, pos - newPos)\n                r.left = newPos\n                r.right = newPos\n                writeRange(r)\n              } else {\n                if (pos > 0) {\n                  word.delete(pos - 1, 1)\n                  r.left = pos - 1\n                  r.right = pos - 1\n                  writeRange(r)\n                }\n              }\n            }\n            event.preventDefault()\n            creatorToken = false\n            return false\n          } else if (event.keyCode != null && event.keyCode === 46) { // Delete\n            if (diff > 0) {\n              word.delete(pos, diff)\n              r.left = pos\n              r.right = pos\n              writeRange(r)\n            } else {\n              word.delete(pos, 1)\n              r.left = pos\n              r.right = pos\n              writeRange(r)\n            }\n            event.preventDefault()\n            creatorToken = false\n            return false\n          } else {\n            creatorToken = false\n            return true\n          }\n        }\n        this.textfields.push({\n          editor: textfield,\n          yCallback: yCallback\n        })\n      }\n    }\n    Y.extend('Text', new Y.utils.CustomType({\n      name: 'Text',\n      class: YText,\n      struct: 'List',\n      initType: function * YTextInitializer (os, model) {\n        var _content = []\n        yield* Y.Struct.List.map.call(this, model, function (op) {\n          if (op.hasOwnProperty('opContent')) {\n            throw new Error('Text must not contain types!')\n          } else {\n            op.content.forEach(function (c, i) {\n              _content.push({\n                id: [op.id[0], op.id[1] + i],\n                val: op.content[i]\n              })\n            })\n          }\n        })\n        return new YText(os, model.id, _content)\n      }\n    }))\n  })\n}\n\nmodule.exports = extend\nif (typeof Y !== 'undefined') {\n  extend(Y)\n}\n"]}