@@ -58,25 +58,57 @@ def __str__(self):
5858class Lyrics (list ):
5959 element_map = []
6060 init_list :list [Line ]
61+ modification_stack = []
6162
6263 def __init__ (self , init_list :list [Line ], * args ):
6364 self .init_list = init_list
64- for i ,line in enumerate (init_list ):
65+ self .generate_element_map ()
66+
67+ super ().__init__ (* args )
68+
69+ def generate_element_map (self ) -> None :
70+ for i ,line in enumerate (self .init_list ):
6571 line :Line = line
6672 for j , element in enumerate (line .elements ):
6773 self .element_map .append ([element , i , j ])
68- super ().__init__ (* args )
69-
70- def get_offset_element (self , element :VocalElement , offset :int ) -> VocalElement :
71- for i ,map_item in enumerate (self .element_map ):
72- if element == map_item [0 ]:
73- return self .element_map [i + offset ][0 ]
74-
74+
7575 def get_element_map_index (self , element :VocalElement ) -> int :
7676 for i ,map_item in enumerate (self .element_map ):
7777 if element == map_item [0 ]:
7878 return i
7979 return 0
80+
81+ def rebuild (self ) -> None :
82+ # Check if any empty lines
83+ del_line_list = []
84+ del_word_list = []
85+
86+ for i , line in enumerate (self .init_list ):
87+ for j , word in enumerate (line .elements ):
88+ if word is None :
89+ del_word_list .append ((i ,j ))
90+
91+ # Update word_index for words after it
92+ for word in line .elements [j + 1 :]:
93+ word .word_index -= 1
94+
95+ for i ,j in del_word_list :
96+ del self .init_list [i ].elements [j ]
97+
98+ for i ,line in enumerate (self .init_list ):
99+ # check if any empty words
100+ if not line .elements :
101+ del_line_list .append (i )
102+
103+ # Update line_index of all the elements after it
104+ for _line in self .init_list [i + 1 :]:
105+ for _elements in _line .elements :
106+ _elements .line_index -= 1
107+
108+ for i in del_line_list :
109+ del self .init_list [i ]
110+
111+ self .generate_element_map ()
80112
81113
82114def process_lyrics (lyrics_str :str ) -> Lyrics :
0 commit comments