{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/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","url","getMetadata","label","firstLine","replace","isTriple","save","newContent","lively","openViewInWindow","knotView","openComponentInWindow","loadKnotForURL","collectContextMenuItems","evt","graph","deleteKnot","toListItem","listItem","addEventListener","event","stopPropagation","preventDefault","document","asDataForDrag","dt","setData","mimeType","dragInfo","Triple","JSON","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","Promise","all","map","loadFromDir","addRootKnowledgeBase","urlString","URL","stats","Error","includes","push","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","getInstance","clearInstance","s","p","o","getUrlsByKnot","filePath","loadSingleKnot","urlOrString","err","endsWith","directory","resolve","progress","showProgress","directoryURL","json","fileNames","desc","total","i","pool","Set","limit","arr","ii","groups","groupBy","args","group","Object","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"]}