Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
stringray/lib/stringray.rb
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
163 lines (139 sloc)
4.02 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'stringray/includes' | |
class StringRay < Array | |
Version = 3 | |
@@whitespace = nil | |
@@delemiters = nil | |
## | |
# @see StringRay::Includes#enumerate | |
# @see StringRay::Includes.whitespace= | |
# Controls how +StringRay::Includes#enumerate+ deals with whitespace by default. | |
# | |
# @param [Symbol] whitespace How to handle whitespace - :attach_before, | |
# :standalone, or :attach_after | |
def self.whitespace= whitespace | |
@@whitespace = whitespace | |
end | |
def self.whitespace | |
@@whitespace ||= :attach_before | |
end | |
## | |
# @see StringRay::Includes#enumerate | |
# @see StringRay::Includes.delemiters= | |
# Controls how +StringRay::Includes#enumerate+ deals with delemiters by default. | |
# | |
# @param [Symbol] delemiters How to handle delemiters - :attach_before, | |
# :standalone, or :attach_after | |
def self.delemiters= delemiters | |
@@delemiters = delemiters | |
end | |
def self.delemiters | |
@@delemiters ||= :attach_before | |
end | |
# @see StringRay::Word.new | |
def self.Word word; Word.new word; end | |
## | |
# @see StringRay::Includes#to_stray | |
# @see #whitespace | |
# @see #delemiters | |
# Enumerates a string, returning an array plain +String+s. | |
# | |
# @param [Hash] options A hash of options | |
# @yield [word] Allows each word in the string to be operated on after it is | |
# processed | |
# @yieldparam [String] word The last processed word | |
# @return [Array[String]] An array of words | |
# @since 1 | |
def enumerate options = {}, &block | |
# TODO: Can we clean this up, into a simple #inject call? I bet so. | |
# TODO: This really should return an Enumerator object. Seriously. | |
mapped = [] | |
attach_before_next = [] | |
self.each do |element| | |
case element | |
when Delimiter | |
case options[:delemiters] || StringRay::delemiters | |
when :standalone | |
mapped << [element] | |
when :attach_after | |
attach_before_next << element | |
else | |
if attach_before_next.empty? | |
if mapped.last | |
mapped.last << element | |
else | |
attach_before_next << element | |
end | |
else | |
attach_before_next << element | |
end | |
end | |
when Whitespace | |
case options[:whitespace] || StringRay::whitespace | |
when :standalone | |
mapped << [element] | |
when :attach_after | |
attach_before_next << element | |
else | |
if attach_before_next.empty? | |
if mapped.last | |
mapped.last << element | |
else | |
attach_before_next << element | |
end | |
else | |
attach_before_next << element | |
end | |
end | |
when Word | |
if not attach_before_next.empty? | |
mapped << [attach_before_next, element].flatten | |
attach_before_next = [] | |
else | |
mapped << [element] | |
end | |
end | |
end | |
if not attach_before_next.empty? | |
mapped << [Word.new] unless mapped.last | |
(mapped.last << attach_before_next).flatten! | |
end | |
mapped.map do |arr| | |
string = arr.map{|w|w.to_s}.join | |
yield string if block_given? | |
string | |
end | |
end | |
## | |
# A wrapper class for strings that are 'words' in and of themselves, | |
# composed of 'word characters'. | |
class Word < String | |
def inspect | |
"(#{self})" | |
end | |
end | |
# @see StringRay::Whitespace.new | |
def self.Whitespace whitespace; Whitespace.new whitespace; end | |
## | |
# A wrapper class for strings that are 'whitespace' composed of 'whitespace | |
# characters'. | |
class Whitespace < String | |
Characters = [" ", "\t", "\n"] | |
def inspect | |
"#{self}" | |
end | |
end | |
# @see StringRay::Delimiter.new | |
def self.Delimiter delimiter; Delimiter.new delimiter; end | |
## | |
# A wrapper class for strings that are 'delimiters' composed of 'delimiter | |
# characters'. | |
class Delimiter < String | |
Characters = ['-', ',', '.', '?', '!', ':', ';', '/', '\\', '|'] | |
def inspect | |
"<#{self}>" | |
end | |
end | |
def inspect | |
"\"#{self.map(&:inspect).join ''}\"" | |
end | |
end | |