Commit bcbb832e authored by Nikolay Gromov's avatar Nikolay Gromov

Запилил обновление переменной со списокм блоков

parent 1e654d43
...@@ -4,19 +4,17 @@ ...@@ -4,19 +4,17 @@
### Полная сборка ### Полная сборка
- Создаются переменные: - Определяются переменные, в т.ч. `config` из `./config.js` (все настройки).
- `blocksList = []` — массив классов-Блоков, которые будут получены из html.
- `configOld = require('./config.json')` — конфиг, который уже есть.
- `config = {}` — актуальный конфиг.
- Из pug собирается html. - Из pug собирается html.
- Получившийся HTML анализируется, из атрибутов `class` формируется массив `blocksList`. - Получившийся HTML анализируется, из атрибутов `class` формируется массив `blocksList` (файлы, перечисленные в `config.notGetBlocks` игнорируются; блоки, перечисленные в `config.ignoredBlocks` игнорируются).
- Из `blocksList` исключаются игнорируемые блоки, упомянутые в массиве `configOld.ignoredBlocks`. - Формируется список использованных сейчас на проекте блоков:
- Формируем актуальный конфиг `config`: - Из массива `config.blocks` убираются не использующиеся сейчас в разметке блоки.
- Добавляем не касающиеся блоков разделы из `configOld`. - В массив `config.blocks` добавляются блоки, которые используются, но отсутствовали в нём (добавляются в конец).
- Обходим `blocksList` и проверяем для каждого блока существование стилевого файла, JS-файла, папки картинок. Записываем данные, идентичные старому конфигу по структуре. - Если изменился список блоков, формируется контент `./config.js` и файл записывается на диск.
- Записываем актуальный конфиг в файл `config.json`.
- Формируем список стилевых файлов: файлы ДО, файлы блоков (если есть), файлы ПОСЛЕ.
- Сравниваем список стилевых файлов с содержимым диспетчера подключений. Если отличаются, перезаписываем ДП стилей.
- Формируем список стилевых файлов: файлы ДО, файлы блоков (если есть), файлы ПОСЛЕ. Перезаписываем ДП стилей.
- Компилируем стили. - Компилируем стили.
- Формируем список JS-файлов: файлы ДО, файлы блоков (если есть), файлы ПОСЛЕ. - Формируем список JS-файлов: файлы ДО, файлы блоков (если есть), файлы ПОСЛЕ.
- Собираем и обрабатываем JS. - Собираем и обрабатываем JS.
......
let config = let config =
{ {
// Файлы, классы которых не анализируются при поиске БЭМ-блоков
"notGetBlocks": [ "notGetBlocks": [
"blocks-demo.html", "blocks-demo.html",
], ],
// Классы, которые не нужно считать БЭМ-блоками
"ignoredBlocks": [ "ignoredBlocks": [
"no-js", "no-js",
], ],
"blocks": { // БЭМ-блоки, используемые в проекте
"page": { "blocks": [
"style": [ "page",
"src/blocks/page/page.scss", "page-header",
], "logo",
"js": [], "main-nav",
"img": [], "OLD-block-SHOULD-BE-REMOVED",
"assets": [], ],
}, // SCSS-файлы, которые будут взяты в сборку стилей перед файлами БЭМ-блоков
"page-header": {
"style": [
"src/blocks/page-header/page-header.scss",
],
"js": [],
"img": [],
"assets": [],
},
"logo": {
"style": [
"src/blocks/logo/logo.scss",
],
"js": [],
"img": [],
"assets": [],
},
"main-nav": {
"style": [
"src/blocks/main-nav/main-nav.scss",
],
"js": [
"src/blocks/main-nav/main-nav.js"
],
"img": [],
"assets": [],
},
"burger": {
"style": [
"src/blocks/burger/burger.scss",
],
"js": [
"src/blocks/burger/burger.js"
],
"img": [],
"assets": [],
},
"page-footer": {
"style": [
"src/blocks/page-footer/page-footer.scss",
],
"js": [],
"img": [],
"assets": [],
}
},
"addStyleBefore": [ "addStyleBefore": [
"./src/scss/functions.scss",, "./src/scss/functions.scss",
"./src/scss/variables.scss",, "./src/scss/variables.scss",
"./src/scss/mixins.scss", "./src/scss/mixins.scss",
], ],
// SCSS-файлы, которые будут взяты в сборку стилей после файлов БЭМ-блоков
"addStyleAfter": [ "addStyleAfter": [
"./src/scss/print.scss", "./src/scss/print.scss",
], ],
// JS-файлы, которые будут взяты в сборку JS перед файлами БЭМ-блоков
"addJsBefore": [], "addJsBefore": [],
// JS-файлы, которые будут взяты в сборку JS после файлов БЭМ-блоков
"addJsAfter": [ "addJsAfter": [
"./src/js/global-script.js", "./src/js/global-script.js",
], ],
// Изображения, копируемые в папку сборки до копирования изображений блоков
"addImages": [], "addImages": [],
// Добавочные файлы, копируемые в папку сборки до копирования доп. файлов блоков
"addAssets": [], "addAssets": [],
// CSS-файлы, копируемые в папку сборки без обработки перед сборкой стилей
"copiedCss": [], "copiedCss": [],
// JS-файлы, копируемые в папку сборки без обработки перед сборкой JS
"copiedJs": [], "copiedJs": [],
// Директории проекта
"dir": { "dir": {
"src": "./src/", "src": "./src/",
"build": "./build/", "build": "./build/",
......
'use strict'; 'use strict';
const fs = require('fs');
// Настройки из файла // Настройки из файла
let config = require('./config.js'); let config = require('./config.js');
// Директории из настроек (dir.src = "./src/", dir.build = "./build/", dir.blocks = "./src/blocks/") // Директории из настроек (dir.src = "./src/", dir.build = "./build/", dir.blocks = "./src/blocks/")
let dir = config.dir; let dir = config.dir;
// Список блоков, который будет получен из классов HTML после компиляции pug // Список блоков, который будет получен из классов HTML после компиляции pug
let blocksList = []; let blocksList = [];
// Старый список блоков в виде строки
let oldBlocksListString = JSON.stringify(config.blocks);
// Адрес репозитория // Адрес репозитория
let repoUrl = require('./package.json').repository.url.replace(/\.git$/g, ''); let repoUrl = require('./package.json').repository.url.replace(/\.git$/g, '');
// Пакеты, использующиеся при обработке // Пакеты, использующиеся при обработке
const { series, parallel, src, dest, watch } = require('gulp'); const { series, parallel, src, dest, watch } = require('gulp');
const fs = require('fs');
const plumber = require('gulp-plumber'); const plumber = require('gulp-plumber');
const del = require('del'); const del = require('del');
const pug = require('gulp-pug'); const pug = require('gulp-pug');
...@@ -21,7 +22,6 @@ const replace = require('gulp-replace'); ...@@ -21,7 +22,6 @@ const replace = require('gulp-replace');
const getClassesFromHtml = require('get-classes-from-html'); const getClassesFromHtml = require('get-classes-from-html');
function compilePug() { function compilePug() {
// Pug-фильтр, выводящий содержимое pug-файла в виде форматированного текста // Pug-фильтр, выводящий содержимое pug-файла в виде форматированного текста
...@@ -53,13 +53,32 @@ function compilePug() { ...@@ -53,13 +53,32 @@ function compilePug() {
})) }))
.pipe(through2.obj(getClassesToBlocksList)) .pipe(through2.obj(getClassesToBlocksList))
.on('end', function(){ .on('end', function(){
console.log(blocksList); if(blocksList.length) {
// Убрать из списка блоков те элементы, которых нет в списке блоков, полученном из HTML
config.blocks = config.blocks.filter(item => blocksList.indexOf(item) >= 0);
// Добавить в конец списка блоков те элементы, которые использованы в HTML, но отсутствуют в списке
Array.prototype.push.apply(config.blocks, getArraysDiff(blocksList, config.blocks));
console.log(config.blocks); // Имеем список использованных сейчас на проекте блоков
// Если есть изменения списка блоков, нужно записать конфиг на диск
if(oldBlocksListString != JSON.stringify(config.blocks)) {
console.log('Есть изменения списка используемых блоков');
}
}
else {
console.log('---------- В проекте нет блоков. Сурово. По-челябински.');
}
}) })
.pipe(dest(dir.build)); .pipe(dest(dir.build));
} }
exports.compilePug = compilePug; exports.compilePug = compilePug;
function writeMainStyleFile(cb) {
console.log('111');
cb();
}
exports.writeMainStyleFile = writeMainStyleFile;
function clearBuildDir() { function clearBuildDir() {
return del([ return del([
...@@ -71,13 +90,58 @@ exports.clearBuildDir = clearBuildDir; ...@@ -71,13 +90,58 @@ exports.clearBuildDir = clearBuildDir;
// Функции, не являющиеся задачами Gulp ----------------------------------------
/**
* Получение дефолтных файлов блока (стили, JS, картинки, доп. файлы)
* @param {string} block Искомый блок
* @param {string} blocksDir Директория, в которой лежат все блоки
* @return {object} Объект с соотв. путями, если они существуют { "style": [], "js": [], "img": [], "assets": [] }
*/
// function getBlockDefaultFiles(block, blocksDir = dir.blocks) {
// let res = {};
// // Существует дефолтный стилевой файл?
// let defaultStyleFilePath = blocksDir + block + '/' + block + '.scss';
// fileExist(defaultStyleFilePath) ? res.style = [defaultStyleFilePath] : res.style = [];
// // Существует дефолтный JS-файл?
// let defaultJsFilePath = blocksDir + block + '/' + block + '.js';
// fileExist(defaultJsFilePath) ? res.js = [defaultJsFilePath] : res.js = [];
// // Существует дефолтная папка с картинками?
// let defaultImgFolderPath = blocksDir + block + '/img/';
// fileExist(defaultImgFolderPath) ? res.img = [defaultImgFolderPath] : res.img = [];
// // Существует дефолтная папка с доп. файлами?
// let defaultAssetsFolderPath = blocksDir + block + '/assets/';
// fileExist(defaultAssetsFolderPath) ? res.assets = [defaultAssetsFolderPath] : res.assets = [];
// return res;
// }
// Функции, не являющиеся задачами Gulp ---------------------------------------- /**
* Проверка существования файла или папки
* @param {string} path Путь до файла или папки
* @return {boolean}
*/
function fileExist(filepath){
let flag = true;
try{
fs.accessSync(filepath, fs.F_OK);
}catch(e){
flag = false;
}
return flag;
}
/**
* Получение разницы между двумя массивами.
* @param {array} a1 Первый массив
* @param {array} a2 Второй массив
* @return {array} Элементы, которые отличаются
*/
function getArraysDiff(a1, a2) {
return a1.filter(i=>!a2.includes(i)).concat(a2.filter(i=>!a1.includes(i)))
}
/** /**
* Добавляет список классов из принятого HTML в переменную blocksList, используется в потоке обработки Pug. * СЛУЖЕБНАЯ: Добавляет список классов из принятого HTML в переменную blocksList, используется в потоке обработки Pug.
* Крива и безрука, ибо требует существования глобальных переменных, с которыми работает.
* @param {object} file Обрабатываемый файл * @param {object} file Обрабатываемый файл
* @param {string} enc Кодировка * @param {string} enc Кодировка
* @param {Function} cb Коллбэк * @param {Function} cb Коллбэк
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment