Skip to content

Commit

Permalink
Merge pull request #443 from JuliaDataCubes/la/versions
Browse files Browse the repository at this point in the history
add version select
  • Loading branch information
lazarusA authored Sep 19, 2024
2 parents f3ee422 + 30cd05e commit 05d07be
Show file tree
Hide file tree
Showing 3 changed files with 224 additions and 58 deletions.
136 changes: 79 additions & 57 deletions docs/src/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,82 @@ import { defineConfig } from 'vitepress'
import { tabsMarkdownPlugin } from 'vitepress-plugin-tabs'
import mathjax3 from "markdown-it-mathjax3";

function getBaseRepository(base: string): string {
if (!base) return '/';
// I guess if deploy_url is available. From where do I check this ?
const parts = base.split('/').filter(Boolean);
return parts.length > 0 ? `/${parts[0]}/` : '/';
}

const baseTemp = {
base: 'REPLACE_ME_DOCUMENTER_VITEPRESS',
}

const navTemp = {
nav: [
{ text: 'Home', link: '/' },
{ text: 'Get Started', link: '/get_started' },
{
text: 'User Guide',
items: [
{ text: 'Types', link: '/UserGuide/types' },
{ text: 'Read', link: '/UserGuide/read' },
{ text: 'Write', link: '/UserGuide/write' },
{ text: 'Convert', link: '/UserGuide/convert' },
{ text: 'Create', link: '/UserGuide/create' },
{ text: 'Select', link: '/UserGuide/select' },
{ text: 'Compute', link: '/UserGuide/compute' },
{ text: 'Chunk', link: '/UserGuide/chunk' },
{ text: 'Cache', link: '/UserGuide/cache' },
{ text: 'Group', link: '/UserGuide/group' },
{ text: 'Combine', link: '/UserGuide/combine' },
{ text: 'FAQ', link: '/UserGuide/faq' }
]
},
{
text: 'Tutorials',
items: [
{ text: 'Overview', link: '/tutorials/tutorial' },
{ text: 'Plotting maps', link: '/tutorials/plottingmaps' },
{ text: 'Mean Seasonal Cycle', link: '/tutorials/mean_seasonal_cycle' },
{
text: 'ESDL studies',
items: [
{ text: 'ESDL study 1', link: 'https://github.com/JuliaDataCubes/YAXArrays.jl/blob/master/docs/src/tutorials/esdl/examples_from_esdl_study_1.jl' },
{ text: 'ESDL study 2', link: 'https://github.com/JuliaDataCubes/YAXArrays.jl/blob/master/docs/src/tutorials/esdl/examples_from_esdl_study_2.jl' },
{ text: 'ESDL study 3', link: 'https://github.com/JuliaDataCubes/YAXArrays.jl/blob/master/docs/src/tutorials/esdl/examples_from_esdl_study_3.jl' },
{ text: 'ESDL study 4', link: 'https://github.com/JuliaDataCubes/YAXArrays.jl/blob/master/docs/src/tutorials/esdl/examples_from_esdl_study_4.jl' },
]
},
{ text: 'Other Tutorials', link: '/tutorials/other_tutorials' },
]
},
{ text: 'Ecosystem',
items: [
{ text: 'DimensionalData.jl', link: 'https://rafaqz.github.io/DimensionalData.jl/dev/' },
{ text: 'NetCDF.jl', link: 'https://juliageo.org/NetCDF.jl/stable/'},
{ text: 'Zarr.jl', link: 'https://juliaio.github.io/Zarr.jl/latest/'},
{ text: 'ArchGDAL.jl', link: 'https://yeesian.com/ArchGDAL.jl/stable/' },
{ text: 'GeoMakie.jl', link: 'https://geo.makie.org/dev/' },
{ text: 'Makie.jl', link: 'https://docs.makie.org/dev/' },
]
},
{
text: 'Development',
items: [
{ text: 'Contribute', link: 'development/contribute' },
{ text: 'Contributors', link: 'development/contributors' }
]
},
],
}

