μλ
! μ΄κ²μ λ€μ μ΄μν μμ²μ΄μ§λ§ μ΄μ¨λ μ
λ ₯ λ³μ λͺ©λ‘μ λ¬Έμμ΄ λ°°μ΄μ΄λ κ°μ²΄λ‘ λ°νν μ μμ΅λκΉ? λ΄ μ½λμ μ½λ μμ± κΈ°λ₯μ μν΄ μΌλ ¨μ μ
λ ₯μ λ€μμΌλ‘ 맀νν΄μΌ ν©λλ€.
콧μμΌ ν
νλ¦Ώ λ¬Έμμ΄. μ
λ ₯ λ³μμ μ΄λ¦μ ν
νλ¦Ώ λ³μμ μ νν λμΌνλ©° μλ²½νκ² κ·Έλ¦Όμ/맀νλ©λλ€. μ΄λ μλμΌλ‘ μνλμ΄μΌ νλ―λ‘ μ΄μν μμ²μ΄ μκΈ° λλ¬Έμ
λλ€. λ΄κ° μλ―Ένλ λ°μ μλ λ€μκ³Ό κ°μ΅λλ€.
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}})
λλ ν μκ° μ΄μ μ΄κ²μ λν΄ μκ°ν΄ μμ§λ§ μ¬μ ν μ΄κ²μ νλ λ μ’μ λ°©λ²μ μ°Ύμ μ μμ΅λλ€. λ€λ₯Έ λ°©λ² λ±μ μλ €μ£Όμλ©΄ μ λ§ κ°μ¬νκ² μ΅λλ€.
λ΄κ° λΉμ μ μ¬λ°λ₯΄κ² μ΄ν΄νκ³ μλ€λ©΄ λΉμ μ μ΄μ κ°μ κ²μ μν©λλ€
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] λ°ν; });
κ°μ₯ μ μ©ν λκΈ
μ΅μμ λ λ²¨λ§ μ»μ μ μλ κ°λ¨ν μ루μ :
Mustache.parse(ν νλ¦Ώ).filter(function(v) { return v[0] === 'μ΄λ¦' || v[0] === '#' || v[0] === '&' } ).map(ν¨μ(v) { v[1] λ°ν; });