<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://microformats.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BasgeTorde</id>
	<title>Microformats Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://microformats.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BasgeTorde"/>
	<link rel="alternate" type="text/html" href="https://microformats.org/wiki/Special:Contributions/BasgeTorde"/>
	<updated>2026-04-17T01:13:11Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://microformats.org/wiki/index.php?title=xoxo-sample-code-python&amp;diff=36697</id>
		<title>xoxo-sample-code-python</title>
		<link rel="alternate" type="text/html" href="https://microformats.org/wiki/index.php?title=xoxo-sample-code-python&amp;diff=36697"/>
		<updated>2008-12-25T02:37:34Z</updated>

		<summary type="html">&lt;p&gt;BasgeTorde: coloac&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;pasdronouac&lt;br /&gt;
&lt;br /&gt;
= XOXO Sample Code - Python=&lt;br /&gt;
:'''this is  sub-page of [[xoxo-sample-code]]'''&lt;br /&gt;
&lt;br /&gt;
== xoxo.py ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;xoxo.py - a utility module for transforming to and from the XHTMLOutlines format XOXO http://microformats.org/wiki/xoxo&lt;br /&gt;
toXOXO takes a Python datastructure (tuples, lists or dictionaries, arbitrarily nested) and returns a XOXO representation of it.&lt;br /&gt;
fromXOXO parses an XHTML file for a xoxo list and returns the structure&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
__version__ = &amp;quot;0.9&amp;quot;&lt;br /&gt;
__date__ = &amp;quot;2005-11-02&amp;quot;&lt;br /&gt;
__author__ = &amp;quot;Kevin Marks &amp;lt;kmarks@technorati.com&amp;gt;&amp;quot;&lt;br /&gt;
__copyright__ = &amp;quot;Copyright 2004-2006, Kevin Marks &amp;amp; Technorati&amp;quot;&lt;br /&gt;
__license__ = &amp;quot;http://creativecommons.org/licenses/by/2.0/ CC-by-2.0], [http://www.apache.org/licenses/LICENSE-2.0 Apache 2.0&amp;quot;&lt;br /&gt;
__credits__ = &amp;quot;&amp;quot;&amp;quot;Tantek Ãelik and Mark Pilgrim for data structure&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
__history__ = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
TODO: add &amp;lt;title&amp;gt; tag&lt;br /&gt;
TODO: add a proper profile link&lt;br /&gt;
0.9 smarter parsing for encoding and partial markup; fix dangling dictionary case&lt;br /&gt;
0.8 work in unicode then render to utf-8&lt;br /&gt;
0.7 initial encoding support - just utf-8 for now&lt;br /&gt;
0.6 support the special behavior for url properties  to/from &amp;lt;a&amp;gt;&lt;br /&gt;
0.5 fix some awkward side effects of whitespace and text outside our expected tags; simplify writing code&lt;br /&gt;
0.4 add correct XHTML headers so it validates&lt;br /&gt;
0.3 read/write version; fixed invalid nested list generation;&lt;br /&gt;
0.1 first write-only version&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    True, False&lt;br /&gt;
except NameError:&lt;br /&gt;
    True, False = not not 1, not 1&lt;br /&gt;
containerTags={'ol':False,'ul':False,'dl':False}&lt;br /&gt;
import sgmllib, urllib, urlparse, re,codecs&lt;br /&gt;
&lt;br /&gt;
def toUnicode(key):&lt;br /&gt;
    if type(key) == type(u'unicode'):&lt;br /&gt;
        uKey= key&lt;br /&gt;
    else:&lt;br /&gt;
        try: &lt;br /&gt;
            uKey=unicode(key,'utf-8')&lt;br /&gt;
        except:&lt;br /&gt;
            uKey=unicode(key,'windows_1252')&lt;br /&gt;
    return uKey&lt;br /&gt;
