feat(observer): table-to-codeblock conversion for Discord compatibility (v0.5.57) #task-634
This commit is contained in:
4
extension/package-lock.json
generated
4
extension/package-lock.json
generated
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user