CharacterArray.st
changeset 17241 8f12aadd28bb
parent 17233 2e3faa540679
child 17364 62b006f570cb
--- a/CharacterArray.st	Sun Dec 21 23:41:28 2014 +0100
+++ b/CharacterArray.st	Mon Dec 22 01:19:04 2014 +0100
@@ -3820,6 +3820,96 @@
         ^ newString.
     ].
     ^ super copyWith:aCharacter
+!
+
+restAfter:keyword withoutSeparators:strip
+    "compare the left of the receiver with keyword,
+     if it matches return the right.
+     Finally, if strip is true, remove whiteSpace.
+     This method is used to match and extract lines of the form:
+        something: rest
+     where we are interested in rest, but only if the receiver string
+     begins with something.
+
+     You may wonder why such a specialized method exists here
+     - this is so common when processing mailboxes,
+     rcs files, nntp/pop3 responses, that is was considered worth
+     a special method here to avoid having the code below a hundred
+     times in variuos places."
+
+    |rest|
+
+    (self startsWith:keyword) ifTrue:[
+        rest := self copyFrom:(keyword size + 1).
+        strip ifTrue:[
+            rest := rest withoutSeparators
+        ].
+        ^ rest
+    ].
+    ^ nil
+
+    "
+     'foo: hello world' restAfter:'foo:' withoutSeparators:true
+     'funny: something' restAfter:'foo:' withoutSeparators:true
+
+     'foo:     hello world    ' restAfter:'foo:' withoutSeparators:true
+     'foo:     hello world    ' restAfter:'foo:' withoutSeparators:false
+    "
+
+    "Created: 25.11.1995 / 11:04:18 / cg"
+!
+
+split:separator
+    "splits into an array of substrings.
+     Separator may be a single character or a separating string."
+
+    separator isCharacter ifTrue:[
+        ^ self asCollectionOfSubstringsSeparatedBy:separator
+    ].
+    (separator isString and:[separator size == 1]) ifTrue:[
+        ^ self asCollectionOfSubstringsSeparatedBy:(separator first)
+    ].
+    ^ self asCollectionOfSubstringsSeparatedByAll:separator
+
+    "
+     JavaScriptParser
+        evaluate:'''bla-fasel-suelz''.split(''-'')'  
+
+     JavaScriptParser
+        evaluate:'''bla - fasel - suelz''.split('' - '')'       
+
+     'bla - fasel - suelz' split:' - '       
+    "
+!
+
+splitAtString:subString withoutSeparators:strip
+    "If the receiver is of the form:
+        <left><subString><right>
+     return a collection containing left and right only.
+     If strip is true, remove whiteSpace in the returned substrings."
+
+    |idx left right|
+
+    (idx := self indexOfSubCollection:subString) ~~ 0 ifTrue:[
+        left := self copyTo:(idx - 1).
+        right := self copyFrom:(idx + subString size).
+        strip ifTrue:[
+            left := left withoutSeparators.
+            right := right withoutSeparators.
+        ].
+        ^ StringCollection with:left with:right
+    ].
+    self error:'substring not present in receiver' mayProceed:true.
+    ^ self
+
+    "
+     'hello -> world' splitAtString:'->' withoutSeparators:false  
+     'hello -> world' splitAtString:'->' withoutSeparators:true  
+     'hello -> ' splitAtString:'->' withoutSeparators:true       
+     'hello > error' splitAtString:'->' withoutSeparators:true 
+    "
+
+    "Created: 25.11.1995 / 11:04:18 / cg"
 ! !
 
 !CharacterArray methodsFor:'displaying'!
@@ -5121,7 +5211,7 @@
      The original code only looked at the first character being a vowel;
      this has been enhanced by some heuristics - not perfect, still."
 
