generate-dictionary.clj

Pinchord · pinchord.git · Tickets · Changelog

Branches > build-process > 3a5bed0 > files / generate-dictionary.clj

#!/usr/bin/env bb
(def sections [:prefixes :initials :vowels :finals :suffixes])

(def priority
  "Priorities used for javelin orthospelling."
  (zipmap sections
          (rest (range))))

(comment
  (def yaml-dict (yaml/parse-string (slurp "pinchord-javelin-dictionary.yaml")))

  (->> (:letters yaml-dict)
       (filter #(= (:order %) 2))
       (map (fn [m] [(:stroke m) (:data m)]))
       (into {})))

(defn finalize [m]
  (update-keys m (partial str "-")))

(defn mask [s1 s2]
  (apply str (remove (set s1) s2)))

  (defn abbreviate
    "Javelin entries can only be 6 characters long!"
    [s]
    (if (> (count s) 6)
      (let [new-s (-> s
                      (str/replace #"TSPW" "G")
                      (str/replace #"PKS" "C")
                      (str/replace #"PKFS" "G")
                      (str/replace #"KFS" "SH")
                      (str/replace #"LR" "N"))]
        (if (> (count new-s) 6)
          (throw (ex-info "Too long!" {:s s :new-s new-s}))
          new-s))
      s))

  (defn all-chords [s]
    (if (empty? s)
      #{""}
      (let [rest-combos (all-chords (rest s))]
        (set (concat
               rest-combos
               (map #(str (first s) %) rest-combos))))))

  (defn abbreviate-long-chords [s]
    (update-vals s abbreviate))

  (defn with-gaps-filled [bank chords]
    (let [s (remove (bank chords) (all-chords (bank (:banks chords))))]
      (merge (bank chords) (abbreviate-long-chords (zipmap s s)))))

(defn ^:private new-value [chords]
  (assoc chords
         :initials (with-gaps-filled :initials chords)
         :vowels   (with-gaps-filled :vowels chords)
         :finals   (with-gaps-filled :finals chords)))

; TODO make this make all chords that aren't in chords.edn map to themself :D
(let [chords (-> (edn/read-string (slurp "chords.edn"))
                 new-value
                 (update :finals finalize)
                 (update :suffixes finalize))
      banks (:banks chords)
      dict {:name (str "Pinchord Base " (:version chords))
            :maximumOutlineLength 1
            :starters [{:stroke "#+" :definition "{^}{-|}" :mask "#+"}
                       {:stroke "" :definition "{}" :mask ""}]
            :letters (->> (reduce (fn [acc [bank entries]]
                                    ; TODO if the bank has no keys, map it to itself?
                                    (if-let [bank-keys (banks bank)]
                                      (into acc (mapv (fn [[stroke translation]]
                                                        {:stroke stroke :data translation :order (priority bank)
                                                         :avoidMask (str (when (= bank :finals)
                                                                           "-")
                                                                         (mask stroke bank-keys))})
                                                      entries))
                                      (into acc (mapv (fn [[stroke translation]]
                                                        {:stroke stroke :data translation :order (priority bank)})
                                                      entries))))
                                  #{} (select-keys chords sections))
                          (sort-by (comp - count :stroke))
                          ; Use this if you want finals to suppress space by default :)
                          #_(cons {:stroke "-" :data "{^}" :order (priority :finals)}))}
      dict-path (str "pinchord-javelin-dictionary-" (:version chords) ".yaml")
      json-chords-path (str "pinchord-chords-" (:version chords) ".json")]
  (spit dict-path (yaml/generate-string dict))
  (spit json-chords-path (json/generate-string chords)))