diff --git a/.github/workflows/links.yml b/.github/workflows/links.yml index 1455f4188..6439901fa 100644 --- a/.github/workflows/links.yml +++ b/.github/workflows/links.yml @@ -46,6 +46,21 @@ jobs: - name: Validate HTML (html-validate) run: npm run lint-html + - name: Strip standard.site link tags before link check + # The spec-required tags (one + # per post, plus the homepage publication tag) carry AT Protocol URIs. + # lychee can't parse the at:// scheme — the colons in did:plc:… read as an + # invalid port — so it emits a hard parse error that no --exclude, + # --scheme, --remap, or .lycheeignore rule can suppress (they all run + # after URL parsing). These tags are verification infrastructure, not + # content links, so we drop them from this throwaway build before + # checking. Production output is unaffected: links.yml builds its own + # dist-astro and never deploys it. Runs after lint-html so the real + # markup is validated first. + run: | + find dist-astro -name '*.html' -print0 \ + | xargs -0 sed -i -E 's#]*rel="site\.standard\.(document|publication)"[^>]*>##g' + - name: Restore lychee cache uses: actions/cache@v5 with: diff --git a/.lycheeignore b/.lycheeignore index 7dd6fcb2e..fc65f9215 100644 --- a/.lycheeignore +++ b/.lycheeignore @@ -19,10 +19,11 @@ ^https?://127\.0\.0\.1 ^https?://example\.(com|org|net) -# AT Protocol URIs (at://did:plc:.../...) — emitted as standard.site -# rel="site.standard.document"/"site.standard.publication" link tags. The -# at:// scheme isn't resolvable over HTTP, so lychee can't (and shouldn't) check it. -^at:// +# Note: standard.site rel="site.standard.document"/"site.standard.publication" +# link tags carry at:// AT Protocol URIs that lychee can't parse (the colons in +# did:plc:… read as an invalid port), so it errors before any ignore rule applies. +# A regex here can't suppress them; the links.yml "Strip standard.site link tags" +# step removes those tags from the throwaway build before lychee runs instead. # Intentionally-broken demo links in posts that document 404 behavior. # Pattern matches both raw root-relative form and the file:// form lychee