void LessAtRule::process(Stylesheet &s) { AtRule* target = s.createAtRule(getKeyword()); target->setRule(getRule()); getLessStylesheet()->getContext()->processValue(target->getRule()); }
bool LessParser::parseAtRuleOrVariable (LessStylesheet &stylesheet) { Token token; TokenList value, rule; AtRule* atrule = NULL; if (tokenizer->getTokenType() != Token::ATKEYWORD) return false; token = tokenizer->getToken(); tokenizer->readNextToken(); CssParser::skipWhitespace(); #ifdef WITH_LIBGLOG VLOG(2) << "Parse: keyword: " << token; #endif if (parseVariable(value)) { #ifdef WITH_LIBGLOG VLOG(2) << "Parse: variable"; #endif stylesheet.putVariable(token, value); } else { if (token == "@media") { parseLessMediaQuery(token, stylesheet); return true; } while(parseAny(rule)) {}; if (!parseBlock(rule)) { if (tokenizer->getTokenType() != Token::DELIMITER) { throw new ParseException(tokenizer->getToken(), "delimiter (';') at end of @-rule"); } tokenizer->readNextToken(); skipWhitespace(); } // parse import if (token == "@import" && rule.size() > 0) { if (parseImportStatement(rule, stylesheet)) return true; } atrule = stylesheet.createLessAtRule(token); atrule->setReference(reference); atrule->setRule(rule); } return true; }
// At rules TEST(CssParserTest, AtRule) { istringstream in("@import somefile;"); CssTokenizer t(&in); CssParser p(&t); Stylesheet s; AtRule* at; p.parseStylesheet(&s); ASSERT_EQ(1, s.getAtRules()->size()); at = s.getAtRules()->at(0); ASSERT_STREQ("@import", at->getKeyword()->c_str()); ASSERT_STREQ("somefile", at->getRule()->toString()->c_str()); }
AtRule* CssParser::parseAtRule () { AtRule* atrule = NULL; if (tokenizer->getTokenType() != Token::ATKEYWORD) return NULL; atrule = new AtRule(new string(tokenizer->getToken()->str)); tokenizer->readNextToken(); skipWhitespace(); TokenList* rule = new TokenList(); while(parseAny(rule)) {}; if (!parseBlock(rule)) { if (tokenizer->getTokenType() != Token::DELIMITER) { throw new ParseException(tokenizer->getToken()->str, "delimiter (';') at end of @-rule"); } tokenizer->readNextToken(); skipWhitespace(); } atrule->setRule(rule); return atrule; }
bool LessParser::parseAtRuleOrVariable (LessStylesheet &stylesheet) { string keyword, import; TokenList value, rule; AtRule* atrule = NULL; if (tokenizer->getTokenType() != Token::ATKEYWORD) return false; keyword = tokenizer->getToken(); tokenizer->readNextToken(); skipWhitespace(); #ifdef WITH_LIBGLOG VLOG(2) << "Parse: keyword: " << keyword; #endif if (parseVariable(value)) { #ifdef WITH_LIBGLOG VLOG(2) << "Parse: variable"; #endif stylesheet.putVariable(keyword, value); } else { if (keyword == "@media") { parseLessMediaQuery(stylesheet); return true; } while(parseAny(rule)) {}; if (!parseBlock(rule)) { if (tokenizer->getTokenType() != Token::DELIMITER) { throw new ParseException(tokenizer->getToken(), "delimiter (';') at end of @-rule", tokenizer->getLineNumber(), tokenizer->getColumn(), tokenizer->getSource()); } tokenizer->readNextToken(); skipWhitespace(); } // parse import if (keyword == "@import") { if (rule.size() != 1 || rule.front().type != Token::STRING) throw new ParseException(rule.toString(), "A string with the \ file path", tokenizer->getLineNumber(), tokenizer->getColumn(), tokenizer->getSource()); import = rule.front(); #ifdef WITH_LIBGLOG VLOG(2) << "Import filename: " << import; #endif if (import.size() < 5 || import.substr(import.size() - 5, 4) != ".css") { if (import.size() < 6 || import.substr(import.size() - 6, 5) != ".less") import.insert(import.size() - 1, ".less"); importFile(import.substr(1, import.size() - 2), stylesheet); return true; } } atrule = stylesheet.createAtRule(keyword); atrule->setRule(rule); } return true; }