<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://microformats.org/wiki/index.php?action=history&amp;feed=atom&amp;title=xoxo-sample-code-php</id>
	<title>xoxo-sample-code-php - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://microformats.org/wiki/index.php?action=history&amp;feed=atom&amp;title=xoxo-sample-code-php"/>
	<link rel="alternate" type="text/html" href="https://microformats.org/wiki/index.php?title=xoxo-sample-code-php&amp;action=history"/>
	<updated>2026-05-17T17:31:06Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://microformats.org/wiki/index.php?title=xoxo-sample-code-php&amp;diff=31272&amp;oldid=prev</id>
		<title>AndyMabbett at 13:20, 16 January 2008</title>
		<link rel="alternate" type="text/html" href="https://microformats.org/wiki/index.php?title=xoxo-sample-code-php&amp;diff=31272&amp;oldid=prev"/>
		<updated>2008-01-16T13:20:07Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
= XOXO Sample Code - PHP =&lt;br /&gt;
:'''this is  sub-page of [[xoxo-sample-code]]'''&lt;br /&gt;
&lt;br /&gt;
== xoxolib.php ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;?&lt;br /&gt;
function getKind($struct)&lt;br /&gt;
{&lt;br /&gt;
    if (!is_array($struct)) return 'string';&lt;br /&gt;
    if (!isset($struct[0]))&lt;br /&gt;
        $result = 'dictionary';&lt;br /&gt;
    else if (array_keys($struct)==range(0,count($struct)-1))&lt;br /&gt;
        $result = 'list';&lt;br /&gt;
    else&lt;br /&gt;
        $result = 'dictionary';&lt;br /&gt;
    return $result;&lt;br /&gt;
}&lt;br /&gt;
function makeXOXO($struct,$className='')&lt;br /&gt;
{&lt;br /&gt;
    $s='';&lt;br /&gt;
    $kind = getKind($struct);&lt;br /&gt;
    #echo &amp;quot;$kind:\n&amp;quot;;&lt;br /&gt;
    #var_dump($struct);&lt;br /&gt;
    if ($kind=='list')&lt;br /&gt;
        {&lt;br /&gt;
        if ($className)&lt;br /&gt;
            $s .= &amp;quot;&amp;lt;ol class=\&amp;quot;$className\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
        else &lt;br /&gt;
            $s .= &amp;quot;&amp;lt;ol&amp;gt;&amp;quot;;&lt;br /&gt;
        foreach ($struct as $key =&amp;gt; $value)&lt;br /&gt;
            $s .= &amp;quot;&amp;lt;li&amp;gt;&amp;quot; . makeXOXO($value) .&amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
        $s .=&amp;quot;&amp;lt;/ol&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    else if ($kind=='dictionary')&lt;br /&gt;
        {&lt;br /&gt;
        if (isset($struct['url']))&lt;br /&gt;
            {&lt;br /&gt;
            $s .='&amp;lt;a href=&amp;quot;' .$struct['url']. '&amp;quot; ';&lt;br /&gt;
            if (isset($struct['text']))&lt;br /&gt;
                $text= $struct['text'];&lt;br /&gt;
            else if (isset($struct['title']))&lt;br /&gt;
                $text= $struct['title'];&lt;br /&gt;
            else&lt;br /&gt;
                $text= $struct['url'];&lt;br /&gt;
            foreach (array('title','rel','type') as $attr)&lt;br /&gt;
                if (isset($struct[$attr]))&lt;br /&gt;
                    {&lt;br /&gt;
                    $s .= &amp;quot;$attr=\&amp;quot;&amp;quot; . $struct[$attr] .'&amp;quot; ';&lt;br /&gt;
                    unset($struct[$attr]);&lt;br /&gt;
                    }&lt;br /&gt;
            $s .= &amp;quot;&amp;gt;&amp;quot; . makeXOXO($text) .&amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
            unset($struct['url'],$struct['text']);&lt;br /&gt;
            }&lt;br /&gt;
        if (count($struct))&lt;br /&gt;
            {&lt;br /&gt;
            $s .=&amp;quot;&amp;lt;dl&amp;gt;&amp;quot;;&lt;br /&gt;
            foreach ($struct as $key =&amp;gt; $value)&lt;br /&gt;
                $s .= &amp;quot;&amp;lt;dt&amp;gt;$key&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;&amp;quot;. makeXOXO($value) . &amp;quot;&amp;lt;/dd&amp;gt;&amp;quot;;&lt;br /&gt;
            $s .= &amp;quot;&amp;lt;/dl&amp;gt;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    else&lt;br /&gt;
        $s .= &amp;quot;$struct&amp;quot;;&lt;br /&gt;
    #echo &amp;quot;returned $s\n&amp;quot;;&lt;br /&gt;
    return $s;&lt;br /&gt;
}&lt;br /&gt;
function toXOXO($struct,$addHTMLWrapper=FALSE,$cssUrl='')&lt;br /&gt;
{&lt;br /&gt;
    if (getKind($struct) != 'list')&lt;br /&gt;
        $struct = array($struct);&lt;br /&gt;
    $xoxo = makeXOXO($struct,'xoxo');&lt;br /&gt;
    if ($addHTMLWrapper)&lt;br /&gt;
        {&lt;br /&gt;
        $s= '&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;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) $s .=&amp;quot;&amp;lt;style type=\&amp;quot;text/css\&amp;quot; &amp;gt;@import \&amp;quot;$cssUrl\&amp;quot;;&amp;lt;/style&amp;gt;&amp;quot;;&lt;br /&gt;
        $s .=&amp;quot;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;$xoxo&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
        return $s;&lt;br /&gt;
        }&lt;br /&gt;
    return $xoxo;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function pushStruct($struct,&amp;amp;$structstack,&amp;amp;$xostack,$structType)&lt;br /&gt;
{&lt;br /&gt;
    if (is_array($struct) &amp;amp;&amp;amp; $structType=='dict' &amp;amp;&amp;amp; count($structstack) &amp;amp;&amp;amp; is_array(end($structstack)) &amp;amp;&amp;amp; isset($structstack[count($structstack)-1]['url']) &amp;amp;&amp;amp; end($structstack) != end($xostack))&lt;br /&gt;
        $xostack[] = &amp;amp;$structstack[count($structstack)-1]; # put back the &amp;lt;a&amp;gt;-made one for extra def's&lt;br /&gt;
    else&lt;br /&gt;
        {&lt;br /&gt;
        $structstack[]=$struct;&lt;br /&gt;
        $xostack[]=&amp;amp;$structstack[count($structstack)-1];&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function fromXOXO($html)&lt;br /&gt;
{&lt;br /&gt;
    $structs=array();&lt;br /&gt;
    $xostack=array();&lt;br /&gt;
    $textstack=array('');&lt;br /&gt;
    $dumpStacks=0;&lt;br /&gt;
    $p = xml_parser_create();&lt;br /&gt;
    xml_parse_into_struct($p, $html, $xoxoVals, $xoxoIndex);&lt;br /&gt;
    xml_parser_free($p);&lt;br /&gt;
&lt;br /&gt;
  if($dumpStacks)&lt;br /&gt;
        {&lt;br /&gt;
        echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        var_dump($xoxoVals);&lt;br /&gt;
        var_dump($xoxoIndex);&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;; &lt;br /&gt;
        }&lt;br /&gt;
    $howmany = sizeof($xoxoVals);&lt;br /&gt;
    &lt;br /&gt;
    #echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    $x = $xoxoIndex['OL'];&lt;br /&gt;
    for ($x=0;$x&amp;lt;$howmany;++$x)&lt;br /&gt;
        {&lt;br /&gt;
        if ($xoxoVals[$x]['tag'] == 'OL' || $xoxoVals[$x]['tag'] == 'DL'|| $xoxoVals[$x]['tag'] == 'UL')&lt;br /&gt;
            {&lt;br /&gt;
            if ($xoxoVals[$x]['tag'] == 'DL')&lt;br /&gt;
                $structType = 'dict';&lt;br /&gt;
            else &lt;br /&gt;
                $structType = 'list';&lt;br /&gt;
            if ($xoxoVals[$x]['type'] == 'open')&lt;br /&gt;
                pushStruct(array(),$structs,$xostack,$structType);&lt;br /&gt;
            if ($xoxoVals[$x]['type'] == 'close')&lt;br /&gt;
                array_pop($xostack);&lt;br /&gt;
            if($dumpStacks)&lt;br /&gt;
                {&lt;br /&gt;
                echo $xoxoVals[$x]['type'] .' ' . $xoxoVals[$x]['tag'] .&amp;quot;:\n&amp;quot;;&lt;br /&gt;
                var_dump($structs);&lt;br /&gt;
                var_dump($xostack);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        if ($xoxoVals[$x]['tag'] == 'LI')&lt;br /&gt;
            {&lt;br /&gt;
            if ($xoxoVals[$x]['type'] == 'complete')&lt;br /&gt;
               array_push($xostack[count($xostack)-1],$xoxoVals[$x]['value']);&lt;br /&gt;
            if ($xoxoVals[$x]['type'] == 'close')&lt;br /&gt;
                {&lt;br /&gt;
                array_push($xostack[count($xostack)-1],array_pop($structs));&lt;br /&gt;
                }&lt;br /&gt;
            if($dumpStacks)&lt;br /&gt;
                {&lt;br /&gt;
                echo $xoxoVals[$x]['type'] .' ' . $xoxoVals[$x]['tag'] .&amp;quot;:\n&amp;quot;;&lt;br /&gt;
                var_dump($structs);&lt;br /&gt;
                var_dump($xostack);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        if ($xoxoVals[$x]['tag'] == 'DT')&lt;br /&gt;
            {&lt;br /&gt;
            if ($xoxoVals[$x]['type'] == 'complete')&lt;br /&gt;
                array_push($textstack,$xoxoVals[$x]['value']);&lt;br /&gt;
            }&lt;br /&gt;
        if ($xoxoVals[$x]['tag'] == 'DD')&lt;br /&gt;
            {&lt;br /&gt;
            if ($xoxoVals[$x]['type'] == 'complete')&lt;br /&gt;
                {&lt;br /&gt;
                $key = array_pop($textstack);&lt;br /&gt;
                $xostack[count($xostack)-1][$key] = $xoxoVals[$x]['value'];&lt;br /&gt;
                }&lt;br /&gt;
            if ($xoxoVals[$x]['type'] == 'close')&lt;br /&gt;
                {&lt;br /&gt;
                $key = array_pop($textstack);&lt;br /&gt;
                $xostack[count($xostack)-1][$key] =array_pop($structs);&lt;br /&gt;
                }&lt;br /&gt;
          if($dumpStacks)&lt;br /&gt;
                {&lt;br /&gt;
                echo $xoxoVals[$x]['type'] .' ' . $xoxoVals[$x]['tag'] .&amp;quot;:\n&amp;quot;;&lt;br /&gt;
                var_dump($structs);&lt;br /&gt;
                var_dump($xostack);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        if ($xoxoVals[$x]['tag'] == 'A')&lt;br /&gt;
            {&lt;br /&gt;
            if ($xoxoVals[$x]['type'] == 'complete')&lt;br /&gt;
                {&lt;br /&gt;
                $attrs = $xoxoVals[$x]['attributes'];&lt;br /&gt;
                $dict=array();&lt;br /&gt;
                foreach ($attrs as $key=&amp;gt; $value)&lt;br /&gt;
                    {&lt;br /&gt;
                    if ($key=='HREF')&lt;br /&gt;
                        $dict['url'] = $value;&lt;br /&gt;
                    else&lt;br /&gt;
                        $dict[strtolower($key)] = $value;&lt;br /&gt;
                    }&lt;br /&gt;
                $val = $xoxoVals[$x]['value'];&lt;br /&gt;
                if (isset($val) &amp;amp;&amp;amp; ($val != $dict['title']) &amp;amp;&amp;amp; ($val != $dict['url']))&lt;br /&gt;
                    $dict['text'] = $val;&lt;br /&gt;
                pushStruct($dict,$structs,$xostack,'dict');&lt;br /&gt;
                array_pop($xostack);&lt;br /&gt;
 &lt;br /&gt;
                if($dumpStacks)&lt;br /&gt;
                    {&lt;br /&gt;
                    echo $xoxoVals[$x]['type'] .' ' . $xoxoVals[$x]['tag'] .&amp;quot;:\n&amp;quot;;&lt;br /&gt;
                    var_dump($structs);&lt;br /&gt;
                    var_dump($xostack);&lt;br /&gt;
                    }&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
     #echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
   while (count($structs) == 1 &amp;amp;&amp;amp; getKind($structs) == 'list')&lt;br /&gt;
        $structs = $structs[0];&lt;br /&gt;
    return $structs;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== xoxotest.php ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;?&lt;br /&gt;
include(&amp;quot;xoxolib.php&amp;quot;);&lt;br /&gt;
function assertEqual($testname,$str1,$str2)&lt;br /&gt;
{&lt;br /&gt;
if ($str1 == $str2)&lt;br /&gt;
    echo &amp;quot;&amp;lt;h3&amp;gt;&amp;amp;#x221a; $testname &amp;lt;/h3&amp;gt;&amp;quot;;&lt;br /&gt;
else &lt;br /&gt;
    {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h3&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#x2639;&amp;lt;/big&amp;gt; $testname failed&amp;lt;/h3&amp;gt;&amp;quot;;&lt;br /&gt;
    echo &amp;quot;&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;expected&amp;lt;/dt&amp;gt;\n&amp;lt;dd&amp;gt;$str1&amp;lt;/dd&amp;gt;\n&amp;lt;dt&amp;gt;returned&amp;lt;/dt&amp;gt;\n&amp;lt;dd&amp;gt;$str2&amp;lt;/dd&amp;gt;\n&amp;lt;dl&amp;gt;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function assertArrayEqual($testname,$expected,$returned)&lt;br /&gt;
{&lt;br /&gt;
if ($expected == $returned)&lt;br /&gt;
    echo &amp;quot;&amp;lt;h3&amp;gt;&amp;amp;#x221a; $testname &amp;lt;/h3&amp;gt;&amp;quot;;&lt;br /&gt;
else &lt;br /&gt;
    {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h3&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#x2639;&amp;lt;/big&amp;gt; $testname failed&amp;lt;/h3&amp;gt;&amp;quot;;&lt;br /&gt;
    echo &amp;quot;&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;expected&amp;lt;/dt&amp;gt;\n&amp;lt;dd&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    var_dump($expected);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;lt;/dd&amp;gt;\n&amp;lt;dt&amp;gt;returned&amp;lt;/dt&amp;gt;\n&amp;lt;dd&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    var_dump($returned);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;lt;/dd&amp;gt;\n&amp;lt;dl&amp;gt;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function failIfEqual($testname,$str1,$str2)&lt;br /&gt;
{&lt;br /&gt;
if ($str1 != $str2)&lt;br /&gt;
    echo &amp;quot;&amp;lt;h3&amp;gt;&amp;amp;#x221a; $testname&amp;lt;/h3&amp;gt;&amp;quot;;&lt;br /&gt;
else &lt;br /&gt;
    {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h3&amp;gt;&amp;lt;big&amp;gt;&amp;amp;#x2639;&amp;lt;/big&amp;gt; $testname failed&amp;lt;/h3&amp;gt;&amp;quot;;&lt;br /&gt;
    echo &amp;quot;&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;both were&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;$str1&amp;lt;/dd&amp;gt;&amp;lt;dl&amp;gt;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$l = array('1','2','3');&lt;br /&gt;
$html = toXOXO($l);&lt;br /&gt;
assertEqual('make xoxo from list','&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;',$html);&lt;br /&gt;
&lt;br /&gt;
$s = 'test';&lt;br /&gt;
$html = toXOXO($s);&lt;br /&gt;
assertEqual(&amp;quot;make xoxo from a string&amp;quot;,'&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;',$html);&lt;br /&gt;
$htmlwrap = toXOXO($s,TRUE);&lt;br /&gt;
failIfEqual(&amp;quot;make sure wrapped and unwrapped differ&amp;quot;,html,htmlwrap);&lt;br /&gt;
assertEqual(&amp;quot;make wrapped xoxo from a string&amp;quot;,'&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;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;',$htmlwrap);&lt;br /&gt;
$csswrap = toXOXO($s,TRUE,&amp;quot;reaptest.css&amp;quot;);&lt;br /&gt;
assertEqual(&amp;quot;make wrapped xoxo with css link from a string&amp;quot;,'&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;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;',$csswrap);&lt;br /&gt;
$l2 = array('1',array('2','3'));&lt;br /&gt;
$html = toXOXO($l2);&lt;br /&gt;
assertEqual('make xoxo from nested list','&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;',$html);&lt;br /&gt;
$d = array(test=&amp;gt;'1');&lt;br /&gt;
$html = toXOXO($d);&lt;br /&gt;
assertEqual('make xoxo from 1-element dictionary','&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;/dl&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;',$html);&lt;br /&gt;
$d = array(test=&amp;gt;'1',name=&amp;gt;Kevin);&lt;br /&gt;
$html = toXOXO($d);&lt;br /&gt;
assertEqual('make xoxo from dictionary','&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;',$html);&lt;br /&gt;
$d = array('url'=&amp;gt;'http://example.com/more.xoxo','title'=&amp;gt;'sample url','type'=&amp;gt;&amp;quot;text/xml&amp;quot;,'rel'=&amp;gt;'help','text'=&amp;gt;'an example');&lt;br /&gt;
$html = toXOXO($d);&lt;br /&gt;
assertEqual('make xoxo from dictionary with url','&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;',$html);&lt;br /&gt;
$d = array('url'=&amp;gt;'http://example.com/more.xoxo','title'=&amp;gt;'sample url','type'=&amp;gt;&amp;quot;text/xml&amp;quot;,'rel'=&amp;gt;'help','text'=&amp;gt;'an example','thing'=&amp;gt;'and another thing...');&lt;br /&gt;
$html = toXOXO($d);&lt;br /&gt;
assertEqual('make xoxo from dictionary with url and thing','&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;dl&amp;gt;&amp;lt;dt&amp;gt;thing&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;and another thing...&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;',$html);&lt;br /&gt;
$d = array('url'=&amp;gt;'http://example.com/more.xoxo','title'=&amp;gt;'sample url','type'=&amp;gt;&amp;quot;text/xml&amp;quot;,'rel'=&amp;gt;'help','text'=&amp;gt;'an example','list'=&amp;gt;array('and', 'another','thing...'));&lt;br /&gt;
$html = toXOXO($d);&lt;br /&gt;
assertEqual('make xoxo from dictionary with url and list','&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;dl&amp;gt;&amp;lt;dt&amp;gt;list&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;and&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;another&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;thing...&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;',$html);&lt;br /&gt;
$l = array('3',array('a'=&amp;gt;'2'));&lt;br /&gt;
$html = toXOXO($l);&lt;br /&gt;
assertEqual('make xoxo from dict in list','&amp;lt;ol class=&amp;quot;xoxo&amp;quot;&amp;gt;&amp;lt;li&amp;gt;3&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;a&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;2&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;',$html);&lt;br /&gt;
&lt;br /&gt;
$l = array('3','2','1');&lt;br /&gt;
$html = toXOXO($l);&lt;br /&gt;
$newdl= fromXOXO($html);&lt;br /&gt;
assertArrayEqual('list to xoxo and back',$l,$newdl);&lt;br /&gt;
$l = array('1',array('a','b'));&lt;br /&gt;
$html = toXOXO($l);&lt;br /&gt;
$newdl= fromXOXO($html);&lt;br /&gt;
assertArrayEqual('list of lists to xoxo and back',$l,$newdl);&lt;br /&gt;
&lt;br /&gt;
$l= array('3',array('a','2'),array('b',array('1',array('c','4'))));&lt;br /&gt;
$html = toXOXO($l);&lt;br /&gt;
$newdl= fromXOXO($html);&lt;br /&gt;
assertArrayEqual('list of list of lists to xoxo and back',$l,$newdl);&lt;br /&gt;
$d = array(test=&amp;gt;'1',name=&amp;gt;Kevin);&lt;br /&gt;
$html = toXOXO($d);&lt;br /&gt;
$newd= fromXOXO($html);&lt;br /&gt;
assertArrayEqual('dictionary to xoxo and back',$d,$newd);&lt;br /&gt;
&lt;br /&gt;
$l = array('3',array('a'=&amp;gt;'2'),array('b'=&amp;gt;'1','c'=&amp;gt;'4'));&lt;br /&gt;
$html = toXOXO($l);&lt;br /&gt;
$newdl= fromXOXO($html);&lt;br /&gt;
assertArrayEqual('list of dicts to xoxo and back',$l,$newdl);&lt;br /&gt;
assertEqual('list of dicts to xoxo and back',$html,toXOXO($newdl));&lt;br /&gt;
$l = array('one'=&amp;gt;array('a'=&amp;gt;'2','b'=&amp;gt;'3'),'two'=&amp;gt;array('c'=&amp;gt;'4'));&lt;br /&gt;
$html = toXOXO($l);&lt;br /&gt;
$newdl= fromXOXO($html);&lt;br /&gt;
assertArrayEqual('dict of dicts to xoxo and back',$l,$newdl);&lt;br /&gt;
assertEqual('dict of dicts to xoxo and back',$html,toXOXO($newdl));&lt;br /&gt;
$l = array('one'=&amp;gt;array('a'=&amp;gt;'2','b'=&amp;gt;'3'),'url'=&amp;gt;'http://example.com');&lt;br /&gt;
$html = toXOXO($l);&lt;br /&gt;
$newdl= fromXOXO($html);&lt;br /&gt;
assertArrayEqual('dict of dicts with url to xoxo and back',$l,$newdl);&lt;br /&gt;
assertEqual('dict of dicts with url to xoxo and back',$html,toXOXO($newdl));&lt;br /&gt;
$d = array('test'=&amp;gt; array('1','2'),&lt;br /&gt;
'name'=&amp;gt; 'Kevin','nestlist'=&amp;gt; array('a',array('b','c')),&lt;br /&gt;
'nestdict'=&amp;gt;array('e'=&amp;gt;'6','f'=&amp;gt;'7'));&lt;br /&gt;
$html = toXOXO($d);&lt;br /&gt;
$newd= fromXOXO($html);&lt;br /&gt;
assertArrayEqual('dictionary of lists  to xoxo and back',$d,$newd);&lt;br /&gt;
&lt;br /&gt;
$d=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;
assertArrayEqual('make sure text outside &amp;amp;lt;li&amp;amp;gt; etc is ignored',array(good=&amp;gt;buy),$d);&lt;br /&gt;
&lt;br /&gt;
$l=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;
assertArrayEqual('make sure text within &amp;amp;lt;li&amp;amp;gt; but outside a subcontainer is ignored',array(array(good=&amp;gt;buy),array('OK')),$l);&lt;br /&gt;
&lt;br /&gt;
$xoxoSample= &amp;quot;&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;&amp;quot;;&lt;br /&gt;
$d = fromXOXO($xoxoSample);&lt;br /&gt;
$d2=array('text'=&amp;gt;'item 1',&lt;br /&gt;
    'description'=&amp;gt;&amp;quot; This item represents the main point we're trying to make.&amp;quot;,&lt;br /&gt;
    'url'=&amp;gt;'http://example.com/more.xoxo',&lt;br /&gt;
    'title'=&amp;gt;'title of item 1',&lt;br /&gt;
    'type'=&amp;gt;'text/xml',&lt;br /&gt;
    'rel'=&amp;gt;'help');&lt;br /&gt;
assertArrayEqual('unmung some xoxo with spaces in and check result is right',$d2,$d);&lt;br /&gt;
&lt;br /&gt;
$xoxoSample= &amp;quot;&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;&amp;quot;;&lt;br /&gt;
$d = fromXOXO($xoxoSample);&lt;br /&gt;
$smartxoxoSample= &amp;quot;&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;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&amp;quot;;&lt;br /&gt;
$d2 = fromXOXO($smartxoxoSample);&lt;br /&gt;
assertArrayEqual('unmung some xoxo with &amp;amp;lt;a href= rel= etc in and check result is right',$d,$d2);&lt;br /&gt;
$xoxoSample= &amp;quot;&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;&amp;quot;;&lt;br /&gt;
$d = fromXOXO($xoxoSample);&lt;br /&gt;
$smartxoxoSample= &amp;quot;&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;&amp;quot;;&lt;br /&gt;
$d2 = fromXOXO($smartxoxoSample);&lt;br /&gt;
assertArrayEqual('unmung some xoxo with &amp;amp;lt;a href= rel= etc in and check result is right',$d,$d2);&lt;br /&gt;
&lt;br /&gt;
$d=array('url'=&amp;gt;'http://example.com/more.xoxo','title'=&amp;gt;'sample url','type'=&amp;gt;&amp;quot;text/xml&amp;quot;,'rel'=&amp;gt;'help','text'=&amp;gt;'an example');&lt;br /&gt;
$html=toXOXO($d);&lt;br /&gt;
assertArrayEqual('round trip url to href to url',$d,fromXOXO($html));&lt;br /&gt;
&lt;br /&gt;
$d=array('url'=&amp;gt;'http://example.com/more.xoxo','title'=&amp;gt;'sample url','type'=&amp;gt;&amp;quot;text/xml&amp;quot;,'rel'=&amp;gt;'help');&lt;br /&gt;
$html=toXOXO($d);&lt;br /&gt;
assertArrayEqual('round trip url to href to url (no text)',$d,fromXOXO($html));&lt;br /&gt;
&lt;br /&gt;
$d=array('url'=&amp;gt;'http://example.com/more.xoxo');&lt;br /&gt;
$html=toXOXO($d);&lt;br /&gt;
assertArrayEqual('round trip url to href to url (just url)',$d,fromXOXO($html));&lt;br /&gt;
$kmattn=&amp;lt;&amp;lt;&amp;lt;ENDATTN&lt;br /&gt;
&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;
ENDATTN;&lt;br /&gt;
$d=fromXOXO($kmattn);&lt;br /&gt;
$newattn = toXOXO($d);&lt;br /&gt;
$d2=fromXOXO($newattn);&lt;br /&gt;
assertArrayEqual('attention double round-trip',$d,$d2);&lt;br /&gt;
assertEqual('attention triple round-trip',$newattn,toXOXO($d2));&lt;br /&gt;
assertEqual('attention one round-trip',$kmattn,$newattn);&lt;br /&gt;
$d=array(array(url=&amp;gt;&amp;quot;http://www.boingboing.net/&amp;quot;,title=&amp;gt;&amp;quot;Boing Boing Blog&amp;quot;,&amp;quot;alturls&amp;quot;=&amp;gt;array(array(&amp;quot;url&amp;quot;=&amp;gt;&amp;quot;http://boingboing.net/rss.xml&amp;quot;,&amp;quot;text&amp;quot;=&amp;gt;&lt;br /&gt;
&amp;quot;xmlurl&amp;quot;)),&amp;quot;description&amp;quot;=&amp;gt;&amp;quot;Boing Boing Blog&amp;quot;),array(url=&amp;gt;&amp;quot;http://www.financialcryptography.com/&amp;quot;,title=&amp;gt;&amp;quot;Financial Cryptography&amp;quot;,&amp;quot;alturls&amp;quot;=&amp;gt;array(array(&amp;quot;url&amp;quot;=&amp;gt;&amp;quot;http://www.financialcryptography.com/mt/index.rdf&amp;quot;,&amp;quot;text&amp;quot;=&amp;gt;&lt;br /&gt;
&amp;quot;xmlurl&amp;quot;)),&amp;quot;description&amp;quot;=&amp;gt;&amp;quot;Financial Cryptography&amp;quot;));&lt;br /&gt;
$attn=&amp;lt;&amp;lt;&amp;lt;ENDATTN&lt;br /&gt;
&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;/ol&amp;gt;&lt;br /&gt;
ENDATTN;&lt;br /&gt;
assertEqual('attention encode',$attn,toXOXO($d));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AndyMabbett</name></author>
	</entry>
</feed>