-    def get_statistics(self):
-        def count_text(text, counter, in_fn=False):
-            if text:
-                text = re.sub(r'\s+', ' ', text)
-
-                chars = len(text) if text.strip() else 0
-                words = len(text.split()) if text.strip() else 0
-                
-                counter['chars'] += chars
-                counter['words'] += words
-                if not in_fn:
-                    counter['chars_with_fn'] += chars
-                    counter['words_with_fn'] += words
-                
-        def count(elem, counter, in_fn=False):
-            if elem.tag in (RDFNS('RDF'), 'nota_red', 'abstrakt', 'uwaga', 'ekstra'):
-                return
-            if not in_fn and elem.tag in ('pa', 'pe', 'pr', 'pt', 'motyw'):
-                in_fn = True
-            count_text(elem.text, counter, in_fn=in_fn)
-            for child in elem:
-                count(child, counter, in_fn=in_fn)
-                count_text(child.tail, counter, in_fn=in_fn)
-            
-            
-        data = {
-            "self": Counter(),
-            "parts": [],
-            "total": {
-            }
-        }
-
-        count(self.edoc.getroot(), data['self'])
-        for k, v in data['self'].items():
-            data['total'][k] = v
-        
-        for part in self.parts(pass_part_errors=True):
-            if isinstance(part, Exception):
-                data['parts'].append((None, {}))
-            else:
-                data['parts'].append((part, part.get_statistics()))
-                for k, v in data['parts'][-1][1]['total'].items():
-                    data['total'][k] = data['total'].get(k, 0) + v
-            
-        return data
-