├── README.md
├── .gitignore
├── LICENSE
├── xoxolib.php
├── xoxo.py
├── xoxotest.php
└── testxoxo.py
/README.md:
--------------------------------------------------------------------------------
1 | # xoxo
2 | Code to transform back and forth between JSON and HTML outlines
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 |
5 | # C extensions
6 | *.so
7 |
8 | # Distribution / packaging
9 | .Python
10 | env/
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | *.egg-info/
23 | .installed.cfg
24 | *.egg
25 |
26 | # PyInstaller
27 | # Usually these files are written by a python script from a template
28 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
29 | *.manifest
30 | *.spec
31 |
32 | # Installer logs
33 | pip-log.txt
34 | pip-delete-this-directory.txt
35 |
36 | # Unit test / coverage reports
37 | htmlcov/
38 | .tox/
39 | .coverage
40 | .coverage.*
41 | .cache
42 | nosetests.xml
43 | coverage.xml
44 | *,cover
45 |
46 | # Translations
47 | *.mo
48 | *.pot
49 |
50 | # Django stuff:
51 | *.log
52 |
53 | # Sphinx documentation
54 | docs/_build/
55 |
56 | # PyBuilder
57 | target/
58 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | CC0 1.0 Universal
2 |
3 | Statement of Purpose
4 |
5 | The laws of most jurisdictions throughout the world automatically confer
6 | exclusive Copyright and Related Rights (defined below) upon the creator and
7 | subsequent owner(s) (each and all, an "owner") of an original work of
8 | authorship and/or a database (each, a "Work").
9 |
10 | Certain owners wish to permanently relinquish those rights to a Work for the
11 | purpose of contributing to a commons of creative, cultural and scientific
12 | works ("Commons") that the public can reliably and without fear of later
13 | claims of infringement build upon, modify, incorporate in other works, reuse
14 | and redistribute as freely as possible in any form whatsoever and for any
15 | purposes, including without limitation commercial purposes. These owners may
16 | contribute to the Commons to promote the ideal of a free culture and the
17 | further production of creative, cultural and scientific works, or to gain
18 | reputation or greater distribution for their Work in part through the use and
19 | efforts of others.
20 |
21 | For these and/or other purposes and motivations, and without any expectation
22 | of additional consideration or compensation, the person associating CC0 with a
23 | Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
24 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
25 | and publicly distribute the Work under its terms, with knowledge of his or her
26 | Copyright and Related Rights in the Work and the meaning and intended legal
27 | effect of CC0 on those rights.
28 |
29 | 1. Copyright and Related Rights. A Work made available under CC0 may be
30 | protected by copyright and related or neighboring rights ("Copyright and
31 | Related Rights"). Copyright and Related Rights include, but are not limited
32 | to, the following:
33 |
34 | i. the right to reproduce, adapt, distribute, perform, display, communicate,
35 | and translate a Work;
36 |
37 | ii. moral rights retained by the original author(s) and/or performer(s);
38 |
39 | iii. publicity and privacy rights pertaining to a person's image or likeness
40 | depicted in a Work;
41 |
42 | iv. rights protecting against unfair competition in regards to a Work,
43 | subject to the limitations in paragraph 4(a), below;
44 |
45 | v. rights protecting the extraction, dissemination, use and reuse of data in
46 | a Work;
47 |
48 | vi. database rights (such as those arising under Directive 96/9/EC of the
49 | European Parliament and of the Council of 11 March 1996 on the legal
50 | protection of databases, and under any national implementation thereof,
51 | including any amended or successor version of such directive); and
52 |
53 | vii. other similar, equivalent or corresponding rights throughout the world
54 | based on applicable law or treaty, and any national implementations thereof.
55 |
56 | 2. Waiver. To the greatest extent permitted by, but not in contravention of,
57 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
58 | unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
59 | and Related Rights and associated claims and causes of action, whether now
60 | known or unknown (including existing as well as future claims and causes of
61 | action), in the Work (i) in all territories worldwide, (ii) for the maximum
62 | duration provided by applicable law or treaty (including future time
63 | extensions), (iii) in any current or future medium and for any number of
64 | copies, and (iv) for any purpose whatsoever, including without limitation
65 | commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
66 | the Waiver for the benefit of each member of the public at large and to the
67 | detriment of Affirmer's heirs and successors, fully intending that such Waiver
68 | shall not be subject to revocation, rescission, cancellation, termination, or
69 | any other legal or equitable action to disrupt the quiet enjoyment of the Work
70 | by the public as contemplated by Affirmer's express Statement of Purpose.
71 |
72 | 3. Public License Fallback. Should any part of the Waiver for any reason be
73 | judged legally invalid or ineffective under applicable law, then the Waiver
74 | shall be preserved to the maximum extent permitted taking into account
75 | Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
76 | is so judged Affirmer hereby grants to each affected person a royalty-free,
77 | non transferable, non sublicensable, non exclusive, irrevocable and
78 | unconditional license to exercise Affirmer's Copyright and Related Rights in
79 | the Work (i) in all territories worldwide, (ii) for the maximum duration
80 | provided by applicable law or treaty (including future time extensions), (iii)
81 | in any current or future medium and for any number of copies, and (iv) for any
82 | purpose whatsoever, including without limitation commercial, advertising or
83 | promotional purposes (the "License"). The License shall be deemed effective as
84 | of the date CC0 was applied by Affirmer to the Work. Should any part of the
85 | License for any reason be judged legally invalid or ineffective under
86 | applicable law, such partial invalidity or ineffectiveness shall not
87 | invalidate the remainder of the License, and in such case Affirmer hereby
88 | affirms that he or she will not (i) exercise any of his or her remaining
89 | Copyright and Related Rights in the Work or (ii) assert any associated claims
90 | and causes of action with respect to the Work, in either case contrary to
91 | Affirmer's express Statement of Purpose.
92 |
93 | 4. Limitations and Disclaimers.
94 |
95 | a. No trademark or patent rights held by Affirmer are waived, abandoned,
96 | surrendered, licensed or otherwise affected by this document.
97 |
98 | b. Affirmer offers the Work as-is and makes no representations or warranties
99 | of any kind concerning the Work, express, implied, statutory or otherwise,
100 | including without limitation warranties of title, merchantability, fitness
101 | for a particular purpose, non infringement, or the absence of latent or
102 | other defects, accuracy, or the present or absence of errors, whether or not
103 | discoverable, all to the greatest extent permissible under applicable law.
104 |
105 | c. Affirmer disclaims responsibility for clearing rights of other persons
106 | that may apply to the Work or any use thereof, including without limitation
107 | any person's Copyright and Related Rights in the Work. Further, Affirmer
108 | disclaims responsibility for obtaining any necessary consents, permissions
109 | or other rights required for any use of the Work.
110 |
111 | d. Affirmer understands and acknowledges that Creative Commons is not a
112 | party to this document and has no duty or obligation with respect to this
113 | CC0 or use of the Work.
114 |
115 | For more information, please see
116 |
"; 102 | var_dump($xoxoVals); 103 | var_dump($xoxoIndex); 104 | echo ""; 105 | } 106 | $howmany = sizeof($xoxoVals); 107 | 108 | #echo "
";
109 | $x = $xoxoIndex['OL'];
110 | for ($x=0;$x<$howmany;++$x)
111 | {
112 | if ($xoxoVals[$x]['tag'] == 'OL' || $xoxoVals[$x]['tag'] == 'DL'|| $xoxoVals[$x]['tag'] == 'UL')
113 | {
114 | if ($xoxoVals[$x]['tag'] == 'DL')
115 | $structType = 'dict';
116 | else
117 | $structType = 'list';
118 | if ($xoxoVals[$x]['type'] == 'open')
119 | pushStruct(array(),$structs,$xostack,$structType);
120 | if ($xoxoVals[$x]['type'] == 'close')
121 | array_pop($xostack);
122 | if($dumpStacks)
123 | {
124 | echo $xoxoVals[$x]['type'] .' ' . $xoxoVals[$x]['tag'] .":\n";
125 | var_dump($structs);
126 | var_dump($xostack);
127 | }
128 | }
129 | if ($xoxoVals[$x]['tag'] == 'LI')
130 | {
131 | if ($xoxoVals[$x]['type'] == 'complete')
132 | array_push($xostack[count($xostack)-1],$xoxoVals[$x]['value']);
133 | if ($xoxoVals[$x]['type'] == 'close')
134 | {
135 | array_push($xostack[count($xostack)-1],array_pop($structs));
136 | }
137 | if($dumpStacks)
138 | {
139 | echo $xoxoVals[$x]['type'] .' ' . $xoxoVals[$x]['tag'] .":\n";
140 | var_dump($structs);
141 | var_dump($xostack);
142 | }
143 | }
144 |
145 | if ($xoxoVals[$x]['tag'] == 'DT')
146 | {
147 | if ($xoxoVals[$x]['type'] == 'complete')
148 | array_push($textstack,$xoxoVals[$x]['value']);
149 | }
150 | if ($xoxoVals[$x]['tag'] == 'DD')
151 | {
152 | if ($xoxoVals[$x]['type'] == 'complete')
153 | {
154 | $key = array_pop($textstack);
155 | $xostack[count($xostack)-1][$key] = $xoxoVals[$x]['value'];
156 | }
157 | if ($xoxoVals[$x]['type'] == 'close')
158 | {
159 | $key = array_pop($textstack);
160 | $xostack[count($xostack)-1][$key] =array_pop($structs);
161 | }
162 | if($dumpStacks)
163 | {
164 | echo $xoxoVals[$x]['type'] .' ' . $xoxoVals[$x]['tag'] .":\n";
165 | var_dump($structs);
166 | var_dump($xostack);
167 | }
168 | }
169 | if ($xoxoVals[$x]['tag'] == 'A')
170 | {
171 | if ($xoxoVals[$x]['type'] == 'complete')
172 | {
173 | $attrs = $xoxoVals[$x]['attributes'];
174 | $dict=array();
175 | foreach ($attrs as $key=> $value)
176 | {
177 | if ($key=='HREF')
178 | $dict['url'] = $value;
179 | else
180 | $dict[strtolower($key)] = $value;
181 | }
182 | $val = $xoxoVals[$x]['value'];
183 | if (isset($val) && ($val != $dict['title']) && ($val != $dict['url']))
184 | $dict['text'] = $val;
185 | pushStruct($dict,$structs,$xostack,'dict');
186 | array_pop($xostack);
187 |
188 | if($dumpStacks)
189 | {
190 | echo $xoxoVals[$x]['type'] .' ' . $xoxoVals[$x]['tag'] .":\n";
191 | var_dump($structs);
192 | var_dump($xostack);
193 | }
194 | }
195 | }
196 | }
197 | #echo "";
198 | while (count($structs) == 1 && getKind($structs) == 'list')
199 | $structs = $structs[0];
200 | return $structs;
201 | }
202 | ?>
203 |
--------------------------------------------------------------------------------
/xoxo.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 | # -*- coding: utf-8 -*-
3 | """xoxo.py - a utility module for transforming to and from the XHTMLOutlines format XOXO http://microformats.org/wiki/xoxo
4 | toXOXO takes a Python datastructure (tuples, lists or dictionaries, arbitrarily nested) and returns a XOXO representation of it.
5 | fromXOXO parses an XHTML file for a xoxo list and returns the structure
6 | """
7 | __version__ = "0.9"
8 | __date__ = "2005-11-02"
9 | __author__ = "Kevin Marks "; 23 | var_dump($expected); 24 | echo "
"; 25 | var_dump($returned); 26 | echo "