Mustache.js: إرجاع أسماء متغيرات القالب

تم إنشاؤها على ٣١ ديسمبر ٢٠١٥  ·  12تعليقات  ·  مصدر: janl/mustache.js

أهلا! هذا طلب غريب إلى حد ما ولكن هل هناك على أي حال لإعادة قائمة متغيرات الإدخال كمصفوفة من سلسلة أو ككائن؟ بالنسبة لوظيفة إنشاء الكود في الكود الخاص بي ، أحتاج إلى تعيين سلسلة من المدخلات في
سلسلة ذات قالب شارب. يتم تسمية متغيرات الإدخال تمامًا مثل متغيرات القوالب وستظل / تعينها بشكل مثالي ولأن هذا يجب أن يتم تلقائيًا ، ومن هنا طلب غريب. هذا مثال على ما أعنيه:

افتراض دالة Moustache.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}})

لقد كنت أفكر في هذا لأكثر من ساعة وما زلت لا أجد طريقة أفضل للقيام بذلك. سأكون ممتنًا حقًا إذا كان بإمكانك تقديم بعض الطرق البديلة وما إلى ذلك.

التعليق الأكثر فائدة

حل بسيط للحصول على المستوى الأعلى فقط:

Moustache.parse (template) .filter (function (v) {return v [0] === 'name' || v [0] === '#' || v [0] === '&'} ) .map (function (v) {return 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 محق تمامًا في هذا الظرف. المثال الذي قدمته لن يسحب سوى جميع عقد التعريف ، كما أنه سيزيل كل الهياكل التي تؤدي إلى تسطيح الشجرة بشكل فعال.

Romanxbobthecow شكرا لمساعدتك!

لا مشكلة. حظ سعيد :)

كان لدي طلب مماثل ، لكنني كنت بحاجة إلى اجتياز الشجرة للعثور على جميع أسماء المتغيرات. اعتقدت أنني سأشارك الحل الذي استخدمته إذا احتاج أي شخص إلى مرجع.

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 ، المشروع الذي يتطلب هذه الميزة متوقف حاليًا ، لذا سأغلق هذا في الوقت الحالي

حل بسيط للحصول على المستوى الأعلى فقط:

Moustache.parse (template) .filter (function (v) {return v [0] === 'name' || v [0] === '#' || v [0] === '&'} ) .map (function (v) {return v [1]؛})؛

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

rlightner picture rlightner  ·  7تعليقات

funston picture funston  ·  7تعليقات

SmasherHell picture SmasherHell  ·  18تعليقات

ForbesLindesay picture ForbesLindesay  ·  14تعليقات

chlab picture chlab  ·  11تعليقات