80 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.1 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();
 | 
						|
});
 |