function createFileEntry(fileObject, element){ let info = fileObject.info; let file = document.createElement("div"); file.className = "file"; file.innerHTML = ` ${info.name} ${info.type}
`; function setDataset(){ file.dataset.id = info.id; file.dataset.type = info.type; file.dataset.enabled = info.enabled; file.dataset.name = info.name; file.dataset.links = info.links ? file.dataset.links = info.links.map(url => { try{ return (new URL(url)).hostname; }catch(exc){ return ""; } }).join(" ") : ""; } setDataset(); let fileName = file.querySelector(".file-name"); let fileType = file.querySelector(".file-type"); let fileEnable = file.querySelector("input"); fileEnable.addEventListener("change", function(){ info.enabled = this.checked; fileObject.save(); }); let fileEdit = file.querySelector(".file-icon.file-edit"); fileEdit.addEventListener("click", edit); let fileDelete = file.querySelector(".file-icon.file-delete"); fileDelete.addEventListener("click", function(){ if(fileDelete.classList.contains("icon-confirm")){ File.remove(info.id).then(function(){ file.remove(); }); }else{ fileDelete.classList.add("icon-confirm"); setTimeout(function(){ fileDelete.classList.remove("icon-confirm"); }, 1000); } }); file.addEventListener("click", e => { if(e.target.className=="file") edit(); }); element.appendChild(file); fileObject.onChange = function(info){ fileEnable.checked = info.enabled; fileName.textContent = info.name; setDataset(); } function edit(){ chrome.tabs.create({url: chrome.runtime.getURL("editor.html#"+info.id)}); } } let filesElement = document.getElementById("files"); File.loadAll().then(function(files){ files = files.sort((a, b) => { if(a.info.name < b.info.name) return -1; if(a.info.name > b.info.name) return 1; return 0; }); for(let i=0;i { let f = new File(); f.changeInfo({type: "JS", name: "New Script"}); f.save().then(() => { createFileEntry(f, filesElement); }); }); let newFileCSS = document.getElementById("new-css"); newFileCSS.addEventListener("click", () => { let f = new File(); f.changeInfo({type: "CSS", name: "New Stylesheet"}); f.save().then(() => { createFileEntry(f, filesElement); }); }); /* file input */ function newFromFile(inFile) { let info = {}; if(inFile.type == "text/javascript") { info.type = "JS"; info.name = inFile.name.match(/(.*)\..*$/); } else if(inFile.type == "text/css") { info.type = "CSS"; info.name = inFile.name.match(/(.*)\..*$/); } else if(inFile.type == "application/json") { } else { alert("Unsupported file type"); return; } let reader = new FileReader(); reader.addEventListener("load", () => { if(inFile.type == "application/json") { try { info = JSON.parse(reader.result); } catch(e) { alert("The uploaded json file is not valid"); } } else { info.content = reader.result; } let f = new File(); f.changeInfo(info); f.save().then(() => { createFileEntry(f, filesElement); }); }); reader.readAsText(inFile); } document.body.addEventListener("dragover", (e) => { e.preventDefault(); e.stopPropagation(); document.body.classList.add("drag-over"); }); document.body.addEventListener("dragleave", (e) => { e.preventDefault(); e.stopPropagation(); document.body.classList.remove("drag-over"); }); document.body.addEventListener("drop", (e) => { e.preventDefault(); e.stopPropagation(); document.body.classList.remove("drag-over"); newFromFile(e.dataTransfer.files[0]); }); let inputFile = document.createElement("input"); inputFile.type = "file"; inputFile.addEventListener("change", () => { newFromFile(inputFile.files[0]); }); let newFileUp = document.getElementById("new-up"); newFileUp.addEventListener("click", () => { inputFile.click(); }); const resultNumberSpan = document.querySelector("#result-number"); function updateSearchBarResults(query){ let q = query.toLowerCase(); let siteFilters = []; let typeFilters = []; function parseTag(regex){ const match = q.match(regex); if(match){ q = q.replace(regex, "").trim(); return match; } return []; } do{ var siteFilter = parseTag(/\B@((\w+\.)*\w+\.\w+)\b/g).pop(); if(siteFilter) siteFilters.push(siteFilter.slice(1)); var typeFilter = parseTag(/\B:(JS|CSS)\b/i).pop(); if(typeFilter) typeFilters.push(typeFilter); } while(siteFilter || typeFilter); fileLoop: for(file of filesElement.querySelectorAll(".file")){ file.classList.remove("filtered"); if(query.length > 0){ const links = file.dataset.links.toLowerCase(); const type = file.dataset.type.toLowerCase(); for(siteFilter of siteFilters){ if(!links.includes(siteFilter)){ file.classList.add("filtered"); continue fileLoop; } } for(typeFilter of typeFilters){ if(type !== typeFilter){ file.classList.add("filtered"); continue fileLoop; } } if(!file.dataset.name.toLowerCase().includes(q)) file.classList.add("filtered"); } } const nHidden = filesElement.querySelectorAll(".file.filtered").length; const nVisible = filesElement.querySelectorAll(".file:not(.filtered)").length; if(nVisible == 0 && nHidden == 0) resultNumberSpan.innerText = "Nothing here ¯\\_(ツ)_/¯"; else if(nHidden > 0) resultNumberSpan.innerText = `( ${nHidden} filtered )`; else resultNumberSpan.innerText = ""; } const searchBar = document.querySelector("#search-bar"); searchBar.addEventListener("input", ev => updateSearchBarResults(searchBar.value)); chrome.storage.onChanged.addListener(() => updateSearchBarResults(searchBar.value));