From b56e9463553c5a1b39f2254ea16c4f5f780d5df6 Mon Sep 17 00:00:00 2001 From: David Arcos Date: Mon, 5 Oct 2026 23:02:30 +0200 Subject: [PATCH 1/9] Render the sitemap and the feeds as readable pages in a browser /sitemap.xml and the RSS feeds are the machine-facing pages a person opens, usually while debugging, and a browser showed them as raw XML. Add static/sitemap.xsl and static/rss.xsl, two XSLT 1.0 stylesheets (the version browsers implement) that render the XML as a heading, a count, and a table, newest first. They are written as one pair: the same heading shape ("PyBCN sitemap", "PyBCN feed", "PyBCN feed: Events" for a section feed, taken from the part of the channel title before " on "), the same intro sentence, the same CSS block, the same column widths, and the same date form. The sitemap carries W3C datetimes and the feed carries RFC 822 dates, as each standard requires; both are shown as "2026-10-05 18:27 +02:00", which is string work with substring and a twelve-way choose for the month name, since XSLT 1.0 has no date function. The second column differs on purpose: a sitemap entry has only a URL, a feed item has a title. The CSS is inline and small, uses the site colours and font stack, and loads nothing from a third party. Both pages carry robots noindex. Add layouts/sitemap.xml and layouts/_default/rss.xml to override the Hugo internal templates. Each is a copy of the template that ships with Hugo 0.139.4 plus one line, the xml-stylesheet processing instruction after the XML declaration. Search engines and feed readers ignore the instruction and read the XML as before. Verified on the minified build against the previous commit: - sitemap.xml and the ten index.xml feeds are byte-identical apart from the processing instruction (11 files compared after stripping it). - sitemap.xml: 247 URLs before and after. - Chromium applies both stylesheets and shows the table instead of the XML tree, for /sitemap.xml, /index.xml, and /events/index.xml. --- layouts/_default/rss.xml | 60 +++++++++++++++++++ layouts/sitemap.xml | 25 ++++++++ static/rss.xsl | 122 +++++++++++++++++++++++++++++++++++++++ static/sitemap.xsl | 93 +++++++++++++++++++++++++++++ 4 files changed, 300 insertions(+) create mode 100644 layouts/_default/rss.xml create mode 100644 layouts/sitemap.xml create mode 100644 static/rss.xsl create mode 100644 static/sitemap.xsl diff --git a/layouts/_default/rss.xml b/layouts/_default/rss.xml new file mode 100644 index 00000000..8b2983e5 --- /dev/null +++ b/layouts/_default/rss.xml @@ -0,0 +1,60 @@ +{{- $authorEmail := "" }} +{{- with site.Params.author }} + {{- if reflect.IsMap . }} + {{- with .email }} + {{- $authorEmail = . }} + {{- end }} + {{- end }} +{{- end }} + +{{- $authorName := "" }} +{{- with site.Params.author }} + {{- if reflect.IsMap . }} + {{- with .name }} + {{- $authorName = . }} + {{- end }} + {{- else }} + {{- $authorName = . }} + {{- end }} +{{- end }} + +{{- $pctx := . }} +{{- if .IsHome }}{{ $pctx = .Site }}{{ end }} +{{- $pages := slice }} +{{- if or $.IsHome $.IsSection }} +{{- $pages = $pctx.RegularPages }} +{{- else }} +{{- $pages = $pctx.Pages }} +{{- end }} +{{- $limit := .Site.Config.Services.RSS.Limit }} +{{- if ge $limit 1 }} +{{- $pages = $pages | first $limit }} +{{- end }} +{{- printf "" | safeHTML }} +{{- printf "" | safeHTML }} + + + {{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ .Site.Title }}{{ end }} + {{ .Permalink }} + Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ .Site.Title }} + Hugo + {{ site.Language.LanguageCode }}{{ with $authorEmail }} + {{.}}{{ with $authorName }} ({{ . }}){{ end }}{{ end }}{{ with $authorEmail }} + {{ . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }}{{ with .Site.Copyright }} + {{ . }}{{ end }}{{ if not .Date.IsZero }} + {{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} + {{- with .OutputFormats.Get "RSS" }} + {{ printf "" .Permalink .MediaType | safeHTML }} + {{- end }} + {{- range $pages }} + + {{ .Title }} + {{ .Permalink }} + {{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{- with $authorEmail }}{{ . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }} + {{ .Permalink }} + {{ .Summary | transform.XMLEscape | safeHTML }} + + {{- end }} + + diff --git a/layouts/sitemap.xml b/layouts/sitemap.xml new file mode 100644 index 00000000..1877cec4 --- /dev/null +++ b/layouts/sitemap.xml @@ -0,0 +1,25 @@ +{{ printf "" | safeHTML }} +{{ printf "" | safeHTML }} + + {{ range where .Pages "Sitemap.Disable" "ne" true }} + {{- if .Permalink -}} + + {{ .Permalink }}{{ if not .Lastmod.IsZero }} + {{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}{{ end }}{{ with .Sitemap.ChangeFreq }} + {{ . }}{{ end }}{{ if ge .Sitemap.Priority 0.0 }} + {{ .Sitemap.Priority }}{{ end }}{{ if .IsTranslated }}{{ range .Translations }} + {{ end }} + {{ end }} + + {{- end -}} + {{ end }} + diff --git a/static/rss.xsl b/static/rss.xsl new file mode 100644 index 00000000..9f1cac2b --- /dev/null +++ b/static/rss.xsl @@ -0,0 +1,122 @@ + + + + + + + + + + + PyBCN feed + + + + + + + + + + + + - + + 01 + 02 + 03 + 04 + 05 + 06 + 07 + 08 + 09 + 10 + 11 + 12 + ?? + + + + + + + + + + + + <xsl:value-of select="$heading"/> + + + + +

+
+

+ + + entry + entries + , most recently changed first. + Feed readers read the XML behind this page; a browser shows it as a table. + The feed covers . +

+ + + + + + + + + + + + + + + + + +
#TitlePublished
+ + + + + +
+
+ + +
+ +
diff --git a/static/sitemap.xsl b/static/sitemap.xsl new file mode 100644 index 00000000..89070e4e --- /dev/null +++ b/static/sitemap.xsl @@ -0,0 +1,93 @@ + + + + + + + PyBCN sitemap + + + + + + + + + + + + + + + + + <xsl:value-of select="$heading"/> + + + + +

+
+

+ + + URL + URLs + , most recently changed first. + Search engines read the XML behind this page; a browser shows it as a table. +

+ + + + + + + + + + + + + + + + + + +
#URLLast modified
+ + + + + +
+
+ + +
+ +
From 62473eb288af78958300a2e18706c4ef0c862935 Mon Sep 17 00:00:00 2001 From: David Arcos Date: Mon, 5 Oct 2026 23:03:48 +0200 Subject: [PATCH 2/9] Date and order the feed items by their last change Every item of every feed was dated Mon, 01 Jan 0001, and the items came out in title order. No content file carries a date in its front matter, so .Date and .PublishDate are zero on every page. .Lastmod is not zero: enableGitInfo is on, so it resolves to the date of the last commit that touched the file, which is what the sitemap already prints as lastmod. The feed template now sorts the items by .Lastmod, newest first, and prints .Lastmod as the pubDate. It is a modification date, not a publication date, and the feed should be read as "what changed recently" rather than "what is new". The real publication date is not in git either: 17 person files share 2020-12-03 and 19 share 2023-05-25, because those were bulk imports, and a renamed file reports the date of the rename unless the history is followed. A date worth the name comes from the events a person spoke at, which is Archive work. A [frontmatter] block that lets .Date fall back to :git was tried first and rejected: it makes .PublishDate non-zero on every page, so the Open Graph template adds article:published_time with a last-commit date to every HTML page, and the sitemap reorders because the default page sort uses .Date. Reading .Lastmod in the feed template changes nothing else. Verified on the minified build against the previous commit: - 0 pubDate elements dated 0001 across the ten feeds (was 237 in /index.xml alone). - The first four items of /index.xml are dated 05 Oct, 04 Oct, 04 Oct, and 02 Oct 2026, in that order. - diff -rq between the two builds lists only the ten index.xml files. --- layouts/_default/rss.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/layouts/_default/rss.xml b/layouts/_default/rss.xml index 8b2983e5..2eb00fee 100644 --- a/layouts/_default/rss.xml +++ b/layouts/_default/rss.xml @@ -26,6 +26,11 @@ {{- else }} {{- $pages = $pctx.Pages }} {{- end }} +{{- /* No content file carries a date, so .Date and .PublishDate are zero and the + default order is by title. .Lastmod comes from git (enableGitInfo), the same + source as the sitemap's lastmod: last change first, and the item date is the + date of the last commit that touched the file. */ -}} +{{- $pages = $pages.ByLastmod.Reverse }} {{- $limit := .Site.Config.Services.RSS.Limit }} {{- if ge $limit 1 }} {{- $pages = $pages | first $limit }} @@ -50,7 +55,7 @@ {{ .Title }} {{ .Permalink }} - {{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{ .Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} {{- with $authorEmail }}{{ . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }} {{ .Permalink }} {{ .Summary | transform.XMLEscape | safeHTML }} From cf6402d90579fb72d0457fd1c84ed4ab25c5b30f Mon Sep 17 00:00:00 2001 From: David Arcos Date: Mon, 5 Oct 2026 23:04:22 +0200 Subject: [PATCH 3/9] Keep one feed, at /index.xml, and drop the nine section feeds Hugo builds an RSS feed for every section by default, so the site had ten: /index.xml and one per section. Nine of them are a by-product that nobody asked for and nothing reaches: /contact/index.xml had zero items, /people/index.xml had 138 items with an empty title (those files carry name, not title), /sponsors/index.xml had 68 of the same, and the other six repeated a subset of the home feed. The only link to each one was the rel=alternate in the head of its own section page. One feed is a simple way to see which pages have changed, and the home feed already carries every regular page of the site, so it is the one that stays. section = ["HTML"] under [outputs] drops the other nine. Verified on the minified build against the previous commit: - find -name '*.xml' lists two files: index.xml and sitemap.xml (was eleven). - grep -rlo 'rel=alternate' --include=index.html lists only the home page (was ten pages). - diff -rq between the two builds lists the nine removed index.xml files and the nine section index.html files, each of which differs only by the removed link rel=alternate element. Nothing else moved. - sitemap.xml: 247 URLs before and after (feeds are not in it). --- config.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config.toml b/config.toml index 4d2a197a..f6feb19b 100644 --- a/config.toml +++ b/config.toml @@ -20,8 +20,14 @@ timeout = "300s" isPlainText = true notAlternative = true +# One feed for the whole site, /index.xml, and none per section. Hugo built +# one for every section by default: ten feeds, nine of them a by-product, +# from /contact/index.xml with zero items to /people/index.xml with 138 +# items and no titles. The home feed carries the same pages, so a section +# feed adds nothing a reader can use (#201). [outputs] home = ["HTML", "RSS", "llms"] + section = ["HTML"] [markup.goldmark.renderer] From 720a63b875ce34b3aac5518c580b15ffabca546a Mon Sep 17 00:00:00 2001 From: David Arcos Date: Mon, 5 Oct 2026 23:05:48 +0200 Subject: [PATCH 4/9] Stop publishing the people and sponsor pages Every file under content/people/ and content/sponsors/ exists to feed the grids and the modals through its front matter. Hugo also built a page from each one. No page on the site linked to any of them, and they were 206 of the 247 URLs in the sitemap (#201). The sponsor pages are empty: 67 of 68 have no body, the one exception has 125 characters. The person pages are not all empty: 73 of the 138 files carry a bio in the body, up to 1,647 characters, and it did render. They all stop, bio or not. Publishing only the people who happen to have a paragraph written about them would sort the organizers and speakers of this association into two classes, decided by whether a volunteer once had time to write it up. A site that lists everyone equally in the grids, and then gives a page to some of them and not to others, is worse than one that gives a page to nobody yet. The pages come back with the Archive, when every person has one worth linking to. Every content file stays exactly as it is: this is _build.render = "never", not a deletion. Two cascade blocks in config.toml set render = "never" on /people/, on every page under it, and on every page under /sponsors/. The default list = "always" is kept on purpose: people-grid.html and sponsors-grid.html look the pages up in site.Pages by id, and list = "local" takes them out of site.Pages, which is what emptied the organizers grid in an earlier attempt. A page that is not rendered has no permalink, so the feed template now skips pages without one; without that the home feed listed 206 items with neither a title nor a link. /people/ had nothing but a heading and goes with them. /sponsors/ stays: it is a real page, linked from the navigation of every page: 253 links on the live site when #201 was written, 44 anchors on 42 pages in this build. llms.txt and humans.txt no longer point at /people/ or claim one page per person or sponsor. Verified on the minified build against pr/8-photo-names: - sitemap.xml: 247 URLs before, 40 after. The 207 dropped are /people/, the 138 pages under it, and the 68 pages under /sponsors/. Nothing was added. - /index.xml: 237 items before, 31 after, none with an empty title or an empty link (was 206 of each). - /people/ is not built. /sponsors/ holds only index.html. - /pybcn_association/organizers/, /pyladies_bcn/organizers-and-speakers/, /events/pyday_bcn/pyday_bcn_2025/, and /events/pyday_bcn/pyday_bcn_2021/ are byte for byte identical to the pr/8-photo-names build. - /sponsors/ differs only by the removed link rel=alternate to its feed. - bin/check-content (0 errors), bin/check-rendered --without-canary, and bin/check-html-safety pass. --- config.toml | 30 +++++++++++++++++++++++ layouts/_default/rss.xml | 4 +++ static/humans.txt | 2 +- themes/pybcn_theme/layouts/index.llms.txt | 5 ++-- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/config.toml b/config.toml index f6feb19b..d16a15de 100644 --- a/config.toml +++ b/config.toml @@ -29,6 +29,36 @@ timeout = "300s" home = ["HTML", "RSS", "llms"] section = ["HTML"] +# Every file under content/people/ and content/sponsors/ feeds the grids and +# the modals through its front matter. Hugo also built a page from each one, +# with no inbound link anywhere on the site, and they were 206 of the 247 +# entries in the sitemap (#201). The sponsor pages are empty; 73 of the 138 +# person files carry a bio that did render. They all stop, bio or not: +# publishing only the people who happen to have a paragraph written about +# them would sort the organizers and speakers of this association into two +# classes. The pages come back with the Archive, when every person has one +# worth linking to. +# +# render = "never" stops the page and keeps the default list = "always", so +# the file stays in site.Pages, where people-grid.html and sponsors-grid.html +# look it up by id. list = "local" would take it out of site.Pages and empty +# every grid. A page that is not rendered has no permalink, which is how the +# feed template leaves it out (layouts/_default/rss.xml). +# +# /people/ had nothing but a heading and goes with them. /sponsors/ is a real +# page and stays. +[[cascade]] + [cascade._build] + render = "never" + [cascade._target] + path = "{/people,/people/**}" + +[[cascade]] + [cascade._build] + render = "never" + [cascade._target] + path = "/sponsors/*" + [markup.goldmark.renderer] unsafe=true diff --git a/layouts/_default/rss.xml b/layouts/_default/rss.xml index 2eb00fee..d4ac059b 100644 --- a/layouts/_default/rss.xml +++ b/layouts/_default/rss.xml @@ -30,6 +30,10 @@ default order is by title. .Lastmod comes from git (enableGitInfo), the same source as the sitemap's lastmod: last change first, and the item date is the date of the last commit that touched the file. */ -}} +{{- /* A page with _build.render = "never" stays in the collections (the people + and sponsor files feed the grids that way) but has no permalink. The feed + lists only pages a person can visit. */ -}} +{{- $pages = where $pages "Permalink" "ne" "" }} {{- $pages = $pages.ByLastmod.Reverse }} {{- $limit := .Site.Config.Services.RSS.Limit }} {{- if ge $limit 1 }} diff --git a/static/humans.txt b/static/humans.txt index 7c74c2df..131c88a7 100644 --- a/static/humans.txt +++ b/static/humans.txt @@ -15,7 +15,7 @@ The people are named on their own pages, which stay current: Organizers https://pybcn.org/pybcn_association/organizers/ PyLadies BCN https://pybcn.org/pyladies_bcn/organizers-and-speakers/ - Speakers https://pybcn.org/people/ + Speakers On the page of each event, https://pybcn.org/events/ /* THANKS */ diff --git a/themes/pybcn_theme/layouts/index.llms.txt b/themes/pybcn_theme/layouts/index.llms.txt index a9ea5cd1..9a07bb09 100644 --- a/themes/pybcn_theme/layouts/index.llms.txt +++ b/themes/pybcn_theme/layouts/index.llms.txt @@ -32,11 +32,10 @@ This file is generated from the site content on every build. {{- end }} ## People -One page for each speaker and organizer. {{ len (where site.RegularPages "Section" "people") }} pages, indexed at {{ "people/" | absURL }} +Organizers and speakers have no page of their own. The PyBCN organizers are listed at {{ "pybcn_association/organizers/" | absURL }}, the PyLadies BCN organizers at {{ "pyladies_bcn/organizers-and-speakers/" | absURL }}, and each event page lists its speakers. ## Sponsors -One page for each company, organization or university that supported an event. -{{ len (where site.RegularPages "Section" "sponsors") }} pages, indexed at {{ "sponsors/" | absURL }} +The companies, organizations, and universities that supported an event are listed at {{ "sponsors/" | absURL }}. Each event page lists its own sponsors. ## Archived sites {{ "archives/pybcn.org/" | absURL }} and {{ "archives/hacktoberfestbarcelona.com/" | absURL }} hold static mirrors of older PyBCN sites. They are history. Do not read them as current information. From 1606d0435db8e4b4c8c77debbaa4e6b059e2f238 Mon Sep 17 00:00:00 2001 From: David Arcos Date: Mon, 5 Oct 2026 22:41:52 +0200 Subject: [PATCH 5/9] Drop the two aliases that now point at nothing Both were added earlier today, when two person files were renamed, so that an external link to the old URL kept working. They redirected to the person page, which the previous commit stops publishing, so they now redirect to a page that is not built. The two old URLs return 404 from here on: /people/christian-adell-querol/ /people/kemalkan-bora/ A redirect to a page that does not exist is worse than a 404, and there is nowhere honest to send them instead: neither person has a page any more, and the organizers page does not list either of them, both being speakers rather than organizers. Verified: neither alias directory is built, and the content check still reports no errors. --- content/people/christian-adell.md | 2 -- content/people/kemalcan-bora.md | 2 -- 2 files changed, 4 deletions(-) diff --git a/content/people/christian-adell.md b/content/people/christian-adell.md index 0c65efee..90bd8c6d 100644 --- a/content/people/christian-adell.md +++ b/content/people/christian-adell.md @@ -1,7 +1,5 @@ --- id: christian-adell -aliases: - - /people/christian-adell-querol/ name: Christian Adell photo: christian-adell.jpg diff --git a/content/people/kemalcan-bora.md b/content/people/kemalcan-bora.md index 3592c9d6..00fa978a 100644 --- a/content/people/kemalcan-bora.md +++ b/content/people/kemalcan-bora.md @@ -1,7 +1,5 @@ --- id: kemalcan-bora -aliases: - - /people/kemalkan-bora/ name: "Kemalcan Bora" photo: "kemalcan-bora.jpg" linkedin: "https://www.linkedin.com/in/kemalcanbora/" From 38b6e8129ab1f1c8c867d180c291878952fb2d10 Mon Sep 17 00:00:00 2001 From: David Arcos Date: Mon, 5 Oct 2026 23:07:57 +0200 Subject: [PATCH 6/9] Link the feed and the sitemap from the footer and the head The feed and the sitemap are readable in a browser now, and nothing on the site pointed a person at either. The only reference to the feed was the link rel=alternate in the head of the home page. Footer: two icons after the social ones, fas fa-rss and fas fa-sitemap from the vendored Font Awesome 5.8.2, at fa-2x like their neighbours. They are not in params.social_items: those are accounts elsewhere, labelled "PyBCN on X", and they open a new tab. The feed and the sitemap are pages of this site, so each one has its own label ("RSS feed of PyBCN", "Sitemap of PyBCN", as aria-label and title) and opens in the same tab. They share the icon row so they get the same size, colour, and alignment as the icons next to them, with no new CSS. Head: every page advertises the site feed, site.Home.OutputFormats.Get "rss", instead of its own. Since the previous commits the home feed is the only one, so a section page had nothing to advertise, and a feed reader should find the feed from wherever the visitor is. Verified on the minified build against the previous commit: - Every page with a head carries one link rel=alternate, to https://pybcn.org/index.xml: 42 of the 77 index.html files, plus 404.html. The other 35 have no head partial: 9 alias redirects and 26 pages of the two static archive mirrors (was 1 page). - Chromium: the two icons render in the footer at 32px high, the same as the six social icons, on the same baseline; /index.xml and /sitemap.xml answer 200 with application/xml. - /pybcn_association/organizers/ differs from the previous build only by the head link and the two footer anchors. - bin/check-content, bin/check-rendered --without-canary, and bin/check-html-safety pass. --- themes/pybcn_theme/layouts/partials/footer.html | 8 ++++++++ themes/pybcn_theme/layouts/partials/head.html | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/themes/pybcn_theme/layouts/partials/footer.html b/themes/pybcn_theme/layouts/partials/footer.html index 69d4a513..8cff3caa 100644 --- a/themes/pybcn_theme/layouts/partials/footer.html +++ b/themes/pybcn_theme/layouts/partials/footer.html @@ -13,6 +13,14 @@ {{ range $.Site.Params.social_items }} {{ end }} + {{/* The feed and the sitemap are pages of this site, not accounts + elsewhere, so they are not in social_items and do not open a + new tab. They share the icon row so they get the same size, + colour, and alignment as the icons next to them. */}} + {{ with site.Home.OutputFormats.Get "rss" }} + + {{ end }} + diff --git a/themes/pybcn_theme/layouts/partials/head.html b/themes/pybcn_theme/layouts/partials/head.html index 9319e2df..1fa4c79a 100644 --- a/themes/pybcn_theme/layouts/partials/head.html +++ b/themes/pybcn_theme/layouts/partials/head.html @@ -31,7 +31,9 @@ {{ "" | safeHTML }} - {{ with .OutputFormats.Get "rss" -}} + {{/* The site has one feed, /index.xml. Every page advertises it, so a feed + reader finds it from wherever the visitor is, not only from the home. */}} + {{ with site.Home.OutputFormats.Get "rss" -}} {{ end -}} From e4bbdb3047dbcad07f19c0f116f16a2f003e8625 Mon Sep 17 00:00:00 2001 From: David Arcos Date: Mon, 5 Oct 2026 23:47:56 +0200 Subject: [PATCH 7/9] Say in rss.xsl that the site has one feed The header of the stylesheet still said it serves /index.xml and the index.xml of each section. The section feeds are gone since the commit that set section = ["HTML"], so the sentence was no longer true. The section heading logic stays, for a feed that may come back. --- static/rss.xsl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/static/rss.xsl b/static/rss.xsl index 9f1cac2b..b2042f65 100644 --- a/static/rss.xsl +++ b/static/rss.xsl @@ -4,7 +4,8 @@ A feed reader ignores this stylesheet and reads the XML directly. XSLT 1.0 only: that is what browsers implement. Pairs with sitemap.xsl: same heading shape, same intro, same CSS, same date form. - Serves every feed: /index.xml and the index.xml of each section. + Serves /index.xml, the only feed of the site. A section feed, if one is ever + built again, gets its section name in the heading. --> From e7461efb9db68f4b6d575f1e2121e931db53dc5c Mon Sep 17 00:00:00 2001 From: David Arcos Date: Mon, 5 Oct 2026 23:47:56 +0200 Subject: [PATCH 8/9] Show the link of a feed item that has no title The feed table wrote the title of each item as the text of its link. An item with an empty title gave an anchor with no text: nothing to see and nothing for a screen reader to announce. No item of the site feed is in that state since the feed filters out the pages that are not rendered, but a content file that carries name instead of title would put one there again. Such a row now shows the link itself. --- static/rss.xsl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/static/rss.xsl b/static/rss.xsl index b2042f65..e6a9c710 100644 --- a/static/rss.xsl +++ b/static/rss.xsl @@ -104,7 +104,13 @@ - + + + + + + + From 71ed7e4fc0a08d142463026c76d862adcbfbc976 Mon Sep 17 00:00:00 2001 From: David Arcos Date: Tue, 6 Oct 2026 00:09:10 +0200 Subject: [PATCH 9/9] Head the sitemap and the feed with the association logo Both pages carried a title and nothing else, so a person who landed on one had no way back to the site and nothing saying whose site it was. They now open with the logo and the title, and the whole block links to the home page. The logo is the one in assets, processed by Hugo like every other image on the site, which is why the two stylesheets move from static/ to assets/xsl/ and are run through ExecuteAsTemplate: a static file cannot know the fingerprinted name of a processed image. The alternative was a second copy of the logo in static/ with a fixed name, which would go stale the day someone changes the first one. The header is white. The logo carries the word "python" in the same blue as the band it used to sit on, so on blue the word disappeared and only "barcelona" was legible. White is also what the site's own navigation bar uses behind it. resources.Minify is not in the pipeline: Hugo has no media type for .xsl and the step fails silently, leaving the resource unpublished. Verified on both the minified and the unminified build: 31 feed items, 40 sitemap URLs, both documents still start with the XML declaration, and Chromium loads the logo at 58px in both headers. --- {static => assets/xsl}/rss.xsl | 17 ++++++++++++++--- {static => assets/xsl}/sitemap.xsl | 17 ++++++++++++++--- layouts/_default/rss.xml | 3 ++- layouts/sitemap.xml | 3 ++- 4 files changed, 32 insertions(+), 8 deletions(-) rename {static => assets/xsl}/rss.xsl (86%) rename {static => assets/xsl}/sitemap.xsl (80%) diff --git a/static/rss.xsl b/assets/xsl/rss.xsl similarity index 86% rename from static/rss.xsl rename to assets/xsl/rss.xsl index e6a9c710..20626dfb 100644 --- a/static/rss.xsl +++ b/assets/xsl/rss.xsl @@ -1,3 +1,5 @@ +{{- $logo := resources.Get "images/logo.png" -}} +{{- $logo = partial "image_resize.html" (dict "img" $logo "width" 400) -}}