2011-10-05 4 views
11

J'ai écrit une étiquette personnalisée en liquide, et j'aimerais lui transmettre une variable. Les étiquettes liquides transformeront n'importe quel paramètre en chaîne.Comment passer une variable dans une variable personnalisée dans Liquid?

Par exemple:

{% nav page /some/url.html %} 

Où page est une variable.

Existe-t-il un moyen pour que Liquid traite la page comme une variable et non comme une chaîne?

Merci d'avance!

+0

Je devrais mentionner cette question est spécifiquement à propos de Jekyll, mais applicable à toute étiquette personnalisée liquide. –

+3

Voir: http://stackoverflow.com/questions/7919644/using-liquid-variables-inside-of-a-liquid-tag-call http://stackoverflow.com/questions/7259385/resolve-liquid-variable- inside-liquid-tag – nickf

Répondre

11

Si vous utilisez Jekyll précisément, vous pouvez accéder à la variable de page de cette façon:

def render(context) 
    page_url = context.environments.first["page"]["url"] 
+1

OK, je peux accéder au hachage liquide d'un poteau de cette façon. Est-il possible d'accéder à l'objet 'Post' de' context'? –

+0

Cela devrait vraiment aller dans la documentation de Jekyll! – Sebi

5

J'ai eu un problème similaire. Je l'ai résolu en créant une méthode de recherche personnalisée:

def look_up(context, name) 
    lookup = context 

    name.split(".").each do |value| 
    lookup = lookup[value] 
    end 

    lookup 
end 

Pour l'utiliser, créer quelque chose comme ceci:

def initialize(tag_name, markup, tokens) 
    @markup = markup 
    super 
end 

def render(context) 
    output = super 
    if @markup =~ /([\w]+(\.[\w]+)*)/i 
    @myvalue = look_up(context, $1) 
    end 

    do_something_with(@myvalue) 
end 
2

Pour répondre à la question générale et non la partie spécifique de la variable de page, vous pouvez passer également le contenu de l'étiquette à travers l'analyseur de liquide à nouveau:

def initialize(tag_name, markup, tokens) 
    @markup = markup 
    super 
end 

def render(context) 
    content = Liquid::Template.parse(@markup).render context 
end 
Questions connexes