Skip to content

Commit db7b891

Browse files
committed
Merge branch 'v.0.46.4'
2 parents f2b3a31 + 0d376e7 commit db7b891

File tree

41 files changed

+1635
-582
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1635
-582
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
[Publii](https://getpublii.com/) is a desktop-based CMS for Windows, Mac and Linux that makes creating static websites fast
1010
and hassle-free, even for beginners.
1111

12-
**Current version: 0.46.3 (build 17008)**
12+
**Current version: 0.46.4 (build 17037)**
1313

1414
## Why Publii?
1515
Unlike static-site generators that are often unwieldy and difficult to use, Publii provides an
@@ -82,4 +82,4 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
8282

8383

8484
## License
85-
Copyright (c) 2024 TidyCustoms. General Public License v3.0, read [LICENSE](https://getpublii.com/license.html) for details.
85+
Copyright (c) 2025 TidyCustoms. General Public License v3.0, read [LICENSE](https://getpublii.com/license.html) for details.

app/back-end/builddata.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
"version": "0.46.3",
3-
"build": 17009
2+
"version": "0.46.4",
3+
"build": 17037
44
}

app/back-end/modules/backup/backup.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class Backup {
4040

4141
let stats = fs.statSync(path.join(backupsPath, file));
4242
let size = Backup.convertToMegabytes(stats.size);
43-
let createdAt = stats.atime;
43+
let createdAt = stats.birthtime || stats.mtime;
4444

4545
files.push({
4646
id: index,

app/back-end/modules/render-html/handlebars/helpers/feed-link.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,32 @@ function feedLink() {
1111
let output = '';
1212

1313
if (!this.siteConfig.deployment || !this.siteConfig.deployment.relativeUrls) {
14+
let feedTitle = this.siteConfig.displayName;
15+
16+
if (
17+
this.siteConfig.advanced &&
18+
this.siteConfig.advanced.feed &&
19+
this.siteConfig.advanced.feed.title === 'customTitle'
20+
) {
21+
feedTitle = this.siteConfig.advanced.feed.titleValue;
22+
}
23+
24+
let rssFeedTitle = '';
25+
let jsonFeedTitle = '';
26+
27+
if (feedTitle) {
28+
rssFeedTitle = 'title="' + Handlebars.Utils.escapeExpression(feedTitle) + ' - RSS"';
29+
jsonFeedTitle = 'title="' + Handlebars.Utils.escapeExpression(feedTitle) + ' - JSON"';
30+
}
31+
1432
if (this.siteConfig.advanced.feed.enableRss) {
1533
let rssUrl = Handlebars.Utils.escapeExpression(this.siteConfig.domain + '/feed.xml');
16-
output += '<link rel="alternate" type="application/atom+xml" href="' + rssUrl + '" />' + "\n";
34+
output += '<link rel="alternate" type="application/atom+xml" href="' + rssUrl + '" ' + rssFeedTitle + ' />' + "\n";
1735
}
1836

1937
if (this.siteConfig.advanced.feed.enableJson) {
2038
let jsonUrl = Handlebars.Utils.escapeExpression(this.siteConfig.domain + '/feed.json');
21-
output += '<link rel="alternate" type="application/json" href="' + jsonUrl + '" />' + "\n";
39+
output += '<link rel="alternate" type="application/json" href="' + jsonUrl + '" ' + jsonFeedTitle + ' />' + "\n";
2240
}
2341
}
2442

app/back-end/modules/render-html/handlebars/helpers/menu-url.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const slug = require('./../../../../helpers/slug');
1111
* - page
1212
* - tag
1313
* - frontpage
14+
* - blogpage
1415
* - tags
1516
* - external
1617
* - internal
@@ -145,7 +146,7 @@ function menuURLHelper(rendererInstance, Handlebars) {
145146
if (this.type === 'blogpage') {
146147
output = baseUrl + '/';
147148

148-
if (rendererInstance.siteConfig.advanced.usePageAsFrontpage && rendererInstance.siteConfig.advanced.urls.postsPrefix) {
149+
if (rendererInstance.siteConfig.advanced.urls.postsPrefix) {
149150
output = baseUrl + '/' + rendererInstance.siteConfig.advanced.urls.postsPrefix + '/';
150151
}
151152

app/back-end/modules/render-html/helpers/content.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,6 @@ class ContentHelper {
621621
if (renderer.cachedItems.authors[authorID].username === authorSlug) {
622622
let link = renderer.cachedItems.authors[authorID].url;
623623
text = text.split(url).join(link);
624-
return text;
625624
}
626625
}
627626
}

app/back-end/modules/render-html/helpers/sitemap.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -747,7 +747,7 @@ class Sitemap {
747747
}
748748

749749
this.outputXML += '<url>' + "\n";
750-
this.outputXML += '<loc>' + domain + url.replace(/index\.html$/, '') + '</loc>' + "\n";
750+
this.outputXML += '<loc>' + (domain + url.replace(/index\.html$/, '')).replace(/\\/gmi, '/') + '</loc>' + "\n";
751751

752752
if (lastMod) {
753753
this.outputXML += '<lastmod>' + lastMod + '</lastmod>' + "\n";
@@ -760,7 +760,7 @@ class Sitemap {
760760
}
761761

762762
this.outputXML += '<image:image>' + "\n";
763-
this.outputXML += '<image:loc>' + images[i].url + '</image:loc>' + "\n";
763+
this.outputXML += '<image:loc>' + (images[i].url).replace(/\\/gmi, '/') + '</image:loc>' + "\n";
764764
this.outputXML += '<image:title><![CDATA[' + images[i].alt + ']]></image:title>' + "\n";
765765
this.outputXML += '</image:image>' + "\n";
766766
}

app/back-end/modules/render-html/items/page.js

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,8 @@ class PageItem {
4444
}
4545

4646
prepareData() {
47-
let pageURL = this.siteConfig.domain + '/' + this.page.slug + '.html';
4847
let preparedText = ContentHelper.prepareContent(this.page.id, this.page.text, this.siteConfig.domain, this.themeConfig, this.renderer, this.metaData.editor);
4948
let preparedExcerpt = ContentHelper.prepareExcerpt(this.themeConfig.config.excerptLength, preparedText);
50-
preparedExcerpt = ContentHelper.setInternalLinks(preparedExcerpt, this.renderer);
5149
let hasCustomExcerpt = false;
5250
let readmoreMatches = preparedText.match(/\<hr\s+id=["']{1}read-more["']{1}[\s\S]*?\/?\>/gmi);
5351

@@ -63,36 +61,11 @@ class PageItem {
6361
}
6462
}
6563

66-
if (this.siteConfig.advanced.urls.cleanUrls) {
67-
let parentItems = this.renderer.cachedItems.pagesStructureHierarchy[this.page.id];
68-
let pageSlug = this.page.slug;
69-
70-
if (this.renderer.siteConfig.advanced.urls.cleanUrls && parentItems && parentItems.length) {
71-
let slugs = [];
72-
73-
for (let i = 0; i < parentItems.length; i++) {
74-
if (this.renderer.cachedItems.pages[parentItems[i]]) {
75-
slugs.push(this.renderer.cachedItems.pages[parentItems[i]].slug);
76-
}
77-
}
78-
79-
slugs.push(this.page.slug);
80-
pageSlug = slugs.join('/');
81-
}
82-
83-
pageURL = this.siteConfig.domain + '/' + pageSlug + '/';
84-
85-
if (this.renderer.previewMode || this.renderer.siteConfig.advanced.urls.addIndex) {
86-
pageURL += 'index.html';
87-
}
88-
}
89-
9064
this.pageData = {
9165
id: this.page.id,
9266
title: this.page.title,
9367
author: this.renderer.cachedItems.authors[this.page.authors],
9468
slug: this.page.slug,
95-
url: pageURL,
9669
text: preparedText,
9770
excerpt: preparedExcerpt,
9871
createdAt: this.page.created_at,
@@ -106,14 +79,6 @@ class PageItem {
10679
subpages: this.subpages
10780
};
10881

109-
if (this.siteConfig.advanced.usePageAsFrontpage && this.siteConfig.advanced.pageAsFrontpage === this.page.id) {
110-
this.pageData.url = this.siteConfig.domain + '/';
111-
112-
if (this.renderer.previewMode || this.renderer.siteConfig.advanced.urls.addIndex) {
113-
this.pageData.url += 'index.html';
114-
}
115-
}
116-
11782
if (this.pageData.template === '*') {
11883
this.pageData.template = this.themeConfig.defaultTemplates.page;
11984
}
@@ -147,7 +112,47 @@ class PageItem {
147112

148113
setInternalLinks() {
149114
let pageText = this.renderer.cachedItems.pages[this.pageID].text;
115+
let pageExcerpt = this.renderer.cachedItems.pages[this.pageID].excerpt;
150116
this.renderer.cachedItems.pages[this.pageID].text = ContentHelper.setInternalLinks(pageText, this.renderer);
117+
this.renderer.cachedItems.pages[this.pageID].excerpt = ContentHelper.setInternalLinks(pageExcerpt, this.renderer);
118+
}
119+
120+
setHierarchyLinks() {
121+
let pageURL = this.siteConfig.domain + '/' + this.page.slug + '.html';
122+
123+
if (this.siteConfig.advanced.urls.cleanUrls) {
124+
let parentItems = this.renderer.cachedItems.pagesStructureHierarchy[this.page.id];
125+
let pageSlug = this.page.slug;
126+
127+
if (this.renderer.siteConfig.advanced.urls.cleanUrls && parentItems && parentItems.length) {
128+
let slugs = [];
129+
130+
for (let i = 0; i < parentItems.length; i++) {
131+
if (this.renderer.cachedItems.pages[parentItems[i]]) {
132+
slugs.push(this.renderer.cachedItems.pages[parentItems[i]].slug);
133+
}
134+
}
135+
136+
slugs.push(this.page.slug);
137+
pageSlug = slugs.join('/');
138+
}
139+
140+
pageURL = this.siteConfig.domain + '/' + pageSlug + '/';
141+
142+
if (this.renderer.previewMode || this.renderer.siteConfig.advanced.urls.addIndex) {
143+
pageURL += 'index.html';
144+
}
145+
}
146+
147+
if (this.siteConfig.advanced.usePageAsFrontpage && this.siteConfig.advanced.pageAsFrontpage === this.page.id) {
148+
pageURL = this.siteConfig.domain + '/';
149+
150+
if (this.renderer.previewMode || this.renderer.siteConfig.advanced.urls.addIndex) {
151+
pageURL += 'index.html';
152+
}
153+
}
154+
155+
this.renderer.cachedItems.pages[this.pageID].url = pageURL;
151156
}
152157

153158
setPageViewConfig(config) {

app/back-end/modules/render-html/items/post.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ class PostItem {
5151

5252
let preparedText = ContentHelper.prepareContent(this.post.id, this.post.text, this.siteConfig.domain, this.themeConfig, this.renderer, this.metaData.editor);
5353
let preparedExcerpt = ContentHelper.prepareExcerpt(this.themeConfig.config.excerptLength, preparedText);
54-
preparedExcerpt = ContentHelper.setInternalLinks(preparedExcerpt, this.renderer);
5554
let hasCustomExcerpt = false;
5655
let readmoreMatches = preparedText.match(/\<hr\s+id=["']{1}read-more["']{1}[\s\S]*?\/?\>/gmi);
5756

@@ -167,7 +166,9 @@ class PostItem {
167166

168167
setInternalLinks() {
169168
let postText = this.renderer.cachedItems.posts[this.postID].text;
169+
let postExcerpt = this.renderer.cachedItems.posts[this.postID].excerpt;
170170
this.renderer.cachedItems.posts[this.postID].text = ContentHelper.setInternalLinks(postText, this.renderer);
171+
this.renderer.cachedItems.posts[this.postID].excerpt = ContentHelper.setInternalLinks(postExcerpt, this.renderer);
171172
}
172173

173174
setPostViewConfig(config) {

app/back-end/modules/render-html/renderer-cache.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,7 @@ class RendererCache {
606606

607607
pages.map(page => {
608608
page.setInternalLinks();
609+
page.setHierarchyLinks();
609610
});
610611

611612
let authorIDs = Object.keys(this.renderer.cachedItems.authors);

0 commit comments

Comments
 (0)