Mustache.js: Mustache.parse()의 μ‚¬μš©μž 지정 ꡬ뢄 κΈ°ν˜Έκ°€ 2.3.1 이후 μž‘λ™ν•˜μ§€ μ•ŠμŒ

에 λ§Œλ“  2018λ…„ 08μ›” 09일  Β·  16μ½”λ©˜νŠΈ  Β·  좜처: janl/mustache.js

버전 2.3.1 이후 μ‚¬μš©μž μ •μ˜ ꡬ뢄 기호 λŠ” Mustache.parse() 에 λŒ€ν•΄ 더 이상 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€μŒ 예λ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

이것은 #663 및 ν•΄λ‹Ή μˆ˜μ • 사항과 관련이 μžˆμ„ κ°€λŠ₯성이 ν½λ‹ˆλ‹€. λŒ€μ‹  μƒˆλ‘œμš΄ Mustache.tags = [...] λ₯Ό μ‚¬μš©ν•˜μ—¬ 볡원할 수 μžˆμŠ΅λ‹ˆλ‹€. https://codepen.io/mbrodala/pen/QBJoOx

이것 μ’€ λ΄μ£Όμ‹œκ² μ–΄μš”?

λͺ¨λ“  16 λŒ“κΈ€

@mbrodala λ³΄κ³ μ„œμ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. ν•΄λ‹Ή μ½”λ“œνŽœμ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

@mbrodala codepens 에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.
여기에 μ˜€ν•΄κ°€ μžˆμ—ˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

643 및 #664λŠ” #617μ—μ„œ λ³΄κ³ ν•œ 버그λ₯Ό μˆ˜μ •ν•©λ‹ˆλ‹€. μ΄λŠ” #643κ³Ό ν•¨κ»˜ μ œκ³΅λ˜λŠ” 이 ν…ŒμŠ€νŠΈμ—μ„œ μ„€λͺ…ν•©λ‹ˆλ‹€.

  describe('when parsing a template with tags specified followed by the same template with different tags specified', function() {
     it('returns different tokens for the latter parse', function() {
       var template = "(foo)[bar]";
       var parsedWithParens = Mustache.parse(template, ['(', ')']);
       var parsedWithBrackets = Mustache.parse(template, ['[', ']']);
       assert.notDeepEqual(parsedWithBrackets, parsedWithParens);
     });
   });

parse ν•¨μˆ˜λŠ” μΊμ‹œ ν‚€λ‘œ template 만 μ‚¬μš©ν•˜μ—¬ μΊμ‹±ν•˜λ―€λ‘œ λ‹€μŒμ— parse λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή ν…œν”Œλ¦Ώμ„ ꡬ문 λΆ„μ„ν•˜λ©΄ μ •ν™•νžˆ λ™μΌν•œ 토큰을 λ°˜ν™˜ν•©λ‹ˆλ‹€. μ§€μ •λœ tags κ°€ λ‹€λ₯Έ 경우.

tags λŠ” 선택적 λ§€κ°œλ³€μˆ˜μ΄λ©° μƒλž΅ν•˜λ©΄ 기본적으둜 ['{{', '}}'] 인 mustache.tags 둜 λŒ€μ²΄λ©λ‹ˆλ‹€. λŒ€μ²΄ mustache.tags λŠ” μΊμ‹œ ν‚€μ˜ μΌλΆ€λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

버그 μˆ˜μ • 및 κΈ°λŒ€μΉ˜μ™€ κ΄€λ ¨ν•˜μ—¬ 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€ μ•Œκ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 이에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ³  codepen을 예둜 μ‚¬μš©ν•˜κ² μŠ΅λ‹ˆλ‹€.

v2.3.0

Mustache.parse(template, ['[[', ']]']);

2.3.0μ—μ„œ 이것은 ['[[', ']]'] λ₯Ό νƒœκ·Έλ‘œ μ‚¬μš©ν•˜μ—¬ $ template λ₯Ό ꡬ문 λΆ„μ„ν•˜λ„λ‘ Mustache에 μ§€μ‹œν•©λ‹ˆλ‹€. MustacheλŠ” κ·Έλ ‡κ²Œ ν•˜κ³  μ˜¬λ°”λ₯Έ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ template 만 μ‚¬μš©ν•˜μ—¬ ν˜ΈμΆœμ„ μΊμ‹œν•©λ‹ˆλ‹€. [email protected] 의 447-450ν–‰ μ°Έμ‘°:

    if (tokens == null)
       tokens = cache[template] = parseTemplate(template, tags);

