95 lines
2.6 KiB
JavaScript
95 lines
2.6 KiB
JavaScript
/*
|
|
This is the extractor script that generates the snippets.json and snippetsArchive.json files.
|
|
Run using `npm run extractor`.
|
|
*/
|
|
// Load modules
|
|
const fs = require('fs-extra');
|
|
const path = require('path');
|
|
const chalk = require('chalk');
|
|
const util = require('./util');
|
|
// Paths
|
|
const SNIPPETS_PATH = './snippets';
|
|
const SNIPPETS_ARCHIVE_PATH = './snippets_archive';
|
|
const OUTPUT_PATH = './snippet_data';
|
|
// Check if running on Travis - only build for cron jobs and custom builds
|
|
if (
|
|
util.isTravisCI() &&
|
|
process.env['TRAVIS_EVENT_TYPE'] !== 'cron' &&
|
|
process.env['TRAVIS_EVENT_TYPE'] !== 'api'
|
|
) {
|
|
console.log(`${chalk.green('NOBUILD')} snippet extraction terminated, not a cron or api build!`);
|
|
process.exit(0);
|
|
}
|
|
// Read data
|
|
let snippets = {},
|
|
archivedSnippets = {},
|
|
tagDbData = {};
|
|
console.time('Extractor');
|
|
snippets = util.readSnippets(SNIPPETS_PATH);
|
|
archivedSnippets = util.readSnippets(SNIPPETS_ARCHIVE_PATH);
|
|
tagDbData = util.readTags();
|
|
// Extract snippet data
|
|
let snippetData = Object.keys(snippets).map(key => {
|
|
return {
|
|
id: key.slice(0, -3),
|
|
type: 'snippet',
|
|
attributes: {
|
|
fileName: key,
|
|
text: util.getTextualContent(snippets[key]).trim(),
|
|
codeBlocks: util.getCodeBlocks(snippets[key]),
|
|
tags: tagDbData[key.slice(0, -3)]
|
|
},
|
|
meta: {
|
|
archived: false,
|
|
hash: util.hashData(snippets[key])
|
|
}
|
|
};
|
|
});
|
|
// Extract archived snippet data
|
|
let snippetArchiveData = Object.keys(archivedSnippets).map(key => {
|
|
return {
|
|
id: key.slice(0, -3),
|
|
type: 'snippet',
|
|
attributes: {
|
|
fileName: key,
|
|
text: util.getTextualContent(archivedSnippets[key]).trim(),
|
|
codeBlocks: util.getCodeBlocks(archivedSnippets[key]),
|
|
tags: []
|
|
},
|
|
meta: {
|
|
archived: true,
|
|
hash: util.hashData(archivedSnippets[key])
|
|
}
|
|
};
|
|
});
|
|
const completeData = {
|
|
data: [...snippetData, ...snippetArchiveData],
|
|
meta: {
|
|
specification: 'http://jsonapi.org/format/'
|
|
}
|
|
};
|
|
let listingData = {
|
|
data:
|
|
completeData.data.map(v => ({
|
|
id: v.id,
|
|
type: 'snippetListing',
|
|
attributes: {
|
|
tags: v.attributes.tags,
|
|
archived: v.meta.archived
|
|
},
|
|
meta: {
|
|
hash: v.meta.hash
|
|
}
|
|
}))
|
|
,
|
|
meta: {
|
|
specification: 'http://jsonapi.org/format/'
|
|
}
|
|
};
|
|
// Write files
|
|
fs.writeFileSync(path.join(OUTPUT_PATH, 'snippets.json'), JSON.stringify(completeData, null, 2));
|
|
fs.writeFileSync(path.join(OUTPUT_PATH, 'snippetList.json'), JSON.stringify(listingData, null, 2));
|
|
// Display messages and time
|
|
console.log(`${chalk.green('SUCCESS!')} snippets.json and snippetsArchive.json files generated!`);
|
|
console.timeEnd('Extractor');
|