* lily/dot-column.cc (dot_config_badness): new function:
[lilypond.git] / buildscripts / lilypond.words.py
blobf01c199f3c9beb7365c3dc45dd1cc086f7b23669
1 #!@PYTHON@
3 # Created 01 September 2003 by Heikki Junes.
4 # Generates lilypond.words.el for (X)Emacs and lilypond.words.vim for Vim.
6 import string
7 import re
8 import sys
10 kw = []
11 rw = []
12 notes = []
14 # keywords not otherwise found
15 for line in ['include','maininput','version']:
16 kw = kw + [line]
18 # the main keywords
19 F = open('lily/my-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()
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()
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/performer-init.ly',
43 'ly/property-init.ly',
44 'ly/scale-definitions-init.ly',
45 'ly/script-init.ly',
46 'ly/spanners-init.ly',
48 F = open(name, 'r')
49 for line in F.readlines():
50 m = re.search(r"^([a-zA-Z]+)(\s*=)",line)
51 if m:
52 kw = kw + [m.group(1)]
53 F.close()
55 # more identifiers
56 for name in [
57 'ly/declarations-init.ly',
58 'ly/paper11-init.ly',
59 'ly/paper13-init.ly',
60 'ly/paper16-init.ly',
61 'ly/paper19-init.ly',
62 'ly/paper20-init.ly',
63 'ly/paper23-init.ly',
64 'ly/paper26-init.ly',
65 'ly/paper-as5-init.ly',
66 'ly/paper-as9-init.ly',
67 'ly/paper-init.ly',
68 'ly/params-init.ly',
69 'ly/params-as-init.ly',
71 F = open(name, 'r')
72 for line in F.readlines():
73 m = re.search(r"^(\s*)([a-zA-Z]+)(\s*=)",line)
74 if m:
75 kw = kw + [m.group(2)]
76 F.close()
78 # note names
79 for name in [
80 'ly/catalan.ly',
81 'ly/deutsch.ly',
82 'ly/drumpitch-init.ly',
83 'ly/english.ly',
84 'ly/espanol.ly',
85 'ly/italiano.ly',
86 'ly/nederlands.ly',
87 'ly/norsk.ly',
88 'ly/suomi.ly',
89 'ly/svenska.ly',
91 F = open(name, 'r')
92 for line in F.readlines():
93 m = re.search(r"^(\s*\()([a-z]+)([^l]+ly:make-pitch)",line)
94 if m:
95 notes = notes + ['' + m.group(2)]
96 F.close()
98 # (short) drum names
99 for name in [
100 'scm/drums.scm'
102 F = open(name, 'r')
103 for line in F.readlines():
104 m = re.search(r"^(\s*\([a-z]+\s*)([a-z]+)(\s*,\(ly:make-pitch)",line)
105 if m:
106 notes = notes + ['' + m.group(2)]
107 F.close()
109 # reserved words
110 for name in [
111 'ly/engraver-init.ly',
112 'ly/performer-init.ly',
114 F = open(name, 'r')
115 for line in F.readlines():
116 for pattern in [
117 r"^(\s*.consists\s+\")([a-zA-Z_]+)(\")",
118 r"([\\]name\s+[\"]?)([a-zA-Z_]+)([\"]?)",
119 r"(\s+)([a-zA-Z_]+)(\s*[\\]((set)|(override)))",
121 m = re.search(pattern,line)
122 if m:
123 rw = rw + ['' + m.group(2)]
124 F.close()
126 # the output file
127 if sys.argv[1:] == []:
128 out_el = open('lilypond.words.el', 'w')
129 out_vim = open('lilypond.words.vim', 'w')
130 else:
131 out_el = open(sys.argv[1]+'/lilypond.words.el', 'w')
132 out_vim = open(sys.argv[1]+'/lilypond.words.vim', 'w')
134 # alphabetically ordered words
135 kw.sort()
136 kw.reverse()
137 prevline = ''
138 out_vim.write('syn match lilyKeyword \"[-_^]\\?\\\\\\(');
139 for line in kw:
140 if line != prevline:
141 out_el.write('\\\\' + line + '\n')
142 out_vim.write(line + '\\|')
143 prevline = line
144 out_vim.write('n\\)\\(\\A\\|\\n\\)\"me=e-1\n')
146 rw.sort()
147 rw.reverse()
148 prevline = ''
149 out_vim.write('syn match lilyReservedWord \"\\(\\A\\|\\n\\)\\(');
150 for line in rw:
151 if line != prevline:
152 out_el.write(line + '\n')
153 out_vim.write(line + '\\|')
154 prevline = line
155 out_vim.write('Score\\)\\(\\A\\|\\n\\)\"ms=s+1,me=e-1\n')
157 notes.sort()
158 notes.reverse()
159 prevline = ''
160 out_vim.write('syn match lilyNote \"\\<\\(\\(\\(');
161 for line in notes:
162 if line != prevline:
163 out_el.write(line + '\n')
164 out_vim.write(line + '\\|')
165 prevline = line
166 out_vim.write('a\\)\\([,\']\\)\\{,4}\\([?!]\\)\\?\\)\\|s\\|r\\)\\(\\(128\\|64\\|32\\|16\\|8\\|4\\|2\\|1\\|\\\\breve\\|\\\\longa\\|\\\\maxima\\)[.]\\{,8}\\)\\?\\(\\A\\|\\n\\)\"me=e-1\n')
168 # the menu in lilypond-mode.el
169 for line in [
170 '/( - _ /) -',
171 '/[ - _ /] -',
172 '< - _ > -',
173 '<< - _ >> -',
174 '///( - _ ///) -',
175 '///[ - _ ///] -',
176 '///< - _ ///! -',
177 '///> - _ ///! -',
178 '//center - / << _ >> -',
179 '//column - / << _ >> -',
180 '//context/ Staff/ = - % { _ } -',
181 '//context/ Voice/ = - % { _ } -',
182 '//markup - { _ } -',
183 '//notes - { _ } -',
184 '//relative - % { _ } -',
185 '//score - { //n /? //simultaneous { //n _ //n } /! //n //paper { } //n /? //midi { } //n /! } //n -',
186 '//simultaneous - { _ } -',
187 '//sustainDown - _ //sustainUp -',
188 '//times - % { _ } -',
189 '//transpose - % { _ } -',
191 # urg. escape char '/' is replaced with '\\' which python writes as a '\'.
192 out_el.write(string.join(string.split(line,'/'),'\\') + '\n')
194 out_el.close()
195 out_vim.close()