Mustache.js: ν…œν”Œλ¦Ώ λ³€μˆ˜ 이름 λ°˜ν™˜

에 λ§Œλ“  2015λ…„ 12μ›” 31일  Β·  12μ½”λ©˜νŠΈ  Β·  좜처: janl/mustache.js

μ•ˆλ…•! 이것은 λ‹€μ†Œ μ΄μƒν•œ μš”μ²­μ΄μ§€λ§Œ μ–΄μ¨Œλ“  μž…λ ₯ λ³€μˆ˜ λͺ©λ‘μ„ λ¬Έμžμ—΄ λ°°μ—΄μ΄λ‚˜ 객체둜 λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? λ‚΄ μ½”λ“œμ˜ μ½”λ“œ 생성 κΈ°λŠ₯을 μœ„ν•΄ 일련의 μž…λ ₯을 λ‹€μŒμœΌλ‘œ 맀핑해야 ν•©λ‹ˆλ‹€.
μ½§μˆ˜μ—Ό ν…œν”Œλ¦Ώ λ¬Έμžμ—΄. μž…λ ₯ λ³€μˆ˜μ˜ 이름은 ν…œν”Œλ¦Ώ λ³€μˆ˜μ™€ μ •ν™•νžˆ λ™μΌν•˜λ©° μ™„λ²½ν•˜κ²Œ 그림자/λ§€ν•‘λ©λ‹ˆλ‹€. μ΄λŠ” μžλ™μœΌλ‘œ μˆ˜ν–‰λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ μ΄μƒν•œ μš”μ²­μ΄ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. λ‚΄κ°€ μ˜λ―Έν•˜λŠ” λ°”μ˜ μ˜ˆλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

Mustache.getTemplateVariablesListAsObject ν•¨μˆ˜ κ°€μ •

var pycode = <see below>
Blockly.JavaScript['math_foo'] = function(block) {
  var value_name = Blockly.JavaScript.valueToCode(block, 'NAME', Blockly.JavaScript.ORDER_ATOMIC);
// result would be something like: {value_name: value_name}
var inputList =  Mustache.getTemplateVariablesListAsObject(pycode)

  var code = Mustache.render(pycode,  inputList)
  return code;
};
def hello(foo):
  print foo
hello({{value_name}})

λ‚˜λŠ” ν•œ μ‹œκ°„ 이상 이것에 λŒ€ν•΄ 생각해 μ™”μ§€λ§Œ μ—¬μ „νžˆ 이것을 ν•˜λŠ” 더 쒋은 방법을 찾을 수 μ—†μŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ 방법 등을 μ•Œλ €μ£Όμ‹œλ©΄ 정말 κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ΅œμƒμœ„ 레벨만 얻을 수 μžˆλŠ” κ°„λ‹¨ν•œ μ†”λ£¨μ…˜:

Mustache.parse(ν…œν”Œλ¦Ώ).filter(function(v) { return v[0] === '이름' || v[0] === '#' || v[0] === '&' } ).map(ν•¨μˆ˜(v) { v[1] λ°˜ν™˜; });

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

λ‚΄κ°€ 당신을 μ˜¬λ°”λ₯΄κ²Œ μ΄ν•΄ν•˜κ³  μžˆλ‹€λ©΄ 당신은 이와 같은 것을 μ›ν•©λ‹ˆλ‹€

var myTemplate = "{{foo}} is {{bar}}";
var variableNames = Mustache.VariableNames(myTemplate) // ['foo', 'bar']

VariableNames 이 ν…œν”Œλ¦Ώμ—μ„œ λͺ¨λ“  λ³€μˆ˜ 이름을 λ°˜ν™˜ν–ˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€. 그것이 당신이 μ›ν•˜λŠ” 것이라면 μ½§μˆ˜μ—Ό μž‘μ„±κΈ°μ—μ„œ λ…ΈμΆœλœ parse ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„μ„ ν•΄ν‚Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ μ‹œμž‘ν•˜λŠ” 데 도움이 λ˜λŠ” λͺ‡ 가지 μ½”λ“œμž…λ‹ˆλ‹€.

