Statement* Cssize::debubble(Block* children, Statement* parent) { Has_Block* previous_parent = 0; std::vector<std::pair<bool, Block*>> baz = slice_by_bubble(children); Block* result = SASS_MEMORY_NEW(ctx.mem, Block, children->pstate()); for (size_t i = 0, L = baz.size(); i < L; ++i) { bool is_bubble = baz[i].first; Block* slice = baz[i].second; if (!is_bubble) { if (!parent) { *result << slice; } else if (previous_parent) { *previous_parent->block() += slice; } else { previous_parent = static_cast<Has_Block*>(shallow_copy(parent)); previous_parent->tabs(parent->tabs()); Has_Block* new_parent = static_cast<Has_Block*>(shallow_copy(parent)); new_parent->block(slice); new_parent->tabs(parent->tabs()); *result << new_parent; } continue; } Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block, children->block()->pstate(), children->block()->length(), children->block()->is_root()); for (size_t j = 0, K = slice->length(); j < K; ++j) { Statement* ss = 0; Bubble* b = static_cast<Bubble*>((*slice)[j]); if (!parent || parent->statement_type() != Statement::MEDIA || b->node()->statement_type() != Statement::MEDIA || static_cast<Media_Block*>(b->node())->media_queries() == static_cast<Media_Block*>(parent)->media_queries()) { ss = b->node(); } else { List* mq = merge_media_queries(static_cast<Media_Block*>(b->node()), static_cast<Media_Block*>(parent)); if (!mq->length()) continue; static_cast<Media_Block*>(b->node())->media_queries(mq); ss = b->node(); } if (!ss) continue; ss->tabs(ss->tabs() + b->tabs()); ss->group_end(b->group_end()); if (!ss) continue; Block* bb = SASS_MEMORY_NEW(ctx.mem, Block, children->block()->pstate(), children->block()->length(), children->block()->is_root()); *bb << ss->perform(this); Statement* wrapper = flatten(bb); *wrapper_block << wrapper; if (wrapper->block()->length()) { previous_parent = 0; } } if (wrapper_block) { *result << flatten(wrapper_block); } } return flatten(result); }
Block_Ptr Cssize::debubble(Block_Ptr children, Statement_Ptr parent) { Has_Block_Obj previous_parent = 0; std::vector<std::pair<bool, Block_Obj>> baz = slice_by_bubble(children); Block_Obj result = SASS_MEMORY_NEW(Block, children->pstate()); for (size_t i = 0, L = baz.size(); i < L; ++i) { bool is_bubble = baz[i].first; Block_Obj slice = baz[i].second; if (!is_bubble) { if (!parent) { result->append(slice); } else if (previous_parent) { previous_parent->block()->concat(slice); } else { previous_parent = Cast<Has_Block>(SASS_MEMORY_COPY(parent)); previous_parent->block(slice); previous_parent->tabs(parent->tabs()); result->append(previous_parent); } continue; } for (size_t j = 0, K = slice->length(); j < K; ++j) { Statement_Ptr ss; Statement_Obj stm = slice->at(j); // this has to go now here (too bad) Bubble_Obj node = Cast<Bubble>(stm); Media_Block_Ptr m1 = NULL; Media_Block_Ptr m2 = NULL; if (parent) m1 = Cast<Media_Block>(parent); if (node) m2 = Cast<Media_Block>(node->node()); if (!parent || parent->statement_type() != Statement::MEDIA || node->node()->statement_type() != Statement::MEDIA || (m1 && m2 && *m1->media_queries() == *m2->media_queries()) ) { ss = node->node(); } else { List_Obj mq = merge_media_queries( Cast<Media_Block>(node->node()), Cast<Media_Block>(parent) ); if (!mq->length()) continue; if (Media_Block* b = Cast<Media_Block>(node->node())) { b->media_queries(mq); } ss = node->node(); } if (!ss) continue; ss->tabs(ss->tabs() + node->tabs()); ss->group_end(node->group_end()); Block_Obj bb = SASS_MEMORY_NEW(Block, children->pstate(), children->length(), children->is_root()); bb->append(ss->perform(this)); Block_Obj wrapper_block = SASS_MEMORY_NEW(Block, children->pstate(), children->length(), children->is_root()); Block_Ptr wrapper = flatten(bb); wrapper_block->append(wrapper); if (wrapper->length()) { previous_parent = NULL; } if (wrapper_block) { result->append(wrapper_block); } } } return flatten(result); }