-
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
Косторной Дмитрий #238
base: master
Are you sure you want to change the base?
Косторной Дмитрий #238
Conversation
"<h1>Заголовок 1</h1>\n<h2>Заголовок 2</h2>", | ||
TestName = "MultipleHeaders")] | ||
|
||
public void Md_ShouldRender_When(string input, string expected) |
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.
Не проходят следующие тест кейсы по спецификации:
_e\\_
- экранирование экранирования
# h __s _E _e_ E_ s__ _e_
- большая вложенность
_e __s e_ s__
- в случае пересечения двойных и одинарных подчерков ни один из них не считается выделением
en_d._
, mi__dd__le
, _sta_rt
- подчерки внутри текста могут выделять часть слова
__s \n s__
, _e \r\n e_
- абзацы
_e __e
- непарные символы в рамках одного абзаца не считаются выделением
_e __s__ e_
- внутри одинарного двойное не работает
cs/Markdown/Md.cs
Outdated
|
||
public Md() | ||
{ | ||
renderer = new HtmlRenderer(); |
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 renderer захардкожен, что если понадобиться отрисовать xml?
предлагаю выделить интерфейс отрисовщика и передавать реализацию в конструкторе
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.
то же самое про MarkdownParser
реализация прибита, переиспользовать не получится
|
||
namespace Markdown.Parsers; | ||
|
||
public abstract class MarkdownParser |
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.
Можно попробовать начать с выделения отдельных классов ответственные за обработку определённого токена токенов
var next = context.CurrentIndex + 1 < context.MarkdownText.Length ? | ||
context.MarkdownText[context.CurrentIndex + 1] : '\0'; | ||
|
||
switch (current) |
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 уже выглядит громоздким, а что если понадобиться добавить новые токены? При добавлении нового типа токена придётся ручками добавить здесь его обработку.
Предлагаю завести список обработчиков токенов. Итеративно пытаемся распарсить токен с помощью разных обработчиков, если получилось, то сохраняем токен
return result.ToString(); | ||
} | ||
|
||
private void RenderToken(Token token, StringBuilder result) |
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.
Можно воспользоваться фабричным метом. На каждый тип возвращать соответствующий ITokenConverter.
Избавимся от громоздкого switch, сможем переиспользовать при добавлении нового Renderer-а в будущем
tokens[0].Children[0].Type.Should().Be(TokenType.Text); | ||
tokens[0].Children[0].Content.Should().Be("Заголовок "); | ||
tokens[0].Children[1].Type.Should().Be(TokenType.Strong); | ||
tokens[0].Children[1].Children[0].Type.Should().Be(TokenType.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.
Выглядит страшно :)
Предлагаю использовать TestCaseSource, метод принимал бы список токенов и просто сравнивал полученный и ожидаемый результат
No description provided.