我想找出最好的方法来装饰html。我的意思是用实际的内容替换特定的语法字符串。
类似于Asp.net MVC中使用<%= %>的剃须刀语法。
目前,我有一个带有设计的HTML页面,我只需要用实际的内容替换标记(针对ex:<%HISTORICTABLE%>)。
我在html中有5-6个标记,需要用原来的HTML替换。
我可能会在html中添加新的/删除标记(“行为”)。
我认为装潢师的图案应该起作用,还是你认为这是过火了?
发布于 2019-01-03 12:40:31
装饰模式是关于增强对象的行为。例如,我们可能创建一个日志装饰器,它记录所有方法调用,然后将调用转发给原始对象。装饰器模式对于创建HTML模板没有直接的帮助。
对于一个简单的模板引擎,您所需要的只是一个很小的函数
在伪代码中,这可能类似于:
def expand_template(template: string, variables: dictionary) -> string {
return template.replace_all("<%(\w+)%>", (match) => {
var key = match[0];
return html_escape(variables.get(key));
});
}或者在Perl中:
$template =~ s/ <%(\w+)%> / html_escape($variables{$1}) /xeg;在这里,变量定义可用的“标记”。这种方法还确保同时替换所有标记,这样展开的顺序就不重要了。
如果您想要链接多种类型的扩展,并且希望动态配置扩展的顺序,那么使用装饰器模式可能是有意义的。例如:
interface HtmlTransformer {
def transformed(html: string) -> string;
}
class Null() implements HtmlTransformer {
override def transformed(html: source) -> string = source;
}
class TagExpander(next: HtmlTransformer, tags: dictionary) implement HtmlTransformer {
override def transformed(html: source) -> string {
return next.transformed(html)
.replace_all("<%(\w+)%>", (match) => html_escape(tags.get(match[0])));
}
}
var template = Null();
// add one decorator
template = TagExpander(template, {"foo": "bar <%baz%>"});
// maybe add another decorator
if (some_condition_holds) {
template = TagExpander(template, {"baz": "qux"});
}
print(template.transformed("This is some <%foo%> text"))
// prints either: This is some foo bar <%baz%> text
// or: This is some foo bar qux text
// depending on runtime behavior.https://softwareengineering.stackexchange.com/questions/384890
复制相似问题