Skip to content

Commit a68715c

Browse files
committed
workaround for server and client sometimes gives different result
1 parent b7767e8 commit a68715c

File tree

4 files changed

+64
-15
lines changed

4 files changed

+64
-15
lines changed

src/net/coruscation/cerulean/common/pages.cljc

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
[net.coruscation.cerulean.router :as router]
1313
[net.coruscation.cerulean.utils :refer
1414
[#?@(:cljs [obj->clj]) use-asset use-context use-orgx
15-
use-user-config] :as utils]
15+
use-precalculated use-user-config] :as utils]
1616
[uix.core :as uix :refer
1717
[$ #?@(:cljs [lazy suspense]) defui use-effect use-memo
1818
use-ref use-state]]))
@@ -222,16 +222,17 @@
222222
published-date description
223223
orgx] :as blog-asset}
224224
(use-asset (str "blog/" id))
225-
226-
toc-content (use-memo
227-
(fn []
228-
#?(:cljs (if show-toc? (let [dummy (.createElement js/document "html")]
229-
(set! (.-innerHTML dummy)
230-
content)
231-
(generate-toc-from-element dummy))
232-
nil)
233-
:clj (generate-toc-from-html-string content)))
234-
[content show-toc?])
225+
toc-content (use-precalculated id
226+
;; In some case, `generate-toc-from-html-string` (in clj) and
227+
;; `generate-toc-from-element` in cljs produces slightly different results.
228+
;; The following code will choose clj, if server rendered, and cljs version if client rendered.
229+
;; Thus workaround the problem.
230+
(fn [] #?(:clj (generate-toc-from-html-string content)))
231+
(fn [] #?(:cljs (if show-toc? (let [dummy (.createElement js/document "html")]
232+
(set! (.-innerHTML dummy)
233+
content)
234+
(generate-toc-from-element dummy))
235+
nil))))
235236
doc-ref (use-ref nil)
236237
[current-header-id set-current-header-id!] (use-state nil)]
237238
(utils/set-title! (str title " | " (use-user-config :title)))

src/net/coruscation/cerulean/render/context.clj

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
(ns net.coruscation.cerulean.render.context
2-
(:require [net.coruscation.cerulean.render.context-commons :refer :all]))
2+
(:require
3+
[clojure.edn :as edn]
4+
[net.coruscation.cerulean.render.context-commons :refer :all]))
35

46
(def ^:dynamic *context* (atom {}))
57

@@ -14,6 +16,13 @@
1416
assoc-in [:assets k]
1517
v))
1618

19+
;; TODO: unify put-edn! and add-asset!
20+
(defn put-edn! [k v]
21+
(add-assets! k (prn-str v)))
22+
23+
(defn get-edn [k]
24+
(edn/read-string (get @*context* k)))
25+
1726
(defn add-extra-script! [id module]
1827
(swap! *context* update-in
1928
[:extra-scripts]

src/net/coruscation/cerulean/utils.cljc

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77
#?@(:clj [[net.coruscation.cerulean.server.assets :as assets]
88
[reitit.core :as r]
99
[hickory.zip :as hzip]
10-
[net.coruscation.cerulean.orgx.orgx :as orgx]
11-
[net.coruscation.cerulean.render.context :as render-context]])
10+
[net.coruscation.cerulean.render.context :as render-context]
11+
[clojure.tools.logging :as logging]])
1212
[clojure.core.async :as a]
13+
[clojure.edn :as edn]
14+
[clojure.string :as str]
1315
[clojure.zip :as zip]
1416
[net.coruscation.cerulean.orgx.orgx-commons :as orgx-commons]
1517
[net.coruscation.cerulean.render.context-commons :as render-context-commons])
16-
#?(:cljs (:require-macros [net.coruscation.cerulean.utils :refer [use-context context-binding defcontext if-cljs cljc-case]]))
18+
#?(:cljs (:require-macros [net.coruscation.cerulean.utils :refer [use-context context-binding defcontext if-cljs cljc-case ident-clj-cljs use-precalculated]]))
1719
#?(:cljs (:import
1820
[goog.async Debouncer Throttle])))
1921

@@ -233,3 +235,23 @@
233235
(.-documentElement)
234236
(.-style)
235237
(.setProperty var value))))
238+
239+
#?(:clj (defn get-ident [env form]
240+
(let [ns (or (-> env :ns :name) (ns-name *ns*))
241+
{:keys [line column]} (meta form)
242+
ident (str (-> ns (str/replace "." "-")) "-" line "-" column)]
243+
ident)))
244+
245+
#?(:clj (defmacro use-precalculated
246+
[id & [calculate fallback]]
247+
(let [ident (get-ident &env &form)]
248+
(if (cljs-env? &env)
249+
`(let [calculated# (aget js/globalThis (str ~ident ~id))]
250+
(if (~'undefined? calculated#)
251+
(~fallback)
252+
(edn/read-string calculated#)))
253+
`(do
254+
(let [result# (~calculate)]
255+
(render-context/put-edn! (str ~ident ~id) result#)
256+
result#))))))
257+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
(ns net.coruscation.cerulean.utils-test
2+
(:require
3+
[clojure.edn :as edn]
4+
[clojure.test :refer [deftest is]]
5+
[net.coruscation.cerulean.render.context :as render-context]
6+
[net.coruscation.cerulean.utils :as subject]))
7+
8+
(deftest use-precalculated-test
9+
(render-context/with-new-context
10+
(subject/use-precalculated "abc"
11+
(fn [] (+ 1 1))
12+
(fn []))
13+
(let [assets (:assets @render-context/*context*)
14+
[key value] (first assets)]
15+
(is (= 1 (count assets)))
16+
(is (.endsWith key "abc"))
17+
(is (= 2 (edn/read-string value))))))

0 commit comments

Comments
 (0)