&lt;br /&gt;
def makeXOXO(struct,className=None):&lt;br /&gt;
    s=u''&lt;br /&gt;
    if isinstance(struct,list) or isinstance(struct,tuple):&lt;br /&gt;
        if className:&lt;br /&gt;
            s += u'&amp;lt;ol class=&amp;quot;%s&amp;quot;&amp;gt;' % className&lt;br /&gt;
        else:&lt;br /&gt;
            s+= u&amp;quot;&amp;lt;ol&amp;gt;&amp;quot;&lt;br /&gt;
        for item in struct:&lt;br /&gt;
            s+=u&amp;quot;&amp;lt;li&amp;gt;&amp;quot; + makeXOXO(item,None)+&amp;quot;&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
        s +=u&amp;quot;&amp;lt;/ol&amp;gt;&amp;quot;&lt;br /&gt;
    elif isinstance(struct,dict):&lt;br /&gt;
        d=struct.copy()&lt;br /&gt;
        if d.has_key('url'):&lt;br /&gt;
            uURL=toUnicode(d['url'])&lt;br /&gt;
            s+=u'&amp;lt;a href=&amp;quot;%s&amp;quot; ' % uURL&lt;br /&gt;
            text =  d.get('text',d.get('title',uURL))&lt;br /&gt;
            for attr in ('title','rel','type'):&lt;br /&gt;
                if d.has_key(attr):&lt;br /&gt;
                    xVal = makeXOXO(d[attr],None)&lt;br /&gt;
                    s +=u'%s=&amp;quot;%s&amp;quot; ' % (attr,xVal)&lt;br /&gt;
                    del d[attr]&lt;br /&gt;
            s +=u'&amp;gt;%s&amp;lt;/a&amp;gt;' % makeXOXO(text,None)&lt;br /&gt;
            if d.has_key('text'):&lt;br /&gt;
                del d['text']&lt;br /&gt;
            del d['url']&lt;br /&gt;
        if len(d):&lt;br /&gt;
            s +=u&amp;quot;&amp;lt;dl&amp;gt;&amp;quot;&lt;br /&gt;
            for key,value in d.items():&lt;br /&gt;
                xVal = makeXOXO(value,None)&lt;br /&gt;
                uKey=toUnicode(key)&lt;br /&gt;
                s+= u'&amp;lt;dt&amp;gt;%s&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;%s&amp;lt;/dd&amp;gt;' % (uKey, xVal)&lt;br /&gt;
            s +=u&amp;quot;&amp;lt;/dl&amp;gt;&amp;quot;&lt;br /&gt;
    elif type(struct) == type(u'unicode'):&lt;br /&gt;
        s+=struct&lt;br /&gt;
    else:&lt;br /&gt;
        if not type(struct)==type(' '):&lt;br /&gt;
            struct=str(struct)&lt;br /&gt;
        s += toUnicode(struct)&lt;br /&gt;
    return s&lt;br /&gt;
class AttrParser(sgmllib.SGMLParser):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        sgmllib.SGMLParser.__init__(self)&lt;br /&gt;
        self.text=[]&lt;br /&gt;
        self.encoding='utf-8'&lt;br /&gt;
    def cleanText(self,inText):&lt;br /&gt;
        if type(inText) == type(u'unicode'):&lt;br /&gt;
            inText = inText.encode(self.encoding,'replace')&lt;br /&gt;
        self.text=[]&lt;br /&gt;
        self.reset()&lt;br /&gt;
        self.feed(inText)&lt;br /&gt;
        return ''.join(self.text)&lt;br /&gt;
    def setEncoding(self,encoding):&lt;br /&gt;
        if 'ascii' in encoding:&lt;br /&gt;
            encoding='windows_1252' # so we don't throw an exception on high-bit set chars in there by mistake&lt;br /&gt;
        if encoding and not encoding =='text/html':&lt;br /&gt;
            try:&lt;br /&gt;
                canDecode = codecs.getdecoder(encoding)&lt;br /&gt;
                self.encoding = encoding&lt;br /&gt;
            except:&lt;br /&gt;
                try:&lt;br /&gt;
                    encoding='japanese.' +encoding&lt;br /&gt;
                    canDecode = codecs.getdecoder(encoding)&lt;br /&gt;
                    self.encoding = encoding&lt;br /&gt;
                except:&lt;br /&gt;
                    print &amp;quot;can't deal with encoding %s&amp;quot; % encoding&lt;br /&gt;
                    &lt;br /&gt;
    def handle_entityref(self, ref):&lt;br /&gt;
        # called for each entity reference, e.g. for &amp;quot;&amp;amp;copy;&amp;quot;, ref will be &amp;quot;copy&amp;quot;&lt;br /&gt;
        # map through to unicode where we can&lt;br /&gt;
        try:&lt;br /&gt;
            entity =htmlentitydefs.name2codepoint[ref]&lt;br /&gt;
            self.handleUnicodeData(unichr(entity))&lt;br /&gt;
        except:&lt;br /&gt;
            try:&lt;br /&gt;
                handle_charref(ref) # deal with char-ref's missing the '#' (see Akma)&lt;br /&gt;
            except:&lt;br /&gt;
                self.handle_data(&amp;quot;&amp;amp;%s&amp;quot; % ref)&lt;br /&gt;
