Skip to content

Commit 4af1367

Browse files
committed
[skip publish] highlight code blocks
1 parent 0464250 commit 4af1367

File tree

4 files changed

+82
-13
lines changed

4 files changed

+82
-13
lines changed

package-lock.json

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,26 @@
2222
"cloudflare:upload_redirects": "./node-with-env.sh cloudflare.js",
2323
"build": "./node-with-env.sh build.js"
2424
},
25+
"dependencies": {
26+
"@highlightjs/cdn-assets": "^11.11.1"
27+
},
2528
"devDependencies": {
2629
"@bitrise/eslint-plugin": "^2.12.0",
30+
"cloudflare": "^4.5.0",
2731
"copy-webpack-plugin": "^13.0.0",
2832
"css-loader": "^6.8.1",
2933
"eslint": "^8.57.1",
3034
"eslint-plugin-jsdoc": "^46.2.6",
3135
"express": "^4.19.2",
36+
"html-webpack-plugin": "^5.6.3",
3237
"jsdom": "^26.0.0",
38+
"mini-css-extract-plugin": "^2.9.2",
3339
"prettier": "^3.2.5",
3440
"style-loader": "^3.3.3",
3541
"unzipper": "^0.12.3",
3642
"webpack": "^5.86.0",
3743
"webpack-cli": "^5.1.4",
3844
"webpack-dev-middleware": "^7.2.1",
39-
"webpack-hot-middleware": "^2.26.1",
40-
"cloudflare": "^4.5.0",
41-
"html-webpack-plugin": "^5.6.3",
42-
"mini-css-extract-plugin": "^2.9.2"
45+
"webpack-hot-middleware": "^2.26.1"
4346
}
4447
}

src/css/global.css

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,10 +680,15 @@
680680
line-height: var(--code-md-line-height);
681681
font-weight: var(--code-md-font-weight);
682682
letter-spacing: var(--code-md-letter-spacing);
683+
font-family: var(--code-font-family) !important;
683684
direction: ltr;
684685
word-wrap: pre-wrap;
685686
-webkit-overflow-scrolling: touch;
686687

688+
& * {
689+
font-family: var(--code-font-family) !important;
690+
}
691+
687692
code {
688693
font-family: inherit;
689694
font-size: inherit;
@@ -738,6 +743,30 @@
738743
}
739744
}
740745

746+
.copy-toast {
747+
position: absolute;
748+
top: 0.75rem;
749+
right: 4.25rem;
750+
background: var(--background-secondary);
751+
color: var(--text-primary);
752+
font-size: var(--body-sm-regular-font-size);
753+
line-height: var(--body-sm-regular-line-height);
754+
font-weight: var(--body-sm-regular-font-weight);
755+
padding: 0.5rem 1rem;
756+
border-radius: 0.25rem;
757+
box-shadow: var(--elevation-sm);
758+
opacity: 0;
759+
pointer-events: none;
760+
transform: translateY(-1rem);
761+
transition: opacity 0.3s ease, transform 0.3s ease;
762+
763+
&.visible {
764+
opacity: 1;
765+
pointer-events: auto;
766+
transform: translateY(0);
767+
}
768+
}
769+
741770
&.code-block {
742771
padding-left: 0.25rem;
743772

src/js/lib/common.js

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
import hljs from '@highlightjs/cdn-assets/es/highlight.js';
2+
import '@highlightjs/cdn-assets/styles/vs2015.css';
3+
14
import { onReset } from "./reset";
25

6+
37
/**
48
*
59
* @param {string} language
@@ -184,7 +188,7 @@ export const renderCodeBlocks = () => {
184188
const newCodeFragment = document.createFragment = document.createDocumentFragment();
185189

186190
const originalCode = document.createElement('div');
187-
originalCode.className = 'original-code';
191+
originalCode.className = 'original-code' + (codeBlock.className ? ' ' + codeBlock.className : '');
188192
originalCode.innerHTML = codeBlock.innerHTML;
189193
newCodeFragment.appendChild(originalCode);
190194

@@ -194,40 +198,61 @@ export const renderCodeBlocks = () => {
194198
copyButton.addEventListener('click', () => {
195199
navigator.clipboard.writeText(originalCode.textContent);
196200
copyButton.textContent = "Copied!"
201+
copyButton.parentElement.querySelector('.copy-toast').classList.add('visible');
197202
setTimeout(function() {
198-
copyButton.textContent = "Copy"
203+
copyButton.textContent = "Copy";
204+
copyButton.parentElement.querySelector('.copy-toast').classList.remove('visible');
199205
},
200206
2000)
201207
});
202208
newCodeFragment.appendChild(copyButton);
209+
const copyToast = document.createElement("div");
210+
copyToast.className = "copy-toast";
211+
copyToast.textContent = "Copied to clipboard";
212+
newCodeFragment.appendChild(copyToast);
203213

214+
hljs.highlightElement(codeBlock);
215+
console.log('codeBlock:', codeBlock);
204216
const newCode = [];
205217
const codeLines = codeBlock.innerHTML.split('\n');
206218
codeLines.forEach((line, index) => {
207-
newCode.push(`<div class="code-line" style="--line-number: '${index + 1}'; --max-line-number-length: ${(codeLines.length + 1).toString().length};">${line}</div>`);
219+
newCode.push(`<div class="code-line" style="--line-number: '${index + 1}'; --max-line-number-length: ${(codeLines.length + 1).toString().length};"><span>${line}</span></div>`);
208220
});
209221
codeBlock.innerHTML = newCode.join('');
210222
codeBlock.classList.add('code-block');
211223
if (codeLines.length === 1) {
212224
codeBlock.classList.add('single-line');
213225
}
226+
214227
codeBlock.appendChild(newCodeFragment);
215228
});
216229

217230
if (import.meta.webpackHot) onReset(() => {
218231
Array.from(document.querySelectorAll('.programlisting')).forEach((codeBlock) => {
219-
const resetCodeFragment = document.createDocumentFragment();
220-
resetCodeFragment.appendChild(codeBlock.querySelector('.code-button'));
221232
const originalCode = codeBlock.querySelector('.original-code');
222233
if (originalCode) {
223234
codeBlock.innerHTML = originalCode.innerHTML;
235+
codeBlock.className = originalCode.className
236+
codeBlock.classList.remove('original-code');
237+
delete(codeBlock.dataset.highlighted);
224238
}
225-
codeBlock.appendChild(resetCodeFragment);
226-
codeBlock.classList.remove('code-block');
227-
codeBlock.classList.remove('single-line');
228239
});
229240
});
230-
}
241+
};
242+
243+
export const renderCodeBlocksWithHighlightJs = () => {
244+
let originalCodeBlocks = [];
245+
Array.from(document.querySelectorAll('.programlisting')).forEach((codeBlock) => {
246+
originalCodeBlocks.push(codeBlock.innerHTML);
247+
hljs.highlightElement(codeBlock);
248+
});
249+
250+
if (import.meta.webpackHot) onReset(() => {
251+
Array.from(document.querySelectorAll('.programlisting')).forEach((codeBlock, index) => {
252+
codeBlock.innerHTML = originalCodeBlocks[index];
253+
});
254+
});
255+
};
231256

232257
export const renderNavbarSearch = () => {
233258
const navbarHeader = document.querySelector('.navbar-header');

0 commit comments

Comments
 (0)