80 lines
2.0 KiB
JavaScript
80 lines
2.0 KiB
JavaScript
const gulp = require('gulp');
|
|
const { src, dest } = require("gulp");
|
|
const through = require("through2");
|
|
const build = require('./build');
|
|
|
|
// gulp task
|
|
function json() {
|
|
return src(build.config.path.src + '/nav.json')
|
|
.pipe(
|
|
through.obj((file, enc, cb) => {
|
|
// get content of json file
|
|
const rawJSON = file.contents.toString();
|
|
|
|
// parse raw json into javscript object
|
|
const parsed = JSON.parse(rawJSON);
|
|
|
|
// transform json into desired shape
|
|
const transformed = transformJson(parsed);
|
|
|
|
// make string from javascript obj
|
|
const stringified = JSON.stringify(transformed, null, 2);
|
|
|
|
// make bufer from string and attach it as current file content
|
|
file.contents = Buffer.from(stringified);
|
|
|
|
// pass transformed file into next gulp pipe
|
|
cb(null, file);
|
|
})
|
|
)
|
|
.pipe(dest("dest"));
|
|
}
|
|
|
|
// transformation
|
|
function transformJson(input) {
|
|
const result = { nav: {} };
|
|
|
|
// read json field by field
|
|
Object.keys(input).forEach(topLevelKey => {
|
|
// current object
|
|
const topLevelItem = input[topLevelKey];
|
|
|
|
// in your design topLevelItems are arrays
|
|
topLevelItem.forEach(menuItem => {
|
|
if (menuItem.title) {
|
|
// make url either from item href or title
|
|
const itemUrl = makeUrl(menuItem.href || menuItem.title);
|
|
result.nav[itemUrl] = menuItem.title;
|
|
}
|
|
|
|
// prcoess children
|
|
if (menuItem.items) {
|
|
menuItem.items
|
|
.filter(child => !!child.title) // process only child items with title
|
|
.forEach(child => {
|
|
const childUrl = makeUrl(child.href || child.title);
|
|
result.nav[childUrl] = child.title;
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
return result;
|
|
}
|
|
|
|
// helper func
|
|
function makeUrl(href) {
|
|
return href
|
|
.toLowerCase()
|
|
.replace(/\.html$/, "")
|
|
.replace(/\s/g, "_");
|
|
}
|
|
|
|
// export for use in command line
|
|
exports.json = json;
|
|
|
|
gulp.task('build-lang', function (done) {
|
|
json();
|
|
done();
|
|
});
|