Mustache.js: Mengembalikan nama variabel template

Dibuat pada 31 Des 2015  ·  12Komentar  ·  Sumber: janl/mustache.js

Hai! Ini adalah permintaan yang agak aneh tetapi apakah ada cara untuk mengembalikan daftar variabel input sebagai array string atau sebagai objek? Untuk fungsi pembuatan kode dalam kode saya, saya perlu memetakan serangkaian input ke dalam
string bermotif kumis. Variabel input diberi nama persis sama dengan variabel templating dan akan membayangi/memetakan mereka dengan sempurna dan karena ini perlu dilakukan secara otomatis, maka permintaan aneh. Berikut ini contoh yang saya maksud:

Dengan asumsi fungsi 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}})

Saya telah memikirkan ini selama lebih dari satu jam dan saya masih tidak dapat menemukan cara yang lebih baik untuk melakukan ini. Akan sangat berterima kasih jika Anda dapat menawarkan beberapa metode alternatif, dll.

Komentar yang paling membantu

Solusi sederhana untuk mendapatkan level teratas saja:

Mustache.parse(template).filter(function(v) { return v[0] === 'name' || v[0] === '#' || v[0] === '&' } ).peta(fungsi(v) { kembali v[1]; });

Semua 12 komentar

Jika saya memahami Anda dengan benar, Anda menginginkan sesuatu seperti ini

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

Itu dengan asumsi VariableNames pergi dan mengembalikan semua nama variabel dari template. Jika itu yang Anda inginkan maka Anda mungkin dapat meretas implementasi menggunakan fungsi parse yang terbuka pada penulis kumis.

Berikut beberapa kode untuk Anda mulai:

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"]

Perhatikan bahwa meskipun mungkin untuk mengimplementasikan versi naif ini, tidak ada cara untuk mengekstrak semua nama tag dengan jelas, karena hal-hal seperti ini:

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

… bisa berarti {foo: {bar: 'baz'}} _or_ {foo: true, bar: 'baz'}} .

@bobthecow sepenuhnya benar dalam situasi ini. Contoh yang saya berikan hanya akan mengeluarkan semua simpul pengenal, itu juga akan menghapus semua struktur yang secara efektif meratakan pohon.

@Romanx @bobthecow terima kasih atas bantuan Anda!

Tidak masalah. Semoga beruntung :)

Saya memiliki permintaan serupa, tetapi perlu melintasi pohon untuk menemukan semua nama variabel. Saya pikir saya akan membagikan solusi yang saya gunakan jika ada yang membutuhkan referensi.

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 apakah ini juga mengalami masalah ambiguitas?

Ya. Itu melekat dalam spesifikasi bahasa.

Masalah ambiguitas menarik, dokumen menyebutkan bahwa ia akan mencoba menemukan nilai dalam konteks ini dan kemudian mencari konteks induk jika tidak ada nilai yang ditemukan. Sedikit investigasi membawa saya ke dalam ini:

{{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

Contohnya sangat dibuat-buat, dan ada banyak trik yang digunakan untuk tetap ringkas, tetapi itu harus menunjukkan betapa sulitnya saya menemukan kembali roda. Bersulang

@Immortalin Bisakah Anda menguraikan/memberikan definisi masalah yang lebih baik? Apa yang terjadi dengan properti yang bersarang di objek? Bisakah Anda memberikan input dan output yang lebih lengkap?

@dasilvacontin proyek yang membutuhkan fitur ini sedang hiatus jadi saya akan menutup ini untuk sementara waktu

Solusi sederhana untuk mendapatkan level teratas saja:

Mustache.parse(template).filter(function(v) { return v[0] === 'name' || v[0] === '#' || v[0] === '&' } ).peta(fungsi(v) { kembali v[1]; });

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

kuldeepdhaka picture kuldeepdhaka  ·  9Komentar

funston picture funston  ·  7Komentar

chlab picture chlab  ·  11Komentar

rlightner picture rlightner  ·  7Komentar

barbalex picture barbalex  ·  5Komentar