1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
(function () {
var LANG_NAMES = {
bash: 'Shell', sh: 'Shell', shell: 'Shell', zsh: 'Shell',
js: 'JavaScript', javascript: 'JavaScript',
ts: 'TypeScript', typescript: 'TypeScript',
go: 'Go',
py: 'Python', python: 'Python',
rs: 'Rust', rust: 'Rust',
html: 'HTML',
css: 'CSS',
toml: 'TOML',
yaml: 'YAML', yml: 'YAML',
json: 'JSON',
sql: 'SQL',
md: 'Markdown', markdown: 'Markdown',
c: 'C',
cpp: 'C++', 'c++': 'C++',
java: 'Java',
php: 'PHP',
ruby: 'Ruby', rb: 'Ruby',
swift: 'Swift',
kotlin: 'Kotlin', kt: 'Kotlin',
dockerfile: 'Dockerfile',
makefile: 'Makefile',
text: 'Text', txt: 'Text',
};
function prettyName(lang) {
if (!lang) return '';
var key = lang.toLowerCase();
return LANG_NAMES[key] || (lang.charAt(0).toUpperCase() + lang.slice(1));
}
function getCodeText(wrapper) {
var el = wrapper.querySelector('.lntd:last-child code')
|| wrapper.querySelector('.code-body code')
|| wrapper.querySelector('.code-body pre');
return el ? el.innerText : '';
}
function initBlock(wrapper) {
var header = wrapper.querySelector('.code-header');
if (header) {
var label = wrapper.querySelector('.code-lang-label');
if (label) label.textContent = prettyName(header.getAttribute('data-lang') || '');
}
var btn = wrapper.querySelector('[data-copy-target]');
if (!btn) return;
btn.addEventListener('click', function () {
var text = getCodeText(wrapper);
if (!text) return;
navigator.clipboard.writeText(text).then(function () {
var copyIcon = btn.querySelector('.icon-copy');
var checkIcon = btn.querySelector('.icon-check');
var liveRegion = wrapper.querySelector('.code-copy-status');
if (copyIcon) copyIcon.classList.add('hidden');
if (checkIcon) checkIcon.classList.remove('hidden');
btn.classList.add('is-copied');
if (liveRegion) liveRegion.textContent = 'Code copied to clipboard.';
setTimeout(function () {
if (copyIcon) copyIcon.classList.remove('hidden');
if (checkIcon) checkIcon.classList.add('hidden');
btn.classList.remove('is-copied');
if (liveRegion) liveRegion.textContent = '';
}, 2000);
}).catch(function () {
// silent fail for insecure contexts
});
});
}
document.addEventListener('DOMContentLoaded', function () {
document.querySelectorAll('.code-block-wrapper').forEach(initBlock);
});
})();
|