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

Рушкова Ольга #225

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

Conversation

SomEnaMeforme
Copy link

Add class structure

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.

По моделькам вроде понятно(см. комментарии)
По сервисам и их взаимодействию пока не очень

{
public class TokenReader
{
private string forRead;

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.

Подразумевалась строка. вдоль которой идёт Reader

{
throw new NotImplementedException();
}
protected abstract bool AcceptWhileContextCorrect(char current);

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.

+

{
protected Token context;
protected abstract string mdTag { get; }
protected abstract string htmlTag { get; }

Choose a reason for hiding this comment

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

html тег состоит из начала и конца

Copy link
Author

@SomEnaMeforme SomEnaMeforme Nov 29, 2024

Choose a reason for hiding this comment

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

Удалила из значения треугольные скобки в RenderHtml уже буду посдставлять что-то вроде $"<{htmlTag}>{внутренняя строка}<\{htmlTag}>"

Comment on lines 11 to 14
public int Position { get; }
public int Length { get; }

private string source;

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.

Добавила везде конструкторы

private string forRead;
public int Position { get; }

public Token ReadWhile(Func<char, bool> accept)

Choose a reason for hiding this comment

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

А как он о тегах будет узнавать: как они выглядят, например? Похоже на протечку абстракций

Comment on lines 6 to 7
protected abstract string mdTag { get; }
protected abstract string htmlTag { get; }

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.

+

@@ -1,4 +1,4 @@



Choose a reason for hiding this comment

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

А почему в решение не добавлены проекты?

{
public bool IsTagClosed { get; protected set; }
private Token? context;
public int TagStart = tagStart;

Choose a reason for hiding this comment

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

А зачем? У тебя же есть поле tagStart. созданное изначально?

Comment on lines 5 to 17
protected Italic(string mdText, int tagStart) : base(mdText, tagStart)
{
MarkdownText = mdText;
TagStart = tagStart;
}

public static Italic CreateInstance(string markdownText, int tagStart)
{
if (tagStart > 0 && char.IsLetter(markdownText[tagStart - 1]))
return new ItalicSelectPartOfOneWord(markdownText, tagStart);

return new ItalicSelectFewWords(markdownText, tagStart);
}

Choose a reason for hiding this comment

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

Чет странное. Кмк лучше выделить отдельно фабрику для тегов, если они чем-то отличаются, а не два создания класса в один пихать


private Tag CreateTag(ReaderPosition current, List<Tag> external)
{
var openTag = Md.GetOpenTag(current.Position, markdownText, out int contextStart);

Choose a reason for hiding this comment

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

Лапша получается. Класс Md создает MdParser, MdParser обращается к Md.
Желаемая архитектура все же когда у тебя нижележащие сервисы не только не обращаются к вышележащим, но и ничего про них не знают вообще

Comment on lines 36 to 40
var tag = tagBegin == '_' && tagStart != markdownText.Length - 1 && markdownText[tagStart + 1] == '_'
? "__"
: tagBegin.ToString();
contextStart = tagStart + tag.Length;
return tags[tag](markdownText, tagStart);

Choose a reason for hiding this comment

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

Общий метод знает слишком много про спецификацию, будет сложно расширять, нужно помнить о том, что здесь есть логика именно про _ и __


public string GetValue()
{
return new string(source.Substring(Position, Length));

Choose a reason for hiding this comment

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

Зачем создавать новую строки из строки? У тебя Substring уже строчку возвращает

&& (MarkdownText.Substring(currentPosition, MdTagClose.Length) == MdTagClose);
}

public override Type GetType() => typeof(Bold);

Choose a reason for hiding this comment

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

Зачем? typeof(object?) не подходит?

Comment on lines 9 to 11
{typeof(Header), new () { typeof(Bold), typeof(Italic), typeof(Escape)}},
{typeof(Bold), new () { typeof(Italic), typeof(Escape)}},
{typeof(Italic), new () { typeof(Escape)}}

Choose a reason for hiding this comment

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

По типам сохранять - плохая практика. Введи enum и соответствующее поле, если хочешь использовать в таком виде. Через наследование ты сможешь его везде затребовать.
Еще не очень нравится, что это хранится в оторванности от самих тегов.
Почему это не хранить в соответствующем тэге?

{
var rules = new MdRulesForNestedTags();

var result = rules.IsNestedTagWorks(Bold.CreateInstance("", 0), Italic.CreateInstance("", 0));

Choose a reason for hiding this comment

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

Даже тут видно, что странное происходит:
Тебе нужно создать тег с текстом, позицией и тд, чтобы просто проверить является ли один тег вложенным для другого


[TestCaseSource(nameof(NestedTagsTestCases))]
[TestCaseSource(nameof(IncorrectTagsTests))]
public void Render_Should(string mdText, string expectedTagsToHtml)

Choose a reason for hiding this comment

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

Неправильно превращается текст, где больше 1 MD-тега:
"__FirstTag__, __SecondTag__" -> "FirstTag__, __SecondTag"
"__AaAa__, _b_" -> "__AaAa__, _b_"

Не превращается парный тег '_':
"__tag_" ->"__tag_"

Однако выделять часть слова они могут: и в нач_але, и в сер_еди_не, и в кон_це. - Не работает

н_ачал_о -> н_ачал_о

Если внутри подчерков пустая строка ____, то они остаются символами подчерка.

\n -> \n

При экранировании рядом с одним символов ломается тег:
_вот это будет \д_ выделено тегом_ -> <em>вот это будет \д_ выделено тегом</em>

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