1 from syllabify
import *
3 class LilyVerse(Verse
):
4 def __init__(self
, text
):
5 Verse
.__init
__(self
, text
)
7 def get_lily_text(self
):
8 return "\livretVerse#{} {{ {} }}".format(
12 class EludedVerse(LilyVerse
):
13 def __init__(self
, text
, forced_metric
):
14 LilyVerse
.__init
__(self
, text
)
15 self
._forced
_metric
= forced_metric
18 return self
._forced
_metric
20 class VersePart(LilyVerse
):
21 def __init__(self
, text
):
22 LilyVerse
.__init
__(self
, text
)
24 self
._last
_part
= None
26 def set_last_part(self
, last_part
):
27 self
._last
_part
= last_part
29 def set_previous_parts(self
, parts
):
30 self
._prev
_parts
= parts
32 def get_previous_parts(self
):
33 return self
._prev
_parts
36 return self
._last
_part
.get_metric()
39 if self
._prev
_parts
== []:
40 return Verse
.get_text(self
)
42 return "\\transparent {{ {} }} {}".format(
43 " ".join([Verse
.get_text(part
) for part
in self
._prev
_parts
]),
47 class VerseLastPart(VersePart
):
48 def __init__(self
, text
):
49 VersePart
.__init
__(self
, text
)
52 metric
= Verse
.get_metric(self
)
53 for part
in self
.get_previous_parts():
54 metric
+= Verse
.get_metric(part
)
58 def __init__(self
, text
):
61 def syllabify(self
, sign_tokenizer
= None, syllable_tokenizer
= None ):
64 def get_lily_text(self
):
71 def add_line(self
, line
):
72 self
._lines
.append(line
)
78 sign_tokenizer
= SignTokenizer(),
79 syllable_tokenizer
= SyllableTokenizerWithWordSeparation()):
80 for line
in self
._lines
:
81 line
.syllabify(sign_tokenizer
, syllable_tokenizer
)
84 class RawLibrettoReader():
85 def read(self
, filename
):
86 file = open(filename
, 'r')
87 libretto
= Lilybretto()
90 verse_match
= re
.match(r
"^%#(\S*) (.*)$", line
)
93 cmd
= verse_match
.group(1)
94 verse
= verse_match
.group(2).strip()
96 # a regular full verse
97 libretto
.add_line(LilyVerse(verse
))
100 verse_part
= VersePart(verse
)
101 verse_part
.set_previous_parts(list(verse_parts
))
102 verse_parts
.append(verse_part
)
103 libretto
.add_line(verse_part
)
105 last_part
= VerseLastPart(verse
)
106 last_part
.set_previous_parts(verse_parts
)
107 libretto
.add_line(last_part
)
108 for part
in verse_parts
:
109 part
.set_last_part(last_part
)
112 # cmd is expected to be a number
113 # TODO: robustness/error handling
115 libretto
.add_line(EludedVerse(verse
, int(cmd
)))
118 libretto
.add_line(LilyLine(line
.rstrip()))
121 if __name__
== '__main__':
122 for filename
in sys
.argv
[1:]:
123 reader
= RawLibrettoReader()
124 libretto
= reader
.read(filename
)
126 for line
in libretto
.get_lines():
127 print(line
.get_lily_text())