-
Notifications
You must be signed in to change notification settings - Fork 300
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
Кирилл Зарипов #232
base: master
Are you sure you want to change the base?
Кирилл Зарипов #232
Conversation
return tokens; | ||
} | ||
|
||
private int HandleEscape(string markdown, int index, StringBuilder text) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Он удаляет одиночные \
, так не должно быть)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
return index + count; | ||
} | ||
|
||
private int CountUnderscores(string text, int index) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Попробую описать, что делает метод: Считает идет 1 или 2 _
подряд.
Название CountUnderscores
точно не подходит.
И, кажется, проблема не в названии, а в сути метода. Мне кажется, тут больше подойдет метод, который определяет "что за токен перед нами", в который можно вынести подобную логику.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
|
||
private bool IsDelimiter(char value) => value != '_' && (char.IsLetter(value) || char.IsPunctuation(value)); | ||
|
||
private Token CreateTextToken(string content) => new() { Type = TokenType.Text, Content = content }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Такое можно вынести в сам Token. Или даже лучше в его Extension методы
|
||
private Token CreateTextToken(string content) => new() { Type = TokenType.Text, Content = content }; | ||
|
||
private void CreateTokenPairs(List<Token> tokens, TokenType type, string markdown) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Еще перед прочтением кода - метод капец какой длинный, его тяжело читать. Нужно держать слишком много логики в голове
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
После прочтения - да, слишком много логики.
И switch pattern в комбинации с IsOpening
, IsClosing
добивает это все.
Опять изменение состояний объекта.
Изначально подход сомнительный и не оптимальный, потому что после приходится бегать и удалять "неправильные" пары. Такое обычно делается при помощи КДА
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ДКА интрересная штука, но сейчас уже что есть то есть
cs/Markdown/Program.cs
Outdated
var converter = new HtmlConverter(); | ||
var markdown = new Md(tokenizer, converter); | ||
|
||
const string input = """ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Советы категории Б: можешь вынести эту строчку в константу, чтобы потом, при добавлении новых примеров, можно было легко между ними переключаться :)
const string firstExample = "This _is_ a __sample__ markdown _file_.\n";
const string secondExample = "#This is another __sample__ markdown _file_";
var input = firstExample;
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А еще давай сюда буду накидывать, в каких случаях все ломается:
___Some Text___
- должно стать<strong><em>Some</strong></em>
__Some_
- должно стать_<em>Some</em>
Some_Another_Text
- не должно измениться123\456
- не должно измениться
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
исправил эти случаи
return result; | ||
} | ||
|
||
private bool IsValidDelimiter(string markdown, int index, int length, out bool isOpening, out bool isClosing) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Столько входящих параметров тяжело переварить человеческому мозгу... Точнее, ответить на вопрос: "Зачем для проверки на валидность нужно 5 аргументов"
А еще out
параметры имеются...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
тоже удалил
return index + count; | ||
} | ||
|
||
text.Append(new string('_', count)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
new string('_', count)
дублируется.
Да и я бы сказал, что завязка на _
слишком сильная. Это ведь может быть любой другой символ)
Я, например, обычно использую **Text**
вместо __Text__
. А так md поддерживает и тот, и другой.
Я к тому, что будет тяжело масшабировать
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
переделал в dictionary
if (token.Pair == null) | ||
continue; | ||
|
||
switch (token.Type) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Виднеется закономерность: как только в коде появляется switch/case
он становится менее читаемым.
Как раз для таких вещей придумали полиморфизм)
{ TokenType.Strong, "strong" }, | ||
}; | ||
|
||
public string Convert(List<Token> tokens) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Давай принимать обобщенные типы)
В этом случае вообще IEnumerable достаточно
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
html.Append(token.Type switch | ||
{ | ||
TokenType.Text => token.Content, | ||
TokenType.Italic or TokenType.Strong when token.Pair != null => |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Нарушение SRP. Класс должен нагенерить html по входным данным, а он еще что-то проверяет
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
убрал проверку
@w1jtoo