var results = Mustache.parse('{{foo}} is {{bar}}')
                       .filter(function(v) { return v[0] === 'name' })
                       .map(function(v) { return v[1]; });

console.log(results) // ["foo", "bar"]

μ΄κ²ƒμ˜ μˆœμ§„ν•œ 버전을 κ΅¬ν˜„ν•  μˆ˜λŠ” μžˆμ§€λ§Œ λ‹€μŒκ³Ό 같은 이유둜 λͺ¨λ“  νƒœκ·Έ 이름을 λͺ…ν™•ν•˜κ²Œ μΆ”μΆœν•˜λŠ” 방법은 μ—†μŠ΅λ‹ˆλ‹€.

{{# foo }}
  * {{ bar }}
{{/ foo }}

... {foo: {bar: 'baz'}} _λ˜λŠ”_ {foo: true, bar: 'baz'}} λ₯Ό μ˜λ―Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@bobthecow λŠ” 이 μƒν™©μ—μ„œ μ „μ μœΌλ‘œ μ˜³μŠ΅λ‹ˆλ‹€. λ‚΄κ°€ μ œκ³΅ν•œ μ˜ˆμ œλŠ” λͺ¨λ“  μ‹λ³„μž λ…Έλ“œλ§Œ κΊΌλ‚΄κ³  트리λ₯Ό 효과적으둜 ν‰λ©΄ν™”ν•˜λŠ” λͺ¨λ“  ꡬ쑰도 μ œκ±°ν•©λ‹ˆλ‹€.

@Romanx @bobthecow λ„μ™€μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

문제 μ—†μ–΄μš”. ν–‰μš΄μ„ λΉ•λ‹ˆλ‹€ :)

λΉ„μŠ·ν•œ μš”μ²­μ΄ μžˆμ—ˆμ§€λ§Œ λͺ¨λ“  λ³€μˆ˜ 이름을 μ°ΎκΈ° μœ„ν•΄ 트리λ₯Ό 탐색해야 ν–ˆμŠ΅λ‹ˆλ‹€. λˆ„κ΅°κ°€ μ°Έμ‘°κ°€ ν•„μš”ν•œ 경우 λ‚΄κ°€ μ‚¬μš©ν•œ μ†”λ£¨μ…˜μ„ κ³΅μœ ν•  것이라고 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

var parseTree = Mustache.parse('{{#foo}}{{bar}}{{/foo}} {{baz}}');
var variableList = parseTree.reduce(function flattenVariablesFromParseTree(acc, v){
                    if(v[0] === 'name'){
                      return acc.concat([v]);
                    } else if (v[0] === '#') {
                      return acc.concat(v[4].reduce(flattenVariablesFromParseTree, []));
                    } else {
                      return acc;
                    }
                  }, [])
                  .map(function(v){ return v[1]; });
//variableList: ["bar", "baz"]

@nicluo 이것도 λͺ¨ν˜Έμ„± 문제둜 고톡 λ°›κ³  μžˆμŠ΅λ‹ˆκΉŒ?

λ„€. 그것은 μ–Έμ–΄ 사양에 λ‚΄μž¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨ν˜Έμ„± λ¬Έμ œλŠ” ν₯λ―Έλ‘­μŠ΅λ‹ˆλ‹€. λ¬Έμ„œμ—μ„œλŠ” 이 μ»¨ν…μŠ€νŠΈμ—μ„œ 값을 찾으렀고 μ‹œλ„ν•œ λ‹€μŒ 값이 λ°œκ²¬λ˜μ§€ μ•ŠμœΌλ©΄ μƒμœ„ μ»¨ν…μŠ€νŠΈλ₯Ό κ²€μƒ‰ν•œλ‹€κ³  μ–ΈκΈ‰ν•©λ‹ˆλ‹€. μ•½κ°„μ˜ 쑰사λ₯Ό 톡해 λ‹€μŒκ³Ό 같은 사싀을 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

