模板引擎是用于处理模板和内容信息以生成输出文档的软件。
我目前正在为 NodeJs 制作一个小模块。为此我需要一点帮助。 我会这样讲。 我有一个带字符串的变量。它包含一个字符串 html 值。现在我需要替换 $(ti...
如何从同一 YAML 文件中的其他位置引用 YAML“设置”?
我有以下 YAML: 路径: 路径:/path/to/root/a 路径b:/路径/到/root/b 路径c:/路径/到/root/c 我怎样才能“规范化”这个,通过从三个路径中删除 /path/to/root/ ,并有......
FreeMarker 模板支持具有以下语法的 if 语句 <#if hot> 很热。 我查看了文档,找不到任何对 if-else 状态的支持......
我目前正在尝试为我正在开发的项目创建一个小型模板引擎,并且我正在使用一个系统,其中我将 {$tag} 替换为预设标签。假设我将 {username} 放入我的临时表中...
我正在开发一个使用 Pug 模板引擎的项目。我的所有 Pug 文件(layout.pug、head.pug、index.pug 等)都存储在名为 pug 的文件夹中。在我的layout.pug 文件中,我已经建立了...
我正在开发一个使用 Pug 模板引擎的项目。我的所有 Pug 文件(layout.pug、head.pug、index.pug 等)都存储在名为 pug 的文件夹中。在我的layout.pug 文件中,我已经建立了...
google.script.run 无法在 HTML 模板中运行
我正在通过 HTML 模板从库开发电子表格工具,但服务器功能不起作用。 gs简化代码(函数较长): 函数取消版本(){ ...
Nunjucks:带有多个“and”或“or”条件的“if”
今天我的队友正在努力解决如何在 Nunjucks 模板的 if 语句中添加带有“and”或“or”的多个条件。经过大量搜索后,他找到了答案,但在 Stackoverflow 上却找不到。我...
Pug 找不到已安装的Highlight.js JSTransformer 过滤器
文档说我只需通过 npm 安装过滤器即可使用它们。 如果您希望能够在 Pug 模板中使用过滤器,您首先要确保这些功能是
是否有像 String.format 这样的标准或至少广泛的实现,但带有命名参数? 我想以这样的方式格式化模板化字符串: 地图 是否有类似 String.format 之类的标准或至少广泛的实现,但带有命名参数? 我想以这样的方式格式化模板化字符串: Map<String, Object> args = new HashMap<String, Object>(); args.put("PATH", "/usr/bin"); args.put("file", "foo"); String s = someHypotheticalMethod("#{PATH}/ls #{file}"); // "/usr/bin/ls foo" 从技术上讲,它几乎与: String[] args = new String[] { "/usr/bin", "foo" }; String s = String.format("%1$s/ls %2$s", args); // "/usr/bin/ls foo" 但带有命名参数。 我知道: 字符串.format 格式化程序 消息格式 但它们都使用有序或至少编号的参数,而不是命名的参数。我知道实现它很简单,但是我是否在标准 Java 库中或至少在 Apache Commons / Guava / 类似的东西中寻找一种机制,而不引入引人注目的模板引擎? 注意:我对成熟的模板引擎并不真正感兴趣,它具有一些命令式/功能逻辑、流程控制、修饰符、子模板/包含、迭代器等功能。通常以下方法是有效的 4 -line 实现 - 这就是我所需要的: public static String interpolate(String format, Map<String, ? extends Object> args) { String out = format; for (String arg : args.keySet()) { out = Pattern.compile(Pattern.quote("#{" + arg + "}")). matcher(out). replaceAll(args.get(arg).toString()); } return out; } 如果无法选择 Java 7,您也可以尝试 org.apache.commons.lang3.text.StrSubstitutor。它完全做你想要它做的事。它是否轻量级可能取决于您是否也使用其他 commons-lang 的东西。 Matcher#appendReplacement()会有所帮助 我最近发现JUEL非常符合描述。它是从JSP中取出的表达语言。它声称也非常快。 我即将在我自己的一个项目中尝试一下。 但是对于更轻量级的,这是你的变体,请尝试这个(包含在单元测试中): public class TestInterpolation { public static class NamedFormatter { public final static Pattern pattern = Pattern.compile("#\\{(?<key>.*)}"); public static String format(final String format, Map<String, ? extends Object> kvs) { final StringBuffer buffer = new StringBuffer(); final Matcher match = pattern.matcher(format); while (match.find()) { final String key = match.group("key"); final Object value = kvs.get(key); if (value != null) match.appendReplacement(buffer, value.toString()); else if (kvs.containsKey(key)) match.appendReplacement(buffer, "null"); else match.appendReplacement(buffer, ""); } match.appendTail(buffer); return buffer.toString(); } } @Test public void test() { assertEquals("hello world", NamedFormatter.format("hello #{name}", map("name", "world"))); assertEquals("hello null", NamedFormatter.format("hello #{name}", map("name", null))); assertEquals("hello ", NamedFormatter.format("hello #{name}", new HashMap<String, Object>())); } private Map<String, Object> map(final String key, final Object value) { final Map<String, Object> kvs = new HashMap<>(); kvs.put(key, value); return kvs; } } 我会扩展它以添加便捷的方法来快速键值对 format(format, key1, value1) format(format, key1, value1, key2, value2) format(format, key1, value1, key2, value2, key3, value3) ... 从 java 7+ 转换到 java 6- 应该不会太难 StringTemplate 可能是您可能得到的轻量级插值引擎,尽管我不知道它如何在资源方面与 FreeMarker、Mustache 或 Velocity 之类的东西相比。 另一个选择可能是 EL 引擎,例如 MVEL,它具有 模板引擎。 这是我的解决方案: public class Template { private Pattern pattern; protected Map<CharSequence, String> tokens; private String template; public Template(String template) { pattern = Pattern.compile("\\$\\{\\w+\\}"); tokens = new HashMap<CharSequence, String>(); this.template = template; } public void clearAllTokens() { tokens.clear(); } public void setToken(String token, String replacement) { if(token == null) { throw new NullPointerException("Token can't be null"); } if(replacement == null) { throw new NullPointerException("Replacement string can't be null"); } tokens.put(token, Matcher.quoteReplacement(replacement)); } public String getText() { final Matcher matcher = pattern.matcher(template); final StringBuffer sb = new StringBuffer(); while(matcher.find()) { final String entry = matcher.group(); final CharSequence key = entry.subSequence(2, entry.length() - 1); if(tokens.containsKey(key)) { matcher.appendReplacement(sb, tokens.get(key)); } } matcher.appendTail(sb); return sb.toString(); } public static void main(String[] args) { Template template = new Template("Hello, ${name}."); template.setToken("name", "Eldar"); System.out.println(template.getText()); } } 我知道我的答案来得有点晚了,但如果你仍然需要这个功能,而不需要下载成熟的模板引擎,你可以看看aleph-formatter(我是作者之一): Student student = new Student("Andrei", 30, "Male"); String studStr = template("#{id}\tName: #{st.getName}, Age: #{st.getAge}, Gender: #{st.getGender}") .arg("id", 10) .arg("st", student) .format(); System.out.println(studStr); 或者你可以链接参数: String result = template("#{x} + #{y} = #{z}") .args("x", 5, "y", 10, "z", 15) .format(); System.out.println(result); // Output: "5 + 10 = 15" 在内部,它使用 StringBuilder 通过“解析”表达式创建结果,不执行字符串连接、正则表达式/替换。 我还在我的 str utils 中做了一个(未测试)string.MapFormat("abcd {var}",map)。 //util public static String mapFormat(String template, HashMap<String, String> mapSet) { String res = template; for (String key : mapSet.keySet()) { res = template.replace(String.format("{%s}", key), mapSet.get(key)); } return res; } //use public static void main(String[] args) { boolean isOn=false; HashMap<String, String> kvMap=new HashMap<String, String>(); kvMap.put("isOn", isOn+""); String exp=StringUtils.mapFormat("http://localhost/api/go?isOn={isOn}", kvMap); System.out.println(exp); } 您可以使用Java的字符串模板功能。 它在 JEP 430 中进行了描述,并作为预览功能出现在 JDK 21 中。这是一个使用示例: String name = "Joan"; String info = STR."My name is \{name}"; assert info.equals("My name is Joan"); // true Java 的字符串模板比其他语言(例如 Python 的 f 字符串)中的插值更通用,也更安全。例如,字符串连接或插值使得 SQL 注入攻击成为可能: String query = "SELECT * FROM Person p WHERE p.last_name = '" + name + "'"; ResultSet rs = conn.createStatement().executeQuery(query); 但是这个变体(来自 JEP 430)可以防止 SQL 注入: PreparedStatement ps = DB."SELECT * FROM Person p WHERE p.last_name = \{name}"; ResultSet rs = ps.executeQuery();
我希望我的Java应用程序从用户读取字符串,该字符串可能包含一些标签,例如: 字符串文本 =“值 1 = #value1 且值 2 = #value2”; int[] intArray = new int[] {4,5}; 还有...
在服务器端使用 python str.format 方法与用户提交的模板安全吗?
我正在开发一个项目,用户必须能够提交包含占位符的模板,以便稍后呈现以生成动态内容。 例如,用户可能会提交如下模板: &quo...
通常,jinja2 render_template 方法会询问 html 的完整路径的字符串。 我按照下面的格式进行操作,但它仍然会引发错误。 render_template('/var/www/xyz/template/_base_front.html', {"...
我有一个带有占位符的模板(例如 ${PARAM1}),程序成功解析了它们。但是如果我只想解析我传递给模板引擎的占位符并留下其他 ${}
TemplateEngine 的邮件模板不读取 html 标签
我有以下模板: 我有以下模板: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Template for reminder to team lead</title> </head> <body> <p>Hello<span th:text="${firstNameTeamLead}"></span> <span th:text="${lastNameTeamLead}">!</span> </p> <p></span> <span th:text="${member}"> !</span> did not: <span th:text="${lateSteps}"></span></p> </body> </html> lateStep 是一个包含列表的字符串,一些 html 标记用于显示带有项目符号的列表。事情是 html 没有被读取,我的邮件中只有一大块内容混合了 html 标签,如下所示: Hello teamLeadFirstName teamLeadLastName ! memberName did not: <br /> <li><ul> fetch his food today </ul><ul> talk to the blacksmith </ul></li> 任何人都知道我该怎么做
我创建了一个 javascript 模板引擎,我需要一些引擎来帮助我使代码更干净、更高效 我在寻找什么? 用 ES5 编写 重量轻 没有外部库 避免重复...
我有代码我想显示餐厅的餐桌数量我的代码是: #{restaurant.tables.length} 但它对我不起作用并错误我“无法读取未定义的属性'长度'”。我该如何解决......
如何使用Thymeleaf整合一个共享布局,并在项目中的所有html页面中使用该布局?
到目前为止,我所做的是这样的,但很明显,这是不工作的。我想在所有的页面中使用这个页眉和页脚,如何制作一个共享的布局并在其他页面中使用它?我已经给出了图片...
我想使用NodeJS、Express和Pug创建一个应用程序。该应用应该类似于编辑器的工作方式,并对不同的用户事件做出反应。现在我有一个概念性的问题。用NodeJS和...
我试图使用http:/dotliquidmarkup.orgtry-online的例子。我有以下代码,使用NuGet包DotLiquid namespace TestDotLiquidLoop { public class User : Drop { ...