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