79
indexer/PresetsFolder.js
Normal file
79
indexer/PresetsFolder.js
Normal file
@@ -0,0 +1,79 @@
|
||||
'use strict';
|
||||
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const PresetsFile = require('./PresetsFile');
|
||||
|
||||
class PresetsFolder
|
||||
{
|
||||
constructor(fullPath, settings, presetFilesArray, errors)
|
||||
{
|
||||
this.subFolders = [];
|
||||
this.files = [];
|
||||
this.fullPath = fullPath;
|
||||
this.name = "";
|
||||
|
||||
let list = fs.readdirSync(fullPath);
|
||||
|
||||
list.forEach((fileName) => {
|
||||
const fullFileName = fullPath + '/' + fileName;
|
||||
const stat = fs.statSync(fullFileName);
|
||||
if (!fileName.startsWith(".")) {
|
||||
if (stat && stat.isDirectory()) {
|
||||
let subdir = new PresetsFolder(fullFileName, settings, presetFilesArray, errors);
|
||||
subdir.name = fileName;
|
||||
this.subFolders.push(subdir);
|
||||
} else if (fileName.toLowerCase().endsWith(".txt")) {
|
||||
let presetsFile = new PresetsFile(fullFileName, settings, errors);
|
||||
presetFilesArray.push(presetsFile);
|
||||
this.files.push(presetsFile);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static checkForIncludeLoops(presetFilesArray, errors)
|
||||
{
|
||||
const filesDb = PresetsFolder._createFilesDictionary(presetFilesArray);
|
||||
const fileNameErrors = {};
|
||||
|
||||
presetFilesArray.forEach((file) => {
|
||||
const parents = [];
|
||||
PresetsFolder._checkFileForIncludeLoops(file, filesDb, parents, fileNameErrors);
|
||||
});
|
||||
|
||||
for (const fileNameError in fileNameErrors) {
|
||||
const errorText = `File ${fileNameError}, takes part in the #$ INCLUDE loop'`;
|
||||
errors.push(errorText);
|
||||
console.error(errorText);
|
||||
}
|
||||
}
|
||||
|
||||
static _checkFileForIncludeLoops(file, filesDb, parents, fileNameErrors)
|
||||
{
|
||||
if (parents.includes(file.fullPath)) {
|
||||
fileNameErrors[file.fullPath] = true;
|
||||
} else {
|
||||
parents.push(file.fullPath);
|
||||
if (file.hasOwnProperty("include")) {
|
||||
file.include.forEach((includedFileName) => {
|
||||
const clonedParents = [...parents];
|
||||
PresetsFolder._checkFileForIncludeLoops(filesDb[includedFileName], filesDb, clonedParents, fileNameErrors);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static _createFilesDictionary(presetFilesArray)
|
||||
{
|
||||
let result = {};
|
||||
|
||||
presetFilesArray.forEach((file) => {
|
||||
result[file.fullPath] = file;
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = PresetsFolder;
|
||||
Reference in New Issue
Block a user