Replace custom karaoke parsing code in LuaAssFile with AssKaraoke

Originally committed to SVN as r5626.
This commit is contained in:
Thomas Goyne 2011-09-28 19:46:23 +00:00
parent 1329245a21
commit dfc18afd34
1 changed files with 15 additions and 116 deletions

View File

@ -47,9 +47,11 @@
#endif
#include <libaegisub/log.h>
#include <libaegisub/scoped_ptr.h>
#include "ass_dialogue.h"
#include "ass_file.h"
#include "ass_karaoke.h"
#include "ass_override.h"
#include "ass_style.h"
#include "auto4_lua.h"
@ -858,130 +860,27 @@ namespace Automation4 {
///
int LuaAssFile::LuaParseKaraokeData(lua_State *L)
{
AssEntry *e = LuaToAssEntry(L);
AssDialogue *dia = dynamic_cast<AssDialogue*>(e);
agi::scoped_ptr<AssEntry> e(LuaToAssEntry(L));
AssDialogue *dia = dynamic_cast<AssDialogue*>(e.get());
if (!dia) {
delete e;
lua_pushstring(L, "Attempt to create karaoke table from non-dialogue subtitle line");
lua_error(L);
return 0;
}
dia->ParseASSTags();
int kcount = 0;
int kdur = 0;
int ktime = 0;
wxString ktag = "";
wxString ktext = "";
wxString ktext_stripped = "";
AssKaraoke kara(dia);
for (AssKaraoke::iterator it = kara.begin(); it != kara.end(); ++it) {
lua_newtable(L);
for (int i = 0; i < (int)dia->Blocks.size(); i++) {
AssDialogueBlock *block = dia->Blocks[i];
switch (block->GetType()) {
case BLOCK_BASE:
break;
case BLOCK_PLAIN:
ktext += block->text;
ktext_stripped += block->text;
break;
case BLOCK_DRAWING:
// a drawing is regarded as a kind of control code here, so it's just stripped away
ktext += block->text;
break;
case BLOCK_OVERRIDE: {
bool brackets_open = false;
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("\\k") == 0) {
// karaoke tag
if (brackets_open) {
ktext += "}";
brackets_open = false;
set_field(L, "duration", it->duration);
set_field(L, "start_time", it->start_time);
set_field(L, "end_time", it->start_time + it->duration);
set_field(L, "tag", it->tag_type);
set_field(L, "text", it->GetText(false));
set_field(L, "text_stripped", it->text);
lua_rawseti(L, -2, -1);
}
// store to lua
lua_newtable(L);
lua_pushnumber(L, kdur);
lua_setfield(L, -2, "duration");
lua_pushnumber(L, ktime);
lua_setfield(L, -2, "start_time");
lua_pushnumber(L, ktime+kdur);
lua_setfield(L, -2, "end_time");
lua_pushstring(L, ktag.mb_str(wxConvUTF8));
lua_setfield(L, -2, "tag");
lua_pushstring(L, ktext.mb_str(wxConvUTF8));
lua_setfield(L, -2, "text");
lua_pushstring(L, ktext_stripped.mb_str(wxConvUTF8));
lua_setfield(L, -2, "text_stripped");
lua_rawseti(L, -2, kcount);
// prepare new syllable
kcount++;
ktag = tag->Name.Mid(1);
// check if it's a "set time" tag, special handling for that (depends on previous syllable duration)
if (ktag == "kt") {
ktime = tag->Params[0]->Get<int>() * 10;
kdur = 0;
} else {
ktime += kdur; // duration of previous syllable
kdur = tag->Params[0]->Get<int>() * 10;
}
ktext.clear();
ktext_stripped.clear();
} else {
// not karaoke tag
if (!brackets_open) {
ktext += "{";
brackets_open = true;
}
ktext += *tag;
}
}
if (brackets_open) {
ktext += "}";
brackets_open = false;
}
break;
}
}
}
dia->ClearBlocks();
// store final syllable/block to lua
lua_newtable(L);
lua_pushnumber(L, kdur);
lua_setfield(L, -2, "duration");
lua_pushnumber(L, ktime);
lua_setfield(L, -2, "start_time");
lua_pushnumber(L, ktime+kdur);
lua_setfield(L, -2, "end_time");
lua_pushstring(L, ktag.mb_str(wxConvUTF8));
lua_setfield(L, -2, "tag");
lua_pushstring(L, ktext.mb_str(wxConvUTF8));
lua_setfield(L, -2, "text");
lua_pushstring(L, ktext_stripped.mb_str(wxConvUTF8));
lua_setfield(L, -2, "text_stripped");
lua_rawseti(L, -2, kcount);
delete dia;
return 1;
}