Spaces:
Sleeping
Sleeping
const _ = require('lodash'); | |
const dedent = require('dedent-tabs').default; | |
const getTOC = (pages)=>{ | |
const add1 = (title, page)=>{ | |
res.push({ | |
title : title, | |
page : page + 1, | |
children : [] | |
}); | |
}; | |
const add2 = (title, page)=>{ | |
if(!_.last(res)) add1(null, page); | |
_.last(res).children.push({ | |
title : title, | |
page : page + 1, | |
children : [] | |
}); | |
}; | |
const add3 = (title, page)=>{ | |
if(!_.last(res)) add1(null, page); | |
if(!_.last(_.last(res).children)) add2(null, page); | |
_.last(_.last(res).children).children.push({ | |
title : title, | |
page : page + 1, | |
children : [] | |
}); | |
}; | |
const res = []; | |
_.each(pages, (page, pageNum)=>{ | |
if(!page.includes("{{frontCover}}") && !page.includes("{{insideCover}}") && !page.includes("{{partCover}}") && !page.includes("{{backCover}}")) { | |
const lines = page.split('\n'); | |
_.each(lines, (line)=>{ | |
if(_.startsWith(line, '# ')){ | |
const title = line.replace('# ', ''); | |
add1(title, pageNum); | |
} | |
if(_.startsWith(line, '## ')){ | |
const title = line.replace('## ', ''); | |
add2(title, pageNum); | |
} | |
if(_.startsWith(line, '### ')){ | |
const title = line.replace('### ', ''); | |
add3(title, pageNum); | |
} | |
}); | |
} | |
}); | |
return res; | |
}; | |
module.exports = function(props){ | |
const pages = props.brew.text.split('\\page'); | |
const TOC = getTOC(pages); | |
const markdown = _.reduce(TOC, (r, g1, idx1)=>{ | |
if(g1.title !== null) { | |
r.push(`- ### [{{ ${g1.title}}}{{ ${g1.page}}}](#p${g1.page})`); | |
} | |
if(g1.children.length){ | |
_.each(g1.children, (g2, idx2)=>{ | |
if(g2.title !== null) { | |
r.push(` - #### [{{ ${g2.title}}}{{ ${g2.page}}}](#p${g2.page})`); | |
} | |
if(g2.children.length){ | |
_.each(g2.children, (g3, idx3)=>{ | |
if(g2.title !== null) { | |
r.push(` - [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`); | |
} else { // Don't over-indent if no level-2 parent entry | |
r.push(` - [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`); | |
} | |
}); | |
} | |
}); | |
} | |
return r; | |
}, []).join('\n'); | |
return dedent` | |
{{toc,wide | |
# Table Of Contents | |
${markdown} | |
}} | |
\n`; | |
}; | |