在 freemarker 中拼接字符串的中间?
Splicing middle of a string in freemarker?
我正在尝试使用 Freemarker 在 Netsuite Advanced PDF 中拼接一个字符串。我已经阅读了 string builtins 的文档,但不确定这是怎么可能的。
我有一个 table 应该包含一个自由文本变量。如果文本太长,我希望文本溢出到下一个 td,但我不知道这是否可行。我想我可以尝试拼接一半的字符串,如果它是一定数量的字符,然后将它的第二部分放入下一个td。这样做会在生成范围超出范围的 PDF 时产生错误。
我正在尝试做的事情是否可行,还是我的做法有误?相关代码如下。
<td style="background-color:#dce6f1" colspan="4"><strong>Additional Items:</strong>${record.custbody387[0..*50]}</td>
</tr>
<tr>
<td colspan="4">${record.custbody387[51..*100]}</td>
</tr>
<tr>
<td colspan="4" style="background-color:#dce6f1">This is Note 3</td>
</tr>
<tr>
您可以使用子字符串函数,但您仍然需要检查限制。
我使用这样的宏:
<#macro lim val len><#if val?length < len>${val}<#else>${val?substring(0,len)}</#if></#macro>
然后像这样使用:
<@lim val="${orderAddress.addressee}" len=35 />
所以您可以制作自己的宏,确保您至少有 51 个字符开始。它可能看起来像:
<#macro lim val><#if val?length gte 51>${val[51..*100]}</#if></#macro>
注意:Freemarker 宏位于文件顶部(与位于 <macrolist>
元素中的 BFO 宏不同)
您可以简单地在第二个 td
中使用 #if
或 ?then
来避免导致错误的情况。获取一个切片(预定义大小)也可以泛化为一个函数(或者泛化为一个宏,但是函数更适合这个),但是如果你只调用它两次,它可能是一个大材小用:
<#function getSlice(s, partNo)>
<#local start = 50 * (partNo - 1)>
<#return (s?length <= start)?then("", s[start..*50])>
</#function>
<tr>
<td style="background-color:#dce6f1" colspan="4"><strong>Additional Items:</strong>
${getSlice(record.custbody387, 1)}
</td>
</tr>
<tr>
<td colspan="4">
${getSlice(record.custbody387, 2)}
</td>
</tr>
我正在尝试使用 Freemarker 在 Netsuite Advanced PDF 中拼接一个字符串。我已经阅读了 string builtins 的文档,但不确定这是怎么可能的。
我有一个 table 应该包含一个自由文本变量。如果文本太长,我希望文本溢出到下一个 td,但我不知道这是否可行。我想我可以尝试拼接一半的字符串,如果它是一定数量的字符,然后将它的第二部分放入下一个td。这样做会在生成范围超出范围的 PDF 时产生错误。
我正在尝试做的事情是否可行,还是我的做法有误?相关代码如下。
<td style="background-color:#dce6f1" colspan="4"><strong>Additional Items:</strong>${record.custbody387[0..*50]}</td>
</tr>
<tr>
<td colspan="4">${record.custbody387[51..*100]}</td>
</tr>
<tr>
<td colspan="4" style="background-color:#dce6f1">This is Note 3</td>
</tr>
<tr>
您可以使用子字符串函数,但您仍然需要检查限制。
我使用这样的宏:
<#macro lim val len><#if val?length < len>${val}<#else>${val?substring(0,len)}</#if></#macro>
然后像这样使用:
<@lim val="${orderAddress.addressee}" len=35 />
所以您可以制作自己的宏,确保您至少有 51 个字符开始。它可能看起来像:
<#macro lim val><#if val?length gte 51>${val[51..*100]}</#if></#macro>
注意:Freemarker 宏位于文件顶部(与位于 <macrolist>
元素中的 BFO 宏不同)
您可以简单地在第二个 td
中使用 #if
或 ?then
来避免导致错误的情况。获取一个切片(预定义大小)也可以泛化为一个函数(或者泛化为一个宏,但是函数更适合这个),但是如果你只调用它两次,它可能是一个大材小用:
<#function getSlice(s, partNo)>
<#local start = 50 * (partNo - 1)>
<#return (s?length <= start)?then("", s[start..*50])>
</#function>
<tr>
<td style="background-color:#dce6f1" colspan="4"><strong>Additional Items:</strong>
${getSlice(record.custbody387, 1)}
</td>
</tr>
<tr>
<td colspan="4">
${getSlice(record.custbody387, 2)}
</td>
</tr>