@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 2.72 kB
JavaScript
import{createTokenizer}from"./FormatterWorker.js";export const CSSParserStates={Initial:"Initial",Selector:"Selector",Style:"Style",PropertyName:"PropertyName",PropertyValue:"PropertyValue",AtRule:"AtRule"};export function parseCSS(e,t){const a=e.split("\n");let n,r,s=[],l=0,S=CSSParserStates.Initial;const o=new Set;let u=[];function i(e){u=u.concat(e.chunk)}function c(e){return e.replace(/^(?:\r?\n|[\t\f\r ])+|(?:\r?\n|[\t\f\r ])+$/g,"")}function m(e,a,m,g){const h=a?new Set(a.split(" ")):o;switch(S){case CSSParserStates.Initial:h.has("qualifier")||h.has("builtin")||h.has("tag")?(n={selectorText:e,lineNumber:p,columnNumber:m,properties:[]},S=CSSParserStates.Selector):h.has("def")&&(n={atRule:e,lineNumber:p,columnNumber:m},S=CSSParserStates.AtRule);break;case CSSParserStates.Selector:"{"===e&&h===o?(n.selectorText=c(n.selectorText),n.styleRange=C(p,g),S=CSSParserStates.Style):n.selectorText+=e;break;case CSSParserStates.AtRule:";"!==e&&"{"!==e||h!==o?n.atRule+=e:(n.atRule=c(n.atRule),s.push(n),S=CSSParserStates.Initial);break;case CSSParserStates.Style:if(h.has("meta")||h.has("property")||h.has("variable-2"))r={name:e,value:"",range:C(p,m),nameRange:C(p,m)},S=CSSParserStates.PropertyName;else if("}"===e&&h===o)n.styleRange.endLine=p,n.styleRange.endColumn=m,s.push(n),S=CSSParserStates.Initial;else if(h.has("comment")){if("/*"!==e.substring(0,2)||"*/"!==e.substring(e.length-2))break;const t=e.substring(2,e.length-2);if(u=[],parseCSS("a{\n"+t+"}",i),1===u.length&&1===u[0].properties.length){const e=u[0].properties[0];e.disabled=!0,e.range=C(p,m),e.range.endColumn=g;const t=p-1,a=m+2;e.nameRange.startLine+=t,e.nameRange.startColumn+=a,e.nameRange.endLine+=t,e.nameRange.endColumn+=a,e.valueRange.startLine+=t,e.valueRange.startColumn+=a,e.valueRange.endLine+=t,e.valueRange.endColumn+=a,n.properties.push(e)}}break;case CSSParserStates.PropertyName:":"===e&&h===o?(r.name=r.name,r.nameRange.endLine=p,r.nameRange.endColumn=m,r.valueRange=C(p,g),S=CSSParserStates.PropertyValue):h.has("property")&&(r.name+=e);break;case CSSParserStates.PropertyValue:";"!==e&&"}"!==e||h!==o?h.has("comment")||(r.value+=e):(r.value=r.value,r.valueRange.endLine=p,r.valueRange.endColumn=m,r.range.endLine=p,r.range.endColumn=";"===e?g:m,n.properties.push(r),"}"===e?(n.styleRange.endLine=p,n.styleRange.endColumn=m,s.push(n),S=CSSParserStates.Initial):S=CSSParserStates.Style);break;default:console.assert(!1,"Unknown CSS parser state.")}l+=g-m,l>1e5&&(t({chunk:s,isLastChunk:!1}),s=[],l=0)}const g=createTokenizer("text/css");let p;for(p=0;p<a.length;++p){const e=a[p];g(e,m),m("\n",null,e.length,e.length+1)}function C(e,t){return{startLine:e,startColumn:t,endLine:e,endColumn:t}}t({chunk:s,isLastChunk:!0})}