atlasdocs-theme 0.1.0__tar.gz
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-0.1.0/.gitignore +8 -0
- atlasdocs_theme-0.1.0/PKG-INFO +8 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/AQP.html +6 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/JIRA.html +6 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/__init__.py +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/banners/network.jpg +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/fonts/OpenSans-Italic-VariableFont_wdth_wght.ttf +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/fonts/OpenSans-VariableFont_wdth_wght.ttf +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/fonts/RobotoMono-Italic-VariableFont_wght.ttf +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/fonts/RobotoMono-VariableFont_wght.ttf +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/images/logo.svg +47 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/athena_changelog_loader.js +370 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/extra.js +319 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/indico_category_loader.js +179 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/jira_project_loader.js +296 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/mathjax.js +24 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/mermaid.min.js +1642 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/tex.js +1 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_AMS-Regular.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Bold.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Calligraphic-Regular.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Fraktur-Bold.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Fraktur-Regular.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Main-Bold.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Main-Italic.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Main-Regular.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Math-BoldItalic.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Math-Italic.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Math-Regular.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_SansSerif-Bold.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_SansSerif-Italic.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_SansSerif-Regular.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Script-Regular.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Size1-Regular.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Size2-Regular.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Size3-Regular.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Size4-Regular.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Typewriter-Regular.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Vector-Bold.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Vector-Regular.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/output/chtml/fonts/woff-v2/MathJax_Zero.woff +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/tablesort.js +6 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/tex-mml-chtml.js +1 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/javascripts/twikiregistry.js +2806 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/jira/blocker.svg +3 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/jira/critical.svg +7 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/jira/high.svg +3 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/jira/highest.svg +4 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/jira/icons.jpg +0 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/jira/low.svg +3 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/jira/lowest.svg +4 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/jira/major.svg +5 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/jira/medium.svg +16 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/jira/minor.svg +5 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/jira/trivial.svg +3 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/logo/atlaslogo.svg +8 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/stylesheets/badges.css +72 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/stylesheets/extra.classic.css +3023 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/stylesheets/extra.css +3157 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/stylesheets/jira.css +191 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/assets/stylesheets/twikiregistry.css +1867 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/bookmarks.html +54 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/config/02-assets.toml +14 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/config/04-theme.toml +113 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/config/05-markdown.toml +59 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/config/06-plugins.toml +12 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/feedback.html +17 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/frontpage.html +83 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/main.html +82 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/mkdocs_theme.yml +3 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/partials/actions.html +126 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/partials/announce.html +102 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/partials/aqp.html +60 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/partials/atlas_authors.html +277 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/partials/atlas_pagestatus.html +119 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/partials/content.html +84 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/partials/jira.html +60 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/partials/page-actions.html +80 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/partials/path-item.html +64 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/partials/path.html +180 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/partials/social.html +63 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/partials/source.html +20 -0
- atlasdocs_theme-0.1.0/atlasdocs_theme/user_profile.html +79 -0
- atlasdocs_theme-0.1.0/pyproject.toml +20 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: atlasdocs-theme
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: ATLAS documentation hub theme for Zensical/MkDocs
|
|
5
|
+
Author-email: Jason Oliver <jason.oliver@cern.ch>
|
|
6
|
+
License-Expression: Apache-2.0
|
|
7
|
+
Requires-Python: >=3.9
|
|
8
|
+
Requires-Dist: zensical>=0.0.34
|
|
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
|
+
})();
|