feat(observer): table-to-codeblock conversion for Discord compatibility (v0.5.57) #task-634

This commit is contained in:
Variet Worker
2026-04-18 06:25:55 +09:00
parent 6b9f1188c3
commit 7a1675fd5d
3 changed files with 52 additions and 3 deletions

View File

@@ -1,12 +1,12 @@
{ {
"name": "gravity-bridge", "name": "gravity-bridge",
"version": "0.5.34", "version": "0.5.57",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "gravity-bridge", "name": "gravity-bridge",
"version": "0.5.34", "version": "0.5.57",
"dependencies": { "dependencies": {
"cheerio": "^1.2.0", "cheerio": "^1.2.0",
"ws": "^8.19.0" "ws": "^8.19.0"

View File

@@ -2,7 +2,7 @@
"name": "gravity-bridge", "name": "gravity-bridge",
"displayName": "Gravity Bridge", "displayName": "Gravity Bridge",
"description": "Discord-based unified approval system for Antigravity AI interactions.", "description": "Discord-based unified approval system for Antigravity AI interactions.",
"version": "0.5.56", "version": "0.5.57",
"publisher": "variet", "publisher": "variet",
"engines": { "engines": {
"vscode": "^1.100.0" "vscode": "^1.100.0"

View File

@@ -504,6 +504,48 @@ export function generateApprovalObserverScript(_port: number): string {
childrenMd += convertNodeToMarkdown(node.childNodes[i]); childrenMd += convertNodeToMarkdown(node.childNodes[i]);
} }
// TABLE: Discord doesn't support markdown tables, so convert to fixed-width code block
if (tag === 'table') {
var rows = node.querySelectorAll('tr');
if (!rows || rows.length === 0) return childrenMd;
var grid = [];
var colWidths = [];
for (var ri = 0; ri < rows.length; ri++) {
var cells = rows[ri].querySelectorAll('th, td');
var row = [];
for (var ci = 0; ci < cells.length; ci++) {
var cellText = (cells[ci].textContent || '').trim();
row.push(cellText);
if (!colWidths[ci] || cellText.length > colWidths[ci]) colWidths[ci] = cellText.length;
}
grid.push(row);
}
// Build fixed-width text
var tbl = '';
for (var ri2 = 0; ri2 < grid.length; ri2++) {
var line = '';
for (var ci2 = 0; ci2 < colWidths.length; ci2++) {
var cell = grid[ri2][ci2] || '';
var pad = colWidths[ci2] - cell.length;
var padding = '';
for (var pi = 0; pi < pad; pi++) padding += ' ';
line += (ci2 > 0 ? ' | ' : '') + cell + padding;
}
tbl += line + '\\n';
// Add separator after header row (first row)
if (ri2 === 0) {
var sep = '';
for (var si2 = 0; si2 < colWidths.length; si2++) {
var dashes = '';
for (var di = 0; di < colWidths[si2]; di++) dashes += '-';
sep += (si2 > 0 ? '-+-' : '') + dashes;
}
tbl += sep + '\\n';
}
}
return '\\n' + String.fromCharCode(96,96,96) + '\\n' + tbl + String.fromCharCode(96,96,96) + '\\n';
}
switch (tag) { switch (tag) {
case 'h1': return '\\n# ' + childrenMd.trim() + '\\n'; case 'h1': return '\\n# ' + childrenMd.trim() + '\\n';
case 'h2': return '\\n## ' + childrenMd.trim() + '\\n'; case 'h2': return '\\n## ' + childrenMd.trim() + '\\n';
@@ -536,6 +578,13 @@ export function generateApprovalObserverScript(_port: number): string {
case 'ul': case 'ul':
case 'ol': return '\\n' + childrenMd + '\\n'; case 'ol': return '\\n' + childrenMd + '\\n';
case 'blockquote': return '\\n> ' + childrenMd.trim().split('\\n').join('\\n> ') + '\\n'; case 'blockquote': return '\\n> ' + childrenMd.trim().split('\\n').join('\\n> ') + '\\n';
// Table sub-elements: already handled by the table case above via querySelectorAll
case 'thead':
case 'tbody':
case 'tfoot':
case 'tr':
case 'th':
case 'td': return '';
default: return childrenMd; default: return childrenMd;
} }
} }