@@ -46,31 +46,19 @@ jobs:
4646 REPO : ${{ github.repository }}
4747 run : |
4848 echo "Repository is private — removing existing Pages deployments"
49-
50- # List all deployments in the github-pages environment
5149 DEPLOYMENTS=$(gh api "repos/${REPO}/deployments?environment=github-pages&per_page=100" --jq '.[].id' 2>/dev/null || true)
52-
5350 if [ -z "$DEPLOYMENTS" ]; then
5451 echo "No existing Pages deployments found"
5552 exit 0
5653 fi
57-
58- # Mark each deployment as inactive, then delete it
5954 for ID in $DEPLOYMENTS; do
6055 echo "Deactivating deployment ${ID}..."
61- gh api \
62- --method POST \
63- -H "Accept: application/vnd.github+json" \
64- "repos/${REPO}/deployments/${ID}/statuses" \
65- -f state=inactive 2>/dev/null || true
66-
56+ gh api --method POST -H "Accept: application/vnd.github+json" \
57+ "repos/${REPO}/deployments/${ID}/statuses" -f state=inactive 2>/dev/null || true
6758 echo "Deleting deployment ${ID}..."
68- gh api \
69- --method DELETE \
70- -H "Accept: application/vnd.github+json" \
59+ gh api --method DELETE -H "Accept: application/vnd.github+json" \
7160 "repos/${REPO}/deployments/${ID}" 2>/dev/null || true
7261 done
73-
7462 echo "All Pages deployments removed"
7563
7664 # ── Build (only if public) ──────────────────────────────────────
9886 STAGE="_site_source"
9987
10088 echo "::group::Staging allowed files"
101-
102- # ── Stage ONLY allowed files into a clean directory ───────────
103- # Whitelist: *.md files + LICENSE + LICENSE.txt
104- # Everything else is excluded from the site.
10589 mkdir -p "${STAGE}"
10690
107- # Copy all .md files preserving directory structure
10891 find . -name '*.md' \
10992 -not -path './.git/*' \
11093 -not -path "./${STAGE}/*" \
@@ -114,19 +97,16 @@ jobs:
11497 cp "$f" "$dest"
11598 done
11699
117- # Copy LICENSE files (plain text)
118100 for lf in LICENSE LICENSE.txt; do
119101 [ -f "$lf" ] && cp "$lf" "${STAGE}/"
120102 done
121103
122- # Remove any .gitkeep files that got copied
123104 find "${STAGE}" -name '.gitkeep' -delete
124105
125106 echo "Staged files:"
126107 find "${STAGE}" -type f | sort
127108 echo "::endgroup::"
128109
129- # ── Everything below operates inside the staging dir ──────────
130110 cd "${STAGE}"
131111
132112 echo "::group::Generating Jekyll config and layout"
@@ -156,8 +136,10 @@ jobs:
156136 <meta charset="UTF-8">
157137 <meta name="viewport" content="width=device-width, initial-scale=1.0">
158138 <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">
159140 <link rel="preconnect" href="https://fonts.googleapis.com">
160141 <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">
142+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css">
161143 <style>
162144 :root{
163145 --bg-page:#f6f8fa;--bg-content:#fff;--bg-header:#fff;--bg-code:#f6f8fa;
@@ -201,10 +183,10 @@ jobs:
201183 .content img{max-width:100%}
202184 .content strong{color:var(--text-primary)}
203185 .release{border:1px solid var(--border);border-radius:6px;margin-bottom:8px}
204- .release summary{padding:12px 16px;cursor:pointer;display:flex;align-items:center;gap:8px;font-size:14px;list-style:none}
205- .release summary::-webkit-details-marker{display:none}
206- .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}
207- .release[open] summary::before{transform:rotate(90deg)}
186+ .release> summary{padding:12px 16px;cursor:pointer;display:flex;align-items:center;gap:8px;font-size:14px;list-style:none}
187+ .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}
189+ .release[open]> summary::before{transform:rotate(90deg)}
208190 .release-tag{font-family:'IBM Plex Mono',monospace;font-weight:500;color:var(--link)}
209191 .release-date{font-size:13px;color:var(--text-muted)}
210192 .release-latest{font-size:11px;padding:2px 8px;border-radius:16px;background:var(--badge-bg);color:var(--badge-text);font-weight:500}
@@ -216,11 +198,28 @@ jobs:
216198 .release-body code{font-family:'IBM Plex Mono',monospace;font-size:13px;background:var(--bg-code);padding:2px 4px;border-radius:3px}
217199 .release-body pre code{background:transparent;padding:0}
218200 .release-assets{margin-top:12px;border-top:1px solid var(--border);padding-top:12px}
219- .release-assets summary{padding:0;font-size:13px;font-weight:500;cursor:pointer;color:var(--text-primary);list-style:revert}
220- .release-assets summary::-webkit-details-marker{display:revert}
221- .release-assets summary::before{display:none}
222- .release-asset{font-family:'IBM Plex Mono',monospace;font-size:12px;color:var(--text-secondary);padding:3px 0}
201+ .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}
202+ .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}
204+ .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}
223206 .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}
210+ pre[class*="language-"],code[class*="language-"]{font-family:'IBM Plex Mono',monospace;font-size:13px}
211+ pre[class*="language-"]{background:var(--bg-code);margin:0;padding:12px 16px}
212+ @media(prefers-color-scheme:dark){
213+ pre[class*="language-"],code[class*="language-"]{color:var(--text-primary)}
214+ .token.comment,.token.prolog,.token.doctype,.token.cdata{color:#8b949e}
215+ .token.punctuation{color:#8b949e}
216+ .token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:#ff7b72}
217+ .token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#a5d6ff}
218+ .token.operator,.token.entity,.token.url{color:#79c0ff}
219+ .token.atrule,.token.attr-value,.token.keyword{color:#d2a8ff}
220+ .token.function,.token.class-name{color:#d2a8ff}
221+ .token.regex,.token.important,.token.variable{color:#ffa657}
222+ }
224223 @media(max-width:640px){.site-header{padding:12px 16px}.container{padding:0 12px;margin:16px auto}.content{padding:20px}}
225224 </style>
226225 </head>
@@ -241,6 +240,15 @@ jobs:
241240 <main class="container">
242241 <div class="content">{{ content }}</div>
243242 </main>
243+ <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>
251+ <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script>
244252 </body>
245253 </html>
246254 LAYOUTEOF
@@ -312,6 +320,7 @@ jobs:
312320 (async function() {
313321 var c = document.getElementById('releases-container');
314322 var repo = c.getAttribute('data-repo');
323+ var SHELL = {'bash':1,'sh':1,'shell':1,'console':1,'zsh':1,'terminal':1};
315324 try {
316325 var res = await fetch('https://api.github.com/repos/' + repo + '/releases');
317326 if (!res.ok) throw new Error(res.status);
@@ -334,7 +343,7 @@ jobs:
334343 return pre + '<a href="https://github.com/' + user + '">@' + user + '</a>';
335344 })
336345 .replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
337- .replace(/(?<!\*)\*([^*]+)\*(?!\*)/g, '<em>$1</em>');
346+ .replace(/(?<!\*)\*([^*\n ]+)\*(?!\*)/g, '<em>$1</em>');
338347 s = s.replace(/\x00CODE(\d+)\x00/g, function(m, idx) {
339348 return '<code>' + codes[parseInt(idx)] + '</code>';
340349 });
@@ -355,11 +364,14 @@ jobs:
355364 if (cb) {
356365 if (inList) { html += '</ul>'; inList = false; }
357366 var lang = cb[1].trim();
358- var code = '';
367+ var escaped = '';
359368 i++;
360- while (i < lines.length && !lines[i].match(/^```/)) { code += lines[i] + '\n'; i++; }
361- var langLabel = lang ? '<div style="font-size:11px;color:var(--text-muted);padding:4px 12px;border-bottom:1px solid var(--border);font-family:IBM Plex Mono,monospace">' + lang + '</div>' : '';
362- html += '<div style="border:1px solid var(--border);border-radius:6px;overflow:hidden;margin:8px 0 16px">' + langLabel + '<pre style="margin:0;border:none;border-radius:0"><code>' + code.replace(/</g,'<').replace(/>/g,'>') + '</code></pre></div>';
369+ while (i < lines.length && !lines[i].match(/^```/)) { escaped += lines[i] + '\n'; i++; }
370+ escaped = escaped.replace(/</g,'<').replace(/>/g,'>');
371+ var isShell = !lang || SHELL[lang.toLowerCase()];
372+ var langLabel = (!isShell && lang) ? '<div class="lang-label">' + lang + '</div>' : '';
373+ var langClass = lang ? ' class="language-' + lang + '"' : '';
374+ html += '<div class="code-block-wrap">' + langLabel + '<pre' + langClass + '><code' + langClass + '>' + escaped + '</code></pre></div>';
363375 } else if (h2) {
364376 if (inList) { html += '</ul>'; inList = false; }
365377 html += '<h2>' + inline(h2[1]) + '</h2>';
@@ -386,7 +398,6 @@ jobs:
386398 var latest = i === 0 ? '<span class="release-latest">latest</span>' : '';
387399 var openAttr = i === 0 ? ' open' : '';
388400
389- // Commit SHA
390401 var sha = r.target_commitish || '';
391402 var shortSha = sha.substring(0, 7);
392403 var shaHtml = '';
@@ -396,7 +407,6 @@ jobs:
396407 + '</div>';
397408 }
398409
399- // Assets
400410 var assets = '';
401411 if (r.assets.length) {
402412 var hashMap = {};
@@ -415,7 +425,7 @@ jobs:
415425 var srcTar = 'https://github.com/' + repo + '/archive/refs/tags/' + r.tag_name + '.tar.gz';
416426 var totalAssets = mainAssets.length + 2;
417427
418- assets = '<details class="release-assets"><summary>Assets (' + totalAssets + ')</summary>';
428+ assets = '<details class="release-assets" open ><summary>Assets (' + totalAssets + ')</summary>';
419429 for (var j = 0; j < mainAssets.length; j++) {
420430 var a = mainAssets[j];
421431 var hash = hashMap[a.name];
@@ -432,6 +442,9 @@ jobs:
432442
433443 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>';
434444 }).join('');
445+
446+ // Trigger Prism highlighting on dynamically inserted code
447+ if (typeof Prism !== 'undefined') Prism.highlightAll();
435448 } catch(e) {
436449 c.innerHTML = '<p>Unable to load releases. Visit <a href="https://github.com/' + repo + '/releases">GitHub</a> directly.</p>';
437450 }
0 commit comments