Add support for pagination (fixes #81)

This commit is contained in:
daudix
2024-09-19 22:11:09 +03:00
parent 34fa46fea9
commit bd572912bd
10 changed files with 161 additions and 15 deletions

View File

@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased](https://codeberg.org/daudix/duckquill/compare/v5.0.0...main) ## [Unreleased](https://codeberg.org/daudix/duckquill/compare/v5.0.0...main)
### Added
- Add support for [pagination](https://www.getzola.org/documentation/templates/pagination/) (#81).
### Changed ### Changed
- Improve disabled checkbox/radio styling. - Improve disabled checkbox/radio styling.

View File

@ -3,6 +3,7 @@ title = "Writings of Duck's Feet"
sort_by = "date" sort_by = "date"
template = "article_list.html" template = "article_list.html"
page_template = "article.html" page_template = "article.html"
paginate_by = 2
+++ +++
Welcome to my quack'in blog, I quack about various stuff, but mostly I'm a demo Welcome to my quack'in blog, I quack about various stuff, but mostly I'm a demo

View File

@ -34,10 +34,12 @@ featured = "مميز"
feed = "موجز" feed = "موجز"
file_an_issue = "ملف مشكلة" file_an_issue = "ملف مشكلة"
filter_by_tag = "تصفية حسب العلامة" filter_by_tag = "تصفية حسب العلامة"
first = "الأولى"
go_to_top = "الانتقال إلى الأعلى" go_to_top = "الانتقال إلى الأعلى"
hot = "حار" hot = "حار"
important = "مهم" important = "مهم"
language = "اللغة" language = "اللغة"
last = "الأخيرة"
load_comments = "تحميل التعليقات" load_comments = "تحميل التعليقات"
loading = "التحميل" loading = "التحميل"
many_minutes_read = "$NUMBER دقائق القراءة" many_minutes_read = "$NUMBER دقائق القراءة"

View File

@ -34,10 +34,12 @@ featured = "Featured"
feed = "Feed" feed = "Feed"
file_an_issue = "File an Issue" file_an_issue = "File an Issue"
filter_by_tag = "Filter by tag" filter_by_tag = "Filter by tag"
first = "First"
go_to_top = "Go to Top" go_to_top = "Go to Top"
hot = "Hot" hot = "Hot"
important = "Important" important = "Important"
language = "Language" language = "Language"
last = "Last"
load_comments = "Load Comments" load_comments = "Load Comments"
loading = "Loading" loading = "Loading"
many_minutes_read = "$NUMBER minutes read" many_minutes_read = "$NUMBER minutes read"
@ -46,7 +48,7 @@ many_tags = "$NUMBER tags in total"
minutes_read = "$NUMBER minute read" minutes_read = "$NUMBER minute read"
newest_to_oldest = "From newest to oldest" newest_to_oldest = "From newest to oldest"
next = "Next" next = "Next"
no_comments = "No comments yet :/" no_comments = "No Comments yet :/"
note = "Note" note = "Note"
one_posts = "$NUMBER post in total" one_posts = "$NUMBER post in total"
one_tags = "$NUMBER tag in total" one_tags = "$NUMBER tag in total"
@ -63,18 +65,18 @@ repo = "Repository"
search = "Search" search = "Search"
search_for = "Search for" search_for = "Search for"
share = "Share" share = "Share"
skip_to_content = "Skip to main content" skip_to_content = "Skip to Main Content"
source = "Website source" source = "Website source"
table_of_contents = "Table of Contents" table_of_contents = "Table of Contents"
tags = "tags" tags = "tags"
tags_title = "Tags" tags_title = "Tags"
theme = "Theme" theme = "Theme"
theme_dark = "Switch to dark theme" theme_dark = "Switch to Dark Theme"
theme_light = "Switch to light theme" theme_light = "Switch to Light Theme"
theme_system = "Use system theme" theme_system = "Use System Theme"
tip = "Tip" tip = "Tip"
trigger_warning = "Trigger Warning" trigger_warning = "Trigger Warning"
updated = "Updated on" updated = "Updated on"
view_comment = "View comment at" view_comment = "View Comment At"
view_profile = "View profile at" view_profile = "View Profile At"
warning = "Warning" warning = "Warning"

View File

@ -34,10 +34,12 @@ featured = "Ditampilkan"
feed = "Suapan" feed = "Suapan"
file_an_issue = "Failkan Isu" file_an_issue = "Failkan Isu"
filter_by_tag = "Tapis mengikut tag" filter_by_tag = "Tapis mengikut tag"
first = "Pertama"
go_to_top = "Pergi ke Atas" go_to_top = "Pergi ke Atas"
hot = "Hangat" hot = "Hangat"
important = "Penting" important = "Penting"
language = "Bahasa" language = "Bahasa"
last = "Terakhir"
load_comments = "Memuatkan Komen" load_comments = "Memuatkan Komen"
loading = "Memuatkan" loading = "Memuatkan"
many_minutes_read = "$NUMBER minit membaca" many_minutes_read = "$NUMBER minit membaca"

View File

@ -41,10 +41,12 @@ few_posts = "Всего $NUMBER поста"
few_tags = "Всего $NUMBER тега" few_tags = "Всего $NUMBER тега"
file_an_issue = "Отправить Отчет об Ошибке" file_an_issue = "Отправить Отчет об Ошибке"
filter_by_tag = "Фильтр по тегам" filter_by_tag = "Фильтр по тегам"
first = "Первая"
go_to_top = "Перейти в Начало" go_to_top = "Перейти в Начало"
hot = "Горячее" hot = "Горячее"
important = "Важно" important = "Важно"
language = "Язык" language = "Язык"
last = "Последняя"
load_comments = "Загрузить Комментарии" load_comments = "Загрузить Комментарии"
loading = "Загрузка" loading = "Загрузка"
many_minutes_read = "$NUMBER минуты чтения" many_minutes_read = "$NUMBER минуты чтения"

View File

@ -337,3 +337,88 @@
} }
} }
} }
#paginator {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
gap: 0.5rem;
margin-block-start: 4rem;
#paginator-first,
#paginator-previous,
#paginator-next,
#paginator-last {
display: inline-block;
transition: var(--transition);
box-shadow: var(--edge-highlight);
border-radius: 999px;
background-color: var(--fg-muted-1);
padding: 0.5rem;
color: var(--fg-muted-4);
line-height: 0;
&:hover {
background-color: var(--fg-muted-2);
color: var(--fg-muted-5);
}
&:active {
transform: var(--active);
}
.icon {
transition: var(--transition);
width: 1rem;
height: 1rem;
:root[dir*="rtl"] & {
transform: scaleX(-1);
}
}
}
#paginator-first .icon {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cpath d='M3 2v12h2V8.414l5.293 5.293a1 1 0 1 0 1.414-1.414L7.414 8l4.293-4.293a1 1 0 1 0-1.414-1.414L5 7.586V2zm0 0'/%3E%3C/svg%3E");
}
#paginator-previous .icon {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cpath d='m9.293 13.707-5-5a1 1 0 0 1 0-1.414l5-5a1 1 0 1 1 1.414 1.414L6.414 8l4.293 4.293a1 1 0 1 1-1.414 1.414m0 0'/%3E%3C/svg%3E");
}
#paginator-next .icon {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cpath d='m6.707 13.707 5-5a1 1 0 0 0 0-1.414l-5-5a1 1 0 1 0-1.414 1.414L9.586 8l-4.293 4.293a1 1 0 1 0 1.414 1.414m0 0'/%3E%3C/svg%3E");
}
#paginator-last .icon {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cpath d='M11 2v5.586L5.707 2.293a1 1 0 1 0-1.414 1.414L8.586 8l-4.293 4.293a1 1 0 1 0 1.414 1.414L11 8.414V14h2V2zm0 0'/%3E%3C/svg%3E");
}
span {
&#paginator-first,
&#paginator-previous,
&#paginator-next,
&#paginator-last {
opacity: var(--disabled-opacity);
cursor: not-allowed;
&:hover {
background-color: var(--fg-muted-1);
color: var(--fg-muted-4);
}
&:active {
transform: none;
}
}
}
#paginator-counter {
display: inline-block;
color: var(--fg-muted-5);
line-height: 1;
font-variant-numeric: tabular-nums;
margin: 0 0.5rem;
}
}

