Statement* Cssize::operator()(Keyframe_Rule* r) { if (!r->block() || !r->block()->length()) return r; Keyframe_Rule* rr = SASS_MEMORY_NEW(ctx.mem, Keyframe_Rule, r->pstate(), r->block()->perform(this)->block()); if (r->selector()) rr->selector(r->selector()); return debubble(rr->block(), rr)->block(); }
Statement_Ptr Cssize::operator()(Keyframe_Rule_Ptr r) { if (!r->block() || !r->block()->length()) return r; Keyframe_Rule_Obj rr = SASS_MEMORY_NEW(Keyframe_Rule, r->pstate(), operator()(r->block())); if (!r->name().isNull()) rr->name(r->name()); return debubble(rr->block(), rr); }
Statement_Ptr Cssize::operator()(Directive_Ptr r) { if (!r->block() || !r->block()->length()) return r; if (parent()->statement_type() == Statement::RULESET) { return (r->is_keyframes()) ? SASS_MEMORY_NEW(Bubble, r->pstate(), r) : bubble(r); } p_stack.push_back(r); Directive_Obj rr = SASS_MEMORY_NEW(Directive, r->pstate(), r->keyword(), r->selector(), r->block() ? operator()(r->block()) : 0); if (r->value()) rr->value(r->value()); p_stack.pop_back(); bool directive_exists = false; size_t L = rr->block() ? rr->block()->length() : 0; for (size_t i = 0; i < L && !directive_exists; ++i) { Statement_Obj s = r->block()->at(i); if (s->statement_type() != Statement::BUBBLE) directive_exists = true; else { Bubble_Obj s_obj = Cast<Bubble>(s); s = s_obj->node(); if (s->statement_type() != Statement::DIRECTIVE) directive_exists = false; else directive_exists = (Cast<Directive>(s)->keyword() == rr->keyword()); } } Block_Ptr result = SASS_MEMORY_NEW(Block, rr->pstate()); if (!(directive_exists || rr->is_keyframes())) { Directive_Ptr empty_node = Cast<Directive>(rr); empty_node->block(SASS_MEMORY_NEW(Block, rr->block() ? rr->block()->pstate() : rr->pstate())); result->append(empty_node); } Block_Obj db = rr->block(); if (db.isNull()) db = SASS_MEMORY_NEW(Block, rr->pstate()); Block_Obj ss = debubble(db, rr); for (size_t i = 0, L = ss->length(); i < L; ++i) { result->append(ss->at(i)); } return result; }
Statement* Cssize::operator()(At_Rule* r) { if (!r->block() || !r->block()->length()) return r; if (parent()->statement_type() == Statement::RULESET) { return (r->is_keyframes()) ? SASS_MEMORY_NEW(ctx.mem, Bubble, r->pstate(), r) : bubble(r); } p_stack.push_back(r); At_Rule* rr = SASS_MEMORY_NEW(ctx.mem, At_Rule, r->pstate(), r->keyword(), r->selector(), r->block() ? r->block()->perform(this)->block() : 0); if (r->value()) rr->value(r->value()); p_stack.pop_back(); bool directive_exists = false; size_t L = rr->block() ? rr->block()->length() : 0; for (size_t i = 0; i < L && !directive_exists; ++i) { Statement* s = (*r->block())[i]; if (s->statement_type() != Statement::BUBBLE) directive_exists = true; else { s = static_cast<Bubble*>(s)->node(); if (s->statement_type() != Statement::DIRECTIVE) directive_exists = false; else directive_exists = (static_cast<At_Rule*>(s)->keyword() == rr->keyword()); } } Block* result = SASS_MEMORY_NEW(ctx.mem, Block, rr->pstate()); if (!(directive_exists || rr->is_keyframes())) { At_Rule* empty_node = static_cast<At_Rule*>(rr); empty_node->block(SASS_MEMORY_NEW(ctx.mem, Block, rr->block() ? rr->block()->pstate() : rr->pstate())); *result << empty_node; } Statement* ss = debubble(rr->block() ? rr->block() : SASS_MEMORY_NEW(ctx.mem, Block, rr->pstate()), rr); for (size_t i = 0, L = ss->block()->length(); i < L; ++i) { *result << (*ss->block())[i]; } return result; }
Statement* Cssize::operator()(Ruleset* r) { p_stack.push_back(r); Ruleset* rr = SASS_MEMORY_NEW(ctx.mem, Ruleset, r->pstate(), r->selector(), r->block()->perform(this)->block()); // rr->tabs(r->block()->tabs()); p_stack.pop_back(); Block* props = SASS_MEMORY_NEW(ctx.mem, Block, rr->block()->pstate()); Block* rules = SASS_MEMORY_NEW(ctx.mem, Block, rr->block()->pstate()); for (size_t i = 0, L = rr->block()->length(); i < L; i++) { Statement* s = (*rr->block())[i]; if (bubblable(s)) *rules << s; if (!bubblable(s)) *props << s; } if (props->length()) { Block* bb = SASS_MEMORY_NEW(ctx.mem, Block, rr->block()->pstate()); *bb += props; rr->block(bb); for (size_t i = 0, L = rules->length(); i < L; i++) { (*rules)[i]->tabs((*rules)[i]->tabs() + 1); } rules->unshift(rr); } rules = debubble(rules)->block(); if (!(!rules->length() || !bubblable(rules->last()) || parent()->statement_type() == Statement::RULESET)) { rules->last()->group_end(true); } return rules; }
Statement* Cssize::operator()(Supports_Block* m) { if (!m->block()->length()) { return m; } if (parent()->statement_type() == Statement::RULESET) { return bubble(m); } p_stack.push_back(m); Supports_Block* mm = SASS_MEMORY_NEW(ctx.mem, Supports_Block, m->pstate(), m->condition(), m->block()->perform(this)->block()); mm->tabs(m->tabs()); p_stack.pop_back(); return debubble(mm->block(), mm)->block(); }
Statement* Cssize::operator()(Media_Block* m) { if (parent()->statement_type() == Statement::RULESET) { return bubble(m); } if (parent()->statement_type() == Statement::MEDIA) { return SASS_MEMORY_NEW(ctx.mem, Bubble, m->pstate(), m); } p_stack.push_back(m); Media_Block* mm = SASS_MEMORY_NEW(ctx.mem, Media_Block, m->pstate(), m->media_queries(), m->block()->perform(this)->block()); mm->tabs(m->tabs()); p_stack.pop_back(); return debubble(mm->block(), mm)->block(); }
Statement_Ptr Cssize::operator()(Media_Block_Ptr m) { if (parent()->statement_type() == Statement::RULESET) { return bubble(m); } if (parent()->statement_type() == Statement::MEDIA) { return SASS_MEMORY_NEW(Bubble, m->pstate(), m); } p_stack.push_back(m); Media_Block_Obj mm = SASS_MEMORY_NEW(Media_Block, m->pstate(), m->media_queries(), operator()(m->block())); mm->tabs(m->tabs()); p_stack.pop_back(); return debubble(mm->block(), mm); }
Statement_Ptr Cssize::operator()(Ruleset_Ptr r) { p_stack.push_back(r); // this can return a string schema // string schema is not a statement! // r->block() is already a string schema // and that is comming from propset expand Block_Ptr bb = operator()(r->block()); // this should protect us (at least a bit) from our mess // fixing this properly is harder that it should be ... if (Cast<Statement>(bb) == NULL) { error("Illegal nesting: Only properties may be nested beneath properties.", r->block()->pstate(), traces); } Ruleset_Obj rr = SASS_MEMORY_NEW(Ruleset, r->pstate(), r->selector(), bb); rr->is_root(r->is_root()); // rr->tabs(r->block()->tabs()); p_stack.pop_back(); if (!rr->block()) { error("Illegal nesting: Only properties may be nested beneath properties.", r->block()->pstate(), traces); } Block_Obj props = SASS_MEMORY_NEW(Block, rr->block()->pstate()); Block_Ptr rules = SASS_MEMORY_NEW(Block, rr->block()->pstate()); for (size_t i = 0, L = rr->block()->length(); i < L; i++) { Statement_Ptr s = rr->block()->at(i); if (bubblable(s)) rules->append(s); if (!bubblable(s)) props->append(s); } if (props->length()) { Block_Obj pb = SASS_MEMORY_NEW(Block, rr->block()->pstate()); pb->concat(props); rr->block(pb); for (size_t i = 0, L = rules->length(); i < L; i++) { Statement_Ptr stm = rules->at(i); stm->tabs(stm->tabs() + 1); } rules->unshift(rr); } Block_Ptr ptr = rules; rules = debubble(rules); void* lp = ptr; void* rp = rules; if (lp != rp) { Block_Obj obj = ptr; } if (!(!rules->length() || !bubblable(rules->last()) || parent()->statement_type() == Statement::RULESET)) { rules->last()->group_end(true); } return rules; }