Module: Abbrev
- Defined in:
- lib/abbrev.rb
Overview
Calculate the set of unique abbreviations for a given set of strings.
require 'abbrev'
require 'pp'
pp Abbrev::abbrev(['ruby', 'rules']).sort
Generates:
[["rub", "ruby"],
["ruby", "ruby"],
["rul", "rules"],
["rule", "rules"],
["rules", "rules"]]
Also adds an abbrev
method to class Array
.
Class Method Summary collapse
-
.abbrev(words, pattern = nil) ⇒ Object
Given a set of strings, calculate the set of unambiguous abbreviations for those strings, and return a hash where the keys are all the possible abbreviations and the values are the full strings.
Class Method Details
.abbrev(words, pattern = nil) ⇒ Object
Given a set of strings, calculate the set of unambiguous abbreviations for those strings, and return a hash where the keys are all the possible abbreviations and the values are the full strings. Thus, given input of "car" and "cone", the keys pointing to "car" would be "ca" and "car", while those pointing to "cone" would be "co", "con", and "cone".
The optional pattern
parameter is a pattern or a string. Only those input strings matching the pattern, or begging the string, are considered for inclusion in the output hash
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/abbrev.rb', line 43 def abbrev(words, pattern = nil) table = {} seen = Hash.new(0) if pattern.is_a?(String) pattern = /^#{Regexp.quote(pattern)}/ # regard as a prefix end words.each do |word| next if (abbrev = word).empty? while (len = abbrev.rindex(/[\w\W]\z/)) > 0 abbrev = word[0,len] next if pattern && pattern !~ abbrev case seen[abbrev] += 1 when 1 table[abbrev] = word when 2 table.delete(abbrev) else break end end end words.each do |word| next if pattern && pattern !~ word table[word] = word end table end |