{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-constraints/src/client/triples/triples.js"],"names":["focalStorage","ContextMenu","through","uuid","fileName","hintForLabel","getTempKeyFor","asDragImageFor","trackInstance","getJSYaml","loadJavaScriptThroughDOM","jsyaml","parseMarkdown","markdown","filename","frontmatterSeparator","startsWith","parts","split","shift","frontmatterString","textContent","join","metadata","e","notify","undefined","Knot","constructor","content","new","target","call","url","getMetadata","label","firstLine","replace","isTriple","save","newContent","lively","openViewInWindow","knotView","openComponentInWindow","loadKnotForURL","collectContextMenuItems","evt","hide","graph","getInstance","deleteKnot","toListItem","listItem","addEventListener","event","stopPropagation","preventDefault","openIn","document","asDataForDrag","dt","setData","mimeType","dragInfo","Triple","parse","log","DEFAULT_FOLDER_URL","TAG_URL","IS_A_URL","SAME_AS_URL","CONTAINS_URL","ROOT_KNOWLEDGE_BASES_KEY","PREFERRED_KNOWLEDGE_BASE_KEY","isInternalURL","origin","isExternalURL","Graph","Map","prepare","rootKnowledgeBases","getRootKnowledgeBases","all","map","loadFromDir","getItem","addRootKnowledgeBase","urlString","URL","stats","Error","includes","push","setItem","removeRootKnowledgeBase","filter","rootBase","getKnots","hasKnotWithURL","knot","triples","referingTriples","query","_","confirm","index","urlURL","result","method","r","text","createReferree","triple","propName","subjectUrlString","subjectUrl","searchString","toString","subject","requestKnot","linkUpTriple","clearInstance","s","p","o","getUrlsByKnot","filePath","loadSingleKnot","urlOrString","err","endsWith","directory","Promise","resolve","progress","showProgress","directoryURL","json","fileNames","desc","total","i","pool","Set","limit","arr","ii","groups","groupBy","args","group","values","knotURL","prom","remove","escapeSpecialCharacters","str","fileForNameExists","name","getOrCreateKnotForTitle","defaultText","escapedName","proposedURL","existingKnot","success","fileExists","warn","createKnot","getNonCollidableURL","fileEnding","maxTries","offset","bust","createTriple","predicateURLString","objectURLString","knowledgeBaseURLString","stringify","predicate","object"],"mappings":"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","file":"triples.js","sourcesContent":["\"enable aexpr\";\nimport 'lang';\n\nimport focalStorage from 'src/external/focalStorage.js';\nimport ContextMenu from './../contextmenu.js';\nimport { through, uuid, fileName, hintForLabel, getTempKeyFor, asDragImageFor } from 'utils';\nimport { trackInstance } from 'active-group';\n\nasync function getJSYaml() {\n  await lively.loadJavaScriptThroughDOM(\"esprima\", \"https://lively-kernel.org/lively4/foo/src/external/esprima.js\");\n  await lively.loadJavaScriptThroughDOM(\"js-yaml\", \"https://lively-kernel.org/lively4/foo/src/external/js-yaml.js\");\n  return jsyaml;\n}\n\n// #TODO: unused\nasync function parseMarkdown(markdown, filename) {\n  try {\n    const frontmatterSeparator = \"---\\r\\n\";\n    if(markdown.startsWith(frontmatterSeparator)) {\n      const parts = markdown.split(frontmatterSeparator);\n      if(parts.length >= 3) {\n        parts.shift(); // empty\n        const frontmatterString = parts.shift();\n        return {\n          textContent: parts.join(frontmatterSeparator),\n          metadata: (await getJSYaml()).load(frontmatterString)\n        };\n      }\n    }\n  } catch(e) {\n    lively.notify(\"failed frontmatter parsing\", \"\", undefined, undefined, \"red\");\n  }\n  return {\n    textContent: markdown,\n    metadata: {}\n  };\n}\n\nexport class Knot {\n  constructor(fileName, content) {\n    this.fileName = fileName;\n    this.content = content;\n    \n    if(new.target === Knot) {\n      trackInstance.call(Knot, this);\n    }\n  }\n  get url() { return this.fileName; }\n  getMetadata() { return this.metadata; }\n  label() {\n    if(this.fileName.endsWith('.md')) {\n      const firstLine = this.content.split('\\n')[0];\n      return firstLine.replace(/^#\\s/, '');\n    }\n    return this.fileName;\n  }\n  isTriple() { return false; }\n  async save(newContent) {\n    this.content = newContent;\n    await lively.files.saveFile(this.url, newContent);\n  }\n  async openViewInWindow() {\n    const knotView = await lively.openComponentInWindow(\"knot-view\");\n    knotView.loadKnotForURL(this.url);\n  }\n  collectContextMenuItems() {\n    return [\n        [\"Knot View\", evt => {\n          ContextMenu.hide();\n          this.openViewInWindow();\n        }, \"\", '<i class=\"fa fa-window-maximize\" aria-hidden=\"true\"></i>'],\n        [\"Danger Zone\", [\n          [\"Delete\", async evt => {\n            ContextMenu.hide();\n            const graph = await Graph.getInstance();\n\n            const label = this.label();\n            if(await graph.deleteKnot(this)) {\n              // #TODO: use reactivity to update views and search results\n              lively.notify(`${label} deleted!`, null, 4, null, \"red\");\n            } else {\n              lively.notify('did not delete knot ' + label, this.url);\n            }\n          }, \"Delete for good\", '<i class=\"fa fa-trash\" aria-hidden=\"true\"></i>']\n        ]]\n      ];\n  }\n\n  toListItem() {\n    const listItem = <li tabindex=\"1\" draggable=\"true\">{this.label()}</li>;\n    listItem.knot = this;\n    \n    listItem.addEventListener('keydown', event => {\n      if (event.keyCode == 13) { // ENTER\n        this.openViewInWindow();\n        event.stopPropagation();\n        event.preventDefault();\n      }\n    });\n    listItem.addEventListener(\"dblclick\", event => {\n      this.openViewInWindow();\n      event.stopPropagation();\n      event.preventDefault();\n    });\n    listItem.addEventListener(\"contextmenu\", event => {\n      ContextMenu.openIn(document.body, event, this, undefined, this.collectContextMenuItems());\n      event.stopPropagation();\n      event.preventDefault();\n    });\n\n    return listItem;\n  }\n  \n  asDataForDrag(evt) {\n    const dt = evt.dataTransfer;\n    //listItem.style.color = \"blue\";\n    dt.setData(\"knot/url\", this.url);\n    dt.setData(\"text/uri-list\", this.url);\n    dt.setData(\"text/plain\", this.url);\n    dt.setData(\"javascript/object\", getTempKeyFor(this));\n    const mimeType = 'text/plain';\n    const filename = this.url::fileName();\n    const url = this.url;\n    dt.setData(\"DownloadURL\", `${mimeType}:${filename}:${url}`);\n\n    // #TODO: remove duplication\n    const dragInfo = <div style=\"width: 150px;\">\n      {hintForLabel(this.label())}\n    </div>;\n    dragInfo::asDragImageFor(evt, 50, 60);\n  }\n}\n\nexport class Triple extends Knot {\n  constructor(fileName, content) {\n    try {\n      JSON.parse(content)\n    } catch(e) {\n      debugger\n      console.log(fileName);\n    }\n\n    super(fileName, JSON.parse(content));\n\n    // track this Triple for ROQs after full initialization\n  }\n  \n  label() {\n    if(this.predicate) {\n      return 't: ' + this.predicate.label();\n    }\n    return this.filename.replace('.triple.json', '');\n  }\n  isTriple() { return true; }\n}\n\nexport const DEFAULT_FOLDER_URL = 'https://lively4/notes/';\nexport const TAG_URL = DEFAULT_FOLDER_URL + 'tag.md';\nexport const IS_A_URL = DEFAULT_FOLDER_URL + 'is_a.md';\nexport const SAME_AS_URL = DEFAULT_FOLDER_URL + 'same_as.md';\nexport const CONTAINS_URL = DEFAULT_FOLDER_URL + 'contains.md';\n\nconst ROOT_KNOWLEDGE_BASES_KEY = 'triple-notes-root-knowledge-bases';\nconst PREFERRED_KNOWLEDGE_BASE_KEY = 'triple-notes-preferred-knowledge-base';\n\nfunction isInternalURL(url) {\n  const origin = url.origin;\n  return origin === 'https://lively4' || origin === 'https://localhost:8800';\n}\nfunction isExternalURL(url) { return !isInternalURL(url); }\n\nexport class Graph {\n  constructor() {\n    this.knots = [];\n    this.loadedDirectoryPromises = new Map();\n    // url string -> Promise for Knot\n    this.requestedKnots = new Map();\n  }\n  async prepare() {\n    const rootKnowledgeBases = await this.getRootKnowledgeBases();\n    return Promise.all(rootKnowledgeBases.map(::this.loadFromDir));\n  }\n  \n  async getRootKnowledgeBases() {\n    return (await focalStorage.getItem(ROOT_KNOWLEDGE_BASES_KEY)) || [\n      DEFAULT_FOLDER_URL\n      //, \"https://lively4/gamedev/\"\n    ]\n  }\n  \n  async addRootKnowledgeBase(urlString) {\n    try {\n      new URL(urlString);\n      const stats = JSON.parse(await lively.files.statFile(urlString));\n      if(!stats || stats.type !== \"directory\") {\n        throw new Error(stats);\n      }\n    } catch (e) {\n      lively.notify(`Knowledge base ${urlString} not valid.`, e.message, undefined, undefined, \"red\");\n      return;\n    }\n    \n    const rootKnowledgeBases = (await this.getRootKnowledgeBases()) || [];\n    if(!rootKnowledgeBases.includes(urlString)) {\n      rootKnowledgeBases.push(urlString);\n      await focalStorage.setItem(ROOT_KNOWLEDGE_BASES_KEY, rootKnowledgeBases);\n      return await this.loadFromDir(urlString);\n    }\n  }\n  \n  async removeRootKnowledgeBase(urlString) {\n    let rootKnowledgeBases = (await this.getRootKnowledgeBases()) || [];\n    if(rootKnowledgeBases.includes(urlString)) {\n      // remove via filter\n      rootKnowledgeBases = rootKnowledgeBases.filter(rootBase => rootBase !== urlString);\n      await focalStorage.setItem(ROOT_KNOWLEDGE_BASES_KEY, rootKnowledgeBases);\n      return true;\n    } else {\n      return false;\n    }\n  }\n  \n  getKnots() {\n    return this.knots;\n  }\n  hasKnotWithURL(url) {\n    return !!this.getKnots().find(knot => knot.url === url);\n  }\n  get triples() {\n    return this.knots.filter(knot => knot.isTriple());\n  }\n  async deleteKnot(knot) {\n    // check for triples on top of the knot\n    const referingTriples = this.query(knot, _, _)\n      .concat(this.query(_, knot, _))\n      .concat(this.query(_, _, knot));\n    if(referingTriples.length > 0) {\n      lively.notify('Deletion aborted!', `${referingTriples.length} triples refer to this knot.`);\n      return false;\n    }\n\n    let url = knot.url;\n    if (!window.confirm(\"delete knot \" + url)) { return false; }\n    \n    let index = this.knots.indexOf(knot);\n    if (index > -1) {\n      this.knots.splice(index, 1);\n      lively.notify(`Removed knot ${url} in local graph instance.`);\n    } else {\n      lively.notify(`Did not find knot ${url} in local graph instance.`);\n    }\n    \n    let urlURL = new URL(url);\n    if(!isInternalURL(urlURL)) {\n      var result = await fetch(url, {method: 'DELETE'})\n        .then(r => r.text());\n      lively.notify(`Deleted knot ${url} in remote storage`, result);\n    }\n    \n    lively.notify('Knot removed from graph.');\n    \n    return true;\n  }\n\n  async createReferree(triple, propName) {\n    let subjectUrlString = triple.content[propName];\n    let subjectUrl = new URL(subjectUrlString, triple.fileName);\n    let searchString = subjectUrl.toString();\n    \n    let subject = await this.requestKnot(subjectUrl);\n    //let subject = this.knots.find(knot => knot.fileName === searchString);\n    if(subject) {\n      triple[propName] = subject;\n    } else {\n      throw new Error(`${searchString} ${triple.fileName} external referrees not yet implemented!`);\n    }\n  }\n  async linkUpTriple(triple) {\n    return Promise.all([\n      this.createReferree(triple, 'subject'),\n      this.createReferree(triple, 'predicate'),\n      this.createReferree(triple, 'object')\n    ]);\n  }\n\n  static async getInstance() {\n    if(!this.instance) {\n      this.instance = new Graph();\n    }\n    \n    await this.instance.prepare();\n    \n    return this.instance;\n  }\n  static clearInstance() {\n    this.instance = undefined;\n  }\n  \n  query(s, p, o) {\n    return this.triples\n      .filter(triple => s === _ || triple.subject === s)\n      .filter(triple => p === _ || triple.predicate === p)\n      .filter(triple => o === _ || triple.object === o);\n  }\n  \n  getUrlsByKnot(knot) {\n    // TODO: we simply return the single reference url for now\n    return [knot.fileName];\n  }\n\n  // returns a promise for the Knot\n  async requestKnot(url) {\n    const filePath = url.toString();\n    if(!this.requestedKnots.has(filePath)) {\n      this.requestedKnots.set(filePath, this.loadSingleKnot(url));\n    }\n    return this.requestedKnots.get(filePath);\n  }\n  \n  async loadSingleKnot(urlOrString) {\n    const url = new URL(urlOrString);\n    \n    let fileName = url.toString();\n    let text = isExternalURL(url) ?\n      url.hostname + url.pathname :\n      await fetch(url).then(r => r.text()).catch(err => `ERROR loading this knot: ${err}`);\n\n    // deserializeKnot\n    const isTriple = fileName.endsWith(\".triple.json\");\n\n    let knot;\n    if(isTriple) {\n      knot = new Triple(fileName, text);\n      await this.linkUpTriple(knot);\n      trackInstance.call(Triple, knot);\n    } else {\n      knot = new Knot(fileName, text);\n    }\n\n    this.knots.push(knot);\n\n    return knot;\n  }\n  \n  async loadFromDir(directory) {\n    if(!this.loadedDirectoryPromises.has(directory)) {\n      this.loadedDirectoryPromises.set(directory, new Promise(async resolve => {\n        const progress = await lively.showProgress(`loading dir ${directory}`);\n        progress.value = 0;\n        \n        const directoryURL = new URL(directory);\n        const json = await fetch(directory, { method: 'OPTIONS' }).then(r => r.json());\n        const fileNames = json.contents\n          .filter(desc => desc.type === \"file\")\n          .map(desc => desc.name);\n        \n        const total = fileNames.length;\n        let i = 0;\n        const pool = new Set();\n        const limit = 100;\n        const arr = [1,2,3,4,5,6]\n        let ii = 0;\n        const groups = fileNames.groupBy((...args) => (ii++ / limit).floor())\n        for (let group of Object.values(groups)) {\n          await Promise.all(group.map(fileName => {\n            const knotURL = new URL(fileName, directoryURL);\n            const prom = this.requestKnot(knotURL);\n            progress.value = i++ / total\n            return prom\n          }));\n        }\n        \n        await resolve();\n        await progress.remove()\n      }));\n    }\n    return this.loadedDirectoryPromises.get(directory);\n  }\n  \n  escapeSpecialCharacters(str) {\n    return str.replace(/[^A-Za-z0-9-]/g, '_');\n  }\n  \n  async fileForNameExists(name) {\n    const url = new URL(`${this.escapeSpecialCharacters(str)}.md`, DEFAULT_FOLDER_URL);\n    return (await fetch(url)).status === 200;\n  }\n  \n  async getOrCreateKnotForTitle(name, defaultText = '# Default Text') {\n    const escapedName = this.escapeSpecialCharacters(name);\n    const proposedURL = `${DEFAULT_FOLDER_URL}${escapedName}.md`;\n\n    const existingKnot = this.getKnots().find(knot => {\n      return knot.url === proposedURL\n    });\n    if (existingKnot) {\n      lively.success('EXISTS IN MEMORY')\n      return existingKnot;\n    }\n    \n    const fileExists = (await fetch(proposedURL)).status === 200;\n    if(fileExists) {\n      lively.success('EXISTS REMOTELY')\n      return this.requestKnot(proposedURL);\n    }\n    \n    lively.warn('NON EXISTENT')\n    return this.createKnot(DEFAULT_FOLDER_URL, name, 'md');\n  }\n\n  async getNonCollidableURL(directory, name, fileEnding) {\n    const maxTries = 10;\n    const fileName = this.escapeSpecialCharacters(name);\n    let offset = 0;\n    let i = 0;\n    \n    for(; i < maxTries; i++) {\n      let bust = offset === 0 ? '' : offset;\n      let url = new URL(`${fileName}${bust}.${fileEnding}`, directory);\n      let fileExists = (await fetch(url)).status === 200;\n      if(fileExists) {\n        offset++;\n      } else {\n        return url;\n      }\n    }\n    throw new Error('too many tries for '); // TODO: improve error message\n  }\n  async createKnot(directory, name, fileEnding) {\n    if(fileEnding !== 'md') { throw new Error('only .md files supported by now, instead found ', + fileEnding); }\n\n    let url = await this.getNonCollidableURL(directory, name, fileEnding);\n    let content = `# ${name}\n\n`;\n    await lively.files.saveFile(url, content);\n    \n    return this.requestKnot(url);\n  }\n  async createTriple(subjectUrlString, predicateURLString, objectURLString, knowledgeBaseURLString) {\n    await this.requestKnot(subjectUrlString);\n    await this.requestKnot(predicateURLString);\n    await this.requestKnot(objectURLString);\n\n    const url = await this.getNonCollidableURL(knowledgeBaseURLString, 'triple-' + uuid(), 'triple.json');\n    const content = JSON.stringify({\n      subject: subjectUrlString,\n      predicate: predicateURLString,\n      object: objectURLString\n    });\n    await lively.files.saveFile(url, content);\n    \n    //await invalidateFetchCache(knowledgeBaseURLString);\n    \n    return this.requestKnot(url);\n  }\n\n}\n\n// wild card for querying\nexport const _ = {};\n"]}