{"version":3,"sources":["../yjs/node_modules/browserify/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","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= 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 (events) {\n var aceDocument = ace.getSession().getDocument()\n mutualExcluse(function () {\n for (var i = 0; i < events.length; i++) {\n var event = events[i]\n if (event.type === 'insert') {\n let start = aceDocument.indexToPosition(event.index, 0)\n let end = aceDocument.indexToPosition(event.index + event.value.length, 0)\n aceDocument.insert(start, event.value)\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 }\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 += ' '\n }\n }\n }\n }\n writeContent(this.toString())\n\n function yCallback (events) {\n for (var e = 0; e < events.length; e++) {\n var event = events[e]\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 }\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 = yield* Y.Struct.List.map.call(this, model, function (c) {\n return {\n id: JSON.stringify(c.id),\n val: c.content\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"]}