Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ФТ 201, Джевелло Алексей, Воронин Арсений #145

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,27 @@

Сейчас он знает только команду `exit`, остальные нужно дописать тебе.

1. Получи из всех файлов все однострочные комментарии, начинающиеся с `TODO`. Все комментарии имеют одинаковое начало: два слеша, пробел, слово `TODO` капсом, снова пробел и дальше текст комментария. Например:
1. + Получи из всех файлов все однострочные комментарии, начинающиеся с `TODO`. Все комментарии имеют одинаковое начало: два слеша, пробел, слово `TODO` капсом, снова пробел и дальше текст комментария. Например:

```
// TODO Переделать это!
```

2. Сейчас метод `processCommand` обрабатывает только команду `exit` и завершает процесс в node. Научись обрабатывать еще одну команду из консоли:
2. + Сейчас метод `processCommand` обрабатывает только команду `exit` и завершает процесс в node. Научись обрабатывать еще одну команду из консоли:

```
show : показать все todo
```

Выводить нужно стандартным выводом в консоль `console.log`. Можешь выводить как угодно твоим эстетическим чувствам: можно выводить просто массив в консоль, можно каждый элемент на новой строчке.

3. В комментарии может присутствовать восклицательный знак (!), что означает, что это задача с высоким приоритетом. Научись обрабатывать команду из консоли:
3. + В комментарии может присутствовать восклицательный знак (!), что означает, что это задача с высоким приоритетом. Научись обрабатывать команду из консоли:

```
important : показывать только todo, в которых есть восклицательный знак
```

4. Текст в todo может быть представлен обычным текстом.
4. + Текст в todo может быть представлен обычным текстом.
Или же использовать специальную разметку: `// TODO {Имя автора}; {Дата комментария}; {текст комментария}`
После имени и даты обязательно ставится точка с запятой, а вот пробел между ними не обязателен.
Научись обрабатывать еще одну команду из консоли:
Expand All @@ -40,7 +40,7 @@
Причем имя пользователя должно быть регистронезависимо.
Пример команды: `user veronika`

5. Научись обрабатывать команды
5. + Научись обрабатывать команды

```
sort {importance | user | date} : выводит отсортированные todo
Expand Down
106 changes: 105 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,115 @@ function getFiles() {
return filePaths.map(path => readFile(path));
}

function getToDO(){
let res = []
let lines = getFiles();

for (let q = 0; q < lines.length; q++){
let txt = lines[q].split(/$/m);
//console.log(txt);
for (let i = 0; i < txt.length; i++) {
let ind = txt[i].indexOf("// " + "TODO");
if (ind != -1) {
//console.log(txt[i]);
res.push(txt[i].slice(ind+8));
}
}
}
return res
}

function getImportant(comments){
let res = [];
for (let i = 0; i < comments.length; i++){
if (comments[i].indexOf('!') != -1){
res.push(comments[i])
}
}
return res;
}

function compareImportant(a, b){
return b.split('!').length - a.split('!').length;
}

function sortByImportance(comments){
comments.sort(compareImportant);
return comments;
}

function getDate(x){
if (x.split(';').length != 3) {
return "";
}
else{
let date = x.split(';')[1];
return date;
}
}

function sortByDate(comments){
comments.sort((a, b) => getDate(b).localeCompare(getDate(a)));
return comments;
}

function getName(x){
if (x.split(';').length < 2) {
return "";
}
else{
let name = x.split(';')[0];
return name;
}
}

function sortByName(comments){
comments.sort((a, b) => getName(a).localeCompare(getName(b)));
return comments;
}


function getTodoByUser(username) {
const usernameLower = username.toLowerCase();
const regex = /\s*(.*)\s*;\s*(.*)\s*;\s*(.*)/;
let todos = getToDO();
todos = todos.map(v => v.match(regex));
todos = todos.filter(match => match !== null && match[1].toLowerCase() === usernameLower);
todos = todos.map(g => g[0]);
return todos;
}

function processCommand(command) {
switch (command) {
const stringCommand = String(command);
const commandPrefix = command.split(' ')[0];
switch (commandPrefix) {
case 'important':
console.log(getImportant(getToDO()));
break;
case 'user':
const username = stringCommand.slice(5).toLowerCase();
console.log(getTodoByUser(username));
break;
case 'sort':
const command = stringCommand.slice(5).toLowerCase();
switch (command){
case 'importance':
console.log(sortByImportance(getToDO()));
break
case 'date':
console.log(sortByDate(getToDO()));
break
case 'user':
console.log(sortByName(getToDO()));
break;

}
case 'exit':
process.exit(0);
break;
case 'show':
console.log(getToDO());
break;
default:
console.log('wrong command');
break;
Expand Down
8 changes: 8 additions & 0 deletions testingSomething.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
let test = '// ' + 'TODO Имя автора; Дата комментария; текст комментария'

regex = /\/\/ TODO\s*(.*)\s*;\s*(.*)\s*;\s*(.*)/;

let something = test.match(regex);
console.log(something[1]);
console.log(something == null);