在Clojure中,是否可能会吐出一个包含不可编辑部分的文件,就像您正在创建模板一样,并且您希望其中包含某些条目。用户可以选择填写这些条目的值,但不能自己玩这些条目?
答案 0 :(得分:1)
我将通过使用与模板分开的配置文件将用户输入(值)组合到“不可编辑”模板中。这样做的另一个好处是,您可以花费一定的精力对配置文件中的用户输入进行验证。
使用香草Clojure .edn
配置文件和使用正则表达式替换值的简单字符串模板的示例:
config.edn
{:first-name "Toni"
:last-name "Vanhala"}
core.clj
(ns template-engine
(:gen-class)
(:import (java.io FileReader PushbackReader)))
(def TEMPLATE ["Hi :first-name,"
"Your completed form:"
"First name: :first-name"
"Last name: :last-name"])
(def ^:private KW-REGEX #":([^,\s]+)")
(defn- get-config-val [config raw-val]
(->> raw-val
(second)
(keyword)
(get config)))
(defn format-line [config line]
(let [get-val (partial get-config-val config)]
(clojure.string/replace line KW-REGEX get-val)))
(defn- read-config [^String filename]
(let [stream (-> filename
(FileReader.)
(PushbackReader.))
config (clojure.edn/read stream)]
(->> TEMPLATE
(map #(format-line config %))
(clojure.string/join "\n")
(println))))
(defn -main
[& args]
(when-let [filename (first args)]
(read-config filename)))
编译后,可以在命令行上使用类似于以下内容的咒语运行它:
java -jar template-engine.jar config.edn
您可能要考虑使用更复杂的模板引擎来格式化输出。看一下Selmer。甚至cl-format都值得考虑。如果.edn
文件对您的用户来说太像“ Clojure样”,则您也可以对配置文件使用另一种格式。例如,有Clojure YAML和JSON解析器。