通过模板工具箱从多行字符串中获得的意外令牌是非法的

Unexpected token ILLEGAL from multi line string via template toolkit

本文关键字:意外 令牌 非法 字符串 工具箱      更新时间:2023-09-26

我在html页面中有一个js脚本,通过template::toolkit进行预处理。

脚本如下;

<script>
    $(function(){ 
    var floot = {
        id : [% floot.id %],
        image : '[% floot.image %]',
        title : "[% floot.title %]",
        desc : "[% floot.desc %]",
        history : []
    };
            /* unrelated stuff */
            /* set click event to display the floot details in an overlay */
    $('#' + floot.id).children('.openDetails').click(function() { 
        bubbleDetails(floot, user);
    });
</script>

问题是floor .desc可以包含换行符-它是一个描述,我想保留它们,但是js在换行符上阻塞芯片,导致Unexpected令牌错误。

我已经尝试了许多TT过滤器,例如

[% floot.desc | html_line_break | replace(''n', ' ') %]

这成功地删除了换行符,并将它们替换为<'br>(请原谅反斜杠,编辑器正在解释其他的br),但是它不起作用,然后页面中呈现了<'br>而不是换行符。

在这个阶段,我认为这样做的唯一方法是从bubbleDetails中搜索<'br>在floor .desc中,并用换行符替换它的任何出现,但是我想检查是否有人知道更好,更不笨拙的方法来做到这一点?

我以前从未使用过这个包,但是看看文档,这个看起来可能是你需要的:

http://template-toolkit.org/docs/manual/VMethods.html

向下滚动到dquote部分

也可以转义双引号,这可能很好

有处理JSON转换的TT插件,这是你有效的,如果没有显式地做。如果可能的话,应该尽量避免代码生成——让插件去操心这些晦涩难懂的问题。

我喜欢JSON::Escape,你可以这样执行:

[% USE JSON::Escape; %]
<script>
    $(function(){ 
    var floot = [% floot.json %];
    floot.history = []; // might not even be necessary?
    };
            /* unrelated stuff */
            /* set click event to display the floot details in an overlay */
    $('#' + floot.id).children('.openDetails').click(function() { 
        bubbleDetails(floot, user);
    });
</script>

这个相关的问题和答案也可能有用。

如果您这样做,错误仍然发生,那么正如@agreco所说,它一定是bubbleDetails()函数中的问题。