带有内容的百里香自定义标签 [英] thymeleaf custom tag with contents

查看:19
本文介绍了带有内容的百里香自定义标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 thymeleaf 的新手,我正在尝试创建一个 Web 组件.我想要的是这样的:

hi!

翻译成这样:

<div class="panel"><div class="contents"><div>hi!</div></div></div>

我一直在尝试扩展 AbstractElementTagProcessor,但我似乎无法弄清楚如何将标签放入已处理的标签中:

public class PanelTagProcessor extends AbstractElementTagProcessor {私有静态最终字符串ELEMENT_NAME =面板";private static final int PRECEDENCE = 10000;公共面板标签处理器(最终字符串方言前缀){super(TemplateMode.HTML, "components", ELEMENT_NAME, true, null, false, PRECEDENCE);}@覆盖protected void doProcess(ITemplateContext 上下文,IProcessableElementTag 标记,IElementTagStructureHandler 结构处理程序) {//如何用自定义节点包围标签内的内容?}}

如果有人能帮助我,我将不胜感激:)

问候路易斯

解决方案

首先,我认为仅使用 AbstractElementTagProcessor 是不可能的.根据文档,这些处理器仅在打开/独立标签事件上执行(没有处理器可以应用于关闭标签),并且没有(直接)访问元素主体."

我设法让它通过 AbstractElementModelProcessor(以 IModel 对象的形式在完整元素上执行,包括它们的主体"),所以这对我有用.

public class PanelTagProcessor extends AbstractElementModelProcessor {私有静态最终字符串TAG_NAME =面板";private static final int PRECEDENCE = 10000;公共面板标签处理器(字符串方言前缀){super(TemplateMode.HTML, dialectPrefix, TAG_NAME, true, null, false, PRECEDENCE);}@覆盖protected void doProcess(ITemplateContext itc, IModel imodel, IElementModelStructureHandler iemsh) {IModelFactory modelFactory = itc.getModelFactory();imodel.replace(0, modelFactory.createOpenElementTag("div", "class", "panel"));imodel.insert(1, modelFactory.createOpenElementTag("div", "class", "contents"));imodel.insert(imodel.size() - 2, modelFactory.createCloseElementTag("div"));imodel.replace(imodel.size() - 1, modelFactory.createCloseElementTag("div"));}}

I'm new to thymeleaf and I'm trying to create a web component. What I want is something as this:

<components:panel><div>hi!</div></components:panel>

translated to something like this:

<div class="panel"><div class="contents"><div>hi!</div></div></div>

I've been trying to extend an AbstractElementTagProcessor, but I can't seem to figure out how to get the tags inside the processed tag:

public class PanelTagProcessor extends AbstractElementTagProcessor { 

    private static final String ELEMENT_NAME = "panel"; 
    private static final int PRECEDENCE = 10000; 

    public PanelTagProcessor(final String dialectPrefix) { 
        super(TemplateMode.HTML, "components", ELEMENT_NAME, true, null, false, PRECEDENCE); 
    } 

    @Override 
    protected void doProcess(ITemplateContext context, IProcessableElementTag tag, 
        IElementTagStructureHandler structureHandler) { 

        // How could I surround contents inside the tag with custom nodes? 

    } 
} 

I'd be grateful if someone could help me :)

Regards Luis

解决方案

First, I don't think it's possible to do with just a AbstractElementTagProcessor. According to the documentation, those kind of processors "execute on open/standalone tag events only (no processors can be applied to close tags), and have no (direct) access to the element body."

I managed to get it working which an AbstractElementModelProcessor ("execute on complete elements, including their bodies, in the form of IModel objects"), so here is what worked for me.

public class PanelTagProcessor extends AbstractElementModelProcessor {

  private static final String TAG_NAME = "panel";
  private static final int PRECEDENCE = 10000;

  public PanelTagProcessor(String dialectPrefix) {
    super(TemplateMode.HTML, dialectPrefix, TAG_NAME, true, null, false, PRECEDENCE);
  }

  @Override
  protected void doProcess(ITemplateContext itc, IModel imodel, IElementModelStructureHandler iemsh) {
    IModelFactory modelFactory = itc.getModelFactory();
    imodel.replace(0, modelFactory.createOpenElementTag("div", "class", "panel"));
    imodel.insert(1, modelFactory.createOpenElementTag("div", "class", "contents"));
    imodel.insert(imodel.size() - 2, modelFactory.createCloseElementTag("div"));
    imodel.replace(imodel.size() - 1, modelFactory.createCloseElementTag("div"));
  }
}

这篇关于带有内容的百里香自定义标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