| Trees | Indices | Help | 
 | 
|---|
|  | 
  1  #!/usr/bin/env python 
  2  # -*- coding: utf-8 -*- 
  3  #  
  4  # Copyright 2007 Zuza Software Foundation 
  5  #  
  6  # This file is part of translate. 
  7  # 
  8  # translate is free software; you can redistribute it and/or modify 
  9  # it under the terms of the GNU General Public License as published by 
 10  # the Free Software Foundation; either version 2 of the License, or 
 11  # (at your option) any later version. 
 12  #  
 13  # translate is distributed in the hope that it will be useful, 
 14  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 15  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 16  # GNU General Public License for more details. 
 17  # 
 18  # You should have received a copy of the GNU General Public License 
 19  # along with translate; if not, write to the Free Software 
 20  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 21   
 22  """Module to provide statistics and related functionality. 
 23   
 24  @organization: Zuza Software Foundation 
 25  @copyright: 2007 Zuza Software Foundation 
 26  @license: U{GPL <http://www.fsf.org/licensing/licenses/gpl.html>} 
 27  """ 
 28   
 29  from translate import lang 
 30  from translate.lang import factory 
 31   
 32  # calling classifyunits() in the constructor is probably not ideal.  
 33  # idea: have a property for .classification that calls it if necessary 
 34   
 35  # If we add units or change translations, statistics are out of date 
 36  # Compare with modules/Status.py in pootling that uses a bitmask to  
 37  # filter units 
 38   
 39  # Add support for reading and writing Pootle style .stats files 
 40   
 41  # Consider providing quickstats 
 42   
 44      """Manages statistics for storage objects.""" 
 45   
 47          self.sourcelanguage = sourcelanguage 
 48          self.targetlanguage = targetlanguage 
 49          self.language = lang.factory.getlanguage(self.sourcelanguage) 
 50  #        self.init_checker(checkerstyle) 
 51           
 52          self.classification = {} 
 53   
 55          from translate.filters import checks 
 56          from translate.filters import pofilter 
 57          checkerclasses = [checkerstyle or checks.StandardChecker, pofilter.StandardPOChecker] 
 58          self.checker = pofilter.POTeeChecker(checkerclasses=checkerclasses) 
 59   
 61          """Return a list of fuzzy units.""" 
 62          if not self.classification: 
 63              self.classifyunits() 
 64          units = self.getunits() 
 65          return [units[item] for item in self.classification["fuzzy"]] 
 66   
 70   
 72          """Return a list of translated units.""" 
 73          if not self.classification: 
 74              self.classifyunits() 
 75          units = self.getunits() 
 76          return [units[item] for item in self.classification["translated"]] 
 77   
 81   
 83          """Return a list of untranslated units.""" 
 84          if not self.classification: 
 85              self.classifyunits() 
 86          units = self.getunits() 
 87          return [units[item] for item in self.classification["blank"]] 
 88   
 93   
 97   
 99          """Joins the unit source strings in a single string of text.""" 
100          source_text = "" 
101          for unit in units: 
102              source_text += unit.source + "\n" 
103              plurals = getattr(unit.source, "strings", []) 
104              if plurals: 
105                  source_text += "\n".join(plurals[1:]) 
106          return source_text 
107   
111   
113          """Returns the number of words in the source text.""" 
114          source_text = self.get_source_text(self.getunits()) 
115          return self.wordcount(source_text) 
116   
118          """Returns the number of translated words in this object.""" 
119   
120          text = self.get_source_text(self.translated_units()) 
121          return self.wordcount(text) 
122   
124          """Returns the number of untranslated words in this object.""" 
125   
126          text = self.get_source_text(self.untranslated_units()) 
127          return self.wordcount(text) 
128   
130          """Returns a list of the classes that the unit belongs to. 
131           
132          @param unit: the unit to classify 
133          """ 
134          classes = ["total"] 
135          if unit.isfuzzy(): 
136              classes.append("fuzzy") 
137          if unit.gettargetlen() == 0: 
138              classes.append("blank") 
139          if unit.istranslated(): 
140              classes.append("translated") 
141          #TODO: we don't handle checking plurals at all yet, as this is tricky... 
142          source = unit.source 
143          target = unit.target 
144          if isinstance(source, str) and isinstance(target, unicode): 
145              source = source.decode(getattr(unit, "encoding", "utf-8")) 
146          #TODO: decoding should not be done here 
147  #        checkresult = self.checker.run_filters(unit, source, target) 
148          checkresult = {} 
149          for checkname, checkmessage in checkresult.iteritems(): 
150              classes.append("check-" + checkname) 
151          return classes 
152   
154          """Makes a dictionary of which units fall into which classifications. 
155           
156          This method iterates over all units. 
157          """ 
158          self.classification = {} 
159          self.classification["fuzzy"] = [] 
160          self.classification["blank"] = [] 
161          self.classification["translated"] = [] 
162          self.classification["has-suggestion"] = [] 
163          self.classification["total"] = [] 
164  #        for checkname in self.checker.getfilters().keys(): 
165  #            self.classification["check-" + checkname] = [] 
166          for item, unit in enumerate(self.unit_iter()): 
167              classes = self.classifyunit(unit) 
168  #            if self.basefile.getsuggestions(item): 
169  #                classes.append("has-suggestion") 
170              for classname in classes: 
171                  if classname in self.classification: 
172                      self.classification[classname].append(item) 
173                  else: 
174                      self.classification[classname] = item 
175          self.countwords() 
176   
178          """Counts the source and target words in each of the units.""" 
179          self.sourcewordcounts = [] 
180          self.targetwordcounts = [] 
181          for unit in self.unit_iter(): 
182              self.sourcewordcounts.append([self.wordcount(text) for text in getattr(unit.source, "strings", [""])]) 
183              self.targetwordcounts.append([self.wordcount(text) for text in getattr(unit.target, "strings", [""])]) 
184   
186          """Updates the classification of a unit in self.classification. 
187           
188          @param item: an integer that is an index in .getunits(). 
189          """ 
190          unit = self.getunits()[item] 
191          self.sourcewordcounts[item] = [self.wordcount(text) for text in unit.source.strings] 
192          self.targetwordcounts[item] = [self.wordcount(text) for text in unit.target.strings] 
193          classes = self.classifyunit(unit) 
194  #        if self.basefile.getsuggestions(item): 
195  #            classes.append("has-suggestion") 
196          for classname, matchingitems in self.classification.items(): 
197              if (classname in classes) != (item in matchingitems): 
198                  if classname in classes: 
199                      self.classification[classname].append(item) 
200                  else: 
201                      self.classification[classname].remove(item) 
202                  self.classification[classname].sort() 
203  #        self.savestats() 
204   
| Trees | Indices | Help | 
 | 
|---|
| Generated by Epydoc 3.0.1 on Wed Mar 26 12:49:31 2008 | http://epydoc.sourceforge.net |