]> git.donarmstrong.com Git - lilypond.git/blob - buildscripts/lilypond.words.py
445fff7544ed0b26705ca0921e99b5ee53f37b37
[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 outlines = []
11 prekw = '\\\\'
12
13 # keywords not otherwise found
14 for line in ['include','maininput','version']:
15     outlines = outlines + [prekw + line]
16
17 # the main keywords
18 F = open('lily/my-lily-lexer.cc', 'r')
19 for line in F.readlines():
20     m = re.search(r"(\s*{\")(.*)(\",\s*.*},\s*\n)",line)
21     if m:
22         outlines = outlines + [prekw + m.group(2)]
23 F.close()
24
25 # keywords in markup
26 F = open('scm/new-markup.scm', 'r')
27 for line in F.readlines():
28     m = re.search(r"^(\s*\(cons\s*)([a-z-]*)(-markup)",line)
29     if m:
30         outlines = outlines + [prekw + m.group(2)]
31 F.close()
32
33 # identifiers and keywords
34 for name in [
35 'ly/a4-init.ly',
36 'ly/chord-modifiers-init.ly',
37 'ly/dynamic-scripts-init.ly',
38 'ly/engraver-init.ly',
39 'ly/grace-init.ly',
40 'ly/gregorian-init.ly',
41 'ly/performer-init.ly',
42 'ly/property-init.ly',
43 'ly/scale-definitions-init.ly',
44 'ly/script-init.ly',
45 'ly/spanners-init.ly',
46 ]:
47     F = open(name, 'r')
48     for line in F.readlines():
49         m = re.search(r"^([a-zA-Z]+)(\s*=)",line)
50         if m:
51             outlines = outlines + [prekw + m.group(1)]
52     F.close()
53
54 # more identifiers
55 for name in [
56 'ly/declarations-init.ly',
57 'ly/paper11-init.ly',
58 'ly/paper13-init.ly',
59 'ly/paper16-init.ly',
60 'ly/paper19-init.ly',
61 'ly/paper20-init.ly',
62 'ly/paper23-init.ly',
63 'ly/paper26-init.ly',
64 'ly/paper-as5-init.ly',
65 'ly/paper-as9-init.ly',
66 'ly/paper-init.ly',
67 'ly/params-init.ly',
68 'ly/params-as-init.ly',
69 ]:
70     F = open(name, 'r')
71     for line in F.readlines():
72         m = re.search(r"^(\s*)([a-zA-Z]+)(\s*=)",line)
73         if m:
74             outlines = outlines + [prekw + m.group(2)]
75     F.close()
76
77 # note names
78 for name in [
79 'ly/catalan.ly',
80 'ly/deutsch.ly',
81 'ly/drumpitch-init.ly',
82 'ly/english.ly',
83 'ly/espanol.ly',
84 'ly/italiano.ly',
85 'ly/nederlands.ly',
86 'ly/norsk.ly',
87 'ly/suomi.ly',
88 'ly/svenska.ly',
89 ]:
90     F = open(name, 'r')
91     for line in F.readlines():
92         m = re.search(r"^(\s*\()([a-z]+)([^l]+ly:make-pitch)",line)
93         if m:
94             outlines = outlines + ['' + m.group(2)]
95     F.close()
96
97 # (short) drum names
98 for name in [
99 'share/lilypond/scm/drums.scm'
100 ]:
101     F = open(name, 'r')
102     for line in F.readlines():
103         m = re.search(r"^(\s*\([a-z]+\s*)([a-z]+)(\s*,\(ly:make-pitch)",line)
104         if m:
105             print(m.group(2))
106             outlines = outlines + ['' + 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                 outlines = outlines + ['' + m.group(2)]
124     F.close()
125
126 # the output file
127 if sys.argv[1:] == []:
128   out = open('lilypond.words.el', 'w')
129 else:
130   out = open(sys.argv[1]+'/lilypond.words.el', 'w')
131
132 # the menu in lilypond-mode.el
133 for line in [
134 '/( - _ /) -',
135 '/[ - _ /] -',
136 '< - _ > -',
137 '<< - _ >> -',
138 '///( - _ ///) -',
139 '///[ - _ ///] -',
140 '///< - _ ///! -',
141 '///> - _ ///! -',
142 '//center - / << _ >> -',
143 '//column - / << _ >> -',
144 '//context/ Staff/ = - % { _ } -',
145 '//context/ Voice/ = - % { _ } -',
146 '//markup - { _ } -',
147 '//notes - { _ } -',
148 '//relative - % { _ } -',
149 '//score - { //n /? //simultaneous { //n _ //n } /! //n //paper {  } //n /? //midi {  } //n /! } //n -',
150 '//simultaneous - { _ } -',
151 '//sustainDown - _ //sustainUp -',
152 '//times - % { _ } -',
153 '//transpose - % { _ } -',
154 ]:
155     # urg. escape char '/' is replaced with '\\' which python writes as a '\'.
156     out.write(string.join(string.split(line,'/'),'\\') + '\n')
157     
158 # alphabetically ordered words
159 outlines.sort()
160 prevline = ''
161 for line in outlines:
162     if line != prevline:
163         out.write(line + '\n')
164     prevline = line
165
166 out.close()