// ==UserScript==
// @name 飞书妙计自动复制转换后的文字到剪切板
// @namespace http://tampermonkey.net/
// @version 0.6
// @description Extract title and subtitle from Feishu Meeting Minutes, format and copy to clipboard with centered non-blocking alerts and retry mechanism
// @author You
// @match https://*.feishu.cn/minutes/obcn*
// @grant GM_setClipboard
// @license GPLv3
// ==/UserScript==
(function() {
'use strict';
function notify(message) {
const notificationBoxId = 'tm-notification-box';
let box = document.getElementById(notificationBoxId);
if (!box) {
box = document.createElement('div');
box.id = notificationBoxId;
Object.assign(box.style, {
position: 'fixed',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
backgroundColor: 'lightgrey',
padding: '20px',
zIndex: 10000,
borderRadius: '10px',
boxShadow: '0 4px 8px rgba(0,0,0,0.5)',
textAlign: 'center',
maxWidth: '80%',
wordWrap: 'break-word'
});
document.body.appendChild(box);
}
box.style.display = 'block';
box.textContent = message;
setTimeout(() => {
box.style.display = 'none';
}, 3000);
}
function copyToClipboard(text) {
try {
GM_setClipboard(text);
notify('已复制到剪切板');
} catch (e) {
notify('复制失败,请手动复制');
}
}
function processText(inputText) {
// 替换中文全角标点的","和"。"为换行符
inputText = inputText.replace(/,/g, "\n").replace(/。/g, "\n");
// 在中文全角标点的"?"和"!"后加上换行符
inputText = inputText.replace(/?/g, "?\n").replace(/!/g, "!\n");
// 将所有的\r换行符替换成\n换行符
inputText = inputText.replace(/\r/g, "\n");
// 将连续的\n\n换行符替换成一个\n换行符
while (inputText.includes("\n\n")) {
inputText = inputText.replace(/\n\n/g, "\n");
}
return inputText;
}
function extractAndCopy(triesLeft = 3) {
if (triesLeft === 0) {
notify('查找失败,已放弃');
return;
}
notify('正在查找信息...');
const titleXpath = "//div[@class='larkw-web-header-caption-head-title-edit']//span";
const textXpath = "//div[@class='subtitle-comp']/div[@id='subtitle-scroll-container']";
const titleResults = document.evaluate(titleXpath, document, null, XPathResult.ANY_TYPE, null);
const textResults = document.evaluate(textXpath, document, null, XPathResult.ANY_TYPE, null);
const titleElement = titleResults.iterateNext();
const textElement = textResults.iterateNext();
if (titleElement && textElement) {
const titleContent = titleElement.textContent || "";
const textContent = textElement.textContent || "";
if (titleContent && textContent) {
notify('查找成功');
const processedText = processText(textContent); // 调用处理文本函数
copyToClipboard(`#### ${titleContent}\n${processedText}\n\n`);
} else {
notify('查找成功,但是没有找到完整的内容');
}
} else {
notify(`查找失败,尝试剩余次数:${triesLeft - 1}`);
setTimeout(() => extractAndCopy(triesLeft - 1), 1000);
}
}
if (document.readyState === "complete" || document.readyState === "interactive") {
setTimeout(extractAndCopy, 1000);
} else {
document.addEventListener("DOMContentLoaded", () => setTimeout(extractAndCopy, 1000));
}
})();
// ==UserScript==
// @name 飞书妙计自动复制转换后的文字到剪切板
// @namespace http://tampermonkey.net/
// @version 0.6
// @description Extract title and subtitle from Feishu Meeting Minutes, format and copy to clipboard with centered non-blocking alerts and retry mechanism
// @author You
// @match https://*.feishu.cn/minutes/obcn*
// @grant GM_setClipboard
// ==/UserScript==
(function() {
'use strict';
function notify(message) {
const notificationBoxId = 'tm-notification-box';
let box = document.getElementById(notificationBoxId);
if (!box) {
box = document.createElement('div');
box.id = notificationBoxId;
Object.assign(box.style, {
position: 'fixed',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
backgroundColor: 'lightgrey',
padding: '20px',
zIndex: 10000,
borderRadius: '10px',
boxShadow: '0 4px 8px rgba(0,0,0,0.5)',
textAlign: 'center',
maxWidth: '80%',
wordWrap: 'break-word'
});
document.body.appendChild(box);
}
box.style.display = 'block';
box.textContent = message;
setTimeout(() => {
box.style.display = 'none';
}, 3000);
}
function copyToClipboard(text) {
try {
GM_setClipboard(text);
notify('已复制到剪切板');
} catch (e) {
notify('复制失败,请手动复制');
}
}
function processText(inputText) {
// 删除所有的“嗯”
inputText = inputText.replace(/嗯/g, "");
// 删除所有的“唉”
inputText = inputText.replace(/唉/g, "");
// 替换中文全角标点的","和"。"为换行符
inputText = inputText.replace(/,/g, "\n").replace(/。/g, "\n");
// 在中文全角标点的"?"和"!"后加上换行符
inputText = inputText.replace(/?/g, "?\n").replace(/!/g, "!\n");
// 将所有的\r换行符替换成\n换行符
inputText = inputText.replace(/\r/g, "\n");
// 将连续的\n\n换行符替换成一个\n换行符
while (inputText.includes("\n\n")) {
inputText = inputText.replace(/\n\n/g, "\n");
}
return inputText;
}
function extractAndCopy(triesLeft = 3) {
if (triesLeft === 0) {
notify('查找失败,已放弃');
return;
}
notify('正在查找信息...');
const titleXpath = "//div[@class='larkw-web-header-caption-head-title-edit']//span";
const textXpath = "//div[@class='subtitle-comp']/div[@id='subtitle-scroll-container']";
const titleResults = document.evaluate(titleXpath, document, null, XPathResult.ANY_TYPE, null);
const textResults = document.evaluate(textXpath, document, null, XPathResult.ANY_TYPE, null);
const titleElement = titleResults.iterateNext();
const textElement = textResults.iterateNext();
if (titleElement && textElement) {
const titleContent = titleElement.textContent || "";
const textContent = textElement.textContent || "";
if (titleContent && textContent) {
notify('查找成功');
const processedText = processText(textContent); // 调用处理文本函数
copyToClipboard(`#### ${titleContent}\n${processedText}\n\n`);
} else {
notify('查找成功,但是没有找到完整的内容');
}
} else {
notify(`查找失败,尝试剩余次数:${triesLeft - 1}`);
setTimeout(() => extractAndCopy(triesLeft - 1), 1000);
}
}
if (document.readyState === "complete" || document.readyState === "interactive") {
setTimeout(extractAndCopy, 1000);
} else {
document.addEventListener("DOMContentLoaded", () => setTimeout(extractAndCopy, 1000));
}
})();