mirror of https://github.com/odrling/Aegisub
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:
parent
2928449ecc
commit
8129285630
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
|
Loading…
Reference in New Issue