-    |firstChar secondChar|
+    |firstChar secondChar thirdChar|
 
     firstChar := (self at:1) asLowercase.
     ((firstChar isVowel and:[firstChar ~~ $u]) or:[firstChar == $x]) ifTrue:[
@@ -5130,13 +5220,19 @@
 
     (self size >= 3) ifTrue:[
         secondChar := (self at:2) asLowercase.
+        thirdChar := (self at:3) asLowercase.
         (firstChar isVowel not
         and:[(secondChar isVowel or:[secondChar == $y]) not       
-        and:[(self at:3) isVowel not ]]) ifTrue:[
+        and:[thirdChar isVowel not ]]) ifTrue:[
             "/ exceptions: 3 non-vowels in a row: looks like an abbreviation
             (self size > 4) ifTrue:[
-                ((self asLowercase startsWith:'scr') and:[(self at:4) isVowel]) ifTrue:[
-                    ^ 'a'
+                (firstChar = $s) ifTrue:[
+                    ((secondChar = $c and:[thirdChar = $r])
+                    or:[ (secondChar = $t and:[thirdChar = $r]) ]) ifTrue:[
+                        (self at:4) isVowel ifTrue:[
+                            ^ 'a'
+                        ]
+                    ]
                 ].
             ].
             "/ an abbreviation; treat x, s as vowels
@@ -5158,6 +5254,7 @@
         'cvs' article.     
         'cvssource' article.     
         'symbol' article.     
+        'string' article.     
     "
 !
 
@@ -6877,73 +6974,6 @@
      'hello world' findRangeOfString:'llo'
      'hello world' findRangeOfString:'ole'
     "
-!
-
-restAfter:keyword withoutSeparators:strip
-    "compare the left of the receiver with keyword,
-     if it matches return the right.
-     Finally, if strip is true, remove whiteSpace.
-     This method is used to match and extract lines of the form:
-        something: rest
-     where we are interested in rest, but only if the receiver string
-     begins with something.
-
-     You may wonder why such a specialized method exists here
-     - this is so common when processing mailboxes,
-     rcs files, nntp/pop3 responses, that is was considered worth
-     a special method here to avoid having the code below a hundred
-     times in variuos places."
-
-    |rest|
-
-    (self startsWith:keyword) ifTrue:[
-        rest := self copyFrom:(keyword size + 1).
-        strip ifTrue:[
-            rest := rest withoutSeparators
-        ].
-        ^ rest
-    ].
-    ^ nil
-
-    "
-     'foo: hello world' restAfter:'foo:' withoutSeparators:true
-     'funny: something' restAfter:'foo:' withoutSeparators:true
-
-     'foo:     hello world    ' restAfter:'foo:' withoutSeparators:true
-     'foo:     hello world    ' restAfter:'foo:' withoutSeparators:false
-    "
-
-    "Created: 25.11.1995 / 11:04:18 / cg"
-!
-
-splitAtString:subString withoutSeparators:strip
-    "If the receiver is of the form:
-        <left><subString><right>
-     return a collection containing left and right only.
-     If strip is true, remove whiteSpace in the returned substrings."
-
-    |idx left right|
-
-    (idx := self indexOfSubCollection:subString) ~~ 0 ifTrue:[
-        left := self copyTo:(idx - 1).
-        right := self copyFrom:(idx + subString size).
-        strip ifTrue:[
-            left := left withoutSeparators.
-            right := right withoutSeparators.
-        ].
-        ^ StringCollection with:left with:right
-    ].
-    self error:'substring not present in receiver' mayProceed:true.
-    ^ self
-
-    "
-     'hello -> world' splitAtString:'->' withoutSeparators:false  
-     'hello -> world' splitAtString:'->' withoutSeparators:true  
-     'hello -> ' splitAtString:'->' withoutSeparators:true       
-     'hello > error' splitAtString:'->' withoutSeparators:true 
-    "
-
-    "Created: 25.11.1995 / 11:04:18 / cg"
 ! !
 
 !CharacterArray methodsFor:'testing'!
@@ -7266,11 +7296,11 @@
 !CharacterArray class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/CharacterArray.st,v 1.562 2014-12-19 17:19:40 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/CharacterArray.st,v 1.563 2014-12-22 00:19:04 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic/CharacterArray.st,v 1.562 2014-12-19 17:19:40 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/CharacterArray.st,v 1.563 2014-12-22 00:19:04 cg Exp $'
 ! !