(name 'XML-Parser-monty.173' message 'empty log message' id '8bdce878-cfe9-4cf8-8448-0aba16c1da8f' date '20 November 2013' time '11:20:15.899019 pm' author 'monty' ancestors ((name 'XML-Parser-monty.172' message 'empty log message' id 'd0809762-16d4-4362-a011-9f3218c43c29' date '20 November 2013' time '5:56:20.993122 am' author 'monty' ancestors ((name 'XML-Parser-monty.169' message 'empty log message' id 'd9678ceb-9690-4950-b430-b7528d003e6d' date '19 November 2013' time '10:04:06.567855 pm' author 'monty' ancestors ((name 'XML-Parser-monty.168' message 'empty log message' id 'fb8c6fc4-b198-4b45-a50d-af822d0a62a1' date '19 November 2013' time '6:32:18.940602 am' author 'monty' ancestors ((name 'XML-Parser-monty.167' message 'empty log message' id 'dcc8aceb-b8a6-4cf9-9eac-1b7a101cbe1a' date '19 November 2013' time '12:38:23.392343 am' author 'monty' ancestors ((name 'XML-Parser-monty.166' message 'empty log message' id '6efaab2c-b47a-4743-87ec-6b7b4f3db2a0' date '18 November 2013' time '5:17:57.530138 pm' author 'monty' ancestors ((name 'XML-Parser-monty.165' message 'empty log message' id '9988ef2f-0add-473b-a149-e9a4bdea9139' date '18 November 2013' time '6:15:09.816312 am' author 'monty' ancestors ((name 'XML-Parser-monty.164' message 'empty log message' id 'e8d726e3-c250-4b4d-9bb7-a934eba2fc8c' date '18 November 2013' time '5:04:35.315315 am' author 'monty' ancestors ((name 'XML-Parser-monty.163' message 'empty log message' id 'a7c34f5a-043d-4392-8892-d8808b5a076a' date '18 November 2013' time '2:45:18.547247 am' author 'monty' ancestors ((name 'XML-Parser-monty.162' message 'empty log message' id '2dfbfa1f-55bc-4c6a-a0dd-f853b4e31a4a' date '17 November 2013' time '11:34:48.179484 pm' author 'monty' ancestors ((name 'XML-Parser-monty.161' message 'empty log message' id '29b5bad4-b293-46eb-97fa-bb2ebcf65105' date '17 November 2013' time '5:23:11.603669 pm' author 'monty' ancestors ((name 'XML-Parser-monty.160' message 'empty log message' id '1ea333c5-8e86-4198-8806-725605d82a78' date '16 November 2013' time '11:12:45.03819 pm' author 'monty' ancestors ((name 'XML-Parser-monty.159' message 'empty log message' id 'ea4c9133-6190-482b-8539-73019a0ce34c' date '16 November 2013' time '10:46:52.906605 pm' author 'monty' ancestors ((name 'XML-Parser-monty.158' message 'empty log message' id '867065ed-d838-42c9-a25e-0acfb66f67c0' date '16 November 2013' time '12:27:47.612534 pm' author 'monty' ancestors ((name 'XML-Parser-monty.157' message 'empty log message' id 'a2ac8260-5745-4eb3-b946-e262d3452e63' date '16 November 2013' time '3:40:23.941809 am' author 'monty' ancestors ((name 'XML-Parser-monty.156' message 'empty log message' id '204e3693-5ef6-4e70-adb7-bcd9812e7532' date '16 November 2013' time '2:15:36.588663 am' author 'monty' ancestors ((name 'XML-Parser-monty.154' message 'empty log message' id 'a8701b8e-d31b-4682-811e-ae7ee5acdf71' date '15 November 2013' time '12:03:46.952682 am' author 'monty' ancestors ((name 'XML-Parser-monty.153' message 'empty log message' id 'dc3c48d5-700c-48f9-b751-bf4e2547b927' date '14 November 2013' time '9:28:39.85241 pm' author 'monty' ancestors ((name 'XML-Parser-monty.152' message 'empty log message' id 'd300c220-2959-44cc-8408-c34e86848d01' date '14 November 2013' time '4:08:37.439958 am' author 'monty' ancestors ((name 'XML-Parser-monty.151' message 'empty log message' id '07a45eb6-4d98-471e-b463-758cfee77246' date '14 November 2013' time '1:16:40.135727 am' author 'monty' ancestors ((name 'XML-Parser-monty.149' message 'empty log message' id 'e8382e73-4924-408e-8a07-33998ac074c3' date '13 November 2013' time '8:39:10.917979 pm' author 'monty' ancestors ((name 'XML-Parser-monty.148' message 'empty log message' id '8c2a8633-3b53-44b9-8713-673bf0beafcc' date '12 November 2013' time '6:43:47.649507 pm' author 'monty' ancestors ((name 'XML-Parser-monty.147' message 'empty log message' id 'a8feeda4-2152-41c7-b309-59577ffb29b7' date '13 November 2013' time '2:36:19.668457 am' author 'monty' ancestors ((name 'XML-Parser-monty.146' message 'empty log message' id '90d333af-0160-4f85-a13e-38d927f2bc51' date '12 November 2013' time '10:06:13.967146 pm' author 'monty' ancestors ((name 'XML-Parser-monty.145' message 'empty log message' id '6834177d-cde1-496a-b21f-e64dde8e2607' date '12 November 2013' time '6:50:59.153005 am' author 'monty' ancestors ((name 'XML-Parser-monty.144' message 'empty log message' id '3646b176-3320-4781-be0a-2ffa79aa6a8d' date '12 November 2013' time '2:27:29.054704 am' author 'monty' ancestors ((name 'XML-Parser-DamienCassou.143' message '- Remove dependency to XMLWriter

XMLWriter was mainly used for printing the results of parsing. As we don''t always want to print xml nodes as an xml document, I made XMLWriter optional. If XMLWriter is loaded, it will be used. Otherwise, some default behavior is executed.' id '4ca08f72-7b35-4c5d-83c6-b61b2759033a' date '30 April 2013' time '5:46:41.352 pm' author 'DamienCassou' ancestors ((name 'XML-Parser-StephaneDucasse.142' message 'make all the tests green.
In particular for replace.... on XMLOrderedList made sure that the list have the same amount of elements than the one to be replaced. 
Also change the inspector since the OrderedCollectionInspector broke on XMLOrderedList.' id '436a41fc-086a-47f6-9275-8badd642328f' date '3 March 2013' time '10:42:01.676 am' author 'SD' ancestors ((name 'XML-Parser-NorbertHartl.141' message 'corrected confusing deprecation message. The deprecation should advize to use writeXMLOn: which is implemented and used instead of writeXMLWith: which seems to have existed only for a short time frame' id 'cf2f0dde-f17e-4fe4-96e7-c773d6c19b09' date '7 July 2011' time '1:50:23 pm' author 'NorbertHartl' ancestors ((name 'XML-Parser-JAA.140' message 'Changed the error handing with observable lists to signal the error before invoking the handler.' id 'e4dcefc3-d5a3-46a7-8d08-0001273191f6' date '26 March 2011' time '7:58:36 pm' author 'JAA' ancestors ((name 'XML-Parser-JAA.139' message 'Minor modifications to the node list class.' id 'db19f66f-f6f7-4479-8df6-a0c247b8d8bf' date '26 March 2011' time '6:55:48 pm' author 'JAA' ancestors ((name 'XML-Parser-JAA.138' message 'Refactored the integer reading code in XMLNestedStreamReader.' id '35117749-ebd4-4234-91ac-e11aff874831' date '23 March 2011' time '11:15:03 am' author 'JAA' ancestors ((name 'XML-Parser-JAA.137' message 'Reverted some of Otto''s changes, but hopefully in a way that will not break compatibility.' id '3861e7c8-629a-4aa5-9ca6-8c99261ebef6' date '23 March 2011' time '9:40:08 am' author 'JAA' ancestors ((name 'XML-Parser-JAA.136' message 'empty log message' id 'bac0e04f-19c8-424a-9066-48c6f675311c' date '22 March 2011' time '12:28:16 pm' author 'JAA' ancestors ((name 'XML-Parser-JAA.135' message 'empty log message' id 'ce7a5b4d-0393-4f61-b057-cd64fa6cf209' date '21 March 2011' time '7:39:40 pm' author 'JAA' ancestors ((name 'XML-Parser-OttoBehrens.134' message 'Finally removed the Observable trait now?' id '7a58ba70-5939-4102-9831-0d3ab4a60034' date '22 February 2011' time '11:43:59 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.133' message 'Temporarily renamings to remove Observable trait' id 'bf3d10a0-e32e-44d4-ba26-956b980c7b4f' date '22 February 2011' time '11:34:22 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.132' message 'This package works in Pharo and GemStone' id '04928a05-89dc-48f7-8625-73a95c5bc8a1' date '22 February 2011' time '10:52:01 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.131' message 'Got this package to work in GemStone without a .g version' id '48c41da5-a0d5-4bd1-b3a0-d0274b0330ab' date '22 February 2011' time '10:50:28 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.125' message 'Some GS errors fixed' id '17e12b0d-a867-4fa6-bb7c-17a8045db3a6' date '16 February 2011' time '6:38:32 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.124' message 'Changed XMLOrderedList to be an OrderedCollection because of XMLOrderedList test failures. The reason was the difference between (OrderedCollection new: 5) size = 0 and (Array new: 5) size = 5. XMLOrderedList assumed the behaviour of Array but used OrderedCollection in stead.' id 'f1d66618-1a71-481d-ba00-f4546920d457' date '16 February 2011' time '6:07:40 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.123' message 'deprecated api removed. better to just keep it deprecated?' id '60fba67a-deda-4bdf-8e16-3dcadafe8e41' date '16 February 2011' time '3:07:02 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.122' message 'merge back in' id '959106b8-813e-4a43-a66a-dd7a6d76ab1c' date '16 February 2011' time '9:29:04 am' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.121' message 'Got some tests to pass' id '675f9eb8-a274-451f-8a7f-c63f8d03a7e7' date '14 February 2011' time '11:13:13 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.120' message 'more traits removed' id '4ed7ff59-2cd8-4932-96f8-349ad8aac2aa' date '' time '8:39:40 am' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.119' message 'removed more observable trait references' id '89db215d-4b95-4e99-919d-15fdec795040' date '' time '8:24:04 am' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.118' message 'removed rubbish ' id 'b352eb9d-f6d4-4bc7-99df-e9a89d26d6ed' date '' time '5:45:17 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-OttoBehrens.117' message 'Removed Observable Trait' id '3b3fbe7a-2ed5-46ee-b098-898d7b6c5434' date '' time '5:40:49 pm' author 'OttoBehrens' ancestors ((name 'XML-Parser-JAAyer.116' message '* Up until now, XML names were matched heuristically; the tokenizer would read characters until it encountered one of a few that it knew could not rightfully be part of an XML name. Now it properly matches the entire range for the first character of a name and for subsequent characters, as specified by the XML spec., using a bitmap-based character set.

* Replaced references to CharacterMap with Dictionary.' id '93250642-4ce7-448d-b856-8632989b4b75' date '' time '3:29:17 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.115' message 'empty log message' id '5665d1a2-24a4-49b9-ade7-3b5dcdc94bae' date '' time '2:50:47 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.115' message 'Added XMLPeekableStreamAdapter.' id 'fdeee206-d45f-4742-aea5-15218c10dd9d' date '' time '2:45:20 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.114' message 'Fixed a corner case in XMLNestedStreamReader>>atEnd and removed an unneeded message.' id '1ffe21c5-be32-472a-818d-bc6d7c899cf1' date '12 June 2010' time '11:47:21 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.113' message 'Removed the requirement that stream support #peek, #position, and #position: to be parsable, greatly expanded the documentation and integrated the newest version of OrderPreservingDictionary.' id '5fa50abf-ceb4-4d44-bcf5-dd6efa4750fa' date '12 June 2010' time '11:19:15 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.113' message 'Removed the requirement that streams support #peek, #position and #position: to be parsable and greatly expanded the documentation.' id '60c2e93e-e365-4759-a23e-ba3efd2b2d6f' date '12 June 2010' time '10:59:41 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.112' message 'empty log message' id 'b1253457-dd6b-460f-8555-bad1903f4bff' date '12 June 2010' time '1:10:30 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.111' message 'Fixed an entity handling bug and changed XMLOrderedList to work better with NewInspector.' id 'f7de4459-0251-4192-bc86-c63a94d2d769' date '' time '2:04:06 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.110' message '* The #firstTagNamedAny:, #tagsNamedAny:, #elementAtAny: and #elementsAtAny: forms have all been removed. Their usecase was a narrow one, and their functionality can be duplicated with the new enumeration API described below and the #isNamedAny: testing message that elements still respond to.

* All remaining #tagsNamed: messages have been deprecated for a new enumeration API. You can enumerate the child nodes and elements using collect:, detect:, detect:ifNone:, do:, and select: forms, and enumerate all descendent elements and nodes recursively with "all" forms, like #allElementsDo:.

* The remaining #firstTagNamed: messages have been deprecated for a new searching API that is namespace aware. The new messages are #findElementNamed:, #findElementNamed:with:, #findElementNamed:namespaceURI: and #findElementNamed:namespaceURI:with:.

* SAXDriver no longer inherits from XMLTokenizer.

* SAXHandler no longer retains a reference to SAXDriver.

* A facade class aptly named XMLParser provides the basic parsing interface using an injected driver and tokenizer created from it.

* Renamed methods in XMLNodeList and XMLAttributeList to parallel the methods that delegate to them in XMLNodeWithElements and XMLElement.

* Deprecated #@ (it should be in Pastell)

* Deprecated #printXMLOn: for #writeXMLWith:

* Added XMLDocument>>root: to complement XMLDocument>>root

* Renamed the markup declaration classes.

* Removed the #isAttribute test.

* Fixed a bug in XMLOrderedList.' id 'fe77cec6-e200-4987-9afd-91d8033418d1' date '' time '1:46:33 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.110' message '* The #firstTagNamedAny:, #tagsNamedAny:, #elementAtAny: and #elementsAtAny: forms have all been removed. Their usecase was a narrow one, and their functionality can be duplicated with the new enumeration API described below and the #isNamedAny: testing message that elements still respond to.

* All remaining #tagsNamed: messages have been deprecated for a new enumeration API. You can enumerate the child nodes and elements using collect:, detect:, detect:ifNone:, do:, and select: forms, and enumerate all descendent elements and nodes recursively with "all" forms, like #allElementsDo:.

* The remaining #firstTagNamed: messages have been deprecated for a new searching API that is namespace aware. The new messages are #findElementNamed:, #findElementNamed:with:, #findElementNamed:namespaceURI: and #findElementNamed:namespaceURI:with:.

* SAXDriver no longer inherits from XMLTokenizer.

* SAXHandler no longer retains a reference to SAXDriver.

* A facade class aptly named XMLParser provides the basic parsing interface using an injected driver and tokenizer created from it.

* Renamed methods in XMLNodeList and XMLAttributeList to parallel the methods that delegate to them in XMLNodeWithElements and XMLElement.

* Deprecated #@ (it should be in Pastell)

* Deprecated #printXMLOn: for #writeXMLWith:

* Added XMLDocument>>root: to complement XMLDocument>>root

* Renamed the markup declaration classes.

* Removed the #isAttribute test.

* Fixed a bug in XMLOrderedList.' id 'e366cfe4-04e4-40f3-bc45-425c69d62ffa' date '' time '1:32:51 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.109' message '* Added configuration classes to unclutter the parser and tokenizer classes and to allow for settings specified in a parser to be carried over to nodes and other objects.

* As a result the above addition, #innerXML: now works completely and is fully namespace aware.

* The namespace handling now preserves empty xmlns="" declarations intended to override default namespace declarations in a parent or ancestor.

* Renamed #recurse: and #recurseUntilTrue: to #traverseWith: and #searchWith:.

* Added #isDeclaredPrefix:, #isDeclaredPrefix:uri: and #undeclarePrefix: to XMLElement.

* XMLComment nodes can now be preserved using #preservesCommentNodes:.

* Deprecated #preservesCDataSections: and #preservesCDataSections in favor of #preservesCDataNodes: and #preservesCDataNodes.

* Refactored XMLObservableList and XMLNodeList to make them more understandable.' id '712ceb26-539b-4ea6-b9f5-935da29a3633' date '' time '2:34:29 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.108' message 'empty log message' id 'c86beea7-7099-4d20-8058-def0b6bb2150' date '' time '2:34:19 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.107' message 'Extracted Opax and its tests and renamed the XML-Parser-Exception classes slightly.' id '286e4822-4019-4b86-a6ce-1a624386e8b3' date '' time '7:11:27 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.106' message 'Updated to use the renamed and extracted OrderPreservingDictionary class.' id '2b8c7b40-d126-4bb2-9229-4c1eb2a61c6e' date '' time '8:17:03 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.105' message 'Extractec XMLWriter and tests into separate packages.' id 'be22b4ce-7588-4297-8745-61261cd5fd53' date '' time '3:23:11 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.104' message '* Fixed the element factory test to properly remove the dummy classes it creates when it runs.' id '94a7955e-6d44-4871-94ce-52c48f34dc3b' date '' time '7:26:11 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.103' message '* Added element handling based on class names in the element factory.

* Some minor fixes for potential porblems on other platforms.' id '144c1d14-2e16-48b8-89dc-ed588ee416f3' date '' time '6:53:36 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.102' message '* The DOM parser now supports the injection of node factories to control what concrete classes it uses for different node types. At the moment only certain node types are supported. See XMLNodeFactory.

* In addition to the default factory, there is a pluggable element factory that facilitates the mapping of elements to specific subclasses of XMLElement based on the name and namespace information of the elements. See XMLPluggableElementFactory for more information.

* Fixed the handling of "xml" and "xmlns" prefixes.

* Set about restructuring and improivng the test classes.

* Refactored the constructors in SAXHandler.

* Renamed #useNamespaces: to #usesNamespaces:.

* Fixed a bug in XMLNodeList.' id '5487bc05-66f4-42c0-bb95-e87fe68a0382' date '' time '1:04:10 am' author 'JAAyer' ancestors ((name 'XML-Parser-tg.101' message 'commented RootNode' id '3adcff01-412a-475f-99f2-fb4374db10bf' date '' time '8:05:05 pm' author 'tg' ancestors ((name 'XML-Parser-tg.100' message 'commented Opax classes' id '1efae2a4-9dbe-4e93-ac23-b4632fe233c1' date '' time '8:03:06 pm' author 'tg' ancestors ((name 'XML-Parser-JAAyer.99' message 'Unprefixed attributes no longer erroneously claim to belong to their element''s default namespace.' id '0a68f74a-b19c-4d80-922c-75e690b16cd4' date '' time '10:09:32 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.98' message '* #isEmpty and #notEmpty have been deprecated for #hasChildren. This is clearer, as there is no longer ambiguity as to whether certain childless nodes (attributes, strings) should be considered "empty."' id 'ca6baff2-7691-4ddc-aa65-a5e683766dbd' date '' time '7:36:43 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.97' message '* #qualifiedName is deprecated; #name suffices.

* Refactored XMLNodeTest and XMLNestedStreamReader

* CharacterMap is now bundled separately.' id '9b2bd823-569f-447a-a7bc-a8c9fd474f5f' date '' time '12:38:30 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.96' message 'XML-Parser-Writers

* XMLWriter has been replaced by a block-based API similar to Seaside''s HTML generation API. Browse the classes and their comments in XML-Parser-Writers for more information.

XML-Parser-Nodes:

* #contentString now returns the combined content of the receiver and its descendent elements with spaces added where appropriate. That means sending #contentString to an element with the structure of "<element>this is <child>text</child>content</element>" will yield "this is text content."

* Added #strings and #stringsDo: to avoid having to deal with string nodes directly.

* Added #elementAt:namespaceURI:, #elementAt:namespaceURI:ifAbsent:, #elementsAt:namespaceURI:, #attributeAt:namespaceURI:, and #attributeAt:namespaceURI:ifAbsent: to better facilitate element and attribute retrieval via namespace URI rather than prefix.

* XMLOrderedList no longer inherits from OrderedCollection.

* The node classes now use a custom observer API (for performance reasons). It is grafted on with Traits.

* Added additional node classes for markup declarations and comments (not used yet).

* Deprecated #isTag, #isText, and #isTagOrText in favor of #isElement, #isStringNode, and #isContentNode.

* Deprecated #elementsAndContents, #elementsAndContentsDo:, #contents, #contentsDo:, and #hasContents in favor of #contentNodes, #contentNodesDo:, #stringNodes, #stringNodesDo:, and #hasStringNodes.

* Deprecated #characterData, #tag.

* Deprecated #topNode and #topElement in favor of #firstNode and #firstElement.

* Deprecated the #at:, #at:ifAbsent:, #at:put:, and #at:ifAbsentPut: attribute accessor shortcuts in XMLElement. Most attribute manipulation involes only retrieval, and #@ already serves well enough as a shortcut for that purpose.

* Deprecated #tagsNamed:childrenDoAndRecurse: and #tagsNamed:contentsDo:

* Removed the already deprecated #valueFor:, #valueFor:ifAbsent:, #elementUnqualifiedAt: and #elementUnqualifiedAt:ifAbsent: messages.

XML-Parser

* Renamed XMLStreamReader to XMLNestedStreamReader, XMLStreamWriter to XMLNestedStreamWriter and XMLOpenTags to XMLWellFormednessChecker. The classes were also refactored.

* XMLOrderPreservingDictionary no longer inherits from Dictionary.

XML-Parser-Exceptions

* Renamed SAXNotWellFormedException to XMLWellFormednessException and replaced SAX- prefixes on other exception and warning classes with an XML prefix.' id 'bed3a022-5b8f-4e75-ad43-c8facd6b04f1' date '' time '7:15:08 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.95' message 'empty log message' id '80f686ac-cba6-4334-8151-c3d3f699ee9d' date '' time '5:34:41 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.94' message 'empty log message' id '1c39d314-eb5d-4d43-8c7d-fb5517a660cb' date '' time '5:32:40 am' author 'JAAyer' ancestors ((name 'XML-Parser-AlexandreBergel.93' message 'Fixed the faulty test. Thanks Henrik!' id 'eea1131f-bf90-4727-becc-5d123b840669' date '' time '10:13:58 am' author 'AlexandreBergel' ancestors ((name 'XML-Parser-JAAyer.92' message 'Includes DOM CDATA section preservation patch from Jan van de Sandt.' id 'e83345b4-700b-4873-a914-6cb95de46cfa' date '8 September 2010' time '5:52:51 pm' author 'JAAyer' ancestors ((name 'XML-Parser-jvds.91' message 'added the property preserveCDATASections to the XMLDOMParser' id '8a15ae9d-a332-6140-af5c-9d3b5d5a020c' date '8 September 2010' time '1:38:51 pm' author 'jvds' ancestors ((name 'XML-Parser-jvds.90' message '- added support for CDATASection nodes in the DOM
- updated the XMLDOMParser so CDATASections are preserved' id '500703d6-076f-c246-a91e-debf5db54c69' date '8 September 2010' time '11:28:58 am' author 'jvds' ancestors ((name 'XML-Parser-JAAyer.89' message 'Removed #utf8Example and #testNonUTF8Characters (which sends the former). #utf8Example contained non-UTF-8 characters and caused character encoding issues at the package and image level.' id 'e885be9a-f9f9-4f5b-a93f-2b297753bb1b' date '8 June 2010' time '2:11:19 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.88' message 'Removed #utf8Example and #testNonUTF8Characters (which sends the former). #utf8Example contained non-UTF-8 characters and caused character encoding issues at the package and image level.' id '1df0ff08-b87d-4c08-9870-8764c4f0d81b' date '8 June 2010' time '2:10:33 pm' author 'JAAyer' ancestors ((name 'XML-Parser-NorbertHartl.87' message '- removed withInternetLineEndings selector and replaced it with the replacement code. The selector does not exist in gemstone
- changed Dictionary to XMLOrderPreservingDictionary in tests as gemstone is checking class on equality testing
- added stream atEnd. Gemstone throws an error if next is called if the stream is atEnd. One should always use atEnd' id 'bd6b4f4c-9ff1-41f3-ac2e-471c0da20d95' date '8 May 2010' time '4:47:14 pm' author 'NorbertHartl' ancestors ((name 'XML-Parser-NorbertHartl.86' message 'removed another dot that is a syntax error in gemstone' id 'c4acceea-0b54-4551-bbd0-6d3f94ff566f' date '8 May 2010' time '12:29:37 pm' author 'NorbertHartl' ancestors ((name 'XML-Parser-NorbertHartl.85' message 'removed dots. These are syntax errors in gemstone' id 'c5857cb6-51c1-4e24-8cd9-6b812132614f' date '8 May 2010' time '11:11:55 am' author 'NorbertHartl' ancestors ((name 'XML-Parser-JAAyer.84' message 'Included this patch from Christophe Jalady to speed up Unicode parsing:

WriteStream>>stringContents
    | newSize |

    newSize := position.
--    ^(String new: newSize)
++    ^((collection class) new: newSize)
        replaceFrom: 1
        to: newSize
        with: collection
        startingAt: 1
' id '76abe1c1-ee00-443e-a9ca-5330fdf752bd' date '' time '1:14:19 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.83' message 'Included this patch from Christophe Jalady to speed up Unicode parsing:

WriteStream>>stringContents
    | newSize |

    newSize := position.
--    ^(String new: newSize)
++    ^((collection class) new: newSize)
        replaceFrom: 1
        to: newSize
        with: collection
        startingAt: 1' id 'ffa85307-1767-4f97-9e75-da760b5f944b' date '' time '1:13:21 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.82' message 'empty log message' id 'f2ff9c08-8a63-4956-bf74-dcaaf28b8d6e' date '' time '1:11 pm' author 'JAAyer' ancestors ((name 'XML-Parser-Alexandre_Bergel.81' message 'remove stupid method' id '3888021f-ffdb-4174-90db-0a8cb8584b21' date '6 November 2010' time '3:21:44 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.80' message 'minor addition' id 'aa51b7de-ac71-4bd1-9b18-44ef9bccfadb' date '6 September 2010' time '7:01:01 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.79' message 'minor addition' id 'b91b2222-8813-4d58-8221-c9491733a924' date '6 September 2010' time '7:00:33 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.78' message 'Restructuring of Opax' id '56801ae8-3458-4109-84ef-203a73fbba5e' date '' time '2:09:54 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.77' message 'Opax is now integreated in XML-Parser. Opax is a small addition to SAXParser that enables dealing with tags polymorphically. ' id 'd4dff730-14ce-4fe4-ae01-278b8fa34700' date '' time '11:45:35 am' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.76' message 'Added a clarification on character (testDecodingCharacters).
Thanks to Damien Pollet for raising this question and Pharoer for helping understand what''s going on.' id 'e7d614f7-49d9-4cdc-aaa8-c647a2019e18' date '' time '11:23:25 am' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-DamienPollet.75' message 'Failing test for UTF-8 entities decoding.' id 'c42f2f2a-bdb1-4a07-a32b-b30f25c68ffa' date '' time '7:27:31 pm' author 'DamienPollet' ancestors ((name 'XML-Parser-Alexandre_Bergel.74' message 'Added log in benchmark1' id 'd4a68b46-39ad-4585-b77a-706b62226c1f' date '' time '9:10:50 am' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-AlexandreBergel.73' message 'Added new UTF8 test using the file provided by nernan Morales Durand' id '770249f4-7b8b-4bec-9250-097feaae02e0' date '' time '9:08:30 am' author 'FirstnameLastname' ancestors ((name 'XML-Parser-JAAyer.72' message '* Balanced #nextMatchAll: to use the old optimization of resetting the stream position to where the match was first attempted where possible, but in such a way that it won''t cause problems with MultiByteFileStreams.' id 'a1adc2a9-3395-4118-ade9-4f888ace5188' date '' time '1:31:04 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.71' message '* Changed #nextMatchAll: to not use #position/#position:, as this causes problems with MultiByteFileStreams.' id '1a45aeae-30e3-45e2-a0b2-8e226650d380' date '' time '12:22:03 am' author 'JAAyer' ancestors ((name 'XML-Parser-FirstnameLastname.70' message 'small test non non utf8 characters' id '5114e7e6-77a5-449b-a2c5-43a17b4b8576' date '' time '6:22:40 pm' author 'FirstnameLastname' ancestors ((name 'XML-Parser-FirstnameLastname.69' message 'small test non non utf8 characters' id 'f9cd9cd6-3bf4-4e63-8d46-3eaf57c6ed16' date '' time '6:21:42 pm' author 'FirstnameLastname' ancestors ((name 'XML-Parser-JAAyer.68' message '* Adjusted the #startElement- and #endElement- handlers. They now all expect the full, qualified name as their first argument.' id '0f4ab344-2583-4a7b-8aaa-443b83785124' date '' time '7:35:08 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.67' message '* Added #innerXML:.

* Added XMLStreamWriter to manage the multiple WriteStreams needed by XMLTokenizer.' id 'a64d3a67-86b1-4734-a19d-17aac2f42ee5' date '' time '6:13:29 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.66' message '* The well-formedness checking has been moved out of XMLDOMParser and into SAXDriver. It throws SAXNotWellFormedExceptions when tags are closed out of order or if tags are still left open after parsing has finished.

* The tokenizer and stream reader have both been refactored and optimized.

* Removed XMLParser. SAXDriver/SAXHandler do everything it does, and more.

* Renamed XMLStringNode to XMLString.

* Added XMLOrderedList and a subclass, XMLElementList, and also made XMLNodeList inherit from it. XMLOrderedList and its subclasses will never throw exceptions when non-existent elements are accessed; instead they return nil. This means code like this: "(doc root elementsAt: ''foo'') third" will work, even if there is no third element named "foo," returning nil in such situations.' id '32618415-85b8-4e67-b440-f523ba6091fe' date '' time '1:52:21 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.65' message 'empty log message' id 'e9ea7108-9250-4e58-a40a-b008c2756a80' date '' time '8:25:47 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.64' message 'empty log message' id '6147738e-ddb4-400c-a2c1-5879895525a8' date '' time '11:33:56 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.63' message 'empty log message' id 'aa238952-5ee5-497d-9c14-4d0411cec373' date '' time '2:30:19 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.61' message 'empty log message' id '158add99-5c12-4112-844a-b1ae9d3f174f' date '' time '3:23:12 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.60' message 'empty log message' id 'd287422a-f317-42e4-a741-c110989157eb' date '' time '3:55:17 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.59' message 'empty log message' id 'd06f93cb-7fd0-4148-8c6b-48933406e23f' date '' time '4:44:16 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.58' message 'empty log message' id '0bd27681-93c7-4e45-8b2e-96818509c471' date '3 December 2010' time '10:35:50 am' author 'JAAyer' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())(name 'XML-Parser-JAAyer.57' message '' id '99388deb-5dcd-4537-8d5c-aa95268a1709' date '3 December 2010' time '1:02:28 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.56' message '* Removed the newly-added *content: constructors for XMLElement. Since #addContent: can take strings, they aren''t really needed anymore.

* Refactored the stream reading code out of XMLTokenizer and into a separate XMLStreamReader class.

* Added some new exception classes.

* Added constructor methods to XMLElement to support creating an element with multiple namespaces declared it it, and also added an instance-side declareNamespaces: message.

* Attributes can now be supplied as a Dictionary or Array to XMLElement constructors (so too with namespaces).' id '4e1fa747-d9c0-443d-956d-1b8c0768246f' date '3 November 2010' time '10:20:49 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.55' message 'empty log message' id '4b81c2ce-a911-4c60-a1c7-10764b460b8f' date '3 November 2010' time '1:56:03 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.53' message '* Adjusted the class hierarchy.

* Added two XMLNode-specific collection classes, XMLNodeList and XMLAttributeList.' id 'cb191763-8883-4f97-8322-17f5db923331' date '3 October 2010' time '11:47:53 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.52' message 'empty log message' id 'c5228c52-7fd2-4f31-beac-853aee9af710' date '3 October 2010' time '11:01:57 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.51' message 'Minor fixes and refactorings.' id 'a34b5fa4-cef9-4d8a-8785-8da34615bd7d' date '3 September 2010' time '12:07:34 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.50' message '* The API is now completely string-based. The performance of the symbol-based predecessors was erratic and could potentially cause portability issues. Existing code in Squeak and Pharo shouldn''t be affected, as they both assume #name = ''name''.

* Added XMLNodeWithChildren and refactored all node-related methods out of XMLNodeWithElements and into XMLNodeWithChildren, of which XMLNodeWithElements is now a subclass.

* Element attributes are now represented as XMLAttribute nodes and stored in an XMLAttributeList. They now also support namespacing.

* Attribute order is preserved at all levels.

* The tokenizer (#basicNext in particular) has been sped up.' id 'cd8217d9-84c7-4b36-8ae1-c1b7db949b8c' date '3 September 2010' time '1:08:35 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.49' message 'empty log message' id 'f294ee76-7258-4d99-ae07-c39b1e27786f' date '3 August 2010' time '11:53:46 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.47' message 'empty log message' id 'f50149a3-9e82-49b0-913b-b0c492b31873' date '3 July 2010' time '9:05:36 pm' author 'JAAyer' ancestors () stepChildren ())(name 'XML-Parser-Alexandre_Bergel.46' message 'Added an elementary benchmark' id 'ace3bc7f-9c6d-4bad-8a4b-aa748164ff41' date '3 April 2010' time '3:04:34 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.45' message 'Following Nobert''s suggestion, I replaced the reference of IdentityDictionary by ''anElement attributes species'' in ''#assertElement: anElement attributes: aDictionary''. All tests are green' id '12286457-2f48-41a5-a675-026eecc54432' date '3 April 2010' time '2:46:15 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.44' message 'Minor fix' id '6f0b9b1f-0135-46e3-bc43-5e7c041de697' date '3 April 2010' time '2:37:48 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-JAAyer.43' message '* Added full namespace support for elements. Evaluate this: (XMLDOMParser parse: ''<foo:root xmlns:foo="http://foo" xmlns="http://default"><bar>test</bar></foo:root>'') in a Workspace with cmd-p, and you should get back out roughly what you put in. When you add an element to another, it and its descendants inherit the parent''s bindings. When you change the binding of a prefix, all descendants with the old bindings are rebound.

* Removed #parseWithNamespaces: and changed #parseDocumentFrom: (and #parse: by extension) to default to usesNamespaces=true. The reason for turning off namespace support by default was that the old, broken way of handling namespaces used expanded names (namespace URI + local name) as qualified names (prefix + local name) for elements that lacked a prefix and also assumed a global, default namespace (the URI of the namespace spec itself) for no apparent reason.

* Added #elementsAt:do: and deprecated #tagsNamed:childrenDo:. Now all undeprecated #tagsNamed: messages do some sort of depth-first traversal using #recurse: and all #element- messages operate on direct child elements; the naming convention is consistent.' id '7164e5b6-8364-49d6-afac-ef4c2451916f' date '3 April 2010' time '1:21:30 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.40' message '* Added full namespace support for elements. Evaluate this: (XMLDOMParser parse: ''<foo:root xmlns:foo="http://foo" xmlns="http://default"><bar>test</bar></foo:root>'') in a Workspace with cmd-p, and you should get back out roughly what you put in. When you add an element to another, it and all its descendants inherit the parent''s bindings. When you change the binding of a prefix, all descendants with the old bindings are rebound.

* Removed #parseWithNamespaces: and changed #parseDocumentFrom: (and #parse: by extension) to default to usesNamespaces=true. The reason for turning off namespace support by default was that the old, broken way of handling namespaces used expanded names (namespace URI + local name) as qualified names (prefix + local name) for elements that lacked a prefix and also assumed a global, default namespace (the URI of the namespace spec itself) for no apparent reason.

* Added #elementsAt:do: and deprecated #tagsNamed:childrenDo:. Now all undeprecated #tagsNamed: messages do some sort of depth-first traversal using #recurse: and all #element- messages operate on direct child elements; the naming convention is consistent.' id '91396896-8444-4d6c-bd4d-c9c2269c97ce' date '3 April 2010' time '12:41:06 am' author 'JAAyer' ancestors () stepChildren ())(name 'XML-Parser-Alexandre_Bergel.41' message 'minor fix in a test method' id '6851179c-6087-47fe-b0f4-11d3bfb2da55' date '3 March 2010' time '4:48:24 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.40' message 'minor fix in a test method' id '767c6436-afcb-4471-8977-acb74074567a' date '3 March 2010' time '4:47:24 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.39' message 'modified allAttributes and added allAsttributeAssociations as follows:
XMLElement>>allAttributes
	^ self attributes keys
	
XMLElement>>allAttributeAssociations
	^ self attributes associations



Tested in testParsing as:
	self assert: (firstPerson allAttributes = #(#''first-name'' #''employee-number'' #''family-name'')).
	self assert: firstPerson allAttributeAssociations asArray = {(#''first-name''->''Bob''). (#''employee-number''->''A0000''). (#''family-name''->''Gates'')}.
' id '2ecce43a-f0b1-447e-a779-ebc908dc6f7d' date '3 February 2010' time '12:21:46 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.38' message 'improvement proposed by JAAyer. Thanks!


Here is the list of improvements.

This update includes features, refactoring, and at least one bug fix.

To begin with, I realized there was a problem with the #= messages from the last package. This code will demonstrate:

doc := (XMLDOMParser parseDocumentFrom: ''<r><a>foo</a><b>bar</b><a>foo</a></r>'').
doc root removeElement: doc root elements last.

That removes the *first* <a> element, not the last, as both <a>s are equal according to #=, and #remove: (used by #removeElement:) removes the first object equal (#=) to its argument. I identified three possible solutions. The first would be to just ignore it. The second would be to remove the #= (and #hash) messages. The third would be to rewrite methods whose behavior depends on #= to depend instead on #== if to do otherwise would result in unexpected behavior (like in the code above). I initially opted for #3, but quickly realized code like this: "self elements removeAt: (self elements identityIndexOf: anElement)" would probably confuse future maintainers. I have chosen instead to just delete all #=/#hash messages. You can still compare documents and elements by sending them #asString and testing the results with #=. I added an #equalTo: message to XMLNodeWithElements that does just that.

Other changes:

* Added a comprehensive TestCase for XMLNode and its subclasses, XMLNodeTest.

* Child elements now properly notify their parents of name/namespace changes, and the qualified and unqualified names of elements are both cached as symbols.

* Added #nextNode/#previousNode and #nextElement/#previousElement to facilitate accessing siblings nodes/elements.

* Added #addNode:after:, #addNode:before: and #addNodeFirst:, and renamed #addAll: to #addNodes: and #removeAll to #removeNodes. Also added #removeNodes:. These methods return the node(s) added or removed.

* Refactored code out of #addElement: and #removeElement:, so they are no longer needed. The former is still kept for backwards compatibility and returns self. #addNode: and #removeNode: should be used instead.

* Previously #topElement would, because it sends #first to #elements, raise an unintuitive error when #elements is empty. It now returns nil in such circumstances. Added #topNode to complement it.

* Added #firstTagNamedAny:, #firstTagNamedAny:with:, #elementAtAny:, and #elementAtAny:ifAbsent:.

* #tagsNamed:ifReceiverDoAndRecurse:, #elementUnqualifiedAt:, #elementUnqualifiedAt:ifAbsent:, #valueFor:, and #valueFor:ifAbsent: are all redundant and have been marked deprecated accordingly.

* Added #parse: and #parseWithNamespaces: to XMLDOMParser. Since #parseDocumentFrom: and #parseDocumentFrom:useNamespaces: are sent so often, there should be shortcuts.

* SAXDriver now properly sends #startCData before invoking #characters: with CDATA and #endCData after. I actually toyed briefly with adding an XMLCDataNode class as other XML APIs have, but I honestly can''t see any benefit to doing so.

* I inserted class comments into XMLParser, SAXDriver, SAXHandler and XMLDOMParser.

* There are now two execute-around methods, #with:add: and #with:remove:, that take blocks that either add a node to #nodes or remove one from it. They handle establishing and breaking parent-child relationships, keeping the element cache up-to-date, and also catching corner-case issues like adding the same node twice or adding a node that is already the child of another node. To write methods that modify #nodes, you need only wrap the modifying code in #with:add: or #with:remove, and they will take care of the rest.

* Refactored some of my code from the previous package. It should be easier to follow now. Renamed #elementsDictionary to #elementsByName, and the private methods that manipulate #elements and #elementsByName now have an #elementCache* prefix.

* XMLElement attributes are stored as an IdentityDictionary, but the methods that access it directly by key send asSymbol to the key first, so the change is unlikely to break anything.

' id 'e5da0293-64a9-456a-b318-05618f422fdf' date '' time '11:46:22 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-JAAyer.37' message 'empty log message' id 'cfb0ac47-33d8-442c-8bf3-ca7037c12ffa' date '' time '11:27:36 pm' author 'JAAyer' ancestors ((name 'XML-Parser-Alexandre_Bergel.30' message 'remove the dependency with ClassTestCase.
This will ease the porting to Gemstone' id 'cefc8e10-5cf9-4234-b8ac-c43df916b76d' date '' time '5:37:10 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.29' message 'A bit of cleaning
Added extra test for the tokenizer
Added asSymbol when looking up attributes' id '86bb21f3-db73-401f-b0bd-d23e03461259' date '' time '11:26:36 am' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.29' message 'A bit of cleaning
Added extra test for the tokenizer
Added asSymbol when looking up attributes' id 'c9109661-ede2-465e-97c0-89c6da3f0c15' date '' time '11:25:55 am' author 'Alexandre Bergel' ancestors () stepChildren ())) stepChildren ())) stepChildren ())(name 'XML-Parser-JAAyer.36' message 'empty log message' id '5b5789a3-2ea6-4caa-a401-2b952ce9c6a3' date '' time '11:24:16 pm' author 'JAAyer' ancestors ((name 'XML-Parser-NoBlankLineAfterSignature.34' message 'empty log message' id 'db37873f-8ea5-4139-9bbe-b2d6f8d7c0b1' date '' time '2:40:31 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.33' message 'empty log message' id 'edaca8c0-6fb4-474e-869b-d6022906820c' date '' time '6:03:46 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.32' message 'empty log message' id '3035573d-5817-4c24-8ab3-a10aa9b58b31' date '' time '10:31:29 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.31' message 'empty log message' id 'f3814ba1-1c5e-43df-9528-bfd546326b94' date '' time '9:29:38 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.30' message 'empty log message' id 'd8e3427f-ebae-4192-a45a-29ee22e3d3ae' date '' time '10:09:37 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.29' message 'empty log message' id '5dd97371-5d93-4ee3-82b6-5fd9a653e553' date '' time '9:55:46 pm' author 'JAAyer' ancestors ((name 'XML-Parser-Alexandre_Bergel.28' message 'Recategorization' id '9ef076c5-f3c4-4809-a178-ba43e599be84' date '' time '4:46:08 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.27' message 'Improvement by george.herolyants@gmail.com
regarding line ending' id 'fcebd958-dc85-49f7-a764-790187e8e085' date '' time '4:31:36 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.26' message 'Improvements proposed by jaayer@zoho.com


* All searching and enumerating methods have been moved from XMLNode to XMLNodeWithElements. Unless you can think of a scenario where it would make sense to send any of them to a string or PI node, I think this is both a safe and sensible move.

* XMLNodeWithElements no longer contains an "elementsAndContents" collection. Instead it has a single "nodes" OrderedCollection that contains all child nodes in the order in which they appeared. The collection returned by #elementsAndContents (and enumerated via #elementsAndContentsDo:) is recreated using #nodes.

* #addElement: is now just for elements, and #addNode can be used for everything else (#addElement can still handle non-element nodes, though). #removeNode: and #removeElement: have also been added. Since, for backwards compatibility, the #add* methods don''t return the object added, neither will the #remove* method return that which was removed.

* Because the costly depth-first traversing #firstTag* and #tagsNamed* methods send #elementsDo: so many times, it makes sense to speed-up #elementsDo: by having it enumerate a separate collection just containing elements; thus, an "elements" collection has been added for that purpose. The repetitive identity checks in the XMLElement versions of those methods have been moved into a single #isNamed: method, which expects a symbol but can also handle strings by sending its argument #asSymbol before making #== comparisons. (#asSymbol is free for symbols, so you only pay if you use strings to specify tag names.)

* #tagsNamed:ifReceiverDo:, despite what its name implies (the plural "tags"), does no searching/enumeration. Outside of the implementations of other #tagsNamed:* messages, I doubt anyone uses this, so I have renamed it #ifNamed:do:.

* #tagsNamed:ifReceiverOrChildDo: does not work. The XMLElement version evaluates the block if it is so named and then invokes the superclass version of #tagsNamed:ifReceiverDo:, which is an empty method. Since it doesn''t work and is ridiculously named, I have removed it.

* #tagsNamed:ifReceiverDoAndRecurse: is, oddly enough, exactly equivalent to #tagsNamed:do:. I have removed the XMLElement version and reimplemented the XMLNode(WithElements) version to just send #tagsNamed:do: (although I''d prefer to remove it altogether).

* XMLNodeWithElements has a new instance variable: "elementsDictionary," an IndentityDictionay where keys are the qualified and unqualified names of child elements and values are OrderedCollections of so-named elements. This makes #elementAt: have O(1) complexity rather than O(n) and a->b->c traversal have O(n) complexity (where n is the number of nodes counting the root, the target, and all ancestors between) rather than the previous worst-case of O(n^2). This comes at the cost of additional memory and time to add/remove elements. You can rewrite Pastell accessors in terms of #elementsAt: and #elementAt:.

* The #contentsDo: and #elementsAndContentsDo: messages can now only be sent to XMLElements. It makes no sense to send them to documents or other kinds of nodes, as no other kind of node has text content. 

* I moved #parent and #parent: out of XMLNodeWithElements and put them in XMLNode instead, as every node in the DOM tree save the root has a parent. They actually work now, too, meaning that "((XMLDOMParser parseDocumentFrom: ''<p>foo<b>bar</b></p>'' readStream) firstTagNamed: #b) parent" will return the "p" element, not nil as it would before.

* How often have you sent #parseDocumentFrom: with an XML string as its argument (instead of a stream) and gotten a "message not understood" error? XMLDOMParser''s #parseDocumentFrom:useNamespaces: method now sends #readStream to "aStream" if it is not already a stream, so you will no longer receive such errors.

* #addEntity:value: has been removed. It has not been touched in ten years and sends a message (#entities) that is not understood.

* Confusing "entityName" parameter names in methods expecting element/tag names were replaced with "aSymbol."

* (This package also contains the #=/#hash methods submitted as a feature addition to bugs.squeak.)

Lastly, this codebase has had too many hands touching it and looks too inconsistent. I suggest configuring your formatter like so:

RBConfigurableFormatter
    maxLineLength: 80;
    newLinesAfterMethodPattern: 2;
    newLinesAfterMethodComment: 2;
    retainBlankLinesBetweenStatements: true;
    stringInsideBlocks: ''''.

And then reformatting XMLNode and its subclasses.<XML-Parser-JAAyer.25.mcz>
' id '30096ce3-84d4-442e-be07-04bdf5519131' date '' time '3:05:06 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-JAAyer.25' message 'empty log message' id '1c7e0d7d-31d0-4c49-8694-4c823a63d744' date '' time '12:47:59 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.24' message 'empty log message' id 'bad20136-a096-4b1a-ac22-b5c50a3b4027' date '' time '12:41:18 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.23' message 'empty log message' id 'dc20f9d2-55ce-477b-b970-8fa29921e224' date '' time '11:30:50 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.22' message 'empty log message' id '708b3609-6172-451a-adf7-ed12896cd6b3' date '' time '8:49:57 am' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.21' message 'empty log message' id '5200e3fd-4d92-4e7b-97b6-bebb3346a9ff' date '' time '9:32:11 pm' author 'JAAyer' ancestors ((name 'XML-Parser-Alexandre_Bergel.20' message 'improved:
XMLElement>>at: aSymbol
    ^ self attributeAt: aSymbol ifAbsent: ['''']

Thanks goes to J. A. Ayer' id 'd08d8266-6ec2-4ef8-9340-95c1a9e40b29' date '' time '10:31:56 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.20' message 'improved:
XMLElement>>at: aSymbol
    ^ self attributeAt: aSymbol ifAbsent: ['''']

Thanks goes to J. A. Ayer' id '6959f5c1-ad74-4698-bf08-95fcb9956867' date '' time '10:15:16 pm' author 'Alexandre Bergel' ancestors () stepChildren ())) stepChildren ())(name 'XML-Parser-JAAyer.2' message 'empty log message' id '3d72c1fc-082d-49b8-ab01-0dd17aae834a' date '' time '8:24:39 pm' author 'JAAyer' ancestors ((name 'XML-Parser-JAAyer.1' message 'empty log message' id '2c6605c5-4d63-43e9-b08e-c19b079fce7c' date '' time '8:15:03 pm' author 'JAAyer' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())(name 'XML-Parser-GeorgeHerolyants.21' message 'Writer fixed in order to make output more readable (use message #prettyPrint to enable this).' id '6009a1d8-4fcd-8946-8d5b-7294b2ab2f4b' date '1 October 2010' time '8:37:54 pm' author 'GeorgeHerolyants' ancestors ((name 'XML-Parser-GeorgeHerolyants.20' message 'Parser fixed to perform line endings normalization accordingly to the XML specification; test proposed by Avi Bryant added (see this thread http://aspn.activestate.com/ASPN/Mail/Message/squeak/1750442). ' id 'c2f734ef-ec77-f244-861d-41d2dd496053' date '1 September 2010' time '11:56:50 pm' author 'GeorgeHerolyants' ancestors ((name 'XML-Parser-Alexandre_Bergel.19' message 'Minor change in XMLElement>>contentString.
' id 'a8fe6c4d-fa69-4921-8ef5-f939749ee78b' date '' time '5:46:02 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.18' message 'Minor change in XMLElement>>contentString.
' id '18b81684-ce78-400f-84ff-b8fecce203a8' date '' time '5:45:31 pm' author 'Alexandre Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.17' message 'added some accessing methods. These methods are used by Pastell' id 'fa3a8d81-25f6-4ec3-9c3e-db3fab6a94c5' date '6 January 2009' time '10:34:41 am' author 'Alexandre.Bergel' ancestors ((name 'XML-Parser-Alexandre_Bergel.16' message 'Added a comment in XMLParser' id '8e4d0555-50fc-4fb9-95f1-26ab6c40dfd8' date '6 January 2009' time '10:05:30 am' author 'Alexandre.Bergel' ancestors ((name 'XML-Parser-AlexandreBergel.15' message 'Added a class XMLParserTest' id '534ddcca-c33e-4e81-8b5d-78e29523b8bf' date '' time '2:39:56 pm' author 'AlexandreBergel' ancestors ((name 'XML-Parser-mir.14' message 'fixed contentsDo:' id '6539d61e-ed4a-9244-8b85-c4e5417bbeb1' date '1 March 2008' time '2:29:51 pm' author 'mir' ancestors ((name 'XML-Parser-mir.13' message 'added support for Pastell/XPath access (parent)' id '3da00a19-4cc5-cb49-9ef7-b40699f964a2' date '' time '2:46:38 pm' author 'mir' ancestors ((name 'XML-Parser-mir.12' message 'fixed issues with entity expansion and parsing of nested streams' id 'a8ef7705-934c-e54f-9fea-17e07f008132' date '' time '8:06:23 pm' author 'mir' ancestors ((name 'XML-Parser-mir.11' message 'fixed addElement:
changed elements inst var to elementsAndContents to avoid confusion.' id '130566fb-ad3a-de43-abb3-4a56c6e3e23d' date '' time '5:31:48 pm' author 'mir' ancestors ((name 'XML-Parser-mir.10' message 'Fixed a number of issues (see below) and converted _ to :=.

There are two major changes in this version:
whitespace handling and the unification of elements and contents.
For backward compatibility elements and contents methods preserve their semantics.
elementsAndContents and elementsAndContentsDo: access the new unified collection

Some of the fixes rely on fixes in 3.8.2 or 3.10, most prominently 
String class>>findFirstInString:inSet:startingAt:

http://bugs.squeak.org/view.php?id=32
http://bugs.squeak.org/view.php?id=33
http://bugs.squeak.org/view.php?id=34
http://bugs.squeak.org/view.php?id=547
http://bugs.squeak.org/view.php?id=888
http://bugs.squeak.org/view.php?id=928
http://bugs.squeak.org/view.php?id=3082
http://bugs.squeak.org/view.php?id=3083
http://bugs.squeak.org/view.php?id=6746

' id '9bd978ae-8e19-4946-90f6-5f01ae28567c' date '' time '6:39:12 pm' author 'mir' ancestors ((name 'XML-Parser-mir.9' message 'language environment fix based on a fix by [:masashi | ^umezawa]' id '83b817db-e1bf-5849-aba6-b7c5c0d28b74' date '' time '11:58:32 am' author 'mir' ancestors ((name 'XML-Parser-mir.8' message 'unicode fix from [:masashi | ^umezawa] 
example fix
added namespace aware parser invocations
indenting XMLWriter
lazy init for attributes' id 'afc3bcf2-bac2-bb4b-b17c-7f3a47d1564e' date '' time '11:32:37 am' author 'mir' ancestors ((name 'XML-Parser-bf.7' message '- fix reading whitespaces in closing tag' id 'b03ed7b2-d6ce-11da-9220-000d93ca8ba0' date '' time '5:50:16 pm' author 'bf' ancestors ((name 'XML-Parser-thf.6' message 'should now work clean with encoding Settings' id '490456fd-4f78-ee4c-b4ab-5b1376ee5cf5' date '2 March 2006' time '2:38:29 pm' author 'thf' ancestors ((name 'XML-Parser-thf.5' message '' id '817bbe38-4e92-4d6a-a8e1-daf812ed7567' date '9 July 2005' time '1:28:28 pm' author 'thf' ancestors ((name 'XML-Parser-thf.4' message 'set Encoder for XMLWriter' id '959e9e51-7af2-4634-ad91-d1f32e811c5f' date '9 January 2005' time '3:45:41 pm' author 'thf' ancestors ((name 'XML-Parser-thf.3' message 'sets encoding for Files in Squeak 3.8' id 'c3c3927d-8d5c-41c5-bb52-df8065d5d727' date '' time '12:17:02 pm' author 'thf' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())(name 'XML-Parser-mir.3' message 'Yaxo 2.2 release

with fixes by 
umejava@mars.dti.ne.jp (unicode)
mas@wellthot.com (attribute init)
nika.nospam@kassube.de (dom parser example)' id 'ad602358-9389-be47-bcdf-a6343b00b955' date '' time '4:17:02 pm' author 'mir' ancestors ((name 'XML-Parser-mir.2' message 'Yaxo 2.1 release' id 'fcd07bb1-1c15-2f48-92a3-b0aedaaf24a9' date '' time '11:14:33 am' author 'mir' ancestors ((name 'XML-Parser-mir.1' message 'Yaxo release 2.1' id '9be3532f-fdab-d54d-bc58-84e96735340c' date '' time '10:32:36 am' author 'mir' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())