2013-01-10 3 views
2

나는 주위를 수색했는데 실제로 작동하는 것을 찾을 수 없었다.underscore.template의 _.templateSettings에 올바른 콧수염 템플리트 구성은 무엇입니까?

콧수염에 2 개의 곱슬을 던지면 안쪽의 문자열이 이스케이프되고, 3을 던진다면 안됩니다.

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

오른쪽? 그래서 나는 다음과 같이 창조했다.

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

이 탈출을위한 이스케이프 3 2 둥근 의미 보간 반대 탈출 나타낸다. escapeinterpolate 사이를 뒤집을 때 _.templateSettings이 작동하지 않습니다. 왜? 밑줄 템플릿은 그 세 가지보다 우선합니다 (escape, interpolateevaluate)?

나는 그 환상적 수 있습니다 함께 작동하는 경우 내가 지금 jsfiddle에 evaluate을 무시하고있어 알고 있지만, 지금은 내가 2 개, 3 곱슬 작품을 잘 만들고 싶어 ...

+0

'uncatcore.js : 1151'에서'Uncaught SyntaxError : Unexpected token '을 받았습니다. 아마 버그. 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

fiddle 업데이트 : http://jsfiddle.net/beatak/6s5PU/5/ – beatak

관련 문제