Moved #enumerate onto StringRay. Now String#enumerate (StringRay::Includes#enumerate...
[stringray.git] / lib / stringray / includes.rb
blobacb848d3447f1bf28154f81fcd40d24962895b92
1 class StringRay < Array
2   
3   # This is mixed into any class including +StringRay+. It exposes
4   # +#to_stray+ and +#enumerate+ to said class's instances.
5   module Includes
6     
7     @@whitespace = nil
8     @@delemiters = nil
9     
10     ##
11     # @see #enumerate
12     # @see StringRay.whitespace=
13     # Controls how +#enumerate+ deals with whitespace by default.
14     # 
15     # @param [Symbol] whitespace How to handle whitespace - :attach_before,
16     #   :standalone, or :attach_after
17     def self.whitespace= whitespace
18       @@whitespace = whitespace
19     end
20     
21     def self.whitespace
22       @@whitespace || StringRay::whitespace
23     end
24     
25     ##
26     # @see #enumerate
27     # @see StringRay.delemiters=
28     # Controls how +#enumerate+ deals with delemiters by default.
29     # 
30     # @param [Symbol] delemiters How to handle delemiters - :attach_before,
31     #   :standalone, or :attach_after
32     def self.delemiters= delemiters
33       @@delemiters = delemiters
34     end
35     
36     def self.delemiters
37       @@delemiters || StringRay::delemiters
38     end
40     ##
41     # Splits a string into an array of +StringRay+ container objects (+Word+,
42     # +Whitespace+, and +Delimiter+).
43     # 
44     # @yield [element] Allows each 'element' of the string to be operated on
45     #   after it is processed
46     # @yieldparam [Word, Whitespace, Delimiter] element The last processed
47     #   string 'element'
48     # @return [StringRay[Word, Whitespace, Delimiter]] An array of +StringRay+
49     #   container objects
50     # @since 2
51     def to_stray
52       ray = StringRay.new
53       new_element = lambda do |element|
54         yield ray.last if block_given? unless ray.empty?
55         ray << element
56       end
57       
58       self.scan(/./um) do |char|
59         if Delimiter::Characters.include? char
60           new_element[Delimiter.new(char)]
61           
62         elsif Whitespace::Characters.include? char
63           if ray.last.is_a? Whitespace
64             ray.last << char
65           else
66             new_element[Whitespace.new(char)]
67           end
68           
69         else
70           if ray.last.is_a? Word
71             ray.last << char
72           else
73             new_element[Word.new(char)]
74           end
75           
76         end
77       end
78       
79       if block_given?
80         yield ray.last
81         self
82       else
83         ray
84       end
85     end
86     
87     def enumerate options = {}, &block
88       self.to_stray.enumerate options, &block
89     end
90     
91     # @deprecated
92     alias_method :each_word, :enumerate
93     
94     def self.included klass
95       unless RUBY_VERSION <= "1.9"
96         alias_method :each, :enumerate
97         include Enumerable
98       end
99     end
100     
101   end