Files
2025-10-27 17:39:18 -04:00

168 lines
5.0 KiB
JavaScript

const gulp = require('gulp');
const gulpTwig = require('gulp-twig');
const gulpData = require('gulp-data');
const gulpRename = require('gulp-rename');
const gulpDartSass = require('gulp-dart-sass');
const gulpSourcemaps = require('gulp-sourcemaps');
const gulpAutoprefixer = require('gulp-autoprefixer');
const gulpHtmlBeautify = require('gulp-html-beautify');
const gulpCssNano = require('gulp-cssnano');
const gulpIf = require('gulp-if');
const gulpSvg = require('gulp-svg-sprite');
const gulpAppendPrepend = require('gulp-append-prepend');
const fancyLog = require('fancy-log');
const fs = require('fs');
const path = require('path');
const mergeStream = require('merge-stream');
/**
* Compiles twig files to html
*/
function twig(options) {
options = Object.assign({
analytics: '',
direction: 'ltr',
}, typeof options !== 'undefined' ? options : {});
return gulp.src(['src/twig/pages/*'])
.pipe(gulpData(() => {
const result = {
analytics: options.analytics,
direction: options.direction,
};
const files = fs.readdirSync('src/data');
for (let file of files) {
result[path.basename(file, '.json')] = JSON.parse(fs.readFileSync('src/data/'+file).toString());
}
return result;
}))
.pipe(gulpTwig({base: 'src/twig/', data: gulpData}))
.on('error', function (error) {
fancyLog.error(error);
this.emit('end');
})
.pipe(gulpRename(path => path.extname = '.html'))
.pipe(gulpHtmlBeautify({indent_size: 4, max_preserve_newlines: 0}));
}
/**
* Compiles scss files to css
*/
function scss(options) {
options = Object.assign({
production: false,
theme: 'classic',
pack: false,
}, typeof options !== 'undefined' ? options : {});
let prependText = '//';
if (options.theme !== 'classic') {
prependText = '@import "'+options.theme+'-theme";';
}
let src = ['src/scss/style.scss'];
if (options.pack) {
src.push('src/scss/style.ltr.scss');
src.push('src/scss/style.rtl.scss');
}
return gulp.src(src)
.pipe(gulpIf(!options.production, gulpSourcemaps.init()))
.pipe(gulpAppendPrepend.prependText(prependText))
.pipe(gulpDartSass({
outputStyle: 'expanded'
}))
.pipe(gulpAutoprefixer())
.on('error', function (error) {
fancyLog.error(error);
this.emit('end');
})
.pipe(gulpIf(options.production, gulpCssNano()))
.pipe(gulpIf(!options.production, gulpSourcemaps.write('./')))
.pipe(gulpRename(path => path.dirname = `css/${path.dirname}`));
}
/**
* Copies vendor directory to dist directory
*/
function vendor() {
const tasks = [
gulp.src(['src/vendor/**/*']).pipe(gulpRename(path => path.dirname = `vendor/${path.dirname}`)),
];
const modules = {
'node_modules/@fortawesome/fontawesome-free/css/**/*': 'vendor/fontawesome/css',
'node_modules/@fortawesome/fontawesome-free/webfonts/**/*': 'vendor/fontawesome/webfonts',
'node_modules/@fortawesome/fontawesome-free/LICENSE.txt': 'vendor/fontawesome',
'node_modules/jquery/dist/**/*': 'vendor/jquery',
'node_modules/nouislider/dist/**/*': 'vendor/nouislider',
'node_modules/owl.carousel/dist/**/*': 'vendor/owl-carousel',
'node_modules/photoswipe/dist/**/*': 'vendor/photoswipe',
'node_modules/svg4everybody/dist/**/*': 'vendor/svg4everybody',
'node_modules/bootstrap/dist/**/*': 'vendor/bootstrap',
};
for (let source in modules) {
if (modules.hasOwnProperty(source)) {
const dest = modules[source];
tasks.push(
gulp.src(source).pipe(gulpRename(path => path.dirname = `${dest}/${path.dirname}`))
);
}
}
return mergeStream(...tasks);
}
/**
* Copies images to dist directory
*/
function images() {
return gulp.src(['src/images/**/*'])
.pipe(gulpRename(path => path.dirname = `images/${path.dirname}`));
}
/**
* Compiles svg sprite
*/
function svg() {
return gulp.src('src/svg/**/*.svg')
.pipe(gulpSvg({
mode: {
symbol: {
dest: '',
sprite: 'sprite.svg',
prefix: 'svg-%s'
}
}
}))
.pipe(gulpRename(path => path.dirname = `images/${path.dirname}`));
}
/**
* Compiles js
*/
function js() {
return gulp.src(['src/js/**/*'])
.pipe(gulpRename(path => path.dirname = `js/${path.dirname}`));
}
exports.twig = twig;
exports.scss = scss;
exports.vendor = vendor;
exports.images = images;
exports.svg = svg;
exports.js = js;