mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
markdown: add copy button to code blocks to copy source text
This commit is contained in:
parent
a2d296e525
commit
e78f375e81
@ -208,3 +208,40 @@ span.modal-close:focus {
|
|||||||
content: attr(data-anchor-icon);
|
content: attr(data-anchor-icon);
|
||||||
}
|
}
|
||||||
/* Anchor */
|
/* Anchor */
|
||||||
|
|
||||||
|
/* Button */
|
||||||
|
.vnote-btn {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 6px 12px;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 20px;
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: middle;
|
||||||
|
cursor: pointer;
|
||||||
|
border: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vnote-copy-clipboard-btn {
|
||||||
|
transition: opacity .3s ease-in-out;
|
||||||
|
opacity: 0;
|
||||||
|
padding: 2px 6px;
|
||||||
|
position: absolute;
|
||||||
|
top: 5px;
|
||||||
|
right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre:hover .vnote-copy-clipboard-btn {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre.vnote-snippet {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
/* Button */
|
||||||
|
@ -91,6 +91,7 @@ var updateHtml = function(html) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addClassToCodeBlock();
|
addClassToCodeBlock();
|
||||||
|
addCopyButtonToCodeBlock();
|
||||||
renderCodeBlockLineNumber();
|
renderCodeBlockLineNumber();
|
||||||
|
|
||||||
// If you add new logics after handling MathJax, please pay attention to
|
// If you add new logics after handling MathJax, please pay attention to
|
||||||
|
@ -175,6 +175,7 @@ var updateText = function(text) {
|
|||||||
renderPlantUML('lang-puml');
|
renderPlantUML('lang-puml');
|
||||||
renderGraphviz('lang-dot');
|
renderGraphviz('lang-dot');
|
||||||
addClassToCodeBlock();
|
addClassToCodeBlock();
|
||||||
|
addCopyButtonToCodeBlock();
|
||||||
renderCodeBlockLineNumber();
|
renderCodeBlockLineNumber();
|
||||||
|
|
||||||
// If you add new logics after handling MathJax, please pay attention to
|
// If you add new logics after handling MathJax, please pay attention to
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="HIGHLIGHTJS_CSS_PLACE_HOLDER">
|
<link rel="stylesheet" type="text/css" href="HIGHLIGHTJS_CSS_PLACE_HOLDER">
|
||||||
<script src="qrc:/resources/qwebchannel.js"></script>
|
<script src="qrc:/resources/qwebchannel.js"></script>
|
||||||
<script src="qrc:/utils/highlightjs/highlight.pack.js"></script>
|
<script src="qrc:/utils/highlightjs/highlight.pack.js"></script>
|
||||||
|
<script src="qrc:/utils/clipboard.js/clipboard.min.js"></script>
|
||||||
<!-- EXTRA_PLACE_HOLDER -->
|
<!-- EXTRA_PLACE_HOLDER -->
|
||||||
<script src="JS_PLACE_HOLDER" defer></script>
|
<script src="JS_PLACE_HOLDER" defer></script>
|
||||||
<script src="qrc:/resources/common.js" defer></script>
|
<script src="qrc:/resources/common.js" defer></script>
|
||||||
|
@ -23,6 +23,8 @@ var VPlantUMLDivClass = 'plantuml-diagram';
|
|||||||
var VMetaDataCodeClass = 'markdown-metadata';
|
var VMetaDataCodeClass = 'markdown-metadata';
|
||||||
var VMarkRectDivClass = 'mark-rect';
|
var VMarkRectDivClass = 'mark-rect';
|
||||||
|
|
||||||
|
var hljsClass = 'hljs';
|
||||||
|
|
||||||
var VPreviewMode = false;
|
var VPreviewMode = false;
|
||||||
|
|
||||||
if (typeof VEnableMermaid == 'undefined') {
|
if (typeof VEnableMermaid == 'undefined') {
|
||||||
@ -272,6 +274,10 @@ window.onwheel = function(e) {
|
|||||||
|
|
||||||
var skipScrollCheckRange = null;
|
var skipScrollCheckRange = null;
|
||||||
|
|
||||||
|
window.addEventListener('load', function() {
|
||||||
|
new ClipboardJS('.vnote-copy-clipboard-btn');
|
||||||
|
});
|
||||||
|
|
||||||
window.onscroll = function() {
|
window.onscroll = function() {
|
||||||
if (g_muteScroll) {
|
if (g_muteScroll) {
|
||||||
return;
|
return;
|
||||||
@ -1247,7 +1253,6 @@ var renderCodeBlockLineNumber = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
var addClassToCodeBlock = function() {
|
var addClassToCodeBlock = function() {
|
||||||
var hljsClass = 'hljs';
|
|
||||||
var codes = document.getElementsByTagName('code');
|
var codes = document.getElementsByTagName('code');
|
||||||
for (var i = 0; i < codes.length; ++i) {
|
for (var i = 0; i < codes.length; ++i) {
|
||||||
var code = codes[i];
|
var code = codes[i];
|
||||||
@ -1267,6 +1272,23 @@ var addClassToCodeBlock = function() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var addCopyButtonToCodeBlock = function() {
|
||||||
|
var codes = document.getElementsByClassName(hljsClass);
|
||||||
|
for (var i = 0; i < codes.length; ++i) {
|
||||||
|
var code = codes[i];
|
||||||
|
var pare = code.parentElement;
|
||||||
|
pare.classList.add('vnote-snippet');
|
||||||
|
|
||||||
|
var btn = document.createElement('button');
|
||||||
|
btn.innerHTML = '📋';
|
||||||
|
btn.classList.add('vnote-btn');
|
||||||
|
btn.classList.add('vnote-copy-clipboard-btn');
|
||||||
|
btn.setAttribute('type', 'button');
|
||||||
|
btn.setAttribute('data-clipboard-text', code.textContent);
|
||||||
|
code.insertAdjacentElement('beforebegin', btn);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var listContainsRegex = function(strs, exp) {
|
var listContainsRegex = function(strs, exp) {
|
||||||
for (var i = 0, len = strs.length; i < len; ++i) {
|
for (var i = 0, len = strs.length; i < len; ++i) {
|
||||||
if (exp.test(strs[i])) {
|
if (exp.test(strs[i])) {
|
||||||
|
@ -71,6 +71,7 @@ var updateText = function(text) {
|
|||||||
renderPlantUML('language-puml');
|
renderPlantUML('language-puml');
|
||||||
renderGraphviz('language-dot');
|
renderGraphviz('language-dot');
|
||||||
addClassToCodeBlock();
|
addClassToCodeBlock();
|
||||||
|
addCopyButtonToCodeBlock();
|
||||||
renderCodeBlockLineNumber();
|
renderCodeBlockLineNumber();
|
||||||
|
|
||||||
// If you add new logics after handling MathJax, please pay attention to
|
// If you add new logics after handling MathJax, please pay attention to
|
||||||
|
@ -126,6 +126,7 @@ var updateText = function(text) {
|
|||||||
renderPlantUML('language-puml');
|
renderPlantUML('language-puml');
|
||||||
renderGraphviz('language-dot');
|
renderGraphviz('language-dot');
|
||||||
addClassToCodeBlock();
|
addClassToCodeBlock();
|
||||||
|
addCopyButtonToCodeBlock();
|
||||||
renderCodeBlockLineNumber();
|
renderCodeBlockLineNumber();
|
||||||
|
|
||||||
// If you add new logics after handling MathJax, please pay attention to
|
// If you add new logics after handling MathJax, please pay attention to
|
||||||
|
2
src/utils/clipboard.js/README.md
Normal file
2
src/utils/clipboard.js/README.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# [clipboard.js](https://github.com/zenorocha/clipboard.js)
|
||||||
|
v2.0.4
|
7
src/utils/clipboard.js/clipboard.min.js
vendored
Normal file
7
src/utils/clipboard.js/clipboard.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -943,6 +943,18 @@ with 2em, if there are Chinese characters in it, the font will be a mess.
|
|||||||
extra += QString("<script type=\"text/javascript\">\n%1\n</script>\n").arg(js);
|
extra += QString("<script type=\"text/javascript\">\n%1\n</script>\n").arg(js);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clipboard.js.
|
||||||
|
{
|
||||||
|
const QString clipboardjs(":/utils/clipboard.js/clipboard.min.js");
|
||||||
|
QString js = VUtils::readFileFromDisk(clipboardjs);
|
||||||
|
extra += QString("<script type=\"text/javascript\">\n%1\n</script>\n").arg(js);
|
||||||
|
extra += "<script type=\"text/javascript\">"
|
||||||
|
"window.addEventListener('load', function() {"
|
||||||
|
"new ClipboardJS('.vnote-copy-clipboard-btn');"
|
||||||
|
"});"
|
||||||
|
"</script>\n";
|
||||||
|
}
|
||||||
|
|
||||||
if (!extra.isEmpty()) {
|
if (!extra.isEmpty()) {
|
||||||
templ.replace(HtmlHolder::c_extraHolder, extra);
|
templ.replace(HtmlHolder::c_extraHolder, extra);
|
||||||
}
|
}
|
||||||
|
@ -287,5 +287,6 @@
|
|||||||
<file>resources/icons/table.svg</file>
|
<file>resources/icons/table.svg</file>
|
||||||
<file>utils/wavedrom/wavedrom.min.js</file>
|
<file>utils/wavedrom/wavedrom.min.js</file>
|
||||||
<file>utils/wavedrom/wavedrom-theme.js</file>
|
<file>utils/wavedrom/wavedrom-theme.js</file>
|
||||||
|
<file>utils/clipboard.js/clipboard.min.js</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user