diff --git a/composeApp/src/commonMain/composeResources/files/ffpm-310.txt b/composeApp/src/commonMain/composeResources/files/ffpm-310.txt index 2a8981d..00f30a2 100644 --- a/composeApp/src/commonMain/composeResources/files/ffpm-310.txt +++ b/composeApp/src/commonMain/composeResources/files/ffpm-310.txt @@ -5,5 +5,5 @@ N2:#t, drd8mff mdtddttt/drd8mf fmdddtd /d7/ d7/ ddtrddt/ d7/ d7/ ddtrddt N3:#r mfs4fmsd4sfmssrs/ mfs4fmsd4mfsfm/ mmf5/ lfm5/ fmrs4/ mmf5/ lfm5/ fmrtlls N4:#s, d11ffd5s3/ d11ffdllssd/ ddf5/ ffd5/ ddrtdms/ ddf5/ ffd5/ ddr4s Y1:Misy maro ao an-tsaha mitaraina,/Ka ento ny Jiro mba hankao!/Tsy mba misy anto_andro na maraina/Fa maizina re ny ao;/Indro olo-maro be/No maniry mafy hoe:/Mba midina mankaty,/Itondray Baiboly re/Izy\ ireo fa ta handre/An'i Kristy Tompo soa !/${R=}${D:"Mandehana", hoy ny Tompo, "mandehana/Ho amin'izao tontolo i\zao!"/Mitsangàna ary, eny, mitsangàna/Fa Izy no homba\ anao!} -Y2:Mandehana mba hitarika ny jamba,/Mba ampifalio ny ory fo;/Ny mahantra ilazao fa misy lamba/Tsy miova, tsy mety lo;/Jeso Mofon'aina soa/Sady Ranon'aina koa,/Asehoy ho hitany!/Tena Andriamanitra,/Tompo tao an-danitra,/Ambarao ho fantany!${D:"Mandehana", hoy ny Tompo, "mandehana/Ho amin'izao tontolo i\zao!"/Mitsangàna ary, eny, mitsangàna/Fa Izy no homba\ anao!} -Y3:Mandehana hanatanjaka ny osa,/Omeo toky re ny ketraka;/Ny anjaranao, ataovy ho tontosa/Ka aza dia reraka!/Mandehana i_anao/Ka vitao ny asanao/Fa ny tambinao arỳ;/Mbola any\ ihany re/ny handraisan-tamby be,/Dia rehefa tsy etỳ!${D:"Mandehana", hoy ny Tompo, "mandehana/Ho amin'izao tontolo i\zao!"/Mitsangàna ary, eny, mitsangàna/Fa Izy no homba\ anao!} +Y2:Mandehana mba hitarika ny jamba,/Mba ampifalio ny ory fo;/Ny mahantra ilazao fa misy lamba/Tsy miova, tsy mety lo;/Jeso Mofon'aina soa/Sady Ranon'aina koa,/Asehoy ho hitany!/Tena Andriamanitra,/Tompo tao an-danitra,/Ambarao ho fantany! +Y3:Mandehana hanatanjaka ny osa,/Omeo toky re ny ketraka;/Ny anjaranao, ataovy ho tontosa/Ka aza dia reraka!/Mandehana i_anao/Ka vitao ny asanao/Fa ny tambinao arỳ;/Mbola any\ ihany re/ny handraisan-tamby be,/Dia rehefa tsy etỳ! 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 edee52a..e4df3ca 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt @@ -20,7 +20,6 @@ import kotlin.math.min //@todo: ffpm-99-2.txt triolet.mid + triolet (m--)-- //@todo: ffpm-657-1.txt ${m:4/4 Miadana kely} //@todo: ews-80.txt ${m:12/4} -//@todo: ews-81.txt ${R=}${D:....} //@todo: bug ffpm-629.txt sssszd au lieu de ssss-d(-rrrrtdr) //@todo: bug ews-103.txt Triolet adds one blank //@todo: bug ffpm-167-1.txt shoud start with : and not | @@ -36,6 +35,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository private var refrainMaxStanza = -1 private var smartLyricsType = "L" private val pitches = mutableListOf() + private val globalDComments = mutableListOf() companion object { var currentFile = "" @@ -62,6 +62,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository val REGEX_NOTE_TOADD = Regex("([drmfsltz][ia]?|[―])([₄₃₂₁¹²³⁴',]*)>([drmfsltz][ia]?|[―])([₄₃₂₁¹²³⁴',]*)") val REGEX_NOTE_TODROP = Regex("([drmfsltz][ia]?|[―])([₄₃₂₁¹²³⁴',]*)<") val REGEX_NOTE_SPLIT = Regex("\\$\\{[Ss]:([^\\}]+)\\}([drmfsltDRFSTz][,']*)") + val REGEX_DC_REFRAIN = Regex("""\$\{R=\}\$\{D:(.*?)\}""") } fun parseNoteSplit(input: String): String { @@ -218,6 +219,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository T.clear() N.clear() L.clear() + globalDComments.clear() if (pitches.isNotEmpty()) { pitches[0].reset() } @@ -301,6 +303,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository T.clear() N.clear() L.clear() + globalDComments.clear() if (pitches.isNotEmpty()) { pitches[0].reset() } @@ -2465,8 +2468,9 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository copyRefrainToStanza(stanzaNumber) } - if (lyricsComment.isNotEmpty()) { - val lyricsIterator = lyricsComment.iterator() + val commentsToProcess = if (lyricsComment.isNotEmpty()) lyricsComment else globalDComments + if (commentsToProcess.isNotEmpty()) { + val lyricsIterator = commentsToProcess.toList().iterator() while (lyricsIterator.hasNext()) { var item = lyricsIterator.next() // @todo: if item == ${O:...} @@ -2490,7 +2494,6 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository .forEachIndexed { i, xval -> appendLyricsItem(stanzaNumber, i + pDS, xval) } - lyricsIterator.remove() } } } @@ -2549,12 +2552,19 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository val smartLyrics = smartELyrics(lyrics) loadL(intKey, smartLyrics) } - + private fun isDCRefrain(text: String): Boolean { + return text.startsWith("\${R=}\${D:") && text.endsWith("}") + } private fun getLyricsComments(lyrics: String): String { val matchResult = REGEX_LYRICS_COMMENT.findAll(lyrics) .map { it.value }.toList() if (matchResult.isNotEmpty()) { lyricsComment.addAll(matchResult) + matchResult.filter { isDCRefrain(it) || REGEX_DC_REFRAIN.containsMatchIn(it) }.forEach { refrain -> + if (!globalDComments.contains(refrain)) { + globalDComments.add(refrain) + } + } } return REGEX_STRIP_DC.replace(lyrics, $$"\\${x:}") }