From 419a7ca35a537c762543407330013c286165f345 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 13 Jul 2021 18:40:47 +0200 Subject: [PATCH] Selmer update --- deps.edn | 2 +- feature-selmer/babashka/impl/selmer.clj | 38 +++++++++++++++++++------ project.clj | 2 +- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/deps.edn b/deps.edn index 275b302e..ddbbcca9 100644 --- a/deps.edn +++ b/deps.edn @@ -37,7 +37,7 @@ org.clojure/core.match {:mvn/version "1.0.0"} hiccup/hiccup {:mvn/version "2.0.0-alpha2"} rewrite-clj/rewrite-clj {:mvn/version "1.0.605-alpha"} - selmer/selmer {:mvn/version "1.12.40"} + selmer/selmer {:mvn/version "1.12.41"} com.taoensso/timbre {:mvn/version "5.1.2"} org.clojure/tools.logging {:mvn/version "1.1.0"}} :aliases {:babashka/dev diff --git a/feature-selmer/babashka/impl/selmer.clj b/feature-selmer/babashka/impl/selmer.clj index 49ad7dda..743bec54 100644 --- a/feature-selmer/babashka/impl/selmer.clj +++ b/feature-selmer/babashka/impl/selmer.clj @@ -1,6 +1,7 @@ (ns babashka.impl.selmer {:no-doc true} (:require [babashka.impl.classpath :refer [resource]] + [babashka.impl.common :refer [ctx]] [sci.core :as sci] [selmer.filters :as filters] [selmer.parser] @@ -10,20 +11,23 @@ (def spns (sci/create-ns 'selmer.parser nil)) +(def include #{'env-map}) + (defn make-ns [ns sci-ns] (reduce (fn [ns-map [var-name var]] (let [m (meta var) no-doc (:no-doc m) doc (:doc m) arglists (:arglists m)] - (if no-doc ns-map - (assoc ns-map var-name - (sci/new-var (symbol var-name) @var - (cond-> {:ns sci-ns - :name (:name m)} - (:macro m) (assoc :macro true) - doc (assoc :doc doc) - arglists (assoc :arglists arglists))))))) + (if (and no-doc (not (contains? include var-name))) + ns-map + (assoc ns-map var-name + (sci/new-var (symbol var-name) @var + (cond-> {:ns sci-ns + :name (:name m)} + (:macro m) (assoc :macro true) + doc (assoc :doc doc) + arglists (assoc :arglists arglists))))))) {} (ns-publics ns))) @@ -55,11 +59,27 @@ (binding [util/*escape-variables* @escape-variables] (selmer.parser/render-template template context-map))) +(defn sci-resolve [fqs] + (let [res (sci/eval-form @ctx (list 'clojure.core/resolve (list 'quote fqs)))] + (if (instance? clojure.lang.IDeref res) @res res))) + +(defn resolve-var-from-kw [env kw] + (when-let [value (if (namespace kw) + (try (sci-resolve (symbol (str (namespace kw) "/" (name kw)))) + (catch java.lang.RuntimeException _ nil)) + (or + ;; check local env first + (get env kw nil) + (try (sci-resolve (symbol (str (name kw)))) + (catch java.lang.RuntimeException _ nil))))] + {kw value})) + (def selmer-parser-namespace (-> selmer-parser-ns (assoc 'render-file (sci/copy-var render-file spns) 'render (sci/copy-var render spns) - 'render-template (sci/copy-var render-template spns)))) + 'render-template (sci/copy-var render-template spns) + 'resolve-var-from-kw (sci/copy-var resolve-var-from-kw spns)))) (def stns (sci/create-ns 'selmer.tags nil)) diff --git a/project.clj b/project.clj index 2b2c2787..af5cedc3 100644 --- a/project.clj +++ b/project.clj @@ -59,7 +59,7 @@ :feature/rewrite-clj {:source-paths ["feature-rewrite-clj"] :dependencies [[rewrite-clj/rewrite-clj "1.0.605-alpha"]]} :feature/selmer {:source-paths ["feature-selmer"] - :dependencies [[selmer/selmer "1.12.40"]]} + :dependencies [[selmer/selmer "1.12.41"]]} :test [:feature/xml :feature/lanterna :feature/yaml