Class: Kotoshu::Dictionary::Custom
- Defined in:
- lib/kotoshu/dictionary/custom.rb
Overview
Custom in-memory dictionary.
This is a simple dictionary that stores words in memory, designed for runtime customization and user-defined words.
Instance Attribute Summary collapse
-
#case_sensitive ⇒ Boolean
readonly
Whether lookups are case-sensitive.
Attributes inherited from Base
#language_code, #locale, #metadata
Instance Method Summary collapse
-
#add_word(word, flags: []) ⇒ Boolean
Add a word to the dictionary.
-
#clear ⇒ self
Clear all words from the dictionary.
-
#initialize(language_code:, words: [], locale: nil, case_sensitive: false, metadata: {}) ⇒ Custom
constructor
Create a new Custom dictionary.
-
#lookup(word) ⇒ Boolean
Check if a word exists in the dictionary.
-
#merge(other) ⇒ self
Merge another dictionary into this one.
-
#readonly? ⇒ Boolean
Check if the dictionary is read-only.
-
#remove_word(word) ⇒ Boolean
Remove a word from the dictionary.
-
#suggest(word, max_suggestions: 10) ⇒ Array<String>
Generate spelling suggestions.
-
#words ⇒ Array<String>
Get all words in the dictionary.
Methods inherited from Base
#<<, #all_words, #contains?, #each_word, #empty?, #has_word?, #include?, load, #lookup?, #path, register_type, registry, #size, #to_s, #type, #words_matching, #words_with_prefix
Constructor Details
#initialize(language_code:, words: [], locale: nil, case_sensitive: false, metadata: {}) ⇒ Custom
Create a new Custom dictionary.
29 30 31 32 33 34 35 36 37 38 |
# File 'lib/kotoshu/dictionary/custom.rb', line 29 def initialize(language_code:, words: [], locale: nil, case_sensitive: false, metadata: {}) super(language_code, locale: locale, metadata: ) @case_sensitive = case_sensitive @words = normalize_words(words) @word_set = build_word_set # Register this dictionary type self.class.register_type(:custom) unless Dictionary.registry.key?(:custom) end |
Instance Attribute Details
#case_sensitive ⇒ Boolean (readonly)
Returns Whether lookups are case-sensitive.
20 21 22 |
# File 'lib/kotoshu/dictionary/custom.rb', line 20 def case_sensitive @case_sensitive end |
Instance Method Details
#add_word(word, flags: []) ⇒ Boolean
Add a word to the dictionary.
83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/kotoshu/dictionary/custom.rb', line 83 def add_word(word, flags: []) return false if word.nil? || word.empty? lookup_word = normalize_word(word) return false if @word_set.key?(lookup_word) @words << lookup_word @word_set[lookup_word] = @words.length - 1 true end |
#clear ⇒ self
Clear all words from the dictionary.
121 122 123 124 125 |
# File 'lib/kotoshu/dictionary/custom.rb', line 121 def clear @words.clear @word_set.clear self end |
#lookup(word) ⇒ Boolean
Check if a word exists in the dictionary.
44 45 46 47 48 49 |
# File 'lib/kotoshu/dictionary/custom.rb', line 44 def lookup(word) return false if word.nil? || word.empty? lookup_word = @case_sensitive ? word : word.downcase @word_set.key?(lookup_word) end |
#merge(other) ⇒ self
Merge another dictionary into this one.
146 147 148 149 150 151 152 153 154 155 156 157 158 |
# File 'lib/kotoshu/dictionary/custom.rb', line 146 def merge(other) words_to_add = if other.is_a?(Base) other.words elsif other.is_a?(Array) other else [] end words_to_add.each { |word| add_word(word) } self end |
#readonly? ⇒ Boolean
Check if the dictionary is read-only.
130 131 132 |
# File 'lib/kotoshu/dictionary/custom.rb', line 130 def readonly? false end |
#remove_word(word) ⇒ Boolean
Remove a word from the dictionary.
99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/kotoshu/dictionary/custom.rb', line 99 def remove_word(word) return false if word.nil? || word.empty? lookup_word = normalize_word(word) return false unless @word_set.key?(lookup_word) index = @word_set.delete(lookup_word) @words.delete_at(index) true end |
#suggest(word, max_suggestions: 10) ⇒ Array<String>
Generate spelling suggestions.
Uses edit distance to find similar words in the dictionary.
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/kotoshu/dictionary/custom.rb', line 58 def suggest(word, max_suggestions: 10) return [] if word.nil? || word.empty? lookup_word = @case_sensitive ? word : word.downcase # Find words with same prefix prefix_len = [lookup_word.length - 1, 2].max prefix = lookup_word[0...prefix_len] candidates = @words.select { |w| w.start_with?(prefix) } # Calculate edit distances candidates.map do |dict_word| dist = edit_distance(lookup_word, dict_word) [dict_word, dist] end.select { |_, dist| dist.positive? && dist <= 2 } .sort_by { |_, dist| dist } .first(max_suggestions) .map(&:first) end |
#words ⇒ Array<String>
Get all words in the dictionary.
114 115 116 |
# File 'lib/kotoshu/dictionary/custom.rb', line 114 def words @words.dup end |