import fs from 'node:fs'; import path from 'node:path'; import one from './docs-ko-001.mjs'; import two from './docs-ko-002.mjs'; import three from './docs-ko-003.mjs'; import four from './docs-ko-004.mjs'; import five from './docs-ko-005.mjs'; import six from './docs-ko-006.mjs'; import seven from './docs-ko-007.mjs'; import eight from './docs-ko-008.mjs'; import nine from './docs-ko-009.mjs'; const translations={...one,...two,...three,...four,...five,...six,...seven,...eight,...nine}; const order=JSON.parse(fs.readFileSync('work/trilium/docs-order.json','utf8')); const base='work/trilium/scoped/doc_notes/en',out='work/trilium/release/doc_notes/en'; const errors=[]; const escape=s=>s.replaceAll('&','&').replaceAll('"','"').replaceAll('<','<'); const assets=s=>[...s.matchAll(/\b(?:href|src)\s*=\s*["']([^"']+)["']/g)].map(m=>m[1]).sort(); for(const [key,render]of Object.entries(translations)){ const original=fs.readFileSync(base+'/'+order[key],'utf8'); const anchors=[...original.matchAll(/]*?)>([\s\S]*?)<\/a>/g)]; const images=[...original.matchAll(/]*>/g)]; const pres=[...original.matchAll(/]*>[\s\S]*?<\/pre>/g)]; const translated=render({ a:(i,label)=>{if(!anchors[i])throw Error('Missing anchor '+key+':'+i);return ''+label+'';}, img:(i,alt)=>{if(!images[i])throw Error('Missing image '+key+':'+i);return images[i][0].replace(/\s+alt\s*=\s*(?:"[^"]*"|'[^']*')/g,'').replace(/\s*\/?\s*>$/,' alt="'+escape(alt)+'">');}, pre:i=>{if(!pres[i])throw Error('Missing code '+key+':'+i);return pres[i][0];} }); if(JSON.stringify(assets(original))!==JSON.stringify(assets(translated)))errors.push({index:Number(key),path:order[key],reason:'Links or image references changed',original:assets(original),translated:assets(translated)}); const dest=out+'/'+order[key];fs.mkdirSync(path.dirname(dest),{recursive:true});fs.writeFileSync(dest,translated+'\n'); } fs.writeFileSync('work/trilium/docs-validation.json',JSON.stringify({translated:Object.keys(translations).length,total:order.length,errors},null,2)); console.log(JSON.stringify({translated:Object.keys(translations).length,total:order.length,errors},null,2)); if(errors.length)process.exitCode=1;