311 lines
8.5 KiB
JavaScript
311 lines
8.5 KiB
JavaScript
var
|
|
// gulp
|
|
gulp = require('gulp'),
|
|
cleancss = require('gulp-clean-css'),
|
|
concat = require('gulp-concat'),
|
|
frontmatter = require('gulp-front-matter'),
|
|
imagemin = require('gulp-imagemin'),
|
|
newer = require('gulp-newer'),
|
|
rename = require('gulp-rename'),
|
|
|
|
// components
|
|
del = require('del'),
|
|
ejs = require('ejs'),
|
|
fs = require('fs'),
|
|
md = require('markdown-it')({
|
|
html: true,
|
|
xhtmlOut: true,
|
|
linkify: true,
|
|
typographer: true
|
|
}),
|
|
path = require('path'),
|
|
pump = require('pump'),
|
|
seq = require('run-sequence'),
|
|
through = require('through2'),
|
|
|
|
// config
|
|
site = require('./site.json'),
|
|
pkg = require('./package.json'),
|
|
|
|
// variables
|
|
dest_dir = 'www',
|
|
css_src_dir = 'assets/styles',
|
|
js_src_dir = 'assets/scripts',
|
|
pages_src_dir = 'content/pages',
|
|
support_src_dir = 'content/support',
|
|
|
|
// functions
|
|
readFileIfExists = function (file_path){
|
|
try {
|
|
return fs.readFileSync(file_path, {encoding: 'utf8'});
|
|
} catch(err) {
|
|
if (err.code == 'ENOENT') return undefined;
|
|
throw err;
|
|
}
|
|
},
|
|
|
|
collectPages = function(base_path) {
|
|
var
|
|
fm = require('front-matter'),
|
|
pages = [],
|
|
tags = [];
|
|
return through.obj(function (file, enc, cb) {
|
|
|
|
var
|
|
data = fm.test(file.contents.toString()) ? fm(file.contents.toString()) : {},
|
|
contents = data && data.body ? data.body : file.contents.toString(),
|
|
page = file.page,
|
|
name = file.path.replace(file.base,'');
|
|
if (data && data.attributes) {
|
|
Object.assign(data.attributes, page)
|
|
}
|
|
page.content = contents;
|
|
page.path = file.path.replace(base_path, '');
|
|
page.path = page.path.substring(0, page.path.lastIndexOf('.')) + '.html';
|
|
page.name = page.path.substring(page.path.lastIndexOf('/') + 1, page.path.lastIndexOf('.'));
|
|
|
|
if (file.path.endsWith('.md')) {
|
|
page.content = md.render(contents);
|
|
} else if (file.path.endsWith('ejs')) {
|
|
page.content = ejs.render(contents, page, {});
|
|
}
|
|
|
|
pages.push(page);
|
|
|
|
if (page.tags) {
|
|
page.tags.split(' ').forEach(function (tag) {
|
|
if (tags.indexOf(tag) == -1) {
|
|
tags.push(tag);
|
|
}
|
|
});
|
|
}
|
|
this.push(file);
|
|
cb();
|
|
},
|
|
function (cb) {
|
|
if (site.pages) {
|
|
site.pages = site.pages.concat(pages);
|
|
} else {
|
|
site.pages = pages;
|
|
}
|
|
if (site.tags) {
|
|
site.tags = site.tags.concat(tags.filter(function (item) {
|
|
return tags.indexOf(item) < 0;
|
|
}));
|
|
} else {
|
|
site.tags = tags;
|
|
}
|
|
|
|
cb();
|
|
});
|
|
},
|
|
|
|
applyMarkdown = function() {
|
|
return through.obj(function (file, enc, cb) {
|
|
file.contents = new Buffer(md.render(file.contents.toString()), 'utf8');
|
|
this.push(file);
|
|
cb();
|
|
});
|
|
|
|
},
|
|
|
|
applyTemplate = function (template_file) {
|
|
// read template_file into a string
|
|
// pass string to ejs.render
|
|
var
|
|
filename = path.join(__dirname, template_file),
|
|
options = {
|
|
"filename": filename
|
|
},
|
|
template_str = fs.readFileSync(filename, 'utf8'),
|
|
tpl = ejs.compile(template_str, options);
|
|
|
|
return through.obj(function (file, enc, cb) {
|
|
var
|
|
name = file.path.replace(file.base,''),
|
|
data = {
|
|
name: name.substring(0, name.lastIndexOf('.')),
|
|
site: site,
|
|
page: file.page,
|
|
content: file.contents.toString()
|
|
};
|
|
|
|
file.contents = new Buffer(tpl(data), 'utf8');
|
|
this.push(file);
|
|
cb();
|
|
});
|
|
},
|
|
|
|
readJson = function () {
|
|
return through.obj(function (file, enc, cb) {
|
|
var data = readFileIfExists(path.join(path.dirname(file.path), path.basename(file.path)) + '.json');
|
|
if (data !== undefined) {
|
|
file.page = JSON.parse(data);
|
|
}
|
|
this.push(file);
|
|
cb();
|
|
});
|
|
},
|
|
|
|
parseEJS = function(){
|
|
return through.obj(function (file, enc, cb) {
|
|
var data = {
|
|
site: site,
|
|
page: file.page
|
|
};
|
|
file.contents = new Buffer(ejs.render(file.contents.toString(), data, {}));
|
|
this.push(file);
|
|
cb();
|
|
});
|
|
},
|
|
|
|
buildSupportFiles = function() {
|
|
var dest = dest_dir;
|
|
console.log('Building Support Files...');
|
|
return gulp
|
|
.src(path.join(support_src_dir,'**/*.ejs'))
|
|
.pipe(parseEJS())
|
|
.pipe(rename({
|
|
extname: ''
|
|
}))
|
|
.pipe(gulp.dest(dest));
|
|
}
|
|
;
|
|
|
|
site.time = new Date();
|
|
site.base_uri = (readFileIfExists('./base_uri') || '').trim();
|
|
site.version = pkg.version;
|
|
|
|
gulp
|
|
.task('default', function() {
|
|
// place code for your default task here
|
|
})
|
|
// start with the files from the old web site
|
|
.task('css', function() {
|
|
var dest = path.join(dest_dir,'styles');
|
|
console.log('Concat & cache-bust CSS');
|
|
return gulp
|
|
// set source (src/**/*.css)
|
|
.src(path.join(css_src_dir,'*.css'))
|
|
// write to site.<pkg-ver>.css
|
|
.pipe(concat('styles.' + pkg.version + '.css'))
|
|
// write to dest/content
|
|
.pipe(gulp.dest(dest));
|
|
})
|
|
.task('files', function(){
|
|
var dest = path.join(dest_dir,'files');
|
|
console.log('Copy files');
|
|
return gulp
|
|
.src('assets/files/*')
|
|
.pipe(newer(dest))
|
|
.pipe(gulp.dest(dest));
|
|
})
|
|
.task('fonts', function(){
|
|
var dest = path.join(dest_dir,'fonts');
|
|
console.log('Copy fonts');
|
|
return gulp
|
|
.src('assets/fonts/**')
|
|
.pipe(newer(dest))
|
|
.pipe(gulp.dest(dest));
|
|
})
|
|
.task('images', function(){
|
|
var dest = path.join(dest_dir,'images');
|
|
console.log('Compress, cache and copy images');
|
|
return gulp
|
|
.src('assets/images/**/*')
|
|
.pipe(newer(dest))
|
|
.pipe(imagemin({
|
|
optimizationLevel: 3
|
|
}))
|
|
.pipe(gulp.dest(dest));
|
|
})
|
|
.task('js', function (cb) {
|
|
var dest = path.join(dest_dir,'scripts');
|
|
console.log('Cache-bust JS');
|
|
pump([
|
|
// set source
|
|
gulp.src(path.join(js_src_dir,'*.js')),
|
|
// write to scripts.<pkg-ver>.js
|
|
concat(`scripts.${pkg.version}.js`),
|
|
// write to dest
|
|
gulp.dest(dest)
|
|
],
|
|
cb
|
|
);
|
|
})
|
|
.task('pages:md', function () {
|
|
var dest = dest_dir;
|
|
console.log('Building Pages (MD)...');
|
|
return gulp
|
|
.src(path.join(pages_src_dir,'**/*.md'))
|
|
.pipe(frontmatter({
|
|
property: 'page',
|
|
remove: true
|
|
}))
|
|
.pipe(collectPages(path.join(process.cwd(), pages_src_dir)))
|
|
.pipe(applyMarkdown())
|
|
.pipe(applyTemplate('./templates/default.ejs'))
|
|
.pipe(rename({extname: '.html'}))
|
|
.pipe(gulp.dest(dest));
|
|
})
|
|
.task('pages:ejs', function () {
|
|
var dest = dest_dir;
|
|
console.log('Building Pages (EJS)...');
|
|
return gulp
|
|
.src(path.join(pages_src_dir,'**/*.ejs'))
|
|
.pipe(frontmatter({
|
|
property: 'page',
|
|
remove: true
|
|
}))
|
|
.pipe(collectPages(path.join(process.cwd(), pages_src_dir)))
|
|
.pipe(parseEJS())
|
|
.pipe(applyTemplate('./templates/default.ejs'))
|
|
.pipe(rename({
|
|
extname: '.html'
|
|
}))
|
|
.pipe(gulp.dest(dest));
|
|
})
|
|
.task('support', buildSupportFiles)
|
|
.task('pages', function() {
|
|
seq(
|
|
'pages:md',
|
|
'pages:ejs'
|
|
);
|
|
})
|
|
|
|
.task('build', [
|
|
'css', 'files', 'fonts', 'images', 'js', 'pages'
|
|
], buildSupportFiles)
|
|
.task('clean', function () {
|
|
var dest = dest_dir;
|
|
return del([
|
|
dest
|
|
]);
|
|
})
|
|
|
|
.task('watch', function() {
|
|
gulp.watch(css_src_dir, ['css']);
|
|
gulp.watch(js_src_dir, ['js']);
|
|
gulp.watch(pages_src_dir, ['pages']);
|
|
gulp.watch(support_src_dir, ['support']);
|
|
})
|
|
|
|
.task('test', function (cb) {
|
|
var dest = dest_dir;
|
|
console.log('Testing...');
|
|
pump([
|
|
gulp.src('content/pages/**/*.md'),
|
|
(function(){
|
|
return through.obj(function (file, enc, cb) {
|
|
var file_name = file.path.replace(file.base,'');
|
|
console.log(JSON.stringify(file_name.substring(0, file_name.lastIndexOf('.')), null, 2));
|
|
cb();
|
|
});
|
|
})()
|
|
],
|
|
cb
|
|
);
|
|
})
|
|
|
|
;
|