]> git.donarmstrong.com Git - lilypond.git/blob - buildscripts/lilypond.words.py
* buildscripts/lilypond.words: order words in search order,
[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/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()
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/performer-init.ly',
43 'ly/property-init.ly',
44 'ly/scale-definitions-init.ly',
45 'ly/script-init.ly',
46 'ly/spanners-init.ly',
47 ]:
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()
54
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',
70 ]:
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()
77
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',
90 ]:
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()
97
98 # (short) drum names
99 for name in [
100 'share/lilypond/scm/drums.scm'
101 ]:
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()
108     
109 # reserved words
110 for name in [
111 'ly/engraver-init.ly',
112 'ly/performer-init.ly',
113 ]:
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)))",
120         ]:
121             m = re.search(pattern,line)
122             if m:
123                 rw = rw + ['' + m.group(2)]
124     F.close()
125
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')
133    
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')
145
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')
156
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')
167
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 - % { _ } -',
190 ]:
191     # urg. escape char '/' is replaced with '\\' which python writes as a '\'.
192     out_el.write(string.join(string.split(line,'/'),'\\') + '\n')
193  
194 out_el.close()
195 out_vim.close()