自定义marked.js的render实现,完整代码如下:
点击查看全文
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/marked.min.js"></script>
<style>
pre {
position: relative;
background-color: #f4f4f4;
border: 1px solid #ddd;
border-radius: 3px;
padding: 1em;
margin: 1em 0;
}
.language-label {
position: absolute;
top: 0;
right: 0;
padding: 0.3em 0.6em;
background-color: #e0e0e0;
color: #333;
font-size: 0.8em;
border-radius: 0 3px 0 3px;
}
.copy-button {
position: absolute;
top: 0;
right: 70px;
padding: 0.3em 0.6em;
background-color: #007bff;
color: white;
border: none;
border-radius: 3px;
cursor: pointer;
font-size: 0.8em;
}
</style>
</head>
<body>
<div id="content"></div>
<script>
// 自定义渲染器
const renderer = new marked.Renderer();
renderer.code = function(code, language) {
const escapedCode = this.options.highlight(code, language);
return `
<pre>
<span class="language-label">${language}</span>
<button class="copy-button" onclick="copyCode(this)">Copy</button>
<code class="language-${language}">${escapedCode}</code>
</pre>
`;
};
// 设置 marked 选项
marked.setOptions({
renderer: renderer,
highlight: function(code) {
return code;
}
});
// Markdown 内容
const markdown = `
# 示例代码
这是一段 JavaScript 代码:
\`\`\`javascript
function greet(name) {
console.log(\`Hello, \${name}!\`);
}
greet('World');
\`\`\`
这是一段 Python 代码:
\`\`\`python
def greet(name):
print(f"Hello, {name}!")
greet("World")
\`\`\`
`;
// 渲染 Markdown
document.getElementById('content').innerHTML = marked(markdown);
// 复制代码功能
function copyCode(button) {
const pre = button.parentElement;
const code = pre.querySelector('code');
const textArea = document.createElement('textarea');
textArea.value = code.textContent;
document.body.appendChild(textArea);
textArea.select();
document.execCommand('copy');
document.body.removeChild(textArea);
button.textContent = 'Copied!';
setTimeout(() => {
button.textContent = 'Copy';
}, 2000);
}
</script>
</body>
</html> 网友回复


