Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Next version #1038

Merged
merged 72 commits into from
Sep 4, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
0d817ee
Next version
Keats May 25, 2020
ee594cf
Make alias template pass HTML validation
Keats May 27, 2020
eb9e22c
Update Changelog to mention taxonomy rss
Keats May 27, 2020
b935dc6
Fix tests
Keats May 27, 2020
b87f175
Remove unneeded build_timestamp on config
Keats May 28, 2020
a9a3a2e
Mention 0.11 breaking change
Keats Jun 3, 2020
ed0ae43
Clarify docs about adding a Sublime theme
apiraino Jun 6, 2020
bdeb2bd
Add themes and syntect file
apiraino Jun 6, 2020
a3b65b2
add .dockerignore file to reduce intermediate docker image size and b…
thomasetter Jun 9, 2020
779c4dc
Merge pull request #1057 from thomasetter/dockerignore
Keats Jun 9, 2020
a27380e
Merge pull request #1055 from apiraino/add-new-sublime-themes-2
Keats Jun 9, 2020
f107d43
Update snap
Keats Jun 9, 2020
6708f76
Implement get_file_hash (#1044)
dancek Jun 9, 2020
c4154bb
Don't panic on bad date strings (#1051)
dancek Jun 9, 2020
f41fab8
Start changelog
Keats Jun 9, 2020
2e9b7ba
Enable task lists
Keats Jun 11, 2020
8d4056a
Add GLSL and GDScrip syntax highlighting (#1060)
bemyak Jun 12, 2020
351c9b7
Remove ja/zh in search index
Keats Jun 15, 2020
752716f
Not sure it changes anything but...
Keats Jun 15, 2020
5e31a32
Add support for SVG files to `get_image_metadata` (Fixes #769) (#1063)
mre Jun 18, 2020
ade442a
clippy + fmt + fix toml dates in extra arrays
Keats Jun 18, 2020
530f918
Add --force/-f flag to init, for creation in non-empty dir (#1065)
perlun Jun 18, 2020
2230968
Update changelog
Keats Jun 18, 2020
e47decc
Make themes more flexible (#1004)
southerntofu Jun 18, 2020
b30394f
Tweak a bit the test_site test
Keats Jun 18, 2020
cb198ab
Document get_taxonomy_url
Keats Jun 18, 2020
7cea0bb
Clean up config a bit
Keats Jun 18, 2020
c6a1c8b
Clearer page sorting comment
Keats Jun 18, 2020
fb994c7
Make search index configurable
Keats Jun 29, 2020
ffd87dc
Update syntect syntaxes
Keats Jul 19, 2020
d21ac14
make text visible on markdown renderers (#1096)
tshepang Jul 22, 2020
24d4784
Ignore sass directories starting with _ (#1084)
iirelu Jul 22, 2020
9f20af1
Update deps
Keats Jul 22, 2020
c3f59bc
Fix pagination section memory issue (#1097)
justinturpin Jul 23, 2020
d7a557f
Update livereload.js
Keats Jul 24, 2020
9be7bc0
Extract sass code out of site/lib.rs
Keats Jul 24, 2020
d9123a8
Extract link_checking outside of site/lib.rs
Keats Jul 24, 2020
5fe1036
Extract some Tera logic out of site/lib.rs
Keats Jul 24, 2020
d7b5368
Extract some feed logic out of site/lib.rs
Keats Jul 25, 2020
66aaf4e
Use mod paths
Keats Jul 25, 2020
7e7bf2b
Tables in config.extra can be merged with those in theme.extra (#1100)
southerntofu Jul 29, 2020
b003a47
Support relative links for root directory (fix #1028) (#1106)
southerntofu Jul 29, 2020
28523ac
Allow emitting newlines and whitespace in shortcodes and introduce ma…
eaon Jul 29, 2020
b9296f7
Make current_path always start with a slash (#1101)
yanghuidong Jul 29, 2020
b4c5e9a
Update changelog
Keats Jul 29, 2020
39eed4f
add OneHalf Light/Dark theme (#1116)
zaiste Aug 3, 2020
b04be90
Fix benchmarks (#1113)
southerntofu Aug 4, 2020
4a3c156
Support anchors without quotes in link checker (#1118)
siiptuo Aug 7, 2020
6af7959
Making Chinese and Japanese search indexing optional... (#1115)
liushuyu Aug 7, 2020
6238171
Updating filetime to v0.2.12 for OpenBSD support (#1120)
protoCall7 Aug 11, 2020
278cc82
Change zola serve to load HTML from memory instead of disk (#1114)
Keats Aug 16, 2020
ffaf5e0
Do not unwrap on invalid utf8 in link checker
Keats Aug 17, 2020
7666043
Merge branch 'master' into next
Keats Aug 17, 2020
05646ab
add fix for (#1135) Taxonomies with identical slugs now get merged (#…
savente93 Aug 18, 2020
159ce0f
Fix toml parse error line number (kind of) (#1138)
Lucretiel Aug 18, 2020
51a2213
Replaced all `impl Default` with `derive(Default)`, where possible (#…
Lucretiel Aug 19, 2020
af0dd5e
Fixed unsound errors (#1143)
Lucretiel Aug 20, 2020
6e16dfd
A Fix for the permalinks in #1136 (#1142)
savente93 Aug 26, 2020
d571dea
Per section/subsection feeds (#1128)
Yaroslav-95 Aug 27, 2020
0df3631
Add minify support (#1146)
areille Aug 28, 2020
4f5fd63
Update deps + pinned
Keats Aug 28, 2020
5ec3a9c
Strip unc if it exists, fix #1110 #1129 (#1151)
uggla Sep 1, 2020
c143d95
Reverse pagination (#1147)
savente93 Sep 1, 2020
6c2300f
Disable minify_html for now
Keats Sep 1, 2020
e0068ef
Remove mention from changelog
Keats Sep 1, 2020
cc647f8
Make anchors always visible in docs
Keats Sep 1, 2020
2ac1d79
fix `get_taxonomy_url` to handle merged taxonomies properly (#1155)
savente93 Sep 2, 2020
5bf1687
Use trim_start_matches instead of strip_prefix (#1156)
uggla Sep 3, 2020
f786783
Update pulldown_cmark
Keats Sep 3, 2020
ba240cd
Change min Rust version in docs
Keats Sep 3, 2020
b854cca
Prepare for release
Keats Sep 4, 2020
935c4a5
Update changelog
Keats Sep 4, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Reverse pagination (#1147)
* mention code block output change

* Update snap

* Update themes gallery (#1082)

Co-authored-by: GitHub Action <[email protected]>

* Deployment guide for Vercel

* Change wording a bit

* Update themes gallery (#1122)

Co-authored-by: GitHub Action <[email protected]>

* Add feed autodiscovery documentation (#1123)

* Add feed autodiscovery documentation

* Fix link in template

* Docs/configuration update (#1126)

* Update configuration documentation

- Attempt to split the configuration file into sections to make it more readable and
  avoid configuration mistakes (#1056).
- Move translation instructions to the right part.
- Add a bit more explanations to the extra section.

* Take into account @Keats feedbacks

* Remove short notice about translation usage

- A i18n page should be created to better explain it.

* add fix for (#1135) Taxonomies with identical slugs now get merged (#1136)

* add test and implementation for reverse pagination

* incorporate review changes

Co-authored-by: Michael Plotke <[email protected]>
Co-authored-by: Vincent Prouillet <[email protected]>
Co-authored-by: GitHub Action <[email protected]>
Co-authored-by: Samyak Bakliwal <[email protected]>
Co-authored-by: René Ribaud <[email protected]>
  • Loading branch information
6 people committed Sep 1, 2020
commit c143d95c4e2ca0b773473ec311cfc5cb48a9a1bc
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,4 @@ stage
shell.nix
# vim temporary files
**/.*.sw*
.swp
5 changes: 4 additions & 1 deletion components/front_matter/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,10 @@ pub fn split_section_content<'c>(

/// Split a file between the front matter and its content
/// Returns a parsed `PageFrontMatter` and the rest of the content
pub fn split_page_content<'c>(file_path: &Path, content: &'c str) -> Result<(PageFrontMatter, &'c str)> {
pub fn split_page_content<'c>(
file_path: &Path,
content: &'c str,
) -> Result<(PageFrontMatter, &'c str)> {
let (front_matter, content) = split_content(file_path, content)?;
let meta = PageFrontMatter::parse(&front_matter).map_err(|e| {
Error::chain(
Expand Down
7 changes: 0 additions & 7 deletions components/front_matter/src/page.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ pub struct PageFrontMatter {
/// Can't be an empty string if present
pub path: Option<String>,
pub taxonomies: HashMap<String, Vec<String>>,
/// Integer to use to order content. Lowest is at the bottom, highest first
pub order: Option<usize>,
/// Integer to use to order content. Highest is at the bottom, lowest first
pub weight: Option<usize>,
/// All aliases for that page. Zola will create HTML templates that will
Expand Down Expand Up @@ -112,10 +110,6 @@ impl PageFrontMatter {
self.datetime_tuple = self.datetime.map(|dt| (dt.year(), dt.month(), dt.day()));
}

pub fn order(&self) -> usize {
self.order.unwrap()
}

pub fn weight(&self) -> usize {
self.weight.unwrap()
}
Expand All @@ -134,7 +128,6 @@ impl Default for PageFrontMatter {
slug: None,
path: None,
taxonomies: HashMap::new(),
order: None,
weight: None,
aliases: Vec::new(),
in_search_index: true,
Expand Down
4 changes: 4 additions & 0 deletions components/front_matter/src/section.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ pub struct SectionFrontMatter {
/// How many pages to be displayed per paginated page. No pagination will happen if this isn't set
#[serde(skip_serializing)]
pub paginate_by: Option<usize>,
/// Whether to reverse the order of the pages before segmenting into pagers
#[serde(skip_serializing)]
pub paginate_reversed: bool,
/// Path to be used by pagination: the page number will be appended after it. Defaults to `page`.
#[serde(skip_serializing)]
pub paginate_path: String,
Expand Down Expand Up @@ -100,6 +103,7 @@ impl Default for SectionFrontMatter {
weight: 0,
template: None,
paginate_by: None,
paginate_reversed: false,
paginate_path: DEFAULT_PAGINATE_PATH.to_string(),
render: true,
redirect_to: None,
Expand Down
5 changes: 5 additions & 0 deletions components/library/src/content/ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,11 @@ impl<'a> SerializingPage<'a> {
}
}

/// currently only used in testing
pub fn get_title(&'a self) -> &'a Option<String> {
&self.title
}

/// Same as from_page but does not fill sibling pages
pub fn from_page_basic(page: &'a Page, library: Option<&'a Library>) -> Self {
let mut year = None;
Expand Down
101 changes: 84 additions & 17 deletions components/library/src/pagination/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ use crate::content::{Section, SerializingPage, SerializingSection};
use crate::library::Library;
use crate::taxonomies::{Taxonomy, TaxonomyItem};

use std::borrow::Cow;

#[derive(Clone, Debug, PartialEq)]
enum PaginationRoot<'a> {
Section(&'a Section),
Expand Down Expand Up @@ -45,11 +47,13 @@ impl<'a> Pager<'a> {
#[derive(Clone, Debug, PartialEq)]
pub struct Paginator<'a> {
/// All pages in the section/taxonomy
all_pages: &'a [DefaultKey],
all_pages: Cow<'a, [DefaultKey]>,
/// Pages split in chunks of `paginate_by`
pub pagers: Vec<Pager<'a>>,
/// How many content pages on a paginated page at max
paginate_by: usize,
/// whether to reverse before grouping
paginate_reversed: bool,
/// The thing we are creating the paginator for: section or taxonomy
root: PaginationRoot<'a>,
// Those below can be obtained from the root but it would make the code more complex than needed
Expand All @@ -66,10 +70,12 @@ impl<'a> Paginator<'a> {
/// It will always at least create one pager (the first) even if there are not enough pages to paginate
pub fn from_section(section: &'a Section, library: &'a Library) -> Paginator<'a> {
let paginate_by = section.meta.paginate_by.unwrap();
let paginate_reversed = section.meta.paginate_reversed;
let mut paginator = Paginator {
all_pages: &section.pages,
all_pages: Cow::from(&section.pages[..]),
pagers: Vec::with_capacity(section.pages.len() / paginate_by),
paginate_by,
paginate_reversed,
root: PaginationRoot::Section(section),
permalink: section.permalink.clone(),
path: section.path.clone(),
Expand All @@ -91,9 +97,10 @@ impl<'a> Paginator<'a> {
) -> Paginator<'a> {
let paginate_by = taxonomy.kind.paginate_by.unwrap();
let mut paginator = Paginator {
all_pages: &item.pages,
all_pages: Cow::Borrowed(&item.pages),
pagers: Vec::with_capacity(item.pages.len() / paginate_by),
paginate_by,
paginate_reversed: false,
root: PaginationRoot::Taxonomy(taxonomy, item),
permalink: item.permalink.clone(),
path: format!("/{}/{}/", taxonomy.kind.name, item.slug),
Expand All @@ -106,6 +113,7 @@ impl<'a> Paginator<'a> {
template: format!("{}/single.html", taxonomy.kind.name),
};

// taxonomy paginators have no sorting so we won't have to reverse
paginator.fill_pagers(library);
paginator
}
Expand All @@ -116,8 +124,12 @@ impl<'a> Paginator<'a> {
// the pages in the current pagers
let mut current_page = vec![];

for key in self.all_pages {
let page = library.get_page_by_key(*key);
if self.paginate_reversed {
self.all_pages.to_mut().reverse();
}

for key in self.all_pages.to_mut().iter_mut() {
let page = library.get_page_by_key(key.clone());
current_page.push(page.to_serialized_basic(library));

if current_page.len() == self.paginate_by {
Expand Down Expand Up @@ -246,10 +258,11 @@ mod tests {

use super::Paginator;

fn create_section(is_index: bool) -> Section {
fn create_section(is_index: bool, paginate_reversed: bool) -> Section {
let mut f = SectionFrontMatter::default();
f.paginate_by = Some(2);
f.paginate_path = "page".to_string();
f.paginate_reversed = paginate_reversed;
let mut s = Section::new("content/_index.md", f, &PathBuf::new());
if !is_index {
s.path = "/posts/".to_string();
Expand All @@ -262,15 +275,22 @@ mod tests {
s
}

fn create_library(is_index: bool) -> (Section, Library) {
let mut library = Library::new(3, 0, false);
library.insert_page(Page::default());
library.insert_page(Page::default());
library.insert_page(Page::default());
fn create_library(
is_index: bool,
num_pages: usize,
paginate_reversed: bool,
) -> (Section, Library) {
let mut library = Library::new(num_pages, 0, false);
for i in 1..=num_pages {
let mut page = Page::default();
page.meta.title = Some(i.to_string());
library.insert_page(page);
}

let mut draft = Page::default();
draft.meta.draft = true;
library.insert_page(draft);
let mut section = create_section(is_index);
let mut section = create_section(is_index, paginate_reversed);
section.pages = library.pages().keys().collect();
library.insert_section(section.clone());

Expand All @@ -279,7 +299,7 @@ mod tests {

#[test]
fn test_can_create_paginator() {
let (section, library) = create_library(false);
let (section, library) = create_library(false, 3, false);
let paginator = Paginator::from_section(&section, &library);
assert_eq!(paginator.pagers.len(), 2);

Expand All @@ -294,9 +314,56 @@ mod tests {
assert_eq!(paginator.pagers[1].path, "/posts/page/2/");
}

#[test]
fn test_can_create_reversed_paginator() {
// 6 pages, 5 normal and 1 draft
let (section, library) = create_library(false, 5, true);
let paginator = Paginator::from_section(&section, &library);
assert_eq!(paginator.pagers.len(), 3);

assert_eq!(paginator.pagers[0].index, 1);
assert_eq!(paginator.pagers[0].pages.len(), 2);
assert_eq!(paginator.pagers[0].permalink, "https://vincent.is/posts/");
assert_eq!(paginator.pagers[0].path, "/posts/");
assert_eq!(
vec!["".to_string(), "5".to_string()],
paginator.pagers[0]
.pages
.iter()
.map(|p| p.get_title().as_ref().unwrap_or(&"".to_string()).to_string())
.collect::<Vec<String>>()
);

assert_eq!(paginator.pagers[1].index, 2);
assert_eq!(paginator.pagers[1].pages.len(), 2);
assert_eq!(paginator.pagers[1].permalink, "https://vincent.is/posts/page/2/");
assert_eq!(paginator.pagers[1].path, "/posts/page/2/");
assert_eq!(
vec!["4".to_string(), "3".to_string()],
paginator.pagers[1]
.pages
.iter()
.map(|p| p.get_title().as_ref().unwrap_or(&"".to_string()).to_string())
.collect::<Vec<String>>()
);

assert_eq!(paginator.pagers[2].index, 3);
assert_eq!(paginator.pagers[2].pages.len(), 2);
assert_eq!(paginator.pagers[2].permalink, "https://vincent.is/posts/page/3/");
assert_eq!(paginator.pagers[2].path, "/posts/page/3/");
assert_eq!(
vec!["2".to_string(), "1".to_string()],
paginator.pagers[2]
.pages
.iter()
.map(|p| p.get_title().as_ref().unwrap_or(&"".to_string()).to_string())
.collect::<Vec<String>>()
);
}

#[test]
fn test_can_create_paginator_for_index() {
let (section, library) = create_library(true);
let (section, library) = create_library(true, 3, false);
let paginator = Paginator::from_section(&section, &library);
assert_eq!(paginator.pagers.len(), 2);

Expand All @@ -313,7 +380,7 @@ mod tests {

#[test]
fn test_can_build_paginator_context() {
let (section, library) = create_library(false);
let (section, library) = create_library(false, 3, false);
let paginator = Paginator::from_section(&section, &library);
assert_eq!(paginator.pagers.len(), 2);

Expand All @@ -337,7 +404,7 @@ mod tests {

#[test]
fn test_can_create_paginator_for_taxonomy() {
let (_, library) = create_library(false);
let (_, library) = create_library(false, 3, false);
let taxonomy_def = TaxonomyConfig {
name: "tags".to_string(),
paginate_by: Some(2),
Expand Down Expand Up @@ -367,7 +434,7 @@ mod tests {
// https://github.com/getzola/zola/issues/866
#[test]
fn works_with_empty_paginate_path() {
let (mut section, library) = create_library(false);
let (mut section, library) = create_library(false, 3, false);
section.meta.paginate_path = String::new();
let paginator = Paginator::from_section(&section, &library);
assert_eq!(paginator.pagers.len(), 2);
Expand Down
18 changes: 11 additions & 7 deletions components/site/tests/site.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ fn can_parse_site() {
let library = site.library.read().unwrap();

// Correct number of pages (sections do not count as pages, draft are ignored)
assert_eq!(library.pages().len(), 23);
assert_eq!(library.pages().len(), 32);
let posts_path = path.join("content").join("posts");

// Make sure the page with a url doesn't have any sections
Expand All @@ -32,11 +32,11 @@ fn can_parse_site() {
assert_eq!(asset_folder_post.file.components, vec!["posts".to_string()]);

// That we have the right number of sections
assert_eq!(library.sections().len(), 11);
assert_eq!(library.sections().len(), 12);

// And that the sections are correct
let index_section = library.get_section(&path.join("content").join("_index.md")).unwrap();
assert_eq!(index_section.subsections.len(), 4);
assert_eq!(index_section.subsections.len(), 5);
assert_eq!(index_section.pages.len(), 3);
assert!(index_section.ancestors.is_empty());

Expand Down Expand Up @@ -582,7 +582,7 @@ fn can_build_site_with_pagination_for_taxonomy() {
"tags/a/page/1/index.html",
"http-equiv=\"refresh\" content=\"0; url=https://replace-this-with-your-url.com/tags/a/\""
));
assert!(file_contains!(public, "tags/a/index.html", "Num pagers: 6"));
assert!(file_contains!(public, "tags/a/index.html", "Num pagers: 8"));
assert!(file_contains!(public, "tags/a/index.html", "Page size: 2"));
assert!(file_contains!(public, "tags/a/index.html", "Current index: 1"));
assert!(!file_contains!(public, "tags/a/index.html", "has_prev"));
Expand All @@ -595,15 +595,15 @@ fn can_build_site_with_pagination_for_taxonomy() {
assert!(file_contains!(
public,
"tags/a/index.html",
"Last: https://replace-this-with-your-url.com/tags/a/page/6/"
"Last: https://replace-this-with-your-url.com/tags/a/page/8/"
));
assert_eq!(file_contains!(public, "tags/a/index.html", "has_prev"), false);

// sitemap contains the pager pages
assert!(file_contains!(
public,
"sitemap.xml",
"<loc>https://replace-this-with-your-url.com/tags/a/page/6/</loc>"
"<loc>https://replace-this-with-your-url.com/tags/a/page/8/</loc>"
));

// current_path
Expand Down Expand Up @@ -721,7 +721,11 @@ fn can_build_site_with_html_minified() {

assert!(&public.exists());
assert!(file_exists!(public, "index.html"));
assert!(file_contains!(public, "index.html", "<!DOCTYPE html><html lang=en><head><meta charset=UTF-8>"));
assert!(file_contains!(
public,
"index.html",
"<!DOCTYPE html><html lang=en><head><meta charset=UTF-8>"
));
}

#[test]
Expand Down
3 changes: 3 additions & 0 deletions docs/content/documentation/content/section.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ This will be sort all pages by their `weight` field, from lightest weight
page gets `page.lighter` and `page.heavier` variables that contain the
pages with lighter and heavier weights, respectively.

### Reversed sorting
When iterating through pages, you may wish to use the Tera `reverse` filter,
which reverses the order of the pages. For example, after using the `reverse` filter,
pages sorted by weight will be sorted from lightest (at the top) to heaviest
Expand All @@ -164,6 +165,8 @@ to newest (at the bottom).

`reverse` has no effect on `page.later`/`page.earlier` or `page.heavier`/`page.lighter`.

If the section is paginated the `paginate_reversed=true` in the front matter of the relevant section should be set instead of using the filter.

## Sorting subsections
Sorting sections is a bit less flexible: sections can only be sorted by `weight`,
and do not have variables that point to the heavier/lighter sections.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,6 @@ include_content = true
# become too big to load on the site. Defaults to not being set.
# truncate_content_length = 100


# Optional translation object. Keys should be language codes.
# Optional translation object. The key if present should be a language code.
# Example:
Expand Down
4 changes: 4 additions & 0 deletions test_site/content/reverse-paginated/1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
+++
title="Page number: 1"
weight=1
+++
4 changes: 4 additions & 0 deletions test_site/content/reverse-paginated/2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
+++
title="Page number: 2"
weight=2
+++
4 changes: 4 additions & 0 deletions test_site/content/reverse-paginated/3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
+++
title="Page number: 3"
weight=3
+++
4 changes: 4 additions & 0 deletions test_site/content/reverse-paginated/4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
+++
title="Page number: 4"
weight=4
+++
4 changes: 4 additions & 0 deletions test_site/content/reverse-paginated/5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
+++
title="Page number: 5"
weight=5
+++
Loading