root/livinglogic.python.xist/NEWS.rst @ 5323:2021535e5f77

Revision 5323:2021535e5f77, 130.3 KB (checked in by Walter Doerwald <walter@…>, 7 years ago)

Update <?code?> documentation in NEWS.rst.

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