Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions .github/actions/documentation/docfx-build/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,10 @@ inputs:
runs:
using: composite
steps:
- name: 'Checkout ${{ github.head_ref || github.ref }}'
uses: actions/checkout@v6
- name: Dotnet Setup
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.dotnet-sdk-version }}
dotnet-version: ${{ inputs.dotnet_sdk_version }}
- name: 'testing variables'
shell: bash
run: |
Expand Down
83 changes: 77 additions & 6 deletions .github/workflows/publish-documentation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ concurrency:
group: publish-docs-${{ github.head_ref || github.ref }}
cancel-in-progress: true

env:
dotnet-sdk-version: '10.x'

jobs:
validate-branch:
name: 'Validate branch'
Expand Down Expand Up @@ -49,7 +52,7 @@ jobs:
needs: [workflow-variables]
runs-on: ubuntu-latest
outputs:
friendly-version: ${{ steps.versioning.outputs.friendly-version }}
friendly-version: ${{ steps.versioning.outputs.version }}

steps:
- name: 'Checkout ${{ github.head_ref || github.ref }}'
Expand All @@ -76,12 +79,80 @@ jobs:
- name: 'Checkout ${{ github.head_ref || github.ref }}'
uses: actions/checkout@v6

- name: 'Generate documentation'
uses: ./.github/actions/documentation/docfx-build
- name: 'Setup .NET ${{ env.dotnet-sdk-version }}'
uses: actions/setup-dotnet@v5
with:
artifact-name: 'documentation'
docfx-json-manifest: './api-reference/api-reference.json'
output-directory: './api-reference/_docs'
dotnet-version: ${{ env.dotnet-sdk-version }}

- name: 'Install docfx'
shell: bash
run: dotnet tool update -g docfx

- name: 'Regenerate API metadata for v${{ env.friendly-version }}'
shell: bash
run: |
rm -rf api-reference/${{ env.friendly-version }}
cd api-reference
docfx metadata assembly-metadata.json
mv temp ${{ env.friendly-version }}

- name: 'Discover all versions'
id: discover-versions
shell: bash
run: |
versions=$(ls api-reference/ | grep -E '^\d+\.\d+$' | sort -V | paste -sd ',' -)
latest=$(ls api-reference/ | grep -E '^\d+\.\d+$' | sort -V | tail -1)
echo "versions=$versions" >> $GITHUB_OUTPUT
echo "latest=$latest" >> $GITHUB_OUTPUT

- name: 'Update versions.json'
shell: bash
run: |
versions_array=$(echo "${{ steps.discover-versions.outputs.versions }}" | tr ',' '\n' | jq -R . | jq -s .)
jq --arg latest "${{ steps.discover-versions.outputs.latest }}" \
--argjson versions "$versions_array" \
'.latest = $latest | .versions = $versions' \
api-reference/versions.json > /tmp/versions.json
mv /tmp/versions.json api-reference/versions.json

