创建带有不可编辑部分的文件

时间:2018-08-11 15:10:25

标签: file templates clojure

在Clojure中,是否可能会吐出一个包含不可编辑部分的文件,就像您正在创建模板一样,并且您希望其中包含某些条目。用户可以选择填写这些条目的值,但不能自己玩这些条目?

1 个答案:

答案 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 YAMLJSON解析器。