# -*- coding: ISO-8859-1 -*-
""" capellaScript -- Copyright (c) 2004 Hartmut Ring
>>> Liedtextautomatik
    Balken für Liedtext passend in Fähnchen umwandeln.||

    Wenn eine Note eine Liedsilbe besitzt, wird der Balken
    zwischen dieser Note und der nächsten|
     - verbunden, wenn die nächste Note keine oder eine leere Liedsilbe besitzt,|
     - getrennt, wenn die nächste Note eine Liedsilbe besitzt.||
     
    Das führt in den meisten Fällen zum gewünschten Ergebnis.|
    Ausnahme: Wenn Melismen über mehr als zwei Noten
    ohne Bindestriche und ohne Haltelinie notiert werden,
    lassen sie sich nicht mehr von fehlendem Liedtext unterscheiden.
<<<
"""

from caplib.capDOM import ScoreChange
import tempfile

class LyricBeamChange (ScoreChange):
    def hasText(self, chord):
        if chord.nodeType != chord.ELEMENT_NODE or chord.tagName != 'chord':
            return False
        lyric = chord.getElementsByTagName('lyric')
        if len(lyric) > 0:
            lyric = lyric[0]
            verse = lyric.getElementsByTagName('verse')
            if len(verse) > 0:
                verse = verse[0] # nur 1. Strophe auswerten
                for t in verse.childNodes:
                    if t.nodeType == t.TEXT_NODE and t.data != '' and not t.data.isspace():
                        return True
        return False

    def setBeam(self, chord, mode):
        """ setzt im Unterelement "beam" des Elements "chord"
            das Attribut "group" auf den Wert mode.
            Falls das Unterelement "beam" noch nicht vorhanden ist,
            wird es an der richtigen Stelle eingefügt.
        """
        if len(chord.getElementsByTagName('beam')) > 0:
            # <beam>-Element schon vorhanden
            beam = chord.getElementsByTagName('beam')[0]
        else:
            # <beam>-Element erzeugen...
            beam = self.doc.createElement('beam')
            # ... und an passender Stelle einfügen.
            # Reihenfolge der Unterelemente von 'chord':
            # beam, articulation(0...1), lyric(0...1), drawObjects(0...1), heads(1)
            insertBefore = chord.getElementsByTagName('heads')[0]
            for tag in ('drawObjects', 'lyric', 'articulation'):
                n = chord.getElementsByTagName(tag)
                if len(n) > 0:
                    insertBefore = n[0]
            chord.insertBefore(beam, insertBefore)
        beam.setAttribute('group', mode)

    def changeElement(self, el):
        if el.tagName == 'noteObjects':
            chords = el.getElementsByTagName('chord')
            for i, chord in enumerate(chords):
                if i == len(chords)-1:
                    break
                t1 = self.hasText(chord)
                t2 = self.hasText(chords[i+1])
                if t1 or t2:
                    if t1 and not t2:
                        self.setBeam(chord, 'force')
                    else:
                        self.setBeam(chord, 'split')
if activeScore():
    activeScore().registerUndo("Balken/Fähnchen für Liedtext")
    tempFile1 = tempfile.mktemp('.capx')
    tempFile2 = tempfile.mktemp('.capx')
    activeScore().write(tempFile1)

    LyricBeamChange(tempFile1, tempFile2)

    activeScore().read(tempFile2)
    os.remove(tempFile1)
    os.remove(tempFile2)

#..:signature(Hartmut Ring):
#..:4AE9C6849C864BB9FB15EFFCA96AE4E73B82B657012B3D763468AC4CA3C88366:
#..:D0982DB170168EFF317E1101324DFDBD71EC7B114F4FCBD524169C22984A8F65:
#..:52AA9540AD421518AD54B37057591971B3FEA4B4AAD5FF4659E68E51B25409C6:
#..:8BD4850DE27E7C5CD4FF275D1604017F81C7885FADFE4E66216D3C6DB0B2C151:
