首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于生成完整html的装饰器模式

用于生成完整html的装饰器模式
EN

Software Engineering用户
提问于 2019-01-03 09:59:43
回答 1查看 175关注 0票数 0

我想找出最好的方法来装饰html。我的意思是用实际的内容替换特定的语法字符串。

类似于Asp.net MVC中使用<%= %>的剃须刀语法。

目前,我有一个带有设计的HTML页面,我只需要用实际的内容替换标记(针对ex:<%HISTORICTABLE%>)。

我在html中有5-6个标记,需要用原来的HTML替换。

我可能会在html中添加新的/删除标记(“行为”)。

我认为装潢师的图案应该起作用,还是你认为这是过火了?

EN

回答 1

Software Engineering用户

发布于 2019-01-03 12:40:31

装饰模式是关于增强对象的行为。例如,我们可能创建一个日志装饰器,它记录所有方法调用,然后将调用转发给原始对象。装饰器模式对于创建HTML模板没有直接的帮助。

对于一个简单的模板引擎,您所需要的只是一个很小的函数

  • 查找输入中的所有模板标记,
  • 用它们的值替换标记,并且
  • 负责HTML转义。

在伪代码中,这可能类似于:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
$template =~ s/ <%(\w+)%> / html_escape($variables{$1}) /xeg;

在这里,变量定义可用的“标记”。这种方法还确保同时替换所有标记,这样展开的顺序就不重要了。

如果您想要链接多种类型的扩展,并且希望动态配置扩展的顺序,那么使用装饰器模式可能是有意义的。例如:

代码语言:javascript
复制
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.
票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/384890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档