mirror of
https://github.com/shoelace-style/webawesome.git
synced 2026-01-12 20:19:13 +00:00
- Add ids, use ids to link copy button. No need for client-side script or updating the copy button manually for dynamic code snippets. - Add button to link to code block - Slight refactor on copy plugin to use the 11ty API properly
42 lines
1.2 KiB
JavaScript
42 lines
1.2 KiB
JavaScript
import { parse } from 'node-html-parser';
|
|
|
|
/**
|
|
* Eleventy plugin to add copy buttons to code blocks.
|
|
*/
|
|
export function copyCodePlugin(eleventyConfig, options = {}) {
|
|
options = {
|
|
container: 'body',
|
|
...options,
|
|
};
|
|
|
|
let codeCount = 0;
|
|
eleventyConfig.addTransform('copy-code', content => {
|
|
const doc = parse(content, { blockTextElements: { code: true } });
|
|
const container = doc.querySelector(options.container);
|
|
|
|
if (!container) {
|
|
return content;
|
|
}
|
|
|
|
// Look for code blocks
|
|
container.querySelectorAll('pre > code').forEach(code => {
|
|
const pre = code.closest('pre');
|
|
let preId = pre.getAttribute('id') || `code-block-${++codeCount}`;
|
|
let codeId = code.getAttribute('id') || `${preId}-inner`;
|
|
|
|
if (!code.getAttribute('id')) {
|
|
code.setAttribute('id', codeId);
|
|
}
|
|
if (!pre.getAttribute('id')) {
|
|
pre.setAttribute('id', preId);
|
|
}
|
|
|
|
// Add a copy button
|
|
pre.innerHTML += `<wa-icon-button href="#${preId}" class="block-link-icon" name="link"></wa-icon-button>
|
|
<wa-copy-button from="${codeId}" class="copy-button" hoist></wa-copy-button>`;
|
|
});
|
|
|
|
return doc.toString();
|
|
});
|
|
}
|