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
28 class CounterHandler(saxlib
.DocumentHandler
):
35 def setDocumentLocator(self
,locator
):
36 self
.locator
= locator
37 saxlib
.DocumentHandler
.setDocumentLocator(self
,locator
)
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(),
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
55 if self
.langs
.has_key(name
):
56 self
.langs
[name
] = 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
65 self
.namelangs
[name
] = 1
67 if self
.langs
.has_key(name
):
68 self
.langs
[name
] = self
.langs
[name
] + 1
72 def startElement(self
,name
,attrs
):
73 #print "start of ",name,attrs,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']
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"]
88 self
._countnamelang
(lang
)
89 elif (name
== "description"):
90 if attmap
.has_key("xml:lang"):
91 lang
= attmap
["xml:lang"]
96 def endElement(self
,name
):
97 popped
= self
.elemstk
.pop()
99 raise Exception("stack error somewhere...")
100 if (name
== "sheet") or (name
== "object"):
101 res
= self
.langstk
.pop()
103 #print "end of",name, res
105 #print "end of ",name
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"
114 ## res = saxlib.EntityResolver.resolveEntity(name,publicId,systemId)
116 ## print "--> res",res,type(res)
121 print "Usage: %s <sheet.sheet>" % sys
.argv
[0]
123 print " <sheet.sheet>: file name of the sheet to check"
126 # Load parser and driver
128 p
=saxexts
.make_parser()
129 #p=saxexts.XMLValParserFactory.make_parser()
131 p
.setDocumentHandler(ch
)
132 #p.setEntityResolver(BasicEntityResolver())
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())))
145 if len(a
)>len(b
): return a
147 namelen
= len(reduce(maxlen
,fnames
,""))
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
)))
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
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
))
188 langresn
,langrest
= langrest
[:columns
],langrest
[columns
:]
189 sys
.stdout
.write("I: %s %s\n" % (' ' * 8,
190 string
.join(langresn
)))