@@ -18,7 +18,6 @@ concurrency:
1818 cancel-in-progress : false
1919
2020jobs :
21- # ── Guard: check repo visibility ────────────────────────────────
2221 check-visibility :
2322 runs-on : ubuntu-latest
2423 outputs :
3433 echo "is_private=false" >> "$GITHUB_OUTPUT"
3534 fi
3635
37- # ── Teardown: remove Pages if repo is private ───────────────────
3836 teardown :
3937 runs-on : ubuntu-latest
4038 needs : check-visibility
6159 done
6260 echo "All Pages deployments removed"
6361
64- # ── Build (only if public) ──────────────────────────────────────
6562 build :
6663 runs-on : ubuntu-latest
6764 needs : check-visibility
@@ -111,7 +108,6 @@ jobs:
111108
112109 echo "::group::Generating Jekyll config and layout"
113110
114- # ── _config.yml ───────────────────────────────────────────────
115111 cat > _config.yml << CONFIGEOF
116112 title: "${REPO}"
117113 description: "${DESC}"
@@ -127,7 +123,6 @@ jobs:
127123 nav_section: docs
128124 CONFIGEOF
129125
130- # ── _layouts/default.html ─────────────────────────────────────
131126 mkdir -p _layouts
132127 cat > _layouts/default.html << 'LAYOUTEOF'
133128 <!DOCTYPE html>
@@ -136,7 +131,7 @@ jobs:
136131 <meta charset="UTF-8">
137132 <meta name="viewport" content="width=device-width, initial-scale=1.0">
138133 <title>{{ page.title | default: site.title }}</title>
139- <link rel="icon" type="image/svg+xml" href="https:// raw.githubusercontent.com/PowerShell/PowerShell/refs/heads/master/ assets/ps_black_128 .svg">
134+ <link rel="icon" type="image/svg+xml" href="{{ site.github_repo | replace: 'github.com', ' raw.githubusercontent.com' }}/main/ assets/favicon .svg">
140135 <link rel="preconnect" href="https://fonts.googleapis.com">
141136 <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet">
142137 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css">
@@ -146,13 +141,15 @@ jobs:
146141 --text-primary:#24292f;--text-secondary:#57606a;--text-muted:#8b949e;
147142 --border:#d0d7de;--link:#0969da;--accent:#fd8c73;
148143 --badge-bg:#dafbe1;--badge-text:#1a7f37;
144+ --inline-code-bg:#eff1f3;--inline-code-text:#24292f;
149145 }
150146 @media(prefers-color-scheme:dark){
151147 :root{
152148 --bg-page:#0d1117;--bg-content:#161b22;--bg-header:#161b22;--bg-code:#1c2129;
153149 --text-primary:#e6edf3;--text-secondary:#8b949e;--text-muted:#6e7681;
154150 --border:#30363d;--link:#58a6ff;--accent:#f78166;
155151 --badge-bg:#1b3826;--badge-text:#3fb950;
152+ --inline-code-bg:#343942;--inline-code-text:#e6edf3;
156153 }
157154 }
158155 *{margin:0;padding:0;box-sizing:border-box}
@@ -174,39 +171,41 @@ jobs:
174171 .content p{font-size:14px;color:var(--text-secondary);margin:0 0 16px}
175172 .content ul,.content ol{font-size:14px;color:var(--text-secondary);margin:0 0 16px;padding-left:24px}
176173 .content li{margin-bottom:4px}
177- .content code{font-family:'IBM Plex Mono',monospace;font-size:13px;background:var(--bg- code);padding:2px 6px;border-radius:4px}
178- .content pre{background:var(--bg-code);border:1px solid var(--border);border-radius:6px;padding:16px;overflow-x:auto;margin:8px 0 16px;line-height:1.5}
179- .content pre code{background:transparent;padding:0}
174+ code{font-family:'IBM Plex Mono',monospace;font-size:13px;background:var(--inline-code-bg);color:var(--inline- code-text );padding:2px 6px;border-radius:4px}
175+ pre{background:var(--bg-code);border:1px solid var(--border);border-radius:6px;padding:16px;overflow-x:auto;margin:8px 0 16px;line-height:1.5}
176+ pre code{background:transparent;color:inherit ;padding:0}
180177 .content table{width:100%;border-collapse:collapse;margin:8px 0 16px;font-size:14px}
181178 .content th,.content td{border:1px solid var(--border);padding:8px 12px;text-align:left}
182179 .content th{background:var(--bg-code);font-weight:500}
183180 .content img{max-width:100%}
184- .content strong{color:var(--text-primary)}
181+ .content strong{color:inherit}
182+ .content hr{border:none;border-top:1px solid var(--border);margin:24px 0}
185183 .release{border:1px solid var(--border);border-radius:6px;margin-bottom:8px}
186184 .release>summary{padding:12px 16px;cursor:pointer;display:flex;align-items:center;gap:8px;font-size:14px;list-style:none}
187185 .release>summary::-webkit-details-marker{display:none}
188- .release>summary::before{content:'';display:inline-block;width:0;height:0;border-left:5px solid var(--text-muted);border-top:4px solid transparent;border-bottom:4px solid transparent;transition:transform 0.15s}
186+ .release>summary::before{content:'';display:inline-block;width:0;height:0;border-left:5px solid var(--text-muted);border-top:4px solid transparent;border-bottom:4px solid transparent;transition:transform 0.15s;flex-shrink:0 }
189187 .release[open]>summary::before{transform:rotate(90deg)}
190188 .release-tag{font-family:'IBM Plex Mono',monospace;font-weight:500;color:var(--link)}
191189 .release-date{font-size:13px;color:var(--text-muted)}
190+ .release-sha{font-family:'IBM Plex Mono',monospace;font-size:12px;color:var(--text-muted);margin-left:auto}
192191 .release-latest{font-size:11px;padding:2px 8px;border-radius:16px;background:var(--badge-bg);color:var(--badge-text);font-weight:500}
193192 .release-body{padding:0 16px 16px;font-size:14px;color:var(--text-secondary);line-height:1.7}
194193 .release-body h2,.release-body h3{font-size:14px;font-weight:500;color:var(--text-primary);margin:12px 0 4px;border:none;padding:0}
195194 .release-body ul{padding-left:20px}
196195 .release-body li{margin-bottom:2px;font-size:13px}
197- .release-body pre{background:var(--bg-code);border:1px solid var(--border);border-radius:6px;padding:12px;overflow-x:auto;font-size:13px;line-height:1.5}
198- .release-body code{font-family:'IBM Plex Mono',monospace;font-size:13px;background:var(--bg-code);padding:2px 4px;border-radius:3px}
199- .release-body pre code{background:transparent;padding:0}
200- .release-assets{margin-top:12px;border-top:1px solid var(--border);padding-top:12px}
196+ .release-body hr{border:none;border-top:1px solid var(--border);margin:16px 0}
197+ .release-body pre{background:var(--bg-code);border:1px solid var(--border);border-radius:6px;padding:12px;overflow-x:auto;font-size:13px;line-height:1.5;margin:8px 0 16px}
198+ .release-assets{margin-top:16px;border-top:1px solid var(--border);padding-top:12px}
201199 .release-assets>summary{padding:0;font-size:13px;font-weight:500;cursor:pointer;color:var(--text-primary);list-style:none;display:flex;align-items:center;gap:6px}
202200 .release-assets>summary::-webkit-details-marker{display:none}
203- .release-assets>summary::before{content:'';display:inline-block;width:0;height:0;border-left:4px solid var(--text-muted);border-top:3px solid transparent;border-bottom:3px solid transparent;transition:transform 0.15s}
201+ .release-assets>summary::before{content:'';display:inline-block;width:0;height:0;border-left:4px solid var(--text-muted);border-top:3px solid transparent;border-bottom:3px solid transparent;transition:transform 0.15s;flex-shrink:0 }
204202 .release-assets[open]>summary::before{transform:rotate(90deg)}
205- .release-asset{font-family:'IBM Plex Mono',monospace;font-size:12px;color:var(--text-secondary);padding:3px 0;padding-left:10px}
203+ .release-asset{font-size:12px;color:var(--text-secondary);padding:4px 0 4px 10px}
204+ .release-asset a{font-family:'IBM Plex Mono',monospace}
205+ .release-asset-size{color:var(--text-muted);font-size:11px}
206+ .release-asset-hash{font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--text-muted);word-break:break-all;display:block;padding-left:0;margin-top:1px}
207+ .release-footer{margin-top:16px;padding-top:12px;border-top:1px solid var(--border);font-size:13px}
206208 .loading{text-align:center;padding:32px;color:var(--text-muted);font-size:14px}
207- .code-block-wrap{border:1px solid var(--border);border-radius:6px;overflow:hidden;margin:8px 0 16px}
208- .code-block-wrap .lang-label{font-size:11px;color:var(--text-muted);padding:4px 12px;border-bottom:1px solid var(--border);font-family:'IBM Plex Mono',monospace}
209- .code-block-wrap pre{margin:0;border:none;border-radius:0}
210209 pre[class*="language-"],code[class*="language-"]{font-family:'IBM Plex Mono',monospace;font-size:13px}
211210 pre[class*="language-"]{background:var(--bg-code);margin:0;padding:12px 16px}
212211 @media(prefers-color-scheme:dark){
@@ -241,13 +240,6 @@ jobs:
241240 <div class="content">{{ content }}</div>
242241 </main>
243242 <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
244- <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-powershell.min.js"></script>
245- <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-bash.min.js"></script>
246- <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-yaml.min.js"></script>
247- <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-json.min.js"></script>
248- <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-csharp.min.js"></script>
249- <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js"></script>
250- <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-docker.min.js"></script>
251243 <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script>
252244 </body>
253245 </html>
@@ -320,7 +312,6 @@ jobs:
320312 (async function() {
321313 var c = document.getElementById('releases-container');
322314 var repo = c.getAttribute('data-repo');
323- var SHELL = {'bash':1,'sh':1,'shell':1,'console':1,'zsh':1,'terminal':1};
324315 try {
325316 var res = await fetch('https://api.github.com/repos/' + repo + '/releases');
326317 if (!res.ok) throw new Error(res.status);
@@ -368,10 +359,8 @@ jobs:
368359 i++;
369360 while (i < lines.length && !lines[i].match(/^```/)) { escaped += lines[i] + '\n'; i++; }
370361 escaped = escaped.replace(/</g,'<').replace(/>/g,'>');
371- var isShell = !lang || SHELL[lang.toLowerCase()];
372- var langLabel = (!isShell && lang) ? '<div class="lang-label">' + lang + '</div>' : '';
373362 var langClass = lang ? ' class="language-' + lang + '"' : '';
374- html += '<div class="code-block-wrap">' + langLabel + '< pre' + langClass + '><code' + langClass + '>' + escaped + '</code></pre></div >';
363+ html += '<pre' + langClass + '><code' + langClass + '>' + escaped + '</code></pre>';
375364 } else if (h2) {
376365 if (inList) { html += '</ul>'; inList = false; }
377366 html += '<h2>' + inline(h2[1]) + '</h2>';
@@ -393,58 +382,94 @@ jobs:
393382 return html;
394383 }
395384
396- c.innerHTML = data.map(function(r, i) {
385+ // Fetch hash file contents for assets that are hash files
386+ async function fetchHashContent(url) {
387+ try {
388+ var r = await fetch(url);
389+ if (r.ok) {
390+ var text = await r.text();
391+ return text.trim();
392+ }
393+ } catch(e) {}
394+ return null;
395+ }
396+
397+ var html = '';
398+ for (var i = 0; i < data.length; i++) {
399+ var r = data[i];
397400 var d = new Date(r.published_at).toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' });
398401 var latest = i === 0 ? '<span class="release-latest">latest</span>' : '';
399402 var openAttr = i === 0 ? ' open' : '';
400403
404+ // Commit SHA in header
401405 var sha = r.target_commitish || '';
402406 var shortSha = sha.substring(0, 7);
403407 var shaHtml = '';
404408 if (sha.length >= 7) {
405- shaHtml = '<div style="margin-top:12px;padding-top:12px;border-top:1px solid var(--border);font-size:13px;color:var(--text-muted)">'
406- + '<a href="https://github.com/' + repo + '/commit/' + sha + '" style="font-family:IBM Plex Mono,monospace;font-size:12px">' + shortSha + '</a>'
407- + '</div>';
409+ shaHtml = '<a class="release-sha" href="https://github.com/' + repo + '/commit/' + sha + '">' + shortSha + '</a>';
408410 }
409411
412+ // Assets — show ALL files, no filtering
410413 var assets = '';
411- if (r.assets.length) {
412- var hashMap = {};
413- var mainAssets = [];
414- for (var j = 0; j < r.assets.length; j++) {
415- var a = r.assets[j];
416- if (a.name.match(/\.(sha256|sha512|md5|sha1)$/i)) {
417- var base = a.name.replace(/\.(sha256|sha512|md5|sha1)$/i, '');
418- hashMap[base] = a;
419- } else {
420- mainAssets.push(a);
421- }
414+ var allAssets = r.assets || [];
415+ var srcZip = 'https://github.com/' + repo + '/archive/refs/tags/' + r.tag_name + '.zip';
416+ var srcTar = 'https://github.com/' + repo + '/archive/refs/tags/' + r.tag_name + '.tar.gz';
417+ var totalAssets = allAssets.length + 2;
418+
419+ assets += '<details class="release-assets" open><summary>Assets (' + totalAssets + ')</summary>';
420+
421+ // Build asset HTML with hash content fetched inline
422+ for (var j = 0; j < allAssets.length; j++) {
423+ var a = allAssets[j];
424+ var isHash = a.name.match(/\.(sha256|sha512|md5|sha1)$/i);
425+ assets += '<div class="release-asset">';
426+ assets += '<a href="' + a.browser_download_url + '">' + a.name + '</a>';
427+ assets += ' <span class="release-asset-size">' + (a.size / 1024).toFixed(1) + ' KB</span>';
428+ if (isHash) {
429+ assets += '<span class="release-asset-hash" data-hash-url="' + a.browser_download_url + '">loading hash...</span>';
422430 }
431+ assets += '</div>';
432+ }
433+
434+ assets += '<div class="release-asset"><a href="' + srcZip + '">Source code</a> <span class="release-asset-size">(zip)</span></div>';
435+ assets += '<div class="release-asset"><a href="' + srcTar + '">Source code</a> <span class="release-asset-size">(tar.gz)</span></div>';
436+ assets += '</details>';
437+
438+ // View release footer
439+ var footer = '<div class="release-footer"><a href="https://github.com/' + repo + '/releases/tag/' + r.tag_name + '">View release</a></div>';
440+
441+ html += '<details class="release"' + openAttr + '><summary>'
442+ + '<span class="release-tag">' + r.tag_name + '</span>'
443+ + latest
444+ + '<span class="release-date">' + d + '</span>'
445+ + shaHtml
446+ + '</summary><div class="release-body">'
447+ + md(r.body)
448+ + assets
449+ + footer
450+ + '</div></details>';
451+ }
423452
424- var srcZip = 'https://github.com/' + repo + '/archive/refs/tags/' + r.tag_name + '.zip';
425- var srcTar = 'https://github.com/' + repo + '/archive/refs/tags/' + r.tag_name + '.tar.gz';
426- var totalAssets = mainAssets.length + 2;
453+ c.innerHTML = html;
427454
428- assets = '<details class="release-assets" open><summary>Assets (' + totalAssets + ')</summary>';
429- for ( var j = 0; j < mainAssets.length; j++) {
430- var a = mainAssets[j];
431- var hash = hashMap[a.name];
432- var hashHtml = '';
455+ // Fetch and populate hash contents
456+ var hashSpans = c.querySelectorAll('[data-hash-url]');
457+ for (var k = 0; k < hashSpans.length; k++) {
458+ (function(span) {
459+ fetchHashContent(span.getAttribute('data-hash-url')).then(function(hash) {
433460 if (hash) {
434- hashHtml = ' <span style="font-size:11px;color:var(--text-muted)">(' + hash.name.split('.').pop() + ')</span>';
461+ span.textContent = hash;
462+ } else {
463+ span.textContent = '';
435464 }
436- assets += '<div class="release-asset"><a href="' + a.browser_download_url + '">' + a.name + '</a> <span style="color:var(--text-muted)">' + (a.size / 1024).toFixed(1) + ' KB</span>' + hashHtml + '</div>';
437- }
438- assets += '<div class="release-asset"><a href="' + srcZip + '">Source code</a> <span style="color:var(--text-muted)">(zip)</span></div>';
439- assets += '<div class="release-asset"><a href="' + srcTar + '">Source code</a> <span style="color:var(--text-muted)">(tar.gz)</span></div>';
440- assets += '</details>';
441- }
442-
443- return '<details class="release"' + openAttr + '><summary><span class="release-tag">' + r.tag_name + '</span>' + latest + '<span class="release-date">' + d + '</span></summary><div class="release-body">' + md(r.body) + assets + shaHtml + '</div></details>';
444- }).join('');
465+ });
466+ })(hashSpans[k]);
467+ }
445468
446- // Trigger Prism highlighting on dynamically inserted code
447- if (typeof Prism !== 'undefined') Prism.highlightAll();
469+ // Trigger Prism highlighting on dynamically inserted code blocks
470+ if (typeof Prism !== 'undefined') {
471+ setTimeout(function() { Prism.highlightAll(); }, 100);
472+ }
448473 } catch(e) {
449474 c.innerHTML = '<p>Unable to load releases. Visit <a href="https://github.com/' + repo + '/releases">GitHub</a> directly.</p>';
450475 }
@@ -523,7 +548,6 @@ jobs:
523548 - name : Upload artifact
524549 uses : actions/upload-pages-artifact@v3
525550
526- # ── Deploy (only if build succeeded) ────────────────────────────
527551 deploy :
528552 environment :
529553 name : github-pages
0 commit comments