diff --git a/composeApp/src/commonMain/composeResources/files/ff-8.txt b/composeApp/src/commonMain/composeResources/files/ff-8.txt index ab3a823..076b797 100644 --- a/composeApp/src/commonMain/composeResources/files/ff-8.txt +++ b/composeApp/src/commonMain/composeResources/files/ff-8.txt @@ -4,6 +4,6 @@ N1:#s,sF,sdms'fl/sltdrfmm/sF,sdmsfl'-/#dsmsfrmdd/dflfdl(s-)--(m-)--/srslsf(m-)-- N2:#r,mRmmsTlf/rrssslss/mRmmsTllt/dstlsfmm/ll(d-)-f#f,mrdsdrmd/rr(t-)-rdtdlsFsT/ll(d-)-f'mrdsdrmd/rrttdtstls N3:#s,dddrmddd/tdrdtrdd/dddrmddrR/mdrtdtss/#ddd(f-)-lsfmrmfsm/ff(r-)-fsFsfmRms/dd(f-)-lsfmrmfsm/ffrrsfmsfm N4:#d,d5mff/s6dd/d5mffF/s6dd/ff(f-)-l#r,d3d, msdl/ss(s-)-sd4d,3m/ff(f-)-ld3d,msdl/s6d,--d, -Y1:Masoko manganohano,/Nitomany feno rano/No\ho ny helok’efa vita,/Dia mitony ra\ha nahita/Masona_o be fi_an_4tra_3/Ry Mpamonjy ny maha_4ntra_4/O Vo_avotrao ‘lay ve_4ry_4/Ry fitiavana mahery. -Y2.Tanako mangadihady/Nisarangotra nitady/Fanavotana sy Vonjy/F’efa resy ka nilonjy./Dia noraisinao ry To_4mpo_4/Na dia tànana malo_4to_4/O vo_avotrao ‘lay ve_4ry_4/Ry Fitiavana mahery. -Y3:Foko tena fahavalo/Nefa resy ka mimalo/Ra\ha nifona fa naditra/Hitanao nipitrapitra./Babo tsy\ afaka ho ai_4za_4/’Zao noraisinao\ ho sakai_4za_4/O vo_avotrao ‘lay ve_4ry_4/Ry Fitiavana mahery. +Y1:Masoko manganohano,/Nitomany feno rano/No\ho ny helok’efa vita,/Dia mitony ra\ha nahita/Masona_o be fi_a_4ntra_3/Ry Mpamonjy ny maha_4ntra_3/O Vo_avotrao ‘lay ve_4ry_3/Ry fitiavana mahery. +Y2.Tanako mangadihady/Nisarangotra nitady/Fanavotana sy Vonjy/F’efa resy ka nilonjy./Dia noraisinao ry To_4mpo_3/Na dia tànana malo_4to_3/O vo_avotrao ‘lay ve_4ry_3/Ry Fitiavana mahery. +Y3:Foko tena fahavalo/Nefa resy ka mimalo/Ra\ha nifona fa naditra/Hitanao nipitrapitra./Babo tsy\ afaka ho ai_4za_3/’Zao noraisinao\ ho sakai_4za_3/O vo_avotrao ‘lay ve_4ry_3/Ry Fitiavana mahery. diff --git a/composeApp/src/commonMain/composeResources/files/ffpm-38.txt b/composeApp/src/commonMain/composeResources/files/ffpm-38.txt index 39b65d7..6cb1d9e 100644 --- a/composeApp/src/commonMain/composeResources/files/ffpm-38.txt +++ b/composeApp/src/commonMain/composeResources/files/ffpm-38.txt @@ -6,4 +6,4 @@ N3:d'smd#sd10/mmrddtt/rrddrfmrd/z3d7sz4s8z/zzzs4z3s4/z9/d4lls3 N4:d'smd#t,f5lfd3/ddfmmss/ssllfrs#s,sd/z7d5z7s5/z3ddttz3d4/z9/ddf4s'sd O1:v3:I\lay nirahinao, ry Tompo,_4I\lay nirahinao, ry Tompo,_4No derainay,_3No derainay;_9 O1:v4:I\lay nirahinao,_7I\lay nirahinao,_3No derainay,_3No derainay_9 -Y1:He, hosana! Isaoran’ani_e ny Mesi_a,/I\zay nalefan’ny Tompo,/Ka hosana no asandratray./I\lay nira${O:1}hi_2nao _ry _Tompo_2/I\lay nirahi_2nao _ry _Tompo_2/No derainay,_4/No derainay,_4/Ka hosana no asandratray!/Ka hosana no asandratray!/ +Y1:He, hosana! Isaoran’ani_e ny Mesi_a,/I\zay nalefan’ny Tompo,/Ka hosana no asandratray./I\lay nira${O:1}hi_2nao _ry _Tompo_/I\lay nirahi_2nao _ry _Tompo_/No derainay,_3/No derainay,_3/Ka hosana no asandratray!/Ka hosana no asandratray!/ diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/POneStanzaLyrics.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/POneStanzaLyrics.kt index ed2db95..7226f91 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/POneStanzaLyrics.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/POneStanzaLyrics.kt @@ -2,6 +2,7 @@ package mg.dot.feufaro.solfa class POneStanzaLyrics { private val lyrics: MutableList = mutableListOf("") + private val alternativeLyrics: MutableMap> = mutableMapOf() fun getLyrics(stanzaNumber: Int) : String { return this.lyrics[stanzaNumber] } @@ -11,8 +12,12 @@ class POneStanzaLyrics { } this.lyrics[stanzaNumber] = lyrics } + fun setAlternativeLyrics(stanzaNumber: Int, voiceNumber: Int, text: String) { + alternativeLyrics + .getOrPut(voiceNumber) { mutableMapOf() } [stanzaNumber] = text + } override fun toString(): String { - return lyrics[1]?: "" + return lyrics[1] } fun appendDSLyrics(stanzaNumber: Int, lyrics: String) { if (this.lyrics.size > stanzaNumber) { diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt index 48ec8b7..80a08a8 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt @@ -14,6 +14,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository private val O: MutableMap> = mutableMapOf() private val unparsedNote = mutableListOf() private var refrainBeginsAt = -1 + private var smartLyricsType = "L" companion object { val REGEX_SHIFT_PAREN_UPWARD = Regex("([^a-yA-Y\\(\\[]+)([\\)\\]])") val REGEX_SHIFT_PAREN_DOWNWARD = Regex("([\\(\\[])([^a-yA-y\\)\\]]+)") @@ -420,37 +421,70 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository private fun String.addHyphens(): String { return this - .replace("_/", "/") - //.also { println ("1 $it")} + //.replace("_/", "/") .replace(Regex("(? + val repeating = matchResult.destructured.match.groupValues[1] + "_".repeat(repeating.toString().toInt()) + } + .addHyphens() + val lyricsFinal = REGEX_COMMENT.replace(loadedLyrics) { matchResult -> + commentsIterator.next().value + } + return lyricsFinal + } private fun loadL(stanzaNumber: Int, lyrics: String) { + val unpackedLyrics = unpackLyrics(lyrics) + loadLyrics(stanzaNumber, unpackedLyrics) + } + fun setOverrideLyrics(stanzaNumber: Int, i: Int, voice: Int, text: String) { + while (L.size <= i) { + L.add(POneStanzaLyrics()) + } + L[i].setAlternativeLyrics(stanzaNumber, voice, text) + } + private fun loadLyrics(stanzaNumber: Int, lyrics: String) { + val overrideIterator: MutableMap> = mutableMapOf() try { getLyricsComments(lyrics) - val comments = REGEX_COMMENT.findAll(lyrics) - val commentsIterator = comments.iterator() - val loadedLyrics = lyrics//.replace(REGEX_LYRICS_COMMENT, "") - .replace(REGEX_LYRICS_REPETITION) { matchResult -> - val repeating = matchResult.destructured.match.groupValues[1] - "_".repeat(repeating.toString().toInt()) - } - .addHyphens() - val lyricsFinal = REGEX_COMMENT.replace(loadedLyrics) { matchResult -> - commentsIterator.next().value - } - val arrayLyrics = lyricsFinal.split(Regex("[/_]")) + val arrayLyrics = lyrics.split(Regex("[/_]")) arrayLyrics.forEachIndexed { i, lyricsItem -> val originalLyrics = REGEX_COMMENT.replace(lyricsItem, "") + if (lyricsItem.length > 4 && lyricsItem.substring(0, 4) == $$"${O:") { + val overrideNumber = lyricsItem.replace(Regex("\\D"), "").toIntOrNull() ?: -1 + val override = O.getOrElse(overrideNumber) { null } + override?.forEachIndexed { index, value -> + val matchResult = Regex("v(\\d+):(.*)").find(value) + val overrideString = when (smartLyricsType) { + "E" -> smartELyrics(matchResult?.groupValues[2] ?: value) + "Y" -> smartYLyrics(matchResult?.groupValues[2] ?: value) + else -> value + } + for ( iN in (1..9) ) { + if (matchResult?.groupValues[1]?.contains(iN.digitToChar()) ?: false) { + val overrideSyllabus = overrideString.split(Regex("[_/]")).iterator() + overrideIterator[iN] = overrideSyllabus + } + } + } + } + if (overrideIterator.isNotEmpty()) { + overrideIterator.map { (voice, textIterator) -> + if (textIterator.hasNext()) { + setOverrideLyrics(stanzaNumber, i, voice, textIterator.next()) + } + } + } addLyricsItem(stanzaNumber, i, originalLyrics) } if (refrainBeginsAt > 0 && stanzaNumber > 1 && !lyrics.contains($$"${R!}")) { @@ -493,7 +527,6 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository .replace(" ", " _") .replace("_\\ _", " ") .replace("_\\", "") - .replace("_/", "/") .replace("_0", "") .replace(REGEX_MALAGASY_MN, "$1$2_$3") .replace(REGEX_MALAGASY_MN_STAGE2, "$1-_") @@ -502,10 +535,11 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository val lyricsFinal = REGEX_COMMENT.replace(loadedLyrics) { matchResult -> commentsIterator.next().value } - return lyricsFinal + return unpackLyrics(lyricsFinal) } // loadY is a smart lyrics parser for Malagasy language private fun loadY(intKey: Int, lyrics: String) { + smartLyricsType = "Y" val smartLyrics = smartYLyrics(lyrics) loadL(intKey, smartLyrics) } @@ -517,10 +551,11 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository .replace("_/", "/") .replace("_0", "") getLyricsComments(loadedLyrics) - return loadedLyrics + return unpackLyrics(loadedLyrics) } // loadE is a smart Lyrics parser for English language private fun loadE(intKey: Int, lyrics: String) { + smartLyricsType = "E" val smartLyrics = smartELyrics(lyrics) loadL(intKey, smartLyrics) }