fix: box-drawing GFM 변환 — 행별 자체 │ 위치 사용으로 컬럼 경계 불일치 대응
This commit is contained in:
@@ -360,48 +360,40 @@ function docsBoxBlockToGfm(buf) {
|
|||||||
if (!/[┬┴┼]/.test(joined) || !/│/.test(joined))
|
if (!/[┬┴┼]/.test(joined) || !/│/.test(joined))
|
||||||
return '```\n' + buf.join('\n') + '\n```';
|
return '```\n' + buf.join('\n') + '\n```';
|
||||||
|
|
||||||
// ┬/┴/┼ 포함 라인에서 컬럼 경계 위치 추출
|
// 각 데이터 행별로 자신의 │ 위치로 셀 추출 (행 간 컬럼 경계 불일치 대응)
|
||||||
var pat = null;
|
var allRows = [];
|
||||||
for (var i = 0; i < buf.length; i++) { if (/[┬┴┼]/.test(buf[i])) { pat = buf[i]; break; } }
|
|
||||||
if (!pat) return '```\n' + buf.join('\n') + '\n```';
|
|
||||||
|
|
||||||
var seps = [];
|
|
||||||
for (var i = 0; i < pat.length; i++) {
|
|
||||||
if ('┬┴┼┌└├┐┘┤'.indexOf(pat[i]) >= 0) seps.push(i);
|
|
||||||
}
|
|
||||||
if (seps.length < 2) return '```\n' + buf.join('\n') + '\n```';
|
|
||||||
|
|
||||||
var numCols = seps.length - 1;
|
|
||||||
|
|
||||||
// raw data rows 추출 후 각 셀 trim + 여분 줄(≤1개 셀만 내용있음)을 윗줄에 병합
|
|
||||||
var raw = [];
|
|
||||||
for (var i = 0; i < buf.length; i++) {
|
for (var i = 0; i < buf.length; i++) {
|
||||||
if (!/^[ \t]*│/.test(buf[i])) continue;
|
if (!/^[ \t]*│/.test(buf[i])) continue;
|
||||||
|
var poses = [];
|
||||||
|
for (var j = 0; j < buf[i].length; j++) {
|
||||||
|
if (buf[i][j] === '│') poses.push(j);
|
||||||
|
}
|
||||||
|
if (poses.length < 2) continue;
|
||||||
var cells = [];
|
var cells = [];
|
||||||
for (var c = 0; c < numCols; c++) cells.push(buf[i].substring(seps[c] + 1, seps[c + 1]).trim());
|
for (var c = 0; c < poses.length - 1; c++)
|
||||||
raw.push(cells);
|
cells.push(buf[i].substring(poses[c] + 1, poses[c + 1]).trim());
|
||||||
|
allRows.push(cells);
|
||||||
}
|
}
|
||||||
if (raw.length === 0) return '```\n' + buf.join('\n') + '\n```';
|
if (allRows.length === 0) return '```\n' + buf.join('\n') + '\n```';
|
||||||
|
|
||||||
var merged = [raw[0]];
|
// 여분 줄 병합 (≤1 non-empty cell)
|
||||||
for (var r = 1; r < raw.length; r++) {
|
var merged = [allRows[0]];
|
||||||
|
for (var r = 1; r < allRows.length; r++) {
|
||||||
var nonEmpty = 0, lastNec = -1;
|
var nonEmpty = 0, lastNec = -1;
|
||||||
for (var c = 0; c < numCols; c++) { if (raw[r][c] !== '') { nonEmpty++; lastNec = c; } }
|
var numCols = allRows[r].length;
|
||||||
|
for (var c = 0; c < numCols; c++) { if (allRows[r][c] !== '') { nonEmpty++; lastNec = c; } }
|
||||||
if (nonEmpty <= 1) {
|
if (nonEmpty <= 1) {
|
||||||
// 여분 줄: 윗줄의 같은 칸에 이어붙임
|
|
||||||
if (lastNec >= 0 && merged[merged.length - 1][lastNec] !== '')
|
if (lastNec >= 0 && merged[merged.length - 1][lastNec] !== '')
|
||||||
merged[merged.length - 1][lastNec] += ' ' + raw[r][lastNec];
|
merged[merged.length - 1][lastNec] += ' ' + allRows[r][lastNec];
|
||||||
} else {
|
} else {
|
||||||
merged.push(raw[r]);
|
merged.push(allRows[r]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var result = [];
|
var result = [];
|
||||||
// header
|
|
||||||
var hdr = merged[0];
|
var hdr = merged[0];
|
||||||
result.push('| ' + hdr.join(' | ') + ' |');
|
result.push('| ' + hdr.join(' | ') + ' |');
|
||||||
result.push('|' + ' --- |'.repeat(numCols));
|
result.push('|' + ' --- |'.repeat(hdr.length));
|
||||||
// data
|
|
||||||
for (var r = 1; r < merged.length; r++) {
|
for (var r = 1; r < merged.length; r++) {
|
||||||
result.push('| ' + merged[r].join(' | ') + ' |');
|
result.push('| ' + merged[r].join(' | ') + ' |');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user