Skip to content
Open

1-6 #46

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
14 changes: 7 additions & 7 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 All @@ -56,7 +56,7 @@

Примеры команд: `sort importance`, `sort user`, `sort date`

6. \* Научись обрабатывать команду:
-6. \* Научись обрабатывать команду:

```
date {yyyy[-mm[-dd]]}: показывает все комментарии, созданные после переданной даты.
Expand All @@ -66,7 +66,7 @@

Примеры команд: `date 2015`, `date 2016-02`, `date 2018-03-02`.

7. \* Научись выводить результаты в консоль в виде таблицы:
-7. \* Научись выводить результаты в консоль в виде таблицы:

- каждая строка отображает один комментарий
- у таблицы должно быть четыре колонки: важность, пользователь, дата, комментарий
Expand Down
12 changes: 12 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script src="index.js"></script>
</body>
</html>
169 changes: 159 additions & 10 deletions index.js
Original file line number Diff line number Diff line change
@@ -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;i<inputDate.length;i++){
if(inputDate[i]>lineDate[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!