1
'''macros.py: Generate macro values from configuration values and provide
2
substitution functions.
4
The following macros are available:
6
LCODE CCODE PCCODE PKGNAME LANG COUNTRY PCOUNTRY RELEASE UPLOADER
7
DATE TIMESTAMP SUPDEPS CLASS CLASSNAME CLASSNAMESPACE
10
import time, re, os.path, os
12
def _file_map(file, key, sep = None):
13
'''Look up key in given file ("key value" lines). Throw an exception if
23
if k.find('#') >= 0 or v.find('#') >= 0:
28
raise Exception, 'Key %s not found in %s' % (key, file)
32
def __init__(self, locale, cls, release, version):
34
# chop .* and @* suffixes to get encoding-agnostic locale
35
self['LOCALE'] = (locale.split('.')[0]).split('@')[0]
40
self['CLASSNAME'] = _file_map('maps/classnames', cls)
41
self['CLASSNAMESPACE'] = self['CLASSNAME'] + ' '
43
# language and country
45
(self['LCODE'], self['CCODE']) = self['LOCALE'].split('_')
46
self['PCCODE'] = '(%s)' % self['CCODE']
47
self['COUNTRY'] = _file_map('maps/countries', self['CCODE'], ':')
48
self['PCOUNTRY'] = '(%s)' % self['COUNTRY']
50
self['LCODE'] = self['LOCALE']
53
raise Exception, 'Internal error: LCODE is empty'
55
self['LANG'] = _file_map('maps/languages', self['LCODE'], ':')
59
self['PKGNAME'] = '%s-%s' % (self['CLASS'], self['LCODE'])
61
self['PKGNAME'] = self['LCODE']
64
self['UPLOADER'] = open('config/UPLOADER').read().strip()
67
self['DATE'] = time.strftime('%a, %d %b %Y %H:%M:%S +0000')
68
self['RELEASE'] = release
69
self['TIMESTAMP'] = version
71
# support dependencies
73
deps = [l.strip() for l in open('support-depends/' + self['PKGNAME'])
75
self['SUPDEPS'] = ', '.join(deps)
79
def __getitem__(self, item):
80
# return empty string as default
81
return self.macros.get(item, '')
83
def __setitem__(self, item, value):
84
self.macros[item] = value
86
def subst_string(self, s):
87
'''Substitute all macros in given string.'''
89
re_macro = re.compile('%([A-Z]+)%')
91
m = re_macro.search(s)
93
s = s[:m.start(1)-1] + self[m.group(1)] + s[m.end(1)+1:]
99
def subst_file(self, file):
100
'''Substitute all macros in given file.'''
102
s = open(file).read()
103
open(file, 'w').write(self.subst_string(s))
105
def subst_tree(self, root):
106
'''Substitute all macros in given directory tree.'''
108
for path, dirs, files in os.walk(root):
110
self.subst_file(os.path.join(root, path, f))
112
if __name__ == '__main__':
113
for locale in ['de', 'de_DE', 'de_DE.UTF-8', 'de_DE.UTF-8@euro', 'fr_BE@latin']:
114
for cl in ['', 'gnome', 'kde']:
115
l = LangpackMacros(locale, cl)
116
print '-------', locale, cl, '---------------'
117
template = '"language-pack-%PKGNAME%: %CLASSNAMESPACE%packages for %LANG% %CCODE% %PCOUNTRY%"'
118
print 'string:', l.subst_string(template)
120
open('testtest', 'w').write(template)
121
l.subst_file('testtest')
122
print 'file :', open('testtest').read()
123
os.unlink('testtest')