Liquid Templating
All HTML in PageWeave supports Liquid. Use it for dynamic content, loops, conditionals, and data table access.
Variables
Global Drops
-
site.name— Website name -
site.subdomain— Website subdomain -
site.domain— Custom domain (if set) -
site.indexable— Search engine indexing enabled -
site.tables.{slug}— Data table rows -
page.title— Page title -
page.path— Page URL path
Template Pages
When a page is associated with a table (path contains :slug), the row variable is available:
row.id— Row UUIDrow.slug— URL-safe slugrow.created_at— Creation timestamprow.updated_at— Last update timestamprow.url— Full URL to this row’s pagerow.{field}— Any table fieldrow.{field}.{nested}— Nested data
Syntax
{{ site.name }}
{% if site.indexable %}
<meta name="robots" content="index, follow">
{% endif %}
{% for i in (1..3) %}{{ i }}{% endfor %}
{% assign x = "value" %}
Filters
Standard Liquid filters: upcase, downcase, date, truncate, times, divided_by, append, prepend, strip_html.
Table filters:
where: "field", "value"— Filter rowssort_by: "field", "desc"— Sort rows
{% for post in site.tables.blog_posts | where: "published", "true" | sort_by: "created_at", "desc" %}
<h2>{{ post.title }}</h2>
{% endfor %}
Data Tables
Basic Loop
{% for post in site.tables.blog_posts limit: 10 %}
<h2>{{ post.title }}</h2>
<p>{{ post.excerpt | truncate: 150 }}</p>
{% endfor %}
Pagination
{% paginate site.tables.blog_posts by 10 order_by: "created_at" order_dir: "desc" where: "published:true" %}
{% for post in site.tables.blog_posts %}
{{ post.title }}
{% endfor %}
{% if paginate.next %}
<a href="{{ paginate.next.url }}">Next</a>
{% endif %}
{% endpaginate %}
Default limit: 20 rows. Hard cap: 100.
Template Page Example
<article>
<h1>{{ row.title }}</h1>
<p>Published: {{ row.created_at | date: "%B %d, %Y" }}</p>
<div>{{ row.body }}</div>
<a href="{{ row.url }}">Permalink</a>
</article>
Syntax Warnings
Liquid syntax errors are reported via liquid_warnings in page responses.