root/livinglogic.python.xist/NEWS.rst @ 5343:8ea8a9784e51

Revision 5343:8ea8a9784e51, 130.5 KB (checked in by Walter Doerwald <walter@…>, 7 years ago)

Allow multiple arguments in UL4 list methods append and insert. Add UL4 dict method update.

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