Skip to content

Commit eef30d6

Browse files
authored
Merge pull request #35 from jdarcyryan/jdr/pages
jdr/pages
2 parents 51f108e + 6aaba96 commit eef30d6

2 files changed

Lines changed: 92 additions & 68 deletions

File tree

.github/workflows/pages.yml

Lines changed: 91 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ concurrency:
1818
cancel-in-progress: false
1919

2020
jobs:
21-
# ── Guard: check repo visibility ────────────────────────────────
2221
check-visibility:
2322
runs-on: ubuntu-latest
2423
outputs:
@@ -34,7 +33,6 @@ jobs:
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
@@ -61,7 +59,6 @@ jobs:
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,'&lt;').replace(/>/g,'&gt;');
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

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ We welcome contributions! Please see [CONTRIBUTING](CONTRIBUTING.md) for details
141141

142142
## License
143143

144-
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
144+
This project is licensed under the Apache 2.0 License - see the [LICENSE](LICENSE) file for details.
145145

146146
Copyright (c) 2026 James D'Arcy Ryan
147147

0 commit comments

Comments
 (0)