Seth Ladd
Seth Ladd

Reputation: 120829

How to pass a variable into a custom tag in Liquid?

I have written a custom tag in liquid, and I'd like to pass a variable to it. Liquid tags will turn any parameter into a string.

For example:

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

Where page is a variable.

Is there a way to get Liquid to treat page as a variable and not a string?

Thanks in advance!

Upvotes: 14

Views: 7026

Answers (3)

bwest
bwest

Reputation: 9854

To answer the general question and not the part specifically about the page variable, you can also pass the contents of the tag through the Liquid parser again:

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

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

Upvotes: 3

pfleidi
pfleidi

Reputation: 2936

I had a similar problem. I solved it by creating a custom lookup method:

def look_up(context, name)
  lookup = context

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

  lookup
end

To use it, create something like this:

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 

Upvotes: 5

Seth Ladd
Seth Ladd

Reputation: 120829

If you are using Jekyll specifically, you can access the page variable this way:

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

Upvotes: 13

Related Questions