2013-01-10 34 views
2

我搜索了四周,我找不到一個真正有效的。下劃線模板_.templateSettings的正確鬍鬚模板配置是什麼?

在小鬍子裏,當你拋出2個捲曲的時候,裏面的字符串將被轉義,而如果你拋出3個字符,它就不會。

// when you pass {foo: '"bar"'} as hash, the following template will be: 
{{foo}} // => "bar" 
{{{foo}}} // => "bar" 

對不對?所以我創建了以下內容。

http://jsfiddle.net/beatak/6s5PU/

這說明內插和相對逸出,這意味着2捲曲爲未轉義3逃脫。當我在escapeinterpolate之間翻轉_.templateSettings時,它不起作用。爲什麼?下劃線模板優先於那三個(escape,interpolateevaluate)?

我知道我無視的jsfiddle evaluate現在,如果一起工作,那將是非常美妙的,但現在,我想使2件3捲曲的作品就好了... ...

+0

你在'underscore.js:1151'中得到'Uncaught SyntaxError:Unexpected token]'。可能是一個bug;一個JavaScript字符串被連接起來並試圖被評估。 ([在此部分](http://underscorejs.org/docs/underscore.html#section-133)) –

回答

2

逃生的正則表達式是搜索,然後插值,然後評估。這就是爲什麼您的轉義表格{{ }}在您的非轉義表格{{{ }}}之前匹配。您可以在_.template的來源中自行更改訂單。

var matcher = new RegExp([ 
    (settings.escape || noMatch).source, 
    (settings.interpolate || noMatch).source, 
    (settings.evaluate || noMatch).source 
].join('|') + '|$', 'g'); 

更改上面幾行的順序將改變優先級。

如果您不想更改下劃線優先級,則可以使用更復雜的轉義正則表達式。這是棘手沒有負面向後看的事,但我想出了:

/\{\{([^\{\}]+?)(?!\}\}\})\}\}/ 

這應該是指:{{,後面跟着一個或多個非支柱字符,不得跟着三重括號( }}}),然後是雙支撐}}。它在你的小提琴上工作,希望能爲你工作。

+0

這樣的工作。真棒! – beatak

+0

更新小提琴:http://jsfiddle.net/beatak/6s5PU/5/ – beatak