wordmonger 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67912799c0fb8adb04ca9a91d049c600adcc1918062b27305add71923f3acac9
4
- data.tar.gz: 47bda97e3bf2261726c0400f4c171140936ec3275244aee47fbd1cb1914761f6
3
+ metadata.gz: 72f788d560b20874e0d2df7b548b38de5693403ee5f2e09836877911c8d44b72
4
+ data.tar.gz: 7eb1067080d7204d0d627372a407d111796fc5081d42f76eb94a78c2016be8d5
5
5
  SHA512:
6
- metadata.gz: 571b6ae975eedc08f8f9e6374810d5f9b20b94ae7f06570b16d590e9f1eb6d19358a0562de958627294a7d60a0edc4f61eb45702d616ac1a8401be6958c41e3f
7
- data.tar.gz: c480c4c7f0c45be27a1c2f69f87aa30596e81e4a64de800b5412005f8352c273e6f6d6304e79dd1d5ceaa38e3e6edc1299f02adfb710094990579559707665c9
6
+ metadata.gz: ea34105defe4bb18c03a87ebda77901517e56f14ea59783dc582d503dad8f09f2f522f83a5e1526b86d7571b7aee6bd5cb089bfdd562a7f4efafb28d8924c94d
7
+ data.tar.gz: 5ca5f38a082dd243d023b19fde49fd97312784e90c92dc39e1770c33876061dd42d8e8897b6c7e8399d65ef354b91eadc60fe59b75d4cf4dbdc444e276fed396
@@ -1,13 +1,14 @@
1
1
  module WordMonger
2
2
  class Dictionary
3
3
  attr_reader :name, :phrases, :words
4
- attr_accessor :abbreviations
5
- def initialize(name, abbreviations: {}, scanner: nil)
4
+ attr_accessor :preferred_synonyms, :normalized_wordings
5
+ def initialize(name, preferred_synonyms: {}, normalized_wordings: {}, scanner: nil)
6
6
  @name = name
7
7
  self.scanner = scanner
8
8
  @phrases = {}
9
9
  @words = {}
10
- @abbreviations = abbreviations
10
+ @preferred_synonyms = preferred_synonyms
11
+ @normalized_wordings = normalized_wordings
11
12
  WordMonger.add_dictionary(self)
12
13
  end
13
14
 
@@ -40,12 +41,23 @@ module WordMonger
40
41
  @phrases.values.map { |value| value.serialize }
41
42
  end
42
43
 
43
- def add_abbreviation(abbreviation, abbreviates)
44
- @abbreviations[abbreviation] = abbreviates
44
+ def add_preferred_synonym(synonym, preferred_synonym)
45
+ @preferred_synonyms[synonym] = preferred_synonym
45
46
  end
46
47
 
47
- def delete_abbreviation(abbreviation)
48
- @abbreviations.delete(abbreviation)
48
+ def delete_preferred_synonym(synonym)
49
+ @preferred_synonyms.delete(synonym)
50
+ end
51
+
52
+ def add_normalized_wording(wording, normalized_wording)
53
+ synonymized_wording = Phrase.new(wording.downcase, remember: false).synonymize
54
+ synonymized_normalized_wording = Phrase.new(normalized_wording.downcase, remember: false).synonymize
55
+ @normalized_wordings[synonymized_wording] = synonymized_normalized_wording
56
+ end
57
+
58
+ def delete_normalized_wording(wording)
59
+ synonymized_wording = Phrase.new(wording.downcase, remember: false).synonymize
60
+ @normalized_wordings.delete(synonymized_wording)
49
61
  end
50
62
 
51
63
  def add_word(word)
@@ -2,10 +2,10 @@ module WordMonger
2
2
  class Phrase
3
3
 
4
4
  attr_reader :text, :dictionary
5
- def initialize(text, dictionary: nil)
5
+ def initialize(text, dictionary: nil, remember: true)
6
6
  self.text = text
7
7
  @dictionary = dictionary || WordMonger.active_dictionary
8
- @dictionary.add(self)
8
+ @dictionary.add(self) if remember
9
9
  end
10
10
 
11
11
  def to_s
@@ -23,52 +23,112 @@ module WordMonger
23
23
  def text=(text)
24
24
  @text = text
25
25
  @words = nil
26
- @expanded = nil
26
+ @synonymized = nil
27
27
  end
28
28
 
29
- # TODO Make words first-class objects?
30
- private def get_words
31
- return [] unless @text
32
- self.scanner.scan(@text)
29
+ def get_words_for_text(text)
30
+ return [] unless text
31
+ self.scanner.scan(text)
32
+ end
33
+
34
+ def get_words
35
+ get_words_for_text(@text)
33
36
  end
34
37
 
35
38
  def words
