2020-06-01 17:24:22 +00:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
let DB = null;
|
|
|
|
|
|
|
|
function initDB(obj){
|
|
|
|
DB = obj;
|
|
|
|
Object.defineProperty(DB,"query",{value:function (q,list){
|
|
|
|
let nlist = [];
|
|
|
|
for(let key of list || Object.keys(this)){
|
|
|
|
if(this[key].includes(q)){
|
|
|
|
nlist.push(key)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nlist
|
|
|
|
}});
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2020-06-02 14:32:02 +00:00
|
|
|
function fetchWithType(url){
|
|
|
|
return new Promise((resolve,reject)=>{
|
|
|
|
const ext = url.substring(url.lastIndexOf(".")+1);
|
|
|
|
let expected = (ext === "json") ? "application/json" : (ext === "css") ? "text/css" : null;
|
|
|
|
if(!expected){
|
|
|
|
reject("unsupported file extension");
|
|
|
|
}
|
|
|
|
fetch(url)
|
|
|
|
.then(response =>{
|
|
|
|
const contentType = response.headers.get('content-type');
|
|
|
|
if (!contentType || !contentType.includes(expected)) {
|
|
|
|
reject(`Oops, we got ${contentType} but expected ${expected}`);
|
|
|
|
}
|
|
|
|
if(ext === "json"){
|
|
|
|
response.json()
|
|
|
|
.then(r=>resolve(r))
|
|
|
|
}else{
|
|
|
|
response.text()
|
|
|
|
.then(r=>resolve(r))
|
|
|
|
|
|
|
|
}
|
|
|
|
},except => reject(except))
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-06-01 17:24:22 +00:00
|
|
|
let previousCategory = new (function(){
|
|
|
|
let current = null;
|
|
|
|
this.set = function(t){
|
|
|
|
current&¤t.classList.remove("currentCategory");
|
|
|
|
current = t;
|
|
|
|
current.classList.add("currentCategory");
|
|
|
|
};
|
|
|
|
return this
|
|
|
|
})()
|
|
|
|
|
|
|
|
function getText(node){
|
2020-06-05 09:48:42 +00:00
|
|
|
return `${node.childNodes[0].textContent}.css`
|
2020-06-01 17:24:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
async function onCategoryClicked(categoryNode){
|
|
|
|
|
|
|
|
previousCategory.set(categoryNode);
|
|
|
|
|
|
|
|
let names = DB.query(categoryNode.textContent);
|
|
|
|
for(let c of Array.from(document.querySelectorAll(".target"))){
|
|
|
|
names.includes(getText(c)) ? c.classList.remove("hidden") : c.classList.add("hidden");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async function onTargetClicked(targetNode){
|
|
|
|
const codeBlock = document.querySelector("pre");
|
2020-06-02 14:32:02 +00:00
|
|
|
fetchWithType(`chrome/${getText(targetNode)}`)
|
|
|
|
.then(text => (codeBlock.textContent = text))
|
|
|
|
.catch(e => console.log(e))
|
2020-06-01 17:24:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function onSomeClicked(e){
|
|
|
|
let cl = e.target.parentNode.id;
|
|
|
|
switch(cl){
|
|
|
|
case "categories":
|
|
|
|
onCategoryClicked(e.target);
|
|
|
|
break;
|
|
|
|
case "targets":
|
|
|
|
onTargetClicked(e.target);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function createCategories(){
|
|
|
|
|
|
|
|
const CAT_PARENT = document.getElementById("categories");
|
|
|
|
CAT_PARENT.addEventListener("click",onSomeClicked)
|
|
|
|
|
|
|
|
const TAR_PARENT = document.getElementById("targets");
|
|
|
|
TAR_PARENT.addEventListener("click",onSomeClicked);
|
|
|
|
|
|
|
|
const createNode = function(name,type){
|
|
|
|
let node = document.createElement("div");
|
|
|
|
node.classList.add(type);
|
2020-06-05 09:48:42 +00:00
|
|
|
node.textContent = name.substring(0,name.lastIndexOf("."));
|
2020-06-01 17:24:22 +00:00
|
|
|
if(type === "target"){
|
|
|
|
let link = node.appendChild(document.createElement("a"));
|
|
|
|
node.classList.add("hidden");
|
|
|
|
link.href = `https://github.com/MrOtherGuy/firefox-csshacks/tree/master/chrome/${name}`;
|
2020-06-05 09:48:42 +00:00
|
|
|
link.title = "See on Github";
|
2020-06-01 17:24:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
|
|
|
|
const createCategory = name => createNode(name,"category");
|
|
|
|
|
|
|
|
const createTarget = name => createNode(name,"target");
|
|
|
|
|
|
|
|
const CAT_NAMES = (function(){
|
|
|
|
let list = [];
|
|
|
|
|
|
|
|
for(let key of Object.keys(DB)){
|
|
|
|
TAR_PARENT.appendChild(createNode(key,"target"));
|
|
|
|
let things = DB[key];
|
|
|
|
for(let t of things){
|
|
|
|
list.push(t)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
list.sort();
|
|
|
|
let ret = [];
|
|
|
|
let ns = [0];
|
|
|
|
ret[0] = list[0];
|
|
|
|
let i = 0;
|
|
|
|
for(let item of list){
|
|
|
|
if(ret[i]!=item){
|
|
|
|
ret[++i]=item;
|
|
|
|
ns[i]=0;
|
|
|
|
}else{
|
2020-06-05 06:48:56 +00:00
|
|
|
ns[i] += (item === "legacy" ? -1 : 1);
|
2020-06-01 17:24:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
let map = ret.map((a,i)=>({name:a,value:ns[i]}))
|
|
|
|
|
2020-06-05 06:40:14 +00:00
|
|
|
return map.sort((a,b)=>(a.value > b.value?-1:a.value < b.value ? 1:0))
|
2020-06-01 17:24:22 +00:00
|
|
|
})();
|
|
|
|
|
|
|
|
for(let cat of CAT_NAMES){
|
|
|
|
CAT_PARENT.appendChild(createCategory(cat.name))
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
document.onreadystatechange = (function () {
|
|
|
|
if (document.readyState === "complete") {
|
2020-06-02 14:32:02 +00:00
|
|
|
fetchWithType("html_resources/tagmap.json")
|
|
|
|
.then(response=>(initDB(response)))
|
|
|
|
.then(()=>createCategories())
|
|
|
|
.catch(e=>{console.log(e);document.getElementById("ui").textContent = "FAILURE, Database could not be loaded"});
|
2020-06-01 17:24:22 +00:00
|
|
|
}
|
|
|
|
});
|