【问题标题】:Lightweight Clojure library for simple string templating?用于简单字符串模板的轻量级 Clojure 库?
【发布时间】:2015-02-17 10:28:32
【问题描述】:

我正在寻找 clojars 中可用的(最好是小的)Clojure 库,它允许我替换字符串中的简单模板,例如:

“你好,我的名字是 ${name}”

其中${name} 应替换为模板引擎。在 Java 中,我通常使用运行良好的JMTE。我知道我也可以从 Clojure 中使用它,但我想知道是否有一些对 Clojure 更友好/惯用的东西。

【问题讨论】:

    标签: string clojure template-engine


    【解决方案1】:

    您可以使用core.incubator 项目中的<< 字符串插值宏。

    要使用它,请将[org.clojure/core.incubator "0.1.4"] 添加为project.clj 文件中的依赖项。 (注意:查看 core.incubator 的GitHub page 以获取最新的安装说明。)

    使用示例:

    (ns example
      (:require [clojure.core.strint :refer [<<]]))
    
    (def my-name "XYZ")
    (<< "My name is ~{my-name}.")
    ; Returns: "My name is XYZ."
    
    (let [x 3
          y 4]
      (<< "~{x} plus ~{y} equals ~(+ x y)."))
    ; Returns: "3 plus 4 equals 7."
    

    注意花括号~{}和括号~()的区别。

    【讨论】:

      【解决方案2】:

      有相当多的模板库。一些通用的有:

      注意:如果您只需要一些巧妙的格式化,您可以使用标准库clojure.pprintcl-format 函数和clojure.core/format,它是java.util.Formatter 的包装器。

      【讨论】:

      • 要查看cl-format 的用法,请查看answer
      • 在合适的时候使用宿主库是惯用的 Clojure,似乎在这里使用 clojure.core/format 很合适。
      【解决方案3】:

      虽然不是图书馆,但在Clojure, the Essential Reference book 中找到了这个例子。

      replace 可用于实现简单的文本替换 系统。输入字符串包含系统的特殊占位符 可以从已知替换列表中识别和替换:

      (def text "You provided the following: user {usr} password {pwd}")
      (def sub {"{usr}" "'rb075'" "{pwd}" "'xfrDDjsk'"})
      
      (transduce
        (comp
          (replace sub)
          (interpose " "))
        str
        (clojure.string/split text #"\s"))
      
      ;; "You provided the following: user 'rb075' password 'xfrDDjsk'"
      

      【讨论】:

      • 注意:这仅适用于空格分隔的术语,例如hi{there} 不起作用。
      【解决方案4】:

      我找到了this

      也许这就是你想要的。

      【讨论】:

      • 看起来很有希望,但我更喜欢它是否可以在 clojars 中使用
      • 为什么?它在 clojure.core 的孵化器项目中可用。如果他们决定将此库合并到 Clojure 本身中,您只能获得更官方的信息。据我所知,没有一个 clojure.core 项目在 Clojars 中,包括 Clojure、ClojureScript、core.async、nREPL 和 test.check。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      相关资源
      最近更新 更多