const nav = [
...navTemp.nav,
{
component: 'VersionPicker'
}
]
// https://vitepress.dev/reference/site-config
export default defineConfig({
base: 'REPLACE_ME_DOCUMENTER_VITEPRESS',
Expand All @@ -12,6 +88,8 @@ export default defineConfig({
outDir: 'REPLACE_ME_DOCUMENTER_VITEPRESS', // This is required for MarkdownVitepress to work correctly...
head: [
['link', { rel: 'icon', href: 'REPLACE_ME_DOCUMENTER_VITEPRESS_FAVICON' }],
['script', {src: `${getBaseRepository(baseTemp.base)}versions.js`}],
['script', {src: `${baseTemp.base}siteinfo.js`}]
],
// ignoreDeadLinks: true,

Expand All @@ -36,63 +114,7 @@ export default defineConfig({
detailedView: true
}
},
nav: [
{ text: 'Home', link: '/' },
{ text: 'Get Started', link: '/get_started' },
{
text: 'User Guide',
items: [
{ text: 'Types', link: '/UserGuide/types' },
{ text: 'Read', link: '/UserGuide/read' },
{ text: 'Write', link: '/UserGuide/write' },
{ text: 'Convert', link: '/UserGuide/convert' },
{ text: 'Create', link: '/UserGuide/create' },
{ text: 'Select', link: '/UserGuide/select' },
{ text: 'Compute', link: '/UserGuide/compute' },
{ text: 'Chunk', link: '/UserGuide/chunk' },
{ text: 'Cache', link: '/UserGuide/cache' },
{ text: 'Group', link: '/UserGuide/group' },
{ text: 'Combine', link: '/UserGuide/combine' },
{ text: 'FAQ', link: '/UserGuide/faq' }
]
},
{
text: 'Tutorials',
items: [
{ text: 'Overview', link: '/tutorials/tutorial' },
{ text: 'Plotting maps', link: '/tutorials/plottingmaps' },
{ text: 'Mean Seasonal Cycle', link: '/tutorials/mean_seasonal_cycle' },
{
text: 'ESDL studies',
items: [
{ text: 'ESDL study 1', link: 'https://github.com/JuliaDataCubes/YAXArrays.jl/blob/master/docs/src/tutorials/esdl/examples_from_esdl_study_1.jl' },
{ text: 'ESDL study 2', link: 'https://github.com/JuliaDataCubes/YAXArrays.jl/blob/master/docs/src/tutorials/esdl/examples_from_esdl_study_2.jl' },
{ text: 'ESDL study 3', link: 'https://github.com/JuliaDataCubes/YAXArrays.jl/blob/master/docs/src/tutorials/esdl/examples_from_esdl_study_3.jl' },
{ text: 'ESDL study 4', link: 'https://github.com/JuliaDataCubes/YAXArrays.jl/blob/master/docs/src/tutorials/esdl/examples_from_esdl_study_4.jl' },
]
},
{ text: 'Other Tutorials', link: '/tutorials/other_tutorials' },
]
},
{ text: 'Ecosystem',
items: [
{ text: 'DimensionalData.jl', link: 'https://rafaqz.github.io/DimensionalData.jl/dev/' },
{ text: 'NetCDF.jl', link: 'https://juliageo.org/NetCDF.jl/stable/'},
{ text: 'Zarr.jl', link: 'https://juliaio.github.io/Zarr.jl/latest/'},
{ text: 'ArchGDAL.jl', link: 'https://yeesian.com/ArchGDAL.jl/stable/' },
{ text: 'GeoMakie.jl', link: 'https://geo.makie.org/dev/' },
{ text: 'Makie.jl', link: 'https://docs.makie.org/dev/' },
]
},
{
text: 'Development',
items: [
{ text: 'Contribute', link: 'development/contribute' },
{ text: 'Contributors', link: 'development/contributors' }
]
},
],

nav,
sidebar: [
{ text: 'Get Started', link: '/get_started' },
{ text: 'API Reference', link: '/api' },
Expand Down
142 changes: 142 additions & 0 deletions docs/src/.vitepress/theme/VersionPicker.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
<!-- Adapted from https://github.com/MakieOrg/Makie.jl/blob/master/docs/src/.vitepress/theme/VersionPicker.vue -->

<script setup lang="ts">
import { ref, onMounted, computed } from 'vue'
import { useData } from 'vitepress'
import VPNavBarMenuGroup from 'vitepress/dist/client/theme-default/components/VPNavBarMenuGroup.vue'
import VPNavScreenMenuGroup from 'vitepress/dist/client/theme-default/components/VPNavScreenMenuGroup.vue'

// Extend the global Window interface to include DOC_VERSIONS and DOCUMENTER_CURRENT_VERSION
declare global {
interface Window {
DOC_VERSIONS?: string[];
DOCUMENTER_CURRENT_VERSION?: string;
}
}

const props = defineProps<{
screenMenu?: boolean
}>()

const versions = ref<Array<{ text: string, link: string }>>([]);
const currentVersion = ref('Versions');
const isClient = ref(false);
const { site } = useData()

const isLocalBuild = () => {
return typeof window !== 'undefined' && (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1');
}

const getBaseRepository = () => {
if (typeof window === 'undefined') return ''; // Handle server-side rendering (SSR)
const { origin, pathname } = window.location;
// Check if it's a GitHub Pages (or similar) setup
if (origin.includes('github.io')) {
// Extract the first part of the path as the repository name
const pathParts = pathname.split('/').filter(Boolean);
const baseRepo = pathParts.length > 0 ? `/${pathParts[0]}/` : '/';
return `${origin}${baseRepo}`;
} else {
// For custom domains, use just the origin (e.g., https://docs.makie.org)
return origin;
}
};

const waitForScriptsToLoad = () => {
return new Promise<boolean>((resolve) => {
if (isLocalBuild()) {
resolve(false);
return;
}
const checkInterval = setInterval(() => {
if (window.DOC_VERSIONS && window.DOCUMENTER_CURRENT_VERSION) {
clearInterval(checkInterval);
resolve(true);
}
}, 100);
// Timeout after 5 seconds
setTimeout(() => {
clearInterval(checkInterval);
resolve(false);
}, 5000);
});
};

const loadVersions = async () => {
if (typeof window === 'undefined') return; // Guard for SSR

try {
if (isLocalBuild()) {
// Handle the local build scenario directly
const fallbackVersions = ['dev'];
versions.value = fallbackVersions.map(v => ({
text: v,
link: '/'
}));
currentVersion.value = 'dev';
} else {
// For non-local builds, wait for scripts to load
const scriptsLoaded = await waitForScriptsToLoad();
const getBaseRepositoryPath = computed(() => {
return getBaseRepository();
});

if (scriptsLoaded && window.DOC_VERSIONS && window.DOCUMENTER_CURRENT_VERSION) {
versions.value = window.DOC_VERSIONS.map((v: string) => ({
text: v,
link: `${getBaseRepositoryPath.value}/${v}/`
}));
currentVersion.value = window.DOCUMENTER_CURRENT_VERSION;
} else {
// Fallback logic if scripts fail to load or are not available
const fallbackVersions = ['dev'];
versions.value = fallbackVersions.map(v => ({
text: v,
link: `${getBaseRepositoryPath.value}/${v}/`
}));
currentVersion.value = 'dev';
}
}
} catch (error) {
console.warn('Error loading versions:', error);
// Use fallback logic in case of an error
const fallbackVersions = ['dev'];
const getBaseRepositoryPath = computed(() => {
return getBaseRepository();
});
versions.value = fallbackVersions.map(v => ({
text: v,
link: `${getBaseRepositoryPath.value}/${v}/`
}));
currentVersion.value = 'dev';
}
isClient.value = true;
};

onMounted(loadVersions);
</script>

<template>
<template v-if="isClient">
<VPNavBarMenuGroup
v-if="!screenMenu && versions.length > 0"
:item="{ text: currentVersion, items: versions }"
class="VPVersionPicker"
/>
<VPNavScreenMenuGroup
v-else-if="screenMenu && versions.length > 0"
:text="currentVersion"
:items="versions"
class="VPVersionPicker"
/>
</template>
</template>

<style scoped>
.VPVersionPicker :deep(button .text) {
color: var(--vp-c-text-1) !important;
}
.VPVersionPicker:hover :deep(button .text) {
color: var(--vp-c-text-2) !important;
}
</style>
4 changes: 3 additions & 1 deletion docs/src/.vitepress/theme/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { h } from 'vue'
import type { Theme } from 'vitepress'
import DefaultTheme from 'vitepress/theme'
import AsideTrustees from '../../components/AsideTrustees.vue'
import VersionPicker from "./VersionPicker.vue"

import { enhanceAppWithTabs } from 'vitepress-plugin-tabs/client'
import './style.css'
Expand All @@ -15,6 +16,7 @@ export default {
})
},
enhanceApp({ app, router, siteData }) {
enhanceAppWithTabs(app)
enhanceAppWithTabs(app);
app.component('VersionPicker', VersionPicker);
}
} satisfies Theme

0 comments on commit 05d07be

Please sign in to comment.