# -*- 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: # -Element schon vorhanden beam = chord.getElementsByTagName('beam')[0] else: # -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: