{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-stephelm/src/components/tools/lively-index-search.js"],"names":["Morph","FileIndex","_","IndexSearch","initialize","windowTitle","registerButtons","get","toggleCollapse","lively","html","registerInputs","forEach","selector","addEventListener","evt","keyCode","onSearchButton","e","console","error","search","getAttribute","value","searchFile","focus","clearLog","s","innerHTML","showSearchResult","url","lineAndColumn","editor","style","flexGrow","setURL","loadFile","codeMirror","awaitEditor","setSelection","line","ch","column","selection","length","scrollIntoView","getCursor","browseSearchResult","pattern","openBrowser","undefined","onSearchResults","list","sortBy","ea","lastPrefix","text","item","document","createElement","filename","file","replace","dirAndFilename","prefix","appendChild","path","serverURL","RegExp","link","querySelector","href","title","self","onclick","shiftKey","ctrlKey","setAttribute","onReplaceButton","replaceInFiles","onEnableReplaceButton","log","searchInProgres","JSON","stringify","start","Date","now","searchFilesList","lively4url","findRootsInBrowsers","browsers","body","querySelectorAll","urls","map","getPath","rootURLs","filter","match","m","uniq","result","searchTime","time","root","roots","concat","preferences","current","db","files","each","find","eaRoot","startsWith","content","push","lines","split","eaLine","index","lineNumber","toString","entry","livelyMigrate","other"],"mappings":"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","file":"lively-index-search.js","sourcesContent":["import Morph from 'src/components/widgets/lively-morph.js';\nimport FileIndex from \"src/client/fileindex.js\"\nimport _ from 'src/external/lodash/lodash.js'\n\nexport default class IndexSearch extends Morph {\n  initialize() {\n    this.windowTitle = \"File Search\";\n    this.registerButtons();\n    this.get(\"lively-separator\").toggleCollapse()\n    // this.get(\"lively-editor\").hideToolbar();\n    \n    lively.html.registerInputs(this);\n    \n\n    ['#searchInput'].forEach(selector => {\n      lively.addEventListener(\"lively-search\", this.get(selector), \"keyup\", (evt) => { \n          if(evt.keyCode == 13) { \n            try {\n              this.onSearchButton(); \n            } catch(e) {\n              console.error(e);\n            }\n          }\n      });\n    });\n      \n    var search = this.getAttribute(\"search\");\n    if(search) {\n      this.get(\"#searchInput\").value = search;\n      this.searchFile();\n    }\n  }\n\n  focus() {\n    this.get(\"#searchInput\").focus();\n  }\n  clearLog(s) {\n    this.get(\"#searchResults\").innerHTML=\"\";\n  }\n\n  async showSearchResult(url, lineAndColumn) {\n    var editor =  this.get(\"#editor\")\n    \n    // unhide editor, when it is needed\n    if (editor.style.flexGrow < 0.01) { // #Hack\n      this.get(\"lively-separator\").toggleCollapse()    \n    }\n    \n    editor.setURL(url)\n    await editor.loadFile()\n    \n    var codeMirror = await editor.awaitEditor()\n    codeMirror.setSelection(\n      {line: lineAndColumn.line, ch: lineAndColumn.column},\n      {line: lineAndColumn.line, ch: lineAndColumn.column + \n        (lineAndColumn.selection ? + lineAndColumn.selection.length : 0)})\n    codeMirror.focus()\n    codeMirror.scrollIntoView(codeMirror.getCursor(), 200)\n    \n    \n  }\n\n  browseSearchResult(url, pattern) {\n    return lively.openBrowser(url, true, pattern, undefined, /* lively.findWorldContext(this)*/);\n  }\n\n  onSearchResults(list, search) {\n    list = _.sortBy(list, ea => ea.url)\n    let lastPrefix\n    for (var ea of list) {\n      let pattern = ea.text;\n      let url = ea.url;\n      let item = document.createElement(\"tr\");\n      let filename = ea.file.replace(/.*\\//,\"\")\n      let dirAndFilename = ea.url.replace(/.*\\/([^/]+\\/[^/]+$)/,\"$1\")\n      let prefix = url.replace(dirAndFilename, \"\")\n      if (lastPrefix != prefix) {\n         this.get(\"#searchResults\").appendChild(<tr class=\"prefix\"><td colspan=\"3\">{prefix}</td></tr>);\n      }\n      lastPrefix = prefix\n      let path = ea.url.replace(this.serverURL(),\"\")\n      let lineAndColumn = {\n        line: ea.line, \n        column: ea.column,\n        selection: ea.selection }\n      \n      item.innerHTML = `<td class=\"filename\"><a>${dirAndFilename}</a></td>\n        <td class=\"line\">${ea.line + 1}:</td>\n        <td><span =\"pattern\">${\n    \n        pattern\n          .replace(/</g,\"&lt;\")\n          .replace(new RegExp(\"(\" +search + \")\"), \"<b>$1</b>\") \n  \n      }</span></td>`;\n      let link = item.querySelector(\"a\");\n      link.href = ea.file;\n      link.url = url\n      link.title = ea.file\n      var self = this\n      link.onclick = (evt) => {\n        if (evt.shiftKey || evt.ctrlKey) {\n          this.browseSearchResult(url, lineAndColumn);\n        } else {\n          this.showSearchResult(url, lineAndColumn);\n        }\n        return false;\n      };\n      this.get(\"#searchResults\").appendChild(item);\n    }\n  }\n\n  onSearchButton() {\n    this.setAttribute(\"search\", this.get(\"#searchInput\").value);\n    this.searchFile();\n  }\n  \n  onReplaceButton() {\n    this.replaceInFiles(\n      this.get(\"#searchInput\").value,\n      this.get(\"#replaceInput\").value)\n  }\n  \n  onEnableReplaceButton() {\n    if (this.getAttribute(\"replace\") == \"true\") {\n      this.setAttribute(\"replace\", \"false\")\n    } else {\n      this.setAttribute(\"replace\", \"true\")\n    }\n  }\n\n  async searchFile(text) {\n    this.clearLog()\n    if (text) {\n      this.setAttribute(\"search\", text); // #TODO how to specify data-flow / connections...\n      this.get(\"#searchInput\").value = text;\n    }\n    // if (this.searchInProgres) return;\n    var search = this.get(\"#searchInput\").value;\n    if (search.length < 2) {\n      this.log(\"please enter a longer search string\");\n      this.searchInProgres = false;\n      return; \n    }\n    this.clearLog();\n    this.get(\"#searchResults\").innerHTML = \"searching ...\" + JSON.stringify(search);\n    let start = Date.now();\n    var list = await this.searchFilesList(search )\n    this.searchInProgres = false;\n    this.clearLog();\n    //this.log('found');\n    this.log(`finished in ${Date.now() - start}ms`);\n    this.onSearchResults(list, search);\n  }\n\n  serverURL() {\n     return lively4url.replace(/[^/]*$/,\"\")\n  }\n  \n  \n  /*\n   * find all root directories/repositories that should be search by looking, what browsers/editors the user has opened\n   */ \n  findRootsInBrowsers() {\n    var browsers = document.body.querySelectorAll(\"lively-container\")\n    var urls = browsers.map(ea => ea.getPath())\n    var serverURL =  this.serverURL()\n    var rootURLs = urls.filter(ea => ea.match(serverURL)).map(ea => {\n      var m = ea.match(new RegExp(\"(\" + serverURL + \"[^/]*/).*\"))\n      return m && m[1]\n    })\n    return _.uniq(rootURLs)\n  }\n  \n  async searchFilesList(pattern) {\n    this.searchInProgres = true;\n    \n    var search = new RegExp(pattern)\n    var result = []\n    var searchTime = await lively.time(async () => {\n      var root = lively4url; // there are other files in our cache... too \n      var roots = [root].concat(lively.preferences.get(\"ExtraSearchRoots\")).concat(this.findRootsInBrowsers())\n      return FileIndex.current().db.files.each(file => {\n        if (roots.find(eaRoot => file.url.startsWith(eaRoot)) && file.content) {\n          var m = file.content.match(search)\n          if (m) {\n            result.push({file: file, match: m})\n          }\n        }\n      })  \n    })\n    \n    var list = []\n    result.forEach( ea => {\n      console.log(\"found \" + ea.file.url)\n      var lines = ea.file.content.split(\"\\n\")\n      lines.forEach((eaLine, index) => {\n        var m = eaLine.match(pattern)\n        if (m) {\n          var lineNumber = index\n          // var lineNumber = index + 1 // first line is \"1\"\n          list.push({\n            file: ea.file.url.toString().replace(/[.*\\/]/,\"\"), \n            url: ea.file.url.toString(),\n            line: lineNumber,\n            column: m.index,\n            text: eaLine,\n            selection: m[0]\n          })          \n        }\n      })\n    })\n    this.files = list\n    this.searchInProgres = false;\n    return list\n  }\n\n  log(s) {\n    var entry = <tr><td class=\"logentry\" colspan=\"2\">{s}</td></tr>\n    this.get(\"#searchResults\").appendChild(entry)\n  }\n  \n \n  livelyMigrate(other) {\n    this.get(\"#searchInput\").value =  other.get(\"#searchInput\").value\n  }\n  \n}\n"]}