Browse Source

Make dictionary namespaces bb compatible

Now that translations are just data no excuse for them not being bb
compatible. Also gets rid of needless sexp parsing
Gabriel Horner 3 years ago
parent
commit
f4839da1e1

+ 3 - 1
bb.edn

@@ -1,4 +1,6 @@
-{:paths ["scripts/src"]
+{:paths ["scripts/src" "src/main"]
+ :deps
+ {medley/medley {:mvn/version "1.3.0"}}
  :tasks
  {dev:watch
   logseq.tasks.dev/watch

+ 2 - 5
docs/contributing-to-translations.md

@@ -16,10 +16,7 @@ In order to run the commands in this doc, you will need to install
 Language translations are in two files,
 [frontend/dicts.cljs](https://github.com/logseq/logseq/blob/master/src/main/frontend/dicts.cljs)
 and
-[shortcut/dict.cljs](https://github.com/logseq/logseq/blob/master/src/main/frontend/modules/shortcut/dict.cljs).
-When translating `shortcut/dict.cljs` you will want to refer to
-https://github.com/logseq/logseq/blob/master/src/main/frontend/modules/shortcut/config.cljs
-for the English equivalent.
+[shortcut/dict.cljs](https://github.com/logseq/logseq/blob/master/src/main/frontend/modules/shortcut/dicts.cljs).
 
 ## Language Overview
 
@@ -88,4 +85,4 @@ detect this error and helpfully show you what was typoed.
 
 To add a new language, add an entry to `frontend.dicts/languages`. Then add a
 new locale keyword to `frontend.dicts/dicts` and to
-`frontend.modules.shortcut.dict/dict` and start translating as described above.
+`frontend.modules.shortcut.dicts/dicts` and start translating as described above.

+ 11 - 41
scripts/src/logseq/tasks/lang.clj

@@ -1,58 +1,28 @@
 (ns logseq.tasks.lang
   "Tasks related to language translations"
-  (:require [logseq.tasks.rewrite-clj :as rewrite-clj]
-            [clojure.set :as set]
+  (:require [clojure.set :as set]
+            [frontend.dicts :as dicts]
+            [frontend.modules.shortcut.dicts :as shortcut-dicts]
             [logseq.tasks.util :as task-util]))
 
 (defn- get-dicts
   []
-  (dissoc (rewrite-clj/metadata-var-sexp "src/main/frontend/dicts.cljs" "dicts")
-          :tongue/fallback))
+  (dissoc dicts/dicts :tongue/fallback))
 
-(defn- get-non-en-shortcuts
+(defn- get-all-dicts
   []
-  (nth (rewrite-clj/metadata-var-sexp "src/main/frontend/modules/shortcut/dict.cljs"
-                                      "dict")
-       3))
-
-;; unnecessary complexity :(
-(defn- decorate-namespace [k]
-  (let [n (name k)
-        ns (namespace k)]
-    (keyword (str "command." ns) n)))
-
-(defn- get-en-shortcut-dicts
-  []
-  (->> (rewrite-clj/metadata-var-sexp
-        "src/main/frontend/modules/shortcut/config.cljs"
-        "all-default-keyboard-shortcuts")
-       (map (fn [[k v]] (vector (decorate-namespace k) (:desc v))))
-       (into {})))
-
-(defn- get-en-categories
-  []
-  (->> (rewrite-clj/metadata-var-sexp
-        "src/main/frontend/modules/shortcut/config.cljs"
-        "category")
-       (map (fn [[k v]] (vector k (:doc (meta v)))))
-       (into {})))
-
-(defn- get-shortcuts
-  []
-  (merge {:en (merge (get-en-categories)
-                     (get-en-shortcut-dicts))}
-         (get-non-en-shortcuts)))
+  (merge-with merge (get-dicts) shortcut-dicts/dicts))
 
 (defn- get-languages
   []
-  (->> (rewrite-clj/var-sexp "src/main/frontend/dicts.cljs" "languages")
+  (->> dicts/languages
        (map (juxt :value :label))
        (into {})))
 
 (defn list-langs
   "List translated langagues with their number of translations"
   []
-  (let [dicts (merge-with merge (get-dicts) (get-shortcuts))
+  (let [dicts (get-all-dicts)
         en-count (count (dicts :en))
         langs (get-languages)]
     (->> dicts
@@ -79,7 +49,7 @@
             (println "Language" lang "does not have an entry in dicts.cljs")
             (System/exit 1))
         all-dicts [[(get-dicts) "frontend/dicts.cljs"]
-                   [(get-shortcuts) "shortcut/dict.cljs"]]
+                   [shortcut-dicts/dicts "shortcut/dicts.cljs"]]
         all-missing (map (fn [[dicts file]]
                            [(select-keys (dicts :en)
                                          (set/difference (set (keys (dicts :en)))
@@ -102,7 +72,7 @@
 (defn invalid-translations
   "Lists translation that don't exist in English"
   []
-  (let [dicts (merge-with merge (get-dicts) (get-shortcuts))
+  (let [dicts (get-all-dicts)
         ;; For now defined as :en but clj-kondo analysis could be more thorough
         valid-keys (set (keys (dicts :en)))
         invalid-dicts
@@ -122,7 +92,7 @@
 (defn list-duplicates
   "Lists translations that are the same as the one in English"
   [& args]
-  (let [dicts (merge-with merge (get-dicts) (get-shortcuts))
+  (let [dicts (get-all-dicts)
         en-dicts (dicts :en)
         lang (or (keyword (first args))
                  (task-util/print-usage "LOCALE"))

+ 0 - 27
scripts/src/logseq/tasks/rewrite_clj.clj

@@ -1,27 +0,0 @@
-(ns logseq.tasks.rewrite-clj
-  "Rewrite-clj fns"
-  (:require [rewrite-clj.zip :as z]))
-
-(defn- find-symbol-value-sexpr
-  ([zloc sym] (find-symbol-value-sexpr zloc sym z/right))
-  ([zloc sym nav-fn]
-   ;; Returns first symbol found
-   (-> (z/find-value zloc z/next sym)
-       nav-fn
-       z/sexpr)))
-
-(defn var-sexp
-  "Returns value sexp to the right of var"
-  [file string-var]
-  (let [zloc (z/of-string (slurp file))
-        sexp (find-symbol-value-sexpr zloc (symbol string-var))]
-    (or sexp
-        (throw (ex-info "var-sexp must not return nil" {:file file :string-var string-var})))))
-
-(defn metadata-var-sexp
-  "Returns value sexp to the right of var with metadata"
-  [file string-var]
-  (let [zloc (z/of-string (slurp file))
-        sexp (find-symbol-value-sexpr zloc (symbol string-var) (comp z/right z/up))]
-    (or sexp
-        (throw (ex-info "sexp must not return nil" {:file file :string-var string-var})))))

+ 4 - 1
src/main/frontend/components/search.cljs

@@ -339,6 +339,9 @@
                                 (search-result-item "Page" original-name))
                         nil))}))])
 
+(def default-placeholder
+  (if config/publishing? (t :search/publishing) (t :search)))
+
 (rum/defcs search-modal < rum/reactive
   (shortcut/disable-all-shortcuts)
   (mixins/event-mixin
@@ -366,7 +369,7 @@
                          (t :graph-search)
                          :page
                          (t :page-search)
-                         (t :search))
+                         default-placeholder)
         :auto-complete (if (util/chrome?) "chrome-off" "off") ; off not working here
         :value         search-q
         :on-change     (fn [e]

+ 7 - 3
src/main/frontend/context/i18n.cljs

@@ -1,7 +1,8 @@
 (ns frontend.context.i18n
   (:require [frontend.dicts :as dicts]
-            [frontend.modules.shortcut.dict :as shortcut-dict]
+            [frontend.modules.shortcut.dicts :as shortcut-dicts]
             [medley.core :refer [deep-merge]]
+            [tongue.core :as tongue]
             [frontend.state :as state]))
 
 ;; TODO
@@ -16,14 +17,17 @@
 
 (defonce translate-dicts (atom {}))
 
+(defn- translate [dicts]
+  (tongue/build-translate dicts))
+
 (defn t
   [& args]
   (let [preferred-language (keyword (state/sub :preferred-language))
         _ (when (nil? preferred-language)
             (state/set-preferred-language! (fetch-local-language)))
         dicts (or (get @translate-dicts preferred-language)
-                  (let [result (some-> (deep-merge dicts/dicts shortcut-dict/dicts)
-                                       dicts/translate)]
+                  (let [result (some-> (deep-merge dicts/dicts shortcut-dicts/dicts)
+                                       translate)]
                     (swap! translate-dicts assoc preferred-language result)
                     result))]
     (apply (partial dicts preferred-language) args)))

+ 26 - 40
src/main/frontend/dicts.cljs → src/main/frontend/dicts.cljc

@@ -1,12 +1,12 @@
-(ns frontend.dicts
+(ns ^:bb-compatible frontend.dicts
   "Provides dictionary entries for most of the application"
-  (:require [frontend.config :as config]
-            [shadow.resource :as rc]
-            [tongue.core :as tongue]))
+  #?(:cljs (:require [shadow.resource :as rc])))
 
 (def ^:large-vars/data-var dicts
-  {:en {:tutorial/text (rc/inline "tutorial-en.md")
-        :tutorial/dummy-notes (rc/inline "dummy-notes-en.md")
+  {:en {:tutorial/text #?(:cljs (rc/inline "tutorial-en.md")
+                          :default "tutorial-en.md")
+        :tutorial/dummy-notes #?(:cljs (rc/inline "dummy-notes-en.md")
+                                 :default "dummy-notes-en.md")
         :on-boarding/title "Hi, welcome to Logseq!"
         :on-boarding/sharing "sharing"
         :on-boarding/is-a " is a "
@@ -296,9 +296,8 @@
         :sync-from-local-changes-detected "Refresh detects and processes files modified on your disk and diverged from the actual Logseq page content. Continue?"
 
         :unlink "unlink"
-        :search (if config/publishing?
-                  "Search"
-                  "Search or create page")
+        :search/publishing "Search"
+        :search "Search or create page"
         :page-search "Search in the current page"
         :graph-search "Search graph"
         :new-page "New page"
@@ -596,9 +595,8 @@
         :re-index "Neu indizieren"
         :export-json "Als JSON exportieren"
         :unlink "Verknüpfung aufheben"
-        :search (if config/publishing?
-                  "Suchen"
-                  "Suchen oder Seite erstellen")
+        :search/publishing "Suchen"
+        :search "Suchen oder Seite erstellen"
         :new-page "Neue Seite"
         :new-file "Neue Datei"
         :graph "Graph"
@@ -881,9 +879,8 @@
         :re-index "Ré-indexer"
         :export-json "Exporter au format JSON"
         :unlink "délier"
-        :search (if config/publishing?
-                  "Rechercher"
-                  "Rechercher ou Créer la Page")
+        :search/publishing "Rechercher"
+        :search "Rechercher ou Créer la Page"
         :new-page "Nouvelle page"
         :new-file "Nouveau fichier"
         :graph "Graphe"
@@ -1197,9 +1194,8 @@
            :export-opml "以 OPML 格式导出"
            :convert-markdown "转换 Markdown 格式(Unordered list 或 Heading)"
            :unlink "解除绑定"
-           :search (if config/publishing?
-                     "搜索"
-                     "搜索或者创建新页面")
+           :search/publishing "搜索"
+           :search "搜索或者创建新页面"
            :page-search "在当前页面搜索"
            :graph-search "搜索图谱"
            :new-page "新页面"
@@ -1526,9 +1522,8 @@
              :export-opml "以 OPML 格式導出"
              :convert-markdown "轉換 Markdown 格式(Unordered list 或 Heading)"
              :unlink "解除綁定"
-             :search (if config/publishing?
-                       "搜索"
-                       "搜索或者創建新頁面")
+             :search/publishing "搜索"
+             :search "搜索或者創建新頁面"
              :new-page "新頁面"
              :graph "圖譜"
              :publishing "發布/下載 HTML 文件"
@@ -2019,9 +2014,8 @@
         :close "Cerrar"
         :re-index "Reindexar"
         :unlink "desenlazar"
-        :search (if config/publishing?
-                  "Buscar"
-                  "Buscar o Crear Página")
+        :search/publishing "Buscar"
+        :search "Buscar o Crear Página"
         :page-search "Buscar en la página actual"
         :new-page "Nueva página"
         :new-file "Nuevo archivo"
@@ -2358,9 +2352,8 @@
            :sync-from-local-files "Oppfrisk"
            :sync-from-local-files-detail "Importer endringer fra lokale filer"
            :unlink "koble fra"
-           :search (if config/publishing?
-                     "Søk"
-                     "Søk eller Opprett Side")
+           :search/publishing "Søk"
+           :search "Søk eller Opprett Side"
            :page-search "Søk i denne siden"
            :graph-search "Søk graf"
            :new-page "Ny side"
@@ -2731,9 +2724,8 @@
            :delete "Apagar"
            :re-index "Re-indexar"
            :unlink "remover ligação"
-           :search (if config/publishing?
-                     "Pesquisar"
-                     "Pesquisar ou Criar Página")
+           :search/publishing "Pesquisar"
+           :search "Pesquisar ou Criar Página"
            :page-search "Pesquisar na página atual"
            :graph-search "Pesquisar grafo"
            :new-page "Nova página"
@@ -3132,9 +3124,8 @@
            :sync-from-local-files "Atualizar"
            :sync-from-local-files-detail "Importar alterações de ficheiros locais"
            :unlink "remover ligação"
-           :search (if config/publishing?
-                     "Pesquisar"
-                     "Pesquisar ou Criar Página")
+           :search/publishing "Pesquisar"
+           :search "Pesquisar ou Criar Página"
            :page-search "Pesquisar na página atual"
            :graph-search "Pesquisar grafo"
            :new-page "Nova página"
@@ -3515,9 +3506,8 @@
         :re-index "Переиндексировать (перестроить граф)"
         :sync-from-local-files "Обновить (импортировать изменния из локальных файлов)"
         :unlink "отвязать"
-        :search (if config/publishing?
-                  "Искать"
-                  "Искать или создать страницу")
+        :search/publishing "Искать"
+        :search "Искать или создать страницу"
         :page-search "Искать на текущей странице"
         :graph-search "Искать граф"
         :new-page "Новая страница"
@@ -3614,7 +3604,6 @@
 
    :tongue/fallback :en})
 
-
 (def languages [{:label "English" :value :en}
                 {:label "Français" :value :fr}
                 {:label "Deutsch" :value :de}
@@ -3626,6 +3615,3 @@
                 {:label "Português (Brasileiro)" :value :pt-BR}
                 {:label "Português (Europeu)" :value :pt-PT}
                 {:label "Русский" :value :ru}])
-
-(defn translate [dicts]
-  (tongue/build-translate dicts))

+ 14 - 9
src/main/frontend/modules/shortcut/config.cljs

@@ -11,7 +11,7 @@
             [frontend.handler.search :as search-handler]
             [frontend.handler.ui :as ui-handler]
             [frontend.handler.plugin :as plugin-handler]
-            [frontend.modules.shortcut.dict :as dict]
+            [frontend.modules.shortcut.dicts :as dicts]
             [frontend.modules.shortcut.before :as m]
             [frontend.state :as state]
             [frontend.util :refer [mac?] :as util]
@@ -19,8 +19,13 @@
             [clojure.data :as data]
             [medley.core :as medley]))
 
+;; TODO: Namespace all-default-keyboard-shortcuts keys with `:command` e.g.
+;; `:command.date-picker/complete`. They are namespaced in translation but
+;; almost everywhere else they are not which could cause needless conflicts
+;; with other config keys
+
 ;; To add a new entry to this map, first add it here and then
-;; a description for it in frontend.modules.shortcut.dict/all-default-keyboard-shortcuts
+;; a description for it in frontend.modules.shortcut.dicts/all-default-keyboard-shortcuts
 (def ^:large-vars/data-var all-default-keyboard-shortcuts
   {:date-picker/complete         {:binding "enter"
                                   :fn      ui-handler/shortcut-complete}
@@ -364,10 +369,10 @@
 
 (let [keyboard-shortcuts
       {::keyboard-shortcuts (set (keys all-default-keyboard-shortcuts))
-       ::dict/keyboard-shortcuts (set (keys dict/all-default-keyboard-shortcuts))}]
-  (assert (= (::keyboard-shortcuts keyboard-shortcuts) (::dict/keyboard-shortcuts keyboard-shortcuts))
+       ::dicts/keyboard-shortcuts (set (keys dicts/all-default-keyboard-shortcuts))}]
+  (assert (= (::keyboard-shortcuts keyboard-shortcuts) (::dicts/keyboard-shortcuts keyboard-shortcuts))
           (str "Keys for keyboard shortcuts must be the same "
-               (data/diff (::keyboard-shortcuts keyboard-shortcuts) (::dict/keyboard-shortcuts keyboard-shortcuts)))))
+               (data/diff (::keyboard-shortcuts keyboard-shortcuts) (::dicts/keyboard-shortcuts keyboard-shortcuts)))))
 
 (defn build-category-map [symbols]
   (reduce into {}
@@ -511,7 +516,7 @@
      (with-meta {:before m/enable-when-not-editing-mode!}))}))
 
 ;; To add a new entry to this map, first add it here and then
-;; a description for it in frontend.modules.shortcut.dict/category
+;; a description for it in frontend.modules.shortcut.dicts/category
 (def ^:large-vars/data-var category
   "Categories for docs purpose"
   {:shortcut.category/basics
@@ -632,10 +637,10 @@
     :date-picker/complete]})
 
 (let [category-maps {::category (set (keys category))
-                     ::dict/category (set (keys dict/category))}]
-  (assert (= (::category category-maps) (::dict/category category-maps))
+                     ::dicts/category (set (keys dicts/category))}]
+  (assert (= (::category category-maps) (::dicts/category category-maps))
           (str "Keys for category maps must be the same "
-               (data/diff (::category category-maps) (::dict/category category-maps)))))
+               (data/diff (::category category-maps) (::dicts/category category-maps)))))
 
 
 (defn add-shortcut!

+ 4 - 1
src/main/frontend/modules/shortcut/dict.cljs → src/main/frontend/modules/shortcut/dicts.cljc

@@ -1,4 +1,4 @@
-(ns ^:bb-compatible frontend.modules.shortcut.dict
+(ns ^:bb-compatible frontend.modules.shortcut.dicts
   "Provides dictionary entries for shortcuts"
   (:require [medley.core :as medley]))
 
@@ -126,6 +126,9 @@
 
 (def ^:large-vars/data-var dicts
   {:en (merge
+        ;; Dynamically add this ns since command descriptions have to
+        ;; stay in sync with shortcut.config command ids which do not
+        ;; have a namespce
         (medley/map-keys decorate-namespace all-default-keyboard-shortcuts)
         category)
    :zh-CN   {:shortcut.category/formatting            "格式化"