From 87588e55176e3b1694373dabd2cd99e62f1a16e0 Mon Sep 17 00:00:00 2001 From: Matthew Huebert Date: Tue, 1 Feb 2022 14:26:48 +0100 Subject: [PATCH 1/4] include source string when registering a devcard --- modules/devcards/src/nextjournal/devcards.clj | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/modules/devcards/src/nextjournal/devcards.clj b/modules/devcards/src/nextjournal/devcards.clj index 268bfe57..8c6fd79f 100644 --- a/modules/devcards/src/nextjournal/devcards.clj +++ b/modules/devcards/src/nextjournal/devcards.clj @@ -1,4 +1,6 @@ -(ns nextjournal.devcards) +(ns nextjournal.devcards + (:require [clojure.java.io :as io] + [clojure.string :as str])) (defmacro when-enabled [& body] `(do ~@body)) @@ -7,9 +9,9 @@ (let [ns-str (str *ns*) name-str (name vname)] `(when-enabled - (~'nextjournal.devcards/register-devcard* - (assoc ~opts :ns ~ns-str :name ~name-str)) - ~(str ns-str "/" name-str)))) + (~'nextjournal.devcards/register-devcard* + (assoc ~opts :ns ~ns-str :name ~name-str)) + ~(str ns-str "/" name-str)))) (defn parse-optional-preds "Return a list of bindings corresponding to `preds`. @@ -32,6 +34,28 @@ [env] (some? (:ns env))) +(defn form-source + "Returns source string for (meta &form)" + [{:keys [line end-line column end-column file source]}] + (let [file-string (or source (->> (io/resource file) slurp str/split-lines)) + lines (->> file-string + str/split-lines + (drop (dec line)) + (take (inc (- end-line line))) + vec) + lines (-> lines + (update 0 #(subs % column)) + (update (dec (count lines)) #(subs % 0 end-column)))] + (str/join \newline lines))) + +(comment + (= (form-source {:line 0 + :end-line 1 + :column 1 + :end-column 1 + :source "ab\ncd"}) + "b\nc")) + (defmacro defcard {:arglists '([name ?doc ?argv body ?data])} [& args] @@ -45,6 +69,7 @@ (register-devcard! name {:data `(fn [] ~data) :doc doc + :source (form-source (meta &form)) :compile-key (hash data) :main `(fn [] ~main)})))) From c3e4dde393a9521e67b028d2ce1507e1e9fa8e63 Mon Sep 17 00:00:00 2001 From: Matthew Huebert Date: Tue, 1 Feb 2022 14:32:31 +0100 Subject: [PATCH 2/4] rename kw for overriding :file --- modules/devcards/src/nextjournal/devcards.clj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/devcards/src/nextjournal/devcards.clj b/modules/devcards/src/nextjournal/devcards.clj index 8c6fd79f..5814f978 100644 --- a/modules/devcards/src/nextjournal/devcards.clj +++ b/modules/devcards/src/nextjournal/devcards.clj @@ -36,8 +36,8 @@ (defn form-source "Returns source string for (meta &form)" - [{:keys [line end-line column end-column file source]}] - (let [file-string (or source (->> (io/resource file) slurp str/split-lines)) + [{:keys [line end-line column end-column file file-string]}] + (let [file-string (or file-string (->> (io/resource file) slurp str/split-lines)) lines (->> file-string str/split-lines (drop (dec line)) @@ -53,7 +53,7 @@ :end-line 1 :column 1 :end-column 1 - :source "ab\ncd"}) + :file-string "ab\ncd"}) "b\nc")) (defmacro defcard From c2d97c33c2ef27be0e672d56ec2edd34676e5477 Mon Sep 17 00:00:00 2001 From: Matthew Huebert Date: Tue, 1 Feb 2022 15:43:23 +0100 Subject: [PATCH 3/4] fix source-reading and show source (ugly) --- modules/devcards/src/nextjournal/devcards.clj | 25 +++++++++---------- .../devcards/src/nextjournal/devcards_ui.cljs | 1 + 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/modules/devcards/src/nextjournal/devcards.clj b/modules/devcards/src/nextjournal/devcards.clj index 5814f978..ef697fd9 100644 --- a/modules/devcards/src/nextjournal/devcards.clj +++ b/modules/devcards/src/nextjournal/devcards.clj @@ -36,23 +36,22 @@ (defn form-source "Returns source string for (meta &form)" - [{:keys [line end-line column end-column file file-string]}] - (let [file-string (or file-string (->> (io/resource file) slurp str/split-lines)) - lines (->> file-string - str/split-lines - (drop (dec line)) - (take (inc (- end-line line))) - vec) - lines (-> lines - (update 0 #(subs % column)) - (update (dec (count lines)) #(subs % 0 end-column)))] - (str/join \newline lines))) + [{:as meta :keys [line end-line column end-column file file-string]}] + (let [file-string (or file-string (->> (io/resource file) slurp)) + line (dec line) + column (dec column)] + (-> (str/split-lines file-string) + vec + (update line #(subs % column)) + (update (dec end-line) #(subs % 0 (- end-column 2))) + (subvec line end-line) + (->> (str/join \newline))))) (comment (= (form-source {:line 0 - :end-line 1 + :end-line 2 :column 1 - :end-column 1 + :end-column 2 :file-string "ab\ncd"}) "b\nc")) diff --git a/modules/devcards/src/nextjournal/devcards_ui.cljs b/modules/devcards/src/nextjournal/devcards_ui.cljs index a0bc39f3..767f19d3 100644 --- a/modules/devcards/src/nextjournal/devcards_ui.cljs +++ b/modules/devcards/src/nextjournal/devcards_ui.cljs @@ -137,6 +137,7 @@ [main state] main)] [:div + [:pre (:source props)] [nextjournal.devcards/error-boundary [:div {:class (or class "p-3")} main]] (when initial-state From ce6b61661d03976d9a9f8c4f8124810cb604e5c7 Mon Sep 17 00:00:00 2001 From: Matthew Huebert Date: Wed, 2 Feb 2022 09:40:20 +0100 Subject: [PATCH 4/4] fix source boundaries --- modules/devcards/src/nextjournal/devcards.clj | 32 +++++++------------ .../devcards/src/nextjournal/devcards_ui.cljs | 1 - 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/modules/devcards/src/nextjournal/devcards.clj b/modules/devcards/src/nextjournal/devcards.clj index ef697fd9..6376a00d 100644 --- a/modules/devcards/src/nextjournal/devcards.clj +++ b/modules/devcards/src/nextjournal/devcards.clj @@ -9,9 +9,9 @@ (let [ns-str (str *ns*) name-str (name vname)] `(when-enabled - (~'nextjournal.devcards/register-devcard* - (assoc ~opts :ns ~ns-str :name ~name-str)) - ~(str ns-str "/" name-str)))) + (~'nextjournal.devcards/register-devcard* + (assoc ~opts :ns ~ns-str :name ~name-str)) + ~(str ns-str "/" name-str)))) (defn parse-optional-preds "Return a list of bindings corresponding to `preds`. @@ -37,23 +37,15 @@ (defn form-source "Returns source string for (meta &form)" [{:as meta :keys [line end-line column end-column file file-string]}] - (let [file-string (or file-string (->> (io/resource file) slurp)) - line (dec line) - column (dec column)] - (-> (str/split-lines file-string) - vec - (update line #(subs % column)) - (update (dec end-line) #(subs % 0 (- end-column 2))) - (subvec line end-line) - (->> (str/join \newline))))) - -(comment - (= (form-source {:line 0 - :end-line 2 - :column 1 - :end-column 2 - :file-string "ab\ncd"}) - "b\nc")) + (let [file-string (or file-string (some-> file io/resource slurp))] + (when-let [file-string (or file-string (some-> file io/resource slurp))] + (let [line (dec line) + column (dec column)] + (-> (str/split-lines file-string) + (update line #(subs % column)) + (update (dec end-line) #(subs % 0 (dec end-column))) + (subvec line end-line) + (->> (str/join \newline))))))) (defmacro defcard {:arglists '([name ?doc ?argv body ?data])} diff --git a/modules/devcards/src/nextjournal/devcards_ui.cljs b/modules/devcards/src/nextjournal/devcards_ui.cljs index 767f19d3..a0bc39f3 100644 --- a/modules/devcards/src/nextjournal/devcards_ui.cljs +++ b/modules/devcards/src/nextjournal/devcards_ui.cljs @@ -137,7 +137,6 @@ [main state] main)] [:div - [:pre (:source props)] [nextjournal.devcards/error-boundary [:div {:class (or class "p-3")} main]] (when initial-state