// Skip over override blocks, comments, and whitespace between blocks static bool bad_block(AssDialogueBlock &block) { return block.GetType() != AssBlockType::PLAIN || boost::all(block.GetText(), boost::is_space()); }
/// @brief DOCME /// @param line /// @param syls /// void ParseAssKaraokeTags(const AssDialogue *line, AssKaraokeVector &syls) { // Assume line already has tags parsed AssKaraokeSyllable syl; bool brackets_open = false; for (int i = 0; i < (int)line->Blocks.size(); i++) { AssDialogueBlock *block = line->Blocks[i]; switch (block->GetType()) { case BLOCK_BASE: break; case BLOCK_PLAIN: syl.text += block->text; syl.unstripped_text += block->text; break; case BLOCK_DRAWING: // Regard drawings as tags syl.unstripped_text += block->text; break; case BLOCK_OVERRIDE: { AssDialogueBlockOverride *ovr = dynamic_cast<AssDialogueBlockOverride*>(block); for (int j = 0; j < (int)ovr->Tags.size(); j++) { AssOverrideTag *tag = ovr->Tags[j]; if (tag->IsValid() && tag->Name.Mid(0,2).CmpNoCase(_T("\\k")) == 0) { // karaoke tag if (brackets_open) { syl.unstripped_text += _T("}"); brackets_open = false; } // Store syllable syls.push_back(syl); syl.text = _T(""); syl.unstripped_text = _T(""); syl.tag = tag; syl.type = tag->Name; syl.duration = tag->Params[0]->Get<int>(); } else { // not karaoke tag if (!brackets_open) { syl.unstripped_text += _T("{"); brackets_open = true; } syl.unstripped_text += *tag; } } if (brackets_open) { brackets_open = false; syl.unstripped_text += _T("}"); } break; } } } syls.push_back(syl); }