Задача будет полезна фронтендерам, которые владеют Node.js и работают с веб-приложениями на CMS.
Условие
Наш проект работает на технологии Nuxt 2 с применением SSR, также есть есть админка на WordPress.
Редактор поставил нам задачу на поиск всех страниц с символом «™». Так как контент для страниц находится не только в файловой системе, но и админке, необходимо сделать локальный билд.
Обязательное условие: нужно подготовить список ссылок, который можно приложить к задаче, поэтому обычный глобальный поиск в редакторе кода нам не подходит.
Задача
Соберите список страниц, на которых встречается символ «™».
Решение
Рекурсивный поиск файлов
Для начала создаем функцию, способную пройтись по всем файлам и обнаружить вхождения строк «™» . Для этого мы используем рекурсивную функцию getFiles.
const getFiles = function (dir, files_) {
files_ = files_ || [];
const files = fs.readdirSync(dir);
for (let i in files){
let path = dir + '/' + files[i];
if (fs.statSync(path).isDirectory()){
getFiles(path, files_);
} else {
const withoutExtension = files[i].slice(0, -4);
files_.push({name: withoutExtension, path: path});
}
}
return files_;
};
Анализ содержимого файлов
Создаем функцию findUsages. Она будет проверять, содержит ли файл необходимые символы.
const firstString = '™'
const secondString = '™'
function findUsages(filePath) {
let wasFound = false
const file = fs.readFileSync(filePath, "utf-8");
const fileArr = file.split('\n');
for (let i = 0; i <= fileArr.length - 1; i++) {
if (fileArr[i].indexOf(firstString) > -1 || fileArr[i].indexOf(secondString) > -1 ) {
wasFound = true;
break;
}
}
return wasFound;
}
Автоматизация процесса сбора данных
Передаем в getFiles путь до собранного проекта. Находим и запоминаем файлы, в которых нашли вхождения «™», в массив matchedData.
const matchedData = []
const files = getFiles('dist')
files.forEach(item => {
if (findUsages(item.path)) {
matchedData.push(item)
}
})
Затем формируем список ссылок в формате https://selectel.ru/${адрес_страницы} на страницы, где обнаружены искомые символы, и сохраняем их в файл ‘searchResult.txt’. Также удаляем ненужную подстроку ‘index.html’.
const links = matchedData.map(item => {
let link = `https://selectel.ru/${item.path.slice(5)}`
if (item.path.indexOf('index.html') > -1) {
link = link.slice(0, -10)
}
return link
})
fs.appendFile('searchResult.txt', JSON.stringify(links), function (err) {
if (err) throw err;
});
Последние штрихи
Открываем получившийся файл и видим, что формат неудобно использовать.
Заменяем символы «“,”» на символ новой строки «\n» с использованием функциональности, представленной текстовым редактором. Это действие позволяет размещать каждую ссылку в отдельной строке для улучшения читаемости и структурирования информации.
Фильтруем данные: удаляем неверные записи, невалидные ссылки и символы, такие как кавычки в начале и в конце файла.
Копируем полученный результат и вставляем его в Google Docs. Передаем данные заказчику.
Хотя этот код может содержать недочеты, он справляется с задачей. Автоматизация процесса поиска файлов и анализа их содержимого помогает оптимизировать работу и сэкономить время.