Merge branch 'master' into polymorphic_extern_classes
[nit.git] / lib / standard / string_search.nit
index 8dcf90a..5aeac25 100644 (file)
@@ -84,6 +84,8 @@ interface Pattern
                res.add(new Match(s.to_s, i, s.length - i))
                return res
        end
+
+       protected fun is_in(s: Text): Bool do return search_index_in(s, 0) != -1
 end
 
 # BM_Pattern are pre-compiled string motif for the Boyer-Moore algorithm.
@@ -149,10 +151,10 @@ class BM_Pattern
        end
 
        # searched motif
-       var _motif: String
+       private var motif: String
 
        # length of the motif
-       var _length: Int
+       private var length: Int
 
        private fun bc(e: Char): Int
        do
@@ -164,10 +166,10 @@ class BM_Pattern
        end
 
        # good shifts
-       var _gs: Array[Int]
+       private var gs: Array[Int]
        
        # bad characters
-       var _bc_table: Map[Char, Int]
+       private var bc_table: Map[Char, Int]
 
        private fun compute_bc
        do
@@ -355,6 +357,17 @@ redef class Text
        # @deprecated alias for `split`
        fun split_with(p: Pattern): Array[SELFTYPE] do return self.split(p)
 
+       # Split `self` on the first `=`
+       #
+       #     assert "hello".split_once_on('l') == ["he", "lo"]
+       #     assert "a, b, c, d, e".split_once_on(", ") == ["a", "b, c, d, e"]
+       fun split_once_on(p: Pattern): Array[SELFTYPE]
+       do
+               var m = p.search_in(self, 0)
+               if m == null then return [self]
+               return new Array[SELFTYPE].with_items(substring(0, m.from), substring_from(m.after))
+       end
+
        # Replace all occurences of a pattern with a string
        #
        #     assert "hlelo".replace("le", "el")             ==  "hello"
@@ -364,16 +377,10 @@ redef class Text
                return self.split_with(p).join(string)
        end
 
-       # Escape the four characters `<`, `>`, `&`, and `"` with their html counterpart
+       # Does `self` contains at least one instance of `pattern`?
        #
-       #     assert "a&b->\"x\"".html_escape      ==  "a&amp;b-&gt;&quot;x&quot;"
-       fun html_escape: SELFTYPE
-       do
-               var ret = self
-               if ret.chars.has('&') then ret = ret.replace('&', "&amp;")
-               if ret.chars.has('<') then ret = ret.replace('<', "&lt;")
-               if ret.chars.has('>') then ret = ret.replace('>', "&gt;")
-               if ret.chars.has('"') then ret = ret.replace('"', "&quot;")
-               return ret
-       end
+       #     assert "hello".has('l')
+       #     assert "hello".has("ll")
+       #     assert not "hello".has("lll")
+       fun has(pattern: Pattern): Bool do return pattern.is_in(self)
 end