{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-croquet/src/client/annotations.js"],"names":["_","diff","Github","genUUID","uuid","tinycolor","dmp","diff_match_patch","Annotation","constructor","config","from","to","Object","keys","forEach","key","equalsRegion","region","equals","annotation","length","codeMirrorMark","cm","color","setAlpha","fromPos","posFromIndex","toPos","marker","markText","className","attributes","JSON","stringify","css","toString","style","_style","s","annotateInDOM","node","pos","parent","Text","intersection","intersectRegion","textContent","a","b","insertBefore","slice","replacement","rest","remove","ea","Array","childNodes","Math","max","min","isInRegion","cutRegion","clone","AnnotationSet","annotationsAndVersions","list","reference","type","textVersion","version","content","add","Symbol","iterator","size","has","push","addAll","annotations","filter","removeAll","other","mergeWithTransform","mytransformDiff","otherTransformDiff","parentTransformDiff","transformedMe","applyTextDiff","transformedOther","transformedParent","merge","lastCommonParent","diffA","diffB","result","del","otherAnnotationSet","compare","found","find","same","removeFromTo","annotationsInRegion","Set","textDiff","change","isAdd","isDel","isSame","newpos","delOrAdd","toJSON","toJSONL","concat","map","join","toXML","text","regions","xml","name","fromJSONL","source","split","parse","e","console","warn","splitters","sort","last","clearCodeMirrorMarks","getAllMarks","clear","renderCodeMirrorMarks","r","fromJSON","lastVersion","json","fromURL","url","lively","files","loadFile","livelyInspect","contentNode","inspector","appendChild","display","AnnotatedText","isString","error","fileURL","annotationsURL","annotationsVersion","force","annotationsResp","loadFileResponse","status","fromSource","undefined","textResp","headers","get","annotatedText","toSource","saveToURL","saveFile","otherText","setText","string","oldText","diff_main","toHTML","fromHTML","html","visit","notfirst","localName","parser","DOMParser","doc","parseFromString","body","solveAnnotationConflict","textURL","annotationURL","sourceWithConflict","fetchText","fetch","serverURL","repositoryName","Error","versions","extractGitMergeConflictVersions","versionA","versionB","versionBase","current","getGitMergeBase","base","mergeAnnotations","mergedText","mergedTextVersion","mergedAnnotations"],"mappings":"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","file":"annotations.js","sourcesContent":["import _ from 'src/external/lodash/lodash.js'\nimport diff from 'src/external/diff-match-patch.js';\nconst dmp = new diff.diff_match_patch();\nimport Github from \"src/client/github.js\"\n\nimport { uuid as genUUID } from 'utils';\n\nimport tinycolor from 'src/external/tinycolor.js';\n\n\n\n\nexport class Annotation {\n  constructor(config) {\n    this.from = 0, // starts here...\n    this.to =  0  // stops before \n    Object.keys(config).forEach(key => {\n      this[key] = config[key]\n    })\n  }\n  \n  equalsRegion(region) {\n    return this.from == region.from && this.to == region.to\n  } \n  \n  equals(annotation) {\n    // do not check for classes.. we should also compare to structurally indentical objects?\n    // if (!(annotation instanceof Annotation)) return false;\n    \n    for(let key of Object.keys(this)) {\n      if (this[key] != annotation[key]) return false\n    }\n    // and the other way around....\n    for(let key of Object.keys(annotation)) {\n      if (this[key] != annotation[key]) return false\n    }\n    return true\n  }\n  \n  get length() {\n    return this.to - this.from\n    \n  }\n  \n  codeMirrorMark(cm) {\n    var color = this.color || \"lightgray\"\n    \n    color = tinycolor(color)\n    color.setAlpha(0.4)\n\n    \n    var fromPos = cm.posFromIndex(this.from)\n    var toPos = cm.posFromIndex(this.to)\n      \n    var marker = cm.markText(fromPos, toPos, \n      {\n        className: \"lively-annotation\",\n        attributes: {\n          \"data-annotation\": JSON.stringify(this)\n        },\n        css: `background-color: ${color.toString()}`});\n    return marker\n  }\n  \n  get style() {\n    return this._style || `text-decoration: underline; text-decoration-color: ${this.color}`\n  }\n  \n  set style(s) {\n    this._style = s\n  }\n  \n  \n  annotateInDOM(node, pos=0, parent) {\n    var annotation = this\n    if (node instanceof Text) {\n      var from = pos\n      var to = from + node.length\n      var intersection = annotation.intersectRegion({from, to})\n      if (intersection && parent) {\n        // lively.notify(\"replace from \" + intersection.from  + \" to \" + intersection.to)\n        var s = node.textContent\n        var a  = intersection.from - pos\n        var b  = intersection.to - pos\n        parent.insertBefore(new Text(s.slice(0, a )), node)\n        var replacement = <span style={this.style}>{s.slice(a, b)}</span>\n        parent.insertBefore(replacement, node)\n        var rest = new Text(s.slice(b, s.length))\n        parent.insertBefore(rest, node)\n        node.remove()\n      }\n      pos = to\n    } else {\n      for(var ea of Array.from(node.childNodes)) {\n        pos = this.annotateInDOM(ea, pos,  node)\n      }\n    }\n    return pos\n  }\n  \n  intersectRegion(region) {\n    if (this.to < region.from) return null\n    if (region.to < this.from) return null\n    return {from: Math.max(this.from, region.from), to: Math.min(this.to, region.to)}\n  }\n  \n  isInRegion(region) {\n    // could alternatively use insersectRegion ...\n    return region.from < this.to && this.to < region.to \n      || region.from <= this.from && this.from < region.to;\n  }\n  \n  cutRegion(region) {\n    var intersection = this.intersectRegion(region)\n    if (!intersection) return this\n    if (this.equalsRegion(intersection)) return null // cut complete\n    if (intersection.from == this.from) {\n      this.from = intersection.to\n      return this\n    } else if (intersection.to == this.to) {\n      this.to = intersection.from\n      return this\n    } else {\n      // split annotation\n      var rest = this.clone()\n      this.to = intersection.from\n      rest.from = intersection.to\n      return [this, rest] // and here we #Alias, annotations should deal with this with indirection \n                          // (e.g. ids that point to the real data if necessary)\n    }\n  }\n}\n\nexport default class AnnotationSet {\n\n  constructor(annotationsAndVersions=[]) {\n    this.list = [];\n    this.reference;\n    for(let ea of annotationsAndVersions) {\n      if (ea.type == \"Reference\") {\n        this.textVersion = ea.version // multiple text references per annotations file not (yet) supported \n        this.textContent = ea.content\n      } else {\n        this.add(ea)\n      }\n    }\n  }\n  \n  *[Symbol.iterator] () {\n    for(var ea of this.list) {\n      yield ea;  \n    }  \n  }\n\n  get size() {\n    return this.list.length\n  }\n  \n  add(annotation) {\n    if (!this.has(annotation)) {\n      this.list.push(new Annotation(annotation))\n    }\n  }\n\n  addAll(annotations) {\n    for(let ea of annotations) {\n      this.add(ea)\n    }\n  }\n\n  remove(annotation) {\n    this.list = this.list.filter(ea => !ea.equals(annotation))\n  }\n\n  removeAll(annotations) {\n    this.list = this.list.filter(ea => !annotations.has(ea))\n  }\n\n\n  equals(other) {\n    if (this.size != other.size) return false\n    for(let ea of this) {\n      if (!other.has(ea)) return false\n    }\n    return true\n  }\n/*MD # Design Challenge\n\nWhat should a \"diff\" of annotations actually look like?\n\nshould it be based on the Set semantics... and actually look for identical annotations, \ne.g. same \"from\" and \"to\" and same payload..\n\nOr should we split up the text annotations in regions... and normalize the annotations through that way?\n\nHow do we deal with \"duplicates\" and or overlapping \"annotations\" in the first place...\n\n\n\nMD*/\n\n  \n  mergeWithTransform(mytransformDiff, other, otherTransformDiff, parent, parentTransformDiff) {\n    var transformedMe = this.applyTextDiff(mytransformDiff)\n    var transformedOther = otherTransformDiff.applyTextDiff(otherTransformDiff)\n    var transformedParent = this.applyTextDiff(parentTransformDiff)\n    return transformedMe.merge(transformedOther, transformedParent)\n  }\n\n\n  merge(other, lastCommonParent) {\n    // {from, to} of {this, other, lastCommonParent} reference same text    \n\n    var diffA = lastCommonParent.diff(this)\n    var diffB = lastCommonParent.diff(other)\n  \n    var result = lastCommonParent.clone()\n    result.removeAll(diffA.del)\n    result.removeAll(diffB.del)\n    result.addAll(diffA.add)\n    result.addAll(diffB.add)\n    \n    return result\n  }\n\n  diff(otherAnnotationSet) {\n    var result = this.compare(otherAnnotationSet)\n    \n    // #TODO \n    // compare is very basic... some of the added and deleteted might be mutatated?\n\n    return result\n    \n  }\n\n  has(annotation) {\n    // #TODO #Performance bug... lineas with complex equals...\n    let found =  this.list.find(ea => ea.equals(annotation)) \n    return found ? true : false\n  }\n\n\n  // basic comparison... of actual annotations...\n  compare(b) {\n    var a = this\n    var same = new AnnotationSet()\n    var add = new AnnotationSet()\n    var del = new AnnotationSet()\n    for(let ea of a) {\n      if (b.has(ea)) {\n        same.add(ea)\n      } else {\n        del.add(ea)\n      }\n    }\n    for(let ea of b) {\n      if (!same.has(ea)) {\n        add.add(ea)\n      }\n    }\n    return {same, add, del}\n  } \n\n  removeFromTo(from, to) {\n    var region = {from, to}\n    for(let ea of this) {\n      var intersection = ea.intersectRegion(region)\n      if (intersection) {\n        var result = ea.cutRegion(intersection)\n        if (result == null) {\n          this.remove(ea)\n        } else if (result == ea) {\n          // do nothing\n        }else if (result.length == 2) {\n          this.add(result[1]) // we are cut in half\n        }\n      } \n    }\n  }\n  \n  annotationsInRegion(region = {from: 0, to:0, content: \"\"}) {\n    var result = new Set()\n    for(let ea of this) {\n      if (this.isInRegion(region, ea)) {\n        this.add(ea)       \n      }\n    }\n    return result\n  }\n\n  applyTextDiff(textDiff) {\n    let pos = 0;\n    for (let change of textDiff) {\n      let isAdd = change[0] == 1;\n      let isDel = change[0] == -1;\n      let isSame = change[0] == 0;\n      let length = change[1].length;\n      let newpos = pos + length;\n      let delOrAdd = isDel ? -1 : 1;\n      if (isAdd || isDel) {\n        for (let annotation of this.list) {\n\n          // simplest implementation... just grow and shrink with the diff\n          if (pos <= annotation.from) {\n            annotation.from += delOrAdd * length;\n          }\n          if (pos <= annotation.to) {\n            annotation.to += delOrAdd * length;\n          }\n        }\n      }\n      if (isAdd || isSame) {\n        pos = newpos;\n      }\n    }\n  }\n\n  toJSON() {\n    return JSON.stringify(this.list);\n  }\n\n  toJSONL() {\n    var config = []\n    if (this.textVersion ||  this.textContent) {\n      config.push({type: \"Reference\", version: this.textVersion, content: this.textContent})\n    }\n    return config.concat(this.list).map(ea => JSON.stringify(ea)).join(\"\\n\");    \n  }\n\n  toXML(text) {\n    let regions = this.regions(text);\n    var xml = regions.map(ea => {\n      var s = ea.content;\n      for(let annotation of this) {\n        if (annotation.isInRegion(ea)) {\n          s = `<${annotation.name}>${s}</${annotation.name}>`;\n        }\n      }\n      return s;\n    }).join(\"\");\n    return xml;\n  }\n\n  static fromJSONL(source) {\n    var list = source.split(\"\\n\").map(ea => {\n      try{ \n        return JSON.parse(ea) \n      } catch(e) {\n        console.warn(\"[annotations] could not parse linke: \" + ea)\n      }\n    }).filter(ea => ea)\n    return new AnnotationSet(list)\n  }\n\n  regions(text) {\n    var splitters = new Set();\n    this.list.forEach(ea => {\n      splitters.add(ea.from);\n      splitters.add(ea.to);\n    });\n    if (text) {\n      splitters.add(text.length);\n    }\n    splitters = Array.from(splitters).sort((a, b) => a-b);\n    var regions = [];\n    var last = 0;\n\n    for (var pos of splitters) {\n      regions.push({ from: last, to: pos, content: text && text.slice(last, pos) });\n      last = pos;\n    }\n\n    return regions;\n  }\n  \n\n  clearCodeMirrorMarks(cm) {\n    cm.getAllMarks().forEach(ea => ea.clear())\n  }\n\n  renderCodeMirrorMarks(cm) {\n    this.clearCodeMirrorMarks(cm)\n    for(let ea of this) {\n      ea.codeMirrorMark(cm)\n    }\n  }\n\n\n  clone() {\n    var r =  AnnotationSet.fromJSON(this.toJSON());\n    r.lastVersion = this.lastVersion // keep meta information\n    return r\n  }\n\n  static fromJSON(json) {\n    return new AnnotationSet(JSON.parse(json));\n  }\n\n  static async fromURL(url, version) {\n    var source = await lively.files.loadFile(url, version)\n    return this.fromJSON(JSON.parse(source))\n  }\n\n \n  livelyInspect(contentNode, inspector) {\n    if (this.list) contentNode.appendChild(inspector.display(this.list, false, \"list\", this));\n    if (this.textVersion) contentNode.appendChild(inspector.display(this.textVersion, false, \"textVersion\", this));\n    if (this.textContent) contentNode.appendChild(inspector.display(this.textContent, false, \"textContent\", this));\n  \n  }\n}\n\n\nexport class AnnotatedText {\n  \n  constructor(text, annotations) {\n    this.text = text || \"\"\n    this.annotations = new AnnotationSet()\n    if (annotations instanceof AnnotationSet) {\n      this.annotations = annotations\n    } else if (_.isString(annotations)) {\n      annotations.split(\"\\n\").forEach(ea => {\n        try {\n          var a = JSON.parse(ea)\n          this.annotations.add(a)\n        } catch(e) {\n          console.error(\"Annotation could not be parsed: \" + ea, e)\n        }\n      })\n    } else {\n      // JSON?\n    }\n    \n  }\n    \n  static async fromURL(fileURL, annotationsURL, annotationsVersion, force) {\n    \n    \n    var version;\n    if (annotationsVersion) {\n      var annotationsResp = await lively.files.loadFileResponse(annotationsURL, annotationsVersion)\n      if (annotationsResp.status != 200) {\n        if (force) {\n          return this.fromSource(\"\", fileURL, annotationsURL)\n        } \n        return // nothing to see here...\n      }\n      var source = await annotationsResp.text()      \n    } else {\n      debugger\n      source = await lively.files.loadFile(annotationsURL)\n      version = undefined; // does not work: annotationsResp.headers.get(\"fileversion\")\n    }\n    \n    return this.fromSource(source, fileURL, annotationsURL, version)\n  }  \n  \n  static async fromSource(source, fileURL, annotationsURL, lastVersion) {\n    var annotations = AnnotationSet.fromJSONL(source)\n    annotations.fileURL = fileURL\n    annotations.annotationsURL = annotationsURL\n    annotations.lastVersion = lastVersion\n    // hopefully we have the full text content... \n    if (annotations.textContent) {\n      var text = annotations.textContent         \n    } else if(fileURL){      \n      // if not, we can try to get it...\n      var textResp = await lively.files.loadFileResponse(fileURL, annotations.textVersion || lastVersion)\n      if (textResp.status !== 200) {\n        console.error(\"[annotations] could not load reference text for annotations\")\n      }\n      text = await textResp.text()\n      annotations.textVersion = textResp.headers.get(\"fileversion\")\n      annotations.textContent = text\n    }\n    var annotatedText = new AnnotatedText(text, annotations)    \n    return annotatedText \n  }\n  \n  toSource() {\n    return this.annotations.toJSONL() \n  }\n  \n  async saveToURL(fileURL=this.annotations.fileURL, annotationsURL=this.annotations.annotationsURL) {\n    await lively.files.saveFile(fileURL, this.text) \n    await lively.files.saveFile(annotationsURL, this.annotations.toJSONL()) \n  }\n  \n  equals(otherText) {\n    if (!otherText) return false\n    if (!otherText.annotations) return false\n    return this.text == otherText.text && this.annotations.equals(otherText.annotations)\n  }\n  \n  \n  // set text and upate annotations\n  setText(string, version) {\n    var oldText = this.text\n    this.text = string\n    if (version) {\n      // #TODO find last online commited version (e.g. uploaded to GitHub) that will not be squashed...\n      // this.annotations.syncedTextVersion = version\n      this.annotations.textVersion = version\n    }\n    this.annotations.textContent = string // we cannot rely on the version alone\n    let textDiff = dmp.diff_main(oldText, this.text);\n    this.annotations.applyTextDiff(textDiff)\n  }\n  \n  toHTML() {\n    return this.annotations.toXML(this.text)\n  }\n  \n  clearCodeMirrorMarks(cm) {\n    return this.annotations.clearCodeMirrorMarks(cm)\n  }\n  \n  static fromHTML(html) {\n    \n    var annotations = new AnnotationSet();\n    \n    var string = \"\"\n  \n    function visit(node, notfirst) {\n      if (!node || !node.childNodes) return;\n      if (node instanceof Text) {\n        string += node.textContent\n      } else {\n        if (notfirst) {\n          var annotation = new Annotation({\n            from: string.length, \n            to: string.length + node.textContent.length, \n            name: node.localName})\n          annotations.add(annotation)\n        }\n        // for (let attr of node.attributes) {\n        //   //  TODO\n        // }\n      }\n      for(let ea of node.childNodes) {\n        visit(ea, true)\n      }\n    }\n    \n    var parser = new DOMParser();\n    var doc = parser.parseFromString(html,\"text/html\");\n    visit(doc.body)\n    annotations.textContent = string\n    var annotatedText = new AnnotatedText(string, annotations);\n    return annotatedText\n  }\n  \n  clone() {\n    return new AnnotatedText(this.text, this.annotations.clone())\n  }\n  \n  \n\n\n  static async solveAnnotationConflict(textURL, annotationURL) {\n    var sourceWithConflict = await annotationURL.fetchText() \n    var textResp = await fetch(textURL)\n    var text =  await textResp.text()\n    var textVersion = textResp.headers.get(\"fileversion\")\n    \n    var serverURL = lively.files.serverURL(textURL)\n    var repositoryName = lively.files.repositoryName(textURL)\n    \n    \n    if (!serverURL || !repositoryName) throw new Error(\"Can only merge conflicts lively repository\")\n    \n    var versions = lively.files.extractGitMergeConflictVersions(sourceWithConflict) \n    if (versions.length == 0) return // nothing to do\n    \n    if (versions.length != 2) throw new Error(\"merge  != 2 not support yet\")\n    var versionA= versions[0]\n    var versionB = versions[1]\n    \n        \n    // use git to find a common ancestor for merging:\n    //   lively4@livelygraph:~/lively4/lively4-dummyA$ git merge-base HEAD fd956\n    //   7d66773a9d35de3c95b0478b2fccf70c97c0061a\n\n    var versionBase = await Github.current().getGitMergeBase(serverURL, repositoryName, versionA, versionB)\n    var a = await this.fromURL(textURL, annotationURL, versionA)\n    var b = await this.fromURL(textURL, annotationURL, versionB)\n    var base = await this.fromURL(textURL, annotationURL, versionBase)\n\n    \n    return this.mergeAnnotations(a, b, base, text, textVersion)\n  }\n  \n  static async mergeAnnotations(a, b, base, mergedText, mergedTextVersion) {\n    // update the index positions of to fit text of a\n    base.setText(mergedText)\n    a.setText(mergedText)\n    b.setText(mergedText)\n\n    var mergedAnnotations = a.annotations.merge(b.annotations, base.annotations) \n    mergedAnnotations.textVersion = mergedText\n    mergedAnnotations.textContent = mergedTextVersion\n    \n    return new AnnotatedText(a.text, mergedAnnotations)\n  }\n  \n\n}\n\n"]}