{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-RP19-4/src/client/annotations.js"],"names":["_","diff","genUUID","uuid","dmp","diff_match_patch","Annotation","constructor","config","from","to","Object","keys","forEach","key","equalsRegion","region","equals","annotation","length","codeMirrorMark","cm","color","marker","markText","posFromIndex","className","attributes","JSON","stringify","css","intersectRegion","Math","max","min","isInRegion","cutRegion","intersection","rest","clone","AnnotationSet","annotationsAndVersions","list","reference","ea","type","textVersion","version","add","Symbol","iterator","size","has","push","addAll","annotations","remove","filter","removeAll","other","mergeWithTransform","mytransformDiff","otherTransformDiff","parent","parentTransformDiff","transformedMe","applyTextDiff","transformedOther","transformedParent","merge","lastCommonParent","diffA","diffB","result","del","otherAnnotationSet","compare","found","find","b","a","same","removeFromTo","annotationsInRegion","content","Set","textDiff","pos","change","isAdd","isDel","isSame","newpos","delOrAdd","toJSON","toJSONL","concat","map","join","toXML","text","regions","xml","s","name","fromJSONL","source","split","parse","e","console","warn","splitters","Array","sort","last","slice","clearCodeMirrorMarks","getAllMarks","clear","renderCodeMirrorMarks","fromJSON","json","AnnotatedText","isString","error","fromURL","fileURL","annotationsURL","annotationsResp","fetch","lastVersion","headers","get","fileversion","textResp","method","annotatedText","saveToURL","lively","files","saveFile","otherText","setText","string","oldText","diff_main","toHTML","fromHTML","html","visit","node","notfirst","childNodes","Text","textContent","localName","parser","DOMParser","doc","parseFromString","body"],"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();\n\nimport { uuid as genUUID } from 'utils';\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    if (color == \"yellow\") color = \"rgba(255,255,0,0.5)\"\n    if (color == \"lightblue\") color = \"rgba(100,100,255,0.5)\"\n    \n    var marker = cm.markText(cm.posFromIndex(this.from), cm.posFromIndex(this.to), \n      {\n        className: \"lively-annotation\",\n        attributes: {\n          \"data-annotation\": JSON.stringify(this)\n        },\n        css: `background-color: ${color}`});\n    return marker\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      } 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\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) {\n      config.push({type: \"Reference\", version: this.textVersion})\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    return AnnotationSet.fromJSON(this.toJSON());\n  }\n\n  static fromJSON(json) {\n    return new AnnotationSet(JSON.parse(json));\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) {\n    var annotationsResp = await fetch(annotationsURL)\n    var annotations = AnnotationSet.fromJSONL((await annotationsResp.text()))\n    annotations.fileURL = fileURL\n    annotations.annotationsURL = annotationsURL\n    annotations.lastVersion = annotationsResp.headers.get(\"fileversion\")\n    \n    var headers = {}\n    if (annotations.textVersion) {\n        headers.fileversion = annotations.textVersion\n    }\n    var textResp = await fetch(fileURL, {\n      method: \"GET\",  \n      headers: headers})\n    var text = await textResp.text()\n    var annotatedText = new AnnotatedText(text, annotations)\n    \n    \n    return annotatedText \n  }  \n  \n  async saveToURL(fileURL, 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      this.annotations.textVersion = version\n    }\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    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"]}