From 81c90758b5869911985f032bc339379e8344fa5f Mon Sep 17 00:00:00 2001 From: Nami Sunami Date: Mon, 8 Dec 2025 23:01:03 +0100 Subject: [PATCH 1/3] feat: use Atom feed --- content/feed/feed.11tydata.js | 3 -- content/feed/feed.njk | 33 ------------ content/feed/json.njk | 29 ---------- content/feed/pretty-atom-feed.xsl | 89 +++++++++++++++++++++++++++++++ eleventy.config.mjs | 37 ++++++++++++- package-lock.json | 72 ++++++++----------------- package.json | 2 +- 7 files changed, 147 insertions(+), 118 deletions(-) delete mode 100644 content/feed/feed.11tydata.js delete mode 100755 content/feed/feed.njk delete mode 100644 content/feed/json.njk create mode 100644 content/feed/pretty-atom-feed.xsl diff --git a/content/feed/feed.11tydata.js b/content/feed/feed.11tydata.js deleted file mode 100644 index 7506a15..0000000 --- a/content/feed/feed.11tydata.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - eleventyExcludeFromCollections: true, -}; diff --git a/content/feed/feed.njk b/content/feed/feed.njk deleted file mode 100755 index fda31df..0000000 --- a/content/feed/feed.njk +++ /dev/null @@ -1,33 +0,0 @@ ---- -# Metadata comes from _data/metadata.js -permalink: /feed/feed.xml ---- - - - - {{ metadata.title }} - {{ metadata.description }} - - - {{ - collections.posts | getNewestCollectionItemDate | dateToRfc3339 - }} - {{ metadata.url }} - - {{ metadata.author.name }} - {{ metadata.author.email }} - - {%- for post in collections.posts | reverse %} {% set absolutePostUrl %}{{ post.url | htmlBaseUrl(metadata.url) - }}{% endset %} - - {{ post.data.title }} - - {{ post.date | dateToRfc3339 }} - {{ absolutePostUrl }} - {{ post.templateContent | transformWithHtmlBase(absolutePostUrl, post.url) }} - - {%- endfor %} - diff --git a/content/feed/json.njk b/content/feed/json.njk deleted file mode 100644 index 3b33b59..0000000 --- a/content/feed/json.njk +++ /dev/null @@ -1,29 +0,0 @@ ---- -# Metadata comes from _data/metadata.js -permalink: /feed/feed.json ---- -{ - "version": "https://jsonfeed.org/version/1.1", - "title": "{{ metadata.title }}", - "language": "{{ metadata.language }}", - "home_page_url": "{{ metadata.url | addPathPrefixToFullUrl }}", - "feed_url": "{{ permalink | htmlBaseUrl(metadata.url) }}", - "description": "{{ metadata.description }}", - "author": { - "name": "{{ metadata.author.name }}", - "url": "{{ metadata.author.url }}" - }, - "items": [ - {%- for post in collections.posts | reverse %} - {%- set absolutePostUrl = post.url | htmlBaseUrl(metadata.url) %} - { - "id": "{{ absolutePostUrl }}", - "url": "{{ absolutePostUrl }}", - "title": "{{ post.data.title }}", - "content_html": {% if post.templateContent %}{{ post.templateContent | transformWithHtmlBase(absolutePostUrl, post.url) | dump | safe }}{% else %}""{% endif %}, - "date_published": "{{ post.date | dateToRfc3339 }}" - } - {% if not loop.last %},{% endif %} - {%- endfor %} - ] -} diff --git a/content/feed/pretty-atom-feed.xsl b/content/feed/pretty-atom-feed.xsl new file mode 100644 index 0000000..6331549 --- /dev/null +++ b/content/feed/pretty-atom-feed.xsl @@ -0,0 +1,89 @@ + + + + + + + + <xsl:value-of select="atom:feed/atom:title"/> + + + + + + +
+
+

+ + + + + + + + + + + + + + + + + + + Web Feed Preview +

+

+

+

This preview only shows titles, but the actual feed contains the full content.

+ + + + + Visit Website → + +
+

Recent Items

+ +
+ + +
+ +
+

+ + + + + + +

