mirror of
https://github.com/oobabooga/text-generation-webui.git
synced 2026-02-07 08:14:24 +01:00
85 lines
3 KiB
JavaScript
85 lines
3 KiB
JavaScript
function fallbackCopyToClipboard(text) {
|
|
return new Promise((resolve, reject) => {
|
|
const textArea = document.createElement("textarea");
|
|
textArea.value = text;
|
|
textArea.style.position = "fixed";
|
|
textArea.style.left = "-9999px";
|
|
textArea.style.top = "-9999px";
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
try {
|
|
const successful = document.execCommand("copy");
|
|
document.body.removeChild(textArea);
|
|
successful ? resolve() : reject();
|
|
} catch (err) {
|
|
document.body.removeChild(textArea);
|
|
reject(err);
|
|
}
|
|
});
|
|
}
|
|
|
|
class CopyButtonPlugin {
|
|
constructor(options = {}) {
|
|
self.hook = options.hook;
|
|
self.callback = options.callback;
|
|
self.lang = options.lang || document.documentElement.lang || "en";
|
|
}
|
|
"after:highlightElement"({ el, text }) {
|
|
let button = Object.assign(document.createElement("button"), {
|
|
innerHTML: locales[lang]?.[0] || "Copy",
|
|
className: "hljs-copy-button",
|
|
});
|
|
button.dataset.copied = false;
|
|
el.parentElement.classList.add("hljs-copy-wrapper");
|
|
el.parentElement.appendChild(button);
|
|
el.parentElement.style.setProperty(
|
|
"--hljs-theme-background",
|
|
window.getComputedStyle(el).backgroundColor,
|
|
);
|
|
button.onclick = function () {
|
|
let newText = text;
|
|
if (hook && typeof hook === "function") {
|
|
newText = hook(text, el) || text;
|
|
}
|
|
const copyPromise =
|
|
navigator.clipboard && window.isSecureContext
|
|
? navigator.clipboard.writeText(newText)
|
|
: fallbackCopyToClipboard(newText);
|
|
copyPromise.then(function () {
|
|
button.innerHTML = locales[lang]?.[1] || "Copied!";
|
|
button.dataset.copied = true;
|
|
let alert = Object.assign(document.createElement("div"), {
|
|
role: "status",
|
|
className: "hljs-copy-alert",
|
|
innerHTML: locales[lang]?.[2] || "Copied to clipboard",
|
|
});
|
|
el.parentElement.appendChild(alert);
|
|
setTimeout(() => {
|
|
button.innerHTML = locales[lang]?.[0] || "Copy";
|
|
button.dataset.copied = false;
|
|
el.parentElement.removeChild(alert);
|
|
alert = null;
|
|
}, 2e3);
|
|
})
|
|
.then(function () {
|
|
if (typeof callback === "function") return callback(newText, el);
|
|
});
|
|
};
|
|
}
|
|
}
|
|
if (typeof module != "undefined") {
|
|
module.exports = CopyButtonPlugin;
|
|
}
|
|
const locales = {
|
|
en: ["Copy", "Copied!", "Copied to clipboard"],
|
|
es: ["Copiar", "¡Copiado!", "Copiado al portapapeles"],
|
|
fr: ["Copier", "Copié !", "Copié dans le presse-papier"],
|
|
de: ["Kopieren", "Kopiert!", "In die Zwischenablage kopiert"],
|
|
ja: ["コピー", "コピーしました!", "クリップボードにコピーしました"],
|
|
ko: ["복사", "복사됨!", "클립보드에 복사됨"],
|
|
ru: ["Копировать", "Скопировано!", "Скопировано в буфер обмена"],
|
|
zh: ["复制", "已复制!", "已复制到剪贴板"],
|
|
"zh-tw": ["複製", "已複製!", "已複製到剪貼簿"],
|
|
};
|