&lt;br /&gt;
    def handle_charref(self, ref):&lt;br /&gt;
        # called for each character reference, e.g. for &amp;quot;&amp;amp;#160;&amp;quot;, ref will be &amp;quot;160&amp;quot;&lt;br /&gt;
        # Reconstruct the original character reference.&lt;br /&gt;
        try:&lt;br /&gt;
            if ref[0]=='x':&lt;br /&gt;
                self.handleUnicodeData(unichr(int(ref[1:],16)))&lt;br /&gt;
            else:&lt;br /&gt;
                self.handleUnicodeData(unichr(int(ref)))&lt;br /&gt;
        except:&lt;br /&gt;
            self.handle_data(&amp;quot;&amp;amp;#%s&amp;quot; % ref)&lt;br /&gt;
&lt;br /&gt;
# called for each block of plain text, i.e. outside of any tag and&lt;br /&gt;
# not containing any character or entity references&lt;br /&gt;
    def handle_data(self, text):&lt;br /&gt;
        if type(text)==type(u' '):&lt;br /&gt;
            self.handleUnicodeData(text)&lt;br /&gt;
        if self.encoding== 'utf-8':&lt;br /&gt;
            try:&lt;br /&gt;
                uText = unicode(text,self.encoding) #utf-8 is pretty clear when it is wrong&lt;br /&gt;
            except:&lt;br /&gt;
                uText = unicode(text,'windows_1252','ignore') # and this is the likely wrongness&lt;br /&gt;
        else:&lt;br /&gt;
            uText = unicode(text,self.encoding,'replace') # if they have really broken encoding, (eg lots of shift-JIS blogs)&lt;br /&gt;
        self.handleUnicodeData(uText)&lt;br /&gt;
    def handleUnicodeData(self, uText):&lt;br /&gt;
        self.text.append(uText)&lt;br /&gt;
        &lt;br /&gt;
class xoxoParser(AttrParser):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        AttrParser.__init__(self)&lt;br /&gt;
        self.structs=[]&lt;br /&gt;
        self.xostack=[]&lt;br /&gt;
        self.textstack=['']&lt;br /&gt;
        self.attrparse = AttrParser()&lt;br /&gt;
    def normalize_attrs(self, attrs):&lt;br /&gt;
        attrs = [(k.lower(), self.attrparse.cleanText(v)) for k, v in attrs]&lt;br /&gt;
        attrs = [(k, k in ('rel','type') and v.lower() or v) for k, v in attrs]&lt;br /&gt;
        return attrs&lt;br /&gt;
    def setEncoding(self,encoding):&lt;br /&gt;
        AttrParser.setEncoding(self,encoding)&lt;br /&gt;
        self.attrparse.setEncoding(encoding)&lt;br /&gt;
    def pushStruct(self,struct):&lt;br /&gt;
        if type(struct) == type({}) and len(struct)==0 and len(self.structs) and type(self.structs[-1]) == type({}) and self.structs[-1].has_key('url') and self.structs[-1] != self.xostack[-1]:&lt;br /&gt;
            self.xostack.append(self.structs[-1]) # put back the &amp;lt;a&amp;gt;-made one for extra def's&lt;br /&gt;
        else:&lt;br /&gt;
            self.structs.append(struct)&lt;br /&gt;
            self.xostack.append(self.structs[-1])&lt;br /&gt;
    def do_meta(self, attributes):&lt;br /&gt;
        atts = dict(self.normalize_attrs(attributes))&lt;br /&gt;
        #print atts.encode('utf-8')&lt;br /&gt;
        if atts.has_key('http-equiv'):&lt;br /&gt;
            if atts['http-equiv'].lower() == &amp;quot;content-type&amp;quot;:&lt;br /&gt;
                if atts.has_key('content'):&lt;br /&gt;
                    encoding = atts['content'].split('charset=')[-1]&lt;br /&gt;
                    self.setEncoding(encoding)&lt;br /&gt;
    def start_a(self,attrs):&lt;br /&gt;
        attrsD = dict(self.normalize_attrs(attrs))&lt;br /&gt;
        attrsD['url']= attrsD.get('href','')&lt;br /&gt;
        if attrsD.has_key('href'):&lt;br /&gt;
            del attrsD['href']&lt;br /&gt;
        self.pushStruct(attrsD)&lt;br /&gt;
        self.textstack.append('')&lt;br /&gt;
    def end_a(self):&lt;br /&gt;
        val = self.textstack.pop()&lt;br /&gt;
        if val: &lt;br /&gt;
            if self.xostack[-1].get('title','') == val:&lt;br /&gt;
                val=''&lt;br /&gt;
            if self.xostack[-1]['url'] == val:&lt;br /&gt;
                val=''&lt;br /&gt;
            if val:&lt;br /&gt;
                self.xostack[-1]['text']=val&lt;br /&gt;
        self.xostack.pop()&lt;br /&gt;
    def start_dl(self,attrs):&lt;br /&gt;
        self.pushStruct({})&lt;br /&gt;
    def end_dl(self):&lt;br /&gt;
        self.xostack.pop()&lt;br /&gt;
    def start_ol(self,attrs):&lt;br /&gt;
        self.pushStruct([])&lt;br /&gt;
    def end_ol(self):&lt;br /&gt;
        self.xostack.pop()&lt;br /&gt;
    def start_ul(self,attrs):&lt;br /&gt;
        self.pushStruct([])&lt;br /&gt;
    def end_ul(self):&lt;br /&gt;
        self.xostack.pop()&lt;br /&gt;
    def start_li(self,attrs):&lt;br /&gt;
        self.textstack.append('')&lt;br /&gt;
    def end_li(self):&lt;br /&gt;
        val = self.textstack.pop()&lt;br /&gt;
        while ( self.structs[-1] != self.xostack[-1]):&lt;br /&gt;
            val = self.structs.pop()&lt;br /&gt;
            self.xostack[-1].append(val)&lt;br /&gt;
        if type(val) == type(' ') or type(val) == type(u' '):&lt;br /&gt;
            self.xostack[-1].append(val)&lt;br /&gt;
    def start_dt(self,attrs):&lt;br /&gt;
        self.textstack.append('')&lt;br /&gt;
    def end_dt(self):&lt;br /&gt;
        pass&lt;br /&gt;
    def start_dd(self,attrs):&lt;br /&gt;
        self.textstack.append('')&lt;br /&gt;
    def end_dd(self):&lt;br /&gt;
        val = self.textstack.pop()&lt;br /&gt;
        key = self.textstack.pop()&lt;br /&gt;
        if self.structs[-1] != self.xostack[-1]:&lt;br /&gt;
            val = self.structs.pop()&lt;br /&gt;
        self.xostack[-1][key]=val&lt;br /&gt;
    def handleUnicodeData(self, text):&lt;br /&gt;
        if len(self.stack) and containerTags.get(self.stack[-1],True): #skip text not within an element&lt;br /&gt;
            self.textstack[-1] += text&lt;br /&gt;
def toXOXO(struct,addHTMLWrapper=False,cssUrl=''):&lt;br /&gt;
    if type(struct) ==type((1,))or type(struct) ==type([1,]):&lt;br /&gt;
        inStruct = struct&lt;br /&gt;
    else:&lt;br /&gt;
        inStruct = [struct]&lt;br /&gt;
    if addHTMLWrapper:&lt;br /&gt;
        s= u'''&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&lt;br /&gt;
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;head profile=&amp;quot;&amp;quot;&amp;gt;&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;'''&lt;br /&gt;
        if cssUrl:&lt;br /&gt;
            s+=u'&amp;lt;style type=&amp;quot;text/css&amp;quot; &amp;gt;@import &amp;quot;%s&amp;quot;;&amp;lt;/style&amp;gt;' % cssUrl&lt;br /&gt;
        s+=u&amp;quot;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;%s&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot; % makeXOXO(inStruct,'xoxo')&lt;br /&gt;
        return s.encode('utf-8')&lt;br /&gt;
    else:&lt;br /&gt;
        return makeXOXO(inStruct,'xoxo').encode('utf-8')&lt;br /&gt;
    &lt;br /&gt;
def fromXOXO(html):&lt;br /&gt;
    parser = xoxoParser()&lt;br /&gt;
    #parser.feed(unicode(html,'utf-8'))&lt;br /&gt;
    parser.feed(html)&lt;br /&gt;
    #print parser.structs&lt;br /&gt;
    structs=[struct for struct in parser.structs if struct]&lt;br /&gt;
    #print structs&lt;br /&gt;
    while (len(structs) ==1 and type(structs)==type([1,])):&lt;br /&gt;
        structs=structs[0]&lt;br /&gt;
    return structs&lt;br /&gt;
&lt;br /&gt;
# Allow direct invocation&lt;br /&gt;
# Read HTML from URL, parse into data structures, then re-output&lt;br /&gt;
&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
  if len(sys.argv) &amp;lt; 2: raise SystemExit(&amp;quot;Usage: &amp;quot;+sys.argv[0]+&amp;quot; url\n&amp;quot;+__doc__)&lt;br /&gt;
  url=sys.argv[1]&lt;br /&gt;
  file = urllib.urlopen(url)&lt;br /&gt;
  html=file.read(-1)&lt;br /&gt;
  file.close&lt;br /&gt;
  s=fromXOXO(html)&lt;br /&gt;
  p=toXOXO(s,True)&lt;br /&gt;
  print p&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== testxoxo.py  ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;testxoxo.py &lt;br /&gt;
Unit tests for xoxo.py&lt;br /&gt;
This file tests the functions in xoxo.py &lt;br /&gt;
The underlying model here is http://diveintopython.org/unit_testing/index.html &lt;br /&gt;
&lt;br /&gt;
run from command line with&lt;br /&gt;
python testxoxo.py -v&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
import xoxo&lt;br /&gt;
reload(xoxo)&lt;br /&gt;
import unittest&lt;br /&gt;
&lt;br /&gt;
class xoxoTestCases(unittest.TestCase):&lt;br /&gt;
    &lt;br /&gt;
    def testSimpleList(self):&lt;br /&gt;
        '''make a xoxo file from a list'''&lt;br /&gt;
        l = ['1','2','3']&lt;br /&gt;
        html = xoxo.toXOXO(l)&lt;br /&gt;
        self.assertEqual(html,'&amp;lt;ol class=&amp;quot;xoxo&amp;quot;&amp;gt;&amp;lt;li&amp;gt;1&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;2&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;3&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;')&lt;br /&gt;
    def testNestedList(self):&lt;br /&gt;
        '''make a xoxo file from a list with a list in'''&lt;br /&gt;
        l = ['1',['2','3']]&lt;br /&gt;
        html = xoxo.toXOXO(l)&lt;br /&gt;
        self.assertEqual(html,'&amp;lt;ol class=&amp;quot;xoxo&amp;quot;&amp;gt;&amp;lt;li&amp;gt;1&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;2&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;3&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;')&lt;br /&gt;
&lt;br /&gt;
    def testDictionary(self):&lt;br /&gt;
        '''make a xoxo file from a dictionary'''&lt;br /&gt;
        d = {'test':'1','name':'Kevin'}&lt;br /&gt;
        html = xoxo.toXOXO(d)&lt;br /&gt;
        self.assertEqual(html,'&amp;lt;ol class=&amp;quot;xoxo&amp;quot;&amp;gt;&amp;lt;li&amp;gt;&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;test&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;1&amp;lt;/dd&amp;gt;&amp;lt;dt&amp;gt;name&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;Kevin&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;')&lt;br /&gt;
&lt;br /&gt;
    def testSingleItem(self):&lt;br /&gt;
        '''make a xoxo file from a string'''&lt;br /&gt;
        l = &amp;quot;test&amp;quot;&lt;br /&gt;
        html = xoxo.toXOXO(l)&lt;br /&gt;
        self.assertEqual(html,'&amp;lt;ol class=&amp;quot;xoxo&amp;quot;&amp;gt;&amp;lt;li&amp;gt;test&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;')&lt;br /&gt;
&lt;br /&gt;
    def testWrapDiffers(self):&lt;br /&gt;
        '''make a xoxo file from a string with and without html wrapper and check they are different'''&lt;br /&gt;
        l = &amp;quot;test&amp;quot;&lt;br /&gt;
        html = xoxo.toXOXO(l)&lt;br /&gt;
        htmlwrap =  xoxo.toXOXO(l,addHTMLWrapper=True)&lt;br /&gt;
        self.failIfEqual(html,htmlwrap)&lt;br /&gt;
&lt;br /&gt;
    def testWrapSingleItem(self):&lt;br /&gt;
        '''make a wrapped xoxo file from a string'''&lt;br /&gt;
        l = &amp;quot;test&amp;quot;&lt;br /&gt;
        html = xoxo.toXOXO(l,addHTMLWrapper=True)&lt;br /&gt;
        self.assertEqual(html,'''&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&lt;br /&gt;
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;head profile=&amp;quot;&amp;quot;&amp;gt;&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;ol class=&amp;quot;xoxo&amp;quot;&amp;gt;&amp;lt;li&amp;gt;test&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;''')&lt;br /&gt;
&lt;br /&gt;
    def testWrapItemWithCSS(self):&lt;br /&gt;
        '''make a wrapped xoxo file from a string'''&lt;br /&gt;
        l = &amp;quot;test&amp;quot;&lt;br /&gt;
        html = xoxo.toXOXO(l,addHTMLWrapper=True,cssUrl='reaptest.css')&lt;br /&gt;
        self.assertEqual(html,'''&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&lt;br /&gt;
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;head profile=&amp;quot;&amp;quot;&amp;gt;&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&amp;lt;style type=&amp;quot;text/css&amp;quot; &amp;gt;@import &amp;quot;reaptest.css&amp;quot;;&amp;lt;/style&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;ol class=&amp;quot;xoxo&amp;quot;&amp;gt;&amp;lt;li&amp;gt;test&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;''')&lt;br /&gt;
&lt;br /&gt;
    def testDictionaryRoundTrip(self):&lt;br /&gt;
        ''' make a dictionary into a xoxo file and back again; check it is the same'''&lt;br /&gt;
        d = {'test':'1','name':'Kevin'}&lt;br /&gt;
        html = xoxo.toXOXO(d)&lt;br /&gt;
        newd = xoxo.fromXOXO(html)&lt;br /&gt;
        self.assertEqual(d,newd)&lt;br /&gt;
        &lt;br /&gt;
    def testDictionaryWithURLRoundTrip(self):&lt;br /&gt;
        ''' make a dictionary wiht an url in into a xoxo file and back again; check it is the same'''&lt;br /&gt;
        d = {'url':'http://example.com','name':'Kevin'}&lt;br /&gt;
        html = xoxo.toXOXO(d)&lt;br /&gt;
        newd = xoxo.fromXOXO(html)&lt;br /&gt;
        self.assertEqual(d,newd)    &lt;br /&gt;
    def testNestedDictionaryRoundTrip(self):&lt;br /&gt;
        ''' make a dictionary with a dict in into a xoxo file and back again; check it is the same'''&lt;br /&gt;
        d = {'test':'1','inner':{'name':'Kevin'}}&lt;br /&gt;
        html = xoxo.toXOXO(d)&lt;br /&gt;
        newd = xoxo.fromXOXO(html)&lt;br /&gt;
        self.assertEqual(d,newd)&lt;br /&gt;
    def testNestedDictionaryWithURLRoundTrip(self):&lt;br /&gt;
        ''' make a dictionary with an url and a dict into a xoxo file and back again; check it is the same'''&lt;br /&gt;
        d = {'url':'http://example.com','inner':{'name':'Kevin'}}&lt;br /&gt;
        html = xoxo.toXOXO(d)&lt;br /&gt;
        newd = xoxo.fromXOXO(html)&lt;br /&gt;
        self.assertEqual(d,newd)&lt;br /&gt;
    def testNestedDictionariesWithURLsRoundTrip(self):&lt;br /&gt;
        ''' make a dictionary with an url and a dict with an url into a xoxo file and back again; check it is the same'''&lt;br /&gt;
        d = {'url':'http://example.com','inner':{'name':'Kevin','url':'http://slashdot.org'}}&lt;br /&gt;
        html = xoxo.toXOXO(d)&lt;br /&gt;
        newd = xoxo.fromXOXO(html)&lt;br /&gt;
        self.assertEqual(d,newd)&lt;br /&gt;
    def testListRoundTrip(self):&lt;br /&gt;
        ''' make a list into a xoxo file and back again; check it is the same'''&lt;br /&gt;
        l = ['3','2','1']&lt;br /&gt;
        html = xoxo.toXOXO(l)&lt;br /&gt;
        newdl= xoxo.fromXOXO(html)&lt;br /&gt;
        self.assertEqual(l,newdl)&lt;br /&gt;
    def testListofDictsRoundTrip(self):&lt;br /&gt;
        ''' make a list of Dicts into a xoxo file and back again; check it is the same'''&lt;br /&gt;
        l = ['3',{'a':'2'},{'b':'1','c':'4'}]&lt;br /&gt;
        html = xoxo.toXOXO(l)&lt;br /&gt;
        newdl= xoxo.fromXOXO(html)&lt;br /&gt;
        self.assertEqual(l,newdl)&lt;br /&gt;
    def testListofListsRoundTrip(self):&lt;br /&gt;
        ''' make a list of Lists into a xoxo file and back again; check it is the same'''&lt;br /&gt;
        l = ['3',['a','2'],['b',['1',['c','4']]]]&lt;br /&gt;
        html = xoxo.toXOXO(l)&lt;br /&gt;
        newdl= xoxo.fromXOXO(html)&lt;br /&gt;
        self.assertEqual(l,newdl)&lt;br /&gt;
    def testDictofListsRoundTrip(self):&lt;br /&gt;
        ''' make a dict with lists in into a xoxo file and back again; check it is the same'''&lt;br /&gt;
        d = {'test':['1','2'],&lt;br /&gt;
        'name':'Kevin',&lt;br /&gt;
        'nestlist':['a',['b','c']],&lt;br /&gt;
        'nestdict':{'e':'6','f':'7'}}&lt;br /&gt;
        html = xoxo.toXOXO(d)&lt;br /&gt;
        newd = xoxo.fromXOXO(html)&lt;br /&gt;
        self.assertEqual(d,newd)&lt;br /&gt;
&lt;br /&gt;
    def testXOXOjunkInContainers(self):&lt;br /&gt;
        '''make sure text outside &amp;lt;li&amp;gt; etc is ignored'''&lt;br /&gt;
        d=xoxo.fromXOXO('&amp;lt;ol&amp;gt;bad&amp;lt;li&amp;gt;&amp;lt;dl&amp;gt;worse&amp;lt;dt&amp;gt;good&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;buy&amp;lt;/dd&amp;gt; now&amp;lt;/dl&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;')&lt;br /&gt;
        self.assertEqual(d,{'good': 'buy'})&lt;br /&gt;
&lt;br /&gt;
    def testXOXOjunkInElements(self):&lt;br /&gt;
        '''make sure text within &amp;lt;li&amp;gt; but outside a subcontainer is ignored'''&lt;br /&gt;
        l=xoxo.fromXOXO('&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;bad&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;good&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;buy&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;worse&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;bag&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;OK&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;fish&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;')&lt;br /&gt;
        self.assertEqual(l,[{'good': 'buy'},['OK']])&lt;br /&gt;
&lt;br /&gt;
    def testXOXOWithSpacesAndNewlines(self):&lt;br /&gt;
        '''unmung some xoxo with spaces in and check result is right'''&lt;br /&gt;
        xoxoSample= '''&amp;lt;ol class='xoxo'&amp;gt; &lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;dl&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;text&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;item 1&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;description&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt; This item represents the main point we're trying to make.&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;url&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;http://example.com/more.xoxo&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;title&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;title of item 1&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;type&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;text/xml&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;rel&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;help&amp;lt;/dd&amp;gt;&lt;br /&gt;
    &amp;lt;/dl&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;'''&lt;br /&gt;
        d = xoxo.fromXOXO(xoxoSample)&lt;br /&gt;
        d2={'text':'item 1',&lt;br /&gt;
            'description':&amp;quot; This item represents the main point we're trying to make.&amp;quot;,&lt;br /&gt;
            'url':'http://example.com/more.xoxo',&lt;br /&gt;
            'title':'title of item 1',&lt;br /&gt;
            'type':'text/xml',&lt;br /&gt;
            'rel':'help'&lt;br /&gt;
            }&lt;br /&gt;
        xoxoAgain = xoxo.toXOXO(d)&lt;br /&gt;
        self.assertEqual(d,d2)&lt;br /&gt;
        #this needs a smarter whitespace-sensitive comparison&lt;br /&gt;
        #self.assertEqual(xoxoSample,xoxoAgain)&lt;br /&gt;
&lt;br /&gt;
    def testSpecialAttributeDecoding(self):&lt;br /&gt;
        '''unmung some xoxo with &amp;lt;a href=' rel= etc in and check result is right'''&lt;br /&gt;
        xoxoSample= '''&amp;lt;ol class='xoxo'&amp;gt; &lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;dl&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;text&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;item 1&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;url&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;http://example.com/more.xoxo&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;title&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;title of item 1&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;type&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;text/xml&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;rel&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;help&amp;lt;/dd&amp;gt;&lt;br /&gt;
    &amp;lt;/dl&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;'''&lt;br /&gt;
        d = xoxo.fromXOXO(xoxoSample)&lt;br /&gt;
        smartxoxoSample= '''&amp;lt;ol class='xoxo'&amp;gt; &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://example.com/more.xoxo&amp;quot;&lt;br /&gt;
         title=&amp;quot;title of item 1&amp;quot;&lt;br /&gt;
         type=&amp;quot;text/xml&amp;quot;&lt;br /&gt;
         rel=&amp;quot;help&amp;quot;&amp;gt;item 1&amp;lt;/a&amp;gt; &lt;br /&gt;
&amp;lt;!-- note how the &amp;quot;text&amp;quot; property is simply the contents of the &amp;lt;a&amp;gt; element --&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;'''&lt;br /&gt;
        d2 = xoxo.fromXOXO(smartxoxoSample)&lt;br /&gt;
        self.assertEqual(d,d2)&lt;br /&gt;
    def testSpecialAttributeAndDLDecoding(self):&lt;br /&gt;
        '''unmung some xoxo with &amp;lt;a href=' rel= etc in plus a &amp;lt;dl&amp;gt; in the same item and check result is right'''&lt;br /&gt;
        xoxoSample= '''&amp;lt;ol class=&amp;quot;xoxo&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;li&amp;gt;&lt;br /&gt;
    &amp;lt;dl&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;text&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;item 1&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;description&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt; This item represents the main point we're trying to make.&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;url&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;http://example.com/more.xoxo&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;title&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;title of item 1&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;type&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;text/xml&amp;lt;/dd&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;rel&amp;lt;/dt&amp;gt;&lt;br /&gt;
        &amp;lt;dd&amp;gt;help&amp;lt;/dd&amp;gt;&lt;br /&gt;
    &amp;lt;/dl&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;'''&lt;br /&gt;
        d = xoxo.fromXOXO(xoxoSample)&lt;br /&gt;
        smartxoxoSample= '''&amp;lt;ol class=&amp;quot;xoxo&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://example.com/more.xoxo&amp;quot;&lt;br /&gt;
         title=&amp;quot;title of item 1&amp;quot;&lt;br /&gt;
         type=&amp;quot;text/xml&amp;quot;&lt;br /&gt;
         rel=&amp;quot;help&amp;quot;&amp;gt;item 1&amp;lt;/a&amp;gt; &lt;br /&gt;
&amp;lt;!-- note how the &amp;quot;text&amp;quot; property is simply the contents of the &amp;lt;a&amp;gt; element --&amp;gt;&lt;br /&gt;
      &amp;lt;dl&amp;gt;&lt;br /&gt;
        &amp;lt;dt&amp;gt;description&amp;lt;/dt&amp;gt;&lt;br /&gt;
          &amp;lt;dd&amp;gt; This item represents the main point we're trying to make.&amp;lt;/dd&amp;gt;&lt;br /&gt;
      &amp;lt;/dl&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;'''&lt;br /&gt;
        d2 = xoxo.fromXOXO(smartxoxoSample)&lt;br /&gt;
        self.assertEqual(d,d2)&lt;br /&gt;
    def testSpecialAttributeEncode(self):&lt;br /&gt;
        '''check it makes an &amp;lt;a href with a url parameter'''&lt;br /&gt;
        d={'url':'http://example.com/more.xoxo','title':'sample url','type':&amp;quot;text/xml&amp;quot;,'rel':'help','text':'an example'}&lt;br /&gt;
        html=xoxo.toXOXO(d)&lt;br /&gt;
        expectedHTML= '&amp;lt;ol class=&amp;quot;xoxo&amp;quot;&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://example.com/more.xoxo&amp;quot; title=&amp;quot;sample url&amp;quot; rel=&amp;quot;help&amp;quot; type=&amp;quot;text/xml&amp;quot; &amp;gt;an example&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;' &lt;br /&gt;
        self.assertEqual(html,expectedHTML)&lt;br /&gt;
        &lt;br /&gt;
    def testSpecialAttributeRoundTripFull(self):&lt;br /&gt;
        '''check it makes an &amp;lt;a href with a url parameter'''&lt;br /&gt;
        d={'url':'http://example.com/more.xoxo','title':'sample url','type':&amp;quot;text/xml&amp;quot;,'rel':'help','text':'an example'}&lt;br /&gt;
        html=xoxo.toXOXO(d)&lt;br /&gt;
        self.assertEqual(d,xoxo.fromXOXO(html))&lt;br /&gt;
    def testSpecialAttributeRoundTripNoText(self):&lt;br /&gt;
        '''check it makes an &amp;lt;a href with a url parameter and no text attribute'''&lt;br /&gt;
        d={'url':'http://example.com/more.xoxo','title':'sample url','type':&amp;quot;text/xml&amp;quot;,'rel':'help'}&lt;br /&gt;
        html=xoxo.toXOXO(d)&lt;br /&gt;
        self.assertEqual(d,xoxo.fromXOXO(html))&lt;br /&gt;
    def testSpecialAttributeRoundTripNoTextOrTitle(self):&lt;br /&gt;
        '''check it makes an &amp;lt;a href with a url parameter and no text or title attribute'''&lt;br /&gt;
        d={'url':'http://example.com/more.xoxo'}&lt;br /&gt;
        html=xoxo.toXOXO(d)&lt;br /&gt;
        self.assertEqual(d,xoxo.fromXOXO(html))&lt;br /&gt;
    def testAttentionRoundTrip(self):&lt;br /&gt;
        '''check nested &amp;lt;a&amp;gt; and &amp;lt;dl&amp;gt; and &amp;lt;a&amp;gt; are preserved'''&lt;br /&gt;
        kmattn='''&amp;lt;ol class=&amp;quot;xoxo&amp;quot;&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://www.boingboing.net/&amp;quot; title=&amp;quot;Boing Boing Blog&amp;quot; &amp;gt;Boing Boing Blog&amp;lt;/a&amp;gt;&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;alturls&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://boingboing.net/rss.xml&amp;quot; &amp;gt;xmlurl&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&amp;lt;/dd&amp;gt;&amp;lt;dt&amp;gt;description&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;Boing Boing Blog&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://www.financialcryptography.com/&amp;quot; title=&amp;quot;Financial Cryptography&amp;quot; &amp;gt;Financial Cryptography&amp;lt;/a&amp;gt;&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;alturls&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://www.financialcryptography.com/mt/index.rdf&amp;quot; &amp;gt;xmlurl&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&amp;lt;/dd&amp;gt;&amp;lt;dt&amp;gt;description&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;Financial Cryptography&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://hublog.hubmed.org/&amp;quot; title=&amp;quot;HubLog&amp;quot; &amp;gt;HubLog&amp;lt;/a&amp;gt;&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;alturls&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://hublog.hubmed.org/index.xml&amp;quot; &amp;gt;xmlurl&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://hublog.hubmed.org/foaf.rdf&amp;quot; &amp;gt;foafurl&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&amp;lt;/dd&amp;gt;&amp;lt;dt&amp;gt;description&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;HubLog&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;''';&lt;br /&gt;
        d = xoxo.fromXOXO(kmattn)&lt;br /&gt;
        newattn = xoxo.toXOXO(d)&lt;br /&gt;
        d2 = xoxo.fromXOXO(newattn)&lt;br /&gt;
        self.assertEqual(newattn,xoxo.toXOXO(d2))&lt;br /&gt;
        self.assertEqual(d,d2)&lt;br /&gt;
        self.assertEqual(kmattn,newattn)&lt;br /&gt;
        &lt;br /&gt;
    def testUnicodeRoundtrip(self):&lt;br /&gt;
        '''check unicode characters can go to xoxo and back'''&lt;br /&gt;
        src=unicode('Tantek \xc3\x87elik and a snowman \xe2\x98\x83','utf-8')&lt;br /&gt;
        html = xoxo.toXOXO(src)&lt;br /&gt;
        self.assertEqual(src,xoxo.fromXOXO(html))&lt;br /&gt;
    def testUtf8Roundtrip(self):&lt;br /&gt;
        '''check utf8 characters can go to xoxo and back'''&lt;br /&gt;
        src='Tantek \xc3\x87elik and a snowman \xe2\x98\x83'&lt;br /&gt;
        html = xoxo.toXOXO(src)&lt;br /&gt;
        self.assertEqual(src,xoxo.fromXOXO(html).encode('utf-8'))&lt;br /&gt;
    def testWindows1252Roundtrip(self):&lt;br /&gt;
        '''check 1252 characters can go to xoxo and back'''&lt;br /&gt;
        src='This is an evil\xa0space'&lt;br /&gt;
        html = xoxo.toXOXO(src)&lt;br /&gt;
        self.assertEqual(src,xoxo.fromXOXO(html).encode('windows-1252'))&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    unittest.main()&lt;br /&gt;
else:&lt;br /&gt;
    runner = unittest.TextTestRunner()&lt;br /&gt;
    suite = unittest.makeSuite(xoxoTestCases,'test')&lt;br /&gt;
    runner.run(suite)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>BasgeTorde</name></author>
	</entry>
</feed>