improve slashing + base href behavior

+ prefix sidebar links & mdx links with base
+ add trailing slashes
This commit is contained in:
Felix Roos 2023-12-05 23:09:34 +01:00
parent 8a0cf14fd7
commit ac41426a20
4 changed files with 15 additions and 8 deletions

View File

@ -13,6 +13,7 @@ import AstroPWA from '@vite-pwa/astro';
const site = `https://strudel.cc/`; // root url without a path const site = `https://strudel.cc/`; // root url without a path
const base = '/'; // base path of the strudel site const base = '/'; // base path of the strudel site
const baseNoTrailing = base.endsWith('/') ? base.slice(0, -1) : base;
// this rehype plugin converts relative anchor links to absolute ones // this rehype plugin converts relative anchor links to absolute ones
// it wokrs by prepending the absolute page path to anchor links // it wokrs by prepending the absolute page path to anchor links
@ -24,13 +25,16 @@ function absoluteAnchors() {
const chunks = file.history[0].split('/src/pages/'); // file.history[0] is the file path const chunks = file.history[0].split('/src/pages/'); // file.history[0] is the file path
const path = chunks[chunks.length - 1].slice(0, -4); // only path inside src/pages, without .mdx const path = chunks[chunks.length - 1].slice(0, -4); // only path inside src/pages, without .mdx
return rehypeUrls((url) => { return rehypeUrls((url) => {
if (!url.href.startsWith('#')) { if (url.href.startsWith('/')) {
return; const hrefWithTrailingSlash = url.href.endsWith('/') ? url.href : url.href + '/';
return baseNoTrailing + hrefWithTrailingSlash;
}
if (url.href.startsWith('#')) {
const absoluteUrl = `${baseNoTrailing}/${path}/${url.href}`;
return absoluteUrl;
} }
const baseWithSlash = base.endsWith('/') ? base : base + '/';
const absoluteUrl = baseWithSlash + path + url.href;
// console.log(url.href + ' -> ', absoluteUrl); // console.log(url.href + ' -> ', absoluteUrl);
return absoluteUrl; return;
})(tree); })(tree);
}; };
} }

View File

@ -9,6 +9,7 @@ type Props = {
const { currentPage } = Astro.props as Props; const { currentPage } = Astro.props as Props;
const { BASE_URL } = import.meta.env; const { BASE_URL } = import.meta.env;
let currentPageMatch = currentPage.slice(BASE_URL.length, currentPage.endsWith('/') ? -1 : undefined); let currentPageMatch = currentPage.slice(BASE_URL.length, currentPage.endsWith('/') ? -1 : undefined);
const baseNoTrailing = BASE_URL.endsWith('/') ? BASE_URL.slice(0, -1) : BASE_URL;
const langCode = getLanguageFromURL(currentPage) || 'en'; const langCode = getLanguageFromURL(currentPage) || 'en';
const sidebar = SIDEBAR[langCode]; const sidebar = SIDEBAR[langCode];
@ -23,7 +24,7 @@ const sidebar = SIDEBAR[langCode];
<h2>{header}</h2> <h2>{header}</h2>
<ul> <ul>
{children.map((child) => { {children.map((child) => {
const url = Astro.site?.pathname + child.link; const url = `${baseNoTrailing}/${child.link}${child.link.endsWith('/') ? '' : '/'}`;
return ( return (
<li class=""> <li class="">
<a <a

View File

@ -73,7 +73,7 @@ const TableOfContents: FC<{ headings: MarkdownHeading[]; currentPage: string }>
.map((heading, i) => ( .map((heading, i) => (
<li className={`w-full`} key={i}> <li className={`w-full`} key={i}>
<a <a
href={`${currentPage}#${heading.slug}`} href={`${currentPage}/#${heading.slug}`}
onClick={onLinkClick} onClick={onLinkClick}
className={`py-0.5 block cursor-pointer w-full border-l-4 border-lineHighlight hover:bg-lineHighlight ${ className={`py-0.5 block cursor-pointer w-full border-l-4 border-lineHighlight hover:bg-lineHighlight ${
['pl-4', 'pl-9', 'pl-12'][heading.depth - minDepth] ['pl-4', 'pl-9', 'pl-12'][heading.depth - minDepth]

View File

@ -9,6 +9,8 @@ import React, { useContext } from 'react';
import { useSettings, setIsZen } from '../settings.mjs'; import { useSettings, setIsZen } from '../settings.mjs';
// import { ReplContext } from './Repl'; // import { ReplContext } from './Repl';
import './Repl.css'; import './Repl.css';
const { BASE_URL } = import.meta.env;
const baseNoTrailing = BASE_URL.endsWith('/') ? BASE_URL.slice(0, -1) : BASE_URL;
export function Header({ context }) { export function Header({ context }) {
const { const {
@ -123,7 +125,7 @@ export function Header({ context }) {
{!isEmbedded && ( {!isEmbedded && (
<a <a
title="learn" title="learn"
href="./workshop/getting-started" href={`${baseNoTrailing}/workshop/getting-started/`}
className={cx('hover:opacity-50 flex items-center space-x-1', !isEmbedded ? 'p-2' : 'px-2')} className={cx('hover:opacity-50 flex items-center space-x-1', !isEmbedded ? 'p-2' : 'px-2')}
> >
<AcademicCapIcon className="w-6 h-6" /> <AcademicCapIcon className="w-6 h-6" />