/**
* Generate html files, target-dependent
* Context for embedding page is loaded from markdown file
*/
const process = require('process');
const path = require('path');
const fs = require('fs');
const posthtml = require('posthtml');
const expressions = require('posthtml-expressions');
const marked = require('marked');
const config = require('../build.json');
const options = require('../src/js/options.json');
const target = process.env.NODE_ENV || 'development';
// Change current directory to script location so that
// the relative paths of the resources can be resolved
process.chdir(path.dirname(process.argv[1]));
function createOutputDirectory() {
fs.mkdirSync(
path.join(
'../',
config.path.output,
config.path.data
),
{ recursive: true },
(error) => {
if (error !== null) {
console.error('Error while creating directory', error);
}
}
);
}
// Load info from markdown file
function loadFile(filepath) {
const content = fs.readFileSync(filepath, 'utf8');
return content;
}
function createHtml() {
// Create visualisation HTML
const visualisation = loadFile(path.join(
'../',
config.path.input,
config.path.html,
config.html.input
));
posthtml(
expressions({
locals: {
javascript: path.join(config.path.js, `${config.main}${config[target].infix}.js`),
stylesheet: path.join(config.path.css, `${config.main}${config[target].infix}.css`)
}
})
).process(visualisation)
.then((result) => {
fs.writeFileSync(
path.join(
'../',
config.path.output,
// config.path.html,
config.html.output
), result.html
);
});
}
function createInfoComponent(md) {
var converted = `${marked(md)}`;
// Compile html, write file
posthtml().process(converted)
.then((result) => {
fs.writeFileSync(
path.join(
'../',
config.path.input,
config.path.js,
config.path.components,
config.info.output.component
), result.html
);
});
}
// Convert markdown to json for use in pdf export using marked
// https://marked.js.org/#/USING_PRO.md#tokenizer
// So far, only headings, paragraphs and lists are supported
function createInfoJSON(md) {
var tokens = marked.lexer(md);
let info = [];
for (let token of tokens) {
if (token.type === 'space') {
continue;
}
if (token.type === 'html') {
info.push({
text: '',
type: 'pageBreak'
});
} else { // if (token.type === 'list' || token.type === 'heading' || token.type === 'paragraph') {
var object = {
type: token.type
};
if (token.type === 'list') {
object.items = token.items.map(i => i.text);
} else {
object.text = token.text;
}
if (token.type === 'heading') {
object.depth = token.depth;
}
info.push(object);
}
}
fs.writeFileSync(
path.join(
'../',
config.path.output,
config.path.data,
config.info.output.javascript
), JSON.stringify(info)
);
}
function createInfo () {
// Convert markdown to html
var markdown = loadFile(
path.join(
'../',
config.path.data,
config.info.input
)
);
createInfoComponent(markdown);
createInfoJSON(markdown);
}
createOutputDirectory();
createInfo();
createHtml();