]> git.pld-linux.org Git - packages/rpm-build-tools.git/blob - spec_utf8
Allow (not only tabs but also) spaces in summary fields.
[packages/rpm-build-tools.git] / spec_utf8
1 #!/usr/bin/python
2
3 debug = False
4
5 import os, os.path, re, sys, locale, StringIO
6
7 langs={
8     'bg':'windows-1251',
9     'br':'iso8859-1',
10     'ca':'iso8859-1',
11     'cs':'iso8859-2',
12     'da':'iso8859-1',
13     'de':'iso8859-1',
14     'en':'iso8859-1',
15     'eo':'iso8859-3',
16     'es':'iso8859-1',
17     'fi':'iso8859-1',
18     'fo':'iso8859-1',
19     'fr':'iso8859-1',
20     'gl':'iso8859-1',
21     'he':'iso8859-8',
22     'id':'iso8859-1',
23     'is':'iso8859-1',
24     'it':'iso8859-1',
25     'ja':'euc-jp',
26     'ko':'euc-kr',
27     'nb':'iso8859-1',
28     'nl':'iso8859-1', 
29     'pl':'iso8859-2',
30     'pt':'iso8859-1',
31     'pt_BR':'iso8859-1',
32     'ro':'iso8859-2',
33     'ru':'KOI8-R',
34     'se':'UTF-8',
35     'sk':'iso8859-2',
36     'sl':'iso8859-2',
37     'sv':'iso8859-1',
38     'tr':'iso8859-9',
39     'uk':'KOI8-U',
40     'wa':'iso8859-1',
41     'zh_CN':'GB2312',
42     'zh_HK':'BIG5-HKSCS',
43     'zh_TW':'BIG5',
44     0:0}
45
46 def find_encoding(lang):
47   r = re.match("^([^.]+)(\.[^@]+)?$", lang)
48   pure_lang = r.group(1)
49   if r.group(2) == None:
50     try:
51       enc = langs[lang]
52     except KeyError:
53       enc = None
54   else:
55     # strip dot
56     enc = r.group(2)[1:]
57   return (enc, pure_lang)
58
59 def parse_spec(infile, outfile):
60   success = True
61   re_summary = re.compile("^Summary\(([^\)]+)\):[ \t]+(.*)$")
62   re_utf = re.compile("^utf-8$", re.I)
63   re_desc = re.compile("^(%description.*\s)-l\s+([\S]+)($|\s.*$)")
64   re_proc = re.compile("^%[^{]")
65   re_ignore_proc = re.compile("^%(if|endif)")
66   re_changelog = re.compile("^%changelog")
67   in_desc = False
68   in_changelog = False
69
70   for l in infile:
71     outline = l
72     if debug: outfile.write("%s, %s, %s" % (in_desc, in_changelog, l))
73
74     # %description start
75     r = re_desc.match(l)
76     if r:
77       lang = r.group(2)
78       (enc, pure_lang) = find_encoding(lang)
79       if enc == None:
80         outfile.write("#spec_utf8: unknown lang code in %%description -l %s\n" % (lang))
81         success = False
82       elif not re_utf.search(enc):
83         in_desc = True
84         outline = "%s-l %s.UTF-8%s\n" % (r.group(1), pure_lang, r.group(3))
85     elif in_desc:
86       if re_proc.search(l) and not re_ignore_proc.search(l):
87         in_desc = False
88       else:
89         # %description continues
90         if not re_utf.search(enc):
91           try:
92             outline = unicode(l, enc).encode("UTF-8")
93           except UnicodeDecodeError:
94             outfile.write("#spec_utf8: transcoding error %%description -l %s\n" % (pure_lang))
95             success = False
96     elif in_changelog:
97       try:
98         outline = unicode(l, "UTF-8").encode("UTF-8")
99       except UnicodeDecodeError:
100         try:
101           outline = unicode(l, "ISO-8859-2").encode("UTF-8")
102         except UnicodeDecodeError:
103           outfile.write("#spec_utf8: transcoding next line from Latin2 failed\n")
104           success = False
105     else: 
106       # Summary
107       r = re_summary.match(l)
108       if r:
109         lang = r.group(1)
110         (enc, pure_lang) = find_encoding(lang)
111         if enc == None:
112           outfile.write("#spec_utf8: unknown lang code in Summary(%s)\n" % (lang))
113           success = False
114         elif not re_utf.search(enc):
115           try:
116             desc = unicode(r.group(2), enc).encode("UTF-8")
117             outline = "Summary(%s.UTF-8):   %s\n" % (pure_lang, desc)
118           except UnicodeDecodeError:
119             outfile.write("#spec_utf8: transcoding error Summary(%s)\n" % (lang))
120             success = False
121       elif re_changelog.match(l):
122         # %changelog start
123         in_changelog = True
124     
125     
126     if debug: outfile.write("%s, %s\n"% (in_desc, in_changelog))
127     outfile.write("%s"% (outline, ))
128   return success
129
130 def main(argv):
131   print "Converting %s ..." % argv[1]
132   f = open(argv[1], 'r')
133   sio = StringIO.StringIO()
134   sio.write(f.read())
135   f.close()
136   sio.seek(0)
137   f = open(argv[1] + '.tmp', 'w')
138   if not parse_spec(sio, f):
139           sys.stderr.write("   Problems while converting %s.\n" % argv[1])
140   f.close()
141   os.rename(argv[1] + '.tmp', argv[1])
142
143 if __name__ == "__main__":
144   if len(sys.argv) != 2:
145           sys.stderr.write("Usage: %s <spec file>\n" % sys.argv[0])
146           sys.exit(1)
147   main(sys.argv)
148
This page took 0.076079 seconds and 4 git commands to generate.