diff --git a/web-ui/html/workshop-app.html b/web-ui/html/workshop-app.html
index 7ea65cd..0353b05 100644
--- a/web-ui/html/workshop-app.html
+++ b/web-ui/html/workshop-app.html
@@ -1337,13 +1337,27 @@ function renderMd(text){
const items=grp.split('\n').map(line=>'
'+line.replace(/^[-*]\s+/,'')+'').join('');
return lead+'';
});
+ // 표 — 연속하는 파이프 라인(구분행 |---| 포함)을 로. 표 지원이 없어 파이프 문자열이
+ // 평문으로 뭉개져 한 줄에 다 붙어 보였다(09-24 실측: 카메라 모듈 스펙 표가 그대로 복사됨).
+ // 구분행이 없으면 표가 아니라고 보고 그대로 둔다.
+ s=s.replace(/(?:\|.*\n?)+/g, grp=>{
+ const lines=grp.replace(/\n$/,'').split('\n').filter(l=>l.trim());
+ if(lines.length<2 || !/^\|[\s:|-]+$/.test(lines[1])) return grp;
+ const mkRow=(line,tag)=>{
+ const cs=line.replace(/^\s*\||\|\s*$/g,'').split('|')
+ .map(c=>'<'+tag+' style="border:1px solid var(--rb-border,#d5d0c8);padding:2px 8px;text-align:left;font-weight:'+(tag==='th'?'600':'400')+'">'+c.trim()+''+tag+'>').join('');
+ return ''+cs+'
';
+ };
+ return ''
+ +mkRow(lines[0],'th')+lines.slice(2).map(l=>mkRow(l,'td')).join('')+'
';
+ });
// 단락 — 빈 줄 단위로 split. 이미 블록 태그(//코드 자리표시자)로 시작하면
// 로 감싸지 않는다.
s=s.split(/\n{2,}/).map(chunk=>{
const t=chunk.trim();
if(!t)return '';
if(/^\u0000B\d+\u0000$/.test(t))return t;
- if(/^<(h3|ul|pre)\b/.test(t))return t;
+ if(/^<(h3|ul|pre|table)\b/.test(t))return t;
return '
'+t+'
';
}).join('');
s=s.replace(/\u0000B(\d+)\u0000/g,(m,i)=>blocks[+i]||'');