2

Ruby Mustache APIには、テンプレートからキー名を返す方法がありますか?

たとえば、次のようにします。

require 'mustache'
m = Mustache.new
m.template = "Hello {{first_name}} {{last_name}}"

キー名を返すAPI呼び出しを行いたいのですが、それが何であるかはわかりません。

[:first_name, :last_name]

または同様のもの。

4

5 に答える 5

2

偶然にも、私はこれをしました。

IIRCで必要なのは、tokens次のようなメソッドを実装することだけでした。

class Mustache::Template
  def tokens(src = @source)
    p = ::Mustache::Parser.new
    p.otag = PMustache::DEFAULT_MUSTACHE_OTAG
    p.ctag = PMustache::DEFAULT_MUSTACHE_CTAG
    p.compile(src)
  end
end

(は無視できPMustache::DEFAULT_MUSTACHE_xTAGます。デフォルトの区切り文字を設定するためのものです。)

次のようなテンプレートをフィードします。

[1] pry(main)> require 'pmustache'
=> true
[2] pry(main)> f = Mustache.new
=> #<Mustache:0x007fce2192b520>
[3] pry(main)> f.template = "this is {{a}} test"
=> "this is {{a}} test"

トークンへのアクセスを許可します。

[5] pry(main)> f.template.tokens
=> [:multi,
 [:static, "this is "],
 [:mustache, :etag, [:mustache, :fetch, ["a"]]],
 [:static, " test"]]

:mustacheそこから、基本的にタグが必要だと思います。

[6] pry(main)> p_toks = lambda { |tok| (tok.instance_of? Array) && (tok[0] == :mustache) }      
=> #<Proc:0x007fce228b0b08@(pry):6 (lambda)>
[7] pry(main)> f.template.tokens.find_all(&p_toks)      
=> [[:mustache, :etag, [:mustache, :fetch, ["a"]]]]

そこには他にもハッカーがいました。ドットで区切られたテンプレート変数をユーザーインターフェイスに表示して(おそらく、多かれ少なかれあなたがしていること)、機能ごとにグループ化し、JSONオブジェクトからロードできるようにしました。

特定のトークンタイプのみが必要な場合があります。コンパイルされたテンプレートからトークンを引き出すのは簡単なので、テンプレートをいくつか投げると、何をする必要があるかがわかります。

于 2012-06-06T19:48:17.140 に答える
1

特にそれを行う方法はありませんが、最初に次のことを検討してください。

>> pp Mustache::Template.new('Hello {{first_name}} {{person.last_name}}').tokens
[:multi,
 [:static, "Hello "],
 [:mustache, :etag, [:mustache, :fetch, ["first_name"]]],
 [:static, " "],
 [:mustache, :etag, [:mustache, :fetch, ["person", "last_name"]]]]

関連するキーを抽出するトラバーサルを作成するのはかなり簡単なはずです。

于 2012-06-14T20:17:57.653 に答える
1

使用するMustache::Template#tags

>> Mustache::Template.new('Hello {{first_name} {{last_name}}').tags
[
    [0] "first_name",
    [1] "last_name"
]
于 2016-12-27T16:22:22.677 に答える
0

このようなものは、単純なキー名しかない場合は正常に機能するように見えます。

tokens = Mustache::Template.new('Hello {{first_name}} {{person.last_name}}').tokens
pp tokens.find_all{|token| token.is_a?(Array) && token[0] == :mustache }.map{|token| token[2][2]}

あなたの正確な欲求のために、あなたは次のようなものを必要とするかもしれません:

pp tokens.find_all{|token| token.is_a?(Array) && token[0] == :mustache }.map{|token| token[2][2].last.to_sym}.flatten
于 2012-11-13T18:48:59.060 に答える
0

現時点では、これがAPIでサポートされているとは思われません。口ひげのバージョン0.99.4のソースコードを検索しました。私が見つけた最も近いものは、 context.rbhas_key?のandfetchメソッドです。これらのメソッドを読んだ後、キーがキャッシュされていないように見えます。

于 2012-06-06T19:33:11.110 に答える