]> git.pld-linux.org Git - packages/rpm-build-tools.git/blame - spec_utf8
- ignore if/endif in desc
[packages/rpm-build-tools.git] / spec_utf8
CommitLineData
11774a5d
AF
1#!/usr/bin/python
2
c143293b
AF
3debug = False
4
89cef9e8 5import os, os.path, re, sys, locale, StringIO
11774a5d
AF
6
7langs={
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',
e4fe63e5 33 'ru':'KOI8-R',
11774a5d
AF
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
fb3b78fc
AF
46def 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
11774a5d 59def parse_spec(infile, outfile):
a5acbd63 60 success = True
11774a5d 61 re_summary = re.compile("^Summary\(([^\)]+)\):\t+(.*)$")
fb3b78fc 62 re_utf = re.compile("^utf-8$", re.I)
11774a5d 63 re_desc = re.compile("^(%description.*\s)-l\s+([\S]+)($|\s.*$)")
d59adc05 64 re_proc = re.compile("^%[^{]")
987bcde8 65 re_ignore_proc = re.compile("^%(if|endif)")
c143293b 66 re_changelog = re.compile("^%changelog")
11774a5d 67 in_desc = False
c143293b 68 in_changelog = False
11774a5d
AF
69
70 for l in infile:
c143293b
AF
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:
96b557de
AF
77 lang = r.group(2)
78 (enc, pure_lang) = find_encoding(lang)
c143293b 79 if enc == None:
96b557de 80 outfile.write("#spec_utf8: unknown lang code in %%description -l %s\n" % (lang))
a5acbd63 81 success = False
c143293b
AF
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:
987bcde8 86 if re_proc.search(l) and not re_ignore_proc.search(l):
c143293b
AF
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:
96b557de 94 outfile.write("#spec_utf8: transcoding error %%description -l %s\n" % (pure_lang))
a5acbd63 95 success = False
c143293b
AF
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")
a5acbd63 104 success = False
c143293b
AF
105 else:
106 # Summary
11774a5d
AF
107 r = re_summary.match(l)
108 if r:
96b557de
AF
109 lang = r.group(1)
110 (enc, pure_lang) = find_encoding(lang)
fb3b78fc 111 if enc == None:
2fb1bcb0 112 outfile.write("#spec_utf8: unknown lang code in Summary(%s)\n" % (lang))
a5acbd63 113 success = False
fb3b78fc 114 elif not re_utf.search(enc):
11774a5d 115 try:
fb3b78fc 116 desc = unicode(r.group(2), enc).encode("UTF-8")
c143293b 117 outline = "Summary(%s.UTF-8): %s\n" % (pure_lang, desc)
11774a5d 118 except UnicodeDecodeError:
96b557de 119 outfile.write("#spec_utf8: transcoding error Summary(%s)\n" % (lang))
a5acbd63 120 success = False
c143293b
AF
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, ))
8b4cb13b 128 return success
11774a5d 129
89cef9e8 130def main(argv):
8bb5df68 131 print "Converting %s ..." % argv[1]
89cef9e8
AM
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')
a5acbd63
AM
138 if not parse_spec(sio, f):
139 sys.stderr.write(" Problems while converting %s.\n" % argv[1])
89cef9e8
AM
140 f.close()
141 os.rename(argv[1] + '.tmp', argv[1])
11774a5d
AF
142
143if __name__ == "__main__":
89cef9e8
AM
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)
11774a5d 148
This page took 0.155275 seconds and 4 git commands to generate.