import fs from 'node:fs'; import path from 'node:path'; import crypto from 'node:crypto'; const b='work/trilium',src=b+'/phase3/doc_notes/en',out=b+'/phase8'; fs.mkdirSync(out,{recursive:true}); const hash=s=>crypto.createHash('sha256').update(s).digest('hex'); const files={},previous={},audit=[]; function save(rel,old,value){const dest=out+'/'+rel;fs.mkdirSync(path.dirname(dest),{recursive:true});fs.writeFileSync(dest,value);files[rel]=hash(value);previous[rel]=hash(old);} const en=JSON.parse(fs.readFileSync(b+'/scoped/translation.en.json')),ko=JSON.parse(fs.readFileSync(b+'/phase6/translation.json')); const glossary=new Map(); function walk(a,c){for(const[k,v]of Object.entries(a)){if(typeof v==='object'&&v)walk(v,c?.[k]||{});else if(typeof v==='string'&&typeof c?.[k]==='string'&&/^[A-Za-z][A-Za-z /-]{2,48}$/.test(v)&&/[๊ฐ€-ํžฃ]/.test(c[k])&&!/[<>{}]/.test(c[k]))glossary.set(v,c[k]);}} walk(en,ko); const dashboardMap={ '๐Ÿ  Trilium Overview':'๐Ÿ  Trilium ๊ฐœ์š”','Current Trilium version and build information':'ํ˜„์žฌ Trilium ๋ฒ„์ „๊ณผ ๋นŒ๋“œ ์ •๋ณด','๐Ÿ“‹ Instance Information':'๐Ÿ“‹ ์‹คํ–‰ ํ™˜๊ฒฝ ์ •๋ณด','Database file size in human-readable format':'์ฝ๊ธฐ ์‰ฌ์šด ๋‹จ์œ„๋กœ ํ‘œ์‹œํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ ํฌ๊ธฐ','๐Ÿ’พ Database Size':'๐Ÿ’พ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํฌ๊ธฐ','Total active notes in your Trilium instance':'ํ˜„์žฌ Trilium์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ์ „์ฒด ๋…ธํŠธ ์ˆ˜','๐Ÿ“ Active Notes':'๐Ÿ“ ์‚ฌ์šฉ ์ค‘์ธ ๋…ธํŠธ','๐Ÿ“Š Key Metrics':'๐Ÿ“Š ์ฃผ์š” ์ง€ํ‘œ','Total notes including deleted ones':'์‚ญ์ œ๋œ ๋…ธํŠธ๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ๋…ธํŠธ ์ˆ˜','Active Notes':'์‚ฌ์šฉ ์ค‘์ธ ๋…ธํŠธ','Deleted Notes':'์‚ญ์ œ๋œ ๋…ธํŠธ','Protected Notes':'๋ณดํ˜ธ๋œ ๋…ธํŠธ','๐Ÿ“ Notes Distribution':'๐Ÿ“ ๋…ธํŠธ ๋ถ„ํฌ','Breakdown of attachments by MIME type':'MIME ์œ ํ˜•๋ณ„ ์ฒจ๋ถ€ ํŒŒ์ผ ๋ถ„ํฌ','๐Ÿ–ผ๏ธ Attachments by Type':'๐Ÿ–ผ๏ธ ์œ ํ˜•๋ณ„ ์ฒจ๋ถ€ ํŒŒ์ผ','Distribution of notes by their content type':'๋‚ด์šฉ ์œ ํ˜•๋ณ„ ๋…ธํŠธ ๋ถ„ํฌ','๐Ÿ“„ Notes by Content Type':'๐Ÿ“„ ๋‚ด์šฉ ์œ ํ˜•๋ณ„ ๋…ธํŠธ','๐Ÿ“ˆ Trends & Time Series':'๐Ÿ“ˆ ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ๋ณ€ํ™”','Growth of notes over time':'์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ๋…ธํŠธ ์ˆ˜ ๋ณ€ํ™”','Total Notes':'์ „์ฒด ๋…ธํŠธ','๐Ÿ“ˆ Notes Growth Over Time':'๐Ÿ“ˆ ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ๋…ธํŠธ ์ˆ˜ ๋ณ€ํ™”','Attachment storage trends':'์ฒจ๋ถ€ ํŒŒ์ผ ์ €์žฅ๋Ÿ‰ ๋ณ€ํ™”','Active Attachments':'์‚ฌ์šฉ ์ค‘์ธ ์ฒจ๋ถ€ ํŒŒ์ผ','Total Attachments':'์ „์ฒด ์ฒจ๋ถ€ ํŒŒ์ผ','๐Ÿ“Ž Attachments Growth Over Time':'๐Ÿ“Ž ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ์ฒจ๋ถ€ ํŒŒ์ผ ์ˆ˜ ๋ณ€ํ™”','๐Ÿ”ง Advanced Metrics':'๐Ÿ”ง ๊ณ ๊ธ‰ ์ง€ํ‘œ','Number of branches connecting notes':'๋…ธํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ€์ง€ ์ˆ˜','๐ŸŒณ Total Branches':'๐ŸŒณ ์ „์ฒด ๊ฐ€์ง€','Number of note attributes':'๋…ธํŠธ ์†์„ฑ ์ˆ˜','๐Ÿท๏ธ Attributes':'๐Ÿท๏ธ ์†์„ฑ','Number of note revisions':'๋…ธํŠธ ์ˆ˜์ • ์ด๋ ฅ ์ˆ˜','๐Ÿ”„ Revisions':'๐Ÿ”„ ์ˆ˜์ • ์ด๋ ฅ','Number of ETAPI tokens':'ETAPI ํ† ํฐ ์ˆ˜','๐Ÿ”‘ API Tokens':'๐Ÿ”‘ API ํ† ํฐ','Various storage and system metrics':'์ €์žฅ ๊ณต๊ฐ„๊ณผ ์‹œ์Šคํ…œ์˜ ์ฃผ์š” ์ง€ํ‘œ','Blob Records':'๋ณธ๋ฌธ ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ','Recent Notes':'์ตœ๊ทผ ๋…ธํŠธ','Embeddings':'์ž„๋ฒ ๋”ฉ','Embedding Providers':'์ž„๋ฒ ๋”ฉ ์ œ๊ณต์ž','๐Ÿ“Š Storage & System Metrics':'๐Ÿ“Š ์ €์žฅ ๊ณต๊ฐ„๊ณผ ์‹œ์Šคํ…œ ์ง€ํ‘œ','Timeline showing when content was created and last modified':'์ฝ˜ํ…์ธ  ์ƒ์„ฑ ์‹œ๊ฐ๊ณผ ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ','Oldest Note':'๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋…ธํŠธ','Newest Note':'๊ฐ€์žฅ ์ตœ๊ทผ ๋…ธํŠธ','Last Modified':'๋งˆ์ง€๋ง‰ ์ˆ˜์ •','โฐ Content Timeline':'โฐ ์ฝ˜ํ…์ธ  ์ƒ์„ฑ ๋ฐ ์ˆ˜์ • ์‹œ๊ฐ','TriliumNext Dashboard':'TriliumNext ๋Œ€์‹œ๋ณด๋“œ','Build Date':'๋นŒ๋“œ ๋‚ ์งœ','Git Revision':'Git ์ปค๋ฐ‹','Sync Version':'๋™๊ธฐํ™” ๋ฒ„์ „','DB Version':'๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „','Version':'๋ฒ„์ „','Datasource':'๋ฐ์ดํ„ฐ ์†Œ์Šค','Instance':'์‹คํ–‰ ํ™˜๊ฒฝ','Job':'์ž‘์—…'}; for(const[k,v]of Object.entries(dashboardMap))glossary.set(k.replace(/^\P{L}+/u,''),v.replace(/^\P{L}+/u,'')); const ocr=JSON.parse(fs.readFileSync(b+'/help-image-ocr.json','utf8').replace(/^\uFEFF/,'')); const byFile=new Map(ocr.filter(x=>x.latinWords>0).map(x=>[x.file,x])); const esc=s=>s.replaceAll('&','&').replaceAll('<','<').replaceAll('>','>').replaceAll('"','"'); const used=new Set(); const explanations={ 'ํ‘œ์‹œ์ ์˜ ์•„์ด์ฝ˜๊ณผ ์ƒ‰์ƒ':'์ง€๋„ ์œ„ ํ‘œ์‹œ์ ์€ ์—ฐ๊ฒฐ๋œ ๋…ธํŠธ์˜ ์•„์ด์ฝ˜๊ณผ ์ƒ‰์ƒ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ํ‘œ์‹œ์ ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๋…ธํŠธ๋ฅผ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.', 'GPX ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ':'GPX๋Š” ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•˜๋Š” ํŒŒ์ผ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ํŒŒ์ผ์„ ์ง€๋„ ๋…ธํŠธ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.', '์ง€๋„์— ํ‘œ์‹œ๋œ ๊ฒฝ๋กœ':'๊ฐ€์ ธ์˜จ ๊ฒฝ๋กœ๊ฐ€ ์ง€๋„ ์œ„์˜ ์„ ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ง€๋„ ์ง€๋ช…๊ณผ ๊ฒฝ๋กœ ์ด๋ฆ„์€ ์˜ˆ์ œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.', '๋ฌธ๋‹จ ๋„๊ตฌ ๋ชจ์Œ':'๋ฌธ๋‹จ ๋„๊ตฌ ๋ชจ์Œ์—์„œ ์ œ๋ชฉ ๋‹จ๊ณ„์™€ ๋ชฉ๋ก ๋ฐ ์ •๋ ฌ ๋ฐฉ์‹์„ ๊ณ ๋ฆ…๋‹ˆ๋‹ค. ์•„์ด์ฝ˜ ์œ„์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๊ธฐ๋Šฅ ์ด๋ฆ„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.', '๊ธ€์ž ๋„๊ตฌ ๋ชจ์Œ':'์„ ํƒํ•œ ๊ธ€์ž์— ๊ตต๊ฒŒ์™€ ๊ธฐ์šธ์ž„ ๋ฐ ๋ฐ‘์ค„ ๊ฐ™์€ ์„œ์‹์„ ์ ์šฉํ•˜๋Š” ๋„๊ตฌ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.', 'ํ…Œ๋งˆ ๋ณด๊ด€์šฉ ๋…ธํŠธ':'์‚ฌ์šฉ์ž ์ง€์ • ํ…Œ๋งˆ ์ฝ”๋“œ๋ฅผ ๋ณด๊ด€ํ•  ๋…ธํŠธ์ž…๋‹ˆ๋‹ค. ๋…ธํŠธ ์ œ๋ชฉ๊ณผ CSS ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ์ž…๋ ฅํ•˜์„ธ์š”.', 'ํƒญ์— ํ‘œ์‹œ๋œ ์ž‘์—… ๊ณต๊ฐ„':'ํ˜„์žฌ ์ž‘์—… ๊ณต๊ฐ„์˜ ์ด๋ฆ„์ด ํƒญ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ž‘์—… ๊ณต๊ฐ„์„ ๋ฐ”๊พธ๋ฉด ํ•ด๋‹น ๊ณต๊ฐ„์— ์ €์žฅ๋œ ํƒญ ๊ตฌ์„ฑ์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.', '์‹คํ–‰ ๋„๊ตฌ ๋ชจ์Œ ์„ค์ •':'์‹คํ–‰ ๋„๊ตฌ ๋ชจ์Œ์— ํ‘œ์‹œํ•  ํ•ญ๋ชฉ์„ ์„ค์ •ํ•˜๋Š” ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. ๊ฐ ์‹คํ–‰ ๋„๊ตฌ๊ฐ€ ์–ด๋–ค ๋…ธํŠธ๋‚˜ ๊ธฐ๋Šฅ์„ ์—ฌ๋Š”์ง€ ๋ณธ๋ฌธ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ ํ™•์ธํ•˜์„ธ์š”.', '์•ˆ๋‚ด ์ƒ์ž ๋ฉ”๋‰ด':'์ผ๋ฐ˜ ์ธ์šฉ๋ฌธ๊ณผ ์ฃผ์˜ ์‚ฌํ•ญ ๋“ฑ์˜ ์•ˆ๋‚ด ์ƒ์ž ๋ชจ์–‘์„ ๊ณ ๋ฅด๋Š” ๋ฉ”๋‰ด์ž…๋‹ˆ๋‹ค.', 'JavaScript ๊ตฌ๋ฌธ ๊ฐ•์กฐ๋ฅผ ์ ์šฉํ•œ ์ฝ”๋“œ ๋ธ”๋ก':'์ฝ”๋“œ ์–ธ์–ด๋ฅผ JavaScript๋กœ ์ง€์ •ํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ƒ‰์œผ๋กœ ๊ตฌ๋ถ„๋œ ์˜๋ฌธ์€ ์‹คํ–‰ํ•  ์ฝ”๋“œ์ด๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.', '๊ฐ์ฃผ ์˜ˆ์‹œ':'๋ณธ๋ฌธ์˜ ์ž‘์€ ๊ฐ์ฃผ ๋ฒˆํ˜ธ์™€ ์•„๋ž˜์ชฝ ๊ฐ์ฃผ ๋‚ด์šฉ์ด ์—ฐ๊ฒฐ๋œ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฌธ ๋Œ€์‹  ์›ํ•˜๋Š” ์„ค๋ช…์„ ์ž…๋ ฅํ•˜์„ธ์š”.', '๊ธ€์ž ์„œ์‹ ํŒ์—…':'๊ธ€์ž๋ฅผ ์„ ํƒํ•˜๋ฉด ๋‚˜ํƒ€๋‚˜๋Š” ์„œ์‹ ๋ฉ”๋‰ด์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ์•„์ด์ฝ˜์„ ๋ˆŒ๋Ÿฌ ์„ ํƒํ•œ ๋ถ€๋ถ„์˜ ์„œ์‹์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.', '์ƒ‰์ƒ ์„ ํƒ':'๊ธ€์ž์ƒ‰์ด๋‚˜ ๋ฐฐ๊ฒฝ์ƒ‰์„ ๊ณ ๋ฅด๋Š” ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. ์ƒ‰์ƒ ๊ฒฌ๋ณธ์—์„œ ์›ํ•˜๋Š” ์ƒ‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.', '์ด๋ชจ์ง€ ์„ ํƒ๊ธฐ':'๋ณธ๋ฌธ์— ๋„ฃ์„ ์ด๋ชจ์ง€๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์„ ํƒํ•˜๋Š” ์ฐฝ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์•ฑ์˜ ์ด๋ชจ์ง€ ์ด๋ฆ„์€ ํ•œ๊ตญ์–ด๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.', '์ด๋ชจ์ง€ ์ž๋™ ์™„์„ฑ':'์ด๋ชจ์ง€ ์ด๋ฆ„์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ํ‘œ์‹œ๋˜๋Š” ํ›„๋ณด ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ํ›„๋ณด๋ฅผ ์„ ํƒํ•˜๋ฉด ๋ณธ๋ฌธ์— ์ด๋ชจ์ง€๊ฐ€ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.', '๋ณธ๋ฌธ ์•ˆ์˜ Mermaid ๋„ํ‘œ':'Mermaid ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•œ ๋„ํ‘œ๋ฅผ ๋ณธ๋ฌธ ์•ˆ์— ํ‘œ์‹œํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ๋„ํ‘œ์˜ ๊ธ€์ž๋Š” ์ฝ”๋“œ์— ์ž…๋ ฅํ•œ ๋‚ด์šฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.', '๊ฐ€๋กœ ๊ตฌ๋ถ„์„ ':'๋ฌธ๋‹จ ์‚ฌ์ด์— ๊ฐ€๋กœ์„ ์„ ๋„ฃ์–ด ๋‚ด์šฉ์„ ๊ตฌ๋ถ„ํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.', 'ํŽ˜์ด์ง€ ๋‚˜๋ˆ„๊ธฐ ํ‘œ์‹œ':'์ธ์‡„ํ•  ๋•Œ ์ƒˆ ํŽ˜์ด์ง€๋ฅผ ์‹œ์ž‘ํ•  ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.', '์ˆ˜์‹ ์ž…๋ ฅ ์ฐฝ':'์ˆ˜์‹ ์›๋ฌธ์„ ์ž…๋ ฅํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋Š” ์ฐฝ์ž…๋‹ˆ๋‹ค. ์ˆ˜ํ•™ ๊ธฐํ˜ธ์™€ LaTeX ๋ช…๋ น์€ ๋ฒˆ์—ญํ•˜์ง€ ์•Š๊ณ  ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.', '๋“ค์—ฌ์“ฐ๊ธฐ ์˜ˆ์‹œ':'๋ฌธ๋‹จ์˜ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ์•ˆ์ชฝ์œผ๋กœ ์˜ฎ๊ธด ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. ๋“ค์—ฌ์“ฐ๊ธฐ ๋Š˜๋ฆฌ๊ธฐ์™€ ์ค„์ด๊ธฐ๋กœ ๊นŠ์ด๋ฅผ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.', 'Ollama ์ •์ƒ ์‹คํ–‰ ์‘๋‹ต':'Ollama ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ž„์„ ์•Œ๋ฆฌ๋Š” ์‘๋‹ต์ž…๋‹ˆ๋‹ค. ์ด ์‘๋‹ต์ด ๋ณด์ด๋ฉด ๋ณธ๋ฌธ์— ์•ˆ๋‚ด๋œ ์ฃผ์†Œ๋ฅผ ์—ฐ๊ฒฐ ์„ค์ •์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.', '์—ฌ๋Ÿฌ ๋‚ ์งœ๋ฅผ ์„ ํƒํ•ด ์ผ์ • ๋งŒ๋“ค๊ธฐ':'๋‹ฌ๋ ฅ์—์„œ ๋‚ ์งœ ๋ฒ”์œ„๋ฅผ ์„ ํƒํ•ด ์—ฌ๋Ÿฌ ๋‚ ์— ๊ฑธ์นœ ์ผ์ •์„ ๋งŒ๋“œ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.', '์ผ์ •์— ์†์„ฑ ํ‘œ์‹œ':'๋‹ฌ๋ ฅ์˜ ์ผ์ •์— ๋…ธํŠธ ์†์„ฑ ๊ฐ’์„ ํ•จ๊ป˜ ํ‘œ์‹œํ•œ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์†์„ฑ ์ด๋ฆ„๊ณผ ๊ฐ’์„ ๋ณธ๋ฌธ ์„ค์ •๊ณผ ๋น„๊ตํ•˜์„ธ์š”.', '์—ฌ๋Ÿฌ ๋…ธํŠธ ์„ ํƒ':'๋…ธํŠธ ํŠธ๋ฆฌ์—์„œ ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์ด ๋™์‹œ์— ์„ ํƒ๋œ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. ์„ ํƒํ•œ ๋…ธํŠธ๋“ค์— ๊ฐ™์€ ์ž‘์—…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.', '์ฝ”๋“œ ๋ธ”๋ก ์˜ˆ์‹œ':'์ฝ”๋“œ ๋ธ”๋ก์— ์ž…๋ ฅํ•œ ํ”„๋กœ๊ทธ๋žจ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์˜๋ฌธ ๋ช…๋ น๊ณผ ๊ธฐํ˜ธ๋Š” ํ”„๋กœ๊ทธ๋žจ ๋ฌธ๋ฒ•์ด๋ฏ€๋กœ ์›๋ž˜ ํ‘œ๊ธฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.' }; for(const rel0 of fs.readdirSync(src,{recursive:true}).filter(p=>p.endsWith('.html'))){ const rel=rel0.replaceAll('\\','/'),old=fs.readFileSync(src+'/'+rel,'utf8');let idx=0; const annotations=[]; const html=old.replace(/]*>/gi,tag=>{ idx++;const url=tag.match(/\bsrc="([^"]+)"/i)?.[1];if(!url)return tag; let img;try{img=path.posix.normalize(path.posix.join(path.posix.dirname(rel),decodeURIComponent(url.replaceAll('&','&'))));}catch{return tag;} const record=byFile.get(img);if(!record)return tag; used.add(img); const alt=tag.match(/\balt="([^"]*)"/i)?.[1]||''; const pairs=[...glossary].filter(([k])=>new RegExp('(?:^|[^a-z])'+k.replace(/[.*+?^${}()|[\]\\]/g,'\\$&')+'(?:$|[^a-z])','i').test(record.text)).sort((a,c)=>c[0].length-a[0].length).filter((entry,i,all)=>!all.slice(0,i).some(([k])=>k.toLowerCase().includes(entry[0].toLowerCase()))).slice(0,12); annotations.push({image:img,number:idx,description:alt,pairs}); return tag; }); if(!annotations.length)continue; let appendix='

