relaxng/trunk/RNG__ListPattern.st
changeset 0 5057afe1ec87
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/relaxng/trunk/RNG__ListPattern.st	Tue Apr 08 19:47:42 2008 +0000
@@ -0,0 +1,150 @@
+"{ Package: 'stx:goodies/xmlsuite/relaxng' }"
+
+"{ NameSpace: RNG }"
+
+Pattern subclass:#ListPattern
+	instanceVariableNames:'itemPatterns repeat'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Relax NG-Patterns'
+!
+
+
+!ListPattern methodsFor:'accessing'!
+
+charactersFromObject:aCollection 
+
+    | s |
+    s := String new writeStream.
+
+    self patternsAndObjects:aCollection
+        do:[:pattern :object|
+            s nextPutAll:(pattern charactersFromObject:object); space.
+        ].
+    ^s contents trimSeparators.
+
+    "Created: / 16-05-2005 / 13:41:52 / masca"
+!
+
+name
+    ^'#pcdata'
+
+    "Created: / 14-05-2005 / 18:26:57 / janfrog"
+    "Modified: / 19-05-2005 / 09:57:26 / masca"
+!
+
+objectFromCharacters:aString 
+    |s|
+
+    s := Set new.
+    self patternsAndObjects:aString asArrayOfSubstrings
+        do:[:pattern :string | s add:(pattern objectFromCharacters:string) ].
+    ^ s
+
+    "Created: / 14-05-2005 / 18:27:14 / janfrog"
+    "Modified: / 14-05-2005 / 22:15:13 / janfrog"
+    "Modified: / 16-05-2005 / 13:42:27 / masca"
+! !
+
+!ListPattern methodsFor:'initialization'!
+
+postParseFor:aSchema
+
+    itemPatterns := self node firstChild isRepeatingNode
+        ifTrue:[
+            repeat := true.
+            self node firstChild children collect:[:c|c pattern]]
+        ifFalse:[
+            repeat := false.
+            self node children collect:[:c|c pattern]]
+
+    "Created: / 14-05-2005 / 21:26:26 / janfrog"
+! !
+
+!ListPattern methodsFor:'printing'!
+
+nameForPrint
+
+    ^'#pcdata:list'
+
+    "Created: / 19-05-2005 / 09:55:30 / masca"
+! !
+
+!ListPattern methodsFor:'private'!
+
+patternsAndObjects:strings do:block 
+    |idx|
+
+    idx := 0.
+    strings do:[:str | 
+        (idx := idx + 1) = (itemPatterns size + 1) ifTrue:[
+            self error:'No more patterns'
+        ].
+        block value:(itemPatterns at:idx) value:str.
+        (repeat and:[ idx = itemPatterns size ]) ifTrue:[
+            idx := 0
+        ].
+    ].
+    repeat ifTrue:[
+        idx = 0 ifFalse:[
+            self error:'Not enough items'
+        ]
+    ] ifFalse:[
+        idx = itemPatterns size ifFalse:[
+            self error:'Not enough items'
+        ]
+    ]
+
+    "Created: / 16-05-2005 / 13:42:27 / masca"
+! !
+
+!ListPattern methodsFor:'testing'!
+
+isListPattern
+    ^ true
+
+    "Created: / 14-05-2005 / 20:34:31 / janfrog"
+!
+
+isPCDataPattern
+
+    ^true
+
+    "Created: / 14-05-2005 / 18:27:29 / janfrog"
+! !
+
+!ListPattern methodsFor:'validation support'!
+
+validate:aString for:validator 
+    |idx strings|
+
+    idx := 1.
+    strings := aString asArrayOfSubstrings.
+    (strings isEmpty and:[ self node firstChild isOneOrMoreNode ]) ifTrue:[
+        ^ validator validationError:'Empty list'
+    ].
+    [
+        self patternsAndObjects:strings
+            do:[:pattern :string | 
+                pattern validate:string for:validator.
+                idx := idx + 1.
+            ]
+    ] on:Smalltalk::Error
+            do:[:ex | 
+        validator 
+            validationError:'Cannot validate list item ' , idx printString , ': ' 
+                    , ex errorString.
+        ^ false
+    ].
+    ^ true
+
+    "Created: / 14-05-2005 / 18:27:34 / janfrog"
+    "Modified: / 14-05-2005 / 22:10:57 / janfrog"
+    "Modified: / 16-05-2005 / 13:42:27 / masca"
+! !
+
+!ListPattern class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /opt/data/cvs/stx/goodies/xmlsuite/relaxng/RNG__ListPattern.st,v 1.1.1.1 2005-11-01 22:07:13 vranyj1 Exp $'
+! !