From f500bcf6858657eb80f2892b06d5ece7a891c2eb Mon Sep 17 00:00:00 2001 From: MrOtherGuy Date: Sun, 13 Sep 2020 22:01:57 +0300 Subject: [PATCH] Support highlighting of separate parts of the selector --- html_resources/main.css | 8 +++- html_resources/selector.js | 89 ++++++++++++++++++++++++++++---------- 2 files changed, 72 insertions(+), 25 deletions(-) diff --git a/html_resources/main.css b/html_resources/main.css index 36a79ed..5fb9b68 100644 --- a/html_resources/main.css +++ b/html_resources/main.css @@ -83,9 +83,13 @@ pre{ .target{ display: flex; justify-content: space-between } .comment{ color: rgb(50,180,20) } -.selector{ color: violet } +.selector{ color: violet } +.pseudo{ color: silver } +.id{ color: lightcoral } +.class{ color: lightgreen } +.attribute{ color: cyan } .atrule{ color: royalblue } -.atvalue{ color: greenyellow } +.atvalue{ color: lightblue } .property{ color: orange } .value{ color: skyblue } .curly{ color: orangered } \ No newline at end of file diff --git a/html_resources/selector.js b/html_resources/selector.js index c5ec846..8838cf1 100644 --- a/html_resources/selector.js +++ b/html_resources/selector.js @@ -248,21 +248,62 @@ const Highlighter = new(function(){ this.previous = ()=>previous; this.set = function(a){ previous = current; current = a; return} })(); + let pointer = 0; let token = ""; + + const selectorToClassMap = new Map([ + [":","pseudo"], + ["#","id"], + [".","class"], + ["[","attribute"]]); - function createToken(type,c){ - let n = document.createElement("span"); - n.textContent = c || token; - n.className = (`token ${type}`); - token = ""; - return n - } - - this.parse = function(node,text){ - for(let e of Array.from(node.childNodes)){ - node.removeChild(e) + this.parse = function(targetNode,text){ + + clearCodeBlock(); + let node = document.createElement("div"); + + function createElementFromToken(type,c){ + if(token.length === 0 && !c){ + return + } + let n = document.createElement("span"); + + + if(type==="selector"){ + + let parts = token.split(/([\.#:\[]\w[\w-_"'=\]]*|\s\w[\w-_"'=\]]*)/); + + for(let part of parts){ + if(part.length === 0){ + continue + } + let c = part[0]; + switch (c){ + case ":": + case "#": + case "[": + case ".": + let p = n.appendChild(document.createElement("span")); + p.className = selectorToClassMap.get(c); + p.textContent = part; + break; + default: + n.append(part); + } + } + + + }else{ + n.textContent = c || token; + } + + n.className = (`token ${type}`); + token = ""; + node.appendChild(n); + return } + let c; let curly = false; while(pointer < text.length){ @@ -281,17 +322,17 @@ const Highlighter = new(function(){ state.set(2); if(token.length > 1){ token = token.slice(0,-1); - node.appendChild(createToken("selector")); + createElementFromToken("selector"); token += "/" } } break; case "{": state.set(3); - node.appendChild(createToken("selector")); + createElementFromToken("selector"); break; case "}": - node.appendChild(createToken("text")); + createElementFromToken("text"); break; case "@": state.set(5); @@ -306,7 +347,7 @@ const Highlighter = new(function(){ token += "/"; pointer++; state.set(state.previous()); - node.appendChild(createToken("comment")); + createElementFromToken("comment"); } } break; @@ -319,29 +360,29 @@ const Highlighter = new(function(){ } break; case ":": - node.appendChild(createToken("property")); + createElementFromToken("property"); state.set(4); break; case "}": - node.appendChild(createToken("text")); + createElementFromToken("text"); state.set(0); } break; case 4: switch(c){ case ";": - node.appendChild(createToken("value")); + createElementFromToken("value"); state.set(3); break; case "}": - node.appendChild(createToken("value")); + createElementFromToken("value"); state.set(0); } break; case 5: switch(c){ case " ": - node.appendChild(createToken("atrule")); + createElementFromToken("atrule"); state.set(6); } break; @@ -349,7 +390,7 @@ const Highlighter = new(function(){ switch(c){ case ";": case "{": - node.appendChild(createToken("atvalue")); + createElementFromToken("atvalue"); state.set(0); } break @@ -357,16 +398,18 @@ const Highlighter = new(function(){ false } - curly && node.appendChild(createToken("curly",c)); + curly && createElementFromToken("curly",c); pointer++ } - node.appendChild(createToken("text")); + createElementFromToken("text"); token = ""; state.set(0); pointer = 0; + targetNode.appendChild(node); + return } return this