SystemOrganization addCategory: #'PetitXPath-Core'! SystemOrganization addCategory: #'PetitXPath-Nodes'! !PPXmlDocument methodsFor: '*petitxpath-extensions' stamp: 'EstebanLorenzano 5/19/2011 01:33'! find: aString ^self lastChild find: aString! ! PPCompositeParser subclass: #PPXPathGrammar instanceVariableNames: 'node nameToken index path multiple attributeFilter string' classVariableNames: '' poolDictionaries: '' category: 'PetitXPath-Core'! !PPXPathGrammar methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/27/2011 15:18'! attributeFilter ^$[ asParser, nameToken, $= asParser, string, $] asParser ==> [ :nodes | Array with: nodes second with: nodes fourth ]! ! !PPXPathGrammar methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/4/2011 15:16'! index ^$[ asParser, #digit asParser plus, $] asParser ==> [ :nodes | Number readFrom: nodes second readStream ]! ! !PPXPathGrammar methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/27/2011 15:15'! multiple ^$* asParser! ! !PPXPathGrammar methodsFor: 'as yet unclassified' stamp: 'TudorGirba 12/22/2011 07:43'! nameToken ^ (#letter asParser / $_ asParser / $- asParser) plus flatten! ! !PPXPathGrammar methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/27/2011 14:31'! node ^nameToken, (multiple | index | attributeFilter) optional! ! !PPXPathGrammar methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/4/2011 15:24'! path ^$/ asParser optional, node, ($/ asParser, node ==> #second) star ==> [ :nodes | OrderedCollection new add: nodes second; addAll: nodes third; asArray ]! ! !PPXPathGrammar methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/4/2011 15:20'! start ^path end! ! !PPXPathGrammar methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/27/2011 15:13'! string ^$" asParser, $" asParser negate star flatten, $" asParser ==> [ :nodes | nodes second ]! ! PPXPathGrammar subclass: #PPXPathParser instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PetitXPath-Core'! !PPXPathParser methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/27/2011 15:19'! attributeFilter ^super attributeFilter ==> [ :nodes | PPXPathAttributeFilter withName: nodes first value: nodes second ]! ! !PPXPathParser methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/27/2011 15:14'! index ^super index ==>[ :nodes | PPXPathIndexFilter withIndex: nodes ]! ! !PPXPathParser methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/27/2011 15:16'! multiple ^super multiple ==> [ :nodes | PPXPathMultipleFilter new ]! ! !PPXPathParser methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/27/2011 15:09'! node ^super node ==> [ :nodes | PPXPathNode withTag: nodes first filter: nodes second ]! ! !PPXmlElement methodsFor: '*petitxpath-extensions' stamp: 'EstebanLorenzano 5/19/2011 01:58'! contentDate ^self contentText asDate! ! !PPXmlElement methodsFor: '*petitxpath-extensions' stamp: 'EstebanLorenzano 5/19/2011 02:02'! contentDateAndTime ^self contentText asTimeStamp ! ! !PPXmlElement methodsFor: '*petitxpath-extensions' stamp: 'EstebanLorenzano 5/19/2011 01:56'! contentNumber ^self contentText asNumber! ! !PPXmlElement methodsFor: '*petitxpath-extensions' stamp: 'EstebanLorenzano 5/19/2011 01:43'! contentText ^self firstChild data! ! !PPXmlElement methodsFor: '*petitxpath-extensions' stamp: 'EstebanLorenzano 5/27/2011 14:03'! find: aString ^self findXPath: (PPXPathParser parse: aString)! ! !PPXmlElement methodsFor: '*petitxpath-extensions' stamp: 'EstebanLorenzano 5/27/2011 15:23'! findXPath: nodesCollection | node remaining answer | nodesCollection ifEmpty: [ ^self ]. node := nodesCollection first. remaining := nodesCollection allButFirst. answer := node resolveOn: self. ^answer isCollection ifTrue: [ answer collect: [ :each | each findXPath: remaining ] ] ifFalse: [ answer findXPath: remaining ]! ! Error subclass: #PPXPathError instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PetitXPath-Nodes'! Object subclass: #PPXPathFilter instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PetitXPath-Nodes'! PPXPathFilter subclass: #PPXPathAttributeFilter instanceVariableNames: 'name value' classVariableNames: '' poolDictionaries: '' category: 'PetitXPath-Nodes'! !PPXPathAttributeFilter class methodsFor: 'instance creation' stamp: 'EstebanLorenzano 5/27/2011 15:17'! withName: nameString value: valueString ^self basicNew initializeName: nameString value: valueString; yourself ! ! !PPXPathAttributeFilter methodsFor: 'initialization' stamp: 'EstebanLorenzano 5/27/2011 14:28'! initializeName: nameString value: valueString name := nameString. value := valueString. self initialize ! ! !PPXPathAttributeFilter methodsFor: 'accessing' stamp: 'EstebanLorenzano 5/27/2011 15:16'! name ^name! ! !PPXPathAttributeFilter methodsFor: 'printing' stamp: 'EstebanLorenzano 5/27/2011 14:29'! printOn: aStream aStream nextPut: $[; nextPutAll: self name; nextPut: $=; nextPut: $"; nextPutAll: self value; nextPut: $"; nextPut: $]! ! !PPXPathAttributeFilter methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/27/2011 14:30'! resolveOn: anArray ^anArray detect: [ :each | (each attributeAt: self name) = self value ] ! ! !PPXPathAttributeFilter methodsFor: 'accessing' stamp: 'EstebanLorenzano 5/27/2011 15:16'! value ^value! ! !PPXPathFilter methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/27/2011 14:27'! resolveOn: anArray self subclassResponsibility! ! PPXPathFilter subclass: #PPXPathIndexFilter instanceVariableNames: 'index' classVariableNames: '' poolDictionaries: '' category: 'PetitXPath-Nodes'! !PPXPathIndexFilter class methodsFor: 'instance creation' stamp: 'EstebanLorenzano 5/27/2011 14:24'! withIndex: aNumber ^self basicNew initialize: aNumber; yourself ! ! !PPXPathIndexFilter methodsFor: 'accessing' stamp: 'EstebanLorenzano 5/27/2011 14:23'! index ^index! ! !PPXPathIndexFilter methodsFor: 'initialization' stamp: 'EstebanLorenzano 5/27/2011 14:24'! initialize: aNumber index := aNumber. self initialize ! ! !PPXPathIndexFilter methodsFor: 'printing' stamp: 'EstebanLorenzano 5/27/2011 14:23'! printOn: aStream aStream nextPut: $[; nextPutAll: self index asString; nextPut: $]! ! !PPXPathIndexFilter methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/27/2011 15:34'! resolveOn: anArray self index <= anArray size ifFalse: [ PPXPathError signal: 'Invalid index' ]. ^anArray at: self index ! ! PPXPathFilter subclass: #PPXPathMultipleFilter instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PetitXPath-Nodes'! !PPXPathMultipleFilter methodsFor: 'printing' stamp: 'EstebanLorenzano 5/27/2011 14:22'! printOn: aStream aStream nextPut: $* ! ! !PPXPathMultipleFilter methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/27/2011 14:27'! resolveOn: anArray ^anArray ! ! Object subclass: #PPXPathNode instanceVariableNames: 'tag filter' classVariableNames: '' poolDictionaries: '' category: 'PetitXPath-Nodes'! !PPXPathNode class methodsFor: 'instance creation' stamp: 'EstebanLorenzano 5/4/2011 15:30'! new self error: 'Use #tag:qualifier:'! ! !PPXPathNode class methodsFor: 'instance creation' stamp: 'EstebanLorenzano 5/27/2011 15:09'! withTag: aString filter: anObject ^self basicNew initializeTag: aString filter: anObject; yourself! ! !PPXPathNode methodsFor: 'accessing' stamp: 'EstebanLorenzano 5/27/2011 15:08'! filter ^filter ifNil: [ filter := PPXPathIndexFilter withIndex: 1 ]! ! !PPXPathNode methodsFor: 'initialization' stamp: 'EstebanLorenzano 5/27/2011 15:08'! initializeTag: aString filter: anObject tag := aString. filter := anObject. self initialize.! ! !PPXPathNode methodsFor: 'printing' stamp: 'EstebanLorenzano 5/27/2011 15:08'! printOn: aStream aStream nextPutAll: self tag; nextPutAll: self filter asString. ! ! !PPXPathNode methodsFor: 'as yet unclassified' stamp: 'EstebanLorenzano 5/27/2011 15:25'! resolveOn: anXmlElement | matchingChildren | matchingChildren := anXmlElement childNodes select: [ :each | each isElement and: [ each name localName = self tag ] ]. ^self filter resolveOn: matchingChildren ! ! !PPXPathNode methodsFor: 'accessing' stamp: 'EstebanLorenzano 5/4/2011 15:31'! tag ^tag! !