From 7dbeb36218084eb39d803287b5702e484a2eb7dc Mon Sep 17 00:00:00 2001 From: windpacer Date: Sun, 24 May 2026 13:20:33 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20box-drawing=20GFM=20=EB=B3=80=ED=99=98?= =?UTF-8?q?=20=E2=80=94=20=ED=96=89=EB=B3=84=20=EC=9E=90=EC=B2=B4=20?= =?UTF-8?q?=E2=94=82=20=EC=9C=84=EC=B9=98=20=EC=82=AC=EC=9A=A9=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=BB=AC=EB=9F=BC=20=EA=B2=BD=EA=B3=84=20=EB=B6=88?= =?UTF-8?q?=EC=9D=BC=EC=B9=98=20=EB=8C=80=EC=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Web/wwwroot/js/docs.js | 46 ++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/src/Web/wwwroot/js/docs.js b/src/Web/wwwroot/js/docs.js index f5e4dbb..a0f7107 100644 --- a/src/Web/wwwroot/js/docs.js +++ b/src/Web/wwwroot/js/docs.js @@ -360,48 +360,40 @@ function docsBoxBlockToGfm(buf) { if (!/[┬┴┼]/.test(joined) || !/│/.test(joined)) return '```\n' + buf.join('\n') + '\n```'; - // ┬/┴/┼ 포함 라인에서 컬럼 경계 위치 추출 - var pat = null; - 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 = []; + // 각 데이터 행별로 자신의 │ 위치로 셀 추출 (행 간 컬럼 경계 불일치 대응) + var allRows = []; for (var i = 0; i < buf.length; i++) { 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 = []; - for (var c = 0; c < numCols; c++) cells.push(buf[i].substring(seps[c] + 1, seps[c + 1]).trim()); - raw.push(cells); + for (var c = 0; c < poses.length - 1; c++) + 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]]; - for (var r = 1; r < raw.length; r++) { + // 여분 줄 병합 (≤1 non-empty cell) + var merged = [allRows[0]]; + for (var r = 1; r < allRows.length; r++) { 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 (lastNec >= 0 && merged[merged.length - 1][lastNec] !== '') - merged[merged.length - 1][lastNec] += ' ' + raw[r][lastNec]; + merged[merged.length - 1][lastNec] += ' ' + allRows[r][lastNec]; } else { - merged.push(raw[r]); + merged.push(allRows[r]); } } var result = []; - // header var hdr = merged[0]; result.push('| ' + hdr.join(' | ') + ' |'); - result.push('|' + ' --- |'.repeat(numCols)); - // data + result.push('|' + ' --- |'.repeat(hdr.length)); for (var r = 1; r < merged.length; r++) { result.push('| ' + merged[r].join(' | ') + ' |'); }