empathy: Pre-group words according to common patterns
authorCarl Worth <cworth@cworth.org>
Sun, 28 Jun 2020 22:55:46 +0000 (15:55 -0700)
committerCarl Worth <cworth@cworth.org>
Sun, 28 Jun 2020 22:55:46 +0000 (15:55 -0700)
Specifically, the following will be considered identical and
pre-grouped:

<word> = <word>s
        <word> = a <word>
        <word> = an <word>
        <word> = the <word>

Unlike the server-side canonicalization of case differences, which are
not visible, the above matching words are all still made available to
the player and simply pre-grouped. So, the player can decide whether
to leave them grouped or to separate them back out.

empathy/empathy.jsx

index 9f187d8d582ba1d8b7bf0a6cd0824e430d568921..0789b463fe5813cb3fc23b8cb4a84610dd32b2a5 100644 (file)
@@ -454,11 +454,31 @@ class Ambiguities extends React.PureComponent {
   constructor(props) {
     super(props);
 
-    const word_sets = props.words.map(word => {
-      const set = new Set();
-      set.add(word);
-      return set;
-    });
+    function canonize(word) {
+      return word.replace(/((a|an|the) )?(.*?)s?$/i, '$3');
+    }
+
+    const word_sets = [];
+
+    for (let word of props.words) {
+      const word_canon = canonize(word);
+      console.log("Canonized " + word + " to " + word_canon);
+      let found_match = false;
+      for (let set of word_sets) {
+        const set_canon = canonize(set.values().next().value);
+        console.log("Comparing " + word_canon + " to " + set_canon);
+        if (word_canon === set_canon) {
+          set.add(word);
+          found_match = true;;
+          break;
+        }
+      }
+      if (! found_match) {
+        const set = new Set();
+        set.add(word);
+        word_sets.push(set);
+      }
+    }
 
     this.state = {
       word_sets: word_sets,