HTML table
Read a CSV and render as a table.
This works also with a Liquid variable or a YAML or JSON file in _data
too. You just need to set up your data as rows.
See also Tabulate CSV Data on the Jekyll docs.
HTML vs Markdown
Warning - you may have indention issues inside a Markdown file - where indented lines get turned into codeblocks instead of HTML.
To solve this, either make sure your page is .html
. Or for a .md
page, makes sure your includes file HTML.
e.g.
index.md
--- authors: # ... --- {% include table.html table_rows = page.authors %}
From CSV
This approaches uses Liquid to iterate through the rows of CSV data.
In the case of the first row, that is the header, so the HTML th
tag is used.
Otherwise use the tablerow
tag, which makes generates tr
with td
inside it, saving you some code.
_data/authors.csv
First name,Last name,Age,Location John,Doe,35,United States Jane,Doe,29,France Jack,Hill,25,Australia
index.html
--- title: Table test --- {% assign table_rows = site.data.authors %} <table> {% for row in table_rows %} {% if forloop.first %} <tr> {% for pair in row %} <th> {{ pair[0] }} </th> {% endfor %} </tr> {% endif %} {% tablerow pair in row %} {{ pair[1] }} {% endtablerow %} {% endfor %} </table>
Or make it into an includes file which you pass table row data.
From YAML
Here the data is set in the frontmatter as a variable. This could equally be in the Jekyll config or a YAML file in _data
directory.
Set up your data like this:
index.md
--- authors: # ... --- {% include table.html table_rows = page.authors %}
Then the same templating code in previous section is used.
See Table demo in the Fractal theme’s site for a working example.
Codeblocks
If you want to add codeblocks in your table, use <code>
tag. Don’t use <pre>
, as then you text will stay on one line and will not wrap, leading to the table going off screen to the right.
{% tablerow pair in row %}
<code>{{ pair[1] }}</code>
{% endtablerow %}
Markdown
If you have Markdown in your table content, like bold or backticks, add the markdownify
filter to render that. Warning - it will add a p
tag around your text which might conflict with surrounding content.
{% tablerow pair in row %}
{{ pair[1] | markdownify }}
{% endtablerow %}