我们在跟AI对话过程中,有时候需要发给AI表格,处理起来太麻烦,我就想着,随便让Claude写个浏览器插件的源码吧,谁知,改了1次,就能用了,太牛了。


创建一个新文件夹,将下方代码分别保存为以下文件:

manifest.json

popup.html

popup.js

content.js

在Chrome浏览器中:

打开扩展管理页面(chrome://extensions/)

开启"开发者模式"

点击"加载已解压的扩展程序"

选择你创建的文件夹




content.js

// content.js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === "convertTable") {
try {
const selectedTable = getSelectedTable();
if (!selectedTable) {
sendResponse({ success: false, error: "No table selected" });
return;
}

const markdown = convertTableToMarkdown(selectedTable);
copyToClipboard(markdown);
sendResponse({ success: true });
} catch (error) {
sendResponse({ success: false, error: error.message });
}
}
return true;
});

function getSelectedTable() {
// 尝试获取用户选中的表格
const selection = window.getSelection();
let node = selection.anchorNode;

while (node && node.nodeName !== 'TABLE') {
node = node.parentNode;
}

return node;
}

function convertTableToMarkdown(table) {
const rows = table.querySelectorAll('tr');
let markdown = '';

rows.forEach((row, rowIndex) => {
const cells = row.querySelectorAll('td, th');

cells.forEach((cell, colIndex) => {
// 根据列号添加相应数量的#号
const hashes = '#'.repeat(colIndex + 1);
const cellText = cell.textContent.trim();
markdown += `${hashes} ${cellText}\n`;
});

markdown += '\n';
});

return markdown;
}

function copyToClipboard(text) {
navigator.clipboard.writeText(text).catch(err => {
console.error('Failed to copy text: ', err);
});
}




manifest.json

{

“manifest_version”: 3,

“name”: “Table to Markdown Converter”,

“version”: “1.0”,

“description”: “Convert table content to markdown format”,

“permissions”: [“clipboardWrite”],

“action”: {

“default_popup”: “popup.html”

}

}





popup.html






body {
width: 400px;
padding: 15px;
font-family: Arial, sans-serif;
}
#input-area {
width: 100%;
height: 200px;
margin: 10px 0;
padding: 8px;
box-sizing: border-box;
border: 1px solid #ccc;
border-radius: 4px;
resize: vertical;
}
#output-area {
width: 100%;
height: 200px;
margin: 10px 0;
padding: 8px;
box-sizing: border-box;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #f9f9f9;
resize: vertical;
}
button {
width: 100%;
padding: 8px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #45a049;
}
.label {
font-weight: bold;
margin: 5px 0;
}



粘贴表格内容:


转换为Markdown
转换结果:








popup.js

document.getElementById(‘convertBtn’).addEventListener(‘click’, () => {

const input = document.getElementById(‘input-area’).value;

const outputArea = document.getElementById(‘output-area’);


if (!input.trim()) {

outputArea.value = ‘请先粘贴表格内容’;

return;

}


try {

// 将输入的文本按行分割

const rows = input.trim().split(‘\n’);

let markdown = ‘’;


rows.forEach(row => {
// 将每行按制表符或多个空格分割
const cells = row.split(/\t| +/);

cells.forEach((cell, index) => {
// 根据列号添加对应数量的#号
const hashes = '#'.repeat(index + 1);
const cellText = cell.trim();
if (cellText) {
markdown += `${hashes} ${cellText}\n`;
}
});

markdown += '\n';
});

// 显示结果
outputArea.value = markdown;

// 自动复制到剪贴板
navigator.clipboard.writeText(markdown)
.then(() => {
outputArea.value += '\n(已自动复制到剪贴板!)';
})
.catch(err => {
outputArea.value += '\n(复制到剪贴板失败,请手动复制)';
});

} catch (error) {

outputArea.value = '转换出错: ’ + error.message;

}

});


// 添加自动调整文本框高度

function autoResize(textarea) {

textarea.style.height = ‘auto’;

textarea.style.height = textarea.scrollHeight + ‘px’;

}


document.getElementById(‘input-area’).addEventListener(‘input’, function() {

autoResize(this);

});



举报· 388 次点击
登录 注册 站外分享
19 条回复  
dragonfsky 初学 2024-10-28 02:16:29

多谢大佬,给力的

I-IronMan 初学 2024-10-28 02:16:29

