root/livinglogic.python.xist/NEWS.rst @ 3708:5fb0da6822fd

Revision 3708:5fb0da6822fd, 86.7 KB (checked in by Walter Doerwald <walter@…>, 10 years ago)

Bump version number. Fix release date.

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