如何获取液体模板中引用的变量列表

Wil*_*ill 6 ruby liquid

我正在开发一个使用 Liquid 模板语言的项目。我有一个带有 iframe 的页面,显示了一些呈现的液体模板和一个编辑器部分。在编辑器部分,用户可以更改液体模板中引用的一些变量的值。此时需要重新渲染一些模板,但我只想重新渲染那些引用已更改变量的模板。

我坚持的一点是如何最好地获取液体模板中引用的变量列表。

所以如果我这样做:

templates=[]
templates[0] = Liquid::Template.parse("hi {{name}}") 
templates[1] = Liquid::Template.parse("my cat is called {{cat_name}}") 
Run Code Online (Sandbox Code Playgroud)

我想知道 'name' 被引用,但(例如)'cat' 不在模板 0 中。然后当名称更改时,我可以重新渲染模板 [0],当 cat 更改时,我可以重新渲染模板 [ 1]。

我发现我可以获得一个节点列表并检查每个节点以查看它是否是一个变量,例如 templates[0].root.nodelist[1] 的类型为 'Liquid::Variable' 但'name ' 变量的方法返回一个类型为 'Liquid::VariableLookup' 的对象,而该对象似乎没有从中获取名称的方法,这感觉就像我可能会以错误的方式处理它。

aso*_*sok 5

https://github.com/Shopify/liquid/issues/685#issuecomment-471499796之后,您可以使用FileTreeVisitor类。即:

template = Liquid::Template.parse("hi {{name}}")

Liquid::ParseTreeVisitor.for(template.root)
  .add_callback_for(Liquid::VariableLookup) do |node|
  [node.name, *node.lookups].join('.')
end.visit.flatten.compact # => ["name"]
Run Code Online (Sandbox Code Playgroud)