From 2c0fc456dfa5dab7c16a5ec83c918926559dd56d Mon Sep 17 00:00:00 2001 From: philya71828 Date: Thu, 12 Aug 2021 18:02:09 +0500 Subject: [PATCH 1/3] Task done 1-5 --- .vscode/launch.json | 17 +++++++ index.js | 105 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2955dcf --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // Используйте IntelliSense, чтобы узнать о возможных атрибутах. + // Наведите указатель мыши, чтобы просмотреть описания существующих атрибутов. + // Для получения дополнительной информации посетите: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Запустить программу", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}\\index.js" + } + ] +} \ No newline at end of file diff --git a/index.js b/index.js index 8635050..f1e85f1 100644 --- a/index.js +++ b/index.js @@ -6,16 +6,36 @@ const files = getFiles(); console.log('Please, write your command!'); readLine(processCommand); -function getFiles() { +function getFiles () { const filePaths = getAllFilePathsWithExtension(process.cwd(), 'js'); return filePaths.map(path => readFile(path)); } -function processCommand(command) { +function processCommand (command) { + // Разбор команды + let parametr = ''; + let i = command.indexOf(' '); + if (i > -1) + { + parametr = command.substring(i).trim(); + command = command.substring(0, i); + } switch (command) { case 'exit': process.exit(0); break; + case 'show': + console.log(Comment()); + break; + case 'important': + console.log(Comment().filter(elem => elem.includes('!'))); + break; + case 'user': + console.log(getUser(parametr)); + break; + case 'sort': + console.log(getSort(parametr)) + break; default: console.log('wrong command'); break; @@ -23,3 +43,84 @@ function processCommand(command) { } // TODO you can do it! +function Comment () +{ + let filesTODO = new Array(); + let temp = []; + // Разбиваем каждый файл (элемент files) на строки и отбираем те, что содержат комментарии. + // Результат добавляем в filesTODO + files.forEach(element => + { + temp = element.split('\r\n').filter(element => element.includes('// TODO ')); + // Очищаем комментарии — удаляем текст в строке до комментария и команду с TODO + temp.forEach(elem => + { + let i = elem.indexOf('// TODO '); + if (i === 0) filesTODO.push(elem); + else if (elem[i - 1] !== '\'') // Не берем строки с командами, содержащими TODO + filesTODO.push(elem.substring(i)); + }); + }); + return filesTODO; +} + +function getUser (parametr) +{ + let retArr = new Array(); + // Рассмотрим поочередно все комментарии TODO + Comment().forEach (elem => + { + // Разбиваем строку на три части: имя, дата и сам комментарий + let s = elem.slice(8).split(';'); + // Если значения регистронезависимых имени пользователя и параметра совпадают + // и пользователь не является безымянным + if ((s[0].toLowerCase().trim() === parametr.toLowerCase()) && (s.length != 1)) + retArr.push(elem); // Добавляем результат к retArr + }); + return retArr; +} + +function getSort (parametr) +{ + let retArr = Comment(); + // Сортируем комментарии TODO + retArr.sort(function(a, b) + { + if (parametr === 'importance') // По восклицательным знакам + { + // Вычисляем количество воскл. знаков в каждом элементе + let m = a.split('').filter(e => e == '!').length; + let n = b.split('').filter(e => e == '!').length; + // Сравниваем полученные количества + if (n > m) return 1; + if (n == m) return 0; + if (n < m) return -1; + } + // Разбиваем каждую строку на три части: имя пользователя, дата и сам комментарий + let p = a.slice(8).split(';'); + let q = b.slice(8).split(';'); + // Если одна из строк не содержит имени пользователя и дату + if (p.length == 1 || q.length == 1) return 1; + if (parametr === 'user') // По имени пользователя + { + // Вычисляем строки с регистронезависимыми именами + let u = p[0].toLowerCase().trim(); + let v = q[0].toLowerCase().trim(); + // Сравниваем полученные строки + if (u > v) return 1; + if (u === v) return 0; + if (u < v) return -1; + } + if (parametr === 'date') // По дате + { + // Вычисляем строки с датами + let u = p[1].trim(); + let v = q[1].trim(); + // Сравниваем полученные строки + if (v > u) return 1; + if (v === u) return 0; + if (v < u) return -1; + } + }); + return retArr; +} \ No newline at end of file From 3a726bd2b921a258597cd43651bcce9455d80c02 Mon Sep 17 00:00:00 2001 From: philya71828 Date: Sun, 15 Aug 2021 14:28:56 +0500 Subject: [PATCH 2/3] Task done --- index.js | 179 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 142 insertions(+), 37 deletions(-) diff --git a/index.js b/index.js index f1e85f1..7226bfe 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,6 @@ const {getAllFilePathsWithExtension, readFile} = require('./fileSystem'); const {readLine} = require('./console'); +const path = require('path'); const files = getFiles(); @@ -8,7 +9,8 @@ readLine(processCommand); function getFiles () { const filePaths = getAllFilePathsWithExtension(process.cwd(), 'js'); - return filePaths.map(path => readFile(path)); + // Добавили имя файла в возвращаемый массив + return filePaths.map(pathArr => [readFile(pathArr), path.basename(pathArr)]); } function processCommand (command) { @@ -20,21 +22,25 @@ function processCommand (command) { parametr = command.substring(i).trim(); command = command.substring(0, i); } - switch (command) { + switch (command) + { case 'exit': process.exit(0); break; case 'show': - console.log(Comment()); + console.log(getTab(getInf())); break; case 'important': - console.log(Comment().filter(elem => elem.includes('!'))); + console.log(getTab(getInf().filter(e => e[0] > 0))); break; case 'user': - console.log(getUser(parametr)); + console.log(getTab(getUser(parametr))); break; case 'sort': - console.log(getSort(parametr)) + console.log(getTab(getSort(parametr))); + break; + case 'date': + console.log(getTab(getDate(parametr))); break; default: console.log('wrong command'); @@ -51,76 +57,175 @@ function Comment () // Результат добавляем в filesTODO files.forEach(element => { - temp = element.split('\r\n').filter(element => element.includes('// TODO ')); + temp = element[0].split('\r\n').filter(element => element.includes('// TODO ')); // Очищаем комментарии — удаляем текст в строке до комментария и команду с TODO temp.forEach(elem => { let i = elem.indexOf('// TODO '); - if (i === 0) filesTODO.push(elem); + if (i === 0) filesTODO.push([elem, element[1]]); else if (elem[i - 1] !== '\'') // Не берем строки с командами, содержащими TODO - filesTODO.push(elem.substring(i)); + filesTODO.push([elem.substring(i), element[1]]); // 0 - комментарий, 1 - имя файла }); }); - return filesTODO; + return filesTODO; } +// ФИЛЬТР КОММЕНТАРИЕВ ПО УКАЗАННОМУ ИМЕНИ ПОЛЬЗОВАТЕЛЯ function getUser (parametr) { let retArr = new Array(); - // Рассмотрим поочередно все комментарии TODO - Comment().forEach (elem => + getInf().forEach (e => { - // Разбиваем строку на три части: имя, дата и сам комментарий - let s = elem.slice(8).split(';'); - // Если значения регистронезависимых имени пользователя и параметра совпадают - // и пользователь не является безымянным - if ((s[0].toLowerCase().trim() === parametr.toLowerCase()) && (s.length != 1)) - retArr.push(elem); // Добавляем результат к retArr + if ((e[1].toLowerCase() === parametr.toLowerCase())) + retArr.push(e); }); return retArr; } +// СОРТИРОВКА КОММЕНТАРИЕВ function getSort (parametr) { - let retArr = Comment(); - // Сортируем комментарии TODO + let retArr = getInf(); retArr.sort(function(a, b) { if (parametr === 'importance') // По восклицательным знакам { - // Вычисляем количество воскл. знаков в каждом элементе - let m = a.split('').filter(e => e == '!').length; - let n = b.split('').filter(e => e == '!').length; - // Сравниваем полученные количества + let m = a[0]; + let n = b[0]; if (n > m) return 1; if (n == m) return 0; if (n < m) return -1; } - // Разбиваем каждую строку на три части: имя пользователя, дата и сам комментарий - let p = a.slice(8).split(';'); - let q = b.slice(8).split(';'); - // Если одна из строк не содержит имени пользователя и дату - if (p.length == 1 || q.length == 1) return 1; if (parametr === 'user') // По имени пользователя { - // Вычисляем строки с регистронезависимыми именами - let u = p[0].toLowerCase().trim(); - let v = q[0].toLowerCase().trim(); - // Сравниваем полученные строки + let u = a[1].toLowerCase(); + let v = b[1].toLowerCase(); + if ((u == '') || (v == '')) return 0; if (u > v) return 1; if (u === v) return 0; if (u < v) return -1; } if (parametr === 'date') // По дате { - // Вычисляем строки с датами - let u = p[1].trim(); - let v = q[1].trim(); - // Сравниваем полученные строки + let u = a[2]; + let v = b[2]; if (v > u) return 1; if (v === u) return 0; if (v < u) return -1; } }); return retArr; +} + +// ФИЛЬТР КОММЕНТАРИЕВ ПО УКАЗАННОЙ ДАТЕ +function getDate (parametr) +{ + let retArr = new Array(); + let p = parametr.split('-'); + getInf().forEach(e => + { + if (e[2] != '') // Если не указана дата + { + let s = e[2].split('-'); + if (Number(p[0]) === Number(s[0])) // Сравниваем годы + { + if (p.length == 1) + retArr.push(e); + else if (Number(p[1]) === Number(s[1])) // Сравниваем месяцы + { + if (p.length == 2) + retArr.push(e); + else if (Number(p[2]) === Number(s[2])) // Сравниваем дни + retArr.push(e); + } + } + } + }); + return retArr; +} + +// РАЗБИВКА КОММЕНТАРИЯ НА 5 ЧАСТЕЙ: +// кол-во воскл. знаков, имя пользователя, дата, сам комментарий, имя файла +function getInf () +{ + let retArr = new Array(); + Comment().forEach(elem => + { + // Получаем массив из имени пользователя, даты и комментария + let s = elem[0].slice(8).split(';'); + // Добавляем к началу массива новый элемент — кол-во восклицательных знаков + s.unshift(elem[0].split('').filter(e => e == '!').length); + if (s.length == 2) // Если комментарий не включает имя пользователя и дату + { + s[4] = elem[1]; + s[3] = s[1].trim(); + s[1] = ''; + s[2] = ''; + } + else + { + s[1] = s[1].trim(); // Имя пользователя + s[2] = s[2].trim(); // Дата + s[3] = s[3].trim(); // Комментарий + s[4] = elem[1]; // Имя файла + } + retArr.push(s); + }); + return retArr; +} + +// ВЫВОД РЕЗУЛЬТАТОВ В КОНСОЛЬ В ВИДЕ ТАБЛИЦЫ +function getTab (arr) +{ + let retArr = ''; + let n = 4; // Размер самого длинного имени пользователя + let c = 7; // Размер самого длинного комментария + let f = 4; // Размер самого длинного имени файла + arr.forEach (e => + { + if (e[1].length > n) // Ищем самое длинное имя пользователя + { + if (e[1].length <= 10) // Если длина не больше макс. возможной + n = e[1].length; + else n = 10; + } + if (e[3].length > c) // Ищем самый длинный комментарий + { + if (e[3].length <= 50) // Если длина не больше макс. возможной + c = e[3].length; + else c = 50; + } + if (e[4].length > f) // Ищем самое длинное имя файла + f = e[4].length; + }); + // Добавляем в таблицу заголовое + retArr += '\n! | user' + ' '.repeat(n - 4) + ' | date' + ' '.repeat(6) + ' | comment' + ' '.repeat(c - 7) + ' | file'; + // Отделяем заголовое от остальной части таблицы + retArr += '\n' + '-'.repeat(n + c + f + 31); + // Заполняем таблицу + arr.forEach (e => + { + let s0; // + if (e[0] == 0) + s0 = ' '; + else s0 = '!'; + let s1; // Имя пользователя + if (e[1].length <= 10) + s1 = e[1] + ' '.repeat(n - e[1].length); + else + s1 = e[1].slice(0, 9) + '…'; + let s2 = e[2]; // Дата + if (s2 == '') + s2 += ' '.repeat(10); + let s3; // Комментарий + if (e[3].length <= 50) + s3 = e[3] + ' '.repeat(c - e[3].length); + else + s3 = e[3].slice(0, 49) + '…'; + let s4 = e[4] + ' '.repeat(f - e[4].length); // Имя файла + // Добавляем строку + retArr += '\n' + s0 + ' | ' + s1 + ' | ' + s2 + ' | ' + s3 + ' | ' + s4; + }); + retArr += '\n' + '-'.repeat(n + c + f + 31); + return retArr; } \ No newline at end of file From 666aeca881fc10b42d1b44589b34c5220cea2959 Mon Sep 17 00:00:00 2001 From: philya71828 Date: Sun, 15 Aug 2021 14:34:56 +0500 Subject: [PATCH 3/3] Task done --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 7226bfe..1ccc46b 100644 --- a/index.js +++ b/index.js @@ -205,7 +205,7 @@ function getTab (arr) // Заполняем таблицу arr.forEach (e => { - let s0; // + let s0; // Восклицательный знак if (e[0] == 0) s0 = ' '; else s0 = '!';