+ + Published: + +
+
+
\ No newline at end of file diff --git a/eleventy.config.mjs b/eleventy.config.mjs index c6e0475..51e87e8 100644 --- a/eleventy.config.mjs +++ b/eleventy.config.mjs @@ -1,7 +1,7 @@ import { DateTime } from "luxon"; import markdownItAnchor from "markdown-it-anchor"; -import pluginRss from "@11ty/eleventy-plugin-rss"; +import { feedPlugin } from "@11ty/eleventy-plugin-rss"; import pluginSyntaxHighlight from "@11ty/eleventy-plugin-syntaxhighlight"; import pluginBundle from "@11ty/eleventy-plugin-bundle"; import pluginNavigation from "@11ty/eleventy-navigation"; @@ -29,7 +29,6 @@ export default function (eleventyConfig) { eleventyConfig.addPlugin(pluginDrafts); // Official plugins - eleventyConfig.addPlugin(pluginRss); eleventyConfig.addPlugin(pluginSyntaxHighlight, { preAttributes: { tabindex: 0 }, }); @@ -116,6 +115,40 @@ export default function (eleventyConfig) { // eleventyConfig.setServerPassthroughCopyBehavior("passthrough"); + // Feed plugin + eleventyConfig.addPlugin(feedPlugin, { + type: "atom", // or "rss", "json" + outputPath: "/feed/feed.xml", + stylesheet: "pretty-atom-feed.xsl", + templateData: { + eleventyNavigation: { + key: "Feed", + order: 4, + }, + }, + collection: { + name: "posts", + limit: 10, + }, + metadata: { + language: "en", + title: "Nami Writes", + subtitle: "Nami's blog", + base: "https://blog.namisunami.com/", + author: { + name: "Nami Sunami", + }, + }, + }); + + // Copy the contents of the `public` folder to the output folder + // For example, `./public/css/` ends up in `_site/css/` + eleventyConfig + .addPassthroughCopy({ + "./public/": "/", + }) + .addPassthroughCopy("./content/feed/pretty-atom-feed.xsl"); + return { // Control which files Eleventy will process // e.g.: *.md, *.njk, *.html, *.liquid diff --git a/package-lock.json b/package-lock.json index fbe30f4..8cdaf40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@11ty/eleventy-img": "^6.0.1", "@11ty/eleventy-navigation": "^0.3.5", "@11ty/eleventy-plugin-bundle": "^1.0.4", - "@11ty/eleventy-plugin-rss": "^1.2.0", + "@11ty/eleventy-plugin-rss": "^2.0.4", "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0", "luxon": "^3.3.0", "markdown-it-anchor": "^8.6.7" @@ -262,15 +262,30 @@ } }, "node_modules/@11ty/eleventy-plugin-rss": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-rss/-/eleventy-plugin-rss-1.2.0.tgz", - "integrity": "sha512-YzFnSH/5pObcFnqZ2sAQ782WmpOZHj1+xB9ydY/0j7BZ2jUNahn53VmwCB/sBRwXA/Fbwwj90q1MLo01Ru0UaQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-rss/-/eleventy-plugin-rss-2.0.4.tgz", + "integrity": "sha512-LF60sGVlxGTryQe3hTifuzrwF8R7XbrNsM2xfcDcNMSliLN4kmB+7zvoLRySRx0AQDjqhPTAeeeT0ra6/9zHUQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.4", - "posthtml": "^0.16.6", - "posthtml-urls": "1.0.0" + "@11ty/eleventy-utils": "^2.0.0", + "@11ty/posthtml-urls": "^1.0.1", + "debug": "^4.4.0", + "posthtml": "^0.16.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-plugin-rss/node_modules/@11ty/eleventy-utils": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-2.0.7.tgz", + "integrity": "sha512-6QE+duqSQ0GY9rENXYb4iPR4AYGdrFpqnmi59tFp9VrleOl0QSh8VlBr2yd6dlhkdtj7904poZW5PvGr9cMiJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { "type": "opencollective", @@ -972,13 +987,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", - "integrity": "sha512-lqzY9o+BbeGHRCOyxQkt/Tgvz0IZhTmQiA+LxQW8wSNpcTbj8K+0cZiSEvbpNZZP9/11Gy7dnLO3GNWUXO4d1g==", - "dev": true, - "license": "MIT" - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -2668,32 +2676,6 @@ "node": ">=12" } }, - "node_modules/posthtml-urls": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/posthtml-urls/-/posthtml-urls-1.0.0.tgz", - "integrity": "sha512-CMJ0L009sGQVUuYM/g6WJdscsq6ooAwhUuF6CDlYPMLxKp2rmCYVebEU+wZGxnQstGJhZPMvXsRhtqekILd5/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "http-equiv-refresh": "^1.0.0", - "list-to-array": "^1.1.0", - "parse-srcset": "^1.0.2", - "promise-each": "^2.2.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/posthtml-urls/node_modules/http-equiv-refresh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-equiv-refresh/-/http-equiv-refresh-1.0.0.tgz", - "integrity": "sha512-TScO04soylRN9i/QdOdgZyhydXg9z6XdaGzEyOgDKycePeDeTT4KvigjBcI+tgfTlieLWauGORMq5F1eIDa+1w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/prismjs": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", @@ -2714,16 +2696,6 @@ "asap": "~2.0.3" } }, - "node_modules/promise-each": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/promise-each/-/promise-each-2.2.0.tgz", - "integrity": "sha512-67roqt1k3QDA41DZ8xi0V+rF3GoaMiX7QilbXu0vXimut+9RcKBNZ/t60xCRgcsihmNUsEjh48xLfNqOrKblUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^0.1.0" - } - }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", diff --git a/package.json b/package.json index a4f1eb3..224255f 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@11ty/eleventy-img": "^6.0.1", "@11ty/eleventy-navigation": "^0.3.5", "@11ty/eleventy-plugin-bundle": "^1.0.4", - "@11ty/eleventy-plugin-rss": "^1.2.0", + "@11ty/eleventy-plugin-rss": "^2.0.4", "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0", "luxon": "^3.3.0", "markdown-it-anchor": "^8.6.7" From eeabadb42158c6d84a325d214c4548f2d384cb05 Mon Sep 17 00:00:00 2001 From: Nami Sunami Date: Mon, 8 Dec 2025 23:03:39 +0100 Subject: [PATCH 2/3] fix: use ES6 module syntax instead of CommonJS --- content/blog/blog.11tydata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/blog.11tydata.js b/content/blog/blog.11tydata.js index 3144fc8..3cd36cb 100644 --- a/content/blog/blog.11tydata.js +++ b/content/blog/blog.11tydata.js @@ -1,4 +1,4 @@ -module.exports = { +export default { tags: ["posts"], layout: "layouts/post.njk", }; From 9f21ba14714ec05a192cc77a79675824c0ed6ad9 Mon Sep 17 00:00:00 2001 From: Nami Sunami Date: Mon, 8 Dec 2025 23:05:08 +0100 Subject: [PATCH 3/3] fix: update to ES6 syntax from commonJS --- _data/metadata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/metadata.js b/_data/metadata.js index 1401f19..a7be0dd 100644 --- a/_data/metadata.js +++ b/_data/metadata.js @@ -1,4 +1,4 @@ -module.exports = { +export default { title: "Nami Writes - Nami's Blog", url: "https://blog.namisunami.com/", language: "en",