diff --git a/stepmania/src/Course.cpp b/stepmania/src/Course.cpp index 973c7efdd5..702b67666d 100644 --- a/stepmania/src/Course.cpp +++ b/stepmania/src/Course.cpp @@ -259,9 +259,12 @@ void Course::LoadFromCRSFile( CString sPath ) } static TitleSubst tsub("courses"); - CString ignore; - tsub.Subst( m_sName, ignore, ignore, - m_sNameTranslit, ignore, ignore ); + TitleFields title; + title.Title = m_sName; + title.TitleTranslit = m_sNameTranslit; + tsub.Subst( title ); + m_sName = title.Title; + m_sNameTranslit = title.TitleTranslit; } void Course::Init() diff --git a/stepmania/src/Song.cpp b/stepmania/src/Song.cpp index 80c7dc3ee5..95aef4a6d9 100644 --- a/stepmania/src/Song.cpp +++ b/stepmania/src/Song.cpp @@ -822,8 +822,10 @@ void Song::TranslateTitles() { static TitleSubst tsub("songs"); - tsub.Subst(m_sMainTitle, m_sSubTitle, m_sArtist, - m_sMainTitleTranslit, m_sSubTitleTranslit, m_sArtistTranslit); + TitleFields title; + title.LoadFromStrings( m_sMainTitle, m_sSubTitle, m_sArtist, m_sMainTitleTranslit, m_sSubTitleTranslit, m_sArtistTranslit ); + tsub.Subst( title ); + title.SaveToStrings( m_sMainTitle, m_sSubTitle, m_sArtist, m_sMainTitleTranslit, m_sSubTitleTranslit, m_sArtistTranslit ); } void Song::ReCalculateRadarValuesAndLastBeat() diff --git a/stepmania/src/TitleSubstitution.cpp b/stepmania/src/TitleSubstitution.cpp index 217c9d4bfc..70210814da 100644 --- a/stepmania/src/TitleSubstitution.cpp +++ b/stepmania/src/TitleSubstitution.cpp @@ -13,28 +13,28 @@ struct TitleTrans { Regex TitleFrom, SubFrom, ArtistFrom; - CString TitleTo, SubTo, ArtistTo; /* plain text */ - CString TitleTransTo, SubTransTo, ArtistTransTo; /* plain text */ + TitleFields Dest; /* If this is true, no translit fields will be generated automatically. */ bool translit; TitleTrans() { translit = true; } - TitleTrans(CString tf, CString sf, CString af, CString tt, CString st, CString at, - bool translit_): - TitleFrom(tf), SubFrom(sf), ArtistFrom(af), - TitleTo(tt), SubTo(st), ArtistTo(at), translit(translit_) { } + TitleTrans( const TitleFields &tf, bool translit_): + Dest(tf), translit(translit_) { } - bool Matches(CString title, CString sub, CString artist); + bool Matches( const TitleFields &tf ); }; vector ttab; -bool TitleTrans::Matches(CString title, CString sub, CString artist) +bool TitleTrans::Matches( const TitleFields &tf ) { - if(!TitleFrom.Compare(title)) return false; /* no match */ - if(!SubFrom.Compare(sub)) return false; /* no match */ - if(!ArtistFrom.Compare(artist)) return false; /* no match */ + if( !TitleFrom.Compare(tf.Title) ) + return false; /* no match */ + if( !SubFrom.Compare(tf.Subtitle) ) + return false; /* no match */ + if( !ArtistFrom.Compare(tf.Artist) ) + return false; /* no match */ return true; } @@ -44,51 +44,52 @@ void TitleSubst::AddTrans(const TitleTrans &tr) ttab.push_back(new TitleTrans(tr)); } -void TitleSubst::Subst(CString &title, CString &subtitle, CString &artist, - CString &ttitle, CString &tsubtitle, CString &tartist) +void TitleSubst::Subst( TitleFields &tf ) { for(unsigned i = 0; i < ttab.size(); ++i) { - if(!ttab[i]->Matches(title, subtitle, artist)) + if(!ttab[i]->Matches(tf)) continue; /* The song matches. Replace whichever strings aren't empty. */ - if(!ttab[i]->TitleTo.empty()) + if( !ttab[i]->Dest.Title.empty() && tf.Title != ttab[i]->Dest.Title ) { - if(ttab[i]->translit && title != ttab[i]->TitleTo) ttitle = title; - title = ttab[i]->TitleTo; - FontCharAliases::ReplaceMarkers( title ); + if( ttab[i]->translit ) + tf.TitleTranslit = tf.Title; + tf.Title = ttab[i]->Dest.Title; + FontCharAliases::ReplaceMarkers( tf.Title ); } - if(!ttab[i]->SubTo.empty()) + if( !ttab[i]->Dest.Subtitle.empty() && tf.Subtitle != ttab[i]->Dest.Subtitle ) { - if(ttab[i]->translit && subtitle != ttab[i]->SubTo) tsubtitle = subtitle; - subtitle = ttab[i]->SubTo; - FontCharAliases::ReplaceMarkers( subtitle ); + if( ttab[i]->translit ) + tf.SubtitleTranslit = tf.Subtitle; + tf.Subtitle = ttab[i]->Dest.Subtitle; + FontCharAliases::ReplaceMarkers( tf.Subtitle ); } - - if(!ttab[i]->ArtistTo.empty() && artist != ttab[i]->ArtistTo) + if( !ttab[i]->Dest.Artist.empty() && tf.Artist != ttab[i]->Dest.Artist ) { - if(ttab[i]->translit) tartist = artist; - artist = ttab[i]->ArtistTo; - FontCharAliases::ReplaceMarkers( artist ); + if( ttab[i]->translit ) + tf.ArtistTranslit = tf.Artist; + tf.Artist = ttab[i]->Dest.Artist; + FontCharAliases::ReplaceMarkers( tf.Artist ); } /* These are used when applying kanji to a field that doesn't have the * correct data. Should be used sparingly. */ - if(!ttab[i]->TitleTransTo.empty()) + if( !ttab[i]->Dest.TitleTranslit.empty() ) { - ttitle = ttab[i]->TitleTransTo; - FontCharAliases::ReplaceMarkers( ttitle ); + tf.TitleTranslit = ttab[i]->Dest.TitleTranslit; + FontCharAliases::ReplaceMarkers( tf.TitleTranslit ); } - if(!ttab[i]->SubTransTo.empty()) + if( !ttab[i]->Dest.SubtitleTranslit.empty() ) { - tsubtitle = ttab[i]->SubTransTo; - FontCharAliases::ReplaceMarkers( tsubtitle ); + tf.SubtitleTranslit = ttab[i]->Dest.SubtitleTranslit; + FontCharAliases::ReplaceMarkers( tf.SubtitleTranslit ); } - if(!ttab[i]->ArtistTransTo.empty()) + if( !ttab[i]->Dest.ArtistTranslit.empty() ) { - tartist = ttab[i]->ArtistTransTo; - FontCharAliases::ReplaceMarkers( tartist ); + tf.ArtistTranslit = ttab[i]->Dest.ArtistTranslit; + FontCharAliases::ReplaceMarkers( tf.ArtistTranslit ); } } } @@ -155,12 +156,12 @@ void TitleSubst::Load(const CString &filename, const CString §ion) if(!id.CompareNoCase("TitleFrom")) tr.TitleFrom = "^(" + txt + ")$"; else if(!id.CompareNoCase("ArtistFrom")) tr.ArtistFrom = "^(" + txt + ")$"; else if(!id.CompareNoCase("SubtitleFrom")) tr.SubFrom = "^(" + txt + ")$"; - else if(!id.CompareNoCase("TitleTo")) tr.TitleTo = txt; - else if(!id.CompareNoCase("ArtistTo")) tr.ArtistTo = txt; - else if(!id.CompareNoCase("SubtitleTo")) tr.SubTo = txt; - else if(!id.CompareNoCase("TitleTransTo")) tr.TitleTransTo = txt; - else if(!id.CompareNoCase("ArtistTransTo")) tr.ArtistTransTo = txt; - else if(!id.CompareNoCase("SubtitleTransTo")) tr.SubTransTo = txt; + else if(!id.CompareNoCase("TitleTo")) tr.Dest.Title = txt; + else if(!id.CompareNoCase("ArtistTo")) tr.Dest.Artist = txt; + else if(!id.CompareNoCase("SubtitleTo")) tr.Dest.Subtitle = txt; + else if(!id.CompareNoCase("TitleTransTo")) tr.Dest.TitleTranslit = txt; + else if(!id.CompareNoCase("ArtistTransTo")) tr.Dest.ArtistTranslit = txt; + else if(!id.CompareNoCase("SubtitleTransTo")) tr.Dest.SubtitleTranslit = txt; else LOG->Warn( "Unknown TitleSubst tag: \"%s\"", id.c_str() ); } @@ -190,7 +191,26 @@ TitleSubst::~TitleSubst() } /* - * Copyright (c) 2003 by the person(s) listed below. All rights reserved. - * - * Glenn Maynard + * (c) 2003-2004 Glenn Maynard + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. */ diff --git a/stepmania/src/TitleSubstitution.h b/stepmania/src/TitleSubstitution.h index 46bf65daf9..a84c6f0e23 100644 --- a/stepmania/src/TitleSubstitution.h +++ b/stepmania/src/TitleSubstitution.h @@ -1,6 +1,34 @@ +/* TitleSubst - automatic translation for song titles */ + #ifndef TITLE_SUBSTITUTION_H #define TITLE_SUBSTITUTION_H 1 +struct TitleFields +{ + void SaveToStrings( CString &sTitle, CString &sSubtitle, CString &sArtist, + CString &sTitleTranslit, CString &sSubtitleTranslit, CString &sArtistTranslit ) const + { + sTitle = Title; + sSubtitle = Subtitle; + sArtist = Artist; + sTitleTranslit = TitleTranslit; + sSubtitleTranslit = SubtitleTranslit; + sArtistTranslit = ArtistTranslit; + } + + void LoadFromStrings( CString sTitle, CString sSubtitle, CString sArtist, + CString sTitleTranslit, CString sSubtitleTranslit, CString sArtistTranslit ) + { + Title = sTitle; + Subtitle = sSubtitle; + Artist = sArtist; + TitleTranslit = sTitleTranslit; + SubtitleTranslit = sSubtitleTranslit; + ArtistTranslit = sArtistTranslit; + } + CString Title, Subtitle, Artist; + CString TitleTranslit, SubtitleTranslit, ArtistTranslit; +}; struct TitleTrans; class TitleSubst @@ -14,14 +42,32 @@ public: void Load(const CString &filename, const CString §ion); - void Subst(CString &title, CString &sub, CString &artist, - CString &ttitle, CString &tsub, CString &tartist); + void Subst( TitleFields &tf ); }; #endif /* - * Copyright (c) 2003 by the person(s) listed below. All rights reserved. - * - * Glenn Maynard + * (c) 2003-2004 Glenn Maynard + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. */