/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ "./node_modules/.pnpm/[email protected][email protected]/node_modules/css-loader/dist/runtime/api.js":
/*!********************************************************************************************************!*\
!*** ./node_modules/.pnpm/[email protected][email protected]/node_modules/css-loader/dist/runtime/api.js ***!
\********************************************************************************************************/
/***/ ((module) => {
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
module.exports = function (cssWithMappingToString) {
var list = [];
// return the list of modules as css string
list.toString = function toString() {
return this.map(function (item) {
var content = "";
var needLayer = typeof item[5] !== "undefined";
if (item[4]) {
content += "@supports (".concat(item[4], ") {");
}
if (item[2]) {
content += "@media ".concat(item[2], " {");
}
if (needLayer) {
content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");
}
content += cssWithMappingToString(item);
if (needLayer) {
content += "}";
}
if (item[2]) {
content += "}";
}
if (item[4]) {
content += "}";
}
return content;
}).join("");
};
// import a list of modules into the list
list.i = function i(modules, media, dedupe, supports, layer) {
if (typeof modules === "string") {
modules = [[null, modules, undefined]];
}
var alreadyImportedModules = {};
if (dedupe) {
for (var k = 0; k < this.length; k++) {
var id = this[k][0];
if (id != null) {
alreadyImportedModules[id] = true;
}
}
}
for (var _k = 0; _k < modules.length; _k++) {
var item = [].concat(modules[_k]);
if (dedupe && alreadyImportedModules[item[0]]) {
continue;
}
if (typeof layer !== "undefined") {
if (typeof item[5] === "undefined") {
item[5] = layer;
} else {
item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");
item[5] = layer;
}
}
if (media) {
if (!item[2]) {
item[2] = media;
} else {
item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");
item[2] = media;
}
}
if (supports) {
if (!item[4]) {
item[4] = "".concat(supports);
} else {
item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");
item[4] = supports;
}
}
list.push(item);
}
};
return list;
};
/***/ }),
/***/ "./node_modules/.pnpm/[email protected][email protected]/node_modules/css-loader/dist/runtime/sourceMaps.js":
/*!***************************************************************************************************************!*\
!*** ./node_modules/.pnpm/[email protected][email protected]/node_modules/css-loader/dist/runtime/sourceMaps.js ***!
\***************************************************************************************************************/
/***/ ((module) => {
module.exports = function (item) {
var content = item[1];
var cssMapping = item[3];
if (!cssMapping) {
return content;
}
if (typeof btoa === "function") {
var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));
var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);
var sourceMapping = "/*# ".concat(data, " */");
return [content].concat([sourceMapping]).join("\n");
}
return [content].join("\n");
};
/***/ }),
/***/ "./src/shared/copy.ts":
/*!****************************!*\
!*** ./src/shared/copy.ts ***!
\****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ BACKGROUND_COLOR_OUT: () => (/* binding */ BACKGROUND_COLOR_OUT),
/* harmony export */ BACKGROUND_COLOR_OVER: () => (/* binding */ BACKGROUND_COLOR_OVER),
/* harmony export */ SETTINGS_BACKGROUND_OUT: () => (/* binding */ SETTINGS_BACKGROUND_OUT),
/* harmony export */ SETTINGS_BACKGROUND_OVER: () => (/* binding */ SETTINGS_BACKGROUND_OVER),
/* harmony export */ addCopyButtonToAnswer: () => (/* binding */ addCopyButtonToAnswer),
/* harmony export */ applyToPlatform: () => (/* binding */ applyToPlatform),
/* harmony export */ applyToPlatforms: () => (/* binding */ applyToPlatforms),
/* harmony export */ createCopyButton: () => (/* binding */ createCopyButton),
/* harmony export */ createFlashOverlay: () => (/* binding */ createFlashOverlay),
/* harmony export */ createGlowingAnimationStyle: () => (/* binding */ createGlowingAnimationStyle),
/* harmony export */ initTurndownService: () => (/* binding */ initTurndownService),
/* harmony export */ observeDOMChanges: () => (/* binding */ observeDOMChanges),
/* harmony export */ processMarkdown: () => (/* binding */ processMarkdown),
/* harmony export */ stripMarkdown: () => (/* binding */ stripMarkdown)
/* harmony export */ });
/* harmony import */ var turndown__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! turndown */ "turndown");
/* harmony import */ var turndown__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(turndown__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var turndown_plugin_gfm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! turndown-plugin-gfm */ "turndown-plugin-gfm");
/* harmony import */ var turndown_plugin_gfm__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(turndown_plugin_gfm__WEBPACK_IMPORTED_MODULE_1__);
// 背景颜色常量
const BACKGROUND_COLOR_OUT = 'linear-gradient(135deg, rgba(25, 239, 192, 0.6), rgba(64, 128, 255, 0.4))';
const BACKGROUND_COLOR_OVER = 'linear-gradient(135deg, rgba(25, 239, 192, 0.8), rgba(64, 128, 255, 0.6))';
const SETTINGS_BACKGROUND_OUT = 'linear-gradient(135deg, rgba(64, 128, 255, 0.6), rgba(25, 239, 192, 0.4))';
const SETTINGS_BACKGROUND_OVER = 'linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6))';
// 初始化turndown服务
function initTurndownService() {
const turndownService = new (turndown__WEBPACK_IMPORTED_MODULE_0___default())({
preformattedCode: true, // 是否保留预格式化代码,设为true时会保持代码块的原始格式,包括缩进和换行
headingStyle: 'atx', // 标题样式,'atx'使用#号(如:# 标题),'setext'使用底线(如:标题\n===)
bulletListMarker: '-', // 无序列表的标记符号,可以是 '-', '*', 或 '+'
emDelimiter: '*', // 斜体文本的分隔符,可以是 '_' 或 '*'
strongDelimiter: '**', // 加粗文本的分隔符
codeBlockStyle: 'fenced' // 代码块样式,'fenced'使用```包裹,'indented'使用缩进
});
turndownService.use(turndown_plugin_gfm__WEBPACK_IMPORTED_MODULE_1__.gfm);
// 自定义代码块规则
turndownService.addRule('codeBlock', {
filter: function (node) {
if (!(node instanceof HTMLElement)) {
return false;
}
// 比如【百度-AI搜索】平台,pre元素下的code元素,不是子元素而是后代元素,为了使其识别为代码块,所以需要特殊处理
const codeElement = node.querySelector('code');
return node.nodeName === 'PRE' && codeElement !== null;
},
replacement: function (content, node) {
const codeElement = node.querySelector('code');
const code = codeElement?.textContent?.trim() || '';
const lang = codeElement?.getAttribute('class') || '';
const languageMatch = lang.match(/language-([\w-]+)/i);
const language = languageMatch ? languageMatch[1] : '';
return '\n```' + (language ? language + '\n' : '\n') + code + '\n```\n';
}
});
// 自定义escape函数,避免不必要的转义
turndownService.escape = function (text) {
return text
.replace(/\\([!"#$%&'()*+,\-./:;<=>?@\[\]^_`{|}~])/g, '$1') // 移除已有的转义
.replace(/([*_`])/g, '\\$1'); // 只转义特殊Markdown字符
};
return turndownService;
}
// Markdown 工具函数
function stripMarkdown(text) {
return text
.replace(/```[\s\S]*?```/g, '$1') // 移除代码块
.replace(/\*\*(.*?)\*\*/g, '$1') // 移除加粗
.replace(/\*(.*?)\*/g, '$1') // 移除斜体
.replace(/`([^`]+)`/g, '$1') // 移除行内代码
.replace(/^#+\s+/gm, '') // 移除标题标记
.replace(/^[-*]\s+/gm, '') // 移除无序列表标记
.replace(/^\d+\.\s+/gm, '') // 移除有序列表标记
.replace(/^>\s+/gm, '') // 移除引用标记
.trim();
}
// 处理Markdown文本,根据配置决定是否去除参考文献角标和特殊span节点
function processMarkdown(markdown, removeSelectorList, config) {
// 创建节点的深拷贝,以免修改原始节点
const clonedMarkdown = markdown.cloneNode(true);
// 根据配置决定是否在拷贝的节点上移除参考文献角标
if (config.removeReferences) {
removeSelectorList.forEach(selector => {
clonedMarkdown.querySelectorAll(selector).forEach(node => node.remove());
});
}
// 移除零宽连字符
const treeWalker = document.createTreeWalker(clonedMarkdown, NodeFilter.SHOW_TEXT);
let currentNode;
while (currentNode = treeWalker.nextNode()) {
currentNode.textContent = currentNode.textContent?.replace(/‌|\u200c/g, '') ?? '';
}
return clonedMarkdown;
}
// 创建复制按钮的闪光动画样式
function createGlowingAnimationStyle() {
const style = document.createElement('style');
style.textContent = `
@keyframes glowing {
0% { box-shadow: 0 0 5px rgba(0, 255, 128, 0.8), 0 0 10px rgba(0, 0, 0, 0.8), 0 0 15px rgba(64, 128, 255, 0.6); }
50% { box-shadow: 0 0 15px rgba(0, 255, 128, 1), 0 0 20px rgba(255, 7, 160, 0.9), 0 0 25px rgba(64, 128, 255, 0.8); }
100% { box-shadow: 0 0 5px rgba(0, 255, 128, 0.8), 0 0 10px rgba(0, 0, 0, 0.8), 0 0 15px rgba(64, 128, 255, 0.6); }
}
@keyframes flash-animation {
0% { opacity: 0; transform: scale(1); filter: brightness(1); background-color: rgba(255, 255, 255, 0); }
25% { opacity: 1; transform: scale(1.02); filter: brightness(1.5); background-color: rgba(255, 255, 255, 0.95); }
50% { opacity: 0.5; transform: scale(1.01); filter: brightness(1.2); background-color: rgba(255, 255, 255, 0.5); }
100% { opacity: 0; transform: scale(1); filter: brightness(1); background-color: rgba(255, 255, 255, 0); }
}
`;
return style;
}
// 创建复制按钮
function createCopyButton(position = 'top') {
const button = document.createElement('button');
button.textContent = '复制';
button.className = 'ai-copy-button';
button.style.position = 'absolute';
// 根据位置设置top和bottom值
switch (position) {
case 'top':
button.style.top = '10px';
break;
case 'middle':
button.style.top = '50%';
button.style.transform = 'translateY(-50%)';
break;
case 'bottom':
button.style.bottom = '10px';
break;
}
button.style.right = '10px';
button.style.padding = '4px 8px';
button.style.background = BACKGROUND_COLOR_OUT;
button.style.color = 'white';
button.style.border = '2px dashed #fff';
button.style.borderRadius = '4px';
button.style.cursor = 'pointer';
button.style.fontSize = '16px';
button.style.zIndex = '1000';
button.style.animation = 'glowing 2s infinite';
// 添加悬停效果
button.addEventListener('mouseover', () => {
button.style.background = BACKGROUND_COLOR_OVER;
});
button.addEventListener('mouseout', () => {
button.style.background = BACKGROUND_COLOR_OUT;
});
return button;
}
// 创建闪光效果遮罩层
function createFlashOverlay() {
const flashOverlay = document.createElement('div');
flashOverlay.style.position = 'absolute';
flashOverlay.style.top = '0';
flashOverlay.style.left = '0';
flashOverlay.style.width = '100%';
flashOverlay.style.height = '100%';
flashOverlay.style.backgroundColor = 'rgba(255, 255, 255, 0)';
flashOverlay.style.animation = 'flash-animation 1s ease-in-out';
flashOverlay.style.pointerEvents = 'none';
flashOverlay.style.zIndex = '999';
return flashOverlay;
}
// 为AI回答添加复制按钮
function addCopyButtonToAnswer(answerElement, platform, config, turndownService, copyToClipboard) {
// 检查是否已经添加了复制按钮
if (answerElement.querySelector('.ai-copy-button')) {
return;
}
// 设置相对定位,以便正确放置复制按钮
if (window.getComputedStyle(answerElement).position === 'static') {
answerElement.style.position = 'relative';
}
// 创建三个不同位置的复制按钮
const positions = ['top', 'middle', 'bottom'];
positions.forEach(position => {
const button = createCopyButton(position);
answerElement.appendChild(button);
// 为每个按钮添加点击事件
button.addEventListener('click', async () => {
// 让按钮获得焦点
button.focus();
// 查找Markdown内容
const markdownElement = answerElement.querySelector(`[class*="${platform.markdownContentClass}"]`);
if (!markdownElement) {
console.error('未找到Markdown内容元素');
return;
}
// 添加闪光效果
const flashOverlay = createFlashOverlay();
answerElement.appendChild(flashOverlay);
// 动画结束后移除遮罩层
flashOverlay.addEventListener('animationend', () => {
flashOverlay.remove();
});
// 处理Markdown内容
const markdownOuterHTML = processMarkdown(markdownElement, platform.removeSelectorList, config);
// 根据用户选择的格式进行复制
let content = '';
if (config.copyFormat === 'markdown') {
content = turndownService.turndown(markdownOuterHTML.outerHTML);
}
else {
content = markdownOuterHTML.outerHTML;
}
// 复制到剪贴板
await copyToClipboard(content);
// 修改按钮文本提示复制成功
const originalText = button.textContent;
button.textContent = '✓ 已复制';
// 一段时间后恢复按钮文本
setTimeout(() => {
button.textContent = originalText;
}, 2000);
});
});
}
// 为单个平台应用复制功能
function applyToPlatform(platform, config, turndownService, copyToClipboard) {
if (!config.enableCopy)
return;
const answerElements = document.querySelectorAll(platform.selector);
if (answerElements.length === 0)
return;
answerElements.forEach(element => {
addCopyButtonToAnswer(element, platform, config, turndownService, copyToClipboard);
});
}
// 为所有平台应用复制功能
function applyToPlatforms(platforms, config, turndownService, copyToClipboard) {
platforms.forEach(platform => {
applyToPlatform(platform, config, turndownService, copyToClipboard);
});
}
// 监听DOM变化,为新的回答添加复制按钮
function observeDOMChanges(platforms, config, turndownService, copyToClipboard) {
const observer = new MutationObserver(mutations => {
let shouldApply = false;
mutations.forEach(mutation => {
if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
shouldApply = true;
}
});
if (shouldApply) {
applyToPlatforms(platforms, config, turndownService, copyToClipboard);
}
});
// 观察整个文档的变化
observer.observe(document.body, {
childList: true,
subtree: true
});
return observer;
}
/***/ }),
/***/ "./src/shared/styles/common.css":
/*!**************************************!*\
!*** ./src/shared/styles/common.css ***!
\**************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/.pnpm/[email protected][email protected]/node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/.pnpm/[email protected][email protected]/node_modules/css-loader/dist/runtime/sourceMaps.js");
/* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/.pnpm/[email protected][email protected]/node_modules/css-loader/dist/runtime/api.js */ "./node_modules/.pnpm/[email protected][email protected]/node_modules/css-loader/dist/runtime/api.js");
/* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
// Imports
var ___CSS_LOADER_EXPORT___ = _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, `@keyframes glowing {
0% { box-shadow: 0 0 5px rgba(0, 255, 128, 0.8), 0 0 10px rgba(0, 0, 0, 0.8), 0 0 15px rgba(64, 128, 255, 0.6); }
50% { box-shadow: 0 0 15px rgba(0, 255, 128, 1), 0 0 20px rgba(255, 7, 160, 0.9), 0 0 25px rgba(64, 128, 255, 0.8); }
100% { box-shadow: 0 0 5px rgba(0, 255, 128, 0.8), 0 0 10px rgba(0, 0, 0, 0.8), 0 0 15px rgba(64, 128, 255, 0.6); }
}
@keyframes flash-animation {
0% { opacity: 0; transform: scale(1); filter: brightness(1); background-color: rgba(255, 255, 255, 0); }
25% { opacity: 1; transform: scale(1.02); filter: brightness(1.5); background-color: rgba(255, 255, 255, 0.95); }
50% { opacity: 0.5; transform: scale(1.01); filter: brightness(1.2); background-color: rgba(255, 255, 255, 0.5); }
100% { opacity: 0; transform: scale(1); filter: brightness(1); background-color: rgba(255, 255, 255, 0); }
}
.ai-copy-button {
width: auto;
position: absolute;
right: 10px;
padding: 4px 8px;
background: linear-gradient(135deg, rgba(25, 239, 192, 0.6), rgba(64, 128, 255, 0.4));
color: white;
border: 2px dashed #fff;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
z-index: 1000;
animation: glowing 2s infinite;
}
.ai-copy-button:hover {
background: linear-gradient(135deg, rgba(25, 239, 192, 0.8), rgba(64, 128, 255, 0.6));
}
.ai-copy-button.top {
top: 10px;
}
.ai-copy-button.middle {
top: 50%;
transform: translateY(-50%);
}
.ai-copy-button.bottom {
bottom: 10px;
}
body {
font-family: system-ui, -apple-system, sans-serif;
}
.option-container {
margin: 16px;
border: 2px dashed #e0e0e0;
border-radius: 12px;
padding: 4px 16px;
}
.checkbox-container {
display: flex;
align-items: center;
margin-bottom: 12px;
padding: 0 8px;
border-radius: 8px;
cursor: pointer !important;
transition: background-color 0.2s;
font-size: 14px;
}
.checkbox-container:hover {
background-color: #f5f5f5;
}
.checkbox-container input[type='checkbox'] {
margin-right: 12px;
width: 20px;
height: 20px;
cursor: pointer;
accent-color: #4285f4;
}
.radio-group {
position: relative;
display: inline-flex;
align-items: center;
margin-left: 2px;
background-color: #f5f5f5;
border-radius: 20px;
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
}
.radio-group input[type='radio'] {
display: none;
}
.radio-group label {
position: relative;
padding: 6px 16px;
font-size: 14px;
color: #bdbdbd;
cursor: pointer;
border-radius: 16px;
transition: all 0.3s ease;
user-select: none;
z-index: 1;
}
.radio-group label:hover {
color: #4285f4;
}
.label-key {
width: 124px;
text-align: left;
margin-right: 10px;
}
.radio-group input[type='radio']:checked + label {
color: #4285f4;
}
.radio-group::before {
content: '';
position: absolute;
top: 4px;
left: 4px;
width: calc(50% - 4px);
height: calc(100% - 8px);
border-radius: 16px;
transition: all 0.3s ease;
z-index: 0;
}
.radio-group input[type='radio']:nth-of-type(2):checked ~ .radio-group::before {
transform: translateX(100%);
}
button {
width: 100%;
padding: 8px;
margin-top: 8px;
background-color: #4285f4;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
}
button:hover {
background-color: #3367d6;
}
.privacy-notice {
margin: 2px 0 0 14px;
padding: 10px;
background-color: #f8f9fa;
border-left: 3px solid #4285f4;
font-size: 13px;
}
.privacy-link {
color: #4285f4;
text-decoration: none;
display: inline-block;
margin-top: 5px;
}
.privacy-link:hover {
text-decoration: underline;
}
.consent-container {
margin-top: 12px;
padding: 10px;
background-color: #fff8e1;
border-radius: 4px;
border: 2px dashed #ffe082;
}
.consent-container .checkbox-container {
margin-bottom: 0;
}
.disabled-notice {
color: #d32f2f;
font-weight: bold;
margin: 8px 0 0 44px;
}
.platforms-info {
margin-top: 12px;
padding: 4px 24px;
background-color: #e8f0fe;
border: 2px dashed #4285f4;
border-radius: 8px;
font-size: 12px;
color: #1a73e8;
font-weight: 500;
}
.platforms-info.unsupported {
background-color: #fce8e6;
border-color: #ea4335;
color: #d93025;
}
.status-message {
display: none;
padding: 8px;
text-align: center;
color: #4CAF50;
margin-top: 10px;
font-weight: bold;
background-color: #f1f8e9;
border-radius: 4px;
} `, "",{"version":3,"sources":["webpack://./src/shared/styles/common.css"],"names":[],"mappings":"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","sourcesContent":["@keyframes glowing {\r\n 0% { box-shadow: 0 0 5px rgba(0, 255, 128, 0.8), 0 0 10px rgba(0, 0, 0, 0.8), 0 0 15px rgba(64, 128, 255, 0.6); }\r\n 50% { box-shadow: 0 0 15px rgba(0, 255, 128, 1), 0 0 20px rgba(255, 7, 160, 0.9), 0 0 25px rgba(64, 128, 255, 0.8); }\r\n 100% { box-shadow: 0 0 5px rgba(0, 255, 128, 0.8), 0 0 10px rgba(0, 0, 0, 0.8), 0 0 15px rgba(64, 128, 255, 0.6); }\r\n}\r\n\r\n@keyframes flash-animation {\r\n 0% { opacity: 0; transform: scale(1); filter: brightness(1); background-color: rgba(255, 255, 255, 0); }\r\n 25% { opacity: 1; transform: scale(1.02); filter: brightness(1.5); background-color: rgba(255, 255, 255, 0.95); }\r\n 50% { opacity: 0.5; transform: scale(1.01); filter: brightness(1.2); background-color: rgba(255, 255, 255, 0.5); }\r\n 100% { opacity: 0; transform: scale(1); filter: brightness(1); background-color: rgba(255, 255, 255, 0); }\r\n}\r\n\r\n.ai-copy-button {\r\n width: auto;\r\n position: absolute;\r\n right: 10px;\r\n padding: 4px 8px;\r\n background: linear-gradient(135deg, rgba(25, 239, 192, 0.6), rgba(64, 128, 255, 0.4));\r\n color: white;\r\n border: 2px dashed #fff;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 16px;\r\n z-index: 1000;\r\n animation: glowing 2s infinite;\r\n}\r\n\r\n.ai-copy-button:hover {\r\n background: linear-gradient(135deg, rgba(25, 239, 192, 0.8), rgba(64, 128, 255, 0.6));\r\n}\r\n\r\n.ai-copy-button.top {\r\n top: 10px;\r\n}\r\n\r\n.ai-copy-button.middle {\r\n top: 50%;\r\n transform: translateY(-50%);\r\n}\r\n\r\n.ai-copy-button.bottom {\r\n bottom: 10px;\r\n}\r\n\r\nbody {\r\n font-family: system-ui, -apple-system, sans-serif;\r\n}\r\n\r\n.option-container {\r\n margin: 16px;\r\n border: 2px dashed #e0e0e0;\r\n border-radius: 12px;\r\n padding: 4px 16px;\r\n}\r\n\r\n.checkbox-container {\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 12px;\r\n padding: 0 8px;\r\n border-radius: 8px;\r\n cursor: pointer !important;\r\n transition: background-color 0.2s;\r\n font-size: 14px;\r\n}\r\n\r\n.checkbox-container:hover {\r\n background-color: #f5f5f5;\r\n}\r\n\r\n.checkbox-container input[type='checkbox'] {\r\n margin-right: 12px;\r\n width: 20px;\r\n height: 20px;\r\n cursor: pointer;\r\n accent-color: #4285f4;\r\n}\r\n\r\n.radio-group {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n margin-left: 2px;\r\n background-color: #f5f5f5;\r\n border-radius: 20px;\r\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.radio-group input[type='radio'] {\r\n display: none;\r\n}\r\n\r\n.radio-group label {\r\n position: relative;\r\n padding: 6px 16px;\r\n font-size: 14px;\r\n color: #bdbdbd;\r\n cursor: pointer;\r\n border-radius: 16px;\r\n transition: all 0.3s ease;\r\n user-select: none;\r\n z-index: 1;\r\n}\r\n\r\n.radio-group label:hover {\r\n color: #4285f4;\r\n}\r\n\r\n.label-key {\r\n width: 124px;\r\n text-align: left;\r\n margin-right: 10px;\r\n}\r\n\r\n.radio-group input[type='radio']:checked + label {\r\n color: #4285f4;\r\n}\r\n\r\n.radio-group::before {\r\n content: '';\r\n position: absolute;\r\n top: 4px;\r\n left: 4px;\r\n width: calc(50% - 4px);\r\n height: calc(100% - 8px);\r\n border-radius: 16px;\r\n transition: all 0.3s ease;\r\n z-index: 0;\r\n}\r\n\r\n.radio-group input[type='radio']:nth-of-type(2):checked ~ .radio-group::before {\r\n transform: translateX(100%);\r\n}\r\n\r\nbutton {\r\n width: 100%;\r\n padding: 8px;\r\n margin-top: 8px;\r\n background-color: #4285f4;\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 16px;\r\n}\r\n\r\nbutton:hover {\r\n background-color: #3367d6;\r\n}\r\n\r\n.privacy-notice {\r\n margin: 2px 0 0 14px;\r\n padding: 10px;\r\n background-color: #f8f9fa;\r\n border-left: 3px solid #4285f4;\r\n font-size: 13px;\r\n}\r\n\r\n.privacy-link {\r\n color: #4285f4;\r\n text-decoration: none;\r\n display: inline-block;\r\n margin-top: 5px;\r\n}\r\n\r\n.privacy-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.consent-container {\r\n margin-top: 12px;\r\n padding: 10px;\r\n background-color: #fff8e1;\r\n border-radius: 4px;\r\n border: 2px dashed #ffe082;\r\n}\r\n\r\n.consent-container .checkbox-container {\r\n margin-bottom: 0;\r\n}\r\n\r\n.disabled-notice {\r\n color: #d32f2f;\r\n font-weight: bold;\r\n margin: 8px 0 0 44px;\r\n}\r\n\r\n.platforms-info {\r\n margin-top: 12px;\r\n padding: 4px 24px;\r\n background-color: #e8f0fe;\r\n border: 2px dashed #4285f4;\r\n border-radius: 8px;\r\n font-size: 12px;\r\n color: #1a73e8;\r\n font-weight: 500;\r\n}\r\n\r\n.platforms-info.unsupported {\r\n background-color: #fce8e6;\r\n border-color: #ea4335;\r\n color: #d93025;\r\n}\r\n\r\n.status-message {\r\n display: none;\r\n padding: 8px;\r\n text-align: center;\r\n color: #4CAF50;\r\n margin-top: 10px;\r\n font-weight: bold;\r\n background-color: #f1f8e9;\r\n border-radius: 4px;\r\n} "],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
/***/ }),
/***/ "./src/shared/styles/tampermonkey.css":
/*!********************************************!*\
!*** ./src/shared/styles/tampermonkey.css ***!
\********************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/.pnpm/[email protected][email protected]/node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/.pnpm/[email protected][email protected]/node_modules/css-loader/dist/runtime/sourceMaps.js");
/* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/.pnpm/[email protected][email protected]/node_modules/css-loader/dist/runtime/api.js */ "./node_modules/.pnpm/[email protected][email protected]/node_modules/css-loader/dist/runtime/api.js");
/* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
// Imports
var ___CSS_LOADER_EXPORT___ = _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, `.tm-settings-panel {
position: fixed;
right: 20px;
bottom: 20px;
z-index: 10000;
}
.tm-settings-icon {
width: 40px;
height: 40px;
background: linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6));
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
margin-left: auto;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
animation: glowing 2s infinite;
font-size: 20px;
}
.tm-fixed-settings-button {
position: fixed;
right: 20px;
width: 40px;
height: 40px;
background: linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6));
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
cursor: move;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
animation: glowing 2s infinite;
font-size: 20px;
z-index: 10000;
user-select: none;
transition: transform 0.2s ease;
}
.tm-fixed-settings-button:hover {
transform: scale(1.1);
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
}
.tm-fixed-settings-button:active {
transform: scale(0.95);
}
.tm-settings-content {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: white;
border-radius: 8px;
padding: 20px;
width: 400px;
max-width: 80vw;
max-height: 80vh;
overflow-y: auto;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
z-index: 10001;
display: none;
}
.tm-settings-title {
font-size: 20px;
font-weight: bold;
margin-bottom: 16px;
color: #333;
text-align: center;
}
.option-container {
margin-bottom: 16px;
border: 2px dashed #e0e0e0;
border-radius: 12px;
padding: 4px 16px;
}
.checkbox-container {
display: flex;
align-items: center;
margin-bottom: 12px;
padding: 0 8px;
border-radius: 8px;
cursor: pointer !important;
transition: background-color 0.2s;
font-size: 14px;
}
.checkbox-container:hover {
background-color: #f5f5f5;
}
.checkbox-container input[type='checkbox'] {
margin-right: 12px;
width: 20px;
height: 20px;
cursor: pointer;
accent-color: #4285f4;
}
.radio-group {
position: relative;
display: inline-flex;
align-items: center;
margin-left: 2px;
background-color: #f5f5f5;
border-radius: 20px;
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
}
.radio-group input[type='radio'] {
display: none;
}
.radio-group label {
position: relative;
padding: 6px 16px;
font-size: 14px;
color: #bdbdbd;
cursor: pointer;
border-radius: 16px;
transition: all 0.3s ease;
user-select: none;
z-index: 1;
}
.radio-group label:hover {
color: #4285f4;
}
.label-key {
width: 124px;
text-align: left;
margin-right: 10px;
}
.radio-group input[type='radio']:checked + label {
color: #4285f4;
}
.consent-container {
margin-top: 12px;
padding: 10px;
background-color: #fff8e1;
border-radius: 4px;
border: 2px dashed #ffe082;
}
.consent-container .checkbox-container {
margin-bottom: 0;
}
.disabled-notice {
color: #d32f2f;
font-weight: bold;
margin: 8px 0 0 44px;
font-size: 12px;
}
.privacy-notice {
margin: 2px 0 0 14px;
padding: 10px;
background-color: #f8f9fa;
border-left: 3px solid #4285f4;
font-size: 13px;
}
.privacy-link {
color: #4285f4;
text-decoration: none;
display: inline-block;
margin-top: 5px;
}
.privacy-link:hover {
text-decoration: underline;
}
.platforms-info {
margin-top: 12px;
padding: 4px 24px;
background-color: #e8f0fe;
border: 2px dashed #4285f4;
border-radius: 8px;
font-size: 12px;
color: #1a73e8;
font-weight: 500;
}
.platforms-info.unsupported {
background-color: #fce8e6;
border-color: #ea4335;
color: #d93025;
}
button {
width: 100%;
padding: 8px;
margin-top: 8px;
background-color: #4285f4;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
}
button:hover {
background-color: #3367d6;
}
.status-message {
display: none;
padding: 8px;
text-align: center;
color: #4CAF50;
margin-top: 10px;
font-weight: bold;
background-color: #f1f8e9;
border-radius: 4px;
}
/* 设置按钮样式 - 已不再使用,但保留以便未来可能的扩展 */
.ai-settings-button {
position: absolute;
padding: 4px 8px;
background: linear-gradient(135deg, rgba(64, 128, 255, 0.6), rgba(25, 239, 192, 0.4));
color: white;
border: 2px dashed #fff;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
z-index: 1000;
animation: glowing 2s infinite;
}
.ai-settings-button:hover {
background: linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6));
} `, "",{"version":3,"sources":["webpack://./src/shared/styles/tampermonkey.css"],"names":[],"mappings":"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","sourcesContent":[".tm-settings-panel {\r\n position: fixed;\r\n right: 20px;\r\n bottom: 20px;\r\n z-index: 10000;\r\n}\r\n\r\n.tm-settings-icon {\r\n width: 40px;\r\n height: 40px;\r\n background: linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6));\r\n border-radius: 50%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n cursor: pointer;\r\n margin-left: auto;\r\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\r\n animation: glowing 2s infinite;\r\n font-size: 20px;\r\n}\r\n\r\n.tm-fixed-settings-button {\r\n position: fixed;\r\n right: 20px;\r\n width: 40px;\r\n height: 40px;\r\n background: linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6));\r\n border-radius: 50%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n cursor: move;\r\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\r\n animation: glowing 2s infinite;\r\n font-size: 20px;\r\n z-index: 10000;\r\n user-select: none;\r\n transition: transform 0.2s ease;\r\n}\r\n\r\n.tm-fixed-settings-button:hover {\r\n transform: scale(1.1);\r\n box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n.tm-fixed-settings-button:active {\r\n transform: scale(0.95);\r\n}\r\n\r\n.tm-settings-content {\r\n position: fixed;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n background: white;\r\n border-radius: 8px;\r\n padding: 20px;\r\n width: 400px;\r\n max-width: 80vw;\r\n max-height: 80vh;\r\n overflow-y: auto;\r\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);\r\n z-index: 10001;\r\n display: none;\r\n}\r\n\r\n.tm-settings-title {\r\n font-size: 20px;\r\n font-weight: bold;\r\n margin-bottom: 16px;\r\n color: #333;\r\n text-align: center;\r\n}\r\n\r\n.option-container {\r\n margin-bottom: 16px;\r\n border: 2px dashed #e0e0e0;\r\n border-radius: 12px;\r\n padding: 4px 16px;\r\n}\r\n\r\n.checkbox-container {\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 12px;\r\n padding: 0 8px;\r\n border-radius: 8px;\r\n cursor: pointer !important;\r\n transition: background-color 0.2s;\r\n font-size: 14px;\r\n}\r\n\r\n.checkbox-container:hover {\r\n background-color: #f5f5f5;\r\n}\r\n\r\n.checkbox-container input[type='checkbox'] {\r\n margin-right: 12px;\r\n width: 20px;\r\n height: 20px;\r\n cursor: pointer;\r\n accent-color: #4285f4;\r\n}\r\n\r\n.radio-group {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n margin-left: 2px;\r\n background-color: #f5f5f5;\r\n border-radius: 20px;\r\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.radio-group input[type='radio'] {\r\n display: none;\r\n}\r\n\r\n.radio-group label {\r\n position: relative;\r\n padding: 6px 16px;\r\n font-size: 14px;\r\n color: #bdbdbd;\r\n cursor: pointer;\r\n border-radius: 16px;\r\n transition: all 0.3s ease;\r\n user-select: none;\r\n z-index: 1;\r\n}\r\n\r\n.radio-group label:hover {\r\n color: #4285f4;\r\n}\r\n\r\n.label-key {\r\n width: 124px;\r\n text-align: left;\r\n margin-right: 10px;\r\n}\r\n\r\n.radio-group input[type='radio']:checked + label {\r\n color: #4285f4;\r\n}\r\n\r\n.consent-container {\r\n margin-top: 12px;\r\n padding: 10px;\r\n background-color: #fff8e1;\r\n border-radius: 4px;\r\n border: 2px dashed #ffe082;\r\n}\r\n\r\n.consent-container .checkbox-container {\r\n margin-bottom: 0;\r\n}\r\n\r\n.disabled-notice {\r\n color: #d32f2f;\r\n font-weight: bold;\r\n margin: 8px 0 0 44px;\r\n font-size: 12px;\r\n}\r\n\r\n.privacy-notice {\r\n margin: 2px 0 0 14px;\r\n padding: 10px;\r\n background-color: #f8f9fa;\r\n border-left: 3px solid #4285f4;\r\n font-size: 13px;\r\n}\r\n\r\n.privacy-link {\r\n color: #4285f4;\r\n text-decoration: none;\r\n display: inline-block;\r\n margin-top: 5px;\r\n}\r\n\r\n.privacy-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.platforms-info {\r\n margin-top: 12px;\r\n padding: 4px 24px;\r\n background-color: #e8f0fe;\r\n border: 2px dashed #4285f4;\r\n border-radius: 8px;\r\n font-size: 12px;\r\n color: #1a73e8;\r\n font-weight: 500;\r\n}\r\n\r\n.platforms-info.unsupported {\r\n background-color: #fce8e6;\r\n border-color: #ea4335;\r\n color: #d93025;\r\n}\r\n\r\nbutton {\r\n width: 100%;\r\n padding: 8px;\r\n margin-top: 8px;\r\n background-color: #4285f4;\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 16px;\r\n}\r\n\r\nbutton:hover {\r\n background-color: #3367d6;\r\n}\r\n\r\n.status-message {\r\n display: none;\r\n padding: 8px;\r\n text-align: center;\r\n color: #4CAF50;\r\n margin-top: 10px;\r\n font-weight: bold;\r\n background-color: #f1f8e9;\r\n border-radius: 4px;\r\n}\r\n\r\n/* 设置按钮样式 - 已不再使用,但保留以便未来可能的扩展 */\r\n.ai-settings-button {\r\n position: absolute;\r\n padding: 4px 8px;\r\n background: linear-gradient(135deg, rgba(64, 128, 255, 0.6), rgba(25, 239, 192, 0.4));\r\n color: white;\r\n border: 2px dashed #fff;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 16px;\r\n z-index: 1000;\r\n animation: glowing 2s infinite;\r\n}\r\n\r\n.ai-settings-button:hover {\r\n background: linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6));\r\n} "],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
/***/ }),
/***/ "./src/shared/templates.ts":
/*!*********************************!*\
!*** ./src/shared/templates.ts ***!
\*********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ createSettingsPanelHTML: () => (/* binding */ createSettingsPanelHTML)
/* harmony export */ });
// 生成设置面板的HTML内容,为Chrome扩展和油猴脚本提供统一UI
function createSettingsPanelHTML(config, options = {}) {
const { prefix = '', title = 'AI助手智能复制工具-设置', includePrivacyLink = true, privacyLinkUrl = 'privacy.html' } = options;
// 为ID添加前缀以避免冲突
const ids = {
enableCopy: `${prefix}enableCopy`,
formatMarkdown: `${prefix}formatMarkdown`,
formatHtml: `${prefix}formatHtml`,
removeReferences: `${prefix}removeReferences`,
userConsent: `${prefix}user-consent`,
consentStatus: `${prefix}consent-status`,
saveButton: `${prefix}saveButton`,
status: `${prefix}status`
};
return `
<h2>${title}</h2>
<div class="option-container">
<div class="checkbox-container">
<label for="${ids.enableCopy}" class="label-key">启用复制功能</label>
<input type="checkbox" id="${ids.enableCopy}" ${config.enableCopy ? 'checked' : ''} />
</div>
<div class="checkbox-container">
<label class="label-key">复制出的结果</label>
<div class="radio-group">
<input
type="radio"
id="${ids.formatMarkdown}"
name="${prefix}copyFormat"
value="markdown"
${config.copyFormat === 'markdown' ? 'checked' : ''}
/>
<label for="${ids.formatMarkdown}">markdown</label>
<input
type="radio"
id="${ids.formatHtml}"
name="${prefix}copyFormat"
value="html"
${config.copyFormat === 'html' ? 'checked' : ''}
/>
<label for="${ids.formatHtml}">html格式</label>
</div>
</div>
<div class="checkbox-container">
<label for="${ids.removeReferences}" class="label-key">去除参考文献角标</label>
<input type="checkbox" id="${ids.removeReferences}" ${config.removeReferences ? 'checked' : ''} />
</div>
</div>
<div id="${prefix}consent-container" class="consent-container">
<div class="checkbox-container">
<input type="checkbox" id="${ids.userConsent}" ${config.userConsent ? 'checked' : ''} />
<label for="${ids.userConsent}">
<strong>我同意</strong>此扩展在我使用复制功能时临时处理内容
</label>
</div>
<div id="${ids.consentStatus}" class="disabled-notice" style="${config.userConsent ? 'display: none;' : 'display: block;'}">
请同意隐私政策以启用功能
</div>
<div class="privacy-notice">
<strong>隐私说明:</strong>本扩展仅在您点击复制按钮时临时处理内容,所有数据处理均在本地完成,不会上传任何内容到服务器。
${includePrivacyLink ? `
<a
href="${privacyLinkUrl}"
id="${prefix}privacy-link"
target="blank"
class="privacy-link"
>查看完整隐私政策 »</a>
` : ''}
</div>
</div>
<div class="platforms-info">
支持平台:百度-AI搜索、字节-豆包、腾讯-元宝
</div>
<div class="platforms-info unsupported">
无须支持平台:百度-文心一言、阿里-通义千问
</div>
<button id="${ids.saveButton}">保存设置</button>
<div id="${ids.status}" class="status-message"></div>
`;
}
/***/ }),
/***/ "./src/shared/types.ts":
/*!*****************************!*\
!*** ./src/shared/types.ts ***!
\*****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ DEFAULT_CONFIG: () => (/* binding */ DEFAULT_CONFIG),
/* harmony export */ PLATFORMS: () => (/* binding */ PLATFORMS)
/* harmony export */ });
// 共享类型定义
// 导出默认配置
const DEFAULT_CONFIG = {
removeReferences: true, // 默认去除参考文献角标
userConsent: true, // 默认获得用户同意
copyFormat: 'markdown',
enableCopy: true // 默认启用复制功能
};
// 支持的AI平台配置
const PLATFORMS = [
{
name: '百度-AI搜索',
selector: '[class*="cosd-markdown-content"]',
markdownContentClass: 'marklang',
removeSelectorList: ['span[disable-audio="true"][disable-copy="true"]', '.cosd-markdown-code-copy.cos-link']
},
{
name: '字节-豆包',
selector: '[class*="receive-message-box-content-"]',
markdownContentClass: 'flow-markdown-body',
removeSelectorList: ['.ref_content_circle', '.code-area [class*="header-"]', '[class*="canvas_wrapper-"]']
},
{
name: '腾讯-元宝',
selector: '[class*="hyc-content-md"]',
markdownContentClass: 'hyc-common-markdown',
removeSelectorList: ['.hyc-common-markdown__ref-list']
}
];
/***/ }),
/***/ "./src/shared/ui.ts":
/*!**************************!*\
!*** ./src/shared/ui.ts ***!
\**************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ createTampermonkeySettingsHTML: () => (/* binding */ createTampermonkeySettingsHTML),
/* harmony export */ createTampermonkeySettingsPanel: () => (/* binding */ createTampermonkeySettingsPanel),
/* harmony export */ removeAllCopyButtons: () => (/* binding */ removeAllCopyButtons),
/* harmony export */ showStatusMessage: () => (/* binding */ showStatusMessage)
/* harmony export */ });
/* harmony import */ var _templates__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./templates */ "./src/shared/templates.ts");
// 创建油猴设置面板的HTML内容
function createTampermonkeySettingsHTML(config) {
return (0,_templates__WEBPACK_IMPORTED_MODULE_0__.createSettingsPanelHTML)(config, {
prefix: 'tm-',
includePrivacyLink: false // 油猴脚本中不包含隐私链接
});
}
// 创建油猴设置面板
function createTampermonkeySettingsPanel(config, updateConfigCallback) {
// 创建主容器
const panelWrapper = document.createElement('div');
panelWrapper.className = 'tm-settings-panel';
// 创建设置图标
const settingsIcon = document.createElement('div');
settingsIcon.textContent = '⚙️';
settingsIcon.className = 'tm-settings-icon';
// 创建设置面板内容
const settingsPanel = document.createElement('div');
settingsPanel.className = 'tm-settings-content';
settingsPanel.innerHTML = createTampermonkeySettingsHTML(config);
// 点击图标显示/隐藏设置面板
settingsIcon.addEventListener('click', () => {
settingsPanel.style.display = settingsPanel.style.display === 'none' ? 'block' : 'none';
});
// 点击页面其他位置隐藏设置面板
document.addEventListener('click', (e) => {
const target = e.target;
if (!panelWrapper.contains(target)) {
settingsPanel.style.display = 'none';
}
});
// 绑定设置变更事件
settingsPanel.addEventListener('change', (e) => {
const target = e.target;
const newConfig = {};
if (target.id === 'tm-remove-references') {
newConfig.removeReferences = target.checked;
}
else if (target.id === 'tm-enableCopy') {
newConfig.enableCopy = target.checked;
}
else if (target.id === 'tm-user-consent') {
newConfig.userConsent = target.checked;
const consentStatus = document.getElementById('tm-consent-status');
if (consentStatus) {
consentStatus.style.display = target.checked ? 'none' : 'block';
}
}
else if (target.name === 'tm-copyFormat') {
newConfig.copyFormat = target.value;
}
updateConfigCallback(newConfig);
});
// 保存按钮事件
const saveButton = settingsPanel.querySelector('#tm-saveButton');
if (saveButton) {
saveButton.addEventListener('click', () => {
const statusElement = document.getElementById('tm-status');
if (statusElement) {
statusElement.textContent = '设置已保存';
statusElement.style.display = 'block';
// 2秒后隐藏提示
setTimeout(() => {
statusElement.style.display = 'none';
}, 2000);
}
});
}
// 添加到DOM
panelWrapper.appendChild(settingsIcon);
panelWrapper.appendChild(settingsPanel);
return panelWrapper;
}
// 移除所有复制按钮
function removeAllCopyButtons() {
const copyButtons = document.querySelectorAll('.ai-copy-button');
copyButtons.forEach(button => button.remove());
}
// 显示临时状态消息
function showStatusMessage(element, message, options = {}) {
const { duration = 2000, textColor = '#4CAF50', bgColor = '#f1f8e9' } = options;
// 保存原始样式
const originalDisplay = element.style.display;
const originalText = element.textContent;
const originalColor = element.style.color;
const originalBgColor = element.style.backgroundColor;
// 设置新样式并显示
element.textContent = message;
element.style.color = textColor;
element.style.backgroundColor = bgColor;
element.style.display = 'block';
// 在指定时间后恢复
setTimeout(() => {
element.style.display = originalDisplay;
element.textContent = originalText;
element.style.color = originalColor;
element.style.backgroundColor = originalBgColor;
}, duration);
}
/***/ }),
/***/ "turndown":
/*!**********************************!*\
!*** external "TurndownService" ***!
\**********************************/
/***/ ((module) => {
module.exports = TurndownService;
/***/ }),
/***/ "turndown-plugin-gfm":
/*!************************************!*\
!*** external "turndownPluginGfm" ***!
\************************************/
/***/ ((module) => {
module.exports = turndownPluginGfm;
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ id: moduleId,
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = (module) => {
/******/ var getter = module && module.__esModule ?
/******/ () => (module['default']) :
/******/ () => (module);
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.
(() => {
/*!***********************************!*\
!*** ./src/tampermonkey/index.ts ***!
\***********************************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _shared_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shared/types */ "./src/shared/types.ts");
/* harmony import */ var _shared_copy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../shared/copy */ "./src/shared/copy.ts");
/* harmony import */ var _shared_ui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../shared/ui */ "./src/shared/ui.ts");
/* harmony import */ var _shared_templates__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shared/templates */ "./src/shared/templates.ts");
/* harmony import */ var _shared_styles_common_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../shared/styles/common.css */ "./src/shared/styles/common.css");
/* harmony import */ var _shared_styles_tampermonkey_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../shared/styles/tampermonkey.css */ "./src/shared/styles/tampermonkey.css");
// ==UserScript==
// @name AI助手复制工具
// @namespace http://tampermonkey.net/
// @version 1.0.0
// @description 为AI助手平台(通义千问、文心一言、豆包、元宝、百度)添加复制按钮,整理markdown文本并去除参考文献角标
// @author AI助手复制工具
// @match *://*.baidu.com/*
// @match *://*.doubao.com/*
// @match *://*.tencent.com/*
// @grant GM_addStyle
// @grant GM_setClipboard
// @grant GM_getValue
// @grant GM_setValue
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/turndown.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/turndown-plugin-gfm.js
// ==/UserScript==
(function () {
'use strict';
// 添加样式
GM_addStyle(_shared_styles_common_css__WEBPACK_IMPORTED_MODULE_4__["default"]);
GM_addStyle(_shared_styles_tampermonkey_css__WEBPACK_IMPORTED_MODULE_5__["default"]);
// 添加动画样式
document.head.appendChild((0,_shared_copy__WEBPACK_IMPORTED_MODULE_1__.createGlowingAnimationStyle)());
// 配置
const config = {
removeReferences: GM_getValue('removeReferences', _shared_types__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_CONFIG.removeReferences),
userConsent: GM_getValue('userConsent', _shared_types__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_CONFIG.userConsent),
copyFormat: GM_getValue('copyFormat', _shared_types__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_CONFIG.copyFormat),
enableCopy: GM_getValue('enableCopy', _shared_types__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_CONFIG.enableCopy)
};
// 复制到剪贴板函数 - 油猴脚本版本
async function copyToClipboard(text) {
GM_setClipboard(text);
}
// 更新配置方法
function updateConfig(newConfig) {
Object.assign(config, newConfig);
// 保存到GM存储
GM_setValue('removeReferences', config.removeReferences);
GM_setValue('userConsent', config.userConsent);
GM_setValue('copyFormat', config.copyFormat);
GM_setValue('enableCopy', config.enableCopy);
// 检查是否有用户同意
const shouldApplyButtons = config.enableCopy && config.userConsent;
if (shouldApplyButtons) {
// 重新应用复制按钮
(0,_shared_copy__WEBPACK_IMPORTED_MODULE_1__.applyToPlatforms)(_shared_types__WEBPACK_IMPORTED_MODULE_0__.PLATFORMS, config, turndownService, copyToClipboard);
}
else {
// 如果用户不同意或禁用复制,移除所有复制按钮
(0,_shared_ui__WEBPACK_IMPORTED_MODULE_2__.removeAllCopyButtons)();
}
}
// 初始化 Turndown 服务
const turndownService = (0,_shared_copy__WEBPACK_IMPORTED_MODULE_1__.initTurndownService)();
// 创建MutationObserver实例
let observer = null;
// 设置面板实例
let settingsPanel = null;
// 设置面板位置状态
const panelPosition = {
top: GM_getValue('settingsPanelTop', 300),
isDragging: false,
dragStartY: 0,
dragStartTop: 0,
isPanelOpen: false,
wasDragged: false
};
// 创建油猴设置面板的HTML内容
function createTampermonkeySettingsHTML(config) {
return (0,_shared_templates__WEBPACK_IMPORTED_MODULE_3__.createSettingsPanelHTML)(config, {
prefix: 'tm-',
includePrivacyLink: false // 油猴脚本中不包含隐私链接
});
}
// 创建油猴设置面板
function createTampermonkeySettingsPanel() {
// 创建设置面板内容
const settingsContent = document.createElement('div');
settingsContent.className = 'tm-settings-content';
settingsContent.innerHTML = createTampermonkeySettingsHTML(config);
// 添加关闭按钮
const closeButton = document.createElement('div');
closeButton.className = 'tm-settings-close';
closeButton.innerHTML = '×';
closeButton.style.position = 'absolute';
closeButton.style.top = '10px';
closeButton.style.right = '15px';
closeButton.style.fontSize = '24px';
closeButton.style.fontWeight = 'bold';
closeButton.style.cursor = 'pointer';
closeButton.style.color = '#999';
closeButton.title = '关闭';
// 定义关闭面板的函数
const closePanel = () => {
settingsContent.style.display = 'none';
panelPosition.isPanelOpen = false;
};
// 关闭按钮点击事件
closeButton.addEventListener('click', closePanel);
// 绑定设置变更事件
settingsContent.addEventListener('change', (e) => {
const target = e.target;
const newConfig = {};
if (target.id === 'tm-removeReferences') {
newConfig.removeReferences = target.checked;
}
else if (target.id === 'tm-enableCopy') {
newConfig.enableCopy = target.checked;
}
else if (target.id === 'tm-user-consent') {
newConfig.userConsent = target.checked;
const consentStatus = document.getElementById('tm-consent-status');
if (consentStatus) {
consentStatus.style.display = target.checked ? 'none' : 'block';
}
}
else if (target.name === 'tm-copyFormat') {
newConfig.copyFormat = target.value;
}
updateConfig(newConfig);
});
// 保存按钮事件
const saveButton = settingsContent.querySelector('#tm-saveButton');
if (saveButton) {
saveButton.addEventListener('click', () => {
const statusElement = document.getElementById('tm-status');
if (statusElement) {
(0,_shared_ui__WEBPACK_IMPORTED_MODULE_2__.showStatusMessage)(statusElement, '设置已保存');
}
// 保存后关闭设置面板
setTimeout(() => {
closePanel();
}, 1500);
});
}
// 添加关闭按钮到面板内容
settingsContent.appendChild(closeButton);
return settingsContent;
}
// 创建单个设置按钮
function createFixedSettingsButton() {
const button = document.createElement('div');
button.className = 'tm-fixed-settings-button';
button.innerHTML = '⚙️';
button.title = '设置';
button.style.top = `${panelPosition.top}px`;
button.style.position = 'fixed';
button.style.right = '0';
button.style.width = '30px';
button.style.fontSize = '20px';
button.style.textAlign = 'right';
button.style.lineHeight = '30px';
button.style.borderTopLeftRadius = '34px';
button.style.borderBottomLeftRadius = '34px';
button.style.cursor = 'pointer';
button.style.background = 'linear-gradient(135deg, rgba(25, 239, 192, 0.6), rgba(64, 128, 255, 0.4))';
// 添加点击事件,打开设置面板
button.addEventListener('click', (e) => {
e.stopPropagation(); // 防止冒泡到document
// 如果刚刚拖动过,不触发打开面板
if (panelPosition.wasDragged) {
panelPosition.wasDragged = false;
return;
}
openSettingsPanel();
});
// 添加拖动功能
button.addEventListener('mousedown', (e) => {
// 仅响应鼠标左键
if (e.button !== 0)
return;
// 如果面板已打开,不允许拖动按钮
if (panelPosition.isPanelOpen) {
e.stopPropagation();
return;
}
panelPosition.isDragging = true;
panelPosition.wasDragged = false; // 重置拖动状态
panelPosition.dragStartY = e.clientY;
panelPosition.dragStartTop = panelPosition.top;
e.preventDefault(); // 防止文本选择
// 添加临时全局鼠标事件监听器
document.addEventListener('mousemove', handleMouseMove);
document.addEventListener('mouseup', handleMouseUp);
});
return button;
}
// 处理鼠标移动事件
function handleMouseMove(e) {
if (!panelPosition.isDragging)
return;
const button = document.querySelector('.tm-fixed-settings-button');
if (!button)
return;
// 计算新位置
const deltaY = e.clientY - panelPosition.dragStartY;
// 如果移动距离大于5像素,标记为已拖动
if (Math.abs(deltaY) > 5) {
panelPosition.wasDragged = true;
}
const newTop = Math.max(10, panelPosition.dragStartTop + deltaY);
const maxTop = window.innerHeight - 50; // 防止按钮被拖到屏幕外
panelPosition.top = Math.min(newTop, maxTop);
button.style.top = `${panelPosition.top}px`;
// 如果面板是打开的,同时更新面板位置
if (panelPosition.isPanelOpen && settingsPanel) {
const settingsContent = settingsPanel.querySelector('.tm-settings-content');
if (settingsContent) {
adjustPanelPosition(settingsContent);
}
}
}
// 处理鼠标松开事件
function handleMouseUp(e) {
if (!panelPosition.isDragging)
return;
panelPosition.isDragging = false;
// 保存新位置到GM存储
GM_setValue('settingsPanelTop', panelPosition.top);
// 移除临时事件监听器
document.removeEventListener('mousemove', handleMouseMove);
document.removeEventListener('mouseup', handleMouseUp);
// 阻止事件冒泡,防止触发click事件
e.preventDefault();
e.stopPropagation();
}
// 调整面板位置,确保在屏幕内
function adjustPanelPosition(panel) {
const button = document.querySelector('.tm-fixed-settings-button');
if (!button || !panel)
return;
const buttonRect = button.getBoundingClientRect();
const panelRect = panel.getBoundingClientRect();
// 设置面板固定定位
panel.style.position = 'fixed';
// 水平位置:从按钮左侧开始,向左展开
panel.style.right = `${buttonRect.width}px`;
panel.style.background = '#fff';
panel.style.padding = '20px';
panel.style.width = '500px';
panel.style.border = '2px dashed rgb(186 186 186)';
panel.style.borderRadius = '10px';
panel.style.zIndex = '999';
// 计算垂直位置
const buttonTop = buttonRect.top;
const windowHeight = window.innerHeight;
const panelHeight = panelRect.height;
// 自动调整,优先在按钮下方显示
if (buttonTop + panelHeight < windowHeight) {
// 如果面板在按钮下方能完全显示
panel.style.top = `${buttonTop}px`;
panel.style.bottom = 'auto';
}
else if (buttonTop - panelHeight > 0) {
// 如果面板在按钮上方能完全显示
panel.style.bottom = `${windowHeight - buttonTop}px`;
panel.style.top = 'auto';
}
else {
// 都显示不全,尽量适应屏幕
if (buttonTop < windowHeight / 2) {
// 按钮在屏幕上半部分,面板放在下方
panel.style.top = `${buttonTop}px`;
panel.style.bottom = 'auto';
panel.style.maxHeight = `${windowHeight - buttonTop - 20}px`;
panel.style.overflowY = 'auto';
}
else {
// 按钮在屏幕下半部分,面板放在上方
panel.style.bottom = `${windowHeight - buttonTop}px`;
panel.style.top = 'auto';
panel.style.maxHeight = `${buttonTop - 20}px`;
panel.style.overflowY = 'auto';
}
}
}
// 打开设置面板的方法
function openSettingsPanel() {
// 如果设置面板不存在,则创建
if (!settingsPanel) {
settingsPanel = createTampermonkeySettingsPanel();
document.body.appendChild(settingsPanel);
// 添加点击外部区域关闭面板
document.addEventListener('click', (e) => {
if (panelPosition.isPanelOpen && settingsPanel) {
const button = document.querySelector('.tm-fixed-settings-button');
// 检查点击是否在面板或按钮外部
if (!settingsPanel.contains(e.target) &&
!button.contains(e.target)) {
settingsPanel.style.display = 'none';
panelPosition.isPanelOpen = false;
}
}
});
}
// 显示设置面板
if (settingsPanel) {
settingsPanel.style.display = 'block';
panelPosition.isPanelOpen = true;
// 调整面板位置
adjustPanelPosition(settingsPanel);
}
}
// 初始化
function init() {
console.log('AI助手复制工具已加载');
// 添加固定设置按钮
const fixedSettingsButton = createFixedSettingsButton();
document.body.appendChild(fixedSettingsButton);
// 检查是否有用户同意
const shouldApplyButtons = config.enableCopy && config.userConsent;
if (shouldApplyButtons) {
// 应用复制按钮
(0,_shared_copy__WEBPACK_IMPORTED_MODULE_1__.applyToPlatforms)(_shared_types__WEBPACK_IMPORTED_MODULE_0__.PLATFORMS, config, turndownService, copyToClipboard);
// 启动观察器
observer = (0,_shared_copy__WEBPACK_IMPORTED_MODULE_1__.observeDOMChanges)(_shared_types__WEBPACK_IMPORTED_MODULE_0__.PLATFORMS, config, turndownService, copyToClipboard);
}
}
// 页面加载完成后执行初始化操作
if (document.readyState === 'complete' || document.readyState === 'interactive') {
init();
}
else {
document.addEventListener('DOMContentLoaded', init);
}
})();
})();
/******/ })()
;
//# sourceMappingURL=ai-assistant-copy-tool.js.map