View File

@ -1,4 +1,6 @@
{%- if section.pages -%} {%- if paginator.pages -%}
{%- set pages = paginator.pages -%}
{%- elif section.pages -%}
{%- set pages = section.pages -%} {%- set pages = section.pages -%}
{%- else -%} {%- else -%}
{%- set pages = term.pages -%} {%- set pages = term.pages -%}
@ -80,3 +82,49 @@
</article> </article>
{%- endfor %} {%- endfor %}
</div> </div>
{%- if paginator.pages -%}
<nav id="paginator">
{%- if paginator.first != current_url -%}
<a id="paginator-first" href="{{ paginator.first }}" title="{{ macros_translate::translate(key='first', default='First', language_strings=language_strings) }}">
<i class="icon"></i>
</a>
{% else %}
<span id="paginator-first" title="{{ macros_translate::translate(key='first', default='First', language_strings=language_strings) }}">
<i class="icon"></i>
</span>
{%- endif -%}
{%- if paginator.previous -%}
<a id="paginator-previous" href="{{ paginator.previous }}" title="{{ macros_translate::translate(key='previous', default='Previous', language_strings=language_strings) }}">
<i class="icon"></i>
</a>
{% else %}
<span id="paginator-previous" title="{{ macros_translate::translate(key='previous', default='Previous', language_strings=language_strings) }}">
<i class="icon"></i>
</span>
{%- endif -%}
<span id="paginator-counter">{{ paginator.current_index }}/{{ paginator.number_pagers }}</span>
{%- if paginator.next -%}
<a id="paginator-next" href="{{ paginator.next }}" title="{{ macros_translate::translate(key='next', default='Next', language_strings=language_strings) }}">
<i class="icon"></i>
</a>
{%- else -%}
<span id="paginator-next" title="{{ macros_translate::translate(key='next', default='Next', language_strings=language_strings) }}">
<i class="icon"></i>
</span>
{%- endif -%}
{%- if paginator.last != current_url -%}
<a id="paginator-last" href="{{ paginator.last }}" title="{{ macros_translate::translate(key='last', default='Last', language_strings=language_strings) }}">
<i class="icon"></i>
</a>
{% else %}
<span id="paginator-last" title="{{ macros_translate::translate(key='last', default='Last', language_strings=language_strings) }}">
<i class="icon"></i>
</span>
{%- endif -%}
</nav>
{%- endif -%}

