feat: add more CodeMirror modes

Closed #929.
Also, fixed an issue that a following click will close the editing block.
This commit is contained in:
Tienson Qin
2020-12-16 23:38:29 +08:00
parent aced8ca761
commit 1bf9f6dd97
2 changed files with 24 additions and 4 deletions

View File

@@ -15,6 +15,8 @@
["codemirror/addon/edit/closebrackets"]
["codemirror/mode/clojure/clojure"]
["codemirror/mode/javascript/javascript"]
["codemirror/mode/clike/clike"]
["codemirror/mode/vue/vue"]
["codemirror/mode/commonlisp/commonlisp"]
["codemirror/mode/coffeescript/coffeescript"]
["codemirror/mode/css/css"]
@@ -79,13 +81,28 @@
:else
nil)))
(defn- text->cm-mode
[text]
(when text
(let [mode (string/lower-case text)]
(case mode
"html" "text/html"
"c" "text/x-csrc"
"c++" "text/x-c++src"
"java" "text/x-java"
"c#" "text/x-csharp"
"csharp" "text/x-csharp"
"objective-c" "text/x-objectivec"
"scala" "text/x-scala"
mode))))
(defn render!
[state]
(let [[config id attr code pos_meta] (:rum/args state)
original-mode (get attr :data-lang)
mode (or original-mode "javascript")
clojure? (contains? #{"clojure" "clj" "text/x-clojure" "cljs" "cljc"} mode)
mode (if clojure? "clojure" mode)
mode (if clojure? "clojure" (text->cm-mode mode))
lisp? (or clojure?
(contains? #{"scheme" "racket" "lisp"} mode))
textarea (gdom/getElement id)
@@ -147,7 +164,7 @@
[state config id attr code pos_meta]
[:div.extensions__code
[:div.extensions__code-lang
(let [mode (get attr :data-lang "javascript")]
(let [mode (string/lower-case (get attr :data-lang "javascript"))]
(if (= mode "text/x-clojure")
"clojure"
mode))]

View File

@@ -1,19 +1,22 @@
(ns frontend.handler.editor.keyboards
(:require [frontend.state :as state]
[frontend.util :as util]
[frontend.handler.editor :as editor-handler]
[dommy.core :as d]
[goog.dom :as gdom]
[goog.object :as gobj]
[frontend.mixins :as mixins]))
;; TODO: don't depend on handler.editor
(defn esc-save! [state]
(let [id (last (:rum/args state))]
(let [id (nth (:rum/args state) 1)]
(mixins/hide-when-esc-or-outside
state
:on-hide
(fn [state e event]
(let [target (.-target e)]
(js/console.dir target)
(if (d/has-class? target "bottom-action") ;; FIXME: not particular case
(.preventDefault e)
(let [{:keys [on-hide format value block id repo dummy?]} (editor-handler/get-state state)]
@@ -23,7 +26,7 @@
(or (= event :esc)
(= event :visibilitychange)
(and (= event :click)
(not (editor-handler/in-auto-complete? (gdom/getElement id)))))
(not (editor-handler/in-auto-complete? (gobj/get target "id")))))
(state/clear-edit!))))))
:node (gdom/getElement id)
;; :visibilitychange? true