root/livinglogic.python.xist/NEWS.rst @ 4533:35aca9b50120

Revision 4533:35aca9b50120, 114.3 KB (checked in by Walter Doerwald <walter@…>, 8 years ago)

Replace ll.xist.xsc.AttrProcInst? with ll.xist.xsc.AttrElement?.

This makes it possible to have a useful output for the new element outside of
attributes.

Make ll.xist.ns.ul4.attr_if an AttrElement? subclass.

Remove ll.xist.ns.ul4.attr_ifnn.

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