diff --git a/demo/src/nextjournal/clojure_mode/demo.cljs b/demo/src/nextjournal/clojure_mode/demo.cljs index bc98462f..e92adc44 100644 --- a/demo/src/nextjournal/clojure_mode/demo.cljs +++ b/demo/src/nextjournal/clojure_mode/demo.cljs @@ -1,8 +1,10 @@ (ns nextjournal.clojure-mode.demo (:require ["@codemirror/commands" :refer [history historyKeymap]] - ["@codemirror/language" :refer [foldGutter syntaxHighlighting defaultHighlightStyle]] + ["@codemirror/language" :refer [foldGutter syntaxHighlighting defaultHighlightStyle LRLanguage]] ["@codemirror/state" :refer [EditorState]] ["@codemirror/view" :as view :refer [EditorView]] + ["@lezer/common" :refer [parseMixed]] + ["@lezer/generator" :as lg] ["react" :as react] [applied-science.js-interop :as j] [clojure.string :as str] @@ -13,6 +15,7 @@ [nextjournal.clojure-mode.extensions.eval-region :as eval-region] [nextjournal.clojure-mode.keymap :as keymap] [nextjournal.clojure-mode.live-grammar :as live-grammar] + [nextjournal.clojure-mode.node :as n] [nextjournal.clojure-mode.test-utils :as test-utils] [nextjournal.livedoc :as livedoc] [reagent.core :as r] @@ -49,7 +52,8 @@ ;; use live-reloading grammar #js[(cm-clj/syntax live-grammar/parser) (.slice cm-clj/default-extensions 1)] - cm-clj/default-extensions) + cm-clj/mixed-parsing-default-extensions) + (.of view/keymap cm-clj/complete-keymap) (.of view/keymap historyKeymap)]) @@ -102,6 +106,7 @@ (seq extensions) (concat extensions))))))))))}]) + (defn samples [] (into [:<>] (for [source ["(comment @@ -112,6 +117,12 @@ (fizz-buzz 17) (fizz-buzz 42)) +;; # Here is a Markdown comment +;; with [links](https://clerk.vision) and *boldness** and *emphasis*; +;; and with lists, of course: +;; * Buy milk, +;; * then throw it away. + (defn fizz-buzz [n] (condp (fn [a b] (zero? (mod b a))) n 15 \"fizzbuzz\" diff --git a/src/nextjournal/clojure_mode.cljs b/src/nextjournal/clojure_mode.cljs index f3ebf128..7aedc5af 100644 --- a/src/nextjournal/clojure_mode.cljs +++ b/src/nextjournal/clojure_mode.cljs @@ -1,12 +1,15 @@ (ns nextjournal.clojure-mode (:require ["@lezer/highlight" :as highlight :refer [tags]] ["@codemirror/language" :as language :refer [LRLanguage LanguageSupport]] + ["@codemirror/lang-markdown" :as lang-markdown] ["@nextjournal/lezer-clojure" :as lezer-clj] + ["@lezer/common" :refer [parseMixed]] [applied-science.js-interop :as j] [nextjournal.clojure-mode.extensions.close-brackets :as close-brackets] [nextjournal.clojure-mode.extensions.match-brackets :as match-brackets] [nextjournal.clojure-mode.extensions.formatting :as format] [nextjournal.clojure-mode.extensions.selection-history :as sel-history] + [nextjournal.clojure-mode.live-grammar :as live-grammar] [nextjournal.clojure-mode.keymap :as keymap] [nextjournal.clojure-mode.node :as n] [nextjournal.clojure-mode.test-utils :as test-utils])) @@ -66,6 +69,23 @@ (sel-history/extension) (format/ext-format-changed-lines)]) +(def mixed-parser + ;; TODO: fit changes in live grammar into lezer-clojure + (.configure live-grammar/parser + #js {:wrap (parseMixed (fn [node] + (when (= (.-name node) "CommentText") + (.-markdownLanguage lang-markdown))))})) + +(def mixed-parsing-default-extensions + #js[(syntax mixed-parser) + (.slice default-extensions 1)]) + +(comment + (js/console.log :mixed-clojure (.toString (.parse mixed-parser ";; # Helo +(def x \"x\") +;; this [link](/foo/bar) **should** be markdown +")))) + (def language-support "Eases embedding clojure mode into other languages (e.g. markdown). See https://codemirror.net/docs/ref/#language.LanguageSupport for motivations" diff --git a/src/nextjournal/clojure_mode/clojure.grammar b/src/nextjournal/clojure_mode/clojure.grammar index 4e976bf8..3f6c9b3e 100644 --- a/src/nextjournal/clojure_mode/clojure.grammar +++ b/src/nextjournal/clojure_mode/clojure.grammar @@ -41,6 +41,8 @@ VarName { Symbol } ReaderMetadata[prefixColl] { "#^" expression } Metadata[prefixColl] { "^" expression } String { '"' StringContent? '"' } + + LineComment { (';' | ';;') CommentText? } } Meta[prefixContainer] { (Metadata | ReaderMetadata) !meta t } @@ -90,7 +92,7 @@ Operator { !operator Symbol } whitespace { (std.whitespace | ",")+ } - LineComment { ";" ![\n]* } + CommentText { ![\n]+ } // https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.8 // class or constructor names