Skip to content

Conversation

@Mihail3141
Copy link

@tripples25
Идея решения:

  1. Разбить текст на блоки (заголовки и абзацы)
  2. Блоки разбить на токены
  3. Из токенов собрать lineNode - промежуточное представление текста
  4. Преобразовать lineNode в HTML

@Mihail3141 Mihail3141 changed the title Предварительный вариант Markdown Копытов Михаил Nov 5, 2025
IEnumerable<Block> SplitToBlocks(string text);
}

public class BlockProcessor : IBlockProcessor

Choose a reason for hiding this comment

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

Как этот класс будет понимать на какие блоки ему нужно разбивать текст?

Copy link
Author

Choose a reason for hiding this comment

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

Да, решил убрать блоки

{
}

public Md(BlockProcessor blockProcessor, TokenProcessor tokenProcessor, Parser parser,

Choose a reason for hiding this comment

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

Все классы которые принимаются внутри конструктора имеют интерфейсы. Корректным способом взаимодействия будет через них.

private readonly Parser parser;
private readonly HtmlRenderer htmlRenderer;

public Md()

Choose a reason for hiding this comment

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

Зачем нужен пустой конструктор?

public string Render(string markdownText)
{
var blocks = blockProcessor.SplitToBlocks(markdownText);
var renderedBlocks = new List<string>();

Choose a reason for hiding this comment

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

Почему для этого используется список строк? Нет ли класса который подойдёт лучше для этой задачи?


namespace Markdown;

public class Block

Choose a reason for hiding this comment

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

Сейчас Block(который по сути не имеет смысла сам по себе) может быть инициализирован. Может это должно быть какой-то другой сущностью? Почему тут к примеру не использовал интерфейс?


namespace Markdown;

public class LineNode

Choose a reason for hiding this comment

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

Аналогичная проблема с тем что это никакого смысла не имеющий класс. Он не показывает общую их структуру.

public class LinkNode : LineNode
{
public string Href;
public List<LineNode> Label;

Choose a reason for hiding this comment

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

Почему у LinkNode есть какие-то дочерние элементы? Насколько я понимаю у него должен быть текст+ссылка и всё

@@ -0,0 +1,14 @@
namespace Markdown;

public interface IRenderer

Choose a reason for hiding this comment

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

А точно ли это должен быть интерфейс, а не к примеру, абстрактный класс? Если я правильно понимаю, то у этого обработчика в целом не сильно должна меняться логика в зависимости от того, в какую разметку мы переводим. Что думаешь?

public List<LineNode> Children;
}

public class LinkNode : LineNode

Choose a reason for hiding this comment

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

Есть LinkNode, но нет соответствующего токена. Почему?

Ну а ещё, не находишь неудобным, что если добавляешь новый тип тега, то придётся - cоздать новый TokenType/Block, создать новый LinkNode, засунуть куда-то логику по их взаимодействию(пока вообще не понятно, как конкретные ноды будут понимать, как они будут взаимодействовать с другими нодами).

{
}

public Md(BlockProcessor blockProcessor, TokenProcessor tokenProcessor, Parser parser,

Choose a reason for hiding this comment

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

Предлагаю здесь заиспользовать DI. Лучше использовать стандартный от Microsoft. Почитай доку по тому как это делать

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