vdx version .6.1
[dia.git] / sheets / checktrans.py
blobfb4572a8ec74d03d490379b5a8aa8896afcb5e0c
1 #!/usr/bin/python
3 # This quick hack gives translation statistics about the various sheets.
5 # Copyright (C) 2001, Cyrille Chepelov <chepelov@calixo.net>
7 # This quick hack is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
12 # This quick hack is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this quick hack; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 from xml.sax import saxexts
25 from xml.sax import saxlib
26 import os,sys,string
28 class CounterHandler(saxlib.DocumentHandler):
30 def __init__(self):
31 self.elemstk = []
32 self.langstk = []
33 self.namestk = []
35 def setDocumentLocator(self,locator):
36 self.locator = locator
37 saxlib.DocumentHandler.setDocumentLocator(self,locator)
38 self.langs = {}
39 self.namelangs = {}
41 def warning(self,message):
42 print "W:%s:L%d:C%d: %s" % (self.locator.getSystemId(),
43 self.locator.getLineNumber(),
44 self.locator.getColumnNumber(),
45 message)
46 def _countlang(self,name):
47 locdct = self.langstk[-1]
48 if locdct.has_key(name):
49 self.warning("duplicate description for %s, language code %s" % \
50 (self.namestk[-1],name))
51 locdct[name] = locdct[name] + 1
52 else:
53 locdct[name] = 1
55 if self.langs.has_key(name):
56 self.langs[name] = self.langs[name] + 1
57 else:
58 self.langs[name] = 1
60 def _countnamelang(self,name):
61 if self.namelangs.has_key(name):
62 self.warning("duplicate name for sheet, language code %s" % name)
63 self.namelangs[name] = self.namelangs[name] + 1
64 else:
65 self.namelangs[name] = 1
67 if self.langs.has_key(name):
68 self.langs[name] = self.langs[name] + 1
69 else:
70 self.langs[name] = 1
72 def startElement(self,name,attrs):
73 #print "start of ",name,attrs,attrs.map
74 attmap = attrs.map
75 self.elemstk.append(name)
76 if (name == "sheet") or (name == "object"):
77 self.langstk.append({})
78 if attmap.has_key('name'):
79 name = 'Object "%s"' % attmap['name']
80 else:
81 name = 'Sheet "%s"' % self.locator.getSystemId()
82 self.namestk.append(name)
83 elif (name == "name"):
84 if attmap.has_key("xml:lang"):
85 lang = attmap["xml:lang"]
86 else:
87 lang = ""
88 self._countnamelang(lang)
89 elif (name == "description"):
90 if attmap.has_key("xml:lang"):
91 lang = attmap["xml:lang"]
92 else:
93 lang = ""
94 self._countlang(lang)
96 def endElement(self,name):
97 popped = self.elemstk.pop()
98 if popped != name:
99 raise Exception("stack error somewhere...")
100 if (name == "sheet") or (name == "object"):
101 res = self.langstk.pop()
102 self.namestk.pop()
103 #print "end of",name, res
104 else:
105 #print "end of ",name
106 pass
108 ## class BasicEntityResolver(saxlib.EntityResolver):
109 ## def resolveEntity(name,publicId,systemId):
110 ## print "D:resolveEntity(%s,%s,%s)" % (name,publicId,systemId),
111 ## if publicId == "-//FOO//BAR//EN":
112 ## res = "file:../doc/sheet.dtd"
113 ## else:
114 ## res = saxlib.EntityResolver.resolveEntity(name,publicId,systemId)
116 ## print "--> res",res,type(res)
118 ## return res
120 if len(sys.argv)<2:
121 print "Usage: %s <sheet.sheet>" % sys.argv[0]
122 print
123 print " <sheet.sheet>: file name of the sheet to check"
124 sys.exit(1)
126 # Load parser and driver
128 p=saxexts.make_parser()
129 #p=saxexts.XMLValParserFactory.make_parser()
130 ch=CounterHandler()
131 p.setDocumentHandler(ch)
132 #p.setEntityResolver(BasicEntityResolver())
134 fnames =sys.argv[1:]
136 def make_langresult(langdict,colsize):
137 langres = map(lambda s,colsize=colsize: string.ljust(s,colsize),
138 map(lambda (cc,count),total=langdict['']:
139 ("%s:%d%%" % (cc,100*count/total)),
140 filter(lambda (cc,count): cc, langdict.items())))
141 langres.sort()
142 return langres
144 def maxlen(a,b):
145 if len(a)>len(b): return a
146 return b
147 namelen = len(reduce(maxlen,fnames,""))
149 globlangs = {}
151 for name in fnames:
152 OK=0
153 try:
154 p.parse("file://localhost" + os.getcwd() + "/" + name)
155 OK=1
157 maxlanglen = len(reduce(maxlen,ch.langs.keys(),""))
158 langres = make_langresult(ch.langs,maxlanglen+5)
159 columns = (79 - (4 + namelen)) / (maxlanglen+5)
160 #print "maxlanglen = ",maxlanglen,"columns=",columns
162 langres1,langrest = langres[:columns],langres[columns:]
163 sys.stdout.write(("I: %%%ds %%s\n" % namelen) %
164 (name,string.join(langres1)))
165 while langrest:
166 langresn,langrest = langrest[:columns],langrest[columns:]
167 sys.stdout.write("I: %s %s\n" % (' ' * namelen,
168 string.join(langresn)))
170 for (k,v) in ch.langs.items():
171 if globlangs.has_key(k):
172 globlangs[k] = globlangs[k] + v
173 else:
174 globlangs[k] = v
176 except IOError,e:
177 sys.stderr.write("E: %s: %s\n" % (name,str(e)))
178 except saxlib.SAXException,e:
179 sys.stderr.write("E: %s\n" % str(e))
181 maxlanglen = len(reduce(maxlen,globlangs.keys(),""))
182 langres = make_langresult(globlangs,maxlanglen+5)
183 columns = (79 - 12) / (maxlanglen+5)
185 langres1,langrest = langres[:columns],langres[columns:]
186 sys.stdout.write("\nI: OVERALL: %s\n" % string.join(langres1))
187 while langrest:
188 langresn,langrest = langrest[:columns],langrest[columns:]
189 sys.stdout.write("I: %s %s\n" % (' ' * 8,
190 string.join(langresn)))