コード例 #1
0
// 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());
}
コード例 #2
0
ファイル: ass_dialogue.cpp プロジェクト: liloneum/Aegisub
static std::string get_text(AssDialogueBlock &d) { return d.GetText(); }
コード例 #3
0
/// @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);
}