root/livinglogic.python.xist/NEWS.rst @ 5331:8564b72915cf

Revision 5331:8564b72915cf, 130.5 KB (checked in by Walter Doerwald <walter@…>, 7 years ago)

Remove ** syntax from UL4 dict literals.

Line 
1Changes in 4.10 (released ??/??/2013)
2-------------------------------------
3
4*   It's now possible to use UL4 templates as functions::
5
6        >>> from ll import ul4c
7        >>> f = ul4c.Template("<?return 2*x?>")
8        >>> f(x=42)
9        84
10
11    Normal output of the template will be ignored if it is used as a function.
12
13*   The UL4 tag ``<?code?>`` may now contain not only variable assigments, but
14    any other expression. Of course this makes only sense for expressions that
15    have side effects (e.g. a call to the ``render`` method).
16
17*   UL4 functions ``print`` and ``printx`` have been added. They behave like the
18    appropriate tags ``<?print?>`` and ``<?printx?>``, but can output an
19    arbitrary number of arguments.
20
21*   The tag ``<?render?>`` has been removed. To update your code replace
22    ``<?render r.render()?>`` with ``<?exe r.render()?>``.
23
24*   The builtin UL4 functions are now real objects that can be passed to
25    templates as arguments.
26
27*   The UL4 methods ``days``, ``seconds``, ``microseconds`` and ``months`` have
28    been added for ``timedelta``/``monthdelta`` objects.
29
30*   Lists in UL4 now support the methods ``append``, ``insert`` and ``pop``.
31
32*   The UL4 functions ``vars`` and ``get`` have been removed.
33
34*   The ``**`` syntax has been removed for UL4 dict literals.
35
36*   The automatic UL4 variable ``stack`` has been removed too.
37
38
39Changes in 4.9.1 (released 01/17/2013)
40--------------------------------------
41
42*   Fixed a bug the ``printx`` tag for UL4 templates.
43
44
45Changes in 4.9 (released 01/17/2013)
46------------------------------------
47
48*   Fixed a bug in UL4 templates when a template called a top-level template
49    which in turn called its own subtemplate.
50
51*   Fixed and enhanced ``repr`` output of UL4 templates and added support
52    for IPythons pretty printing framework.
53
54
55Changes in 4.8 (released 01/15/2013)
56------------------------------------
57
58*   Linefeeds and indentation in the literal text for UL4 templates can now be
59    ignored by specifying ``keepws=False`` in the template constructor.
60
61
62Changes in 4.7 (released 01/11/2013)
63------------------------------------
64
65*   A variable ``stack`` is now automatically defined in all UL4 templates. This
66    list contains a stack of the currently executing UL4 templates. ``stack[-1]``
67    is the current template.
68
69*   UL4 templates now support lexical scopes. A locally defined subtemplate can
70    access all local variables of the template in which it is defined.
71
72*   UL4 functions and methods now support keyword arguments, e.g.
73    ``format(now(), fmt="%Y-%m-%d", lang="en")``.
74
75*   UL4 templates can no longer be converted to Java ``CompiledTemplate`` objects.
76    (However converting it to an ``InterpretedTemplate`` is of course still
77    supported).
78
79*   If the view ``ctx_preferences`` doesn't exist :meth:`orasql.Preference.itername``
80    now will simply return an empty iterator instead of failing with an Oracle
81    exception ``ORA-00942: table or view does not exist``.
82
83*   For sisyphus jobs, the class attribute ``maxtime`` can now be set to a
84    ``datetime.timedelta`` object.
85
86
87Changes in 4.6 (released 12/18/2012)
88------------------------------------
89
90*   The :meth:`walk` method in XIST has been changed: The return value is a
91    cursor object that provides information about the path and can be used to
92    skip subtrees in the traversal. Filters (which are called selectors now)
93    can no longer influence which parts of the trees are traversed, only whether
94    a node is returned by the iterator or not.
95
96*   :func:`ll.xist.parse.itertree` now supports the same interface is the
97    :meth:`walk` method.
98
99*   A new function :func:`xfind.filter` has been added that filters the output
100    of :meth:`walk` or :func:`itertree` against a :class:`Selector` object.
101
102*   The XIST parse events have been renamed: The ``"start*"`` events to
103    ``"enter*"`` and the ``"end*"`` events to ``"leave*"``.
104
105*   Slicing XIST elements now returns a sliced element, instead of a slice from
106    the content :class:`Frag`::
107
108        >>> from ll.xist.ns import html
109        >>> html.ul(html.li(i) for i in range(5))[1:3].string()
110        '<ul><li>1</li><li>2</li></ul>'
111
112*   Functions with keyword only arguments are now supported in
113    :func:`ll.xist.ns.doc.explain`.
114
115*   :class:`ll.misc.monthdelta` now supports the :func:`abs` function (i.e.
116    ``abs(monthdelta(-1))`` returns ``monthdelta(1)``.)
117
118
119Changes in 4.5 (released 11/29/2012)
120------------------------------------
121
122*   Added UL4 functions ``any`` and ``all``.
123
124*   To improve UL4 exception messages there are now several undefined objects,
125    which give information about which key/name/index resulted in the undefined
126    object being created.
127
128*   UL4ON can no longer read or write undefined values.
129
130*   The UL4 function ``format`` now swallows all exceptions produced by
131    :mod:`locale`.
132
133*   Oracle URLs now support reading and writing bytes.
134
135*   Because of problems with `distribute`_/`pip`_ and `pytest`_
136    :file:`ll/__init__.py` has been reintroduced.
137
138    .. _distribute: http://pypi.python.org/pypi/distribute
139    .. _pip: http://www.pip-installer.org/
140    .. _pytest: http://pytest.org/latest/
141
142
143Changes in 4.4 (released 11/08/2012)
144------------------------------------
145
146*   Python 3.3 is required now (as the code uses ``yield from`` and
147    ``__qualname__``).
148
149*   :file:`ll/__init__.py` has been removed, i.e. XIST is now a PEP 420
150    compatible namespace package.
151
152*   Fixed tab/space mix in :file:`antlr3/debug.py`.
153
154
155Changes in 4.3.1 (released 11/06/2012)
156--------------------------------------
157
158*   Added a method ``values`` to UL4 for dictionaries.
159
160*   Fixed a bug in ``ll.misc.SysInfo.user_shell``.
161
162*   Fixed function :func:`ll.xist.ns.doc.explain` for methods.
163
164
165Changes in 4.3 (released 11/02/2012)
166------------------------------------
167
168*   UL4 now uses a parser generated by ANTLR_ instead of using spark_. This means
169    that the Python parser can now use the same grammar as the Java parser.
170    (A Python 3 port of the ANTLR runtime is included).
171
172    .. _ANTLR: http://www.antlr.org/
173    .. _spark: http://pages.cpsc.ucalgary.ca/~aycock/spark/
174
175*   Accessing non-existant variables in UL4 templates now no longer raises an
176    exception but returns the special object ``Undefined``. The same is true for
177    accessing non-existant dictionary keys or list/string indexes that are out of
178    range.
179
180    In a boolean context ``Undefined`` is treated as false and ``str(Undefined)``
181    returns the empty string.
182
183*   Two new UL4 functions have been added: ``isundefined`` returns whether the
184    argument is the ``Undefined`` object or not. ``isdefined`` has the inverted
185    logic, i.e. it returns ``True`` if the argument is *not* the ``Undefined``
186    object.
187
188*   The characters CR and LF are no longer allowed in UL4 string constants.
189    Furthermore the escape sequence ``\e`` is no longer supported.
190
191*   All AST nodes for loading constants have been merged into a single class
192    :class:`Const`.
193
194*   :mod:`ll.ul4on` can now read and write :class:`datetime.timedelta` and
195    :class:`misc.monthdelta` objects as well as the new ``Undefined`` object
196    from UL4 (:class:`ll.ul4c.Undefined`).
197
198
199Changes in 4.2 (released 10/22/2012)
200------------------------------------
201
202*   UL4 templates now support list and dictionary comprehension as well as
203    generator expressions.
204
205*   A new UL4 function ``date`` has been added.
206
207*   The UL4 method ``join`` no longer calls ``str`` on the items in the argument
208    list.
209
210*   The UL4 function format now supports a third argument: the language for
211    formatting dates. So ``format(date(2012, 10, 10), '%A', 'de')`` outputs
212    ``Mittwoch``.
213
214*   UL4 date objects now have a new ``week`` method. This method returns the
215    week number of the year. It supports one argument: the weekday number
216    (0 for Monday, ... 6 for Sunday) that should be considered the start day
217    of the week. All days in a new year preceding the first week start day are
218    considered to be in week 0. The week start day defaults to 0 (Monday).
219
220*   :class:`datetime.timedelta` objects are now completely supported in UL4
221    templates: They can be created with the ``timedelta`` function and can be
222    type tested for with ``istimedelta``.
223
224*   Added a new class :class:`ll.misc.monthdelta`. :class:`monthdelta` objects
225    can be used to add months/years to a :class:`datetime.datetime` or
226    :class:`datetime.date` object. If the resulting day falls out of the range of
227    valid days for the target month, the last day for the target month will be
228    used instead.
229
230*   :class:`monthdelta` objects are now supported in UL4 templates: They can be
231    created with the ``monthdelta`` function and can be type tested for with
232    ``ismonthdelta``.
233
234
235Changes in 4.1.1 (released 10/04/2012)
236--------------------------------------
237
238*   Fixed a bug in the UL4 handling of slices. (``('0' + str(x))[-2:]`` didn't
239    work correctly.)
240
241
242Changes in 4.1 (released 10/02/2012)
243------------------------------------
244
245*   Loop variable unpacking in UL4 now allows arbitrary nesting.
246
247*   Variable assignment in UL4 now allows variable unpacking too, i.e.
248    ``(a, b) = [17, 23]``.
249
250*   The support for Growl notifications in :mod:`ll.make` on the Mac has been
251    replaced by support for Mountain Lions Notification Center via
252    terminal-notifier__.
253
254    __ https://github.com/alloy/terminal-notifier
255
256*   :mod:`sispyhus` jobs now support notifications too.
257
258*   Java conversion of :class:`ll.ul4c.And` has been fixed to evaluate the second
259    operand only when the result isn't clear from the first.
260
261*   :class:`ll.ul4on.Decoder` now raises an ``EOFError`` when reading from an
262    empty stream.
263
264*   A new script has been added: ``oradd.py`` can be used for importing data into
265    an Oracle database (via procedure calls).
266
267
268Changes in 4.0 (released 08/08/2012)
269------------------------------------
270
271*   The source has been ported to Python 3. From now on XIST is a Python 3 only
272    project. A big thanks goes to Martin v. Löwis, who got this conversion
273    started at PyCon DE 2011. He did the basic ``2to3`` conversion and updated
274    the C source to work on Python 3. Without Martin, XIST wouldn't have made
275    the leap to Python 3 for several years.
276
277*   As there's no Python 3 port of libxml2_\s Python wrapper, XIST now uses lxml_
278    for HTML parsing.
279
280    .. _libxml2: http://www.xmlsoft.org/
281    .. _lxml: http://lxml.de/
282
283    This change shouldn't have any visible consequences.
284
285*   UL4 templates are no longer compiled to byte code, instead the AST is
286    evaluated or converted to the target sourcecode directly.
287
288*   Generating the final Javascript source code for UL4 templates is now done in
289    Javascript itself.
290
291*   A new module :mod:`ul4on` has been added. This module provides functions for
292    encoding and decoding a lightweight extensible machine-readable text format
293    for serializing the object types supported by UL4.
294
295*   The following new functions have been added to UL4: ``isfirst``, ``islast``,
296    ``isfirstlast``, ``enumfl``. They are variants of ``enumerate`` that give
297    information about whether the item is the first and/or last item.
298
299*   The following new functions have been added to UL4: ``urlquote`` and
300    ``urlunquote``. They encode/decode the ``%``-escaped form of URL query
301    parameters.
302
303*   The UL4 function ``json`` has been renamed to ``asjson`` and the following
304    new UL4 functions have been added: ``fromjson``, ``asul4on`` and ``fromul4on``.
305
306*   The UL4 function ``enumerate`` now supports 1 or 2 arguments (the second
307    argument being the start value).
308
309*   The UL4 functions ``str``, ``bool``, ``int`` and ``float`` now support being
310    called without arguments (just like in Python).
311
312*   Date constants in UL4 have changed again. They are now written like this:
313    ``@(2012-04-12)`` or ``@(2012-04-12T12:34:56)``.
314
315*   The ``<?render?>`` tag in UL4 now looks like a method call instead of a
316    function call. I.e. ``<?render t(a=17, b=23)?>`` has changed to
317    ``<?render t.render(a=17, b=23)?>``.
318
319*   UL4 stacktraces now use exception chaining to report the exception location
320    in nested templates.
321
322*   The UL4 methods ``find`` and ``rfind`` now support lists and tuples.
323
324*   Two new UL4 functions have been added: ``min`` and ``max``.
325
326*   The sort order for attributes when publishing XIST trees can be overwritten
327    by setting the ``xmlorder`` class attribute to a string. This string will be
328    used for sorting the attribute. Attributes that have ``xmlorder`` set will
329    always be published before those that don't.
330
331*   Support for the old ``ipipe`` infrastructure has been removed. Support for
332    IPythons new pretty printing infrastructure has been added. Output looks like
333    this::
334
335        In [1]: from ll.xist.ns import xml, html
336        In [2]: html.a(
337           ...:         'gurk',
338           ...:         xml.Attrs(lang='de'),
339           ...:         class_='link',
340           ...:         href='http://www.example.org/',
341           ...:         id='dings42',
342           ...: )
343        Out[2]:
344        ll.xist.ns.html.a(
345           'gurk',
346           ll.xist.ns.xml.Attrs.lang='de',
347           class_='link',
348           href='http://www.example.org/',
349           id='dings42')
350
351*   Added the attributes ``allowfullscreen`` and ``flashvars`` to
352    :class:`ll.xist.ns.html.embed`.
353
354*   Added the attribute ``allowfullscreen`` to  :class:`ll.xist.ns.html.iframe`.
355
356*   The :meth:`isdir` method now always returns ``False`` for real (i.e.
357    non-file or ssh) URLs. This allows stuff like::
358
359        ucp http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2 \
360            ssh://user@www.example.org/~/src/
361
362*   :class:`ll.orasql.Index` now uses the ``*_INDEXES`` views to get a list of
363    all indexes and ``LOB`` indexes are filtered out, since they will be recreated
364    with the LOB itself. The method :meth:`table` has been fixed for indexes that
365    belong to a different user than the index.
366
367*   :class:`ll.orasql.LOBStream` has a new method :meth:`seek`.
368
369*   :class:`ll.make.FileAction` supports encoding/decoding when writing/reading
370    the file. For this use the :var:`encoding` and :var:`errors` arguments.
371
372*   The XIST node method :meth:`sorted` has been removed, as it no longer makes
373    sense, because with Python 3 nodes might be uncomparable.
374
375*   Th support for ``%u`` escapes in URLs has been removed.
376
377*   The function :func:`html.astext` now uses the newer `links 2`_
378
379    .. _links 2: http://links.twibright.com/
380
381*   The scripts ``oracreate``, ``oradrop``, ``oradelete``, ``oradiff``,
382    ``oramerge``, ``oragrant``, ``orafind`` and ``uhpp`` no longer have an
383    :option:`-e`/:option:`--encoding` option. They always use Pythons output
384    encoding.
385
386*   The options :option:`-i`/:option:`--inputencoding` and
387    :option:`-o`/:option:`--outputencoding` of the script ``db2ul4`` have been
388    replaced with an option :option:`-e`/:option:`--encoding` for the encoding
389    of the template files. For printing the result Pythons output encoding is
390    used.
391
392*   The options :option:`--inputencoding`,/:option:`--inputerrors` and
393    :option:`--outputencoding`/:option:`--outputerrors` of
394    :class:`ll.sisyphus.Job` have been replaced with option
395    :option:`--encoding`/:option:`--errors` for the encoding of the log files.
396
397*   ``oradiff`` now iterates through the object in correct order, so if you're
398    running ``oradiff`` with ``-mfull`` the output shouldn't produce any errors
399    when executed.
400
401*   :mod:`ll.orasql.Index` can now handle domain indexes.
402
403*   :mod:`ll.orasql.Preference` has been added.
404
405*   :mod:`ll.orasql` now ignores indexes of type ``IOT - TOP``.
406
407*   :mod:`ll.orasql` can now handle primary keys where the underlying index has
408    a different name.
409
410*   :mod:`ll.orasql` now ignores tables with names starting with ``DR$``
411    (i.e. those created by Oracle Text Search).
412
413*   Attributes of :class:`ll.misc.SysInfo` instances are now calculated on
414    demand. With this change only one instance of :class:`ll.misc.SysInfo` is
415    required. This instance is :class:`ll.misc.sysinfo`.
416
417*   When connecting to the database :mod:`ll.orasql` sets the ``client_info``
418    attribute to the name of the running script (unless ``clientinfo=None`` is
419    passed to the :func:`connect` call).
420
421*   :class:`ll.xist.ns.specials.loremipsum` now repeats the text if the specified
422    ``len`` attribute is greater that the length of the lorem ipsum text.
423
424
425Changes in 3.25 (released 08/12/2011)
426-------------------------------------
427
428*   :class:`ll.xist.parse.Tidy` will now output the attribute events in sorted
429    order. Publishing an XIST node will output the attributes in sorted order too.
430
431*   The :meth:`compact` method has been renamed to :meth:`compacted` to avoid
432    collisions with the ``compact`` attribute in HTML elements.
433
434*   A new script ``uhpp`` has been added, that can be used for pretty printing
435    HTML. As the attributes are output in alphabetical order it can also be used
436    as a tool for comparing HTML files.
437
438
439Changes in 3.24.1 (released 08/10/2011)
440---------------------------------------
441
442*   Fixed a bug in the new :class:`ll.xist.xsc.AttrElement` class that surfaced
443    in the context of boolean attributes.
444
445
446Changes in 3.24 (released 08/09/2011)
447-------------------------------------
448
449*   The :class:`ProcInst` subclass :class:`ll.xist.xsc.AttrProcInst` has been
450    replaced with an :class:`Element` subclass :class:`ll.xist.xsc.AttrElement`.
451    Conditional handling of the attribute will be used, if the
452    :class:`AttrElement` instance is the only
453    child of the attribute. Outside of attributes the :class:`AttrElement`
454    instance will be published normally (via :meth:`publish`, which must be
455    implemented).
456
457*   :class:`ll.xist.ns.ul4.attr_if` is an :class:`ll.xist.xsc.AttrElement`
458    subclass now. The condition is in the ``cond`` attribute and the attribute
459    content is inside the element. Outside of an attribute :class:`attr_if`
460    will put a normal UL4 ``if`` condition around its content.
461
462*   :class:`ll.xist.ns.ul4.attr_ifnn` has been removed.
463
464
465Changes in 3.23.1 (released 07/28/2011)
466---------------------------------------
467
468*   Fixed a bug in :mod:`ll.sisyphus`: The code wasn't updated to use
469    :class:`ll.ul4c.Template` instead of :func:`ll.ul4c.compile`.
470
471
472Changes in 3.23 (released 07/20/2011)
473-------------------------------------
474
475*   UL4 template objects now have a name. This name will be displayed in
476    exception messages. Nested templates display their own name in the exception
477    message.
478
479*   The module global functions :func:`ll.ul4c.compile`, :func:`ll.ul4c.load` and
480    :func:`ll.ul4c.loads` have been removed. Instead of them the :class:`Template`
481    constructor and the class methods :meth:`load` and :meth:`loads` can be used.
482
483*   The script ``oradelete`` now supports the options :option:`--include`,
484    :option:`--exclude` and :option:`--keepjunk` too.
485
486
487Changes in 3.22 (released 07/14/2011)
488-------------------------------------
489
490*   The scripts ``oracreate``, ``oradrop`` and ``oragrant`` have new options
491    :option:`--include` and :option:`--exclude` that can be used to filter the
492    objects that will be output.
493
494
495Changes in 3.21 (released 06/03/2011)
496-------------------------------------
497
498*   Oracle 10 doesn't have a ``DBA_ARGUMENTS`` view.
499    Fixed :class:`ll.orasql.Function` and :class:`ll.orasql.Procedure`
500    accordingly.
501
502*   The ``type`` attribute for the :class:`input` element now supports the new
503    input types from HTML5.
504
505*   The form elements :class:`input`, :class:`select` and :class:`textarea`
506    gained the additional attributes from HTML5.
507
508
509Changes in 3.20.2 (released 05/23/2011)
510---------------------------------------
511
512*   Unicode parameters in :meth:`execute` and :meth:`executemany` in
513    :mod:`ll.xist.orasql` now get encoded to the Oracle client character set.
514
515
516Changes in 3.20.1 (released 05/18/2011)
517---------------------------------------
518
519*   Fixed a bug in the Java code generation for UL4 templates: When the template
520    source code contained C-style comments (i.e. ``/* foo */``) invalid Java
521    source code was produced.
522
523
524Changes in 3.20 (released 05/05/2011)
525-------------------------------------
526
527*   It's now possible to specify the connection mode (i.e. ``SYSDBA`` and
528    ``SYSOPER``) in ``oracle`` URLs like this::
529
530        $ uls oracle://sys:pwd:sysdba@dsn/
531
532    Supported are the values ``normal`` (the default), ``sysdba`` and ``sysoper``.
533
534*   The :var:`schema` argument used by various methods in :mod:`ll.orasql` has
535    been replaced by a :var:`owner` argument that can be :const:`None` (for the
536    current user), the constant :const:`ALL` for all users (which uses the
537    ``DBA_*`` variant of various meta data views if possible or the ``ALL_*``
538    variants otherwise) and a specific user name.
539
540    These views are also used if possible in all spots where the ``ALL_`` views
541    where used before.
542
543*   It's now possible to list all users in the database with the class methods
544    :meth:`User.iternames` and :meth:`User.iterobjects` and with
545    :meth:`Connection.iterusers`.
546
547*   Oracle :class:`Column` objects have a new method :meth:`table` that returns
548    the table the column belongs to.
549
550*   Oracle URLs now support the directory ``user/`` which contains all users, i.e.
551    ``oracle://user:pwd@db/user/`` lists all users and
552    ``oracle://user:pwd@db/user/foo/`` lists the same stuff as
553    ``oracle://foo:pwd@db/``. This directory however will *not* be listed in the
554    root directory ``oracle://user:pwd@db/``.
555
556*   :mod:`ll.orasql` now supports tables without columns.
557
558*   :class:`ll.orasql.Table` has a new method :meth:`pk` that returns the primary
559    key contraint (or :const:`None` if the table has now primary key contraint).
560
561*   A bug in the queries for :class:`Index` objects in :mod:`ll.orasql` has been
562    fixed.
563
564*   :mod:`ipipe` support has been removed from :mod:`ll.orasql`.
565
566*   Fixed a bug in :class:`ll.xist.xsc.Pool`: Registered elements/entities etc.
567    now show up as attributes of the pool object.
568
569
570Changes in 3.19 (released 04/26/2011)
571-------------------------------------
572
573*   :mod:`ll.orasql` now requires cx_Oracle 5.1.
574
575*   If the :var:`readlobs` option is false for :mod:`ll.orasql` cursors, the
576    CLOBs/BLOBs returned will be wrapped into something that behaves like a
577    Python file.
578
579
580Changes in 3.18.1 (released 04/13/2011)
581---------------------------------------
582
583*   The methods :meth:`elements`, :meth:`procinsts`, :meth:`entities` and
584    :meth:`charrefs` of :class:`ll.xist.xsc.Pool` now handle base pools properly.
585
586
587Changes in 3.18 (released 04/08/2011)
588-------------------------------------
589
590*   Fixed a regression in :class:`ll.orasql.OracleConnection`.
591
592*   Fixed :exc:`ZeroDivisionError` in script ``uls`` for empty directories.
593
594*   Added a class method :meth:`ll.orasql.Contraint.iternames` and a class method
595    :meth:`ll.orasql.Index.iternames` that skips those indexes that are generated
596    by constraints. With this addition ``uls``/``ucp`` now list/copy constraints
597    and indexes properly. All ``iternames`` methods now skip objects whose name
598    starts with ``BIN$``.
599
600*   The scripts ``uls``, ``ucp`` and ``ucat`` have new options :option:`--include`
601    and :option:`--exclude` for including/excluding URLs that match a regular
602    expression. They also have an new option :option:`--all` to include/exclude
603    dot files (i.e. files/directories whose name starts with a dot)
604
605*   ``ucp`` now supports to new options :option:`--padding` and
606    :option:`--separator` which are used for column output.
607
608*   Two unused options were removed: :option:`--verbose` from the script ``ucat``
609    and :option:`--defaults` from the script ``tld2xsc``.
610
611*   ``ucp -x`` now prints exception details.
612
613*   The variables available in UL4 templates used by ``db2ul4`` have changed.
614    Instead of a ``connect`` object, there are now three objects for each
615    supported database (i.e. ``oracle``, ``sqlite`` and ``mysql``)
616
617*   The script ``doc2txt`` now reads from ``stdin`` and writes to ``stdout``
618    instead of requiring file names on the command line.
619
620*   If the scripts ``xml2xsc`` or ``dtd2xsc`` are called without arguments
621    ``stdin`` is read.
622
623*   :mod:`ll.xist.ns.rest` now handles option lists.
624
625*   The Oracle URLs provided by :mod:`ll.orasql` now have a ``.sql`` extension
626    for all schema objects. On writing a ``.sql`` extension will be stripped to
627    get the name of the schema object.
628
629*   Oracle URLs now should support schema objects with fancy names (i.e. ones
630    that contain accented characters).
631
632*   :class:`ll.orasql.Table` has a new method :meth:`organization` that returns
633    ``"heap"`` or normal tables and ``"index"`` for index organized tables.
634
635*   Pretty printing of XIST trees can now be customized with the class attributes
636    :var:`prettyindentbefore` and :var:`prettyindentafter`. The values will be
637    added to the current indentation level before and after the node in question.
638
639*   All scripts that are part of XIST (``uls``, ``ucp``, ``ucat``, ``db2ul4``,
640    ``dtd2xsc``, ``tld2xsc``, ``doc2txt``, ``xml2xsc``, ``oracreate``,
641    ``oradrop``, ``oradelete``, ``oradiff``, ``oramerge``, ``oragrant`` and
642    ``orafind``) are now properly documented on the webpages.
643
644
645Changes in 3.17.3 (released 03/02/2011)
646---------------------------------------
647
648*   Enhanced support for table and column names containing non-ASCII characters
649    in :mod:`ll.orasql`.
650
651*   Fixed a bug in the ``uls`` script: In long recursive mode files were
652    printed twice.
653
654
655Changes in 3.17.2 (released 02/25/2011)
656---------------------------------------
657
658*   Fixed ``setup.py`` so that the spacer GIF and the UL4 Javascript support
659    library *really* get installed.
660
661
662Changes in 3.17.1 (released 02/25/2011)
663---------------------------------------
664
665*   Due to a bug in ``MANIFEST.in`` the spacer GIF and the UL4 Javascript support
666    library where not included in the distirbution package. This has been fixed.
667
668
669Changes in 3.17 (released 02/24/2011)
670-------------------------------------
671
672*   The UL4 function ``repr`` now handles all instances of
673    :class:`collections.Mapping` and :class:`collections.Sequence` too.
674
675*   The spacer pixel ``px/spc.gif`` and the UL4 Javascript support library
676    ``ul4.js`` will now be installed alongside the Python modules (in
677    ``ll.xist.data``).
678
679*   The Java source code produced by :meth:`ll.ul.Template.javasource` will now
680    contain register declarations only for the registers that are actually used.
681
682*   :func:`misc.javastring` has been renamed to :func:`misc.javaexpr` can can
683    now produce the Java sourcecode for more types.
684
685*   The UL4 method ``isoformat`` now omits the time part if it is ``00:00:00``.
686
687*   The UL4 function ``repr`` now produces a valid UL4 date literal for date
688    objects.
689
690*   The UL4 method ``format`` is now a function instead.
691
692*   The tests for UL4 now test the Java implementation too.
693
694
695Changes in 3.16 (released 01/21/2011)
696-------------------------------------
697
698*   The UL4 functions ``json``, ``type``, ``islist`` and ``isdict`` can now
699    handle all instances of :class:`collections.Mapping` and
700    :class:`collections.Sequence` not just :class:`tuple`, :class:`list` and
701    :class:`dict`.
702
703*   :mod:`ll.sisyphus` logging of exceptions and tracebacks should be more robust
704    against encoding problems.
705
706*   The :mod:`cssutils` version has been bumped to 0.9.7.
707
708*   ``dtd2xsc.py`` can now combine the content of more than one DTD into a
709    namespace. Handling of duplicate elements can be specified with a new
710    :option:`duplicates` option.
711
712*   ``xml2xsc.py`` can now collect the XML info from multiple XML files.
713
714*   Fixed a bug in the command line argument handling of ``dtd2xsc.py``.
715
716*   ``dtd2xsc.py`` can now handle undefined entities.
717
718*   The help message for all scripts in XIST now show the default for all options.
719
720*   Replaced the function :func:`misc.flag` with a class :class:`misc.FlagAction`
721    that can be used as the action in :meth:`argparse.ArgumentParser.add_argument`
722    calls.
723
724*   Command line options for all scripts have been enhanced: Flags without a
725    ``yes``/``no`` value now toggle the default (using the new
726    :class:`misc.FlagAction`).
727
728*   The script ``xml2xsc.py`` has a new option :option:`--defaultxmlns` for
729    setting a namespace name for elements without a namespace.
730
731*   :mod:`ll.xist.xnd` and the related scripts have seen some refactoring.
732
733
734Changes in 3.15.3 (released 11/26/2010)
735---------------------------------------
736
737*   :mod:`ll.sisyphus` now supports a non-forking mode (``--fork=no``). In this
738    mode executing the job and monitoring the maximum runtime is done by the same
739    (single) process.
740
741
742Changes in 3.15.2 (released 11/25/2010)
743---------------------------------------
744
745*   Publishing an :class:`ll.xist.ns.xml.XML` object will now always put the
746    correct encoding into the XML declaration, no matter where in the XML tree
747    the :class:`xml.XML` object sits.
748
749
750Changes in 3.15.1 (released 11/24/2010)
751---------------------------------------
752
753*   Fixed a bug in the error handling code of the UL4 compiler when an unknown
754    function or method was encountered.
755
756*   Fixed str/unicode problems with the search string in ``orafind.py``.
757
758
759Changes in 3.15 (released 11/09/2010)
760-------------------------------------
761
762*   It's now possible to create Java source code from UL4 templates with the
763    method :meth:`ll.ul4c.Template.javasource`.
764
765*   Creating source code (in Python, Javascript and Java) from UL4 templates
766    has been moved out of :class:`ll.ul4c.Template` into separate classes.
767
768*   The function :func:`ll.xist.ns.fromul4` now uses the new method
769    :meth:`ll.ul4c.Template.javasource` for generating JSP.
770
771*   The binary format for UL4 templates has changed to enhance readability.
772
773*   :func:`ll.xist.ns.jsp.javastring` has been moved to :mod:`ll.misc`.
774
775
776Changes in 3.14 (released 11/05/2010)
777-------------------------------------
778
779*   UL4 templates now have a method :meth:`jssource` that returns Javascript
780    source code. This means that now UL4 templates can be converted to: Python
781    source code, JSP source code and Javascript source code.
782
783*   Date constants in UL4 have changed. They are now written like this:
784    ``@2010-11-05T``.
785
786*   :meth:`ul4c.Template.pythonsource` no longer accepts :const:`None` as the
787    function name. The output will always be a full function.
788
789
790Changes in 3.13 (released 10/22/2010)
791-------------------------------------
792
793*   sisyphus jobs now have a new method :meth:`prefix`. This method is a context
794    manager. For the duration of the ``with`` block, the passed in prefix will be
795    prepended to all log lines.
796
797*   :mod:`ll.sisyphus` job can now log to ``stdout`` and ``stderr`` with the new
798    options :option:`-o`/:option:`--log2stdout` and
799    :option:`-e`/:option:`--log2stderr`.
800
801*   The tags that :mod:`ll.sisyphus` itself uses for logging have changed
802    slightly. For more info see the module documentation.
803
804*   The option :option:`-l` for sisyphus jobs has been renamed to :option:`-f`.
805
806
807Changes in 3.12.1 (released 10/21/2010)
808---------------------------------------
809
810*   Fixed a bug in :mod:`ll.sisyphus` when logging exceptions.
811
812
813Changes in 3.12 (released 10/21/2010)
814-------------------------------------
815
816*   The way that :mod:`ll.sisyphus` handles running jobs has changed. Jobs no
817    longer create a pid file. Avoiding duplicate running jobs is done with a file
818    lock on the script file and limiting the maximum runtime is done by forking
819    the process and monitoring the runtime in the parent process. This means that
820    a job that is past its maximum allowed runtime will not be killed by the next
821    job invocation. Instead the job will kill itself.
822
823*   A new class :mod:`ll.misc.SysInfo` has been added that provides
824    host/user/python/script information. :mod:`ll.sisyphus` uses this new
825    class.
826
827*   Changed the default output of tags in :mod:`ll.sisyphus` log files from::
828
829        [tag1, tag2, tag3]
830
831    to::
832
833        [tag1][tag2][tag3]
834
835*   The default location for :mod:`ll.sisyphus` log files has changed to
836    ``~/ll.sisyphus/projectname/jobname/``.
837
838*   :class:`ll.orasql.ForeignKey` has a new method :meth:`itercolumns` for
839    iterating over the columns the foreign key consists of.
840
841*   Fixed a bug in the ``uls`` script: For remote URLs uid and gid must be
842    resolved on the remote host.
843
844
845Changes in 3.11.1 (released 10/18/2010)
846---------------------------------------
847
848*   Fixed two bugs in the error handling for unknown XML parsing events in
849    :meth:`ll.xist.parse.Expat.__call__` and :meth:`ll.xist.parse.SGMLOP.__call__`
850    (exceptions were yielded instead of raised).
851
852*   :mod:`ll.sisyphus` jobs now don't break if they can't find the script source.
853
854
855Changes in 3.11 (released 10/15/2010)
856-------------------------------------
857
858*   :mod:`ll.sisyphus` has been rewritten. The new version supports: One log
859    file per job invocation; enhanced configuration for logging; command line
860    arguments.
861
862*   Various attributes of UL4 templates are exposed to UL4 itself.
863
864*   Fixed a bug in :meth:`ll.url.LocalConnection.rename`.
865
866
867Changes in 3.10.1 (released 10/13/2010)
868---------------------------------------
869
870*   Fixed bugs in the handling of the ``def`` and ``enddef`` opcodes in
871    :func:`ll.xist.ns.jsp.fromul4`.
872
873*   Fixed a bug in the handling of the ``render`` method in
874    :func:`ll.xist.ns.jsp.fromul4`.
875
876
877Changes in 3.10 (released 09/24/2010)
878-------------------------------------
879
880*   Python 2.7 is required now as XIST now uses set literals, set and dict
881    comprehension, the new :mod:`argparse` module and various other new features
882    of Python 2.7.
883
884*   All scripts and :mod:`ll.make` have been ported to use :mod:`argparse`.
885
886*   Fixed a bug in :mod:`ll.nightshade`. If the function/procedure didn't set an
887    encoding, the handling of the response body was totally broken (which
888    resulted in a ISO-8859-1 encoded output).
889
890*   :class:`ll.xist.parse.Tidy` now supports an additional parameter: If
891    :var:`skipbad` is true, unknown elements and attributes will be skipped.
892
893*   The random number functions ``random``, ``randrange`` and ``randchoice``
894    have been added to UL4.
895
896*   A new function :func:`ll.misc.prettycsv` has been added. It can be
897    used to pretty print the data produced by the :mod:`csv` module.
898
899
900Changes in 3.9 (released 08/04/2010)
901------------------------------------
902
903*   :class:`ll.xist.ns.html.html` will no longer change the ``lang`` and
904    ``xml:lang`` attributes. This functionality has been moved to the new element
905    :class:`ll.xist.ns.htmlspecials.html`. Furthermore this new element won't
906    change existing attributes.
907
908*   :class:`ll.xist.ns.html.title` no longer does any manipulation of its content.
909
910*   The Java string literal formatting function in :mod:`ll.xist.ns.jsp` has been
911    exposed as :func:`javastring`.
912
913*   Fixed a bug in ``oracreate.py``: If the source of procedures and functions
914    didn't have whitespace between the name and the ``(`` the ``(`` was missing
915    from the output.
916
917
918Changes in 3.8.3 (released 07/29/2010)
919--------------------------------------
920
921*   :class:`str` arguments are now always treated as ``BLOB``\s in
922    :mod:`ll.orasql` functions and procedures.
923
924
925Changes in 3.8.2 (released 06/21/2010)
926--------------------------------------
927
928*   Fixed a bug in the logging methods of :class:`ll.sisyphus.Job`: Logging
929    unicode strings didn't work. Now all strings are promoted to unicode.
930
931*   The default encoding for :class:`ll.sisyphus` log files has changed to UTF-8.
932    This can be changed by setting the class attribute :attr:`encoding` in the
933    class derived from :class:`ll.sisyphus.Job`.
934
935
936Changes in 3.8.1 (released 06/17/2010)
937--------------------------------------
938
939*   The method :meth:`ll.url.URL.import_` that had been dropped in version 3.8
940    has been reintroduced. However internally :func:`misc.module` is used for
941    creating the module object. A side effect of this is that importing from
942    non-local URLs now works::
943
944        >>> from ll import url
945        >>> u = url.URL("http://www.livinglogic.de/Python/misc/index_module.py")
946        >>> m = u.import_()
947        >>> m.last("gurk")
948        "k"
949
950
951Changes in 3.8 (released 06/15/2010)
952------------------------------------
953
954*   The parsing infrastructure has been completely rewritten to be more modular
955    and to support iterative parsing (similar to `ElementTree`__).
956
957    __ http://effbot.org/zone/element-iterparse.htm
958
959    Now parsing XML is done in a pipelined approach that looks like this::
960
961        >>> from ll.xist import xsc, parse
962        >>> from ll.xist.ns import html
963        >>> doc = parse.tree(
964        ...     parse.String("<a href='http://www.python.org/'>Python</a>")
965        ...     parse.Expat()
966        ...     parse.NS(html)
967        ...     parse.Node(pool=xsc.Pool(html))
968        ... )
969        >>> doc.bytes()
970        '<a href="http://www.python.org/">Python</a>'
971
972    Iterative parsing looks like this::
973
974        >>> from ll.xist import xsc, parse
975        >>> from ll.xist.ns import xml, html, chars
976        >>> for (evtype, path) in parse.itertree(
977        ...     parse.URL("http://www.python.org/"),
978        ...     parse.Expat(ns=True),
979        ...     parse.Node(pool=xsc.Pool(xml, html, chars)),
980        ...     filter=html.a/html.img
981        ... ):
982        ...     print path[-1].attrs.src, "-->", path[-2].attrs.href
983        http://www.python.org/images/python-logo.gif --> http://www.python.org/
984        http://www.python.org/images/trans.gif --> http://www.python.org/#left%2Dhand%2Dnavigation
985        http://www.python.org/images/trans.gif --> http://www.python.org/#content%2Dbody
986        http://www.python.org/images/donate.png --> http://www.python.org/psf/donations/
987        http://www.python.org/images/worldmap.jpg --> http://wiki.python.org/moin/Languages
988        http://www.python.org/images/success/tribon.jpg --> http://www.python.org/about/success/tribon/
989
990*   The XIST element :class:`ll.xist.ns.specials.z` has been moved to the
991    :mod:`ll.xist.ns.doc` module.
992
993*   The function :class:`ll.xist.xsc.docprefixes` has been dropped. A new
994    function :class:`ll.xist.xsc.docpool` has been added.
995
996*   The module :mod:`ll.xist.parsers` has been renamed to :mod:`parse`.
997
998*   The module :mod:`ll.xist.presenters` has been renamed to :mod:`present`.
999
1000*   The classes :class:`ll.xist.converters.Converter` and
1001    :class:`ll.xist.publishers.Publisher` has been moved to :mod:`ll.xist.xsc`.
1002    The modules :mod:`ll.xist.converters` and :mod:`ll.xist.publishers` no longer
1003    exist.
1004
1005*   The walk methods :meth:`walknode` and :meth:`walkpath` have been renamed to
1006    :meth:`walknodes` and :meth:`walkpaths` and the implemention has been moved
1007    from the nodes classes into :class:`WalkFilter`. :class:`WalkFilter` has been
1008    moved to :mod:`ll.xist.xfind`.
1009
1010*   A new selector has been added to :mod:`ll.xist.xfind`: :class:`AnySelector`
1011    outputs all nodes.
1012
1013*   Added a new function :func:`misc.module` that creates a module from source
1014    code.
1015
1016*   :class:`ll.url.Path` has been simplified: Path segments are strings instead
1017    of tuples now.
1018
1019*   The old :class:`URL` method :meth:`import_` has been removed. The new
1020    function :func:`misc.module` can now be used for that.
1021
1022*   The two classes :class:`ll.make.PoolAction` and
1023    :class:`ll.make.XISTPoolAction` have been dropped. You can use
1024    ``make.ObjectAction(misc.Pool).call()`` and
1025    ``make.ObjectAction(xsc.Pool).call()`` for that.
1026
1027*   The class :class:`XISTParseAction` has been removed. This action can be
1028    replaced by a combination of :class:`ObjectAction`, :class:`CallAction` and
1029    :class:`CallAttrAction`.
1030
1031*   Two new UL4 functions ``abs`` and ``utcnow`` have been added.
1032
1033*   A few methods have been added to UL4 date objects: ``mimeformat``, ``day``,
1034    ``month``, ``year``, ``hour``, ``minute``, ``second``, ``microsecond``,
1035    ``weekday`` and ``yearday``.
1036
1037*   Use autoboxing in the Java code generated by :mod:`ll.xist.ns.jsp.fromul4`.
1038
1039*   All code has been switched to using the :meth:`format` method instead of
1040    using the ``%`` operator.
1041
1042*   ssh URLs in :mod:`ll.url` now use the standalone :mod:`execnet` package__.
1043
1044    __ http://codespeak.net/execnet/
1045
1046*   ssh URLs now support a ``nice`` argument instead of ``ssh_config``.
1047
1048
1049Changes in 3.7.6 (released 05/14/2010)
1050--------------------------------------
1051
1052*   Fixed a bug in :class:`ll.xist.ns.htmlspecials.autopixel`.
1053
1054
1055Changes in 3.7.5 (released 04/19/2010)
1056--------------------------------------
1057
1058*   :class:`ll.orasql.PrimaryKey` has a new method :meth:`itercolumns` that
1059    returns an iterator over the columns this primary key consists of.
1060
1061
1062Changes in 3.7.4 (released 03/25/2010)
1063--------------------------------------
1064
1065*   Fixed a bug in :class:`ll.xist.ns.rss20.guid`. The ``isPermaLink`` attribute
1066    was a :class:`URLAttr`, but must be a :class:`TextAttr`.
1067
1068
1069Changes in 3.7.3 (released 02/27/2010)
1070--------------------------------------
1071
1072*   Fixed a bug in the generated JSP code for the ``def`` opcode in
1073    :func:`ll.xist.ns.jsp.fromul4`.
1074
1075
1076Changes in 3.7.2 (released 02/26/2010)
1077--------------------------------------
1078
1079*   Fixed two bugs in the XML codecs:
1080
1081    -   An externally specified encoding wasn't honored in the incremental decoder.
1082
1083    -   Fixed reset() for incremental codecs: If encoding has been changed during
1084        parsing in the incremental codecs it now gets reset to its proper initial
1085        value.
1086
1087*   Fixed a bug in the handling of the UL4 opcode ``addlist`` in
1088    :func:`ll.xist.ns.jsp.fromul4`.
1089
1090*   Added missing processing instruction class for the UL4 ``def`` tag to the
1091    :mod:`ll.xist.ns.ul4` namespace module.
1092
1093*   The generated JSP code for the ``loadvar`` opcode now uses the Java method
1094    ``Utils.getItem``, so that non-existent variables no longer get treated as
1095    ``None``/``null``.
1096
1097
1098Changes in 3.7.1 (released 02/08/2010)
1099--------------------------------------
1100
1101*   :func:`ll.xist.ns.jsp.fromul4` now outputs the correct code for calling the
1102    ``format`` method on date objects (This requires version exp-22 of the
1103    UL4 Java package).
1104
1105
1106Changes in 3.7 (released 09/10/2009)
1107------------------------------------
1108
1109*   In UL4 templates it's now possible to define locale templates via
1110    ``<?def tmpl?>templatecode<?end def?>``.
1111
1112*   Python 2.6 is required now.
1113
1114*   :mod:`ll.orasql` and :mod:`ll.nightshade` are now part of the distribution.
1115
1116*   :mod:`ll.make` has a new Action class: :class:`ObjectAction` simply returns
1117    an existing object.
1118
1119*   The following classes have been removed from :mod:`ll.make`:
1120    :class:`EncodeAction`, :class:`DecodeAction`, :class:`EvalAction`,
1121    :class:`GZipAction`, :class:`GUnzipAction`,
1122    :class:`JavascriptMinifyAction`, :class:`XISTBytesAction`,
1123    :class:`XISTStringAction`, :class:`JoinAction`, :class:`UnpickleAction`,
1124    :class:`PickleAction`, :class:`TOXICAction`, :class:`TOXICPrettifyAction`,
1125    :class:`SplatAction`, :class:`UL4CompileAction`, :class:`UL4RenderAction`,
1126    :class:`UL4DumpAction`, :class:`UL4LoadAction`, :class:`XISTTextAction` and
1127    :class:`XISTConvertAction`. All of these actions can be executed by using
1128    :class:`CallAction` or :class:`CallAttrAction`.
1129
1130*   :class:`ll.make.PipeAction` has been renamed to :class:`TransformAction`.
1131
1132*   The new :class:`ll.make.PipeAction` pipes the input through an external
1133    command.
1134
1135*   :class:`ll.make.FileAction` now automatically wraps the :var:`key` argument
1136    into an :class:`URL` object.
1137
1138*   :class:`ll.make.FileAction` has two new methods :meth:`chmod` and
1139    :meth:`chown` that return a :class:`ModeAction` and :class:`OwnerAction`
1140    for modifying the file created by the :class:`FileAction`.
1141
1142*   :class:`ll.make.Action` has three new methods: :meth:`call`, :meth:`getattr`
1143    and :meth:`callattr` create a :class:`CallAction`, :class:`GetAttrAction`
1144    or :class:`CallAttrAction` object respectively.
1145
1146*   The division operator is no longer implemented for :class:`Action` objects
1147    in :mod:`ll.make`.
1148
1149*   Two new UL4 functions have been added: ``float`` and ``iscolor``.
1150
1151*   Two new scripts have been added: ``uls`` can be used to list any directory
1152    given as an URL. ``ucat`` can be used to output any file or directory.
1153
1154*   The script ``ucp`` now changes the user and group only if a user or group is
1155    given.
1156
1157*   A bug in the 64-bit support for :mod:`sgmlop` has been fixed.
1158
1159*   Fixed a bug in the remote :meth:`stat` method for ssh URLs (it seems that
1160    the :class:`posix.stat_result` tuple objects can no longer be pickled).
1161
1162*   There's a new function :func:`misc.itersplitat` for splitting a string at
1163    specified positions.
1164
1165*   For ssh URLs a keyword argument ``ssh_config`` is supported now instead of
1166    ``identity`` (This mirrors the corresponding change in the py__ library)
1167
1168    __ http://codespeak.net/py/dist/
1169
1170
1171Changes in 3.6.6 (released 07/09/2009)
1172--------------------------------------
1173
1174*   Fixed handling of empty pid files in :mod:`ll.sisyphus` (Fixes issue #11
1175    reported by Jarek Zgoda).
1176
1177
1178Changes in 3.6.5 (released 06/02/2009)
1179--------------------------------------
1180
1181*   Fix UL4 templates that produce no output: As the generated Python sourcecode
1182    didn't contain any ``yield`` statements, the resulting function was an
1183    ordinary function instead of a generator.
1184
1185
1186Changes in 3.6.4 (released 03/19/2009)
1187--------------------------------------
1188
1189*   A new UL4 method ``join`` has been added. It works like the Python string
1190    method join.
1191
1192*   :mod:`ll.misc` has three new functions: :func:`gzip` und :func:`gunzip` can
1193    be used for compressing and uncompressing byte strings with gzip.
1194    :func:`jsmin` can be used to minify Javascript source.
1195
1196*   Parsing an empty string with ``tidy=True`` in
1197    :func:`ll.xist.parsers.parsestring` now works again.
1198
1199
1200Changes in 3.6.3 (released 03/02/2009)
1201--------------------------------------
1202
1203*   The xfind operators ``attrhasvalue````attrhasvalue_xml``,
1204    ``attrcontains``, ``attrcontains_xml``, ``attrstartswith``,
1205    ``attrstartswith_xml``, ``attrendswith``, ``attrendswith_xml``, ``hasid``
1206    and ``hasclass`` now support multiple values. The operator matches the
1207    node if it matches with any of the given values.
1208
1209*   A new function ``reversed`` is now available in UL4 templates. It returns
1210    an iterator that will output the items of any sequence in reverse order.
1211
1212
1213Changes in 3.6.2 (released 02/16/2009)
1214--------------------------------------
1215
1216*   Inside UL4 templates rendering other templates can now be done with the new
1217    ``render`` method. This method returns the template output as a string.
1218    Passing parameters can be done via keyword arguments or with the ``**``
1219    syntax like when using the ``render`` tag.
1220
1221*   A new version of the ``int`` function has been added to UL4: When called with
1222    two arguments, the first must be a string, and the second is treated as the
1223    base for the conversion.
1224
1225
1226Changes in 3.6.1 (released 01/27/2009)
1227--------------------------------------
1228
1229*   Generating the Python source from an UL4 template is now 20-25% faster.
1230
1231*   Fixed a buffer overrun in the C portions of the url module.
1232
1233*   Added a class :class:`addattr` to :mod:`ll.xist.xsc`. This can be used
1234    to extend XML attributes via ``with`` blocks.
1235
1236*   Added the function :func:`ll.xist.ns.jsp.fromul4` which can turn an UL4
1237    template into JSP source code.
1238
1239
1240Changes in 3.6 (released 12/31/2008)
1241------------------------------------
1242
1243*   The following :class:`Color` class methods have been dropped: ``fromrgba``,
1244    ``fromrgba4``, ``fromrgba8``, ``fromint4``, ``fromint8``.
1245
1246*   The following :class:`Color` properties have been dropped: ``r4``, ``g4``,
1247    ``b4``, ``a4``, ``r8``, ``g8``, ``b8``, ``a8``, ``r``, ``g``, ``b````a``
1248    ``int4``, ``int8``, ``rgb4``, ``rgba4``, ``rgb8``, and ``rgba8``. The new
1249    methods ``r``, ``g``, ``b`` and ``a`` return the 8 bit component values.
1250
1251*   The class methods ``fromhsva`` and ``fromhlsa`` have been renamed to
1252    ``fromhsv`` and ``fromhls``.
1253
1254*   The property ``css`` has been dropped. Instead the CSS string is returned
1255    by ``__str__``.
1256
1257*   Dividing colors now does a scalar division. Blending colors is now done with
1258    the modulo operator.
1259
1260*   Support for color objects has been added to UL4.
1261
1262*   The XPIT templating language and :class:`ll.make.XPITAction` have been
1263    removed.
1264
1265*   Fixed a bug in :meth:`ll.make.CacheAction.get`: The action must return real
1266    data when called with ``bigbang`` as the timestamp.
1267
1268*   :class:`ll.make.UL4RenderAction` has been fixed.
1269
1270
1271Changes in 3.5 (released 12/05/2008)
1272------------------------------------
1273
1274*   A new function ``json`` has been added to UL4: This function returns a
1275    JSON dump of the object passed in (this requires either :mod:`simplejson`
1276    or Python 2.6).
1277
1278*   The UL4 function ``csvescape`` has been renamed to ``csv``.
1279
1280*   A new option :option:`--showregistration`/:option:`-r` has been added to
1281    make scripts.
1282
1283*   :mod:`ll.make` now supports Growl__ notifications on Mac OS X. To activate
1284    it set the ``LL_MAKE_GROWL`` environment variable to ``1`` or use the ``-g``
1285    or ``--growl`` options.
1286
1287    __ http://growl.info/
1288
1289*   :mod:`ll.make` has a new action class :class:`JavascriptMinifyAction` for
1290    minimizing Javascript source.
1291
1292*   :class:`ll.color.Color` has been rewritten to create immutable objects
1293    with the components being 8 bit values (i.e. 0-255) instead of floating
1294    point values between 0 and 1. An alpha component has been added.
1295
1296*   A ``strong`` element has been added to the :mod:`ll.xist.ns.doc`
1297    namespace.
1298
1299
1300Changes in 3.4.4 (released 09/16/2008)
1301--------------------------------------
1302
1303*   Fixed a bug in :meth:`ll.make.JoinAction.execute`.
1304
1305
1306Changes in 3.4.3 (released 09/09/2008)
1307--------------------------------------
1308
1309*   :func:`css.applystylesheets` could no longer handle style declarations
1310    containing comments. This has been fixed now.
1311
1312
1313Changes in 3.4.2 (released 09/03/2008)
1314--------------------------------------
1315
1316*   Parsing didn't work when :var:`tidy` was set to true and a :var:`base`
1317    argument was given. This has been fixed now.
1318
1319
1320Changes in 3.4.1 (released 08/29/2008)
1321--------------------------------------
1322
1323*   Bugs with thread local storage have been fixed so using :class:`xsc.Pool`,
1324    :class:`xsc.build` and URL contexts in ``with`` blocks in multithreaded
1325    applications should work now.
1326
1327
1328Changes in 3.4 (released 08/19/2008)
1329------------------------------------
1330
1331*   Templates can no longer be passed as a separate dictionary to UL4 templates
1332    but are passed as variables like other data objects too.
1333
1334*   Strings in UL4 have gained a new method ``capitalize``.
1335
1336*   Printing XML escaped strings in UL4 has now gained its own tag and opcode.
1337    ``<?printx foo?>`` is equivalent to ``<?print xmlescape(foo)?>``.
1338
1339*   Exception handling in UL4 has been rewritten to allow proper error reporting
1340    when calling nested templates.
1341
1342*   UL4 has gained a new function ``zip``. It can be called with two or three
1343    arguments and does what :func:`itertools.zip` does.
1344
1345*   UL4 has gained another new function: ``type`` returns the type of its
1346    argument as a string.
1347
1348*   UL4 now supports tuple unpacking in ``<?for?>`` tags with three variables.
1349
1350*   UL4 has a new tag for comments: ``<?note This is comment?>``.
1351
1352*   A new script ``db2ul4.py`` has been added that can render UL4 templates with
1353    database content.
1354
1355*   In UL4s ``<?render?>`` tags it's now possible to pass along a complete
1356    argument dictionary via the ``**arg`` syntax just like in Python. This syntax
1357    can even be used multiple times in the call. This syntax is available in
1358    dictionary literals too, i.e. ``{1:2, 3:4}`` and ``{**{1:2}, **{3:4}}`` are
1359    equivalent.
1360
1361*   A new UL4 function ``get`` has been added that works similar to the
1362    dictionary method ``get``, but works with global variables.
1363
1364*   The missing processing instruction :class:`render` has been added to
1365    :mod:`ll.xist.ns.ul4`.
1366
1367*   :mod:`xml_codec` now partially works, even if the C module is missing. As
1368    long as you explicitly specify an encoding on parsing and publishing it
1369    should work.
1370
1371*   A new processing instruction class :class:`ll.xist.AttrProcInst` has been
1372    introduced. When an :class:`AttrProcInst` node is the first node in an
1373    attribute, it takes over publishing of the attribute. In all other cases
1374    the processing instruction disappears completely. UL4 uses this to implement
1375    "conditional attributes" (via the new classes :class:`attr_if` and
1376    :class:`attr_ifnn`).
1377
1378*   Building trees with ``with`` blocks has changed slightly. Nodes used in
1379    ``with`` blocks and with ``+`` are now passed to a ``with`` handler instead
1380    of building the tree directly. This fixes a problem when nested
1381    :meth:`convert` calls use ``with`` blocks.
1382
1383*   The element :class:`ll.xist.ns.form.memo` has been renamed to
1384    :class:`textarea` and :class:`ll.xist.ns.form.edit` has been renamed to
1385    :class:`text`. Classes :class:`ll.xist.ns.form.button` and
1386    :class:`ll.xist.ns.form.file` have been added.
1387
1388*   Iterating through the inputs in :mod:`ll.make` actions has been fixed (i.e.
1389    the additional inputs will be output too). :meth:`ll.make.Project.findpaths`
1390    has been fixed to work with non-:class:`ll.make.Action` inputs. (This means
1391    that now you *have* to pass a real registered target action to
1392    :meth:`findpaths` not just its key).
1393
1394*   :mod:`ll.make` has gained a new action: :class:`XISTStringAction` publishes
1395    an XIST node as a unicode string. :class:`XISTPublishAction` has been renamed
1396    to :class:`XISTBytesAction`.
1397
1398*   Fixed a bug in the caching logic in :meth:`ll.make.CacheAction`.
1399
1400*   :class:`ll.make.CallMethAction` has been renamed to :class:`CallAttrAction`
1401    because it can be used to e.g. call functions in a module too.
1402
1403*   The properties ``showaction``, ``showstep`` and ``shownote`` of
1404    :class:`ll.make.Project` object can now be assigned booleans as well (which
1405    results in *all* or *no* actions being shown.
1406
1407*   The version number for :mod:`cssutils` has been bumped to 0.9.5.1.
1408
1409
1410Changes in 3.3.2 (released 07/15/2008)
1411--------------------------------------
1412
1413*   Dictionaries in UL4 have gained a new method ``get``.
1414
1415*   The version number for :mod:`cssutils` has been bumped again (to 0.9.5rc2
1416    or a later 0.9.5 version).
1417
1418*   Fixed a bug in the parsing of slice expressions in UL4.
1419
1420*   :mod:`ll.make` has gained a new :class:`UL4RenderAction` action.
1421
1422*   Fixed a bug in the formatting for the ``getslice2`` opcode for UL4.
1423
1424
1425Changes in 3.3.1 (released 07/14/2008)
1426--------------------------------------
1427
1428*   Fixed a bug in the implementation of the "not" operator in UL4.
1429
1430*   When the UL4 compiler encounters unclosed blocks, it will now include the
1431    start location of the block in the error message.
1432
1433
1434Changes in 3.3 (released 07/11/2008)
1435------------------------------------
1436
1437*   XIST has gained its fourth templating language: ``UL4`` the
1438    "Universal Layout Language". This templating language is similar in
1439    capabilities to `Djangos templating language`__. However ``UL4`` templates
1440    are compiled to a bytecode format, which makes it possible to implement
1441    template renderers in other languages and makes the template code "secure"
1442    (i.e.template code can't open or delete files).
1443
1444    __ http://www.djangoproject.com/documentation/templates/
1445
1446*   :mod:`ll.make` has gained new actions: :class:`GZipAction`,
1447    :class:`GUnzipAction`, :class:`CallFuncAction`:class:`CallMethAction`,
1448    :class:`UL4CompileAction`, :class:`UL4DumpAction` and :class:`UL4LoadAction`.
1449
1450*   The version number for :mod:`cssutils` has been bumped to 0.9.5rc1.
1451
1452*   Nodes of type :class:`ll.xist.xsc.Comment` and :class:`ll.xist.xsc.DocType`
1453    inside of attributes are now simply ignored when publishing instead of
1454    generating an exception.
1455
1456*   All actions in :mod:`ll.make` no longer check whether their inputs are
1457    action objects. Non-action objects are simply treated as ancient input data.
1458    This also means that most action classes have an :var:`input` parameter in
1459    their constructor again, as this input could now be a constant.
1460
1461*   Most attributes of action objects in :mod:`ll.make` can now be action objects
1462    themselves, so for example the name of the encoding to be used in an
1463    :class:`EncodeAction` can be the output of another action.
1464
1465*   :class:`ll.make.ImportAction` has been dropped as now the module object can
1466    be used directly (e.g. as the input for an :class:`XISTPoolAction` object).
1467
1468*   :func:`ll.misc.xmlescape` now escapes ``'`` as ``&#39;`` for IE compatibility.
1469
1470*   Functions :func:`ll.misc.xmlescape_text` and :func:`ll.misc.xmlescape_attr`
1471    have been added that implement the functionality from XIST 3.2.5 and earlier.
1472
1473*   The default parser for XIST is expat now. To switch back to sgmlop simply
1474    pass an :class:`SGMLOPParser` object to the parsing functions::
1475
1476        >>> from ll.xist import parsers
1477        >>> node = parsers.parsestring("<a>", parser=parsers.SGMLOPParser())
1478
1479*   TOXIC has been split into a compiler module :mod:`ll.toxicc` and an XIST
1480    namespace :mod:`ll.xist.ns.toxic`. TOXIC now supports output for
1481    SQL Server. The function :func:`xml2ora` as been renamed to :func:`compile`
1482    (and has a new :var:`mode` argument for specifying the database type).
1483
1484*   The :var:`targetroot` parameter for :meth:`ll.make.XISTConvertAction.__init__`
1485    has been renamed to :var:`root`.
1486
1487
1488Changes in 3.2.7 (released 05/16/2008)
1489--------------------------------------
1490
1491*   Added the missing file ``_misc_include.c`` to the distribution archives.
1492
1493
1494Changes in 3.2.6 (released 05/07/2008)
1495--------------------------------------
1496
1497*   A new action class :class:`EvalAction` has been added to :mod:`ll.make`.
1498
1499*   :func:`ll.xist.helpers.escapetext` and :func:`ll.xist.helpers.escapeattr`
1500    have been merged into one function that escapes all special characters
1501    (including ``'`` and ``"``) and has been renamed/moved to
1502    :func:`ll.misc.xmlescape`.
1503
1504*   Python versions of all the functions in the module :mod:`ll.misc` have been
1505    added. Those versions will be used in case the C module is not available.
1506
1507
1508Changes in 3.2.5 (released 04/11/2008)
1509--------------------------------------
1510
1511*   A refcounting bug in the attribute parsing code of :mod:`sgmlop` has been
1512    fixed.
1513
1514*   The helper function :func:`cssescapereplace` has been removed, as it's no
1515    longer needed.
1516
1517*   Pure Python versions of :func:`helpers.excapetext` and
1518    :func:`helpers.escapeattr` have been added, in case the C module is not
1519    available.
1520
1521
1522Changes in 3.2.4 (released 04/02/2008)
1523--------------------------------------
1524
1525*   The following functions have been added to :mod:`ll.xist.css`:
1526    :func:`parsestring`, :func:`parsestream`, :func:`parsefile`, :func:`parseurl`
1527    and :func:`write`. They parse CSS resources and are similar to the XML/HTML
1528    parsing functions in that they apply the specified base URL to all URLs in
1529    the style sheet.
1530
1531*   :mod:`cssutils` 0.9.5b2 is required now.
1532
1533*   :func:`ll.xist.css.iterrules` and :func:`ll.xist.css.applystylesheets` now
1534    support specifying whether the preferred stylesheets or an alternate
1535    stylesheet group should be used.
1536
1537*   :meth:`ll.xist.xsc.ProcInst.__mul__` and
1538    :meth:`ll.xist.xsc.ProcInst.__rmul__` now return a fragment containing
1539    the node repeated a number of times instead of one processing instruction
1540    node containing repeated content.
1541
1542*   The constructor for :class:`ll.xist.parsers.ExpatParser` now takes two
1543    additional arguments:
1544
1545    :var:`xmldecl`
1546        If this is true the XML declaration will appear in the resulting XIST
1547        tree.
1548
1549    :var:`doctype`
1550        If this is true the doctype declaration will appear in the resulting
1551        XIST tree (however any internal DTD subset will be dropped).
1552
1553
1554Changes in 3.2.3 (released 03/04/2008)
1555--------------------------------------
1556
1557*   :mod:`cssutils` 0.9.5 is used now. This simplifies the implementation of
1558    :func:`css.selector`.
1559
1560*   A function :func:`ll.xist.css.geturls` has been added. This returns a list of
1561    all the URLs in a :mod:`cssutils` stylesheet.
1562
1563*   :func:`toxic.xml2ora` now treats unknown processing instructions as text.
1564    This makes it possible to e.g. output an XML header via toxic.
1565
1566*   The pseudo-elements in :mod:`ll.xist.ns.jsp` are no longer in a namespace,
1567    so they will always be published without any prefixes.
1568
1569
1570Changes in 3.2.2 (released 02/25/2008)
1571--------------------------------------
1572
1573*   A new method :meth:`replaceurls` has been added to
1574    :class:`ll.xist.xsc.StyleAttr`. With this method all URLs in a ``style``
1575    attribute can be replaced.
1576
1577*   Fixed a bug in :meth:`ll.xist.parsers.SGMLOPParser.begin`: The encoding
1578    wasn't passed properly to the XML decoder.
1579
1580*   :meth:`ll.xist.xsc.ProcInst.publish` now calls the :meth:`checkvalid`
1581    method too.
1582
1583
1584Changes in 3.2.1 (released 02/05/2008)
1585--------------------------------------
1586
1587*   It's now possible to force the publisher to output certain ``xmlns``
1588    attributes via the :var:`showxmlns` argument to the :class:`Publisher`
1589    constructor.
1590
1591
1592Changes in 3.2 (released 02/01/2008)
1593------------------------------------
1594
1595*   The core package has been moved into XIST, installing XIST now only requires
1596    *one* package.
1597
1598*   :mod:`ll.toxic` has been moved into XIST and is now available as
1599    :mod:`ll.xist.ns.toxic`.
1600
1601*   When a :class:`ll.make.XISTParseAction` object is executed the content of
1602    the pool will now be extended by the content of the pool from the
1603    :class:`XISTPoolAction` instead of being replaced.
1604
1605*   :class:`ll.make.Pool` and :class:`ll.xist.xsc.Pool` no longer use a
1606    :class:`WeakValueDictionary`, but a simple :class:`dict`. This means they
1607    can now store *any* object. A method :meth:`clear` has been added, which
1608    removes all registered objects.
1609
1610*   Fixed a bug in :func:`ll.xist.css.iterrules` that surfaced when a
1611    :var:`base` argument was given.
1612
1613*   Fixed a second bug in :func:`ll.xist.css.iterrules` where the ``href`` of a
1614    :class:`link` element wasn't applied to the URLs in the stylesheet.
1615
1616
1617Changes in 3.1 (released 01/18/2008)
1618------------------------------------
1619
1620*   Fixed the problem that the source distibution didn't include header files.
1621
1622*   If an :class:`URLAttr` attribute contains a processing instruction XIST
1623    will no longer transform the URL in any way.
1624
1625*   Fixed a parser bug where attributes were dropped when the attribute value
1626    was empty.
1627
1628*   Putting a module into a :class:`Pool` object now copies the ``xmlns``
1629    attribute too. This makes it possible to use :class:`Pool` objects as
1630    conversion targets.
1631
1632
1633Changes in 3.0 (released 01/07/2008)
1634------------------------------------
1635
1636*   Namespaces have been greatly simplified. There are no namespace modules any
1637    longer. An element class can be assigned a namespace by setting the
1638    ``xmlns`` class attribute to the namespace name. Global attributes can be
1639    assigned a namespace by setting the ``xmlns`` attribute on the attribute
1640    class itself (*not* on the :class:`Attrs` class). The classes
1641    :class:`Prefixes` and :class:`NSPool` are gone too. Instead a new class
1642    :class:`Pool` is used to specify which classes should be used for parsing.
1643
1644*   Dependency on PyXML_ has finally been dropped. XIST now uses its own XML
1645    parsing API. Two parsers are available: One based on expat_ and one based on
1646    a custom version of sgmlop_.
1647
1648    .. _PyXML: http://pyxml.sf.net/
1649    .. _expat: http://expat.sourceforge.net/
1650    .. _sgmlop: http://effbot.org/zone/sgmlop-index.htm
1651
1652*   Tree traversal has been rewritten again. XFind expressions involving
1653    multiple uses of ``//`` now work correctly. The method :meth:`walk` now
1654    doesn't yield :class:`Cursor` objects, but simple path lists (actually it's
1655    always the same list, if you want distinct lists use :meth:`walkpath`).
1656    Applying XFind expressions to nodes directly is no longer supported, you
1657    have to call :meth:`walk`, :meth:`walknode` or :meth:`walkpath` with the
1658    XFind expression instead. Many XFind operators have been renamed and/or
1659    reimplemented (see the documentation for the :mod:`xfind` module for more
1660    information).
1661
1662*   The methods :meth:`__getitem__`, :meth:`__setitem__` and :meth:`__delitem__`
1663    for :class:`Frag` and :class:`Element` now support the new walk filters, so
1664    you can do:
1665
1666    *   ``del node[html.p]`` to delete all :class:`html.p` child elements of
1667        ``node``;
1668    *   ``del node[html.p[2]]`` to delete only the third :class:`html.p`;
1669    *   ``node[xfind.hasclass("note")] = html.p("There was a note here!")`` to
1670        replace several child nodes with a new one;
1671    *   ``for c in node[xfind.empty]: print c.bytes()`` to print all empty
1672        (element) children of ``node``;
1673    *   ``del node[node[0]]`` to delete the first child node (which is silly,
1674        but illustrates that you can pass a node to get/replace/delete that
1675        node);
1676
1677*   A new module :mod:`ll.xist.css` has been added which contains CSS related
1678    functionality: The generator function :func:`iterrules` can be passed an
1679    XIST tree and it will produce all CSS rules defined in any
1680    :class:`html.link` or :class:`html.style` elements or imported by them
1681    (via the CSS rule ``@import``). This requires the :mod:`cssutils` package.
1682
1683*   The function :func:`applystylesheets` modifies the XIST tree passed in by
1684    removing all CSS (from :class:`html.link` and :class:`html.style` elements
1685    and their ``@import``\ed stylesheets) and putting the styles into ``style``
1686    attributes of the affected elements instead.
1687
1688*   The function :func:`selector` returns a tree walk filter from a CSS selector
1689    passed in as a string.
1690
1691*   Constructing trees can now be done with ``with`` blocks. Code looks like
1692    this::
1693
1694        with xsc.Frag() as node:
1695            +xml.XML()
1696            +html.DocTypeXHTML10transitional()
1697            with html.html():
1698                with html.head():
1699                    +meta.contenttype()
1700                    +html.title("Example page")
1701                with html.body():
1702                    +html.h1("Welcome to the example page")
1703                    with html.p():
1704                        +xsc.Text("This example page has a link to the ")
1705                        +html.a("Python home page", href="http://www.python.org/")
1706                        +xsc.Text(".")
1707
1708        print node.conv().bytes(encoding="us-ascii")
1709
1710    Also the function :func:`xsc.append` has been renamed to :func:`add` and
1711    supports ``with`` blocks now instead of XPython__.
1712
1713    __ http://codespeak.net/svn/user/hpk/talks/xpython-talk.txt
1714
1715*   A subset of ReST__ is supported now for docstrings when using the
1716    :mod:`ll.xist.ns.doc` module. The module attribute :attr:`__docformat__`
1717    is now honored (Set it to ``"xist"`` to get XIST docstrings).
1718
1719    __ http://docutils.sourceforge.net/rst.html
1720
1721*   Many classes in the :mod:`ll.xist.ns.doc` have been renamed to more
1722    familiar names (from HTML, XHTML 2 or ReST).
1723
1724*   The ``media`` attribute of :class:`html.link` and :class:`html.style` now
1725    has a method :meth:`hasmedia`.
1726
1727*   The node method :meth:`asBytes` has been renamed to :meth:`bytes` and
1728    :meth:`bytes` has been renamed to :meth:`iterbytes`.
1729
1730*   The node method :meth:`asString` has been renamed to :meth:`string` and a
1731    new method :meth:`iterstring` has been added.
1732
1733*   :class:`ll.xist.ns.xml.XML10` is gone now. Use :class:`ll.xist.ns.xml.XML`
1734    instead.
1735
1736*   :func:`xsc.tonode` now will raise an exception when it can't handle an
1737    argument instead of issuing a warning.
1738
1739*   A class attribute :attr:`empty` inside element classes will now no longer
1740    get converted into :attr:`model`.
1741
1742*   :class:`ll.xist.ns.doc.pyref` now copes better with decorated methods.
1743
1744*   The deprecated :class:`Element` methods :meth:`hasAttr`, :meth:`hasattr`,
1745    :meth:`isallowedattr`, :meth:`getAttr`, :meth:`getattr`,
1746    :meth:`setDefaultAttr`, :meth:`setdefaultattr`, :meth:`attrkeys`,
1747    :meth:`attrvalues`, :meth:`attritems`, :meth:`iterattrkeys`,
1748    :meth:`iterattrvalues`, :meth:`iterattritems`, :meth:`allowedattrkeys`,
1749    :meth:`allowedattrvalues`, :meth:`allowedattritems`,
1750    :meth:`iterallowedattrkeys`, :meth:`iterallowedattrvalues`,
1751    :meth:`iterallowedattritems` and :meth:`copyDefaultAttrs` have been removed.
1752    The deprecated :class:`Attrs` method :meth:`copydefaults` has been removed
1753    too.
1754
1755*   The namespace module :mod:`ll.xist.ns.cond` has been removed.
1756
1757*   When calling the function :func:`ll.xist.parsers.parseURL` the arguments
1758    :var:`headers` and :var:`data` are now passed along to the parser's method
1759    only if they are specified. This makes it possible to pass ssh URLs to
1760    :func:`ll.xist.parsers.parseURL`.
1761
1762*   The methods :meth:`withnames` and :meth:`withoutnames` have been split into
1763    two that take Python names and two that take XML names. Multiple arguments
1764    are used now (instead of one argument that must be a sequence). Passing a
1765    namespace to remove all attributes from the namespace is no longer
1766    supported.
1767
1768*   The :class:`Attrs` methods :meth:`updatenew` and :meth:`updatexisting` have
1769    been removed.
1770
1771
1772Changes in 2.15.5 (released 07/17/2007)
1773---------------------------------------
1774
1775*   The Python quotes example no longer contains the XML source or the
1776    generated HTML.
1777
1778
1779Changes in 2.15.4 (released 07/16/2007)
1780---------------------------------------
1781
1782*   The Python quotes example now always parses the file from the original URL.
1783
1784*   The Python quotes and the media example now print the result to ``stdout``.
1785
1786
1787Changes in 2.15.3 (released 07/16/2007)
1788---------------------------------------
1789
1790*   Use a consistent license (MIT) everywhere. This should make XIST Debian
1791    compatible.
1792
1793*   Change the Python quotes example, so that it works even if there's no
1794    :file:`python-quotes.xml` in the current directory.
1795
1796
1797Changes in 2.15.2 (released 01/24/2007)
1798---------------------------------------
1799
1800*   Fixed a bug in :meth:`presenters.CodePresenter.__str__`.
1801
1802*   Fixed base URL handling for tidy parsing.
1803
1804*   Updated examples.
1805
1806*   Updated :func:`xiter` and :func:`xattrs` implementations for :class:`Node`
1807    and :class:`Namespace` to conform to the newest version of IPython.
1808
1809
1810Changes in 2.15.1 (released 09/25/2006)
1811---------------------------------------
1812
1813*   Fixed a few bugs in the :mod:`sgmlop` function declarations.
1814
1815*   Readded the spacer pixel.
1816
1817
1818Changes in 2.15 (released 09/24/2006)
1819-------------------------------------
1820
1821*   XIST has been made compatible with Python 2.5: Code has been updated
1822    to use the proper C API for memory management and :pep:`353` support has
1823    been added. XIST now includes its own fixed version of :mod:`sgmlop`.
1824
1825*   The :class:`ll.xist.xsc.Attrs` methods :meth:`with` and :meth:`without` have
1826    been renamed to :meth:`withnames` and :meth:`withoutnames` for Python 2.5
1827    compatibility.
1828
1829*   :class:`ll.xist.ns.htmlspecials.pixel` no longer handles colors via
1830    different GIFs. It uses the ``background-color`` in the ``style`` attribute
1831    instead. The same change has been implemented for
1832    :class:`ll.xist.ns.htmlspecials.autopixel`. It's now possible to overwrite
1833    the default ``src`` attribute value of ``root:px/spc.gif`` either via the
1834    XML attribute or via the converter context.
1835
1836*   The node method :meth:`asText` has been made a function, moved into the
1837    :mod:`html` namespace and renamed to :func:`astext`. Furthermore elinks_ is
1838    used for plain text formatting now instead of w3m_.
1839
1840    .. _elinks: http://elinks.or.cz/
1841    .. _w3m: http://w3m.sf.net/
1842
1843
1844Changes in 2.14.2 (released 07/04/2006)
1845---------------------------------------
1846
1847*   Fixed a bug in the :meth:`presentAttr` method of
1848    :class:`ll.xist.presenters.TreePresenter`.
1849
1850
1851Changes in 2.14.1 (released 06/29/2006)
1852---------------------------------------
1853
1854*   Fixed a bug in the :meth:`presentEntity` method of
1855    :class:`ll.xist.presenters.CodePresenter`.
1856
1857*   Updated installation instructions.
1858
1859
1860Changes in 2.14 (released 06/28/2006)
1861-------------------------------------
1862
1863*   Namespaces for RSS 0.91, RSS 2.0 and Atom 1.0 have been added.
1864
1865*   A new namespace :mod:`ll.xist.ns.detox` has been added that is similar to
1866    :mod:`ll.toxic` but can be used to generate Python code instead of
1867    PL/SQL code. Using :mod:`detox` templates is about 50 times faster than
1868    using XIST trees directly and about 10 times faster than Kid__.
1869
1870    __ http://kid.lesscode.org/
1871
1872*   Presenters are now compatible to IPython__ :mod:`ipipe` module. This means
1873    that you can browse XIST trees interactively if you have IPython installed.
1874    :class:`NormalPresenter` and the :class:`Node` methods :meth:`repr` and
1875    :meth:`asrepr` have been removed.
1876
1877    __ http://ipython.scipy.org/
1878
1879*   A new processing instruction :class:`ll.xist.ns.specials.url` has been added
1880    that does the same URL transformation as :class:`ll.xist.xsc.URLAttr` does.
1881
1882*   On publishing :class:`ll.xist.ns.html.html` now only adds a ``lang`` and
1883    ``xml:lang`` attribute, if neither of them exists.
1884
1885*   :mod:`setuptools` is now supported for installation.
1886
1887
1888Changes in 2.13 (released 10/31/2005)
1889-------------------------------------
1890
1891*   :meth:`ll.xist.xsc.Namespace.tokenize` requires a :class:`unicode` object
1892    as input now. This makes it possible to use encodings that are not ASCII
1893    compatible (such as UTF-16). The :var:`encoding` argument is gone.
1894
1895*   :meth:`ll.xist.xsc.Node.asString` uses the :var:`encoding` argument to
1896    determine which characters have to be output as character references
1897    now. (You'll still get a unicode object as the result.)
1898
1899*   A new processing instruction class :class:`ll.xist.ns.specials.literal` has
1900    been added, that will output its content literally when published. This can
1901    be used for embedding preformatted XML (e.g. from a database) into an XIST
1902    tree.
1903
1904
1905Changes in 2.12 (released 10/13/2005)
1906-------------------------------------
1907
1908*   Namespaces for `Relax NG`_ and Kid_ have been added.
1909
1910    .. _Relax NG: http://www.relaxng.org/
1911    .. _Kid: http://kid.lesscode.org/
1912
1913*   XIST requires version 1.0 of the core package now.
1914
1915*   The class name for the DocBook DTD class has been fixed.
1916
1917
1918Changes in 2.11 (released 07/29/2005)
1919-------------------------------------
1920
1921*   A script :file:`xml2xsc.py` has been added, that can be used to parse an
1922    XML file and generate a rudimentary XIST namespace from it.
1923
1924*   A :class:`DocType` for XHTML 1.1 has been added (suggested by Elvelind
1925    Grandin).
1926
1927*   Line number information is now added when parsing HTML.
1928
1929*   The :meth:`sorted` method now supports the same arguments (:var:`cmp`,
1930    :var:`key` and :var:`reverse`) as :meth:`list.sort` and :func:`sorted`
1931    in Python 2.4.
1932
1933*   The :meth:`walk` doesn't yield the node directly, but yields a :class:`Cursor`
1934    object now, with has several ways of referencing the node.
1935
1936*   New methods :meth:`walknode`, :meth:`walkpath` and :meth:`walkindex` have
1937    been added.
1938
1939*   Presenters use an iterator API instead of a stream API now. Dumping an
1940    XML tree presentation to the terminal can now start immediately instead
1941    of having to wait for the complete string to be formatted.
1942
1943*   Fixed a bug with element/attribute names that contained a ``.`` character.
1944    (This broke :mod:`ll.xist.ns.fo`.)
1945
1946*   Fixed a bug with ``xmlns`` attributes in nested elements. When an element
1947    ended the parser restored the wrong prefix mapping.
1948
1949*   The :dir:`python-quotes` demo has been updated to use the current version of
1950    AMK's XML file.
1951
1952*   Removed iterator stuff from :mod:`ll.xist.xfind`, as this is now part of the
1953    :mod:`ll` package/module.
1954
1955*   The function :func:`ToNode` has been renamed to :func:`tonode`.
1956
1957*   :class:`ll.xist.Context` no longer subclasses :class:`list`.
1958
1959*   :class:`ll.xist.ns.doc.explain` will now try to output the objects in the
1960    order in which they appear in the Python source.
1961
1962*   The node methods :meth:`find` and :meth:`findfirst` have been removed.
1963
1964*   :mod:`ll.xist.ns.cond` now uses a sandbox dictionary in a converter context
1965    for evaluating expression.
1966
1967
1968Changes in 2.10 (released 05/20/2005)
1969-------------------------------------
1970
1971*   The content of the processing instruction :class:`ll.xist.ns.code.pyexec`
1972    will not be executed at construction time, but at conversion time. The code
1973    in :class:`ll.xist.ns.code.pyexec` or :class:`ll.xist.ns.code.pyeval` will
1974    no longer be executed in the :mod:`ll.xist.sandbox` module (which has been
1975    removed), but in a sandbox dictionary in the converter context of the
1976    :mod:`ll.xist.ns.code` namespace.
1977
1978*   The tests have been ported to `py.test`_.
1979
1980    .. _py.test: http://codespeak.net/py/current/doc/test.html
1981
1982*   The method :meth:`mapped` is now callable without arguments. In this case a
1983    converter will be created on the fly. You can pass constructor arguments for
1984    this converter to :meth:`mapped` as keyword arguments.
1985
1986*   The publishing API has changed again:
1987    :meth:`ll.xist.publishers.Publisher.publish` no longer accepts an argument
1988    :var:`stream` to which the byte strings are written, but it is a generator
1989    now. The publisher methods :meth:`write` and :meth:`writetext` have been
1990    renamed to :meth:`encode` and :meth:`encodetext` and return the encoded
1991    byte string, instead of writing it directly to the stream. There's a new
1992    generator method :meth:`bytes` for nodes now, which can be passed the same
1993    arguments as :meth:`asBytes`. These changes should help when using XIST in
1994    WSGI applications.
1995
1996*   The iterator returned from :meth:`Element.__getitem__`,
1997    :meth:`Frag.__getitem__` and the :meth:`walk` method now supports
1998    :meth:`__getitem__` itself, so you can write ``table[html.tr][0]`` to get
1999    the first row from a table or ``page.walk(xsc.FindTypeAll(html.td))[-1]``
2000    to get the last table cell from a complete HTML page.
2001
2002*   Several bugs in the namespaces :mod:`ll.xist.ns.meta`, :mod:`ll.xist.ns.form`
2003    and :mod:`ll.xist.ns.specials` have been fixed.
2004
2005*   The namespace modules :mod:`ll.xist.ns.css` and :mod:`ll.xist.ns.cssspecials`
2006    have been removed.
2007
2008
2009Changes in 2.9 (released 04/21/2005)
2010------------------------------------
2011
2012*   XIST trees can now be pickled. The only restriction is that global
2013    attributes must come from a namespace that has been turned into a module via
2014    :meth:`makemod`, so that this module can be imported on unpickling.
2015
2016*   Two arguments of the :meth:`walk` method have been renamed: :var:`filtermode`
2017    has been renamed to :var:`inmode` and :var:`walkmode` has been renamed to
2018    :var:`outmode`. For these modes two new values are supported:
2019
2020    :const:`ll.xist.xsc.walkindex`
2021        The value passed to the filter function or yielded from the iterator is
2022        a list containing child indizes and attribute names that specify the path
2023        to the node in question.
2024
2025    :const:`ll.xist.xsc.walkrootindex`
2026        The filter function will be called with two arguments: The first is the
2027        root node of the tree (i.e. the node for which :meth:`walk` has been
2028        called), the second one is an index path (just like for
2029        ``ll.xist.xsc.walkindex``). If used as an :var:`outmode` a tuple with
2030        these two values will be yielded.
2031
2032* Attribute mappings now support :meth:`__getitem__`, :meth:`__setitem__` and
2033    :meth:`__delitem__` with list arguments, i.e. you can do::
2034
2035        >>> from ll.xist.ns import html
2036        >>> e = html.a("gurk", href=("hinz", "kunz"))
2037        >>> print e.attrs[["href", 0]]
2038        hinz
2039        >>> e.attrs[["href", 0]] = "hurz"
2040        >>> print e["href"]
2041        hurzkunz
2042        >>> del e.attrs[["href", 0]]
2043        >>> print e["href"]
2044        kunz
2045
2046    XML attributes can now be accessed as Python attributes, i.e.::
2047
2048        >>> from ll.xist.ns import html
2049        >>> e = html.a("spam", href="eggs")
2050        >>> print e.attrs.href
2051        eggs
2052
2053    (Don't confuse this with ``e.Attrs.href`` which is the attribute class.)
2054
2055*   :class:`Frag` and :class:`Element` now support :class:`Node` subclasses as
2056    arguments to their :meth:`__getitem__` method: An iterator for all children
2057    of the specified type will be returned.
2058
2059*   The encoding used for parsing now defaults to :const:`None`. When reading
2060    from an URL and no default encoding has been specified the one from the
2061    ``Content-Type`` header will be used. If this still doesn't result in a
2062    usable encoding, ``"utf-8"`` will be used when parsing XML and
2063    ``"iso-8859-1"`` will be used when parsing broken HTML.
2064
2065*   All error and warning classes from :mod:`ll.xist.errors` have been merged
2066    into :mod:`ll.xist.xsc`. This avoids import problems with circular imports.
2067
2068*   The attributes :attr:`showLocation` and :attr:`showPath` of
2069    :class:`ll.xist.presenters.TreePresenter` have been lowercased and
2070    presenters are properly reset after they've done their job.
2071
2072*   The class attribute :attr:`xmlname` will no longer be turned into a list
2073    containing the Python and the XML name, but will be the XML name only.
2074    You can get the Python name of :class:`foo` from ``foo.__class__.__name__``.
2075
2076*   :class:`DeprecationWarning`\s for :attr:`name` and :attr:`attrHandlers` have
2077    finally been removed.
2078
2079*   Instances of :class:`ll.xist.xsc.Entity` subclasses can now be compared.
2080    :meth:`__eq__` simply checks if the objects are instances of the same class.
2081
2082
2083Changes in 2.8.1 (released 03/22/2005)
2084--------------------------------------
2085
2086*   Added a note about the package init file to the installation documentation.
2087
2088
2089Changes in 2.8 (released 01/03/2005)
2090------------------------------------
2091
2092*   XIST requires Python 2.4 now.
2093
2094*   :class:`ll.xist.ns.specials.x` has been renamed to
2095    :class:`ll.xist.ns.specials.ignore`.
2096
2097*   :func:`ll.xist.utils.findAttr` has been renamed to
2098    :func:`ll.xist.utils.findattr`.
2099
2100*   :class:`ll.xist.xfind.item` no longer handles slices.
2101
2102*   XFind has been enhanced to support item and slice operators, i.e. if
2103    ``foo`` is an XFind operator, ``foo[0]`` is an operator that will produce
2104    the first node from ``foo`` (if there is one). Negative values and slices
2105    are supported too.
2106
2107*   Operators can be chained via division: ``html.a/html.b`` is an operator
2108    that can be passed around and applied to a node.
2109
2110*   XIST requires the new core module and makes use of the new
2111    "cooperative displayhook" functionality defined there: If you install the
2112    displayhook you can tweak or replace ``ll.xist.presenters.hookpresenter``
2113    to change the output.
2114
2115
2116Changes in 2.7 (released 11/24/2004)
2117------------------------------------
2118
2119*   The transparent pixel used by :class:`ll.xist.ns.htmlspecials.pixel` has
2120    been renamed to :file:`spc.gif` to avoid problems with IE.
2121
2122*   Removed a debug print in :class:`ll.xist.xfind.Finder.__getitem__`.
2123
2124*   :mod:`ll.xist.xfind` now has a new function :func:`item`, that can be used
2125    to get a certain item or slice from an iterator. :func:`xfind.first` and
2126    :func:`xfind.last` have been changed to use :func:`xfind.item`, so you now
2127    have to pass a default value to get the old behaviour.
2128
2129*   Obsolete options in :mod:`ll.xist.options` have been removed (and
2130    :data:`reprEncoding` has been renamed to :data:`reprencoding`).
2131
2132
2133Changes in 2.6.2 (released 06/06/2005)
2134--------------------------------------
2135
2136*   Fixed a bug in :meth:`ll.xist.parsers.Parser.parse`.
2137
2138
2139Changes in 2.6.1 (released 11/02/2004)
2140--------------------------------------
2141
2142*   Fixed a bug in :meth:`ll.xist.xfind.Finder.__floordiv__`.
2143
2144*   Restricted characters as defined in `XML 1.1`__ will now be published as
2145    character references.
2146
2147    __ http://www.w3.org/TR/2004/REC-xml11-20040204/#NT-RestrictedChar
2148
2149
2150Changes in 2.6 (released 10/26/2004)
2151------------------------------------
2152
2153*   :func:`ToNode` now tries iterating through the value passed in, so it's now
2154    possible to pass iterators and generators (and generator expressions in
2155    Python 2.4) to :class:`Frag` and :class:`Element` constructors.
2156
2157*   A new API named XFind has been added for iterating through XML trees.
2158    XFind expressions look somewhat like XPath expressions but are pure Python
2159    expressions. For example finding all images inside links in an HTML page
2160    can be done like this::
2161
2162        from ll.xist import parsers, xfind
2163        from ll.xist.ns import html
2164        node = parsers.parseURL("http://www.python.org/", tidy=True)
2165        for img in node//html.a/html.img:
2166            print img["src"]
2167
2168*   The module :mod:`ll.xist.xfind` contains several operators that can be used
2169    in XFind expressions.
2170
2171*   Parsing broken HTML is now done with the HTML parser from libxml2_. The
2172    parsing functions no longer accept options for tidy, only the boolean value
2173    of the :var:`tidy` argument is used.
2174
2175    .. _libxml2: http://www.xmlsoft.org/
2176
2177*   The publishing API has been simplified: Publication can now be done with
2178    a call to :meth:`ll.xist.publishers.Publisher.publish`, passing in a
2179    :class:`ll.xist.xsc.Node`. Writing strings to the publisher output is
2180    now done with :meth:`ll.xist.publishers.Publisher.write`. The methods
2181    :meth:`beginPublication` and :meth:`endPublication` have been
2182    removed.
2183
2184*   The presentation API has been simplified in the same way: You'll get a
2185    presentation by calling: ``string = presenter.present(node)``. The methods
2186    :meth:`beginPresentation` and :meth:`endPresentation` have been removed.
2187
2188*   The parser now has the option to ignore illegal elements, attributes,
2189    processing instructions and entities. The default behaviour is to raise an
2190    exception, but this can now be reconfigured via Python's warning framework.
2191
2192*   The classmethod :meth:`tokenize` from :mod:`ll.toxic` has been moved to
2193    :class:`ll.xist.xsc.Namespace`, so it's now possible to tokenize an XML
2194    string for other processing instructions as well.
2195
2196*   A new class :class:`ll.xist.xsc.NSPool` has been added. An :class:`NSPool`
2197    contains a pool of namespaces from which the parser selects the appropriate
2198    namespace once an ``xmlns`` attribute is encountered.</item>
2199
2200*   The script :file:`xscmake.py` (which has been unmaintained for a while now)
2201    has been removed.</item>
2202
2203*   Elements :class:`hostname`, :class:`tty`, :class:`prompt` and :class:`input`
2204    were added to :mod:`ll.xist.ns.doc`.
2205
2206*   The method :meth:`ll.xist.xsc.Attrs.set` now returns the new attribute
2207    object.
2208
2209*   The :meth:`visit` method has been removed.
2210
2211*   :meth:`ll.xist.xsc.FindOld` has been removed.
2212
2213*   :class:`ll.xist.ns.xml.header` has been renamed to
2214    :class:`ll.xist.ns.xml.declaration`.
2215
2216
2217Changes in 2.5 (released 06/30/2004)
2218------------------------------------
2219
2220*   Specifying content models for elements has seen major enhancements. The
2221    boolean class attribute :attr:`empty` has been replaced by an object
2222    :attr:`model` whose :meth:`checkvalid` method will be called for validating
2223    the element content.
2224
2225*   A new module :mod:`ll.xist.sims` has been added that provides a simple
2226    schema validation. Schema violations will be reported via Pythons
2227    warning framework.
2228
2229*   All namespace modules have been updated to use :mod:`sims` information.
2230    The SVG module has been updated to SVG 1.1. The docbook module has been
2231    updated to DocBook 4.3.
2232
2233*   It's possible to switch off validation during parsing and publishing.
2234
2235*   :class:`ll.xist.xsc.Frag` and :class:`ll.xist.xsc.Element` both have a
2236    :meth:`__call__` method with the same arguments as their constructors.
2237    Those methods will append content nodes (and set attributes for
2238    :class:`ll.xist.xsc.Element`) and return :var:`self`, so they can be used
2239    when creating an object tree. This makes it possible to put the attributes
2240    close to the tag name, instead of putting them at the end after the content.
2241
2242    Instead of::
2243
2244        node = html.table(
2245            html.tr(
2246                html.td("foo"),
2247                html.td("bar"),
2248            ),
2249            html.tr(
2250                html.td("spam"),
2251                html.td("eggs")
2252            ),
2253            class_="example"
2254
2255    you can now use the following::
2256
2257        node = html.table(class_="example")(
2258            html.tr(
2259                html.td("foo"),
2260                html.td("bar"),
2261            ),
2262            html.tr(
2263                html.td("spam"),
2264                html.td("eggs")
2265            )
2266        )
2267
2268*   Experimental support for Holger Krekel's XPython_ has been added. Code
2269    might look like this::
2270
2271        from ll.xist import xsc, converters
2272        from ll.xist.ns import html, meta
2273
2274        import random
2275
2276        c = converters.Converter()
2277        <c>:
2278            <html.html()>:
2279                <html.head()>:
2280                    <meta.contenttype()>: pass
2281                    <html.title()>:
2282                        xsc.append("The title")
2283                <html.body(class_="foo")>:
2284                    <html.h1()>:
2285                        flag = random.choice((0, 1))
2286                        if flag:
2287                            xsc.append("The foo page", class_="foo")
2288                        else:
2289                            xsc.append("The bar page", class_="bar")
2290                    <html.p()>:
2291                        if flag:
2292                            xsc.append("The foo content")
2293                        else:
2294                            xsc.append("The bar content")
2295
2296        print c.lastnode.asBytes()
2297
2298    .. _XPython: http://codespeak.net/svn/user/hpk/talks/xpython-talk.txt
2299
2300*   Creating global attributes has been simplified. Passing an instance of
2301    :class:`ll.xist.xsc.Namespace.Attrs` to an :class:`Element` constructor
2302    now does the right thing::
2303
2304        from ll.xist.ns import html, xml
2305        node = html.html(
2306            html.head(),
2307            xml.Attrs(lang="de"),
2308            lang="en",
2309        )
2310
2311*   Creating skeleton implementations of XIST namespaces is no longer done
2312    via XML conversion (i.e. the namespace module :mod:`ll.xist.ns.xndl`),
2313    but through the new module :mod:`ll.xist.xnd`. The script :file:`dtdxsc.py`
2314    will automatically generate :mod:`sims` information.
2315
2316*   :class:`ll.xist.xsc.CharRef` now inherits from :class:`ll.xist.xsc.Text`
2317    too, so you don't have to special case :class:`CharRef`\s any more. When
2318    publishing, :class:`CharRef`\s will be handled like :class:`Text` nodes.
2319
2320*   :class:`ll.xist.ns.meta.contenttype` now has an attribute ``mimetype``
2321    (defaulting to ``"text/html"``) for specifying the MIME type.
2322
2323*   :class:`ll.xist.ns.htmlspecials.caps` has been removed.
2324
2325*   Registering elements in namespace classes has been rewritten to use a
2326    cache now.
2327
2328*   Pretty printing has been changed: Whitespace will only be added now if
2329    there are no text nodes in element content.
2330
2331*   Two mailing lists are now available: One for discussion about XIST and
2332    one for XIST announcements.
2333
2334
2335Changes in 2.4.1 (released 01/05/2004)
2336--------------------------------------
2337
2338*   Changed the xmlname of :class:`ll.xist.ns.jsp.directive_page` back again
2339    (it's ``directive.page`` only for the XML form, which we don't use anyway.)
2340
2341*   Drop the default value for
2342    :class:`ll.xist.ns.jsp.directive_page.Attrs.language`, as this attribute can
2343    only be used once.
2344
2345*   If an :class:`ll.xist.xsc.Prefixes` object has a prefix mapping for a
2346    namespace it will return this prefix too, if asked for a prefix for a
2347    subclass of this namespace.
2348
2349
2350Changes in 2.4 (released 01/02/2004)
2351------------------------------------
2352
2353*   The class :class:`ll.xist.parsers.Handler` has been renamed to :class:`Parser`
2354    and has been made reusable, i.e. it is possible to instantiate a parser once
2355    and use it multiple times for parsing. All the classes derived from
2356    :class:`xml.sax.xmlreader.InputSource` have been dropped and the methods
2357    for parsing strings, URLs and files have been implemented as methods of
2358    the parser. Most of the arguments that had to be passed to the various
2359    parsing functions are passed to the parser constructor now. The basic
2360    parsing functionality is implemented by parsing streams instead of
2361    :class:`InputSource` objects.
2362
2363*   Similar to the changes for parsing, publishers have been changed to be
2364    reusable and most arguments to the publishing functions are available as
2365    arguments to the publisher constructor.
2366
2367*   Now converter contexts are no longer bound to an element class, but to the
2368    context class defined by the element class, i.e. the attribute ``Context``
2369    of the argument for :meth:`Converter.__getitem__` will be used as the
2370    dictionary key. This makes it possible to use a class and it subclasses
2371    interchangeably (as long as the base class defines its own :class:`Context`
2372    class and the subclasses don't overwrite it).
2373
2374*   Added a find functor :class:`FindTypeAllAttrs` that searches content and
2375    attributes.
2376
2377*   Fixed the XML name for :class:`ll.xist.ns.jsp.directive_page`.
2378
2379*   All character references in :mod:`ll.xist.ns.ihtml` that exist in
2380    :mod:`ll.xist.ns.chars` too have been removed.
2381
2382
2383Changes in 2.3 (released 12/08/2003)
2384------------------------------------
2385
2386*   It's now possible to parse XML without generating location information for
2387    each node, by passing ``loc=False`` to the constructor of the
2388    :class:`Handler`.
2389
2390*   The :class:`HTMLParser` no longer complains about global attributes or
2391    ``xmlns``.
2392
2393*   XIST now supports uTidylib_ in addition to mxTidy. uTidylib is found
2394    it is preferred over mxTidy.
2395
2396    .. _uTidylib: http://utidylib.sf.net/
2397
2398*   It's possible now to pass arguments to tidy simple by passing an argument
2399    dictionary for the :var:`tidy` argument in the parsing functions.
2400
2401*   The methods :meth:`parsed` and :meth:`checkvalid` have been separated.
2402
2403*   :class:`ll.xist.ns.htmlspecials.pixel` and
2404    :class:`ll.xist.ns.htmlspecials.autopixel` now check whether their
2405    :attr:`color` attribute is ok.
2406
2407*   The base URL is now set correctly when parsing from an URL even if the
2408    original URL does a redirect. (This requires :mod:`ll.url` version 0.11.3).
2409
2410*   Namespace handling has been rewritten again, to be more standards compliant:
2411    Now there is no prefixes for entities and processing instructions any longer.
2412    Prefix mappings can be created much simpler, and they no longer contain any
2413    namespace stack for parsing, as this is now done by the parser itself.
2414    :class:`xsc.NamespaceAttrMixIn` is gone too.
2415
2416*   The processing instructions :class:`exec_` and :class:`eval_` from
2417    :mod:`ll.xist.ns.code` have been renamed to :class:`pyexec` and
2418    :class:`pyeval` and :class:`import_` has been removed.
2419
2420*   :class:`CharRef`\s from :mod:`ll.xist.ns.html` have been moved to a new
2421    module named :mod:`ll.xist.ns.chars`.
2422
2423*   The method names :meth:`beginPublication`, :meth:`endPublication` and
2424    :meth:`doPublication` have been lowercased.
2425
2426
2427Changes in 2.2 (released 07/31/2003)
2428------------------------------------
2429
2430*   Namespace handling has been completely rewritten. Namespaces are now
2431    classes derived from :class:`ll.xist.xsc.Namespace`. Defining element
2432    classes can be done inside or outside the namespace class. If the element
2433    classes are defined outside the namespace class, they can be moved inside
2434    the namespace with a simple attribute assignment::
2435
2436        class foo(xsc.Element):
2437            empty = False
2438
2439        class xmlns(xsc.Namespace):
2440            xmlname = "foo"
2441            xmlurl = "http://www.foo.com/ns/foo"
2442
2443        xmlns.foo = foo
2444
2445*   The methods :meth:`elementkeys`, :meth:`iterelementkeys`,
2446    :meth:`elementvalues`, :meth:`iterelementvalues`, :meth:`elementitems` and
2447    :meth:`iterelementitems` can be used for iterating through the element
2448    classes and their names. You can use the method :meth:`element` to get an
2449    element class with a certain name::
2450
2451        >>> from ll.xist.ns import html
2452        >>> html.element("div")
2453        <element class ll.xist.ns.html/div at 0x824363c>
2454
2455*   For processing instructions, entities and character references similar
2456    methods are available.
2457
2458*   The method :meth:`update` can be used to add many element classes to a
2459    namespace at once, simply by passing a dictionary with those classes
2460    (use ``vars()`` to add everything that's defined inside your module).
2461    The method :meth:`updatenew` does the same, but copies only those
2462    attributes that don't exist in the namespace, :meth:`updateexisting`
2463    copies only those that do exist. You can turn a namespace into a module
2464    with :meth:`makemod`::
2465
2466        from ll.xist import xsc
2467
2468        class foo(xsc.Element):
2469            empty = False
2470
2471        class xmlns(xsc.Namespace):
2472            xmlname = "foo"
2473            xmlurl = "http://www.foo.com/ns/foo"
2474        xmlns.makemod(vars())
2475
2476*   Put the above code into :file:`foo.py` and you can do the following::
2477
2478        >>> import foo
2479        >>> foo
2480        <namespace foo/xmlns name=u'foo' url=u'http://www.foo.com/ns/foo' with 1 elements from 'foo.py' at 0x81bfc14>
2481
2482*   :func:`getns` has been dropped, so you always have to pass in a
2483    :class:`Namespace` class where a namespace is required.
2484
2485*   For the :class:`ll.xist.ns.jsp.directive_page` element automatic generation
2486    of the correct ``charset`` option in the ``contentType`` attribute is only
2487    done when there is a ``contentType`` attribute, as ``contentType`` is
2488    optional.
2489
2490*   The converter has a new property :func:`node`. :var:`node` can't be passed
2491    to :meth:`conv` but will be set to :var:`self` by :meth:`conv`
2492    automatically. This makes it possible to access the "document root" during
2493    conversion.
2494
2495*   :class:`ll.xist.ns.htmlspecials.autoimg` no longer touches existing width
2496    and height attributes. This means that %-formatting of the existing
2497    attributes is no longer done.
2498
2499*   Added a new class :class:`ll.xist.ns.htmlspecials.autopixel` that works
2500    like :class:`ll.xist.ns.htmlspecials.pixel` but inherits the size for the
2501    image specified via the ``src`` attribute.
2502
2503*   :class:`Frag` and :class:`Element` now support extended slices.
2504
2505*   :class:`Frag` and :class:`Element` now support the methods :meth:`extend`
2506    and :meth:`__iadd__`.
2507
2508*   For walking the tree the method :meth:`walk` has been completely rewritten
2509    and a new method :meth:`visit` has been added. For more info see the
2510    docstrings.
2511
2512*   :class:`Node` now has two new methods :meth:`copy` and :meth:`deepcopy` and
2513    supports the :mod:`copy` module from the Python standard library.
2514
2515*   Calling :meth:`mapped` through :meth:`conv` has been removed. You again
2516    have to call :meth:`mapped` directly and pass a node and a converter.
2517
2518*   The HTML handling of the :class:`HTMLParser` has been improved (it now
2519    uses code from :mod:`xml.sax.drivers2.drv_sgmlop_html` (which is part of
2520    PyXML__.
2521
2522    __ http://pyxml.sf.net/
2523
2524*   The core functionality found in the script :file:`dtd2xsc.py` has been
2525    moved to a class method :meth:`ll.xist.ns.xndl.fromdtd` in the
2526    :mod:`ll.xist.ns.xndl` namespace.
2527
2528*   :class:`ll.xist.parsers.ExpatParser` is now a real subclass instead of an
2529    alias for :class:`xml.sax.expatreader.ExpatParser` It reports unknown
2530    entity references to the application (if loading of external entities is
2531    switched off, which is done by :class:`ll.xist.parsers.Handler` and only
2532    outside of attributes).
2533
2534*   Namespaces have been added for Zope's TAL and METAL specifications.
2535
2536*   A namespace has been added for `XSL-FO`_.
2537
2538    .. _XSL-FO: http://www.w3.org/Style/XSL/
2539
2540
2541Changes in 2.1.4 (released 06/13/2003)
2542--------------------------------------
2543
2544*   Remove the checks for attributes in attributes and moved the publication
2545    code for the full element into a separate method. This allows JSP tag
2546    library namespaces to simply overwrite :meth:`publish` to publish the
2547    element even inside attributes. (This is the same fix as in release 1.5.10).
2548
2549
2550Changes in 2.1.3 (released 05/07/2003)
2551--------------------------------------
2552
2553*   The methods :meth:`sorted`, :meth:`reversed` and :meth:`shuffled` have been
2554    rewritten so they no longer use ``sys.maxint``. This change fixes those
2555    methods for 64 bit platforms (reported by Giles Frances Hall)
2556
2557
2558Changes in 2.1.2 (released 02/27/2003)
2559--------------------------------------
2560
2561*   :class:`ll.xist.ns.struts_config11.plug_in` now allows content (as the DTD
2562    states). (This is the same fix as in release 1.5.8.)
2563
2564
2565Changes in 2.1.1 (released 02/11/2003)
2566--------------------------------------
2567
2568*   Added a few elements and attributes to :mod:`ll.xist.ns.doc`:
2569    :class:`username`, which is used for the name of a user account,
2570    :class:`xref`, which is used for internal cross references and the attribute
2571    ``id`` for :class:`section`, which specifies the target for an :class:`xref`.
2572
2573
2574Changes in 2.1 (released 12/09/2002)
2575------------------------------------
2576
2577*   Added a new namespace module :mod:`ll.xist.ns.xndl` that contains the
2578    "XIST namespace definition language", i.e. elements that describe an
2579    XIST namespace and can be used by various scripts to generate skeleton
2580    namespace modules. The first of these script is the DTD to namespace
2581    converter :file:`dtd2xsc.py`.
2582
2583*   Added a new namespace module :mod:`ll.xist.ns.tld` that contains the
2584    definition for Java Server Pages Tag Library descriptors and a script
2585    :file:`tld2xsc.py` that uses this namespace to generate namespace modules
2586    from ``tld`` files.
2587
2588*   :class:`Attr` now supports the method :meth:`filtered`. This is used by
2589    :meth:`without` now. The arguments for :meth:`without` have changed,
2590    because handling global attributes was too "magic". A new method :meth:`with`
2591    has been added, with does the opposite of :meth:`without`, i.e. it removes
2592    all attributes that are not specified as parameters.
2593
2594*   The Python name of each :class:`Node` subclass is now available as the class
2595    attribute :attr:`pyname`.
2596
2597*   To continue the great renaming :meth:`withSep` has been renamed to
2598    :meth:`withsep`.
2599
2600*   The namespace name for the :mod:`ll.xist.ns.struts_html` module has been
2601    fixed.
2602
2603*   The argument :var:`defaultEncoding` for the various parsing functions has
2604    been renamed to :var:`encoding`.
2605
2606
2607Changes in 2.0.8 (released 11/20/2002)
2608--------------------------------------
2609
2610*   :func:`ll.xist.ns.doc.getDoc` has been renamed to :func:`getdoc`.
2611
2612*   The CSS parser was dropping the ``%`` from percentage values. This has
2613    been fixed.
2614
2615
2616Changes in 2.0.7 (released 11/12/2002)
2617
2618*   :meth:`xsc.Element.__nonzero__` can no longer fall back to
2619    :meth:`xsc.Frag.__nonzero__`. (this is the same fix as in 1.5.7).
2620
2621
2622Changes in 2.0.6 (released 11/11/2002)
2623--------------------------------------
2624
2625*   Performance optimizations.
2626
2627
2628Changes in 2.0.5 (released 11/11/2002)
2629--------------------------------------
2630
2631*   Fixed a bug in :class:`ll.xist.ns.specials.autoimg`: Attributes were not
2632    converted before the size check was done (this is the same fix as in 1.5.5).
2633
2634
2635Changes in 2.0.4 (released 11/08/2002)
2636--------------------------------------
2637
2638*   Fixed a regression bug in :class:`ll.xist.ns.jsp.directive` and several
2639    documentation issues.
2640
2641
2642Changes in 2.0.3 (released 10/30/2002)
2643--------------------------------------
2644
2645*   Fixed a few bugs in :class:`HTMLParser`.
2646
2647*   Added DocBook conversion for several elements in :mod:`ll.xist.ns.doc`.
2648
2649*   Now the :file:`__init__.py` file for the :mod:`ll` package is included.
2650
2651
2652Changes in 2.0.2 (released 10/21/2002)
2653--------------------------------------
2654
2655*   Fixed a bug in :meth:`Frag.__rmul__` (by reusing :meth:`__mul__`).
2656
2657*   Fixed a bug with the backwards compatible prefix mapping: Defining element
2658    classes in ``exec`` processing instructions didn't work, because the
2659    prefixes object used for parsing wouldn't be updated when the namespace
2660    object is defined inside the processing instruction. Now using the default
2661    for the :var:`prefixes` argument in calls to the parsing functions uses one
2662    global shared :class:`Prefixes` instances where all the namespaces that are
2663    newly defined will be registered too.
2664
2665
2666Changes in 2.0.1 (released 10/17/2002)
2667--------------------------------------
2668
2669*   Fixed :file:`xscmake.py` by removing the prefix handling.
2670    :class:`OldPrefixes` will always be used for parsing now.
2671
2672
2673Changes in 2.0 (released 10/16/2002)
2674------------------------------------
2675
2676*   XIST now requires at least Python 2.2.1.
2677
2678*   Attribute handling has been largely rewritten. Instead of a class attribute
2679    :attr:`attrHandlers`, the attributes are now defined through a nested class
2680    named :class:`Attrs` inside the element. This class must be derived from
2681    :class:`ll.xist.Element.Attrs` (or one of its subclasses if you want to
2682    inherit attributes from this class). Defining attributes is done through
2683    classes nested inside this attributes class and derived from any of the
2684    known attribute classes (like :class:`TextAttr`, :class:`URLAttr` etc.).
2685    The class name will be the attribute name (and can be overwritten with a
2686    class attribute :attr:`xmlname`. This makes it possible to have docstrings
2687    for attributes. Furthermore it's possible to define an attribute default
2688    value via the class attribute :attr:`default`, allowed values for the
2689    attribute via :attr:`values`, which is a list of allowed values, and
2690    whether the attribute is required or not via :attr:`required`.
2691
2692*   XIST now has real namespace support. The new class
2693    :class:`ll.xist.xsc.Prefixes` can be used to define a mapping between
2694    prefixes and namespace names. This can be used for parsing and publishing.
2695    Namespace support is even available for entities and processing instruction.
2696
2697*   Global attributes are supported now. Namespace modules for the ``xml`` and
2698    ``xlink`` namespaces have been added (and :class:`ll.xist.xsc.XML` was
2699    moved to :mod:`ll.xist.ns.xml`).
2700
2701*   A new namespace module for SVG 1.0 has been added: :mod:`ll.xist.ns.svg`.
2702
2703*   The HTML specific parts of :mod:`ll.xist.ns.specials` have been split off
2704    into a separate module :mod:`ll.xist.ns.htmlspecials`.
2705
2706*   Comparison of attributes with strings has been removed. You have to use
2707    :meth:`__unicode__` or :meth:`__str__` now before comparing.
2708
2709*   The :class:`HTMLParser` now removes unknown attributes instead of
2710    complaining.
2711
2712*   There is a new parser class :class:`BadEntityParser`, which is a SAX2
2713    parser that recognizes the character entities defined in HTML and tries to
2714    pass on unknown or malformed entities to the handler literally.
2715
2716*   To give all nodes a chance to do something after they have been parsed (e.g.
2717    to prepend the base URL for :class:`URLAttr` nodes), the parser now calls
2718    the method :meth:`parsed` immediately after node creation. This is used for
2719    the new class :class:`StyleAttr`, which uses the :class:`CSSTokenizer`, to
2720    prepend the base URL to all URLs found in a style attribute.
2721
2722*   The pixel images have been moved to the directory :dir:`px` to make image
2723    URLs shorter.
2724
2725
2726Changes in 1.6.1 (released 08/25/2003)
2727--------------------------------------
2728
2729*   Updated to work with newer versions of :mod:`ll.ansistyle`.
2730
2731*   Updated the namespaces :mod:`ll.xist.ns.struts_html` and
2732    :mod:`ll.xist.ns.struts_config11` to the state of Struts 1.1 final.
2733
2734
2735Changes in 1.6 (released 07/02/2003)
2736------------------------------------
2737
2738*   Removed the default value for the ``className`` attribute in
2739    :class:`ll.xist.ns.struts_config11.action`.
2740
2741*   Added an attribute ``type`` to
2742    :class:`ll.xist.ns.struts_config11.action_mapping`.
2743
2744
2745Changes in 1.5.13 (released 07/01/2003)
2746---------------------------------------
2747
2748*   Implemented :meth:`ll.xist.xsc.Namespace.__eq__`, so that replacing a
2749    namespace in the registry really works.
2750
2751*   Added an attribute ``target`` to :class:`ll.xist.ns.html.area`.
2752
2753
2754Changes in 1.5.12 (released 06/17/2003)
2755---------------------------------------
2756
2757*   Fixed a bug in the new :mod:`ll.xist.ns.jsp`.
2758
2759
2760Changes in 1.5.11 (released 06/13/2003)
2761---------------------------------------
2762
2763*   Updated :mod:`ll.xist.ns.jsp` to JSP 1.2.
2764
2765
2766Changes in 1.5.10 (released 06/13/2003)
2767---------------------------------------
2768
2769*   Remove the checks for attributes in attributes and moved the publication
2770    code for the full element into a separate method. This allows JSP tag
2771    library namespaces to simply overwrite :meth:`publish` to publish the
2772    element even inside attributes.
2773
2774
2775Changes in 1.5.9 (released 04/30/2003)
2776--------------------------------------
2777
2778*   Reregistering a namespace now properly overwrites the old version in
2779    ``xsc.namespaceRegistry``.
2780
2781
2782Changes in 1.5.8 (released 02/27/2003)
2783--------------------------------------
2784
2785*   :class:`ll.xist.ns.struts_config11.plug_in` now allows content (as the
2786    DTD states).
2787
2788
2789Changes in 1.5.7 (released 11/12/2002)
2790--------------------------------------
2791
2792*   :meth:`xsc.Element.__nonzero__` can no longer fall back to
2793    :meth:`xsc.Frag.__nonzero__`.
2794
2795
2796Changes in 1.5.6 (released 11/11/2002)
2797--------------------------------------
2798
2799*   Performance optimizations.
2800
2801
2802Changes in 1.5.5 (released 11/11/2002)
2803--------------------------------------
2804
2805*   Fixed a bug in :class:`ll.xist.ns.specials.autoimg`: Attributes were not
2806    converted before the size check was done.
2807
2808
2809Changes in 1.5.4 (released 09/30/2002)
2810--------------------------------------
2811
2812*   :file:`xscmake.py` now tries to strip off a trailing ``xsc`` from the
2813    filename before it falls back to the extension ``html`` (The builtin
2814    extension mapping is still tried first).
2815
2816
2817Changes in 1.5.3 (released 09/25/2002)
2818--------------------------------------
2819
2820*   Added new processing instruction class :class:`ll.xist.ns.php.expression`
2821    that generates a PHP ``print`` statement from its content.
2822
2823
2824Changes in 1.5.2 (released 09/19/2002)
2825--------------------------------------
2826
2827*   Removed the ``value`` magic from :class:`ll.xist.ns.form.checkbox` as this
2828    conflicted with dynamic ``value`` values.
2829
2830
2831Changes in 1.5.1 (released 09/17/2002)
2832--------------------------------------
2833
2834*   Comparison of attributes with strings has been removed. You have to use
2835    :meth:`__unicode__` or :meth:`__str__` instead.
2836
2837*   The :class:`HTMLParser` now removes unknown attributes instead of
2838    complaining.
2839
2840*   There is a new parser class :class:`BadEntityParser`, which is a SAX2
2841    parser that recognizes the character entities defined in HTML and tries to
2842    pass on unknown or malformed entities to the handler literally.
2843
2844*   To give all nodes a chance to do something after they have been parsed (e.g.
2845    to prepend the base URL for :class:`URLAttr` nodes), the parser now calls
2846    the method :meth:`parsed()` immediately after node creation. This is used
2847    for the new class :class:`StyleAttr`, which uses the :class:`CSSTokenizer`,
2848    to prepend the base url to all urls found in a style attribute.
2849
2850*   The :class:`HTMLParser` now removes unknown attributes instead of
2851    complaining.
2852
2853*   There is a new parser class :class:`BadEntityParser`, which is a SAX2
2854    parser that recognizes the character entities defined in HTML and tries to
2855    pass on unknown or malformed entities to the handler literally.
2856
2857*   To give all nodes a chance to do something after they have been parsed (e.g.
2858    to prepend the base URL for :class:`URLAttr` nodes), the parser now calls
2859    the method :meth:`parsed` immediately after node creation. This is used for
2860    the new class :class:`StyleAttr`, which uses the :class:`CSSTokenizer`, to
2861    prepend to base URL to all URLs found in a style attribute.
2862
2863
2864Changes in 1.4.3 (released 04/29/2002)
2865--------------------------------------
2866
2867*   New namespace module :mod:`xist.ns.struts_config11` allows to parse and
2868    modify Struts_ configuration files conforming to the `Struts 1.1 DTD`_.
2869
2870    .. _Struts: http://jakarta.apache.org/struts/
2871    .. _Struts 1.1 DTD: http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd
2872
2873
2874Changes in 1.4.2 (released 03/22/2002)
2875--------------------------------------
2876
2877*   Updated :file:`xscmake.py` to be compatible with the new :mod:`url` module.
2878
2879*   :class:`xist.ns.jsp.directive_page` now automatically sets the
2880    ``contentType`` on publishing.
2881
2882
2883Changes in 1.4.1 (released 03/21/2002)
2884--------------------------------------
2885
2886*   Removed :class:`TidyURLInputSource`. Now it's possible to pass a :var:`tidy`
2887    flag to the remaining functions :func:`parseString`, :func:`parseFile` and
2888    :func:`parseURL` to specify whether the source should be tidied.
2889
2890*   To prevent an element from being registered in a :class:`Namespace` the
2891    class attribute :attr:`register` can be used now. This makes it possible
2892    to have a name for the element even when it's not registered.
2893
2894*   :mod:`xist.ns.form` elements now have all the attributes that the
2895    corresponding elements from :mod:`xist.ns.html` have.
2896
2897*   Removed the old :mod:`xist.url` from the Windows distribution.
2898
2899
2900Changes in 1.4 (released 03/18/2002)
2901------------------------------------
2902
2903*   Reimplemented URL handling again. Now the new global module :mod:`url` is
2904    used for that.
2905
2906
2907Changes in 1.3.1 (released 03/14/2002)
2908--------------------------------------
2909
2910*   Added a method :meth:`pretty` to :class:`Node` for generating a pretty
2911    printable version of the node.
2912
2913*   ``xsc.Node.name`` no longer is a class method, but a class attribute, that
2914    will be set at class instantiation time by the meta class.
2915
2916
2917Changes in 1.3 (released 02/12/2002)
2918------------------------------------
2919
2920*   Ported to Python 2.2. :class:`Node` is now derived from :class:`object`,
2921    :class:`Frag` from :class:`list` and there's a new class :class:`Attrs`
2922    which is derived from :class:`dict` for the attribute mappings. All
2923    presenters have been adapted to work with :class:`Attrs`. In addition to
2924    the usual dictionary methods and operators :class:`Attrs` has a
2925    method :meth:`without` that returns a copy of the :class:`Attrs` instance
2926    with some specified attributes removed.
2927
2928*   All the node classes now have a new method :meth:`walk` that generates all
2929    nodes in the tree using the new generator feature of Python 2.2.
2930
2931*   Also a new method :meth:`walkPath` has been added that works the same as
2932    :meth:`walk` but yields the complete path to each node as a list.
2933
2934*   Added a class :class:`block` to :mod:`xist.ns.jsp`. The content of the
2935    :class:`block` instance will simply be enclosed in a ``{}`` block.
2936    :mod:`xist.ns.php` got such a class too.
2937
2938*   Added a new module :mod:`xist.ns.ihtml` for i-mode HTML.
2939
2940*   Added new modules :mod:`xist.ns.css` and :mod:`xist.ns.cssspecials` for
2941    generating CSS.
2942
2943*   Now the various attributes of the :class:`Converter` object are collected in
2944    a :class:`ConverterState` object and it's possible to push and pop those
2945    states, i.e. it's now easy to temporarily modify a converter object during
2946    a :meth:`convert` call and revert back to a previous state afterwards.
2947
2948*   :func:`parseURL` and :func:`parseTidyURL` now have an additional parameter
2949    :var:`headers` which is a list of string pairs specifying additional
2950    headers to be passed in with the request.
2951
2952*   :func:`parseString` has an additional parameter :var:`systemId` which will
2953    be the system id of the :class:`InputSource`.
2954
2955*   The distribution now includes the makefile and the XML source files so now
2956    the distribution can rebuild ifself.
2957
2958*   Various other small bugfixes and enhancements.
2959
2960
2961Changes in 1.2.5 (released 12/03/2001)
2962--------------------------------------
2963
2964*   Added a new element :class:`contentscripttype` to :mod:`xist.ns.meta` that
2965    generates a ``<meta http-equiv="Content-Script-Type" ...>`` element.
2966
2967*   :func:`xist.ns.doc.explain` now generates anchor elements for the class,
2968    function and method description, so now the links on the XIST webpages
2969    work.
2970
2971*   Docstrings and documentation has been reworked. Now :class:`xist.ns.doc.pyref`
2972    no longer implies a font change. Use the classes :class:`xist.ns.doc.module`,
2973    :class:`xist.ns.doc.class`, :class:`xist.ns.doc.method`,
2974    :class:`xist.ns.doc.function` and :class:`xist.ns.doc.arg` to mark up your
2975    Python identifiers.
2976
2977*   Added the attributes ``type`` and ``key`` to
2978    :class:`xist.ns.struts_config.data_source`.
2979
2980
2981Changes in 1.2.4 (released 11/23/2001)
2982--------------------------------------
2983
2984*   Added the deprecated attributes ``start`` to :class:`xist.ns.html.ol` and
2985    ``value`` to :class:`xist.ns.html.li`.
2986
2987
2988Changes in 1.2.3 (released 11/22/2001)
2989--------------------------------------
2990
2991*   Added missing :meth:`asPlainString` methods to :class:`Comment` and
2992    :class:`DocType`.
2993
2994
2995Changes in 1.2.2 (released 11/16/2001)
2996--------------------------------------
2997
2998*   :meth:`xist.url.URL.fileSize` and :meth:`xist.url.URL.imageSize` now use
2999    the warning framework to report errors.
3000
3001*   There is a new presenter named :class:`CodePresenter` that dumps the tree
3002    as Python source code.
3003
3004*   The filenames of the pixel images used by :class:`xist.ns.specials.pixel`
3005    have changed. These images are now included.
3006
3007
3008Changes in 1.2.1 (released 10/08/2001)
3009--------------------------------------
3010
3011*   URLs that are completely dynamic will now be left in peace when parsing or
3012    publishing.
3013
3014
3015Changes in 1.2 (released 10/03/2001)
3016------------------------------------
3017
3018*   :class:`xist.ns.meta.keywords` and :class:`xist.ns.meta.description` no
3019    longer call :meth:`asPlainString` on their content. This makes it possible
3020    to e.g. generate the keywords via JSP::
3021
3022        >>> from xist import parsers
3023        >>> from xist.ns import meta, jsp
3024        >>> s = '<keywords>' + \
3025        ...     '<?jsp:expression "foo"?>' + \
3026        ...     '</keywords>'
3027        >>> e = parsers.parseString(s)
3028        >>> print e.conv().asBytes()
3029        <meta name="keywords" content="<%= "foo" %>" />
3030
3031*   When an element occurs inside an attribute during publishing, there won't
3032    be an exception raised any more. Instead the content of the element will be
3033    published. This fixes problems with abbreviation entities inside attributes.
3034
3035*   :class:`xist.parsers.TidyURLInputSource` now uses the new experimental
3036    eGenix mx Extension package, which includes a Python port of tidy.
3037
3038*   :meth:`__repr__` now uses the new class :class:`presenters.PlainPresenter`
3039    which gives a little more info than the default :meth:`__repr__`.
3040
3041*   URL handling has been changed again. Upto now, :class:`URLAttr` had an
3042    additional instance attribute ``base``, which was the "base" file/URL from
3043    which the attribute was parsed. Now the base URL will be directly
3044    incorporated into the URL. You can pass the base URL to all the parsing
3045    functions. Similar to that when publishing you can specify a base URL. All
3046    URLs in the tree will be output relative to this base URL. Joining URLs is
3047    now done via :meth:`__div__` and no longer via :meth:`__add__`. This makes
3048    it more consistent with :mod:`fileutils`. The plan is to make URLs string
3049    like immutable objects and to merge them with :class:`fileutils.Filename`.
3050
3051*   :class:`xist.ns.specials.php` has been moved to its own module
3052    (:mod:`xist.ns.php`). This module provided additional convenience
3053    processing instructions (just like :mod:`xist.ns.jsp` does).
3054
3055
3056Changes in 1.1.3 (released 09/17/2001)
3057--------------------------------------
3058
3059*   The global namespace registry now keeps a sequential list of all registered
3060    namespaces, which will be used by the parser when searching for names. This
3061    gives a predictable search order even without using :class:`Namespaces`
3062    and its :meth:`pushNamespace` method: modules imported last will be searched
3063    first.
3064
3065*   Processing instructions are now allowed inside attributes when publishing.
3066
3067*   :mod:`xist.ns.docbooklite` has been renamed to :mod:`xist.ns.doc`. It can
3068    now generate HTML and Docbook output and has improved a lot. The XIST
3069    web pages now use this for automatic documentation generation. The doc
3070    example has been removed.
3071
3072*   :class:`xist.url.URL` now has a new method :meth:`info` that returns the
3073    headers for the file/URL.
3074
3075*   :class:`xist.url.URL` now has a methods :meth:`fileSize` and
3076    :meth:`imageSize` too.
3077
3078*   :class:`xist.ns.jsp.directive_page` now has new attribute ``session``.
3079
3080
3081Changes in 1.1.2 (released 08/21/2001)
3082--------------------------------------
3083
3084*   :meth:`__repr__` now uses the new class :class:`presenters.PlainPresenter`
3085    which gives a little more info than the default :meth:`__repr__`.
3086
3087
3088Changes in 1.1.1 (released 08/01/2001)
3089--------------------------------------
3090
3091*   Small bugfix in :func:`presenters.strProcInst`.
3092*   Fixed :class:`xist.ns.struts_html.option` to allow content.
3093
3094
3095Changes in 1.1 (released 07/19/2001)
3096------------------------------------
3097
3098*   Sequences in constructor arguments for :class:`Frag` and :class:`Element`
3099    are again expanded and it's again possible to pass dictionaries in an
3100    :class:`Element` constructor to specify attributes. As sequences are always
3101    unpacked, the method :meth:`extend` is gone. This works for :meth:`append`
3102    and :meth:`insert` too.
3103
3104*   :class:`Node` and :class:`Frag` implement :meth:`__mul__` and
3105    :meth:`__rmul__`, so you can do stuff like::
3106
3107        html.br()*5
3108
3109    This returns a :class:`Frag` with five times to same node.
3110
3111*   Arguments for the converter constructor can be passed to
3112    :meth:`xist.xsc.Node.conv` now, so it's possible to do stuff like this::
3113
3114        from xist.ns import code
3115        print code.Eval("return converter.lang").conv(lang="en").asBytes()
3116
3117    which will print ``en``.
3118
3119*   The option :var:`XHTML` for the publishers has been changed to lowercase.
3120
3121*   :class:`xist.ns.html.html` will automatically generate a ``lang`` and
3122    ``xml:lang`` attribute when the converter has a language set.
3123
3124
3125Changes in 1.0 (released 06/18/2001)
3126------------------------------------
3127
3128*   New module for WML 1.3.
3129
3130*   The publishing interface has changed internally and publishing should be
3131    faster now.
3132
3133*   Publishers now support a new parameter: :var:`usePrefix`, which specifies
3134    if namespace prefixes should be output for the element names.
3135
3136*   Part of the implementation of the publishing stuff has been moved to C, so
3137    now you'll need a C compiler to install XIST.
3138
3139*   When publishing ``"``, it will now only be replaced with ``&quot;`` inside
3140    attributes.
3141
3142*   All the :meth:`asHTML` methods now have an additional argument
3143    :var:`converter`. This makes it possible to implement different processing
3144    modes or stages for new elements. All currently implemented elements and
3145    entities ignore this argument, but pass it on in the call to their
3146    childrens' :meth:`asHTML` method. As the name :meth:`asHTML` no longer
3147    makes sense, :meth:`asHTML` has been renamed to :meth:`convert`.
3148
3149*   There is now a tool :file:`dtd2xsc.py` in the :dir:`scripts` directory that
3150    creates a skeleton XIST module from a DTD (this requires xmlproc from the
3151    PyXML package).
3152
3153*   New preliminary module for DocBook 4.12. (Incomplete: :meth:`convert`
3154    methods and Unicode character entities are missing; any volunteers for
3155    implementing 375 classes?)
3156
3157*   New module :file:`ruby.py` that implements the `W3C Ruby draft`_.
3158
3159    .. _W3C Ruby draft: http://www.w3.org/TR/ruby/xhtml11-ruby-1.mod
3160
3161*   :file:`sql.py` has been removed from XIST, but is available as a
3162    separate module.
3163
3164*   The parsing interface has been changed. Parsing is now done with the
3165    functions :func:`parseFile`, :func:`parseString`, :func:`parseURL` and
3166    :func:`parseTidyURL` in the module :mod:`parsers`. It's now possible to
3167    specify which parser should be used for parsing by passing a SAX2 parser
3168    instance to any of these functions. XIST now includes a rudimentary
3169    SAX2 driver for :class:`sgmlop` and a rudimentary HTML parser that
3170    emits SAX2 events.
3171
3172*   The python-quotes example has been updated to work with expat.
3173
3174*   Added a new example: media.
3175
3176*   All abbreviation entities have been moved to a new module :file:`abbr.py`.
3177
3178*   All the modules that provide new elements and entitites have been moved
3179    to a subpackage :mod:`ns`.
3180
3181*   :class:`Frag` and :class:`Element` now have new methods :meth:`sorted`,
3182    :meth:`reversed`, :meth:`filtered` and :meth:`shuffled` that return sorted,
3183    reversed, filtered and shuffled versions of the :class:`Frag`/:class:`Element`
3184    object.
3185
3186*   New namespace modules :file:`ns/jsp.py` and :file:`ns/struts_html.py` have
3187    been added that allow you to use JSP_ and Struts_ tags with XIST.
3188
3189    .. _JSP: http://java.sun.com/products/jsp/
3190    .. _Struts: http://jakarta.apache.org/struts/
3191
3192*   A new method :meth:`asText` was added, that returns the node as a formatted
3193    plain ASCII text (this requires that w3m__ is installed.)
3194
3195    __ http://w3m.sf.net/
3196
3197*   :file:`make.py` has been renamed to :file:`xscmake.py` and moved to the
3198    :dir:`scripts` directory, it will be installed as a callable script with
3199    ``python setup.py install_scripts``.
3200
3201*   :file:`xscmake.py` has a new option :option:`--files`/:option:`-f`.
3202    The argument is a file containing a list of filenames (one name per line)
3203    that should be converted.
3204
3205*   :file:`xscmake.py` has a new option :option:`--parser`/:option:`-r` for
3206    specifying which parser to use. Allowed values are ``sgmlop`` and ``expat``.
3207
3208*   :file:`xscmake.py` has a new option :option:`--namespace`/:option:`-n`
3209    that can be used for appending :class:`Namespace` objects to the
3210    :class:`Namespaces` object used by :file:`xscmake.py`::
3211
3212        xscmake.py -n html -n spam eggs.xsc
3213
3214    With this call the parser will find element classes from the module with
3215    the prefix name ``spam`` before those from ``html`` and those before
3216    anything else.
3217
3218*   :class:`xist.url.URL` no longer has an attribute :attr:`ext`. :attr:`file`
3219    and :attr:`ext` are merged.
3220
3221*   The special treatment of sequences as constructor arguments to :class:`Frag`
3222    and :class:`Element` has been removed, so XIST will no longer remove one
3223    level of nesting. If you still want that, use a ``*`` argument.
3224
3225*   :class:`Frag` and :class:`Element` now have a new method :meth:`mapped`,
3226    that recursively maps the nodes through a function. This is like
3227    :meth:`convert` but via an external function.
3228
3229*   Attribute handling has been improved thanks to a suggestion by Hartmut
3230    Goebel: :meth:`Element.__getitem__` now always works as long as the
3231    attribute name is legal. If the attribute is not set, an empty attribute
3232    will be returned. All empty attributes will be considered as being not set
3233    and so :meth:`hasAttr` returns ``0`` for them, and :meth:`publish` doesn't
3234    publish them. This simplifies several very common cases:
3235
3236    *   Copying an attribute from one element to another works regardless of
3237        whether the attribute is set or not;
3238
3239    *   Testing for an attributes presence can now be done much simpler:
3240        ``if element["attrname"]`` instead of ``if element.hasAttr("attrname")``
3241        (which still works, and should be a little faster);
3242
3243    *   When you construct an XIST tree and the presence or absence of an
3244        attribute is tied to a condition, you can construct the attribute in
3245        advance and use it afterwards in the tree construction::
3246
3247            if condition:
3248                align = "right"
3249            else:
3250                align = None
3251            node = html.div("spam", align=align)
3252
3253        So, when the ``condition`` is false, the node will not have the
3254        attribute ``align`` set.
3255
3256*   :class:`xist.ns.cond.If` (and :class:`xist.ns.cond.ElIf`) can now be used
3257    to test for attributes of the converter. I.e. it's possible to write the
3258    following XML::
3259
3260        <if lang="en">Title
3261        <elif lang="de">Überschrift
3262        </if>
3263
3264*   URL handling has be completely changed and is much, much simpler now. There
3265    are no more path markers. To specify an URL that is relative to the current
3266    directory use the scheme ``root`` (e.g. ``root:main.css``).
3267
3268
3269Changes in 0.4.7 (released 11/24/2000)
3270--------------------------------------
3271
3272*   Fixed a bug in the entity handling.
3273
3274*   Added a few deprecated elements and attributes to the :mod:`html` module.
3275
3276*   Improved the publishing of attributes. Now all attribute values will be
3277    published. For boolean attributes no value will be published for ``XHTML==0``
3278    and the attribute name will be used for ``XHTML==1`` or ``XHTML==2``.
3279
3280*   :meth:`Element.compact` now works (better) ;).
3281
3282*   Incorparated many bug fixes from Hartmut Goebel.
3283
3284*   Implemented :meth:`xsc.Element.copyDefaultAttrs`, which copies unset
3285    attributes over from a dictionary (simplifies implementing
3286    :class:`specials.plaintable` and :class:`specials.plainbody`).
3287
3288*   :meth:`providers.Provider.pushNamespace` now handles multiple arguments
3289    which may be :class:`Namespace` objects or modules (in which case,
3290    ``module.namespace`` will be pushed).
3291
3292*   :meth:`providers.Providers.popNamespace` can now pop multiple namespaces
3293    at once.
3294
3295*   :class:`providers.TidyURIProvider` now uses :func:`os.popen3` for piping
3296    the file through tidy, so now there will be no more temporary files. The
3297    call to tidy now includes options that hopefully make the output more
3298    suited to XIST.
3299
3300*   Incorparated a new :file:`url.py` by Hartmut Goebel, that fixes many problem
3301    (e.g. optimizing ``http://server/foo/bar/../../baz.gif`` now works.)
3302
3303*   :file:`make.py` includes a new option :option:`--path` for adding
3304    directories to :data:`sys.path`.
3305
3306
3307Changes in 0.4.6 (released 11/03/2000)
3308--------------------------------------
3309
3310*   Now uses :class:`sgmlop.XMLParser` instead of :class:`sgmlop.SGMLParser`,
3311    so case is preserved.
3312
3313*   Fixed another regression from the URL to string conversion change.
3314
3315
3316Changes in 0.4.5 (released 11/01/2000)
3317--------------------------------------
3318
3319*   Converting URLs to nodes is now done in :func:`ToNode`, so :class:`URL`
3320    objects can be used everywhere.
3321
3322*   Fixed a few bugs in :meth:`Text._strtext` and :meth:`URLAttr._str`.
3323
3324
3325Changes in 0.4.4 (releases 10/27/2000)
3326--------------------------------------
3327
3328*   Now testing if characters can be encoded with the specified encoding is
3329    done directy. This means, that escaping unencodable characters now works
3330    even with exotic encodings (tested with `JapaneseCodecs 1.0.1`__.
3331
3332    __ http://pseudo.grad.sccs.chukyo-u.ac.jp/~kajiyama/python/
3333
3334*   The :class:`URLAttr` constructor now can handle a single parameter of the
3335    type :class:`URL`.
3336
3337*   The URL to string conversion function have changed: :meth:`URL.asString`
3338    returns the URL with path markers, :meth:`URL.asPlainString` returns the
3339    URL without path markers.
3340
3341*   Added the ``i18n`` attribute to the :class:`font` element.
3342
3343*   Fixed the clashes between the class names for the elements and entities
3344    :class:`sub` and :class:`sup` in :file:`html.py`.
3345
3346*   Several small enhancements and bug fixes contributed by Hartmut Goebel.
3347
3348
3349Changes in 0.4.3 (released 10/19/2000)
3350--------------------------------------
3351
3352*   Now processing instruction classes are registered in the same way as
3353    elements and entities are.
3354
3355*   The leaf nodes (:class:`Text`, :class:`Comment`, :class:`ProcInst`) are now
3356    considered immutable. This means that their :meth:`asHTML` method can
3357    simply return :var:`self`, because now those nodes can be shared between
3358    trees. Functionality for manipulation the objects is provided by a mixin
3359    class very similar to :class:`UserString`. All this results in a speedup
3360    of about 10% for the python-quotes example.
3361
3362*   Small optimizations in the :meth:`asHTML` methods of :class:`Element` and
3363    :class:`Frag` optimized away many calls to :meth:`append`, :meth:`extend`
3364    and :meth:`ToNode` and result in a speedup of about 30% for the
3365    python-quotes example. One consequence of this is that :class:`Null`
3366    objects will no longer be ignored.
3367
3368
3369Changes in 0.4.2 (released 09/24/2000)
3370--------------------------------------
3371
3372*   New elements :class:`keywords` and :class:`description` in :file:`meta.py`.
3373
3374*   Fixed a bug in :meth:`Namespace.register`, now setting ``name=None`` to
3375    prevent an element from being registered works again.
3376
3377
3378Changes in 0.4.1 (released 09/21/2000)
3379--------------------------------------
3380
3381*   A new module named :file:`meta.py` has been created, that simplifies
3382    generating meta tags.
3383
3384*   Various small bugfixes.
3385
3386
3387Changes in 0.4 (released 09/19/2000)
3388------------------------------------
3389
3390*   XIST now requires at least Python 2.0b1.
3391
3392*   A new bugfixed version of the sgmlop source is available from the
3393    `FTP site`_.
3394
3395    .. _FTP site: ftp://ftp.livinglogic.de/pub/livinglogic/xist/
3396
3397*   XIST now completely supports Unicode. For output any encoding known to
3398    Python can be used, so now you can output your HTML in ASCII, Latin-1,
3399    UTF-8, UTF-16, ...
3400
3401*   All publishers have been updated to support Unicode. The publishing
3402    interface has been streamlined (:var:`encoding` and :var:`XHTML` parameters
3403    are now attributes of the publisher).
3404
3405*   :meth:`asString` will now always return a Unicode string. If you want a byte
3406    string use :meth:`asBytes` instead, where the encoding can be specified as
3407    an argument.
3408
3409*   There an additional publisher class :class:`FilePublisher`, which can be
3410    used for publishing to a file (or anything else that has a :meth:`write`
3411    and a :meth:`writelines` method, and is supported by the stream writer
3412    available through :func:`codecs.lookup`).
3413
3414*   Element and attribute names are no longer converted to lowercase. If you
3415    have an attribute name which clashes with a Python keyword (e.g. ``class``)
3416    append an underscore (``_``), which will be removed before accessing the
3417    attribute. This is the "official" Python method for handling these cases.
3418
3419*   Elements and entities are no longer registered one by one. Now you can
3420    build :class:`Namespace` objects which are used for searching and there are
3421    :meth:`pushNamespace` and :meth:`popNamespace` functions in :mod:`XSC.xsc`.
3422    For more info, see the source.
3423
3424*   Image size calculation has been removed from :class:`html.img` and
3425    :class:`html.input`. Use :class:`specials.autoimg` and
3426    :class:`specials.autoinput` for that.
3427
3428*   :meth:`__getitem__`, :meth:`__setitem__` and :meth:`__delitem` of
3429    :class:`Frag` and :class:`Element` now accepts a list as an argument. The
3430    method will be applied recursively, i.e. ``e[[0, 1, "foo", 2]`` is the
3431    same as ``e[0][1]["foo"][2]``.
3432
3433*   The deprecated module :file:`db.py` no longer exists. Useful functions and
3434    elements from :file:`db.py` have been moved to :file:`sql.py` and
3435    :file:`form.py` respectively.
3436
3437*   When using :func:`xsc.make` the encoding and XHTML parameters to use can
3438    now be specified on the command line (e.g. ``--encoding utf-8 --xhtml 2``)
3439
3440*   Handling of multiline ``<?xsc-eval?>`` and ``<?xsc-exec?>`` has been
3441    enhanced, although XIST will not be able to guess the correct indentation
3442    in all cases. As a workarround simply add a Python comment to the beginning.
3443    So the following won't work::
3444
3445        <?xsc-exec
3446            for i in xrange(10):
3447                do(i)
3448        ?>
3449
3450    But this will::
3451
3452        <?xsc-exec
3453            #
3454            for i in xrange(10):
3455                do(i)
3456        ?>
3457
3458*   Make functionality has been moved to :file:`make.py`, as certain modules
3459    can't be used as the main script, because reimporting them in processing
3460    instructions won't work. Now you can simply call::
3461
3462        make.py --import xist.html --import spam eggs.xsc
3463
3464*   There is a new module :file:`cond.py`, that contains elements that can be
3465    used for conditionals::
3466
3467        <?xsc-exec a=42?>
3468        <if cond="a==21">
3469            <b>foo</b>
3470        <elif cond="a==42"/>
3471            <i>bar</i>
3472        <else/>
3473            baz
3474        </if>
3475
3476
3477Changes in 0.3.9 (released 08/10/2000)
3478--------------------------------------
3479
3480*   sgmlop will now be found either via ``import sgmlop`` or via
3481    ``from xml.parsers import sgmlop``.
3482
3483
3484Changes in 0.3.8 (released 07/14/2000)
3485--------------------------------------
3486
3487*   Fixed a bug in :meth:`URLAttr.publish`, which prevented :class:`URLAttr`
3488    from working at all.
3489
3490
3491Changes in 0.3.7 (released 07/06/2000)
3492--------------------------------------
3493
3494*   Fixed a bug in :class:`html.img` and :class:`html.input`. Now image size
3495    calculation works again.
3496
3497
3498*   Changes in 0.3.6 (released 07/04/2000)
3499
3500*   Fixed a bug in :meth:`Node._matches`, which resulted in a non working
3501    :meth:`find`.
3502
3503
3504Changes in 0.3.5 (released 07/02/2000)
3505--------------------------------------
3506
3507*   The documentation example has been enhanced. Now documenting methods works.
3508
3509*   When the member :attr:`elementname`: in the element class is set before
3510    calling :func:`registerElement`, this element name will be used for the
3511    element. This allows custom names even when using
3512    :func:`registerAllElements`.
3513
3514*   Comparison of scheme and server in URLs is done case insensitive (as
3515    :rfc:`2068` requires.)
3516
3517*   Image size calculation is now done in :meth:`asString` and not in
3518    :meth:`asHTML`. This allows to write faster code. Old method::
3519
3520        e = html.div(html.img(...),gurk.hurz()).asHTML().asString()
3521
3522    New method::
3523
3524        e = html.div(html.img(...),gurk.hurz().asHTML()).asString()
3525
3526*   Image size calculation is now done for ``<input type="image">``. The ``size``
3527    attribute is set to the image width.
3528
3529*   Manipulating the path in an URL is now done via the usual
3530    :meth:`__setitem__`/:meth:`__getitem__` stuff, which keeps the path in a
3531    consistent state::
3532
3533        >>> from xist.URL import URL
3534        >>> u = URL("/foo/*/../bar/baz.gif")
3535        >>> del u[1]
3536        >>> u
3537        URL(scheme='server', path=['bar'], file='baz', ext='gif')
3538
3539*   :meth:`findNodes` (which has been shortened to :meth:`find`) has an
3540    additional argument :var:`test`, which can be a test function that will be
3541    called when the node passes all other tests.
3542
3543*   :meth:`asString` no longer generates a string directly, but uses the new
3544    method :meth:`publish`, which has an additional argument :var:`publisher`,
3545    to which the strings to be output are passed.
3546
3547
3548Changes in 0.3.4 (released 05/31/2000)
3549--------------------------------------
3550
3551*   Location information is now copied over in :meth:`clone`, :meth:`asHTML`
3552    and :meth:`compact` where appropriate, so you know even in the HTML tree
3553    where something came from.
3554
3555*   ``xsc.repransi`` can now have three values:
3556
3557    0
3558        coloring is off
3559    1
3560        coloring is on for a dark background
3561    2
3562        coloring is on for a light background
3563
3564*   All ``repransi`` variables are now arrays with two strings, the first for
3565    dark, the second for light.
3566
3567
3568Changes in 0.3.3 (released 05/30/2000)
3569--------------------------------------
3570
3571*   The workaround for the trailing CDATA bug in sgmlop has been removed, so
3572    now you'll need a newer version of sgmlop (included in PyXML 0.5.5.1).
3573
3574
3575Changes before 0.3.3
3576--------------------
3577
3578*   These changes predate written history.
Note: See TracBrowser for help on using the browser.