var Template = Class.create({
/ /초기화 방법
초기화: 함수(템플릿, 패턴) {
this.template = template.toString();
this.pattern = 패턴
},
//Formating 메소드는 Java 관점에서 실제로 format이라고 부르는 것이 더 좋습니다 :)
evaluate: function(object) {
//toTemplateReplacements 메소드가 정의되어 있는지 확인하고, 정의되어 있으면 / /전체 Prototype 프레임워크에서는 Hash 객체만이 이 메서드를 정의합니다.
if (object && Object.isFunction(object.toTemplateReplacements))
object = object.toTemplateReplacements()
//여기서 gsub는 String 객체의 메서드입니다. 패턴과 일치하는 문자열의 모든 부분을 바꾸는 것으로 간단히 생각할 수 있습니다.
return this.template.gsub(this.pattern, function(match) {
//match[0 ]은 Template.Pattern과 일치하는 전체 문자열입니다.
//match[1]은 일치하는 문자열 앞의 문자입니다.
//match[2]는 $ 표현식과 일치하는 부분입니다. {var}
//match[3]은 '#{var}' 표현식의 'var' 부분입니다.
//객체가 null인 경우 모든 ${var} 표현식을 ''로 바꿉니다.
if (object == null) return (match[1] '');
//일치하는 표현식 앞의 문자를 가져옵니다.
var before = match[1] ||
//이전 문자열이 ''인 경우 대체 없이 일치하는 표현식을 직접 반환합니다.
if (before == '\') return match[2]
var ctx = object, expr; = match[3];
//이 정규식은 var가 합법적인 이름인지 확인하기 위한 것 같습니다. 아직 이 정규식의 의미를 이해할 수 없나요?
var 패턴 = /^([^.[] |[((?:.*?[^\])?)])(.|[|$)/
match = 패턴.exec( expr);
//var가 요구 사항을 충족하지 않으면 이전 문자를 직접 반환합니다.
if (match == null) return
//'#{var}' 표현식 부분 1을 바꿉니다. 하나씩
while(match != null) {
// 다음 확인이 무엇을 의미하는지 이해하지 못하시나요?
var comp = match[1].startsWith('[') match[2] .gsub('\ \]', ']') : match[1];
ctx = ctx[comp]
if (null == ctx || '' == match[3]) ;
expr = expr.substring('[' == match[3] ? match[1].length : match[0].length)
match = 패턴.exec(expr); }
/ /대체된 결과 반환, '#{var}' ==> 'value'
String.interpret(ctx) 이전 반환
}
} );
//기본 템플릿은 JSP
Template.Pattern = /(^|.|r|n)(#{의 EL 표현식과 유사하게 #{var} 형식의 정규 표현식과 일치합니다. (.*? )})/;
위에서는 평가 방법에 대해 기본적으로 설명했지만, 일부 정규식은 이해하기가 너무 어렵습니다. . . 누가 알고 알려 주나요?
아래 예시를 보세요.
코드를 복사하세요
코드는 다음과 같습니다.var myTemplate = new Template('TV 쇼 #{title}은 #{author}에 의해 제작되었습니다.')
var show = {title: 'The Simpsons', 저자: 'Matt Groening', 네트워크: 'FOX' };
myTemplate.evaluate(show)
// -> The Simpsons는
코드 복사
코드는 다음과 같습니다.var t = new Template('in #{lang } 또한 템플릿에는 \#{ 변수} 구문을 사용합니다.')
var data = {lang:'Ruby', Variable: '(사용되지 않음)'}
// -> Ruby에서는 템플릿에 #{variable} 구문도 사용합니다.
var 구문 = /(^|.|r|n)(<%=s*(w )s*% >)/;
//'<%= 필드 %>'와 일치합니다.
var t = new Template('
이름: <%= 이름 %>, 연령: <%=age%>
', 구문)
t.evaluate( { 이름: 'John Smith', 나이: 26 } )
// ->
이름:
John Smith, 나이:
26 ;/div>
var Conversion1 = {from: 'meters' , to: '피트', 인자: 3.28};
var Conversion2 = {from: '킬로줄', to: 'BTU', 인수: 0.9478};
var Conversion3 = {from: '메가바이트', to: '기가바이트', 인수: 1024};
var templ = new Template('#{from}에서 #{to}로 변환하려면 #{factor}를 곱하세요.');
[변환1, 변환2, 변환3].each( function(conv){ templ.evaluate(conv); });
// -> 미터를 피트로 변환하려면 3.28을 곱하세요.
// -> 킬로줄을 BTU로 변환하려면 0.9478을 곱하세요.
// -> 메가바이트를 기가바이트로 변환하려면 1024를 곱하세요.