diff options
Diffstat (limited to 'generator/postrenderer.js')
-rw-r--r-- | generator/postrenderer.js | 76 |
1 files changed, 56 insertions, 20 deletions
diff --git a/generator/postrenderer.js b/generator/postrenderer.js index f3cf46b..80991a0 100644 --- a/generator/postrenderer.js +++ b/generator/postrenderer.js @@ -22,10 +22,20 @@ let tmplcont=''; let tocid; let headerlist; +function texts(n) +{ + if (typeof n.wholeText == 'string') + return n.wholeText; + let ret = ''; + for (let c of n.childNodes) + ret += texts(c); + return ret; +} + function _dfs(doc,el,le,p) { var e=doc.createElement('li'); - e.innerHTML=`<a class="toctarg" href="#tocanch${tocid}">${el.innerHTML}</a>`; + e.innerHTML=`<a class="toctarg" href="#tocanch${tocid}">${texts(el)}</a>`; le.appendChild(e); el.id='tocanch'+(tocid++); el.classList.add('tvis'); @@ -86,10 +96,10 @@ function gen_thumb(doc,el) if(w<=0)w=h; else if(h<=0)h=w; } - const dstfn=`ssbsthumb_${p>0?'s'+p.toFixed(2):w+'x'+h}_${srcfn}` + const dstfn=(p>0||w>0||h>0)?`ssbsthumb_${p>0?'s'+p.toFixed(2):w+'x'+h}_${srcfn}`:srcfn; const srcf=path.join(THUMB_LOCAL_DIR,srcfn); const dstf=path.join(THUMB_LOCAL_DIR,dstfn); - if(!util.mtime_cmp(srcf,dstf)) + if(dstfn!=srcfn&&!util.mtime_cmp(srcf,dstf)) { const m=spawn('magick',[srcf,'-resize',p>0?(p*100).toFixed()+'%':w+'x'+h,dstf]); m.stdout.on('data',(d)=>{console.log(`IMout:${d}`);}); @@ -110,11 +120,8 @@ async function encrypt(doc) const contu8=aes.utils.utf8.toBytes(i.innerHTML); const conths=sha256.hash(aes.utils.hex.fromBytes(contu8),{msgFormat:'hex-bytes'}); const keyu8=aes.utils.utf8.toBytes(key); - const saltu8=aes.utils.utf8.toBytes('hellwhymustiaddsalttothiscrap'); - const enckey=await new Promise( - (resolv,rej)=> - {scrypt(keyu8,saltu8,1024,16,2,32,(e,p,k)=>{e?rej(e):k?resolv(k):undefined;});} - ); + const saltu8=aes.utils.utf8.toBytes('mmmdeliciousthermalpasteletmeconsumeallofit'); + const enckey=scrypt.syncScrypt(keyu8, saltu8, 1024, 16, 2, 32); const ctr=new aes.ModeOfOperation.ctr(enckey); const enccont=ctr.encrypt(contu8); let encconts='';for(let i=0;i<enccont.length;++i)encconts+=String.fromCharCode(enccont[i]); @@ -133,6 +140,14 @@ function _set_template(tmplf) template_file=tmplf; tmplcont=fs.readFileSync(template_file,'utf8'); } +function _style_to_header(doc) +{ + const head = doc.querySelector('head'); + const body = doc.querySelector('body'); + const styles = body.querySelectorAll('style'); + for (let s of styles) + head.appendChild(s); +} async function _render(inf,outf,np,pp) { const postcont=fs.readFileSync(inf,'utf8'); @@ -142,6 +157,12 @@ async function _render(inf,outf,np,pp) const contsplit=cont.split('\n'); const meta=contsplit.splice(0,4); const preproc=meta[3].trim(); + let unlisted = false; + if (meta[1].indexOf('UNLISTED') != -1) + { + unlisted = true; + meta[1] = meta[1].substr(0, meta[1].indexOf('UNLISTED')); + } trd.getElementById('title').innerHTML= trd.getElementById('titleh').innerHTML=meta[0].trim(); trd.getElementById('datetags').innerHTML=`${meta[1].trim()}<br>#${meta[2].split(',').join(' #')}`; @@ -149,23 +170,28 @@ async function _render(inf,outf,np,pp) { const ppargs=preproc.split(' '); const ppcmd=ppargs.splice(0,1); - const pp=spawn(ppcmd[0],ppargs,{maxBuffer:1048576}); + const pp=spawn(ppcmd[0],ppargs,{maxBuffer:1048576, stdio:['pipe', 'pipe', 'inherit']}); let out=''; pp.stdout.setEncoding('utf8'); pp.stdout.on('data',(d)=>{out+=d;}); pp.stdin.write(contsplit.join('\n'),'utf8'); - const ppp=new Promise( - (resolv,rej)=> + const ppp = new Promise( + (resolv, rej)=> { - pp.on('close',(r)=>{if(r)rej(r);resolv(out);}); + pp.on('error', (e) => rej(e)); + pp.on('close',(r) => { if(r) rej(r); resolv(out); }); } ); pp.stdin.end(); - trd.getElementById('article').innerHTML=await ppp; + try { + trd.getElementById('article').innerHTML = await ppp; + } catch (e) { + console.log(`failed to render ${inf} : ${e}`); + } } else trd.getElementById('article').innerHTML=contsplit.join('\n'); - + //async images trd.getElementById('article').querySelectorAll('img').forEach( (i)=>{if(!i.getAttribute('decoding'))i.setAttribute('decoding','async');} @@ -186,7 +212,7 @@ async function _render(inf,outf,np,pp) const tocroot=trd.getElementById('tocroot'); for(let i=0;i<headerlist.length;)i=_dfs(trd,headerlist[i],tocroot,i); if(!tocroot.children.length)trd.getElementById('tocouter').style.display='none'; - + //Footnotes footnoter(trd); @@ -198,11 +224,21 @@ async function _render(inf,outf,np,pp) l.innerHTML=`<a href="/blog/list/${tgs[i]}/">${tgs[i]}</a>`; trd.getElementById('tagslist').appendChild(l); } - + + _style_to_header(trd); + //neighboring posts - if(pp)trd.getElementById('prevp').href=`${pp}.html`; - if(np)trd.getElementById('nextp').href=`${np}.html`; - - fs.writeFileSync(outf,trd.documentElement.outerHTML,'utf8'); + if (unlisted) + { + trd.getElementById('prevp').parentNode.remove(); + trd.getElementById('nextp').parentNode.remove(); + } + else + { + if(pp)trd.getElementById('prevp').href=`${pp}.html`; + if(np)trd.getElementById('nextp').href=`${np}.html`; + } + + fs.writeFileSync(outf,"<!DOCTYPE html>"+trd.documentElement.outerHTML,'utf8'); return outf; } |