์˜ˆ์ „ ํ™”๋ฉด ์ด๋ฏธ์ง€ ์ฝ๋Š” ๋ฒ•

์•„๋ž˜ ์„ค๋ช…์€ ๋ณธ๋ฌธ์— ๋‚˜์˜จ ์ด๋ฏธ์ง€ ์ˆœ์„œ์— ๋งž์ท„์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋Š” ์›๋ณธ์„ ์œ ์ง€ํ–ˆ์œผ๋ฏ€๋กœ ์˜๋ฌธ ๋ฉ”๋‰ด๊ฐ€ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์•ฑ์—์„œ๋Š” ํ•œ๊ตญ์–ด ๋ฉ”๋‰ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ์™€ ์ฃผ์†Œ ๋ฐ ์ œํ’ˆ ์ด๋ฆ„์€ ์›๋ž˜ ํ‘œ๊ธฐ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

'; for(const a of annotations){appendix+=`

์ด๋ฏธ์ง€ ${a.number}${/[๊ฐ€-ํžฃ]/.test(a.description)?' ยท '+a.description:''}

`;if(a.pairs.length)appendix+='

ํ™”๋ฉด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ํ‘œํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

';else {if(!explanations[a.description])throw Error('Missing image explanation '+a.image);appendix+='

'+esc(explanations[a.description])+'

';}} appendix+='
'; const updated=/<\/body>/i.test(html)?html.replace(/<\/body>/i,appendix+''):html+'\n'+appendix+'\n'; const links=s=>[...s.matchAll(/\b(?:href|src)="[^"]*"/g)].map(x=>x[0]).sort(); if(JSON.stringify(links(old))!==JSON.stringify(links(updated)))throw Error('Link changed '+rel); save('doc_notes/en/'+rel,old,updated);audit.push({file:rel,images:annotations}); } const dashboard='User Guide/User Guide/Advanced Usage/Metrics/grafana-dashboard.json'; const oldDashboard=fs.readFileSync(src+'/'+dashboard,'utf8');let replaced=0; const translated=JSON.parse(oldDashboard,(key,v)=>typeof v==='string'&&Object.hasOwn(dashboardMap,v)?(replaced++,dashboardMap[v]):v); save('doc_notes/en/'+dashboard,oldDashboard,JSON.stringify(translated,null,2)+'\n'); const oldMain=fs.readFileSync(b+'/phase7/main.cjs','utf8'); const next=oldMain.replace('jg=`assets/v${CR.version}-ko-20260913-r6`','jg=`assets/v${CR.version}-ko-20260913-r7`');if(oldMain===next)throw Error('Cache marker missing');save('main.cjs',oldMain,next); const report={htmlPages:audit.length,referencedImages:used.size,detectedImages:byFile.size,unreferenced:[...byFile.keys()].filter(k=>!used.has(k)),dashboardStrings:replaced,images:audit}; fs.writeFileSync(out+'/image-guide-audit.json',JSON.stringify(report,null,2));fs.writeFileSync(out+'/manifest.json',JSON.stringify({files,previous},null,2)); console.log({...report,images:undefined});