added:
authorJan Vrany <jan.vrany@fit.cvut.cz>
Tue, 18 Oct 2011 21:44:20 +0200
changeset 2672 06e4ab62a588
parent 2671 e622609b3ef9
child 2673 ea71dab56953
added: #includes: #matches: #printOn: changed: #readFrom:onError:
StringPattern.st
--- a/StringPattern.st	Wed Oct 12 15:31:52 2011 +0200
+++ b/StringPattern.st	Tue Oct 18 21:44:20 2011 +0200
@@ -7,6 +7,20 @@
 	category:'Collections-Text-Support'
 !
 
+StringPattern subclass:#Includes
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:StringPattern
+!
+
+StringPattern subclass:#Matches
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:StringPattern
+!
+
 Object subclass:#Parser
 	instanceVariableNames:'stream errorBlock'
 	classVariableNames:''
@@ -49,10 +63,32 @@
 
 !StringPattern class methodsFor:'instance creation'!
 
+includes: aString
+
+    ^Includes new on: aString
+
+    "Created: / 18-10-2011 / 21:22:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+matches: aString
+
+    ^Matches new on: aString
+
+    "Created: / 18-10-2011 / 21:23:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 readFrom:aStringOrStream onError:exceptionBlock
 
     ^Parser parse: aStringOrStream readStream onError: exceptionBlock
 
+    "
+        StringPattern readFrom: 'abcd'
+        StringPattern readFrom: ' abcd'
+        StringPattern readFrom: ' a??d'
+        StringPattern readFrom: ' a*d*'
+        StringPattern readFrom: 'abcd*'
+    "
+
     "Created: / 09-08-2011 / 13:39:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
@@ -99,6 +135,57 @@
     "Created: / 09-08-2011 / 13:47:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!StringPattern methodsFor:'printing & storing'!
+
+printOn:aStream
+    "append a printed representation if the receiver to the argument, aStream"
+
+    super printOn:aStream.
+    aStream nextPut:$(.
+    data printOn: aStream.
+    aStream nextPut:$).
+
+    "Modified: / 18-10-2011 / 21:28:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!StringPattern::Includes methodsFor:'matching'!
+
+match:string relax:relax
+
+    relax == 1 ifTrue:[
+        ^string includes: data
+    ].
+    relax == 2 ifTrue:[
+        ^string matches: ('*', data, '*')
+    ].
+    ^false.
+
+    "Modified: / 18-10-2011 / 21:33:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!StringPattern::Matches methodsFor:'matching'!
+
+match:string relax:relax
+
+    relax == 1 ifTrue:[
+        ^string matches: data
+    ].
+    relax == 2 ifTrue:[
+        | relaxed |
+        relaxed := data.
+        data first ~~  $* ifTrue:[
+            relaxed := '*' , relaxed.
+        ].
+        data last ~~  $* ifTrue:[
+            relaxed := relaxed , '*'.
+        ].
+        ^string matches: relaxed
+    ].
+    ^false.
+
+    "Modified: / 18-10-2011 / 21:35:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !StringPattern::Parser class methodsFor:'parsing'!
 
 parse: aStream onError: errorBlock
@@ -112,9 +199,9 @@
 
 parse
 
-    "Sorry, no fancy patterns now"
+    "Sorry, no fancy AND/OR patterns now"
 
-    ^StringPattern startsWith: stream contents.
+   ^self parsePattern.
 
     "Created: / 09-08-2011 / 13:41:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
@@ -126,6 +213,36 @@
     ^self parse.
 
     "Created: / 09-08-2011 / 13:40:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parsePattern
+
+    | data |
+
+    stream position1Based == 1 ifTrue:[
+        (stream peek notNil and:[stream peek isWhiteSpace]) ifFalse:[
+            data := stream upToSeparator.
+            (data includes: $*) ifTrue:[
+                ^StringPattern matches: data
+            ].
+            (data includes: $?) ifTrue:[
+                ^StringPattern matches: data
+            ].
+            ^StringPattern startsWith: data    
+        ].
+    ].
+
+    stream skipSeparators.
+    data := stream upToSeparator.
+    (data includes: $*) ifTrue:[
+        ^StringPattern matches: data
+    ].
+    (data includes: $?) ifTrue:[
+        ^StringPattern matches: data
+    ].
+    ^StringPattern includes: data
+
+    "Created: / 18-10-2011 / 21:26:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !StringPattern::StartsWith methodsFor:'matching'!
@@ -136,10 +253,10 @@
         ^string startsWith: data.
     ].
     relax == 2 ifTrue:[
-        ^((string copyTo: data size) levenshteinTo: data) < 8"Wild guess, we will see"
+        ^string includes: data
     ].
     relax == 3 ifTrue:[
-        ^((string copyTo: data size) levenshteinTo: data) < 14"Wild guess, we will see"
+        ^string matches: ('*', data, '*')
     ].
     ^false.
 
@@ -154,9 +271,9 @@
 !StringPattern class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic2/StringPattern.st,v 1.1 2011-08-09 12:56:35 vrany Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/StringPattern.st,v 1.2 2011-10-18 19:44:20 vrany Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic2/StringPattern.st,v 1.1 2011-08-09 12:56:35 vrany Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/StringPattern.st,v 1.2 2011-10-18 19:44:20 vrany Exp $'
 ! !