= (props) => {
))}
{props.project.data.project.tags &&
props.project.data.project.tags.tags.length > 0 && (
-
+
diff --git a/src/components/TableOfContents.astro b/src/components/TableOfContents.astro
index 782e204..7e6cd7c 100644
--- a/src/components/TableOfContents.astro
+++ b/src/components/TableOfContents.astro
@@ -1,17 +1,13 @@
---
import { getEntry } from 'astro:content';
-import { dynamicConfig } from 'dynamic-astro-config';
import { getPages } from 'src/utils/pages';
+import { normalizeBasePath } from 'src/utils/basePath';
const projectData = await getEntry('project', 'project');
const projectFileData = await getEntry('project', 'project');
-const baseUrl = import.meta.env.PROD
- ? projectData?.data.publish.publish_pages_app
- ? projectData?.data.project.slug
- : undefined
- : dynamicConfig.base;
+const basePath = normalizeBasePath(import.meta.env.BASE_URL);
const pages = await getPages();
@@ -49,7 +45,7 @@ pages
return (
{page.data.title}
@@ -61,7 +57,7 @@ pages
projectFileData!.data.project.tags.tags.length > 0 && (
Index
diff --git a/src/content/config.ts b/src/content/config.ts
index 85a3f3b..5e3b197 100644
--- a/src/content/config.ts
+++ b/src/content/config.ts
@@ -129,6 +129,7 @@ const projectCollection = defineCollection({
}),
publish: z.object({
publish_pages_app: z.boolean(),
+ include_slug_in_base: z.boolean().nullish(),
publish_sha: z.string(),
publish_iso_date: z.string(),
}),
diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro
index 58a1a87..caf6410 100644
--- a/src/layouts/Layout.astro
+++ b/src/layouts/Layout.astro
@@ -5,7 +5,6 @@ import '@fontsource-variable/inter';
import Header from '@components/Header.astro';
import Footer from '@components/Footer.astro';
import { getEntry } from 'astro:content';
-import { dynamicConfig } from 'dynamic-astro-config';
import { getCollection } from 'astro:content';
interface Props {
@@ -17,10 +16,6 @@ interface Props {
const projectData = await getEntry('project', 'project');
const eventData = await getCollection('events');
-const baseUrl = import.meta.env.PROD
- ? projectData?.data.project.slug
- : dynamicConfig.base;
-
const {
background,
class: className,
@@ -41,7 +36,7 @@ const manifests = eventData.map((e) => {
-
+
diff --git a/src/pages/events/[pageSlug].astro b/src/pages/events/[pageSlug].astro
index d2b17f8..a62309e 100644
--- a/src/pages/events/[pageSlug].astro
+++ b/src/pages/events/[pageSlug].astro
@@ -1,18 +1,10 @@
---
import type { GetStaticPaths } from 'astro';
-import { dynamicConfig } from 'dynamic-astro-config';
import Layout from '@layouts/Layout.astro';
-import { getEntry } from 'astro:content';
import EventViewer from '@components/EventViewer/index.astro';
import { getPage, getPages } from 'src/utils/pages';
import { randomUUID } from 'crypto';
-
-const projectData = await getEntry('project', 'project');
-
-// @ts-ignore
-const baseUrl = import.meta.env.PROD
- ? projectData?.data.project.slug
- : dynamicConfig.base;
+import { joinBasePath } from '@utils/basePath';
export const getStaticPaths = (async () => {
// filter out custom pages
@@ -26,13 +18,13 @@ export const getStaticPaths = (async () => {
const { pageSlug } = Astro.params;
if (!pageSlug) {
- return Astro.redirect(`/${baseUrl}`);
+ return Astro.redirect(joinBasePath(import.meta.env.BASE_URL));
}
const page = await getPage(pageSlug);
if (!page.data.autogenerate.type_id) {
- return Astro.redirect(`/${baseUrl}`);
+ return Astro.redirect(joinBasePath(import.meta.env.BASE_URL));
}
const playerId = randomUUID();
diff --git a/src/pages/pages/[pageSlug].astro b/src/pages/pages/[pageSlug].astro
index e63609d..5554b2c 100644
--- a/src/pages/pages/[pageSlug].astro
+++ b/src/pages/pages/[pageSlug].astro
@@ -1,18 +1,10 @@
---
import type { GetStaticPaths } from 'astro';
-import { dynamicConfig } from 'dynamic-astro-config';
import Layout from '@layouts/Layout.astro';
import Container from '@components/Container.astro';
-import { getEntry } from 'astro:content';
import RichText from '../../components/RichText/index.astro';
import { getPage, getPages } from 'src/utils/pages';
-
-const projectData = await getEntry('project', 'project');
-
-// @ts-ignore
-const baseUrl = import.meta.env.PROD
- ? projectData?.data.project.slug
- : dynamicConfig.base;
+import { joinBasePath } from '@utils/basePath';
export const getStaticPaths = (async () => {
const eventPages = await getPages((p) => !p.data.autogenerate.enabled);
@@ -25,7 +17,7 @@ export const getStaticPaths = (async () => {
const { pageSlug } = Astro.params;
if (!pageSlug) {
- return Astro.redirect(`/${baseUrl}`);
+ return Astro.redirect(joinBasePath(import.meta.env.BASE_URL));
}
const page = await getPage(pageSlug);
diff --git a/src/pages/tags/detail/[category]/[tag].astro b/src/pages/tags/detail/[category]/[tag].astro
index 1273d29..f9c4ff5 100644
--- a/src/pages/tags/detail/[category]/[tag].astro
+++ b/src/pages/tags/detail/[category]/[tag].astro
@@ -17,20 +17,16 @@ import type { CollectionEntry } from 'astro:content';
import { getCollection } from 'astro:content';
import { getEntry } from 'astro:content';
import { randomUUID } from 'crypto';
-import { dynamicConfig } from 'dynamic-astro-config';
import { ArrowLeft } from 'react-bootstrap-icons';
import Annotations from '@components/EventViewer/AnnotationUI/Annotations/index.astro';
import AnnotationNanostorePopulator from '@components/EventViewer/AnnotationUI/Annotations/AnnotationNanostorePopulator';
import type { DisplayedAnnotation } from '@ty/index';
import PlayerStateNanostorePopulator from '@components/EventViewer/PlayerStateNanostorePopulator';
+import { joinBasePath, normalizeBasePath } from '@utils/basePath';
const projectData = await getEntry('project', 'project');
-const baseUrl = import.meta.env.PROD
- ? projectData.data.publish.publish_pages_app
- ? projectData.data.project.slug
- : undefined
- : dynamicConfig.base;
+const basePath = normalizeBasePath(import.meta.env.BASE_URL);
export const getStaticPaths = (async () => {
const projectData = await getEntry('project', 'project');
@@ -50,19 +46,19 @@ const capitalizedTag = getTagDisplay(fromTagParam(tag));
const crumbs = [
{
label: 'Home',
- link: `${baseUrl ? `/${baseUrl}` : '/'}`,
+ link: joinBasePath(basePath),
},
{
label: 'Index',
- link: `${baseUrl ? `/${baseUrl}` : ''}/tags`,
+ link: joinBasePath(basePath, 'tags'),
},
{
label: 'Tag Groups',
- link: `${baseUrl ? `/${baseUrl}` : ''}/tags/detail`,
+ link: joinBasePath(basePath, 'tags/detail'),
},
{
label: capitalizedCategory,
- link: `${baseUrl ? `/${baseUrl}` : ''}/tags/detail/${category}`,
+ link: joinBasePath(basePath, `tags/detail/${category}`),
},
{
label: capitalizedTag,
@@ -81,7 +77,7 @@ const categoryData = projectData.data.project.tags.tagGroups.find(
);
if (!categoryData) {
- return Astro.redirect(`/${baseUrl}`);
+ return Astro.redirect(joinBasePath(basePath));
}
type SetData = {
@@ -117,7 +113,7 @@ for (const set of annotationSets) {
diff --git a/src/pages/tags/detail/[category]/index.astro b/src/pages/tags/detail/[category]/index.astro
index a1676f1..85591bd 100644
--- a/src/pages/tags/detail/[category]/index.astro
+++ b/src/pages/tags/detail/[category]/index.astro
@@ -8,7 +8,6 @@ import Layout from '@layouts/Layout.astro';
import type { GetStaticPaths } from 'astro';
import { getCollection } from 'astro:content';
import { getEntry } from 'astro:content';
-import { dynamicConfig } from 'dynamic-astro-config';
import { ArrowLeft, ArrowCounterclockwise } from 'react-bootstrap-icons';
import {
tagColors as colors,
@@ -20,14 +19,11 @@ import {
sortTags,
toTagParam,
} from '@utils/tags.ts';
+import { joinBasePath, normalizeBasePath } from '@utils/basePath';
const projectData = await getEntry('project', 'project');
-const baseUrl = import.meta.env.PROD
- ? projectData.data.publish.publish_pages_app
- ? projectData.data.project.slug
- : undefined
- : dynamicConfig.base;
+const basePath = normalizeBasePath(import.meta.env.BASE_URL);
export const getStaticPaths = (async () => {
const projectData = await getEntry('project', 'project');
@@ -43,15 +39,15 @@ const capitalizedCategory = getTagDisplay(fromTagParam(category));
const crumbs = [
{
label: 'Home',
- link: `${baseUrl ? `/${baseUrl}` : '/'}`,
+ link: joinBasePath(basePath),
},
{
label: 'Index',
- link: `${baseUrl ? `/${baseUrl}` : ''}/tags`,
+ link: joinBasePath(basePath, 'tags'),
},
{
label: 'Tag Groups',
- link: `${baseUrl ? `/${baseUrl}` : ''}/tags/detail`,
+ link: joinBasePath(basePath, 'tags/detail'),
},
{
label: capitalizedCategory,
@@ -70,7 +66,7 @@ const categoryData = projectData.data.project.tags.tagGroups.find(
);
if (!categoryData) {
- return Astro.redirect(`/${baseUrl}`);
+ return Astro.redirect(joinBasePath(basePath));
}
const tags = projectData.data.project.tags.tags
@@ -95,7 +91,7 @@ tags.forEach((t, idx) => (tagColors[t] = colors[idx % colors.length]));
diff --git a/src/pages/tags/detail/index.astro b/src/pages/tags/detail/index.astro
index be09ea9..c75fa71 100644
--- a/src/pages/tags/detail/index.astro
+++ b/src/pages/tags/detail/index.astro
@@ -1,7 +1,6 @@
---
import Layout from '@layouts/Layout.astro';
import Container from '@components/Container.astro';
-import { dynamicConfig } from '../../../../dynamic-astro-config';
import Breadcrumbs from '@components/Breadcrumbs.astro';
import { getEntry } from 'astro:content';
import { getCollection } from 'astro:content';
@@ -15,23 +14,20 @@ import {
setHasCategory,
setsHasCategory,
} from '@utils/tags';
+import { joinBasePath, normalizeBasePath } from '@utils/basePath';
const projectData = await getEntry('project', 'project');
-const baseUrl = import.meta.env.PROD
- ? projectData.data.publish.publish_pages_app
- ? projectData.data.project.slug
- : undefined
- : dynamicConfig.base;
+const basePath = normalizeBasePath(import.meta.env.BASE_URL);
const crumbs = [
{
label: 'Home',
- link: `${baseUrl ? `/${baseUrl}` : '/'}`,
+ link: joinBasePath(basePath),
},
{
label: 'Index',
- link: `${baseUrl ? `/${baseUrl}` : ''}/tags`,
+ link: joinBasePath(basePath, 'tags'),
},
{
label: 'Tag Groups',
@@ -44,7 +40,7 @@ annotationSets.sort((a, b) => compareAnnotations(a, b, events));
// check whether there actually are any annotation files
if (annotationSets.length === 0) {
- return Astro.redirect(`/${baseUrl}`);
+ return Astro.redirect(joinBasePath(basePath));
}
const formattedCategoryNames = projectData.data.project.tags.tagGroups.map(
(cat) => getTagDisplay(cat.category)
@@ -104,7 +100,10 @@ const sortedTagGroups = projectData.data.project.tags.tagGroups.sort((a, b) =>
View Details
diff --git a/src/pages/tags/index.astro b/src/pages/tags/index.astro
index 9bd2001..d7c2661 100644
--- a/src/pages/tags/index.astro
+++ b/src/pages/tags/index.astro
@@ -1,24 +1,20 @@
---
import Layout from '../../layouts/Layout.astro';
import Container from '../../components/Container.astro';
-import { dynamicConfig } from '../../../dynamic-astro-config';
import Breadcrumbs from '../../components/Breadcrumbs.astro';
import TagPill from '@components/TagUtils/TagPill';
import { getEntry } from 'astro:content';
import { getCollection } from 'astro:content';
import { toTagParam, sortTags } from '@utils/tags';
+import { joinBasePath, normalizeBasePath } from '@utils/basePath';
const projectData = await getEntry('project', 'project');
-const baseUrl = import.meta.env.PROD
- ? projectData.data.publish.publish_pages_app
- ? projectData.data.project.slug
- : undefined
- : dynamicConfig.base;
+const basePath = normalizeBasePath(import.meta.env.BASE_URL);
const crumbs = [
{
label: 'Home',
- link: `${baseUrl ? `/${baseUrl}` : '/'}`,
+ link: joinBasePath(basePath),
},
{
label: 'Index',
@@ -30,7 +26,7 @@ const tags = projectData.data.project.tags;
//check whether there actually are any annotation files
const annotationSets = await getCollection('annotations');
if (!Object.keys(annotationSets).length) {
- return Astro.redirect(`/${baseUrl}`);
+ return Astro.redirect(joinBasePath(basePath));
}
const detectTag = (
@@ -98,7 +94,7 @@ tags.tags.sort(sortTags).forEach((tag: { tag: string; category: string }) => {
Index
View Details
@@ -117,7 +113,10 @@ tags.tags.sort(sortTags).forEach((tag: { tag: string; category: string }) => {
tag.count ? (
{
+ const trimmedBasePath = basePath.trim();
+
+ if (trimmedBasePath === '' || trimmedBasePath === '/') {
+ return '';
+ }
+
+ const noTrailingSlash = trimmedBasePath.replace(/\/$/, '');
+ return noTrailingSlash.startsWith('/') ? noTrailingSlash : `/${noTrailingSlash}`;
+};
+
+export const joinBasePath = (basePath: string, segment = '') => {
+ const normalizedBasePath = normalizeBasePath(basePath);
+ const normalizedSegment = segment.trim().replace(/^\/+|\/+$/g, '');
+
+ if (normalizedSegment === '') {
+ return normalizedBasePath === '' ? '/' : normalizedBasePath;
+ }
+
+ return `${normalizedBasePath}/${normalizedSegment}`;
+};
diff --git a/src/utils/events.ts b/src/utils/events.ts
index 0def31b..935526b 100644
--- a/src/utils/events.ts
+++ b/src/utils/events.ts
@@ -1,17 +1,10 @@
-import { getEntry, type CollectionEntry } from 'astro:content';
-import { dynamicConfig } from 'dynamic-astro-config.js';
+import { type CollectionEntry } from 'astro:content';
export const getCaptionSets = async (
event: CollectionEntry<'events'>,
file: string,
annotationSets: CollectionEntry<'annotations'>[]
) => {
- const projectData = await getEntry('project', 'project');
-
- const baseUrl = import.meta.env.PROD
- ? projectData?.data.project.slug
- : dynamicConfig.base;
-
let captionSets: { url: string; label: string }[];
const eventCaptionSet = event.data.audiovisual_files[file]?.caption_set;
@@ -20,7 +13,7 @@ export const getCaptionSets = async (
captionSets = eventCaptionSet.map((s: any) => {
const set = annotationSets.find((set) => set.id === s.annotation_page_id);
return {
- url: `/${baseUrl}/${s.annotation_page_id}.vtt`,
+ url: `${import.meta.env.BASE_URL}${s.annotation_page_id}.vtt`,
label: set?.data.set || '',
};
});