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

Косторной Дмитрий #238

Open
wants to merge 16 commits into
base: master
Choose a base branch
from

Conversation

Kostornoj-Dmitrij
Copy link

No description provided.

"<h1>Заголовок 1</h1>\n<h2>Заголовок 2</h2>",
TestName = "MultipleHeaders")]

public void Md_ShouldRender_When(string input, string expected)
Copy link

@shiyois shiyois Nov 26, 2024

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_ - внутри одинарного двойное не работает


public Md()
{
renderer = new HtmlRenderer();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

html renderer захардкожен, что если понадобиться отрисовать xml?
предлагаю выделить интерфейс отрисовщика и передавать реализацию в конструкторе

Copy link

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
Copy link

@shiyois shiyois Nov 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Огромный, трудночитаемый и плохо расширяемый класс
Реализация не удовлетворяет требованию на полное решение: Решение разбито на составные части, каждая из которых легко читается

Copy link

@shiyois shiyois Nov 26, 2024

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)
Copy link

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)
Copy link

@shiyois shiyois Nov 26, 2024

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);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Выглядит страшно :)
Предлагаю использовать TestCaseSource, метод принимал бы список токенов и просто сравнивал полученный и ожидаемый результат

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants