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

Брозовский Максим #234

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

Conversation

BMV989
Copy link

@BMV989 BMV989 commented Nov 24, 2024

No description provided.


namespace Markdown;

public interface IConverter

Choose a reason for hiding this comment

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

Конвертер чего?

Comment on lines 8 to 9
bool IsOpenedCorrectly((char left, char right) contextChars);
bool IsClosedCorrectly((char left, char right) contextChars);

Choose a reason for hiding this comment

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

Выдели мб отдельную модельку под это? Таплы передавать публично плохая практика. У тебя уже два места, где одна и та же модель используется. При изменении одно из этих мест надо отдельно помнить и о другом

@@ -0,0 +1,12 @@
namespace Markdown.Tags;

public abstract class PairTag : ITag

Choose a reason for hiding this comment

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

Чет не отразил чем отличается от одинарного

Choose a reason for hiding this comment

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

И как определяем закрываюищий тег?

Copy link
Author

@BMV989 BMV989 Nov 25, 2024

Choose a reason for hiding this comment

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

для MdTag добавил, а HtmlTag там симметричный, т.е. <HtmlTag></HtmlTag>

Copy link
Author

@BMV989 BMV989 Nov 25, 2024

Choose a reason for hiding this comment

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

Чет не отразил чем отличается от одинарного

Главное отличие в том, что у одинарного не будет закрвающего MdTag и он действует на всю строчку, а для HtmlTag мы делаем как в коментарии выше - симметрично

Copy link
Author

Choose a reason for hiding this comment

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

Но там тоже могут быть особые случаи типа <img> тега....

Copy link
Author

Choose a reason for hiding this comment

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

но мне кажется это уже отвественность IMdConverter, как он будет эти токены укладывать в строку


namespace Markdown.Tokens;

public class TagToken(ITag tag, char left, char right) : IToken

Choose a reason for hiding this comment

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

А почему char? Например, __ - это два подчеркивания.

@@ -0,0 +1,9 @@
namespace Markdown.Tags;

public class ItalicTag : PairTag, ITag

Choose a reason for hiding this comment

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

А зачем интерфейс еще раз указывать?

Copy link

@HELLoWorlD01100 HELLoWorlD01100 left a comment

Choose a reason for hiding this comment

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

  • Папку Tags можно тоже спокойно переносить в папку Models


namespace Markdown.Tags;

public class SingleMdTagKind(string mdTagKind, string htmlOpenTag, string htmlCloseTag) : IMdTagKind

Choose a reason for hiding this comment

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

Чет не вижу прикола использовать такой конструктор конкретно тут:
Приходится отдельно поля в свойства прописывать, значения в двух местах "хранятся по итогу". В поле и в свойстве.

public IMdTagKind Tag => mdTagKind;
public int Position { get; private set; } = position;

public Token(string value) : this(value, value.Length, new SingleMdTagKind())

Choose a reason for hiding this comment

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

Логика работы(что мы изначально берем весь текст как токен) протекает в абстракцию

[TestCase(100, 10)]
[TestCase(100, 100)]
[TestCase(100, 1000)]
public void Render_ShouldWorkLinearly(int times, int inputScale)

Choose a reason for hiding this comment

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

Правила, что реальное время несоотносится со сложностью,- нету. Более того, у тебя в зависимости от железа это время будет отличаться. А тогда мы приходим к тому, что у тебя тесты начинают плавающе работать. У меня они пойдут, у другого человека нет, в CI/CD в зависимости от тачки будут работать или не работать.

Получим хаос :)

Comment on lines +43 to +72
public static IEnumerable<TestCaseData> ConvertTagsTests
{
get
{
yield return new TestCaseData(
$"# Заголовок{Environment.NewLine}#Заголовок", $"<h1> Заголовок</h1>{Environment.NewLine}<h1>Заголовок</h1>")
.SetName("Render_ShouldConvertHeaderTag")
.SetCategory(nameof(ConvertTagsTests));
yield return new TestCaseData(
$"_курсивный текст_{Environment.NewLine}_курсивный текст_",
$"<em>курсивный текст</em>{Environment.NewLine}<em>курсивный текст</em>")
.SetName("Render_ShouldConvertItalicTag")
.SetCategory(nameof(ConvertTagsTests));
yield return new TestCaseData(
$"__полужирный текст__{Environment.NewLine}__полужирный текст__",
$"<strong>полужирный текст</strong>{Environment.NewLine}<strong>полужирный текст</strong>")
.SetName("Render_ShouldConvertBoldTag")
.SetCategory(nameof(ConvertTagsTests));
yield return new TestCaseData(
"_чем\\_ 100_ __раз_ услышать.__",
"_чем_ 100_ __раз_ услышать.__")
.SetName("Render_ShouldConvertEscapeTag")
.SetCategory(nameof(ConvertTagsTests));
yield return new TestCaseData(
"# Заголовок c _курсивным текстом_ и __полужирным текстом__",
"<h1> Заголовок c <em>курсивным текстом</em> и <strong>полужирным текстом</strong></h1>")
.SetName("Render_ShouldConvertAllTagsInHeader")
.SetCategory(nameof(ConvertTagsTests));
}
}

Choose a reason for hiding this comment

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

Получается слишком громоздко и нечитаемо.
Хотя нас интересуют по существу только Входное значение, Чего ожидаем, Название теста.
Это можно и в TestCase засунуть

$"__Непарные _символы в рамках{Environment.NewLine}одного_ абзаца не считаются__ выделением")
.SetName("Render_ShouldIgnorePairTags_WhenPlacedInMultiLine")
.SetCategory("MdSpec");
yield return new TestCaseData(

Choose a reason for hiding this comment

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

\n и другие спец. символы не работают в соответствии с этим правилом

Comment on lines +27 to +31
public static Token CreateToken(this string text, int startIndex, int stopIndex, IMdTagKind tag)
{
var value = text.Substring(startIndex, stopIndex - startIndex);
return new Token(value, startIndex, tag);
}

Choose a reason for hiding this comment

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

Такое лучше вынести статикой в класс Token или в его конструктор.
У Тебя string - базовый тип. Любой, кто подключит твою библиотеку, бонусом получит мусорный(для него) метод CreateToken.

Либо же его делать internal, но тогда у нас логика по тому как из текста создать токен выносится во вне класса.

return new Token(value, startIndex, tag);
}

public static int GetEndOfLinePosition(this string text, int startIndex = 0)

Choose a reason for hiding this comment

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

У строк нет "позиций". Только индексы

return newLinePosition != -1 ? newLinePosition + Environment.NewLine.Length : text.Length;
}

public static Token CreateEscapeToken(this string text, Tag escapeTag)

Choose a reason for hiding this comment

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

Точно так же, как и с обычным Token'ом

Comment on lines +10 to +15
private readonly List<int> mdLenOfTagSignatures = tags
.Select(tag => tag.MdTag.Length)
.Distinct()
.OrderDescending()
.ToList();

Choose a reason for hiding this comment

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

Какое-то неявное соответствие тега и его длины получается

Comment on lines +14 to +15
public string RemoveMdTags(string text);
public string InsertHtmlTags(string text);

Choose a reason for hiding this comment

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

Как будто это должна быть атомарная операция, но по архитектуре вижу, что просто поменять не получится

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