#include "stdafx.h" #include "common.h" #include "sabbu.h" #include "kryString.h" #include "kryArray.h" #include "krySSACommandParser.h" #include "krySSAKaraokeParser.h" #include "gui_main_karaoke.h" krySSAKaraokeParser::krySSAKaraokeParser(kryString str, kryList *parts, kryEventKaraokeText **part_start, kryEventKaraokeText **part_end) : m_duration(-1), m_prev_part(NULL), m_part_time(NULL), m_part_command(NULL), m_part_start(part_start), m_part_end(part_end), m_parts(parts), m_str(&str), m_prevpos(0), m_is_command(FALSE), m_karaoke_type(KARAOKE_HIGHLIGHT), m_index(0) { ParseSubtitleString(str); AddUnparsedString(str.GetLength()); } void krySSAKaraokeParser::AddUnparsedString(int offset) { if(offset > this->m_prevpos) { kryEventKaraokeHidden *event = new kryEventKaraokeHidden(); event->SetText(this->m_str->Mid(this->m_prevpos, offset - m_prevpos).GetBuffer()); this->m_parts->Append(event); this->m_prevpos = offset; if(this->m_is_command && !this->m_part_command) this->m_part_command = event; } } void krySSAKaraokeParser::OnCommandGroupStart(kryString str, int offset) { AddUnparsedString(offset); this->m_part_command = NULL; this->m_is_command = TRUE; } void krySSAKaraokeParser::OnCommandGroupEnd(kryString str, int offset) { this->m_is_command = FALSE; } void krySSAKaraokeParser::OnCommand(kryString &str, int offset, int length, kryArray ¶ms, kryArray ¶m_offsets) { if(strcmp(str.GetBuffer(), "k") && strcmp(str.GetBuffer(), "K") && strcmp(str.GetBuffer(), "kf") && strcmp(str.GetBuffer(), "ko")) return; AddUnparsedString(offset); kryEventKaraokeTime *event = new kryEventKaraokeTime(); event->SetText(this->m_str->Mid(this->m_prevpos + str.GetLength() + 1, length - str.GetLength() - 1).GetBuffer()); this->m_parts->Append(event); this->m_karaoke_type = gui_main_karaoke_get_type(str.GetBuffer()); if(params.GetCount() > 0) { this->m_duration = atoi(params[0].GetBuffer()) * 10; event->SetParamOffset(param_offsets[0] - offset - str.GetLength() - 1); event->SetParamLength(params[0].GetLength()); } else { this->m_duration = 1000; event->SetParamOffset(length - str.GetLength() - 1); event->SetParamLength(0); } this->m_part_time = event; this->m_prevpos += length; } void krySSAKaraokeParser::OnString(kryString &str, int offset) { AddUnparsedString(offset); if(str.GetLength() == 0 && !this->m_part_time) return; kryEventKaraokeText *part_prev = NULL; int prev_pos = 0; for(int i = 0; i <= str.GetLength(); i++) { if(i == str.GetLength() || str[i] == ' ') { kryEventKaraokeText *event = new kryEventKaraokeTextBox(); event->SetText(str.Mid(prev_pos, i - prev_pos).GetBuffer()); if(str.GetLength() == 0) { event->SetIsSilence(TRUE); if(this->m_duration == 0) event->SetIsLocked(TRUE); } event->SetDuration(this->m_duration); this->m_duration = -1; if(this->m_part_time) { event->SetIsTimed(TRUE); } else { this->m_part_time = gui_main_karaoke_create_empty_time_part(event); this->m_parts->Append(this->m_part_time); } event->SetPartTime(this->m_part_time); event->SetKaraokeType(this->m_karaoke_type); this->m_part_time->SetEventText(event); this->m_part_time = NULL; this->m_prevpos = offset + i; while(i < str.GetLength() && str[i] == ' ') i++; prev_pos = i; event->SetEventPrev(this->m_prev_part); if(event->GetEventPrev()) { event->GetEventPrev()->SetEventNext(event); if(event->GetIsSilence()) { event->SetIndex(this->m_index); } else { event->SetIndex(this->m_index); this->m_index++; } } else { event->SetIndex(0); if(!event->GetIsSilence()) this->m_index++; } event->SetCommandPrev(this->m_part_command); this->m_prev_part = event; this->m_parts->Append(event); if(!*this->m_part_start) *this->m_part_start = event; *this->m_part_end = event; this->m_part_command = NULL; AddUnparsedString(offset + i); if(part_prev) part_prev->SetCommandNext(event->GetPartTime()); part_prev = event; } } }