diff --git a/README.md b/README.md index 0c641fb..effeb3c 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,13 @@ Сейчас он знает только команду `exit`, остальные нужно дописать тебе. -1. Получи из всех файлов все однострочные комментарии, начинающиеся с `TODO`. Все комментарии имеют одинаковое начало: два слеша, пробел, слово `TODO` капсом, снова пробел и дальше текст комментария. Например: +-1. Получи из всех файлов все однострочные комментарии, начинающиеся с `TODO`. Все комментарии имеют одинаковое начало: два слеша, пробел, слово `TODO` капсом, снова пробел и дальше текст комментария. Например: ``` // TODO Переделать это! ``` -2. Сейчас метод `processCommand` обрабатывает только команду `exit` и завершает процесс в node. Научись обрабатывать еще одну команду из консоли: +-2. Сейчас метод `processCommand` обрабатывает только команду `exit` и завершает процесс в node. Научись обрабатывать еще одну команду из консоли: ``` show : показать все todo @@ -22,13 +22,13 @@ Выводить нужно стандартным выводом в консоль `console.log`. Можешь выводить как угодно твоим эстетическим чувствам: можно выводить просто массив в консоль, можно каждый элемент на новой строчке. -3. В комментарии может присутствовать восклицательный знак (!), что означает, что это задача с высоким приоритетом. Научись обрабатывать команду из консоли: +-3. В комментарии может присутствовать восклицательный знак (!), что означает, что это задача с высоким приоритетом. Научись обрабатывать команду из консоли: ``` important : показывать только todo, в которых есть восклицательный знак ``` -4. Текст в todo может быть представлен обычным текстом. +-4. Текст в todo может быть представлен обычным текстом. Или же использовать специальную разметку: `// TODO {Имя автора}; {Дата комментария}; {текст комментария}` После имени и даты обязательно ставится точка с запятой, а вот пробел между ними не обязателен. Научись обрабатывать еще одну команду из консоли: @@ -40,7 +40,7 @@ Причем имя пользователя должно быть регистронезависимо. Пример команды: `user veronika` -5. Научись обрабатывать команды +-5. Научись обрабатывать команды ``` sort {importance | user | date} : выводит отсортированные todo @@ -56,7 +56,7 @@ Примеры команд: `sort importance`, `sort user`, `sort date` -6. \* Научись обрабатывать команду: +-6. \* Научись обрабатывать команду: ``` date {yyyy[-mm[-dd]]}: показывает все комментарии, созданные после переданной даты. @@ -66,7 +66,7 @@ Примеры команд: `date 2015`, `date 2016-02`, `date 2018-03-02`. -7. \* Научись выводить результаты в консоль в виде таблицы: +-7. \* Научись выводить результаты в консоль в виде таблицы: - каждая строка отображает один комментарий - у таблицы должно быть четыре колонки: важность, пользователь, дата, комментарий diff --git a/index.html b/index.html new file mode 100644 index 0000000..44f2d35 --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + \ No newline at end of file diff --git a/index.js b/index.js index 8635050..658f855 100644 --- a/index.js +++ b/index.js @@ -1,25 +1,174 @@ -const {getAllFilePathsWithExtension, readFile} = require('./fileSystem'); -const {readLine} = require('./console'); - +const { getAllFilePathsWithExtension, readFile } = require('./fileSystem'); +const { readLine } = require('./console'); +const { count } = require('console'); + const files = getFiles(); - + console.log('Please, write your command!'); readLine(processCommand); - + function getFiles() { const filePaths = getAllFilePathsWithExtension(process.cwd(), 'js'); return filePaths.map(path => readFile(path)); -} - +}; + function processCommand(command) { - switch (command) { + let commands = command.split(" "); + switch (commands[0]) { case 'exit': process.exit(0); break; - default: - console.log('wrong command'); + case 'show': + console.log(doHeader(toShow())); break; + case 'important': + console.log(doHeader(important())); + break; + case 'user': + console.log(doHeader(user(commands[1]))); + break; + case 'sort': + switch (commands[1]){ + case 'importance': + console.log(doHeader(sortImportance())); + break; + case 'user': + console.log(sortUser()); + case 'date': + console.log(doHeader(sortDate())); + break; + }; + case 'date': + console.log(doHeader(doDate(commands[1]))); + break; + default: + console.log('wrong command'); + break; + } +}; + +function toShow(){ + let lines = []; + for (let file of files) + lines.push(...file.split('\r\n')); + lines = lines.flat(Infinity); + const matches = []; + for (let line of lines) { + let search = line.indexOf(`// TODO`); + if (search != -1) + + matches.push(line.substring(search)); + } + return doTable(matches); +}; + +function important(){ + let importantLines = []; + for (let line of toShow()){ + if (line.includes('!')){ + importantLines.push(line); + } + } + return importantLines; +}; + +function user(name){ + return toShow().filter(line => line.toLowerCase().includes(name.toLowerCase())); +}; + +function sortImportance(){ + return toShow().sort((line1, line2) => line2.split('!').length - line1.split('!').length); +}; + +function sortUser() { + return toShow().sort((x, y) => { + let name1=x.toLowerCase(), name2=y.toLowerCase() + if (x.split("|").length !== 1) { + if (name1 < name2) + return -1 + if (name1 > name2) + return 1 + return 0; + } else if (y.split("|").length === 1) { + return -1; + } else { + return 0; + } + }); +} + +function sortDate() { + return toShow().sort((x, y) => { + let line1 = x.split('|'), line2 = y.split('|'); + if (line1[2].includes('-')&& line2[2].includes('-')) { + if (line1[2] > line2[2]) + return -1; + if (line1[2] < line2[2]) + return 1; + return 0; + } + else if (line2[2].indexOf('-')==-1) { + return -1; + } + else { + return 0; + } + }); +} + +function doDate(date1){ + let res =[]; + let inputDate=date1.split('-'); + listDates= toShow().filter(line=> line.split('|').length>=2); + for(let line of listDates){ + let flag = true; + lineDate= line.split(' | ')[2].split('-'); + for(let i=0;ilineDate[i]){ + flag=false; + } + } + if(flag) { + res.push(line); + } + } + return res; +}; + +function doTable(lines){ + let res=[]; + for (let line of lines){ + let strArr =[]; + let lineSplit = line.split(';'); + if(line.includes('!')) + strArr.push('!'); + else strArr.push(' '); + if (lineSplit.length!=3){ + let a=' '; + strArr.push(a.padEnd(10,' ')); + strArr.push(a.padEnd(11,' ')); + strArr.push(lineSplit[0].split('TODO')[1].substring(0,50).padEnd(50,' ')) + } + if (lineSplit.length==3){ + + strArr.push(lineSplit[0].split('TODO')[1].substring(0,10).padEnd(10,' ')); + strArr.push(lineSplit[1].padEnd(10,' ')); + strArr.push(lineSplit[2].substring(0,50).padEnd(50,' ')); + } + + res.push(strArr.join(' |')); } + return res; +} + +function doHeader(lines){ + let res = ['!','user'.padEnd(10,' '),' date '.padEnd(11,' '),'comment'.padEnd(50,' ')].join(' |'); + let line = ''.padEnd(res.length,'-'); + lines.unshift(line); + lines.push(line); + lines.unshift(res); + return lines; } // TODO you can do it! + \ No newline at end of file