Fix #759, correctly merge lines with identical text when exporting to simple subtitle formats.

Originally committed to SVN as r2301.
This commit is contained in:
Niels Martin Hansen 2008-08-11 00:02:36 +00:00
parent 2928449ecc
commit 8129285630

View file

@ -515,7 +515,7 @@ void SubtitleFormat::MergeIdentical() {
AssDialogue *curdlg = AssEntry::GetAsDialogue(*cur);
AssDialogue *nextdlg = AssEntry::GetAsDialogue(*next);
if (curdlg && nextdlg && curdlg->Text == nextdlg->Text) {
if (curdlg && nextdlg && curdlg->End == nextdlg->Start && curdlg->Text == nextdlg->Text) {
// Merge timing
nextdlg->Start = (nextdlg->Start < curdlg->Start ? nextdlg->Start : curdlg->Start);
nextdlg->End = (nextdlg->End > curdlg->End ? nextdlg->End : curdlg->End);
@ -527,143 +527,3 @@ void SubtitleFormat::MergeIdentical() {
}
}
////////////////////////////////////////////
// Merge identical and/or overlapping lines
/*void SubtitleFormat::Merge(bool identical,bool overlaps,bool stripComments,bool stripNonDialogue) {
using std::list;
list<AssEntry*>::iterator next;
list<AssEntry*>::iterator prev = Line->end();
AssDialogue *previous = NULL;
// Loop through each line
for (list<AssEntry*>::iterator cur=Line->begin();cur!=Line->end();cur=next) {
next = cur;
next++;
// Dialogue line
AssDialogue *current = AssEntry::GetAsDialogue(*cur);
if (current) {
// Strip comments and empty lines
if ((current->Comment && stripComments) || current->Text.IsEmpty()) {
delete *cur;
Line->erase(cur);
}
// Proper line
else {
if (previous != NULL) {
// Check for duplication
if (identical && previous->Text == current->Text) {
if (abs(current->Start.GetMS() - previous->End.GetMS()) < 20) {
current->Start = (current->Start < previous->Start ? current->Start : previous->Start);
current->End = (current->End > previous->End ? current->End : previous->End);
delete *prev;
Line->erase(prev);
}
}
// Check for overlap
//
if (overlaps && previous->End.GetMS() > current->Start.GetMS()) {
// Grab the data
int prev_s = previous->Start.GetMS();
int prev_e = previous->End.GetMS();
int cur_s = current->Start.GetMS();
int cur_e = current->End.GetMS();
wxString prev_t = previous->Text;
wxString cur_t = current->Text;
// Make sure cur points to the line before those we're working with
--cur;
// Remove 'cur' and 'prev' from list
Line->erase(prev);
Line->erase(prev);
// Now make sure that 'cur' points to the item after the old 'current'
++cur;
// A-only part
if (prev_s < cur_s) {
// Actually lines generated from this one never move
// So we can assume it can just be inserted at cur
AssDialogue *part = AssEntry::GetAsDialogue(previous->Clone());
part->End.SetMS(prev_s);
// Nothing to do about start-time or text, they are already correct
// Insert into list
Line->insert(cur, part);
// 'cur' now points to one past newly inserted item
}
// A+B part
{
// These lines never move either, so just insert
AssDialogue *part = AssEntry::GetAsDialogue(current->Clone());
// Fix values
part->Start.SetMS(cur_s);
part->End.SetMS(prev_e);
// Inserting an ASS hard linebreak
part->Text = cur_t + _T("\\N") + prev_t;
// Insert into list
Line->insert(cur, part);
// 'cur' now points to one past newly inserted item
}
// B-only part
if (cur_e > prev_e) {
// We need to seek for the right position here
AssDialogue *part = AssEntry::GetAsDialogue(current->Clone());
// Fix values
part->Start.SetMS(prev_e);
part->End.SetMS(cur_e);
part->Text = cur_t;
list<AssEntry*>::iterator newpos = cur;
// Insert into list
// Make sure 'cur' never moves during this
if (newpos == Line->end()) {
Line->push_back(part);
}
else {
while (newpos != Line->end()) {
AssDialogue *newline = AssEntry::GetAsDialogue(*newpos);
if (newline && part->Start.GetMS() <= newline->Start.GetMS()) {
// Suitable position
Line->insert(newpos, part);
break;
}
++newpos;
}
}
}
// Now 'cur' has moved around a lot so make sure everything is correct
// 'cur' currently points to one past the last inserted item
// It should really point to the last inserted item (that wasn't
// inserted at a later position) so we need to move it one back.
// In fact, 'next' should have that value.
next = cur--;
// 'prev' should already be correct
// And update the rest too
previous = AssEntry::GetAsDialogue(*prev);
current = AssEntry::GetAsDialogue(*cur);
}
}
// Set as previous
prev = cur;
previous = current;
}
}
// Other line, delete it
else {
if (stripNonDialogue) {
delete *cur;
Line->erase(cur);
}
}
}
}*/