Задача о поиске символов в проекте - Академия Selectel

Задача о поиске символов в проекте

Иван Демидов Иван Демидов Младший фронтенд-разработчик 29 марта 2024

Изображение записи

Задача будет полезна фронтендерам, которые владеют 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. Передаем данные заказчику.

Хотя этот код может содержать недочеты, он справляется с задачей. Автоматизация процесса поиска файлов и анализа их содержимого помогает оптимизировать работу и сэкономить время.

Полезные материалы для обучения