View File

@ -170,7 +170,7 @@
avatar.setAttribute("rel", "{{ rel_attributes }}"); avatar.setAttribute("rel", "{{ rel_attributes }}");
avatar.setAttribute( avatar.setAttribute(
"title", "title",
`{{ macros_translate::translate(key="view_profile", default="View profile at", language_strings=language_strings) }} @${status.account.username}@${instance}` `{{ macros_translate::translate(key="view_profile", default="View Profile At", language_strings=language_strings) }} @${status.account.username}@${instance}`
); );
avatar.appendChild(avatarPicture); avatar.appendChild(avatarPicture);
@ -198,7 +198,7 @@
let permalink = document.createElement("a"); let permalink = document.createElement("a");
permalink.setAttribute("href", status.url); permalink.setAttribute("href", status.url);
permalink.setAttribute("itemprop", "url"); permalink.setAttribute("itemprop", "url");
permalink.setAttribute("title", `{{ macros_translate::translate(key="view_comment", default="View comment at", language_strings=language_strings) }} ${instance}`); permalink.setAttribute("title", `{{ macros_translate::translate(key="view_comment", default="View Comment At", language_strings=language_strings) }} ${instance}`);
permalink.setAttribute("rel", "{{ rel_attributes }}"); permalink.setAttribute("rel", "{{ rel_attributes }}");
permalink.textContent = new Date( permalink.textContent = new Date(
status.created_at status.created_at
@ -363,7 +363,7 @@
else { else {
var statusText = document.createElement("p"); var statusText = document.createElement("p");
statusText.innerHTML = "{{ macros_translate::translate(key='no_comments', default='No comments yet :/', language_strings=language_strings) }}"; statusText.innerHTML = "{{ macros_translate::translate(key='no_comments', default='No Comments yet :/', language_strings=language_strings) }}";
statusText.setAttribute("id", "comments-status"); statusText.setAttribute("id", "comments-status");
commentsWrapper.appendChild(statusText); commentsWrapper.appendChild(statusText);
} }

View File

@ -3,7 +3,7 @@
<header id="site-nav"> <header id="site-nav">
<nav> <nav>
<a href="#main" id="main-content" tabindex="0"> <a href="#main" id="main-content" tabindex="0">
{{ macros_translate::translate(key="skip_to_content", default="Skip to main content", language_strings=language_strings) }} {{ macros_translate::translate(key="skip_to_content", default="Skip to Main Content", language_strings=language_strings) }}
</a> </a>
<ul> <ul>
<li id="home"> <li id="home">
@ -87,17 +87,17 @@
</summary> </summary>
<ul> <ul>
<li> <li>
<button class="circle" id="theme-light" onclick="switchTheme('light')" title="{{ macros_translate::translate(key='theme_light', default='Switch to light theme', language_strings=language_strings) }}"> <button class="circle" id="theme-light" onclick="switchTheme('light')" title="{{ macros_translate::translate(key='theme_light', default='Switch to Light Theme', language_strings=language_strings) }}">
<i class="icon"></i> <i class="icon"></i>
</button> </button>
</li> </li>
<li> <li>
<button class="circle" id="theme-dark" onclick="switchTheme('dark')" title="{{ macros_translate::translate(key='theme_dark', default='Switch to dark theme', language_strings=language_strings) }}"> <button class="circle" id="theme-dark" onclick="switchTheme('dark')" title="{{ macros_translate::translate(key='theme_dark', default='Switch to Dark Theme', language_strings=language_strings) }}">
<i class="icon"></i> <i class="icon"></i>
</button> </button>
</li> </li>
<li> <li>
<button class="circle" id="theme-system" onclick="switchTheme('system')" title="{{ macros_translate::translate(key='theme_system', default='Use system theme', language_strings=language_strings) }}"> <button class="circle" id="theme-system" onclick="switchTheme('system')" title="{{ macros_translate::translate(key='theme_system', default='Use System Theme', language_strings=language_strings) }}">
<i class="icon"></i> <i class="icon"></i>
</button> </button>
</li> </li>