Files
vvveb-cms/static/Vvvebjs/demo/landing/gulpfile.js

375 lines
10 KiB
JavaScript
Raw Normal View History

2026-05-17 21:09:32 +08:00
/*
npm run gulp watch
//generate sections
npm run gulp sections
//generate blocks
npm run gulp blocks
//take screenshots for all sections
npm run gulp screenshots
//take screenshots for all blocks
npm run gulp screenshots-blocks
//take screenshots for specified section groups
npm run gulp screenshots -hero -features
*/
const gulp = require('gulp');
const fileinclude = require('gulp-file-include');
//const sass = require('gulp-sass')(require('sass'));
const sass = require('gulp-sass')(require('node-sass'));
const sassGlob = require('gulp-sass-glob');
const { formatHTML } = require('gulp-format-html');
//const gutil = require('gulp-util');
const rename = require("gulp-rename");
const imageResize = require('gulp-image-resize');
const through2 = require( 'through2' );
const connect = require('gulp-connect');
const puppeteer = require('puppeteer');
const fs = require('fs')
const path = require('path');
let baseHref = '';
let blockPrefix = "landing";
let themeName = "landing";
//get command line parameters after some specified parameter
function parameters() {
return process.argv.slice(3);
}
const touch = () => through2.obj( function( file, enc, cb ) {
if ( file.stat ) {
file.stat.atime = file.stat.mtime = file.stat.ctime = new Date();
}
cb( null, file );
});
console.log( process.env.npm_config_path);
let dir = process.env.npm_config_path;
if (dir) {
console.log('Starting directory: ' + process.cwd());
try {
process.chdir(dir);
console.log('New directory: ' + process.cwd());
}
catch (err) {
console.log('chdir: ' + err);
}
}
themeName = path.basename(process.cwd());
gulp.task('fileinclude', function() {
return gulp.src(['./src/*.html', './src/**/*.html', '!**/-*/**', '!**/_*/**'])
.pipe(fileinclude({
prefix: '@@',
basepath: '@file'
}))
.pipe(formatHTML())
.pipe( touch() )
.pipe(gulp.dest('./'));
});
gulp.task('sass', function() {
return gulp.src(['./scss/*.scss', './scss/**/*.scss', '!**/_*/**'])
.pipe(sassGlob())
.pipe(sass())
.pipe(gulp.dest('./css'));
});
gulp.task('watch', function () {
gulp.watch(['./src/*.html', './src/**/*.html'], gulp.series('fileinclude'));
gulp.watch(['./scss/*.scss', './scss/**/*.scss', './scss/**/**/*.scss'], gulp.series('sass'));
});
var current_section = "posts";
async function screenshots(type = "sections", dirs = []) {
let sectionsDir = path.resolve("./" + type);
let screenshotDir = path.resolve("./screenshots/" + type + "/");
let styleCss = path.resolve("./css/style.bundle.css");
let selector = "body > section";
let sections = [];
let baseDir = path.resolve(".");
if (!dirs.length) {
dirs = fs.readdirSync(sectionsDir).map(fileName => {
let filePath = `${sectionsDir}/${fileName}`;
let stat = fs.statSync(filePath)
if (stat.isDirectory()) {
let files = fs.readdirSync(filePath).map(sectionFile => {
//if (filePath.indexOf(current_section) > 0)
{
sections.push(`${filePath}/${sectionFile}`);
}
});
}
});
}
const browser = await puppeteer.launch({
args: [
'--start-maximized'
],
headless: true,
//slowMo: 250,
//devtools: true,
});
const page = await browser.newPage();
//await page.setRequestInterception(true);
await page.setViewport({
width: 1500,
height: 800,
//deviceScaleFactor: 2
});
page.on('console', (msg) => console.log('PAGE LOG:', msg.text));
await page.evaluate(() => console.log(`url is ${location.href}`));
/*
page.on('request', (request) => {
if (request.resourceType() === 'image') request.abort();
else request.continue();
});
*/
let tempFiles = [];
for (i in sections) {
section = sections[i];
screenshot = section.replace(sectionsDir, screenshotDir).replace('.html', '.webp');
tempFiles.push(screenshot);
sectionScreenshot = section.replace('.html', '-screenshot.html');;
tempFiles.push(sectionScreenshot);
//gutil.log(`Start screenshot for '${gutil.colors.cyan(section)}' to '${gutil.colors.magenta(screenshot)}'`);
console.log(`Start screenshot for '${section}' to '${screenshot}'`);
folderName = path.dirname(screenshot);
if (!fs.existsSync(folderName)) {
fs.mkdirSync(folderName)
}
let content = fs.readFileSync(section,'utf8');
let html = `<html data-vvvebjs-editor><head><base href="../../"><link href="/css/style.bundle.css" rel="stylesheet"><link href="/css/screenshots.css" rel="stylesheet"><style>[data-reveal], [data-section] > * {
opacity: 1;
transform: translate(0);
}</style></head><body>${content}</body></html>`;
fs.writeFileSync(sectionScreenshot, html);
//await page.setContent(html, {"waitUntil":"networkidle0"});
url = "http://127.0.0.1:8008" + sectionScreenshot.replace(baseDir, '');
/*
await Promise.all([ page.goto(url, { waitUntil: "load", timeout: 10000 }).catch(e => {
if (e.message.includes('net::ERR_ABORTED')) { console.log('PAGE LOG:', e.message) }
}), page.waitForNavigation() ]);
*/
await page.goto(url, { waitUntil: "load", timeout: 10000 }).catch(e => {
console.log('PAGE LOG:', e.message);
//if (e.message.includes('net::ERR_ABORTED')) { console.log('PAGE LOG:', e.message) }
});
//await page.goto("file://" + section);
/*
await page.addStyleTag({url: `file://${styleCss}`})
const result = await page.evaluate((baseHref) => {
let head = document.querySelector('head');
let base = document.createElement("base");
base.href= `file://${baseHref}/`;
head.append(base);
}, baseHref);
*/
//await page.waitForNavigation();
const element = await page.$$("body > div, body > section, body > header, body > footer, body > *");
//await page.screenshot({ path: screenshot, fullPage: false, type: 'png' });
//console.log(element[0]);
await element[0].screenshot({ path: screenshot, type: 'webp' });
gulp.src(screenshot)
.pipe(imageResize({
width : 480,
format: "webp",
quality:0,
}))
.pipe(rename(function (path) { path.basename += "-thumb"; }))
.pipe(gulp.dest(folderName)).on('end', () => {
//remove original screenshot and keep only thumb
});
}
await browser.close();
tempFiles.map(screenshot => {
fs.stat(screenshot, function (err, stats) {
if (err) {
return console.error(err);
}
fs.unlink(screenshot,function(err){
if(err) {
return console.log(err);
}
//console.log('file deleted successfully');
});
})
});
return true;
}
let templates = {
'section':{
'group':`
Vvveb.SectionsGroup["{{group}}"] = [{{groupList}}];
`,
'section':
`Vvveb.Sections.add("{{id}}", {
name: "{{name}}",
image: Vvveb.themeBaseUrl + "/{{image}}",
html: \`{{html}}\`
});`
},
'block': {
'group':`
Vvveb.BlocksGroup['{{group}}'] = [{{groupList}}];
`,
'section':
`Vvveb.Blocks.add("{{id}}", {
name: "{{name}}",
image: Vvveb.themeBaseUrl + "/{{image}}",
html: \`{{html}}\`
});`
}};
function template(template, data) {
return template.replace(/{{(.+?)}}/gm, function(match, p1) {
return data[p1];
})
}
function prettify(str) {
return str.charAt(0).toUpperCase() + str.slice(1).replace(/[-_]/g,' ');
}
let sectionsSortOrder = [ "hero", "features", "banner", "services"];
//generate sections for VvvebJs
function sections(type = "section", dirs = []) {
let sectionsDir = path.resolve(`./${type}s/`);
let styleCss = path.resolve("./css/style.bundle.css");
let baseDir = path.resolve(".");
let dir = [];
let sectionsJs = '';
if (!dirs.length) {
dirs = fs.readdirSync(sectionsDir).map(fileName => {
let stat = fs.statSync(`${sectionsDir}/${fileName}`);
if (stat.isDirectory()) {
dir.push(fileName);
}
});
}
//console.dir(dir);
sectionsSortOrder.reverse();
//sort sections
dir.sort((a, b) => sectionsSortOrder.indexOf(b) - sectionsSortOrder.indexOf(a));
//set theme sections first if available
const index = dir.indexOf(themeName);
if (index > -1) {
dir.splice(index, 1);
dir.unshift(themeName);
}
for (i in dir) {
let fileName = dir[i];
let filePath = `${sectionsDir}/${fileName}`;
let group = fileName;
let name;
let id;
let html;
let sectionsHtml = `<html data-vvvebjs-editor><head><base src="../"><link href="../css/style.bundle.css" rel="stylesheet"><link href="../css/screenshots.css" rel="stylesheet"><style>[data-reveal], [data-section] > * {
opacity: 1;
transform: translate(0);
}</style><link href="../css/screenshots.css" rel="stylesheet"></head><body>`;
let image = '';
let sections = [];
let files = fs.readdirSync(filePath).
sort((a, b) => parseInt(a.replace( /^\D+/g, '')) - parseInt(b.replace( /^\D+/g, ''))).
map(sectionFile => {
name = sectionFile.replace(".html","");
id = `${group}/${name}`;
name = prettify(name);
image = `screenshots/${type}s/${group}/` + sectionFile.replace(".html", "-thumb.webp");
html = fs.readFileSync(`${filePath}/${sectionFile}`,'utf8');
sections.push(id);
sectionsJs += template(templates[type]['section'], {id, name, image, html});
sectionsHtml += html.replace('<section', '<section title="' + name + '"');
});
fs.writeFileSync(filePath + ".html", sectionsHtml + "</body></html>");
let groupList = '"' + sections.join('","') + '"';
group = prettify(group);
sectionsJs += template(templates[type]['group'], {group, groupList});
}
return fs.writeFileSync(/*path.resolve(".") + *//*`${sectionsDir}/${type}s.js`*/path.resolve(".") + `/${type}s/${type}s.js`, sectionsJs);
}
gulp.task('connect', async function (done) {
await connect.server({
port: 8008,
root: './',
});
});
gulp.task('disconnect', async function (done) {
await connect.serverClose();
});
gulp.task('take-screenshots', async function (done) {
return await screenshots('sections');
});
gulp.task('take-screenshots-blocks', async function (done) {
return await screenshots("blocks");
});
gulp.task('sections', async function () {
return sections("section", parameters());
});
gulp.task('blocks', async function () {
return sections("block", parameters());
});
// Default Task
gulp.task('default', gulp.series('fileinclude', 'sass'));
gulp.task('screenshots', gulp.series('connect', 'take-screenshots', 'disconnect'));
gulp.task('screenshots-blocks', gulp.series('connect', 'take-screenshots-blocks', 'disconnect'));
gulp.task('sections', gulp.series('sections'));
gulp.task('blocks', gulp.series('blocks'));