Keep a separate activity counter for every naglowek_podrozdzial tag
[librarian.git] / librarian / xmlutils.py
index 9e921a2..bbcc884 100644 (file)
@@ -12,24 +12,35 @@ class Xmill(object):
     Used instead of XSLT which is difficult and cumbersome.
 
     """
-    def __init__(self, options=None):
+    def __init__(self, options=None, state=None):
         self._options = []
+        self.state = state or {}
         if options:
             self._options.append(options)
         self.text_filters = []
+        self.escaped_text_filters = []
 
     def register_text_filter(self, fun):
         self.text_filters.append(fun)
 
+    def register_escaped_text_filter(self, fun):
+        self.escaped_text_filters.append(fun)
+
     def filter_text(self, text):
         for flt in self.text_filters:
             if text is None:
                 return None
-            text = flt(text)
+            else:
+                text = flt(text)
         # TODO: just work on the tree and let lxml handle escaping.
         e = etree.Element("x")
         e.text = text
-        return etree.tostring(e, encoding=unicode)[3:-4]
+        # This whole mixing text with ML is so wrong.
+        output = etree.tostring(e, encoding=unicode)[3:-4]
+        for flt in self.escaped_text_filters:
+            output = flt(output)
+        return output
+
 
     def generate(self, document):
         """Generate text from node using handlers defined in class."""
@@ -93,6 +104,7 @@ class Xmill(object):
         if isinstance(element, etree._Comment): return None
         
         handler = self._handle_for_element(element)
+        if self.state.get('mute') and not getattr(handler, 'unmuter', False): return None
         # How many scopes
         try:
             options_scopes = len(self._options)
@@ -117,6 +129,7 @@ class Xmill(object):
         finally:
             # clean up option scopes if necessary
             self._options = self._options[0:options_scopes]
+            
         return out