- name: 'Update api-reference.json with version groups'
shell: bash
run: |
cp api-reference/api-reference.json /tmp/api-reference.json
for ver in $(echo "${{ steps.discover-versions.outputs.versions }}" | tr ',' ' '); do
jq --arg ver "$ver" --arg group "v${ver}" \
'.build.content += [{"dest": "", "files": ["*.yml"], "group": $group, "src": $ver, "rootTocPath": "~/toc.html"}] |
.build.groups = (.build.groups // {}) |
.build.groups[$group] = {"dest": $ver}' \
/tmp/api-reference.json > /tmp/api-reference-new.json
mv /tmp/api-reference-new.json /tmp/api-reference.json
done
mv /tmp/api-reference.json api-reference/api-reference.json

- name: 'Update toc.yml with Reference dropdown'
shell: bash
run: |
latest="${{ steps.discover-versions.outputs.latest }}"
{
echo "### YamlMime:TableOfContent"
echo "- name: Guide"
echo " href: guide/"
echo "- name: Reference"
echo " dropdown: true"
echo " items:"
for ver in $(echo "${{ steps.discover-versions.outputs.versions }}" | tr ',' '\n' | sort -Vr); do
if [ "$ver" = "$latest" ]; then
echo " - name: v${ver} (latest)"
else
echo " - name: v${ver}"
fi
echo " href: ${ver}/PolylineAlgorithm.html"
done
} > api-reference/toc.yml

- name: 'Build documentation'
shell: bash
run: docfx build api-reference/api-reference.json

- name: 'Upload artifact'
uses: actions/upload-pages-artifact@v4
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -265,3 +265,6 @@ __pycache__/

# GitHub Copilot Testing folder
/.codetesting

# DocFX build output
api-reference/_docs/
24 changes: 4 additions & 20 deletions api-reference/api-reference.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,37 +14,21 @@
"exclude": [
"_docs/**"
]
},
{
"dest": "",
"files": [ "*.yml" ],
"group": "v1.0",
"src": "1.0",
"rootTocPath": "~/toc.html"
},
{
"dest": "",
"files": [ "*.yml" ],
"group": "v1.1",
"src": "1.1",
"rootTocPath": "~/toc.html"
}
],
"resource": [
{
"files": [
"media/**"
"media/**",
"versions.json"
]
}
],
"groups": {
"v1.0": { "dest": "1.0" },
"v1.1": { "dest": "1.1" }
},
"output": "_docs",
"template": [
"default",
"modern"
"modern",
"docs-versioning"
],
"maxParallelism": 1,
"globalMetadata": {
Expand Down
163 changes: 163 additions & 0 deletions api-reference/docs-versioning/layout/_master.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
{{!Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license.}}
{{!include(/^public/.*/)}}
{{!include(favicon.ico)}}
{{!include(logo.svg)}}
<!DOCTYPE html>
<html {{#_lang}}lang="{{_lang}}"{{/_lang}}>
<head>
<meta charset="utf-8">
{{#redirect_url}}
<meta http-equiv="refresh" content="0;URL='{{redirect_url}}'">
{{/redirect_url}}
{{^redirect_url}}
<title>{{#title}}{{title}}{{/title}}{{^title}}{{>partials/title}}{{/title}} {{#_appTitle}}| {{_appTitle}} {{/_appTitle}}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="{{#title}}{{title}}{{/title}}{{^title}}{{>partials/title}}{{/title}} {{#_appTitle}}| {{_appTitle}} {{/_appTitle}}">
{{#_description}}<meta name="description" content="{{_description}}">{{/_description}}
{{#description}}<meta name="description" content="{{description}}">{{/description}}
<link rel="icon" href="{{_rel}}{{{_appFaviconPath}}}{{^_appFaviconPath}}favicon.ico{{/_appFaviconPath}}">
<link rel="stylesheet" href="{{_rel}}public/docfx.min.css">
<link rel="stylesheet" href="{{_rel}}public/main.css">
<meta name="docfx:navrel" content="{{_navRel}}">
<meta name="docfx:tocrel" content="{{_tocRel}}">
{{#_noindex}}<meta name="searchOption" content="noindex">{{/_noindex}}
<meta name="docfx:rel" content="{{_rel}}">
{{#_disableNewTab}}<meta name="docfx:disablenewtab" content="true">{{/_disableNewTab}}
{{#_disableTocFilter}}<meta name="docfx:disabletocfilter" content="true">{{/_disableTocFilter}}
{{#docurl}}<meta name="docfx:docurl" content="{{docurl}}">{{/docurl}}
<meta name="loc:inThisArticle" content="{{__global.inThisArticle}}">
<meta name="loc:searchResultsCount" content="{{__global.searchResultsCount}}">
<meta name="loc:searchNoResults" content="{{__global.searchNoResults}}">
<meta name="loc:tocFilter" content="{{__global.tocFilter}}">
<meta name="loc:nextArticle" content="{{__global.nextArticle}}">
<meta name="loc:prevArticle" content="{{__global.prevArticle}}">
<meta name="loc:themeLight" content="{{__global.themeLight}}">
<meta name="loc:themeDark" content="{{__global.themeDark}}">
<meta name="loc:themeAuto" content="{{__global.themeAuto}}">
<meta name="loc:changeTheme" content="{{__global.changeTheme}}">
<meta name="loc:copy" content="{{__global.copy}}">
<meta name="loc:downloadPdf" content="{{__global.downloadPdf}}">

<script type="module" src="./{{_rel}}public/docfx.min.js"></script>

<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>

{{#_googleAnalyticsTagId}}
<script async src="https://www.googletagmanager.com/gtag/js?id={{_googleAnalyticsTagId}}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', '{{_googleAnalyticsTagId}}');
</script>
{{/_googleAnalyticsTagId}}
{{/redirect_url}}
</head>

{{^redirect_url}}
<body class="tex2jax_ignore" data-layout="{{_layout}}{{layout}}" data-yaml-mime="{{yamlmime}}">
<header class="bg-body border-bottom">
{{^_disableNavbar}}
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="{{_appLogoUrl}}{{^_appLogoUrl}}{{_rel}}index.html{{/_appLogoUrl}}">
<img id="logo" class="svg" src="{{_rel}}{{{_appLogoPath}}}{{^_appLogoPath}}logo.svg{{/_appLogoPath}}" alt="{{_appName}}" >
{{_appName}}
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
{{#_enableSearch}}
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="{{__global.search}}" autocomplete="off" aria-label="Search">
</form>
{{/_enableSearch}}
</div>
<div id="version-picker-container" class="ms-auto d-flex align-items-center px-2">
<select id="version-picker" class="form-select form-select-sm" style="width:auto" aria-label="Select version"></select>
</div>
</div>
</div>
</nav>
{{/_disableNavbar}}
</header>

<main class="container-xxl">
{{^_disableToc}}
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
{{/_disableToc}}

<div class="content">
<div class="actionbar">
{{^_disableToc}}
<button class="btn btn-lg border-0 d-md-none"
type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas"
aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
{{/_disableToc}}

{{^_disableBreadcrumb}}
<nav id="breadcrumb"></nav>
{{/_disableBreadcrumb}}
</div>

<article data-uid="{{uid}}">
{{!body}}
</article>

{{^_disableContribution}}
<div class="contribution d-print-none">
{{#sourceurl}}
<a href="{{sourceurl}}" class="edit-link">{{__global.improveThisDoc}}</a>
{{/sourceurl}}
{{^sourceurl}}{{#docurl}}
<a href="{{docurl}}" class="edit-link">{{__global.improveThisDoc}}</a>
{{/docurl}}{{/sourceurl}}
</div>
{{/_disableContribution}}

{{^_disableNextArticle}}
<div class="next-article d-print-none border-top" id="nextArticle"></div>
{{/_disableNextArticle}}

</div>

{{^_disableAffix}}
<div class="affix">
<nav id="affix"></nav>
</div>
{{/_disableAffix}}
</main>

{{#_enableSearch}}
<div class="container-xxl search-results" id="search-results"></div>
{{/_enableSearch}}

<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
{{{_appFooter}}}{{^_appFooter}}<span>Made with <a href="https://dotnet.github.io/docfx">docfx</a></span>{{/_appFooter}}
</div>
</div>
</footer>
<script src="./{{_rel}}public/version-switcher.js"></script>
</body>
{{/redirect_url}}
</html>
Loading
Loading