# -*- coding: ISO-8859-1 -*-
""" capellaScript -- 23.01.2004, Paul Villiger
>>> 
    Bindebögen zwischen zwei gleichen Noten/Akkorden
    werden durch einen Haltebogen ersetztt
<<<
History:    20.10.2003 - Erstausgabe
            23.01.2004 - Vorzeichen werden berücksichtigt

"""

from caplib.capDOM import ScoreChange
import tempfile

class TestChange (ScoreChange):
    def __init__(self, inputFile, outputFile=''):
        ScoreChange.__init__(self, inputFile, outputFile)

    def changeElement(self, el):

        #
        # Bindebogen durch Haltebogen ersetzen
        #
        if el.tagName == 'noteObjects':          # entspricht einer Notenzeile
            chords = el.getElementsByTagName('chord')  
            if chords.length > 1:
                for i in range(chords.length - 1 ):
                    drawObjects = chords[i].getElementsByTagName('drawObjects')
                    for drawObject in drawObjects:
                        drawObjs = drawObject.getElementsByTagName('drawObj')
                        for drawObj in drawObjs:
                            slurs = drawObj.getElementsByTagName('slur')
                            basics = drawObj.getElementsByTagName('basic')
                            # ist Bindebogen vorhanden ?
                            if (slurs.length > 0) and (basics.length > 0):
                                # hat der Bindebogen die Länge 1
                                if basics[0].getAttribute('noteRange') == '1':
                                    headsA = chords[i].getElementsByTagName('head')
                                    headsB = chords[i+1].getElementsByTagName('head')
                                    hA = []
                                    hB = []
                                    for head in headsA:
                                        pitch = head.getAttribute('pitch')
                                        for alter in head.getElementsByTagName('alter'):
                                            pitch = pitch + alter.getAttribute('step')
                                        hA.append(pitch)
                                    for head in headsB:
                                        pitch = head.getAttribute('pitch')
                                        for alter in head.getElementsByTagName('alter'):
                                            pitch = pitch + alter.getAttribute('step')
                                        hB.append(pitch)
                                    if hA == hB:       # Akkorde vergleichen
                                        # an jeden Notenkopf muss ein Haltebogen gehängt werden
                                        for head in headsA:
                                            ties = head.getElementsByTagName('tie')
                                            if ties.length == 0:
                                                # noch kein Haltebogen vorhanden
                                                tie = self.doc.createElement('tie')
                                                head.appendChild(tie)    
                                            else:
                                                tie = ties[0]
                                            tie.setAttribute('begin', 'true')
                                        for head in headsB:
                                            ties = head.getElementsByTagName('tie')
                                            if ties.length == 0:
                                                tie = self.doc.createElement('tie')
                                                head.appendChild(tie)
                                            else:
                                                tie = ties[0]
                                            tie.setAttribute('end', 'true')

                                        # Bindebogen entfernen                                            
                                        old = drawObject.removeChild(drawObj)
                                        old.unlink()
                                        
                                    
                
if 'capella' in dir():
    #--- Skript wurde von capella aufgerufen
    if activeScore():
        activeScore().registerUndo("Bindebögen stricheln")
        tempFile1 = tempfile.mktemp('.capx')
        tempFile2 = tempfile.mktemp('.capx')
        activeScore().write(tempFile1)

        TestChange(tempFile1, tempFile2)

        activeScore().read(tempFile2)
        os.remove(tempFile1)
        os.remove(tempFile2)

