mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-27 21:48:27 +00:00
improve slashing + base href behavior
+ prefix sidebar links & mdx links with base + add trailing slashes
This commit is contained in:
parent
8a0cf14fd7
commit
ac41426a20
@ -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);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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]
|
||||||
|
|||||||
@ -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" />
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user