unnestcss
Version:
A library for un-nesting CSS
3 lines (2 loc) • 3.76 kB
JavaScript
import{AMPERSAND as e,FORM_FEED as t,RULESET as n,COMMENT as r,DECLARATION as i,MINUS as a,AT as o,UNDERSCORE as s,COMMA as c,COLON as l,NULL_CHARACTER as u,LEFT_CURLY_BRACKET as d,SEMICOLON as f,SOLIDUS as p,SPACE as m,RIGHT_CURLY_BRACKET as h,START_OF_HEADING as g,ASTERISK as _,REVERSE_SOLIDUS as v,CARRIAGE_RETURN as y,LINE_FEED as b,HORIZONTAL_TAB as x,LEFT_SQUARE_BRACKET as ee,SINGLE_QUOTE as te,DOUBLE_QUOTE as S,LEFT_PARENTHESIS as C}from"./enum.js";import{charCodeFrom as w,charCodeAt as T,charOr as E}from"./utility.js";import{token as D,Tokenizer as O}from"./tokenizer.js";const k=({value:r,root:i,parent:a,index:o,offset:s,rules:c,points:l,type:u,props:d,children:f,length:p,siblings:m,line:h,column:g})=>{let _=s-1,v=s===0?c:[``],y=v.length;for(let n=0,i=0;n<o;n++){let a=l[n],o=Math.abs(a),s=r.slice(_+1,o);_=o;for(let n=0;n<y;n++){let r=a>0?`${v[n]} ${s}`:s.replaceAll(e+t,v[n]);d[i]=r.trim(),i++}}return{value:r,root:i,parent:a,type:s===0?n:u,props:d,children:f,length:p,siblings:m,line:h,column:g}},A=({value:e,root:t,parent:n,props:i,siblings:a,line:o,column:s})=>({value:e,root:t,parent:n,type:r,props:i,children:e.slice(2,-2),length:0,siblings:a,line:o,column:s}),j=({value:e,root:t,parent:n,length:r,siblings:a,line:o,column:s})=>({value:e,root:t,parent:n,type:i,props:e.slice(0,r),children:e.slice(r+1,-1),length:r,siblings:a,line:o,column:s}),M=(n,{value:r=``,root:i=null,parent:O=null,rule:N=null,rules:P=[``],rulesets:F=[],pseudo:I=0,points:L=[0],declarations:R=F}={})=>{let z=0,B=0,V=I,H,U=0,W=1,G=!0,K=1,q=u,J=u,Y=``,X=P,Z=F,Q=N,$=``;for(;G;)switch(J=q,q=n.next(),q){case C:if($[V-1]===l){let r=n.delimit(q).replace(e,e+t);$+=r;let i=Math.abs(z?L[z-1]:0);$.indexOf(e+t,i)!==-1&&(K=-1);break}case S:case te:case ee:$+=n.delimit(q);break;case x:case b:case y:case m:$+=n.whitespace(J);break;case v:$+=n.escaping(n.position-1,7);continue;case p:switch(n.peek()){case _:case p:R.push(A({value:n.commenter(n.next(),n.position),root:i,parent:O,props:n.character,siblings:R,line:n.line,column:n.column})),(D(E(J,g))===5||D(E(n.peek(),g))===5)&&$.length&&$.slice(-1)!==m&&($+=m);break;default:$+=p}break;case w(123*W):L[z]=$.length*K,z++;case w(125*W):case f:case u:switch(q){case u:case h:G=!1;case w(59+B):K===-1&&($=$.replace(t,``)),U>0&&($.length-V||W===0&&J===p)&&R.push(j(U>32?{value:$+f,root:N,parent:O,length:V-1,siblings:R,line:n.line,column:n.column}:{value:$.replace(m,``)+f,root:N,parent:O,length:V-2,siblings:R,line:n.line,column:n.column}));break;case f:$+=f;default:if(X=[],Z=[],F.push(Q=k({value:$,root:i,parent:O,index:z,offset:B,rules:P,points:L,type:Y,props:X,children:Z,length:V,siblings:F,line:n.line,column:n.column})),q===d)if(B===0)M(n,{value:$,root:i,parent:Q,rule:Q,rules:X,rulesets:F,pseudo:V,points:L,declarations:Z});else{switch(H){case`c`:if($.slice(2,10)===`ontainer`)break;B=0;case`l`:if($.slice(2,6)===`ayer`)break;B=0;case`d`:case`m`:case`s`:break;default:B=0}B?(N&&(X=[],Z.push(k({value:r,root:Q,parent:Q,index:0,offset:0,rules:P,points:L,type:Y,props:P,children:X,length:V,siblings:Z,line:n.line,column:n.column}))),M(n,{value:r,root:Q,parent:Q,rule:Z,rules:P,rulesets:Z,pseudo:V,points:L,declarations:N?X:Z})):M(n,{value:$,root:Q,parent:Q,rule:Q,rulesets:Z,points:L,declarations:Z})}}z=B=U=0,W=K=1,Y=$=``,V=I;break;case l:V=1+$.length,U=T(J);default:if(W<1){if(q===d)W--;else if(q===h&&(W++,W===1&&n.prev()===h))continue}switch($+=q,w(T(q)*W)){case e:B>0?K=1:($+=t,K=-1);break;case c:L[z]=($.length-1)*K,z++,K=1;break;case o:n.peek()===a&&($+=n.delimit(n.next())),H=n.peek(),Y=$+=n.identifier(n.position),B=V=Y.length,q=s;break;case a:J===a&&$.length===2&&(W=0)}}return F},N=e=>M(new O(e));export{A as comment,N as compile,j as declaration,M as parse,k as ruleset};
//# sourceMappingURL=parser.js.map