Índice

What is Amp-mustache and how it works

Recently I have been implementing Google AMP pages in my site. Everything was going well until I decide to implement lists with amp-mustache. This component of AMP allows to populate elements from a json, for example one could create a list from this json:

{
  "items": [
    {
      "title": "amp-carousel",
      "url": "https://ampbyexample.com/components/amp-carousel"
    },
    ...
  ]
}


And then we have a template like this one to generate the content:

  <ul>
    <amp-list width=auto
        height=100
        layout=fixed-height
        src="https://ampbyexample.com/json/examples.json">
      <template type="amp-mustache"
          id="amp-template-id">
        <li>
          <a href="{{url}}">{{title}}</a>
        </li>
      </template>
    </amp-list>
  </ul>

This code would be populated from the json by replacing each {{tag}} with its corresponding value in the json. Up until here all seems to be pretty easy, but when you are using Jekyll on your site things change a little. Lets see why.

How to make amp-mustache work in jekyll

In Jekyll there are liquid tags, and they have the same syntax amp-mustache templates have, so when jekyll is building the site, it will interpret each {{tag}} in the example above as liquid variables. However, since this variables do not exists they will be left blank, and so the template would not be populated.

In my case, the error Missing URL for attribute 'src' in tag 'a'. came from this piece of code <a href={{url}}>, because jekyll do not find any variable which name was url and in consequence leave it blank. To solve this problem we need to tell jekyll that those tags are not liquid tags. This is easily done with: {% raw %}{{ tag }}{% endraw %}. Knowing this, the code for generate a list with amp-mustache would be as follow:

  <ul>
    <amp-list width=auto
        height=100
        layout=fixed-height
        src="https://ampbyexample.com/json/examples.json">
      <template type="amp-mustache"
          id="amp-template-id">
        <li>
          <a href="{% raw %}{{url}}{% endraw %}">{% raw %}{{title}}{% endraw %}</a>
        </li>
      </template>
    </amp-list>
  </ul>

References