From 2a282d3c2704f92b7796d7df67ba74f769bb9be4 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 26 Mar 2024 09:19:45 -0700 Subject: [PATCH] Add redirect support Add a new 'redirect' layout that can be used to as a target of an Apache HTTPD rewrite rule in order to perform redirects based on a page or anchor. Redirect pages can be written in asciidoc in the following form: :page-layout: redirect * xref:[<#previous-anchor>] ... Closes gh-221 --- preview-src/redirect.adoc | 5 +++++ src/js/vendor/redirect.js | 24 ++++++++++++++++++++++++ src/layouts/redirect.hbs | 7 +++++++ 3 files changed, 36 insertions(+) create mode 100644 preview-src/redirect.adoc create mode 100644 src/js/vendor/redirect.js create mode 100644 src/layouts/redirect.hbs diff --git a/preview-src/redirect.adoc b/preview-src/redirect.adoc new file mode 100644 index 0000000..7332cb6 --- /dev/null +++ b/preview-src/redirect.adoc @@ -0,0 +1,5 @@ +:page-layout: redirect + +* xref:index.adoc[oldpage] +* xref:baz/index.adoc[#old] +* xref:samples/index.adoc[oldpage#old] diff --git a/src/js/vendor/redirect.js b/src/js/vendor/redirect.js new file mode 100644 index 0000000..98bbf08 --- /dev/null +++ b/src/js/vendor/redirect.js @@ -0,0 +1,24 @@ +;(function () { + 'use strict' + + window.addEventListener('load', onChange) + window.addEventListener('hashchange', onChange) + + function onChange () { + const params = new URLSearchParams(window.location.search) + const page = params.get('page') || '' + const fragment = window.location.hash + const pageAndFragment = page + ((fragment.length === 1) ? '' : fragment) + let foundForFragment + let foundForPageAndFragment + const candidates = document.querySelector('body ul') + if (candidates) { + for (const candidate of candidates.children) { + const anchorElement = candidate.querySelector('a') + if (anchorElement.text === pageAndFragment) foundForPageAndFragment = anchorElement.href + if (anchorElement.text === fragment) foundForFragment = anchorElement.href + } + } + window.location.replace(foundForPageAndFragment || foundForFragment || 'index.html') + } +})() diff --git a/src/layouts/redirect.hbs b/src/layouts/redirect.hbs new file mode 100644 index 0000000..cda8699 --- /dev/null +++ b/src/layouts/redirect.hbs @@ -0,0 +1,7 @@ + + + +{{{page.contents}}} +