root/livinglogic.python.xist/NEWS.rst @ 5314:8deafe2536d4

Revision 5314:8deafe2536d4, 130.1 KB (checked in by Walter Doerwald <walter@…>, 7 years ago)

Update NEWS entry.

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