你这个是想在输入的内容里插入’|'来达到转成markdown的效果吗?

叫AI写了个油猴脚本,感觉更方便一些,代码放在下面了

感觉初始的还有一些缺陷,优化了一下,现在用起来应该比较好了;图在下面,默认是折叠在右上角


// ==UserScript==
// @name Table to Markdown Converter
// @namespace http://tampermonkey.net/
// @version 0.3
// @description Convert tables to Markdown format with enhanced features
// @author Your name
// @match *://*/*
// @grant GM_setClipboard
// ==/UserScript==

(function() {
'use strict';

// 更新样式,修复折叠按钮对齐问题
const style = document.createElement('style');
style.textContent = `
.markdown-converter {
position: fixed;
right: 20px;
top: 20px;
background: white;
padding: 15px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
z-index: 10000;
width: 300px;
font-family: Arial, sans-serif;
transition: all 0.3s ease;
}
.markdown-converter.collapsed {
width: 30px;
height: 30px;
overflow: hidden;
padding: 0;
background: none;
box-shadow: none;
}
.markdown-converter textarea {
width: 100%;
height: 150px;
margin: 10px 0;
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
resize: vertical;
}
.markdown-converter button {
background: #4CAF50;
color: white;
border: none;
padding: 8px 15px;
border-radius: 4px;
cursor: pointer;
width: 100%;
margin: 5px 0;
transition: background-color 0.3s;
}
.markdown-converter button:hover {
background: #45a049;
}
.markdown-converter button:disabled {
background: #cccccc;
cursor: not-allowed;
}
.markdown-converter h3 {
margin: 0 0 10px 0;
font-size: 16px;
}
.toggle-btn {
position: absolute;
right: 0;
top: 0;
width: 30px;
height: 30px;
background: #4CAF50 !important;
color: white;
border: none;
border-radius: 4px !important;
cursor: pointer;
padding: 0 !important;
margin: 0 !important;
line-height: 30px;
text-align: center;
font-size: 16px;
transition: background-color 0.3s !important;
}
.toggle-btn:hover {
background: #45a049 !important;
}
.separator-select {
width: 100%;
padding: 5px;
margin: 5px 0;
border-radius: 4px;
border: 1px solid #ddd;
}
.button-group {
display: flex;
gap: 5px;
}
.button-group button {
flex: 1;
}
.success-toast {
position: fixed;
bottom: 20px;
right: 20px;
background: #4CAF50;
color: white;
padding: 10px 20px;
border-radius: 4px;
z-index: 10001;
animation: fadeInOut 2s ease-in-out;
}
.content-wrapper {
margin-top: 10px;
}
@keyframes fadeInOut {
0% { opacity: 0; transform: translateY(20px); }
20% { opacity: 1; transform: translateY(0); }
80% { opacity: 1; transform: translateY(0); }
100% { opacity: 0; transform: translateY(-20px); }
}
`;
document.head.appendChild(style);

// 更新界面结构,将内容包裹在单独的div中
const converter = document.createElement('div');
converter.className = 'markdown-converter collapsed'; // 默认折叠
converter.innerHTML = `
<button class="toggle-btn" title="折叠/展开">≡</button>
<div class="content-wrapper">
<h3>粘贴表格内容</h3>
<select class="separator-select">
<option value="tab">制表符分隔</option>
<option value="comma">逗号分隔</option>
<option value="auto">自动检测</option>
</select>
<div class="button-group">
<button id="pasteBtn">从剪贴板粘贴</button>
<button id="clearBtn">清空内容</button>
</div>
<textarea id="tableInput" placeholder="在这里粘贴表格内容..."></textarea>
<button id="convertBtn">转换为Markdown</button>
<h3>转换结果:</h3>
<textarea id="markdownOutput" readonly placeholder="转换后的Markdown内容会显示在这里"></textarea>
<button id="copyBtn">复制到剪贴板</button>
</div>
`;

document.body.appendChild(converter);

// 显示提示消息函数
function showToast(message) {
const toast = document.createElement('div');
toast.className = 'success-toast';
toast.textContent = message;
document.body.appendChild(toast);

setTimeout(() => {
document.body.removeChild(toast);
}, 2000);
}

// 检测分隔符
function detectSeparator(text) {
const firstLine = text.split('\n')[0];
const tabCount = (firstLine.match(/\t/g) || []).length;
const commaCount = (firstLine.match(/,/g) || []).length;
return tabCount > commaCount ? '\t' : ',';
}

// 转换函数
function convertToMarkdown(tableText, separatorType) {
if (!tableText.trim()) return '';

let separator;
switch (separatorType) {
case 'tab':
separator = '\t';
break;
case 'comma':
separator = ',';
break;
case 'auto':
separator = detectSeparator(tableText);
break;
default:
separator = '\t';
}

// 处理CSV格式的特殊情况(引号包裹的逗号)
let rows;
if (separator === ',') {
rows = tableText.trim().split('\n').map(row => {
const cells = [];
let cell = '';
let inQuotes = false;

for (let i = 0; i < row.length; i++) {
if (row[i] === '"') {
inQuotes = !inQuotes;
} else if (row[i] === ',' && !inQuotes) {
cells.push(cell.trim().replace(/""/g, '"').replace(/^"|"$/g, ''));
cell = '';
} else {
cell += row[i];
}
}
cells.push(cell.trim().replace(/""/g, '"').replace(/^"|"$/g, ''));
return cells;
});
} else {
rows = tableText.trim().split('\n').map(row => row.split(separator));
}

if (rows.length === 0) return '';

// 获取最大列数
const maxCols = Math.max(...rows.map(row => row.length));

// 确保所有行都有相同的列数
rows.forEach(row => {
while (row.length < maxCols) {
row.push('');
}
});

// 创建markdown表格
let markdown = '';

// 表头
markdown += '| ' + rows[0].map(cell => cell.trim()).join(' | ') + ' |\n';

// 分隔行
markdown += '| ' + Array(maxCols).fill('---').join(' | ') + ' |\n';

// 数据行
for (let i = 1; i < rows.length; i++) {
markdown += '| ' + rows[i].map(cell => cell.trim()).join(' | ') + ' |\n';
}

return markdown;
}

// 从剪贴板粘贴功能
document.getElementById('pasteBtn').addEventListener('click', async () => {
try {
const text = await navigator.clipboard.readText();
document.getElementById('tableInput').value = text;
showToast('已粘贴剪贴板内容');
} catch (err) {
showToast('无法访问剪贴板,请使用Ctrl+V粘贴');
}
});

// 清空功能
document.getElementById('clearBtn').addEventListener('click', () => {
document.getElementById('tableInput').value = '';
document.getElementById('markdownOutput').value = '';
showToast('已清空所有内容');
});

// 折叠/展开功能
document.querySelector('.toggle-btn').addEventListener('click', () => {
converter.classList.toggle('collapsed');
});

// 复制到剪贴板功能
document.getElementById('copyBtn').addEventListener('click', () => {
const output = document.getElementById('markdownOutput');
output.select();
document.execCommand('copy');
showToast('已复制到剪贴板');
});

// 转换功能
document.getElementById('convertBtn').addEventListener('click', () => {
const input = document.getElementById('tableInput').value;
const separatorType = document.querySelector('.separator-select').value;
const markdown = convertToMarkdown(input, separatorType);
document.getElementById('markdownOutput').value = markdown;
if (markdown) {
showToast('转换完成');
}
});

// 输入框内容变化监听
document.getElementById('tableInput').addEventListener('input', (e) => {
if (!e.target.value.trim()) {
document.getElementById('markdownOutput').value = '';
}
// 根据是否有内容来启用/禁用按钮
const hasContent = e.target.value.trim().length > 0;
document.getElementById('convertBtn').disabled = !hasContent;
document.getElementById('clearBtn').disabled = !hasContent;
});

})();

likoo 初学 2024-10-28 02:16:29

牛人一堆一堆的~~

wearewho 初学 2024-10-28 02:16:29

我去,厉害了,大佬

zhong_little 初学 2024-10-28 02:16:29

掌握 AI,每个人都能当五分钟的程序员 tieba_002

(文案灵感:“未来,每个人都能当上15分钟的名人”、“每个人都能当5分钟的脱口秀演员”、…)

F-droid 初学 2024-10-28 02:16:29

浏览器插件都写出来了。牛的!你再把它打包成Crx吧!

Lonelyleaves 初学 2024-10-28 02:16:29

真不错 回头我也去试试 :smile:

handsome 限制会员 2024-10-28 02:16:29

太强了,大佬

ltw 初学 2024-10-28 02:16:29

好强tieba_013

12下一页
返回顶部