NumberDef: Store 'expr' field, a string for things that will get evaled but a static...
[python-bulletml.git] / bulletml / parser.py
index a07cc2d..2ad648c 100644 (file)
@@ -14,9 +14,12 @@ import math
 from xml.etree.ElementTree import ElementTree
 
 try:
-    from cStringIO import StringIO
+    from io import StringIO
 except ImportError:
-    from StringIO import StringIO
+    try:
+        from cStringIO import StringIO
+    except ImportError:
+        from StringIO import StringIO
 
 from bulletml.errors import Error
 from bulletml.expr import NumberDef, INumberDef
@@ -170,6 +173,28 @@ class Wait(object):
     def __repr__(self):
         return "%s(%r)" % (type(self).__name__, self.frames)
 
+class Tag(object):
+    """Set a bullet tag."""
+
+    def __init__(self, tag):
+        self.tag = tag
+
+    @classmethod
+    def FromElement(cls, doc, element):
+        """Construct using an ElementTree-style element."""
+        return cls(element.text)
+
+class Untag(object):
+    """Unset a bullet tag."""
+
+    def __init__(self, tag):
+        self.tag = tag
+
+    @classmethod
+    def FromElement(cls, doc, element):
+        """Construct using an ElementTree-style element."""
+        return cls(element.text)
+
 class Vanish(object):
     """Make the owner disappear."""
 
@@ -502,7 +527,7 @@ class BulletML(object):
     @classmethod
     def FromDocument(cls, source):
         """Return a BulletML instance based on a string or file-like."""
-        if isinstance(source, (str, unicode)):
+        if not hasattr(source, 'read'):
             source = StringIO(source)
 
         tree = ElementTree()
@@ -542,7 +567,7 @@ class BulletML(object):
     @property
     def top(self):
         """Get a list of all top-level actions."""
-        return [dfn for name, dfn in self.actions.iteritems()
+        return [dfn for name, dfn in self.actions.items()
                 if name and name.startswith("top")]
 
     def __repr__(self):
@@ -551,13 +576,15 @@ class BulletML(object):
             self.fires)
 
 ActionDef.CONSTRUCTORS = dict(
-        repeat=Repeat,
-        fire=FireDef,
-        fireRef=FireRef,
-        changeSpeed=ChangeSpeed,
-        changeDirection=ChangeDirection,
-        accel=Accel,
-        wait=Wait,
-        vanish=Vanish,
-        action=ActionDef,
-        actionRef=ActionRef)
+    repeat=Repeat,
+    fire=FireDef,
+    fireRef=FireRef,
+    changeSpeed=ChangeSpeed,
+    changeDirection=ChangeDirection,
+    accel=Accel,
+    wait=Wait,
+    vanish=Vanish,
+    tag=Tag,
+    untag=Untag,
+    action=ActionDef,
+    actionRef=ActionRef)