codepen의 λ‹€μŒ ν˜ΈμΆœμ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

var output = Mustache.render(
  template,
...

render λŠ” tags λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ parse $ 에 λ§€κ°œλ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ render κ°€ 호좜될 λ•Œ $ parse λŠ” mustache.tags λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. render 호좜이 이루어지면 효과적으둜 parse " template λ₯Ό ꡬ문 λΆ„μ„ν•˜κ³  ['{{', '}}'] λ₯Ό tags 으둜 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. parse λŠ” μ‹€μ œλ‘œ 잘λͺ»λœ 일을 ν•˜κ³  tags 및 mustache.tags λͺ¨λ‘λ₯Ό μ™„μ „νžˆ λ¬΄μ‹œν•˜κ³  μΊμ‹œ 쑰회λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. [['[', ']']] 둜 ꡬ문 λΆ„μ„λœ ν…œν”Œλ¦Ώμ˜ κ²°κ³Ό λ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ ν•΄λ‹Ή template 에 λŒ€ν•œ 전체 ν”„λ‘œκ·Έλž¨μ—μ„œ parse 에 λŒ€ν•œ 첫 번째 호좜이 ['[[', ']']] 둜 μ΄λ£¨μ–΄μ‘ŒκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. tags .

v2.3.1

Mustache.parse(template, ['[[', ']]']);

ꡬ문 뢄석 κ²°κ³ΌλŠ” template 및 tags λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•˜μ—¬ μΊμ‹œλ©λ‹ˆλ‹€. ['[[', ']]'] λŠ” cacheKeyμž…λ‹ˆλ‹€.

λ‹€μŒ 호좜:

var output = Mustache.render(
  template,
...

render λŠ” parse $ λ₯Ό ν˜ΈμΆœν•˜κ³  $#$ template #$ λ₯Ό μ „λ‹¬ν•˜μ§€λ§Œ tags λŠ” μƒλž΅ν•©λ‹ˆλ‹€. λ”°λΌμ„œ parse μ—λŠ” tags κ°€ mustache.tags 둜 λŒ€μ²΄λ˜λ©°, μ΄λŠ” κΈ°λ³Έ ['{{', '}}'] 둜 μœ μ§€λ©λ‹ˆλ‹€. parse λŠ” template 및 ['{{', '}}'] 의 μΊμ‹œ 킀에 λŒ€ν•΄ μΊμ‹œ 쑰회λ₯Ό μˆ˜ν–‰ν•˜κ³  parse κ°€ 아직 ν˜ΈμΆœλ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μ˜ˆμƒλŒ€λ‘œ μΊμ‹œ λˆ„λ½μ΄ λ°œμƒν•©λ‹ˆλ‹€. template 및 νƒœκ·Έμ˜ μ‘°ν•©μœΌλ‘œ. λ”°λΌμ„œ ['{{', '}}'] $ λ₯Ό μ‚¬μš©ν•˜μ—¬ $ template λ₯Ό ꡬ문 λΆ„μ„ν•©λ‹ˆλ‹€.

λ‚˜λŠ” v2.3.1이 μ˜¬λ°”λ₯Έ λ™μž‘μ„ 보인닀고 λ―ΏμŠ΅λ‹ˆλ‹€. https://codepen.io/mbrodala/pen/QBJoOx μ—μ„œ codepen을 μ•½κ°„ λ³€κ²½ν•˜κ³  v2.3.0에 λŒ€ν•΄ μ‹€ν–‰ν•œλ‹€λ©΄:

var template = "[[item.title]] [[item.value]]";
Mustache.parse(template, ['[[', ']]']);
var output = Mustache.render(
  template,
  {
    item: {
      title: "TEST",
      value: 1
    }
  }
);
alert(output);

좜λ ₯은 μ˜ˆμƒν•˜μ§€ λͺ»ν•œ [[item.title]] [[item.value]] μž…λ‹ˆλ‹€.

Mustache.parse 및 Mustache.render 호좜이 μ„œλ‘œ λ°”λ‘œ μ˜†μ— 있고 ν•˜λ‚˜κ°€ 아닐 μˆ˜λ„ 있기 λ•Œλ¬Έμ— https://codepen.io/mbrodala/pen/NBEJjX 의 λ™μž‘μ΄ μ–Όλ§ˆλ‚˜ λ†€λΌμš΄μ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. Mustache.parse λŠ” tags μΈμˆ˜λ„ μ·¨ν•œλ‹€λŠ” 사싀을 κΉ¨λ‹«μŠ΅λ‹ˆλ‹€. ( Mustache.parse κ°€ tags 인수λ₯Ό μ·¨ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? mustache.js -- parse λ‚΄λΆ€μ μœΌλ‘œλŠ” 기본적으둜 mustache.tags 어디에도 μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ..)

ν–‰λ™μ˜ λ³€ν™”κ°€ μ‹€μ œλ‘œ bugfix 릴리슀의 κΈ°λŒ€λ₯Ό λ¬΄μ‹œν•œλ‹€λ©΄ 무엇을 ν•΄μ•Ό 할지 μ •ν™•νžˆ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. ν•œ 가지 κ°€λŠ₯성은 #664κ°€ λ˜λŒλ €μ§„ λ‹€λ₯Έ 버그 μˆ˜μ • 버전을 λ¦΄λ¦¬μŠ€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 버전은 사싀상 λͺ¨λ“  캐싱 λ™μž‘μ„ μ œκ±°ν•©λ‹ˆλ‹€(#643μ—μ„œ λͺ¨λ“  μΊμ‹œ μ‘°νšŒκ°€ λˆ„λ½λ¨). 그런 λ‹€μŒ #664λ₯Ό λ‹€μŒ μ£Όμš” κ°œμ •νŒμ— λ‹€μ‹œ 넣을 수 μžˆμŠ΅λ‹ˆλ‹€. 또 λ‹€λ₯Έ κ°€λŠ₯성은 bugfix λ¦΄λ¦¬μŠ€μ—μ„œ λͺ¨λ“  캐싱을 μ œκ±°ν•˜κ³ (λΉ„κΈ°λŠ₯적 μΊμ‹±μœΌλ‘œ mustache.js λ₯Ό λ¦΄λ¦¬μŠ€ν•˜λŠ” 것과 λ°˜λŒ€) λͺ¨λ“  캐싱을 λ‹€μŒ μ£Όμš” κ°œμ •νŒμ— λ‹€μ‹œ λ„£λŠ” κ²ƒμž…λ‹ˆλ‹€. μ „μžμ˜ μ˜΅μ…˜μ€ μœ„ν—˜μ΄ λœν•˜μ§€λ§Œ(μ½”λ“œ 변경이 κ°€μž₯ 적음) ν›„μžμ˜ μ˜΅μ…˜μ΄ 더 "μ˜¬λ°”λ¦…λ‹ˆλ‹€". @phillipj 생각?

λ‚΄ POVμ—μ„œ μ™„μ „νžˆ μ΄ν•΄λ˜λŠ” μžμ„Έν•œ 연ꡬ에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

λ³€κ²½ 사항에 λŒ€ν•΄ μ „ν˜€ μ‹ κ²½ 쓰지 μ•Šμ§€λ§Œ μΊμ‹œ 적쀑을 보μž₯ν•˜κΈ° μœ„ν•΄ tags λ₯Ό Mustache.render() 에 μ „λ‹¬ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ν•˜κ³  Mustache.parse() κ°€ template λ₯Ό μΊμ‹œν•˜λ„λ‘ κ΄‘κ³ λœλ‹€λŠ” 점을 κ°μ•ˆν•  λ•Œ tags 에 λŒ€ν•œ μ–ΈκΈ‰ μ—†μŒ) 이것이 μ •λ§λ‘œ λ˜λŒλ €μ Έμ•Ό ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

tags Mustache.parse λ₯Ό ν˜ΈμΆœν•œλ‹€κ³  κ°€μ •ν•˜λ©΄ template κ°€ μ΄λŸ¬ν•œ ꡬ뢄 기호λ₯Ό μ‚¬μš©ν•œλ‹€κ³  κ°€μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€(BTW, "νƒœκ·Έ" λŒ€ "κ΅¬λΆ„μž"λŠ” μ—­μ‹œ 클리어). κ·Έ λ‹€μŒμ— μš°λ¦¬λŠ” 주어진 template κ°€ 이미 μΊμ‹œλ˜μ—ˆλŠ”μ§€ 여뢀와 κ·ΈλŸ¬ν•œ 경우 컴파일된 방법에 상관없이 Mustache.render 에 λŒ€ν•œ 호좜이 μž‘λ™ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒλœλ‹€κ³  κ°€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ§€κΈˆμ€ μ‚¬μš©μž μ •μ˜ tags κ°€ μ‚¬μš©λ˜λŠ” 경우 보μž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@mbrodala λ„€, λ§žμŠ΅λ‹ˆλ‹€. Mustache.parse(template, ['[[', ']]']); λ‹€μŒμ— Mustache.parse(template, ['((', '))']); κ°€ λ’€λ”°λ₯΄λ©΄ μ •ν™•νžˆ 같은 κ²°κ³Όκ°€ λ‚˜μ˜€λŠ” 것은 μ—¬μ „νžˆ β€‹β€‹μ˜ˆμƒμΉ˜ λͺ»ν•œ μΌμž…λ‹ˆλ‹€.

λ‹€μŒμ€ λ°€μ§šλ§¨ μ†”λ£¨μ…˜/νƒ€ν˜‘μž…λ‹ˆλ‹€("λ°€μ§šλ§¨"은 λ§ˆμŒμ— 듀지 μ•Šμ§€λ§Œ λΈŒλ ˆμΈμŠ€ν† λ°ν•  κ°€μΉ˜κ°€ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€). template 단독 및 νƒœκ·Έ 포함 template λͺ¨λ‘μ— λŒ€ν•΄ parse μΊμ‹œλ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. parse κ°€ μ§€μ •λœ tags 둜 호좜되면 $ template 및 tags 에 λŒ€ν•΄ 쑰회λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. tags parse λ₯Ό ν˜ΈμΆœν•˜λŠ” render λ₯Ό ν˜ΈμΆœν•˜λ©΄ template 만 μ‘°νšŒν•©λ‹ˆλ‹€. 생각?

μ†Œλ¦¬κ°€ 듀리지 μ•Šκ³  기본적으둜 μˆ˜μ • 사항을 κ·ΈλŒ€λ‘œ μœ μ§€ν•˜λ©΄μ„œμ΄ 문제λ₯Ό ν•΄κ²°ν•  κ²ƒμž…λ‹ˆλ‹€. λ‚΄ POVμ—μ„œ ν™•μΈν•©λ‹ˆλ‹€.

@mbrodala λŠ” tags 을 render 에 전달할 수 μ—†λ‹€λŠ” 핡심 λ¬Έμ œμž…λ‹ˆκΉŒ? tags λ§€κ°œλ³€μˆ˜λ₯Ό render 에 μΆ”κ°€ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

@petrkoutnysw 이것도 λŒ€λž΅μ μœΌλ‘œ κ²ͺμ—ˆλ˜ λ¬Έμ œμΈκ°€μš”?

적어도 parse() 와 render() μ‚¬μ΄μ˜ λΆˆμΌμΉ˜μž…λ‹ˆλ‹€. μ‹€μ œλ‘œ render() 에 μ‚¬μš©μž μ •μ˜ νƒœκ·Έλ₯Ό 전달할 수 μžˆλ‹€λ©΄ parse() 도 μ‚¬μš©ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. 이제 μ μ ˆν•œ 캐싱이 이루어지면 이것이 λ”μš± λΆ„λͺ…ν•΄μ§‘λ‹ˆλ‹€.

λ§Žμ€ ν˜Όλž€μ„ μ—†μ• κΈ° μœ„ν•΄ νƒœκ·Έ λ§€κ°œλ³€μˆ˜λ₯Ό render()에 μΆ”κ°€ν•˜λŠ” 데 +1 -- μš°λ¦¬λŠ” 이 λ³€κ²½ 사항에도 μ•½κ°„μ˜ 영ν–₯을 λ°›μ•˜κ³  링크 b/w ꡬ문 뢄석 및 λ Œλ”λ§μ€ 항상 ν•„μš”ν•œ 것보닀 μ•½κ°„ 더 마술처럼 λ³΄μ˜€μŠ΅λ‹ˆλ‹€.

자, κ·Έλ ‡λ‹€λ©΄ 버그 μˆ˜μ • λ¦΄λ¦¬μŠ€μ—μ„œ 캐싱을 λΉ„ν™œμ„±ν™”ν•˜μ—¬ 즉각적인 문제λ₯Ό μˆ˜μ •ν•˜κ³  의미둠적 버전 관리λ₯Ό μ€€μˆ˜ν•˜κ³  λ‹€μŒ μ£Όμš” λ¦΄λ¦¬μŠ€μ—μ„œ tags와 tags λ₯Ό render λ©”μ„œλ“œμ— λ‹€μ‹œ λ„μž…ν•˜λŠ” 것은 μ–΄λ–»μŠ΅λ‹ˆκΉŒ? (λ‹€μ‹œ λ§ν•˜μ§€λ§Œ, λ‚˜λŠ” λ‚΄κ°€ μ œμ•ˆν•œ λ°€μ§šλ§¨ μ†”λ£¨μ…˜μ˜ μ—΄λ ¬ν•œ 팬이 μ•„λ‹™λ‹ˆλ‹€.)

μ² μ €ν•œ μ—°μŠ΅ @raymond-lam에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

μ €λŠ” μ œμ•ˆλœ 버그 μˆ˜μ • λ¦΄λ¦¬μŠ€μ— κΈ°λŒ€κ³  μžˆμŠ΅λ‹ˆλ‹€. 주둜 semver λ¬Έμ œμ™€ μ΄λŸ¬ν•œ λ™μž‘ 변경이 μ˜ˆμƒν•˜μ§€ λͺ»ν•˜μ—¬ ν”„λ‘œμ νŠΈμ— ν˜Όλž€μ„ μ΄ˆλž˜ν•  수 μžˆλŠ” ν”„λ‘œμ νŠΈ λ•Œλ¬Έμž…λ‹ˆλ‹€.

κ³„νšλœ λ‹€μŒ μ£Όμš” λ¦΄λ¦¬μŠ€μ—μ„œ 캐싱 λ™μž‘μ„ λ‹€μ‹œ λ„μž…ν•˜μ—¬ 릴리슀 정보에 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 지침을 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

@phillipj #643 및 #664λ₯Ό λ‘€λ°±ν•˜λŠ” pull request #670을 λ°œν–‰ν–ˆμŠ΅λ‹ˆλ‹€. 캐싱을 λͺ¨λ‘ λΉ„ν™œμ„±ν™”ν•˜λŠ” λŒ€μ‹  μœ„ν—˜ μ™„ν™”λ₯Ό μœ„ν•΄ λ‹¨μˆœνžˆ v2.3.0 λ™μž‘(버그 μˆ˜μ • λ¦΄λ¦¬μŠ€μ—μ„œ)으둜 λŒμ•„κ°€λŠ” 것이 Mustache v2.xx에 μ’…μ†λœ μ‚¬λžŒλ“€μ—κ²Œ κ°€μž₯ μ•ˆμ „ν•œ κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. μ£Όμš” λ¦΄λ¦¬μŠ€μ—μ„œ λ‹€μ‹œ λ„μž…ν•˜κΈ° μœ„ν•΄ 또 λ‹€λ₯Έ ν’€ λ¦¬ν€˜μŠ€νŠΈλ₯Ό λ°œν–‰ν•˜κ² μŠ΅λ‹ˆλ‹€.

@phillipj #671은 μ£Όμš” 릴리슀λ₯Ό 기닀리기 μœ„ν•΄ 캐싱 μˆ˜μ • 사항을 λ‹€μ‹œ λ„μž…ν•©λ‹ˆλ‹€.

tags λ₯Ό `render.xml에 μΆ”κ°€ν•˜λŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 문제 #672λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

이 문제λ₯Ό μ‘°μ‚¬ν•˜κ³  μˆ˜μ •ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. πŸ‘

@raymond-lamμ—κ²Œ κ°μ‚¬μ˜ 인사λ₯Ό μ „ν•©λ‹ˆλ‹€! μ—¬λŸ¬λΆ„ 덕뢄에 μ˜ˆμƒμΉ˜ λͺ»ν•œ λ³€ν™”κ°€ μ–Έμ œ λ°œμƒν–ˆλŠ”μ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

v2.3.2 κ°€ μΆœμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€ πŸš€

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

kuldeepdhaka picture kuldeepdhaka  Β·  9μ½”λ©˜νŠΈ

SmasherHell picture SmasherHell  Β·  18μ½”λ©˜νŠΈ

zekth picture zekth  Β·  18μ½”λ©˜νŠΈ

chlab picture chlab  Β·  11μ½”λ©˜νŠΈ

funston picture funston  Β·  7μ½”λ©˜νŠΈ