-
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
Брозовский Максим #234
base: master
Are you sure you want to change the base?
Брозовский Максим #234
Conversation
cs/Markdown/IConverter.cs
Outdated
|
||
namespace Markdown; | ||
|
||
public interface IConverter |
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/Tags/ITag.cs
Outdated
bool IsOpenedCorrectly((char left, char right) contextChars); | ||
bool IsClosedCorrectly((char left, char right) contextChars); |
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/Tags/PairTag.cs
Outdated
@@ -0,0 +1,12 @@ | |||
namespace Markdown.Tags; | |||
|
|||
public abstract class PairTag : ITag |
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.
И как определяем закрываюищий тег?
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.
для MdTag добавил, а HtmlTag там симметричный, т.е. <HtmlTag></HtmlTag>
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.
Чет не отразил чем отличается от одинарного
Главное отличие в том, что у одинарного не будет закрвающего MdTag и он действует на всю строчку, а для HtmlTag мы делаем как в коментарии выше - симметрично
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.
Но там тоже могут быть особые случаи типа <img> тега....
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.
но мне кажется это уже отвественность IMdConverter, как он будет эти токены укладывать в строку
cs/Markdown/Tokens/TagToken.cs
Outdated
|
||
namespace Markdown.Tokens; | ||
|
||
public class TagToken(ITag tag, char left, char right) : IToken |
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.
А почему char? Например, __ - это два подчеркивания.
cs/Markdown/Tags/ItalicTag.cs
Outdated
@@ -0,0 +1,9 @@ | |||
namespace Markdown.Tags; | |||
|
|||
public class ItalicTag : PairTag, ITag |
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.
- Папку Tags можно тоже спокойно переносить в папку Models
|
||
namespace Markdown.Tags; | ||
|
||
public class SingleMdTagKind(string mdTagKind, string htmlOpenTag, string htmlCloseTag) : IMdTagKind |
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.
Чет не вижу прикола использовать такой конструктор конкретно тут:
Приходится отдельно поля в свойства прописывать, значения в двух местах "хранятся по итогу". В поле и в свойстве.
public IMdTagKind Tag => mdTagKind; | ||
public int Position { get; private set; } = position; | ||
|
||
public Token(string value) : this(value, value.Length, new SingleMdTagKind()) |
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.
Логика работы(что мы изначально берем весь текст как токен) протекает в абстракцию
[TestCase(100, 10)] | ||
[TestCase(100, 100)] | ||
[TestCase(100, 1000)] | ||
public void Render_ShouldWorkLinearly(int times, int inputScale) |
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.
Правила, что реальное время несоотносится со сложностью,- нету. Более того, у тебя в зависимости от железа это время будет отличаться. А тогда мы приходим к тому, что у тебя тесты начинают плавающе работать. У меня они пойдут, у другого человека нет, в CI/CD в зависимости от тачки будут работать или не работать.
Получим хаос :)
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)); | ||
} | ||
} |
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.
Получается слишком громоздко и нечитаемо.
Хотя нас интересуют по существу только Входное значение, Чего ожидаем, Название теста.
Это можно и в TestCase засунуть
$"__Непарные _символы в рамках{Environment.NewLine}одного_ абзаца не считаются__ выделением") | ||
.SetName("Render_ShouldIgnorePairTags_WhenPlacedInMultiLine") | ||
.SetCategory("MdSpec"); | ||
yield return new TestCaseData( |
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.
\n и другие спец. символы не работают в соответствии с этим правилом
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); | ||
} |
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 или в его конструктор.
У Тебя string - базовый тип. Любой, кто подключит твою библиотеку, бонусом получит мусорный(для него) метод CreateToken.
Либо же его делать internal, но тогда у нас логика по тому как из текста создать токен выносится во вне класса.
return new Token(value, startIndex, tag); | ||
} | ||
|
||
public static int GetEndOfLinePosition(this string text, int startIndex = 0) |
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 newLinePosition != -1 ? newLinePosition + Environment.NewLine.Length : text.Length; | ||
} | ||
|
||
public static Token CreateEscapeToken(this string text, Tag escapeTag) |
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'ом
private readonly List<int> mdLenOfTagSignatures = tags | ||
.Select(tag => tag.MdTag.Length) | ||
.Distinct() | ||
.OrderDescending() | ||
.ToList(); | ||
|
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.
Какое-то неявное соответствие тега и его длины получается
public string RemoveMdTags(string text); | ||
public string InsertHtmlTags(string 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.
Как будто это должна быть атомарная операция, но по архитектуре вижу, что просто поменять не получится
No description provided.