]> git.donarmstrong.com Git - lilypond.git/blob - buildscripts/lilypond-words.py
* Fix some problems after the renaming of my-lily -> lily
[lilypond.git] / buildscripts / lilypond-words.py
1 #!@PYTHON@
2
3 # Created 01 September 2003 by Heikki Junes.
4 # Generates lilypond-words.el for (X)Emacs and lilypond-words[.vim] for Vim.
5
6 import string
7 import re
8 import sys
9
10 kw = []
11 rw = []
12 notes = []
13
14 # keywords not otherwise found
15 for line in ['include','maininput','version']:
16     kw = kw + [line]
17
18 # the main keywords
19 F = open('lily/lily-lexer.cc', 'r')
20 for line in F.readlines():
21     m = re.search(r"(\s*{\")(.*)(\",\s*.*},\s*\n)",line)
22     if m:
23         kw = kw + [m.group(2)]
24 F.close()
25
26 # keywords in markup
27 F = open('scm/new-markup.scm', 'r')
28 for line in F.readlines():
29     m = re.search(r"^(\s*\(cons\s*)([a-z-]*)(-markup)",line)
30     if m:
31         kw = kw + [m.group(2)]
32 F.close()
33
34 # identifiers and keywords
35 for name in [
36 'ly/a4-init.ly',
37 'ly/chord-modifiers-init.ly',
38 'ly/dynamic-scripts-init.ly',
39 'ly/engraver-init.ly',
40 'ly/grace-init.ly',
41 'ly/gregorian-init.ly',
42 'ly/music-functions-init.ly',
43 'ly/performer-init.ly',
44 'ly/property-init.ly',
45 'ly/scale-definitions-init.ly',
46 'ly/script-init.ly',
47 'ly/spanners-init.ly',
48 ]:
49     F = open(name, 'r')
50     for line in F.readlines():
51         m = re.search(r"^([a-zA-Z]+)(\s*=)",line)
52         if m:
53             kw = kw + [m.group(1)]
54     F.close()
55
56 # more identifiers
57 for name in [
58 'ly/declarations-init.ly',
59 'ly/declarations-init.ly',
60 'ly/params-init.ly',
61 ]:
62     F = open(name, 'r')
63     for line in F.readlines():
64         m = re.search(r"^(\s*)([a-zA-Z]+)(\s*=)",line)
65         if m:
66             kw = kw + [m.group(2)]
67     F.close()
68
69 # note names
70 for name in [
71 'ly/catalan.ly',
72 'ly/deutsch.ly',
73 'ly/drumpitch-init.ly',
74 'ly/english.ly',
75 'ly/espanol.ly',
76 'ly/italiano.ly',
77 'ly/nederlands.ly',
78 'ly/norsk.ly',
79 'ly/portugues.ly',
80 'ly/suomi.ly',
81 'ly/svenska.ly',
82 'ly/vlaams.ly',
83 ]:
84     F = open(name, 'r')
85     for line in F.readlines():
86         m = re.search(r"^(\s*\()([a-z]+)([^l]+ly:make-pitch)",line)
87         if m:
88             notes = notes + ['' + m.group(2)]
89     F.close()
90
91
92     
93 # reserved words
94 for name in [
95 'ly/engraver-init.ly',
96 'ly/performer-init.ly',
97 ]:
98     F = open(name, 'r')
99     for line in F.readlines():
100         for pattern in [
101         r"^(\s*.consists\s+\")([a-zA-Z_]+)(\")",
102         r"([\\]name\s+[\"]?)([a-zA-Z_]+)([\"]?)",
103         r"(\s+)([a-zA-Z_]+)(\s*[\\]((set)|(override)))",
104         ]:
105             m = re.search(pattern,line)
106             if m:
107                 rw = rw + ['' + m.group(2)]
108     F.close()
109
110 # the output file
111 outdir = '.';
112 suffix = ['skip','skip','skip'];
113 outs  = ['','',''];
114 for s in sys.argv[1:]:
115     if s == '--words':
116         suffix[0] = '';
117     if s == '--el':
118         suffix[1] = '.el';
119     if s == '--vim':
120         suffix[2] = '.vim';
121     m = re.search(r"(--dir=)(\S*)",s)
122     if m:
123         outdir = m.group(2)
124
125 if '' in suffix:
126     outs[0] = open(outdir+'/lilypond-words'+suffix[0], 'w')
127 if '.el' in suffix:
128     outs[1] = open(outdir+'/lilypond-words'+suffix[1], 'w')
129 if '.vim' in suffix:
130     outs[2] = open(outdir+'/lilypond-words'+suffix[2], 'w')
131
132 # alphabetically ordered words
133 kw.sort()
134 kw.reverse()
135 prevline = ''
136 if '.vim' in suffix:
137   outs[2].write('syn match lilyKeyword \"[-_^]\\?\\\\\\(');
138 for line in kw:
139     if line != prevline:
140         if '' in suffix:
141             outs[0].write('\\\\' + line + '\n')
142         if '.el' in suffix:
143             outs[1].write('\\\\' + line + '\n')
144         if '.vim' in suffix:
145             outs[2].write(line + '\\|')
146     prevline = line
147 if '.vim' in suffix:
148     outs[2].write('n\\)\\(\\A\\|\\n\\)\"me=e-1\n')
149
150 rw.sort()
151 rw.reverse()
152 prevline = ''
153 if '.vim' in suffix:
154     outs[2].write('syn match lilyReservedWord \"\\(\\A\\|\\n\\)\\(')
155 for line in rw:
156     if line != prevline:
157         if '' in suffix:
158             outs[0].write(line + '\n')
159         if '.el' in suffix:
160             outs[1].write(line + '\n')
161         if '.vim' in suffix:
162             outs[2].write(line + '\\|')
163     prevline = line
164 if '.vim' in suffix:
165     outs[2].write('Score\\)\\(\\A\\|\\n\\)\"ms=s+1,me=e-1\n')
166
167 notes.sort()
168 notes.reverse()
169 prevline = ''
170 if '.vim' in suffix:
171     outs[2].write('syn match lilyNote \"\\<\\(\\(\\(');
172 for line in notes:
173     if line != prevline:
174         if '' in suffix:
175             outs[0].write(line + '\n')
176         if '.el' in suffix:
177             outs[1].write(line + '\n')
178         if '.vim' in suffix:
179             outs[2].write(line + '\\|')
180     prevline = line
181 if '.vim' in suffix:
182     outs[2].write('a\\)\\([,\']\\)\\{,4}\\([?!]\\)\\?\\)\\|s\\|r\\)\\(\\(128\\|64\\|32\\|16\\|8\\|4\\|2\\|1\\|\\\\breve\\|\\\\longa\\|\\\\maxima\\)[.]\\{,8}\\)\\?\\(\\A\\|\\n\\)\"me=e-1\n')
183
184 # the menu in lilypond-mode.el
185 for line in [
186 '/( - _ /) -',
187 '/[ - _ /] -',
188 '< - _ > -',
189 '<< - _ >> -',
190 '///( - _ ///) -',
191 '///[ - _ ///] -',
192 '///< - _ ///! -',
193 '///> - _ ///! -',
194 '//center - / << _ >> -',
195 '//column - / << _ >> -',
196 '//context/ Staff/ = - % { _ } -',
197 '//context/ Voice/ = - % { _ } -',
198 '//markup - { _ } -',
199 '//notes - { _ } -',
200 '//relative - % { _ } -',
201 '//score - { //n /? //simultaneous { //n _ //n } /! //n //paper {  } //n /? //midi {  } //n /! } //n -',
202 '//simultaneous - { _ } -',
203 '//sustainDown - _ //sustainUp -',
204 '//times - % { _ } -',
205 '//transpose - % { _ } -',
206 ]:
207     # urg. escape char '/' is replaced with '\\' which python writes as a '\'.
208     if '.el' in suffix:
209         outs[1].write(string.join(string.split(line,'/'),'\\') + '\n')
210  
211 if '' in suffix:
212     outs[0].close()
213 if '.el' in suffix:
214     outs[1].close()
215 if '.vim' in suffix:
216     outs[2].close()