root/livinglogic.python.xist/NEWS.rst @ 4439:0e1deb54e881

Revision 4439:0e1deb54e881, 108.9 KB (checked in by Walter Doerwald <walter@…>, 8 years ago)

Let UL4 pis (and others) fiddle with the indentation in pretty printing.

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