Sfoglia il codice sorgente

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 anni fa
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            "格式化"