atlasdocs-theme 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- atlasdocs_theme/AQP.html +6 -0
- atlasdocs_theme/JIRA.html +6 -0
- atlasdocs_theme/__init__.py +0 -0
- atlasdocs_theme/assets/banners/network.jpg +0 -0
- atlasdocs_theme/assets/fonts/OpenSans-Italic-VariableFont_wdth_wght.ttf +0 -0
- atlasdocs_theme/assets/fonts/OpenSans-VariableFont_wdth_wght.ttf +0 -0
- atlasdocs_theme/assets/fonts/RobotoMono-Italic-VariableFont_wght.ttf +0 -0
- atlasdocs_theme/assets/fonts/RobotoMono-VariableFont_wght.ttf +0 -0
- atlasdocs_theme/assets/images/logo.svg +47 -0
- atlasdocs_theme/assets/javascripts/athena_changelog_loader.js +370 -0
- atlasdocs_theme/assets/javascripts/extra.js +319 -0
- atlasdocs_theme/assets/javascripts/indico_category_loader.js +179 -0
- atlasdocs_theme/assets/javascripts/jira_project_loader.js +296 -0
- atlasdocs_theme/assets/javascripts/mathjax.js +24 -0
- atlasdocs_theme/assets/javascripts/mermaid.min.js +1642 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/tex.js +1 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_AMS-Regular.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Bold.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Regular.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Fraktur-Bold.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Fraktur-Regular.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Main-Bold.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Main-Italic.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Main-Regular.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Math-BoldItalic.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Math-Italic.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Math-Regular.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_SansSerif-Bold.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_SansSerif-Italic.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_SansSerif-Regular.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Script-Regular.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Size1-Regular.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Size2-Regular.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Size3-Regular.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Size4-Regular.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Typewriter-Regular.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Vector-Bold.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Vector-Regular.woff +0 -0
- atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Zero.woff +0 -0
- atlasdocs_theme/assets/javascripts/tablesort.js +6 -0
- atlasdocs_theme/assets/javascripts/tex-mml-chtml.js +1 -0
- atlasdocs_theme/assets/javascripts/twikiregistry.js +2806 -0
- atlasdocs_theme/assets/jira/blocker.svg +3 -0
- atlasdocs_theme/assets/jira/critical.svg +7 -0
- atlasdocs_theme/assets/jira/high.svg +3 -0
- atlasdocs_theme/assets/jira/highest.svg +4 -0
- atlasdocs_theme/assets/jira/icons.jpg +0 -0
- atlasdocs_theme/assets/jira/low.svg +3 -0
- atlasdocs_theme/assets/jira/lowest.svg +4 -0
- atlasdocs_theme/assets/jira/major.svg +5 -0
- atlasdocs_theme/assets/jira/medium.svg +16 -0
- atlasdocs_theme/assets/jira/minor.svg +5 -0
- atlasdocs_theme/assets/jira/trivial.svg +3 -0
- atlasdocs_theme/assets/logo/atlaslogo.svg +8 -0
- atlasdocs_theme/assets/stylesheets/badges.css +72 -0
- atlasdocs_theme/assets/stylesheets/extra.classic.css +3023 -0
- atlasdocs_theme/assets/stylesheets/extra.css +3157 -0
- atlasdocs_theme/assets/stylesheets/jira.css +191 -0
- atlasdocs_theme/assets/stylesheets/twikiregistry.css +1867 -0
- atlasdocs_theme/bookmarks.html +54 -0
- atlasdocs_theme/config/02-assets.toml +14 -0
- atlasdocs_theme/config/04-theme.toml +113 -0
- atlasdocs_theme/config/05-markdown.toml +59 -0
- atlasdocs_theme/config/06-plugins.toml +12 -0
- atlasdocs_theme/feedback.html +17 -0
- atlasdocs_theme/frontpage.html +83 -0
- atlasdocs_theme/main.html +82 -0
- atlasdocs_theme/mkdocs_theme.yml +3 -0
- atlasdocs_theme/partials/actions.html +126 -0
- atlasdocs_theme/partials/announce.html +102 -0
- atlasdocs_theme/partials/aqp.html +60 -0
- atlasdocs_theme/partials/atlas_authors.html +277 -0
- atlasdocs_theme/partials/atlas_pagestatus.html +119 -0
- atlasdocs_theme/partials/content.html +84 -0
- atlasdocs_theme/partials/jira.html +60 -0
- atlasdocs_theme/partials/page-actions.html +80 -0
- atlasdocs_theme/partials/path-item.html +64 -0
- atlasdocs_theme/partials/path.html +180 -0
- atlasdocs_theme/partials/social.html +63 -0
- atlasdocs_theme/partials/source.html +20 -0
- atlasdocs_theme/user_profile.html +79 -0
- atlasdocs_theme-0.1.0.dist-info/METADATA +8 -0
- atlasdocs_theme-0.1.0.dist-info/RECORD +85 -0
- atlasdocs_theme-0.1.0.dist-info/WHEEL +4 -0
- atlasdocs_theme-0.1.0.dist-info/entry_points.txt +2 -0
atlasdocs_theme/AQP.html
ADDED
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg fill="none" stroke-linecap="square" stroke-miterlimit="10" version="1.1" viewBox="0 0 960 960" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<clipPath id="a">
|
|
4
|
+
<path d="m0 0h960v960h-960v-960z"/>
|
|
5
|
+
</clipPath>
|
|
6
|
+
<g clip-path="url(#a)" fill-rule="evenodd">
|
|
7
|
+
<path d="m0 0h960v960h-960z" fill="#000" fill-opacity="0"/>
|
|
8
|
+
<path d="m743.67 114.11c134.77 134.91 150.15 372.24 36.444 562.16-113.71 189.92-323.48 277.27-496.89 206.91l175.63-420.9z" fill="#000" fill-opacity="0"/>
|
|
9
|
+
<path d="m743.67 114.11c134.77 134.91 150.15 372.24 36.444 562.16-113.71 189.92-323.48 277.27-496.89 206.91" fill="#000" fill-opacity="0"/>
|
|
10
|
+
<path d="m743.67 114.11c134.77 134.91 150.15 372.24 36.444 562.16-113.71 189.92-323.48 277.27-496.89 206.91" stroke="#b0c7e7" stroke-linecap="butt" stroke-linejoin="round" stroke-width="28.315"/>
|
|
11
|
+
<path d="m236.77 95.905c83.304-29.975 240.71 98.301 363.69 296.39 122.98 198.08 171.31 401.19 111.67 469.28l-251.1-373.63z" fill="#000" fill-opacity="0"/>
|
|
12
|
+
<path d="m236.77 95.905c83.304-29.975 240.71 98.301 363.69 296.39 122.98 198.08 171.31 401.19 111.67 469.28" fill="#000" fill-opacity="0"/>
|
|
13
|
+
<path d="m236.77 95.905c83.304-29.975 240.71 98.301 363.69 296.39 122.98 198.08 171.31 401.19 111.67 469.28" stroke="#b0c7e7" stroke-linecap="butt" stroke-linejoin="round" stroke-width="28.315"/>
|
|
14
|
+
<path d="m876.63 268.44c28.933 37.411-22.899 114.92-135.41 202.49-112.51 87.57-268.01 171.43-406.23 219.08-138.22 47.652-237.44 51.603-259.19 10.321l402.14-213.27z" fill="#000" fill-opacity="0"/>
|
|
15
|
+
<path d="m876.63 268.44c28.933 37.411-22.899 114.92-135.41 202.49-112.51 87.57-268.01 171.43-406.23 219.08-138.22 47.652-237.44 51.603-259.19 10.321" fill="#000" fill-opacity="0"/>
|
|
16
|
+
<path d="m876.63 268.44c28.933 37.411-22.899 114.92-135.41 202.49-112.51 87.57-268.01 171.43-406.23 219.08-138.22 47.652-237.44 51.603-259.19 10.321" stroke="#b0c7e7" stroke-linecap="butt" stroke-linejoin="round" stroke-width="28.315"/>
|
|
17
|
+
<path d="m216.89 112.67c83.304-29.975 240.71 98.301 363.69 296.39 122.98 198.08 171.31 401.19 111.67 469.28l-251.1-373.63z" fill="#000" fill-opacity="0"/>
|
|
18
|
+
<path d="m216.89 112.67c83.304-29.975 240.71 98.301 363.69 296.39 122.98 198.08 171.31 401.19 111.67 469.28" fill="#000" fill-opacity="0"/>
|
|
19
|
+
<path d="m216.89 112.67c83.304-29.975 240.71 98.301 363.69 296.39 122.98 198.08 171.31 401.19 111.67 469.28" stroke="#b0c7e7" stroke-linecap="butt" stroke-linejoin="round" stroke-width="28.315"/>
|
|
20
|
+
<path d="m762.54 132.99c134.77 134.91 150.15 372.24 36.444 562.16-113.71 189.92-323.48 277.27-496.89 206.91l175.63-420.9z" fill="#000" fill-opacity="0"/>
|
|
21
|
+
<path d="m762.54 132.99c134.77 134.91 150.15 372.24 36.444 562.16-113.71 189.92-323.48 277.27-496.89 206.91" fill="#000" fill-opacity="0"/>
|
|
22
|
+
<path d="m762.54 132.99c134.77 134.91 150.15 372.24 36.444 562.16-113.71 189.92-323.48 277.27-496.89 206.91" stroke="#b0c7e7" stroke-linecap="butt" stroke-linejoin="round" stroke-width="28.315"/>
|
|
23
|
+
<path d="m867.19 242.24c28.933 37.411-22.899 114.92-135.41 202.49-112.51 87.57-268.01 171.43-406.23 219.08-138.22 47.652-237.44 51.603-259.19 10.321l402.14-213.27z" fill="#000" fill-opacity="0"/>
|
|
24
|
+
<path d="m867.19 242.24c28.933 37.411-22.899 114.92-135.41 202.49-112.51 87.57-268.01 171.43-406.23 219.08-138.22 47.652-237.44 51.603-259.19 10.321" fill="#000" fill-opacity="0"/>
|
|
25
|
+
<path d="m867.19 242.24c28.933 37.411-22.899 114.92-135.41 202.49-112.51 87.57-268.01 171.43-406.23 219.08-138.22 47.652-237.44 51.603-259.19 10.321" stroke="#b0c7e7" stroke-linecap="butt" stroke-linejoin="round" stroke-width="28.315"/>
|
|
26
|
+
<path d="m662.3 893.86c-83.325 29.941-240.09-97.959-362.17-295.47-122.08-197.51-169.5-400-109.56-467.78l249.25 372.5z" fill="#000" fill-opacity="0"/>
|
|
27
|
+
<path d="m662.3 893.86c-83.325 29.941-240.09-97.959-362.17-295.47-122.08-197.51-169.5-400-109.56-467.78" fill="#000" fill-opacity="0"/>
|
|
28
|
+
<path d="m662.3 893.86c-83.325 29.941-240.09-97.959-362.17-295.47-122.08-197.51-169.5-400-109.56-467.78" stroke="#0a80c3" stroke-linecap="butt" stroke-linejoin="round" stroke-width="42.129"/>
|
|
29
|
+
<path d="m171.56 804.27c-120.76-151.25-115.1-391.71 13.417-569.79 128.52-178.08 342.63-242.13 507.34-151.78l-209.44 403.89z" fill="#000" fill-opacity="0"/>
|
|
30
|
+
<path d="m171.56 804.27c-120.76-151.25-115.1-391.71 13.417-569.79 128.52-178.08 342.63-242.13 507.34-151.78" fill="#000" fill-opacity="0"/>
|
|
31
|
+
<path d="m171.56 804.27c-120.76-151.25-115.1-391.71 13.417-569.79 128.52-178.08 342.63-242.13 507.34-151.78" stroke="#0a80c3" stroke-linecap="butt" stroke-linejoin="round" stroke-width="28.315"/>
|
|
32
|
+
<path d="m70.824 665.15c-27.586-36.248 24.964-110.79 137.27-194.7 112.3-83.919 266.69-164.02 403.29-209.23 136.6-45.212 233.92-48.425 254.21-8.3936l-399.05 203.51z" fill="#000" fill-opacity="0"/>
|
|
33
|
+
<path d="m70.824 665.15c-27.586-36.248 24.964-110.79 137.27-194.7 112.3-83.919 266.69-164.02 403.29-209.23 136.6-45.212 233.92-48.425 254.21-8.3936" fill="#000" fill-opacity="0"/>
|
|
34
|
+
<path d="m70.824 665.15c-27.586-36.248 24.964-110.79 137.27-194.7 112.3-83.919 266.69-164.02 403.29-209.23 136.6-45.212 233.92-48.425 254.21-8.3936" stroke="#0a80c3" stroke-linecap="butt" stroke-linejoin="round" stroke-width="42.129"/>
|
|
35
|
+
<path d="m89.699 701c-27.586-36.248 24.964-110.79 137.27-194.7 112.3-83.919 266.69-164.02 403.29-209.23 136.6-45.212 233.91-48.425 254.21-8.3936l-399.05 203.51z" fill="#000" fill-opacity="0"/>
|
|
36
|
+
<path d="m89.699 701c-27.586-36.248 24.964-110.79 137.27-194.7 112.3-83.919 266.69-164.02 403.29-209.23 136.6-45.212 233.91-48.425 254.21-8.3936" fill="#000" fill-opacity="0"/>
|
|
37
|
+
<path d="m89.699 701c-27.586-36.248 24.964-110.79 137.27-194.7 112.3-83.919 266.69-164.02 403.29-209.23 136.6-45.212 233.91-48.425 254.21-8.3936" stroke="#0a80c3" stroke-linecap="butt" stroke-linejoin="round" stroke-width="42.129"/>
|
|
38
|
+
<path d="m692.73 878.64c-83.44 29.63-241.04-99.763-364.2-299.02-123.16-199.25-171.62-403.24-112-471.4l251.59 375.98z" fill="#000" fill-opacity="0"/>
|
|
39
|
+
<path d="m692.73 878.64c-83.44 29.63-241.04-99.763-364.2-299.02-123.16-199.25-171.62-403.24-112-471.4" fill="#000" fill-opacity="0"/>
|
|
40
|
+
<path d="m692.73 878.64c-83.44 29.63-241.04-99.763-364.2-299.02-123.16-199.25-171.62-403.24-112-471.4" stroke="#0a80c3" stroke-linecap="butt" stroke-linejoin="round" stroke-width="42.129"/>
|
|
41
|
+
<path d="m190.43 823.14c-120.76-151.25-115.1-391.71 13.417-569.79 128.52-178.08 342.63-242.13 507.34-151.78l-209.44 403.89z" fill="#000" fill-opacity="0"/>
|
|
42
|
+
<path d="m190.43 823.14c-120.76-151.25-115.1-391.71 13.417-569.79 128.52-178.08 342.63-242.13 507.34-151.78" fill="#000" fill-opacity="0"/>
|
|
43
|
+
<path d="m190.43 823.14c-120.76-151.25-115.1-391.71 13.417-569.79 128.52-178.08 342.63-242.13 507.34-151.78" stroke="#0a80c3" stroke-linecap="butt" stroke-linejoin="round" stroke-width="28.315"/>
|
|
44
|
+
<path d="m25.979 480.25c0-249.78 202.56-452.27 452.43-452.27 119.99 0 235.07 47.649 319.91 132.47 84.846 84.817 132.51 199.85 132.51 319.8 0 249.78-202.56 452.27-452.43 452.27-249.87 0-452.43-202.49-452.43-452.27zm19.366 0c0 239.08 193.89 432.9 433.06 432.9 239.17 0 433.06-193.82 433.06-432.9 0-239.08-193.89-432.9-433.06-432.9-239.17 0-433.06 193.82-433.06 432.9z" fill="#000" fill-opacity="0"/>
|
|
45
|
+
<path d="m25.979 480.25c0-249.78 202.56-452.27 452.43-452.27 119.99 0 235.07 47.649 319.91 132.47 84.846 84.817 132.51 199.85 132.51 319.8 0 249.78-202.56 452.27-452.43 452.27-249.87 0-452.43-202.49-452.43-452.27zm19.366 0c0 239.08 193.89 432.9 433.06 432.9 239.17 0 433.06-193.82 433.06-432.9 0-239.08-193.89-432.9-433.06-432.9-239.17 0-433.06 193.82-433.06 432.9z" stroke="#0b80c3" stroke-linecap="butt" stroke-linejoin="round" stroke-width="42.129"/>
|
|
46
|
+
</g>
|
|
47
|
+
</svg>
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazy-loads a changelog.json (produced by build_changelog.py) and renders
|
|
3
|
+
* a filterable, sortable merge-request table grouped by release.
|
|
4
|
+
*
|
|
5
|
+
* Usage in a .md file body:
|
|
6
|
+
*
|
|
7
|
+
* <div id="athena-changelog"
|
|
8
|
+
* data-json="./changelog.json"
|
|
9
|
+
* data-project="atlas/athena"
|
|
10
|
+
* data-gitlab="https://gitlab.cern.ch"></div>
|
|
11
|
+
* <script src="athena_changelog_loader.js"></script>
|
|
12
|
+
*/
|
|
13
|
+
(function () {
|
|
14
|
+
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Icons
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
const ICONS = {
|
|
20
|
+
externalLink: `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24"><path d="M15 3h6v6M10 14 21 3M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/></svg>`,
|
|
21
|
+
merge: `<svg xmlns="http://www.w3.org/2000/svg" width="0.7em" height="0.7em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="18" r="3"/><circle cx="6" cy="6" r="3"/><path d="M6 21V9a9 9 0 0 0 9 9"/></svg>`,
|
|
22
|
+
tag: `<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24"><path d="M12 2H2v10l9.29 9.29a1 1 0 0 0 1.41 0l7.29-7.29a1 1 0 0 0 0-1.41z"/><path d="M7 7h.01"/></svg>`,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
function ic(key) { return `<span class="twemoji">${ICONS[key]}</span>`; }
|
|
26
|
+
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Helpers
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
function escapeHtml(s) {
|
|
32
|
+
if (!s) return '';
|
|
33
|
+
return s.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function boldCamelCase(s) {
|
|
37
|
+
// Bold any word containing a lowercase→uppercase transition (e.g. AnalysisBase, xAOD, MuonSpectrometer)
|
|
38
|
+
return s.replace(/\b[A-Za-z]*[a-z][A-Z][A-Za-z]*\b/g, '<strong>$&</strong>');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Numeric version sort — handles "24.0.10" > "24.0.9" correctly
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
function parseVersion(v) {
|
|
46
|
+
return String(v || '').split(/[\.\-_]/).map(p => { const n = parseInt(p, 10); return isNaN(n) ? p : n; });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function compareVersions(a, b) {
|
|
50
|
+
const pa = parseVersion(a), pb = parseVersion(b);
|
|
51
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
52
|
+
const x = pa[i] ?? -Infinity, y = pb[i] ?? -Infinity;
|
|
53
|
+
if (x < y) return -1;
|
|
54
|
+
if (x > y) return 1;
|
|
55
|
+
}
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// Label colour cycling — deterministic by label name
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
const LABEL_COLOURS = ['blue','green','yellow','purple','teal','orange'];
|
|
64
|
+
|
|
65
|
+
const _labelColourCache = {};
|
|
66
|
+
function labelColour(name) {
|
|
67
|
+
if (!_labelColourCache[name]) {
|
|
68
|
+
let h = 0;
|
|
69
|
+
for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) & 0xffff;
|
|
70
|
+
_labelColourCache[name] = LABEL_COLOURS[h % LABEL_COLOURS.length];
|
|
71
|
+
}
|
|
72
|
+
return _labelColourCache[name];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function renderLabels(labels) {
|
|
76
|
+
if (!labels || !labels.length) return '—';
|
|
77
|
+
return labels
|
|
78
|
+
.map(l => `<span class="atlaslabel ${labelColour(l)}" style="font-size:0.75em;margin:0 1px">${escapeHtml(l)}</span>`)
|
|
79
|
+
.join(' ');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Flatten all MRs from releases into a single row list
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
|
|
86
|
+
function flattenMRs(releases) {
|
|
87
|
+
const rows = [];
|
|
88
|
+
for (const rel of releases) {
|
|
89
|
+
for (const mr of (rel.mrs || [])) {
|
|
90
|
+
rows.push({ ...mr, release: rel.version, release_date: rel.date, tag: rel.tag });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return rows;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// Table — fixed column widths
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
|
|
100
|
+
const COLS = [
|
|
101
|
+
['MR', '5%'],
|
|
102
|
+
['Title', '38%'],
|
|
103
|
+
['Author', '14%'],
|
|
104
|
+
['Merged', '8%'],
|
|
105
|
+
['Labels', '21%'],
|
|
106
|
+
['Release', '14%'],
|
|
107
|
+
];
|
|
108
|
+
|
|
109
|
+
const COLGROUP = `<colgroup>${COLS.map(([,w]) => `<col style="width:${w}">`).join('')}</colgroup>`;
|
|
110
|
+
const THEAD = `<thead><tr>${COLS.map(([h]) => `<th>${h}</th>`).join('')}</tr></thead>`;
|
|
111
|
+
|
|
112
|
+
function renderRow(row, gitlabBase, project) {
|
|
113
|
+
const tagCell = row.tag
|
|
114
|
+
? `<a href="${gitlabBase}/${project}/-/tags/${escapeHtml(row.tag)}">${escapeHtml(row.release)}</a>`
|
|
115
|
+
: `<em>${escapeHtml(row.release)}</em>`;
|
|
116
|
+
|
|
117
|
+
return `<tr>`
|
|
118
|
+
+ `<td><a href="${escapeHtml(row.web_url)}">${ic('merge')}!${row.iid}</a></td>`
|
|
119
|
+
+ `<td>${boldCamelCase(escapeHtml(row.title))}</td>`
|
|
120
|
+
+ `<td>${escapeHtml(row.author)}</td>`
|
|
121
|
+
+ `<td>${row.merged_at || '—'}</td>`
|
|
122
|
+
+ `<td>${renderLabels(row.labels)}</td>`
|
|
123
|
+
+ `<td>${tagCell}</td>`
|
|
124
|
+
+ `</tr>`;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function buildTable(rows, gitlabBase, project) {
|
|
128
|
+
if (!rows.length) return '<p><em>No merge requests match.</em></p>';
|
|
129
|
+
return `<div class="md-typeset__scrollwrap"><div class="md-typeset__table">`
|
|
130
|
+
+ `<table style="table-layout:fixed;width:100%">`
|
|
131
|
+
+ COLGROUP + THEAD
|
|
132
|
+
+ `<tbody>${rows.map(r => renderRow(r, gitlabBase, project)).join('')}</tbody>`
|
|
133
|
+
+ `</table></div></div>`;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
// Sparkline — MRs merged per year
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
|
|
140
|
+
function buildSvg(rows) {
|
|
141
|
+
const yearMap = {};
|
|
142
|
+
for (const r of rows) {
|
|
143
|
+
const yr = (r.merged_at || '').slice(0, 4);
|
|
144
|
+
if (yr) yearMap[yr] = (yearMap[yr] || 0) + 1;
|
|
145
|
+
}
|
|
146
|
+
const yearCounts = Object.entries(yearMap).sort(([a],[b]) => a.localeCompare(b));
|
|
147
|
+
const n = yearCounts.length;
|
|
148
|
+
if (n === 0) return '';
|
|
149
|
+
|
|
150
|
+
const W = 480, H = 126, padL = 28, padR = 28;
|
|
151
|
+
const xRange = W - padL - padR;
|
|
152
|
+
const bottomY = 72, topPad = 20, chartH = bottomY - topPad;
|
|
153
|
+
const currentYear = String(new Date().getFullYear());
|
|
154
|
+
const maxCount = Math.max(...yearCounts.map(([,c]) => c), 1);
|
|
155
|
+
|
|
156
|
+
const pts = yearCounts.map(([yr, count], i) => ({
|
|
157
|
+
x: n === 1 ? Math.round(W / 2) : padL + Math.round(i * xRange / (n - 1)),
|
|
158
|
+
y: Math.round(bottomY - (count / maxCount) * chartH),
|
|
159
|
+
yr, count,
|
|
160
|
+
}));
|
|
161
|
+
|
|
162
|
+
let lines = '', dots = '';
|
|
163
|
+
for (let i = 0; i < pts.length - 1; i++) {
|
|
164
|
+
const dashed = pts[i+1].yr >= currentYear ? ' stroke-dasharray="5 3"' : '';
|
|
165
|
+
lines += `<line x1="${pts[i].x}" y1="${pts[i].y}" x2="${pts[i+1].x}" y2="${pts[i+1].y}" stroke="currentColor" stroke-width="1.5" opacity="0.65"${dashed}></line>`;
|
|
166
|
+
}
|
|
167
|
+
for (const pt of pts) {
|
|
168
|
+
const hollow = pt.yr >= currentYear;
|
|
169
|
+
dots += `<circle cx="${pt.x}" cy="${pt.y}" r="3" fill="${hollow?'none':'currentColor'}" stroke="currentColor" stroke-width="1.5" opacity="0.8"></circle>`;
|
|
170
|
+
dots += `<text x="${pt.x}" y="${pt.y-7}" text-anchor="middle" font-size="9" font-family="inherit" fill="currentColor" opacity="0.7">${pt.count.toLocaleString()}</text>`;
|
|
171
|
+
dots += `<text x="${pt.x}" y="88" text-anchor="middle" font-size="9" font-family="inherit" fill="currentColor" opacity="0.4">${pt.yr}</text>`;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return `<div style="text-align:center;margin-bottom:1.6em">`
|
|
175
|
+
+ `<svg width="${W}" height="${H}" viewBox="0 0 ${W} ${H}" xmlns="http://www.w3.org/2000/svg" style="max-width:100%;display:inline-block;">`
|
|
176
|
+
+ lines + dots + `</svg></div>`;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
// Filter + sort
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
|
|
183
|
+
function applyFilters(state) {
|
|
184
|
+
const { rows, gitlabBase, project, release, author, selectedLabels, labelMode, sortKey, countEl, tableEl } = state;
|
|
185
|
+
|
|
186
|
+
let filtered = release ? rows.filter(r => r.release === release) : [...rows];
|
|
187
|
+
if (author) filtered = filtered.filter(r => r.author === author);
|
|
188
|
+
|
|
189
|
+
// Label filter: ANY label in selectedLabels must appear on the MR
|
|
190
|
+
if (selectedLabels.size < state.allLabels.size) {
|
|
191
|
+
filtered = filtered.filter(r =>
|
|
192
|
+
(r.labels || []).some(l => selectedLabels.has(l))
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
filtered.sort((a, b) => {
|
|
197
|
+
switch (sortKey) {
|
|
198
|
+
case 'iid-asc': return a.iid - b.iid;
|
|
199
|
+
case 'iid-desc': return b.iid - a.iid;
|
|
200
|
+
case 'merged-asc': return (a.merged_at || '').localeCompare(b.merged_at || '');
|
|
201
|
+
case 'merged-desc': return (b.merged_at || '').localeCompare(a.merged_at || '');
|
|
202
|
+
case 'release-asc': return (a.release_date || '').localeCompare(b.release_date || '');
|
|
203
|
+
case 'release-desc': return (b.release_date || '').localeCompare(a.release_date || '');
|
|
204
|
+
default: return b.iid - a.iid;
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
countEl.textContent = `Showing ${filtered.length.toLocaleString()} of ${rows.length.toLocaleString()} merge requests.`;
|
|
209
|
+
tableEl.innerHTML = buildTable(filtered, gitlabBase, project);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
// Main render
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
|
|
216
|
+
function renderAll(container, data) {
|
|
217
|
+
const project = container.dataset.project || data.project || 'atlas/athena';
|
|
218
|
+
const gitlabBase = (container.dataset.gitlab || 'https://gitlab.cern.ch').replace(/\/$/, '');
|
|
219
|
+
const releases = data.releases || [];
|
|
220
|
+
const allRows = flattenMRs(releases);
|
|
221
|
+
const generated = (data.generated_at || '').slice(0, 10);
|
|
222
|
+
|
|
223
|
+
const releaseNames = [...new Set(releases.map(r => r.version))]
|
|
224
|
+
.sort((a, b) => compareVersions(b, a)); // newest first, numeric
|
|
225
|
+
const authors = [...new Set(allRows.map(r => r.author).filter(Boolean))].sort((a,b) => a.localeCompare(b));
|
|
226
|
+
|
|
227
|
+
// All unique labels, sorted alphabetically
|
|
228
|
+
const allLabelsSet = new Set();
|
|
229
|
+
for (const row of allRows) for (const l of (row.labels || [])) allLabelsSet.add(l);
|
|
230
|
+
const allLabels = [...allLabelsSet].sort((a,b) => a.localeCompare(b));
|
|
231
|
+
|
|
232
|
+
const ctrlStyle = [
|
|
233
|
+
'padding:0.28em 0.55em','font-size:0.82em',
|
|
234
|
+
'border:1px solid var(--md-default-fg-color--lightest)',
|
|
235
|
+
'border-radius:4px','background:var(--md-default-bg-color)',
|
|
236
|
+
'color:inherit','outline:none',
|
|
237
|
+
].join(';');
|
|
238
|
+
|
|
239
|
+
const releaseOptions = [`<option value="">All releases (${releaseNames.length})</option>`]
|
|
240
|
+
.concat(releaseNames.map(v => `<option value="${escapeHtml(v)}">${escapeHtml(v)}</option>`))
|
|
241
|
+
.join('');
|
|
242
|
+
|
|
243
|
+
const authorOptions = [`<option value="">All authors (${authors.length})</option>`]
|
|
244
|
+
.concat(authors.map(a => `<option value="${escapeHtml(a)}">${escapeHtml(a)}</option>`))
|
|
245
|
+
.join('');
|
|
246
|
+
|
|
247
|
+
const labelChips = allLabels.map(l => {
|
|
248
|
+
const cls = labelColour(l);
|
|
249
|
+
return `<label style="cursor:pointer;user-select:none">`
|
|
250
|
+
+ `<input type="checkbox" value="${escapeHtml(l)}" checked style="position:absolute;opacity:0;width:0;height:0">`
|
|
251
|
+
+ `<span class="atlaslabel ${cls}" style="font-size:0.8em">${escapeHtml(l)}</span>`
|
|
252
|
+
+ `</label>`;
|
|
253
|
+
}).join('');
|
|
254
|
+
|
|
255
|
+
container.innerHTML =
|
|
256
|
+
`<div class="admonition info">`
|
|
257
|
+
+ `<p class="admonition-title">${ic('tag')} ${escapeHtml(project)} merge requests`
|
|
258
|
+
+ (generated ? ` <span style="font-weight:normal;opacity:0.6;font-size:0.9em">· generated ${generated}</span>` : '')
|
|
259
|
+
+ ` · <a href="${gitlabBase}/${project}/-/merge_requests">${ic('merge')} GitLab</a>`
|
|
260
|
+
+ `</p></div>`
|
|
261
|
+
|
|
262
|
+
+ `<p style="text-align:center;font-size:0.82em;opacity:0.6;margin:0 0 1.2em">`
|
|
263
|
+
+ `${releaseNames.length} releases · ${allRows.length.toLocaleString()} merge requests · ${authors.length} contributors`
|
|
264
|
+
+ `</p>`
|
|
265
|
+
|
|
266
|
+
+ buildSvg(allRows)
|
|
267
|
+
|
|
268
|
+
+ `<div style="display:flex;flex-wrap:wrap;gap:0.5em;align-items:center;margin-bottom:0.75em">`
|
|
269
|
+
+ `<select id="cl-release" style="${ctrlStyle};flex:1;min-width:150px">${releaseOptions}</select>`
|
|
270
|
+
+ `<select id="cl-author" style="${ctrlStyle};flex:1;min-width:150px">${authorOptions}</select>`
|
|
271
|
+
+ `<select id="cl-sort" style="${ctrlStyle}">`
|
|
272
|
+
+ `<option value="iid-desc">MR ↓</option>`
|
|
273
|
+
+ `<option value="iid-asc">MR ↑</option>`
|
|
274
|
+
+ `<option value="merged-desc">Merged ↓</option>`
|
|
275
|
+
+ `<option value="merged-asc">Merged ↑</option>`
|
|
276
|
+
+ `<option value="release-desc">Release ↓</option>`
|
|
277
|
+
+ `<option value="release-asc">Release ↑</option>`
|
|
278
|
+
+ `</select></div>`
|
|
279
|
+
|
|
280
|
+
+ `<details style="margin-bottom:0.8em"><summary style="font-size:0.82em;cursor:pointer;opacity:0.7">Filter by label (${allLabels.length})</summary>`
|
|
281
|
+
+ `<div id="cl-chips" style="display:flex;flex-wrap:wrap;gap:0.35em;margin-top:0.5em">${labelChips}</div>`
|
|
282
|
+
+ `</details>`
|
|
283
|
+
|
|
284
|
+
+ `<p id="cl-count" style="font-size:0.82em;opacity:0.6;margin:0 0 0.5em"></p>`
|
|
285
|
+
+ `<div id="cl-table"></div>`;
|
|
286
|
+
|
|
287
|
+
const state = {
|
|
288
|
+
rows: allRows, gitlabBase, project,
|
|
289
|
+
release: '', author: '',
|
|
290
|
+
selectedLabels: new Set(allLabels),
|
|
291
|
+
allLabels: new Set(allLabels),
|
|
292
|
+
sortKey: 'iid-desc',
|
|
293
|
+
countEl: container.querySelector('#cl-count'),
|
|
294
|
+
tableEl: container.querySelector('#cl-table'),
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
applyFilters(state);
|
|
298
|
+
|
|
299
|
+
container.querySelector('#cl-release').addEventListener('change', e => { state.release = e.target.value; applyFilters(state); });
|
|
300
|
+
container.querySelector('#cl-author').addEventListener('change', e => { state.author = e.target.value; applyFilters(state); });
|
|
301
|
+
container.querySelector('#cl-sort').addEventListener('change', e => { state.sortKey = e.target.value; applyFilters(state); });
|
|
302
|
+
|
|
303
|
+
container.querySelector('#cl-chips').addEventListener('change', e => {
|
|
304
|
+
const cb = e.target;
|
|
305
|
+
if (cb.type !== 'checkbox') return;
|
|
306
|
+
const chip = cb.nextElementSibling;
|
|
307
|
+
if (cb.checked) { state.selectedLabels.add(cb.value); chip.style.opacity = ''; }
|
|
308
|
+
else { state.selectedLabels.delete(cb.value); chip.style.opacity = '0.3'; }
|
|
309
|
+
applyFilters(state);
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// ---------------------------------------------------------------------------
|
|
314
|
+
// Compact renderer — all MRs grouped under H2 release headers
|
|
315
|
+
// ---------------------------------------------------------------------------
|
|
316
|
+
|
|
317
|
+
function renderCompact(container, data) {
|
|
318
|
+
const project = container.dataset.project || data.project || 'atlas/athena';
|
|
319
|
+
const gitlabBase = (container.dataset.gitlab || 'https://gitlab.cern.ch').replace(/\/$/, '');
|
|
320
|
+
const releases = (data.releases || [])
|
|
321
|
+
.filter(r => r.mrs && r.mrs.length)
|
|
322
|
+
.sort((a, b) => compareVersions(b.version, a.version));
|
|
323
|
+
|
|
324
|
+
const totalMRs = releases.reduce((n, r) => n + r.mrs.length, 0);
|
|
325
|
+
|
|
326
|
+
const sections = releases.map(rel => {
|
|
327
|
+
const tagHref = rel.tag
|
|
328
|
+
? `${gitlabBase}/${project}/-/tags/${escapeHtml(rel.tag)}`
|
|
329
|
+
: `${gitlabBase}/${project}/-/merge_requests`;
|
|
330
|
+
const dateStr = rel.date ? ` <span style="font-weight:normal;opacity:0.5;font-size:0.8em"> · ${rel.date}</span>` : '';
|
|
331
|
+
const heading = `<h2 style="margin:1.4em 0 0.3em"><a href="${tagHref}">${escapeHtml(rel.version)}${dateStr}</a></h2>`;
|
|
332
|
+
const items = rel.mrs.map(mr =>
|
|
333
|
+
`<p style="margin:0.15em 0;font-size:0.88em;font-family:var(--md-code-font,monospace)">`
|
|
334
|
+
+ `<a href="${escapeHtml(mr.web_url)}">${ic('merge')}!${mr.iid}</a>`
|
|
335
|
+
+ ` — ${boldCamelCase(escapeHtml(mr.title))}`
|
|
336
|
+
+ `</p>`
|
|
337
|
+
).join('');
|
|
338
|
+
return heading + items;
|
|
339
|
+
}).join('');
|
|
340
|
+
|
|
341
|
+
container.innerHTML =
|
|
342
|
+
`<p style="font-size:0.82em;opacity:0.6;margin:0 0 0.8em">`
|
|
343
|
+
+ `${releases.length} releases · ${totalMRs.toLocaleString()} merge requests`
|
|
344
|
+
+ `</p>`
|
|
345
|
+
+ (sections || '<p><em>No merge requests found.</em></p>');
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// ---------------------------------------------------------------------------
|
|
349
|
+
// Fetch + lazy-load trigger
|
|
350
|
+
// ---------------------------------------------------------------------------
|
|
351
|
+
|
|
352
|
+
function load(container) {
|
|
353
|
+
const src = container.dataset.json;
|
|
354
|
+
if (!src) return;
|
|
355
|
+
container.innerHTML = '<p><em>Loading…</em></p>';
|
|
356
|
+
const compact = container.dataset.compact === 'true';
|
|
357
|
+
fetch(src)
|
|
358
|
+
.then(r => { if (!r.ok) throw new Error(`HTTP ${r.status}`); return r.json(); })
|
|
359
|
+
.then(data => compact ? renderCompact(container, data) : renderAll(container, data))
|
|
360
|
+
.catch(err => { container.innerHTML = `<p><em>Could not load changelog: ${err.message}</em></p>`; });
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
const container = document.getElementById('athena-changelog');
|
|
364
|
+
if (!container) return;
|
|
365
|
+
|
|
366
|
+
new IntersectionObserver((entries, obs) => {
|
|
367
|
+
entries.forEach(e => { if (e.isIntersecting) { obs.unobserve(e.target); load(e.target); } });
|
|
368
|
+
}, { rootMargin: '300px' }).observe(container);
|
|
369
|
+
|
|
370
|
+
})();
|