std::unique_ptr<IR::Root> JsonConfigParser::parse(const std::string& input) { Json::Value json_root; getJson(json_root, input); auto ir_root = std::make_unique<IR::Root>(); for (const auto& ruleset : json_root.get("rulesets", {})) { ir_root->rulesets.emplace_back(parseRuleset(ruleset)); } ir_root->version = json_root.get("version", "").asString(); IR::dumpIR(*ir_root); return ir_root; }
bool CssParser::parseStatement(Stylesheet* stylesheet) { Ruleset* ruleset = parseRuleset(); if (ruleset != NULL) { stylesheet->addRuleset(ruleset); return true; } AtRule* atrule = parseAtRule(); if (atrule != NULL) { stylesheet->addAtRule(atrule); return true; } return false; }
void LessParser::parseRulesetStatements (LessStylesheet &stylesheet, LessRuleset &ruleset) { Token token; TokenList value; UnprocessedStatement* statement; CssComment* comment; while (true) { if (tokenizer->getTokenType() == Token::COMMENT) { comment = ruleset.createComment(); comment->setComment(tokenizer->getToken()); tokenizer->readNextToken(); skipWhitespace(); } else if (tokenizer->getTokenType() == Token::ATKEYWORD) { token = tokenizer->getToken(); tokenizer->readNextToken(); skipWhitespace(); if (parseVariable(value)) { ruleset.putVariable(token, value); value.clear(); } else if (token == "@media") { parseMediaQueryRuleset(token, stylesheet, ruleset); } else { throw new ParseException(tokenizer->getToken(), "Variable declaration after keyword."); } } else if ((statement = parseRulesetStatement(ruleset)) != NULL) { // a selector followed by a ruleset is a nested rule if (tokenizer->getTokenType() == Token::BRACKET_OPEN) { parseRuleset(stylesheet, *statement->getTokens(), &ruleset); ruleset.deleteUnprocessedStatement(*statement); } } else break; } }
bool LessParser::parseStatement(Stylesheet &stylesheet) { Selector selector; Mixin* mixin; CssComment* comment; LessStylesheet* ls = (LessStylesheet*)&stylesheet; if (tokenizer->getTokenType() == Token::COMMENT) { comment = ls->createComment(); comment->setComment(tokenizer->getToken()); tokenizer->readNextToken(); skipWhitespace(); return true; } else if (parseSelector(selector) && !selector.empty()) { #ifdef WITH_LIBGLOG VLOG(2) << "Parse: Selector: " << selector.toString(); #endif if (parseRuleset(*ls, selector)) return true; // Parameter mixin in the root. Inserts nested rules but no // declarations. mixin = ls->createMixin(); mixin->setReference(reference); if (mixin->parse(selector)) { if (tokenizer->getTokenType() == Token::DELIMITER) { tokenizer->readNextToken(); skipWhitespace(); } return true; } else { ls->deleteMixin(*mixin); throw new ParseException(tokenizer->getToken(), "a declaration block ('{...}') following selector"); } } else { return parseAtRuleOrVariable(*ls); } }