Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/flo-bit/shapecraft. flo-bit.dev/shapecraft
Something went wrong. Try again.
2.2 kB · 95 lines
JavaScript
at commit da69385e
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596import { WhiteSpace, Comment, Semicolon, AtKeyword, LeftCurlyBracket, RightCurlyBracket} from '../../tokenizer/index.js';
const AMPERSAND = 0x0026; // U+0026 AMPERSAND (&)
function consumeRaw() { return this.Raw(null, true);}function consumeRule() { return this.parseWithFallback(this.Rule, consumeRaw);}function consumeRawDeclaration() { return this.Raw(this.consumeUntilSemicolonIncluded, true);}function consumeDeclaration() { if (this.tokenType === Semicolon) { return consumeRawDeclaration.call(this, this.tokenIndex); }
const node = this.parseWithFallback(this.Declaration, consumeRawDeclaration);
if (this.tokenType === Semicolon) { this.next(); }
return node;}
export const name = 'Block';export const walkContext = 'block';export const structure = { children: [[ 'Atrule', 'Rule', 'Declaration' ]]};
export function parse(isStyleBlock) { const consumer = isStyleBlock ? consumeDeclaration : consumeRule; const start = this.tokenStart; let children = this.createList();
this.eat(LeftCurlyBracket);
scan: while (!this.eof) { switch (this.tokenType) { case RightCurlyBracket: break scan;
case WhiteSpace: case Comment: this.next(); break;
case AtKeyword: children.push(this.parseWithFallback(this.Atrule.bind(this, isStyleBlock), consumeRaw)); break;
default: if (isStyleBlock && this.isDelim(AMPERSAND)) { children.push(consumeRule.call(this)); } else { children.push(consumer.call(this)); } } }
if (!this.eof) { this.eat(RightCurlyBracket); }
return { type: 'Block', loc: this.getLocation(start, this.tokenStart), children };}
export function generate(node) { this.token(LeftCurlyBracket, '{'); this.children(node, prev => { if (prev.type === 'Declaration') { this.token(Semicolon, ';'); } }); this.token(RightCurlyBracket, '}');}