36
- @words ||= get_words
39
+ @words ||= self.get_words
40
+ end
41
+
42
+ private def is_downcase?(word)
43
+ word.downcase == word
44
+ end
45
+
46
+ private def is_upcase?(word)
47
+ word.upcase == word
48
+ end
49
+
50
+ private def is_capitalized?(word)
51
+ word.capitalize == word
37
52
  end
38
53
 
39
54
  private def case_preserving_sub(text, from, to)
40
55
  match_regexp = Regexp.new(Regexp.escape(from), Regexp::IGNORECASE)
41
56
  from_text = text[match_regexp]
42
- to_text = to.downcase
43
- first_from_char = from_text[0]
44
- if first_from_char == first_from_char.upcase
45
- to_text = (to_text[0].upcase) + to_text[1..]
57
+ if is_upcase?(from_text)
58
+ to_text = to.upcase
59
+ elsif is_capitalized?(from_text)
60
+ to_text = to.capitalize
61
+ else # Not sure what it is -- downcase it
62
+ to_text = to.downcase
46
63
  end
47
- text.sub(from_text, to_text)
64
+ res = text.sub(from_text, to_text)
65
+ res
48
66
  end
49
67
 
50
- private def get_expanded
51
- expanded_name = self.text
52
- self.words.each do |word|
68
+ # Synonymize replaces all synonyms with their preferred synonym
69
+ def synonymize_text(text)
70
+ synonymized_text = text
71
+ get_words_for_text(text).each do |word|
53
72
  lowercase_word = word.text.downcase
54
- substitute = dictionary.abbreviations[lowercase_word]
73
+ substitute = dictionary.preferred_synonyms[lowercase_word]
55
74
  if substitute
56
- expanded_name = case_preserving_sub(expanded_name, word.text, substitute)
75
+ synonymized_text = case_preserving_sub(synonymized_text, word.text, substitute)
57
76
  end
58
77
  end
59
- expanded_name
78
+ synonymized_text
79
+ end
80
+
81
+ def synonymize
82
+ synonymize_text(self.text)
83
+ end
84
+
85
+ def synonymized
86
+ @synonymized ||= self.class.new(synonymize)
87
+ end
88
+
89
+ def synonymized_name
90
+ synonymized.phrase
91
+ end
92
+
93
+ def synonymized_words
94
+ self.synonymized.words
95
+ end
96
+
97
+ # Normalize replaces the phrase with the normalized wording of its synonymized text
98
+ def normalize_text(text)
99
+ synonymized_phrase = synonymize_text(text)
100
+ words = get_words_for_text(synonymized_phrase)
101
+ text_case = if words.all? { |word| is_upcase?(word.text) }
102
+ :upcase
103
+ elsif words.all? { |word| is_capitalized?(word.text) }
104
+ :capitalize
105
+ else
106
+ :downcase
107
+ end
108
+ search_phrase = synonymized_phrase.downcase
109
+ substitute_phrase = dictionary.normalized_wordings[search_phrase]
110
+ synonymized_phrase = substitute_phrase if substitute_phrase
111
+ normalized_phrase = synonymized_phrase
112
+ get_words_for_text(normalized_phrase).each do |word|
113
+ normalized_phrase.sub!(word.text, word.text.send(text_case))
114
+ end
115
+ normalized_phrase
116
+ end
117
+
118
+ def normalize
119
+ normalize_text(self.text)
60
120
  end
61
121
 
62
- def expanded
63
- @expanded ||= self.class.new(get_expanded)
122
+ def normalized
123
+ @normalized ||= self.class.new(normalize)
64
124
  end
65
125
 
66
- def expanded_name
67
- expanded.phrase
126
+ def normalized_name
127
+ normalized.phrase
68
128
  end
69
129
 
70
- def expanded_words
71
- self.expanded.words
130
+ def normalized_words
131
+ self.normalized.words
72
132
  end
73
133
  end
74
134
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WordMonger
4
- VERSION = "0.0.1"
4
+ VERSION = "0.1.0"
5
5
  end
@@ -47,7 +47,7 @@ module WordMonger
47
47
  expanded_name = self.text
48
48
  self.words.each do |word|
49
49
  lowercase_word = word.downcase
50
- substitute = dictionary.abbreviations[lowercase_word]
50
+ substitute = dictionary.preferred_synonyms[lowercase_word]
51
51
  if substitute
52
52
  expanded_name = case_preserving_sub(expanded_name, word, substitute)
53
53
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wordmonger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard LeBer
@@ -54,5 +54,5 @@ required_rubygems_version: !ruby/object:Gem::Requirement
54
54
  requirements: []
55
55
  rubygems_version: 3.6.9
56
56
  specification_version: 4
57
- summary: Work with words, synonyms, and abbreviations
57
+ summary: Work with words, synonyms, and synonyms
58
58
  test_files: []