{{bar}} 
{{#foo}}
  {{bar}} 
  {{#foo}}
    {{bar}} 
    {{#baz}}
      {{no}} 
      {{yes}}
    {{/baz}}
  {{/foo}}
{{/foo}}

var renderString = '{{bar}} {{#foo}}{{bar}} {{#foo}}{{bar}} {{#baz}}{{no}} {{yes}}{{/baz}}{{/foo}}{{/foo}}';
var renderContext = new Mustache.Context({
  bar: 'bar',
  baz: {
    no: 'no'
  },
  foo: {
    bar: 'y',
    foo: {
      bar: 'z',
      yes: 'yes'
    }
  }});

var parseTree = Mustache.parse(renderString);
var variableRefList = [];
var variableNameList = parseTree.reduce(function flattenVariablesFromParseTree(acc, v){
                    // Skip non-name or non-# tags
                    if(v[0] !== 'name' && v[0] !== '#'){
                      return acc;
                    }

                    var paths = [v[1]].concat(this.parents.slice(0).map(function(e){
                      return [e, v[1]].join('.');
                    }));

                    // Pops available context until a value is found
                    var path;
                    while(path = paths.pop()){
                      if(renderContext.lookup(path)){
                        //push to advanced list
                        variableRefList.push(path);
                        contextFound = true;
                        break;
                      }
                    }

                    if(v[0] === 'name'){
                      return acc.concat([v]);
                    } else if (v[0] === '#')  {
                      if(typeof renderContext.lookup(path) === 'object'){
                        this.parents = this.parents.concat([path]);
                      }

                      return acc.concat(v[4].reduce(
                        flattenVariablesFromParseTree.bind({
                          parents: this.parents
                        }), []));
                    }
                  }.bind({parents: []}), [])
                  .map(function(v){ return v[1]; });

//variableNameList: ["bar", "bar", "bar", "no", "yes"]
//variableRefList: ["bar", "foo", "foo.bar", "foo.foo", "foo.foo.bar", "baz", "baz.no", "foo.foo.yes"]
//Mustache.render(renderString, renderContext): bar y z no yes

이 μ˜ˆμ œλŠ” 맀우 μΈμœ„μ μ΄κ³  간결함을 μœ μ§€ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” λ§Žμ€ 트릭이 μžˆμ§€λ§Œ 바퀴λ₯Ό 재발λͺ…ν•˜λŠ” 것이 μ–Όλ§ˆλ‚˜ μ–΄λ €μš΄μ§€ λ³΄μ—¬μ€˜μ•Ό ν•©λ‹ˆλ‹€. 건배

@Immortalin λ¬Έμ œμ— λŒ€ν•œ 더 λ‚˜μ€ μ •μ˜λ₯Ό μžμ„Ένžˆ μ„€λͺ…ν•˜κ±°λ‚˜ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? 객체에 μ€‘μ²©λœ 속성은 μ–΄λ–»κ²Œ λ©λ‹ˆκΉŒ? 더 μ™„μ „ν•œ μž…λ ₯ 및 좜λ ₯을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

@dasilvacontin 이 κΈ°λŠ₯을 ν•„μš”λ‘œ ν•˜λŠ” ν”„λ‘œμ νŠΈκ°€ ν˜„μž¬ μ€‘λ‹¨λ˜μ–΄ λ‹ΉλΆ„κ°„ 이 μž‘μ—…μ„ μ’…λ£Œν•©λ‹ˆλ‹€.

μ΅œμƒμœ„ 레벨만 얻을 수 μžˆλŠ” κ°„λ‹¨ν•œ μ†”λ£¨μ…˜:

Mustache.parse(ν…œν”Œλ¦Ώ).filter(function(v) { return v[0] === '이름' || v[0] === '#' || v[0] === '&' } ).map(ν•¨μˆ˜(v) { v[1] λ°˜ν™˜; });

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