fix: box-drawing table multi-line cell merge
Continuation rows (≤1 non-empty cell, e.g. wrapped cell text) were being treated as separate data rows, shifting columns. Now merged into the previous row by appending to the same cell.
This commit is contained in:
@@ -372,23 +372,38 @@ function docsBoxBlockToGfm(buf) {
|
||||
if (seps.length < 2) return '```\n' + buf.join('\n') + '\n```';
|
||||
|
||||
var numCols = seps.length - 1;
|
||||
var dataRows = [];
|
||||
|
||||
// raw data rows 추출 후 각 셀 trim + 여분 줄(≤1개 셀만 내용있음)을 윗줄에 병합
|
||||
var raw = [];
|
||||
for (var i = 0; i < buf.length; i++) {
|
||||
if (/^[ \t]*│/.test(buf[i])) dataRows.push(buf[i]);
|
||||
if (!/^[ \t]*│/.test(buf[i])) continue;
|
||||
var cells = [];
|
||||
for (var c = 0; c < numCols; c++) cells.push(buf[i].substring(seps[c] + 1, seps[c + 1]).trim());
|
||||
raw.push(cells);
|
||||
}
|
||||
if (raw.length === 0) return '```\n' + buf.join('\n') + '\n```';
|
||||
|
||||
var merged = [raw[0]];
|
||||
for (var r = 1; r < raw.length; r++) {
|
||||
var nonEmpty = 0, lastNec = -1;
|
||||
for (var c = 0; c < numCols; c++) { if (raw[r][c] !== '') { nonEmpty++; lastNec = c; } }
|
||||
if (nonEmpty <= 1) {
|
||||
// 여분 줄: 윗줄의 같은 칸에 이어붙임
|
||||
if (lastNec >= 0 && merged[merged.length - 1][lastNec] !== '')
|
||||
merged[merged.length - 1][lastNec] += ' ' + raw[r][lastNec];
|
||||
} else {
|
||||
merged.push(raw[r]);
|
||||
}
|
||||
}
|
||||
if (dataRows.length === 0) return '```\n' + buf.join('\n') + '\n```';
|
||||
|
||||
var result = [];
|
||||
// header
|
||||
var hdr = [];
|
||||
for (var c = 0; c < numCols; c++) hdr.push(dataRows[0].substring(seps[c] + 1, seps[c + 1]).trim());
|
||||
var hdr = merged[0];
|
||||
result.push('| ' + hdr.join(' | ') + ' |');
|
||||
result.push('|' + ' --- |'.repeat(numCols));
|
||||
// data
|
||||
for (var r = 1; r < dataRows.length; r++) {
|
||||
var row = [];
|
||||
for (var c = 0; c < numCols; c++) row.push(dataRows[r].substring(seps[c] + 1, seps[c + 1]).trim());
|
||||
result.push('| ' + row.join(' | ') + ' |');
|
||||
for (var r = 1; r < merged.length; r++) {
|
||||
result.push('| ' + merged[r].join(' | ') + ' |');
|
||||
}
|
||||
return result.join('\n');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user