aboutsummaryrefslogtreecommitdiff
path: root/generator/postrenderer.js
diff options
context:
space:
mode:
Diffstat (limited to 'generator/postrenderer.js')
-rw-r--r--generator/postrenderer.js76
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;
}