mirror of
				https://codeberg.org/claui/mobile-config-firefox.git
				synced 2025-11-04 04:25:55 +00:00 
			
		
		
		
	Support highlighting of separate parts of the selector
This commit is contained in:
		
							parent
							
								
									043ae65c7c
								
							
						
					
					
						commit
						f500bcf685
					
				
					 2 changed files with 72 additions and 25 deletions
				
			
		| 
						 | 
					@ -83,9 +83,13 @@ pre{
 | 
				
			||||||
.target{ display: flex; justify-content: space-between }
 | 
					.target{ display: flex; justify-content: space-between }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.comment{ color: rgb(50,180,20) }
 | 
					.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 }
 | 
					.atrule{ color: royalblue }
 | 
				
			||||||
.atvalue{ color: greenyellow }
 | 
					.atvalue{ color: lightblue }
 | 
				
			||||||
.property{ color: orange }
 | 
					.property{ color: orange }
 | 
				
			||||||
.value{ color: skyblue }
 | 
					.value{ color: skyblue }
 | 
				
			||||||
.curly{ color: orangered } 
 | 
					.curly{ color: orangered } 
 | 
				
			||||||
| 
						 | 
					@ -248,21 +248,62 @@ const Highlighter = new(function(){
 | 
				
			||||||
    this.previous = ()=>previous;
 | 
					    this.previous = ()=>previous;
 | 
				
			||||||
    this.set = function(a){ previous = current; current = a; return} 
 | 
					    this.set = function(a){ previous = current; current = a; return} 
 | 
				
			||||||
  })();
 | 
					  })();
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  let pointer = 0;
 | 
					  let pointer = 0;
 | 
				
			||||||
  let token = "";
 | 
					  let token = "";
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  const selectorToClassMap = new Map([
 | 
				
			||||||
 | 
					  [":","pseudo"],
 | 
				
			||||||
 | 
					  ["#","id"],
 | 
				
			||||||
 | 
					  [".","class"],
 | 
				
			||||||
 | 
					  ["[","attribute"]]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function createToken(type,c){
 | 
					  this.parse = function(targetNode,text){
 | 
				
			||||||
    let n = document.createElement("span");
 | 
					    
 | 
				
			||||||
    n.textContent = c || token;
 | 
					    clearCodeBlock();
 | 
				
			||||||
    n.className = (`token ${type}`);
 | 
					    let node = document.createElement("div");
 | 
				
			||||||
    token = "";
 | 
					       
 | 
				
			||||||
    return n
 | 
					    function createElementFromToken(type,c){
 | 
				
			||||||
  }
 | 
					      if(token.length === 0 && !c){
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
  this.parse = function(node,text){
 | 
					      }
 | 
				
			||||||
    for(let e of Array.from(node.childNodes)){
 | 
					      let n = document.createElement("span");
 | 
				
			||||||
      node.removeChild(e)
 | 
					      
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      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 c;
 | 
				
			||||||
    let curly = false;
 | 
					    let curly = false;
 | 
				
			||||||
    while(pointer < text.length){
 | 
					    while(pointer < text.length){
 | 
				
			||||||
| 
						 | 
					@ -281,17 +322,17 @@ const Highlighter = new(function(){
 | 
				
			||||||
                state.set(2);
 | 
					                state.set(2);
 | 
				
			||||||
                if(token.length > 1){
 | 
					                if(token.length > 1){
 | 
				
			||||||
                  token = token.slice(0,-1);
 | 
					                  token = token.slice(0,-1);
 | 
				
			||||||
                  node.appendChild(createToken("selector"));
 | 
					                  createElementFromToken("selector");
 | 
				
			||||||
                  token += "/"
 | 
					                  token += "/"
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
              break;
 | 
					              break;
 | 
				
			||||||
            case "{":
 | 
					            case "{":
 | 
				
			||||||
              state.set(3);
 | 
					              state.set(3);
 | 
				
			||||||
              node.appendChild(createToken("selector"));
 | 
					              createElementFromToken("selector");
 | 
				
			||||||
              break;
 | 
					              break;
 | 
				
			||||||
            case "}":
 | 
					            case "}":
 | 
				
			||||||
              node.appendChild(createToken("text"));
 | 
					              createElementFromToken("text");
 | 
				
			||||||
              break;
 | 
					              break;
 | 
				
			||||||
            case "@":
 | 
					            case "@":
 | 
				
			||||||
              state.set(5);
 | 
					              state.set(5);
 | 
				
			||||||
| 
						 | 
					@ -306,7 +347,7 @@ const Highlighter = new(function(){
 | 
				
			||||||
                token += "/";
 | 
					                token += "/";
 | 
				
			||||||
                pointer++;
 | 
					                pointer++;
 | 
				
			||||||
                state.set(state.previous());
 | 
					                state.set(state.previous());
 | 
				
			||||||
                node.appendChild(createToken("comment"));
 | 
					                createElementFromToken("comment");
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
| 
						 | 
					@ -319,29 +360,29 @@ const Highlighter = new(function(){
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
              break;
 | 
					              break;
 | 
				
			||||||
            case ":":
 | 
					            case ":":
 | 
				
			||||||
              node.appendChild(createToken("property"));
 | 
					              createElementFromToken("property");
 | 
				
			||||||
              state.set(4);
 | 
					              state.set(4);
 | 
				
			||||||
              break;
 | 
					              break;
 | 
				
			||||||
            case "}":
 | 
					            case "}":
 | 
				
			||||||
              node.appendChild(createToken("text"));
 | 
					              createElementFromToken("text");
 | 
				
			||||||
              state.set(0);
 | 
					              state.set(0);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
        case 4:
 | 
					        case 4:
 | 
				
			||||||
          switch(c){
 | 
					          switch(c){
 | 
				
			||||||
            case ";":
 | 
					            case ";":
 | 
				
			||||||
              node.appendChild(createToken("value"));
 | 
					              createElementFromToken("value");
 | 
				
			||||||
              state.set(3);
 | 
					              state.set(3);
 | 
				
			||||||
              break;
 | 
					              break;
 | 
				
			||||||
            case "}":
 | 
					            case "}":
 | 
				
			||||||
              node.appendChild(createToken("value"));
 | 
					              createElementFromToken("value");
 | 
				
			||||||
              state.set(0);
 | 
					              state.set(0);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
        case 5:
 | 
					        case 5:
 | 
				
			||||||
          switch(c){
 | 
					          switch(c){
 | 
				
			||||||
            case " ":
 | 
					            case " ":
 | 
				
			||||||
              node.appendChild(createToken("atrule"));
 | 
					              createElementFromToken("atrule");
 | 
				
			||||||
              state.set(6);
 | 
					              state.set(6);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
| 
						 | 
					@ -349,7 +390,7 @@ const Highlighter = new(function(){
 | 
				
			||||||
          switch(c){
 | 
					          switch(c){
 | 
				
			||||||
            case ";":
 | 
					            case ";":
 | 
				
			||||||
            case "{":
 | 
					            case "{":
 | 
				
			||||||
              node.appendChild(createToken("atvalue"));
 | 
					              createElementFromToken("atvalue");
 | 
				
			||||||
              state.set(0);
 | 
					              state.set(0);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          break
 | 
					          break
 | 
				
			||||||
| 
						 | 
					@ -357,16 +398,18 @@ const Highlighter = new(function(){
 | 
				
			||||||
          false
 | 
					          false
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
      curly && node.appendChild(createToken("curly",c));
 | 
					      curly && createElementFromToken("curly",c);
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      pointer++
 | 
					      pointer++
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    node.appendChild(createToken("text"));
 | 
					    createElementFromToken("text");
 | 
				
			||||||
    token = "";
 | 
					    token = "";
 | 
				
			||||||
    state.set(0);
 | 
					    state.set(0);
 | 
				
			||||||
    pointer = 0;
 | 
					    pointer = 0;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    targetNode.appendChild(node);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return this
 | 
					  return this
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue