lib/picky/query/token.rb in picky-4.3.1 vs lib/picky/query/token.rb in picky-4.3.2
- old
+ new
@@ -97,38 +97,111 @@
#
# The last one wins.
# So "hello*" will not be partially searched.
# So "hello"* will be partially searched.
#
+ @@no_partial_character = '"'
+ @@partial_character = '*'
@@no_partial = /\"\z/
@@partial = /\*\z/
def partialize
self.partial = false or return unless @text !~ @@no_partial
self.partial = true unless @text !~ @@partial
end
+ # Define a character which stops a token from
+ # being a partial token, even if it is the last token.
+ #
+ # Default is '"'.
+ #
+ # This is used in a regexp (%r{#{char}\z}) for String#!~,
+ # so escape the character.
+ #
+ # Example:
+ # Picky::Query::Token.no_partial_character = '\?'
+ # try.search("tes?") # Won't find "test".
+ #
+ def self.no_partial_character= character
+ @@no_partial_character = character
+ @@no_partial = %r{#{character}\z}
+ end
+ # Define a character which makes a token a partial token.
+ #
+ # Default is '*'.
+ #
+ # This is used in a regexp (%r{#{char}\z}) for String#!~,
+ # so escape the character.
+ #
+ # Example:
+ # Picky::Query::Token.partial_character = '\?'
+ # try.search("tes?") # Will find "test".
+ #
+ def self.partial_character= character
+ @@partial_character = character
+ @@partial = %r{#{character}\z}
+ redefine_illegals
+ end
# If the text ends with ~ similarize it. If with ", don't.
#
# The latter wins.
#
- @@no_similar = /\"\z/
- @@similar = /\~\z/
+ @@no_similar_character = '"'
+ @@similar_character = '~'
+ @@no_similar = %r{#{@@no_similar_character}\z}
+ @@similar = %r{#{@@similar_character}\z}
def similarize
self.similar = false or return unless @text !~ @@no_similar
self.similar = true unless @text !~ @@similar
end
-
+ # Define a character which stops a token from
+ # being a similar token, even if it is the last token.
+ #
+ # Default is '"'.
+ #
+ # This is used in a regexp (%r{#{char}\z}) for String#!~,
+ # so escape the character.
+ #
+ # Example:
+ # Picky::Query::Token.no_similar_character = '\?'
+ # try.search("tost?") # Won't find "test".
+ #
+ def self.no_similar_character= character
+ @@no_similar_character = character
+ @@no_similar = %r{#{character}\z}
+ end
+ # Define a character which makes a token a similar token.
+ #
+ # Default is '~'.
+ #
+ # This is used in a regexp (%r{#{char}\z}) for String#!~,
+ # so escape the character.
+ #
+ # Example:
+ # Picky::Query::Token.similar_character = '\?'
+ # try.search("tost?") # Will find "test".
+ #
+ def self.similar_character= character
+ @@similar_character = character
+ @@similar = %r{#{character}\z}
+ redefine_illegals
+ end
+
+ # Is this a "similar" character?
+ #
def similar?
@similar
end
# Normalizes this token's text.
#
- @@illegals = /["*~]/
def remove_illegals
@text.gsub! @@illegals, EMPTY_STRING unless @text.blank?
end
+ def self.redefine_illegals
+ @@illegals = %r{[#{@@no_similar_character}#{@@partial_character}#{@@similar_character}]}
+ end
+ redefine_illegals
# Returns an array of possible combinations.
#
def possible_combinations_in index
index.possible_combinations self
@@ -143,19 +216,48 @@
end
end
# Splits text into a qualifier and text.
#
- @@split_qualifier_text = ':'
- @@split_qualifiers = ','
+ @@qualifier_text_delimiter = ':'
+ @@qualifiers_delimiter = ','
def qualify
- @qualifiers, @text = (@text || EMPTY_STRING).split(@@split_qualifier_text, 2)
+ @qualifiers, @text = (@text || EMPTY_STRING).split(@@qualifier_text_delimiter, 2)
if @text.blank?
@text = @qualifiers || EMPTY_STRING
@qualifiers = nil
else
- @qualifiers = @qualifiers.split @@split_qualifiers
+ @qualifiers = @qualifiers.split @@qualifiers_delimiter
end
+ end
+ # Define a character which separates the qualifier
+ # from the search text.
+ #
+ # Default is ':'.
+ #
+ # This is used in a String#split.
+ #
+ # Example:
+ # Picky::Query::Token.qualifier_text_delimiter = '?'
+ # try.search("text1?hello text2?world").ids.should == [1]
+ #
+ def self.qualifier_text_delimiter= character
+ @@qualifier_text_delimiter = character
+ end
+ # Define a character which separates the qualifiers
+ # (before the search text).
+ #
+ # Default is ','.
+ #
+ # This is used in a String#split.
+ #
+ # Example:
+ # Picky::Query::Token.qualifiers_delimiter = '|'
+ # try.search("text1|text2:hello").ids.should == [1]
+ #
+
+ def self.qualifiers_delimiter= character
+ @@qualifiers_delimiter = character
end
# Returns the qualifiers as an array.
#
# Example:
\ No newline at end of file