使用<wicket:message>标签生成部分格式化的文本</wicket:message>

时间:2010-12-08 12:08:03

标签: wicket

我已经阅读过关于wicket:message here的内容,但似乎无法让它做我想做的一切。

假设我有一个包含<wicket:message key="text"/>的HTML页面和一个包含text=Blah blah: important point, foo bar的属性文件。我想知道如何将文本的部分加粗(或对其应用任意CSS),以实现如下输出:

  

Blah blah:重点,foo bar

请注意,这些都不是动态,因此如果可以避免,我不想在Java中做任何事情。

我尝试使用以下内容嵌套标签,但没有运气。

<wicket:message key="text">
    <span class="bold"><wicket:message key="text2"/></span>
</wicket:message>

text=Blah blah: ${text2}, foo bar
text2=important point

这在Wicket中是否可能没有1)从Java端注入格式化部分或2)只是将文本分成(在这种情况下)三个不同的属性?

3 个答案:

答案 0 :(得分:4)

最简单的方法是将标记放在本地化文件中:

  

text = Blah blah:&lt; strong&gt; text2&lt; / strong&gt ;, foo bar

您也可以使用Label和ResourceModel稍后替换它:

  

text = Blah blah:[b] text2 [/ b],foo bar

在你的模型getObject()或你的Label中:

  

string.replace(“[b]”,“&lt; strong&gt;”);
  string.replace(“[/ b]”,“&lt; / strong&gt;”);

或者,更好的是,尝试在Label中重用Markdown实现。

答案 1 :(得分:3)

我已经设法为我自己的应用程序做了这个,虽然有一个相当丑陋的黑客。我通过暴露WicketMessageResolver的自定义版本来实现它。

这是尝试的内容:

批量复制并粘贴org.apache.wicket.markup.resolver.WicketMessageResolver到您自己的班级(比如com.acme.CustomWicketMessageResolver)(黑客开始!)

在CustomWicketMessageResolver内部进行更改 WicketTagIdentifier.registerWellKnownTagName( "message" ); WicketTagIdentifier.registerWellKnownTagName( "msg" );之类的其他内容。

里面的 private void renderMessage(final MarkupStream markupStream, final ComponentTag openTag, final String key, final String value),您会找到第getResponse().write( text );行。

在该行之前,您有机会使用“text”的值。在那里,我执行类似text = MyLabelUtils.replaceWikiMarkup(text)的操作,后者处理内容作者为我的应用程序使用的一些类似wiki的标记语法。

例如,我使用此方法使用指向键的ResourceModel获取Label:

propertyKey=I found the answer on [acronym SO].

并将其渲染为

I found the answer on <acronym title="Stack Overflow">SO</acronym>

并且该方法处理i18n以及所有有趣的东西。

当然,您可以将wiki语法(或类似内容)扩展为您需要的简单或复杂。

请注意,您必须在所有标记文件中更改<wicket:message key='foo'><wicket:msg key='foo>(或至少在您希望出现此行为的文件中)。

我显然更喜欢使用更标准的方式来自定义内置的消息解析器的行为,但如果你需要这个功能,就像我一样,这将暂时有效。

如果您需要更标准的内容,可以在Wicket邮件列表中提出问题。这很不错。

答案 2 :(得分:1)

从Wicket 1.4开始,您可以在wicket:message元素中嵌套组件。例如:

<wicket:message key="myKey">
  This text will be replaced with text from the properties file.
  <span wicket:id="amount">[amount]</span>.
  <a wicket:id="link">
    <wicket:message key="linkText"/>
  </a>
</wicket:message>

然后

myKey=Your balance is ${amount}. Click ${link} to view the details.
linkText=here

add(new Label("amount",new Model("$5.00")));
add(new BookmarkablePageLink("link",DetailsPage.class)); 

结果:

Your balance is $5.00. Click <a href="...">here</a> to view the details.

所以也许,在没有组件的情况下嵌套<wicket:message>也可以。不确定。

来源:https://cwiki.apache.org/confluence/display/WICKET/Wicket%27s+XHTML+tags#Wicket%27sXHTMLtags-Elementwicket%3Amessage