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_xTAGs,它们用于设置默认分隔符。)

像这样给它提供一个模板:

[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 不支持这一点。我搜索了 mustache 0.99.4 版本的源代码。我发现的最接近的是context.rbhas_key?中的andfetch方法。在阅读了这些方法之后,似乎密钥没有被缓存。

于 2012-06-06T19:33:11.110 回答