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

Кирилл Зарипов #232

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

Conversation

kokodio
Copy link

@kokodio kokodio commented Nov 24, 2024

return tokens;
}

private int HandleEscape(string markdown, int index, StringBuilder text)
Copy link

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.

return index + count;
}

private int CountUnderscores(string text, int index)
Copy link

Choose a reason for hiding this comment

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

Попробую описать, что делает метод: Считает идет 1 или 2 _ подряд.
Название CountUnderscores точно не подходит.
И, кажется, проблема не в названии, а в сути метода. Мне кажется, тут больше подойдет метод, который определяет "что за токен перед нами", в который можно вынести подобную логику.

Copy link
Author

Choose a reason for hiding this comment

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


private bool IsDelimiter(char value) => value != '_' && (char.IsLetter(value) || char.IsPunctuation(value));

private Token CreateTextToken(string content) => new() { Type = TokenType.Text, Content = content };
Copy link

Choose a reason for hiding this comment

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

Такое можно вынести в сам Token. Или даже лучше в его Extension методы


private Token CreateTextToken(string content) => new() { Type = TokenType.Text, Content = content };

private void CreateTokenPairs(List<Token> tokens, TokenType type, string markdown)
Copy link

Choose a reason for hiding this comment

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

Еще перед прочтением кода - метод капец какой длинный, его тяжело читать. Нужно держать слишком много логики в голове

Copy link

Choose a reason for hiding this comment

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

После прочтения - да, слишком много логики.
И switch pattern в комбинации с IsOpening, IsClosing добивает это все.
Опять изменение состояний объекта.
Изначально подход сомнительный и не оптимальный, потому что после приходится бегать и удалять "неправильные" пары. Такое обычно делается при помощи КДА

Copy link
Author

Choose a reason for hiding this comment

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

ДКА интрересная штука, но сейчас уже что есть то есть

var converter = new HtmlConverter();
var markdown = new Md(tokenizer, converter);

const string input = """
Copy link

Choose a reason for hiding this comment

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

Советы категории Б: можешь вынести эту строчку в константу, чтобы потом, при добавлении новых примеров, можно было легко между ними переключаться :)

        const string firstExample = "This _is_ a __sample__ markdown _file_.\n";
        const string secondExample = "#This is another __sample__ markdown _file_";
        var input = firstExample;

Copy link

Choose a reason for hiding this comment

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

А еще давай сюда буду накидывать, в каких случаях все ломается:

  1. ___Some Text___ - должно стать <strong><em>Some</strong></em>
  2. __Some_ - должно стать _<em>Some</em>
  3. Some_Another_Text - не должно измениться
  4. 123\456 - не должно измениться

Copy link
Author

Choose a reason for hiding this comment

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

исправил эти случаи

return result;
}

private bool IsValidDelimiter(string markdown, int index, int length, out bool isOpening, out bool isClosing)
Copy link

Choose a reason for hiding this comment

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

Столько входящих параметров тяжело переварить человеческому мозгу... Точнее, ответить на вопрос: "Зачем для проверки на валидность нужно 5 аргументов"
А еще out параметры имеются...

Copy link
Author

Choose a reason for hiding this comment

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

тоже удалил

return index + count;
}

text.Append(new string('_', count));
Copy link

Choose a reason for hiding this comment

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

new string('_', count) дублируется.
Да и я бы сказал, что завязка на _ слишком сильная. Это ведь может быть любой другой символ)
Я, например, обычно использую **Text** вместо __Text__. А так md поддерживает и тот, и другой.
Я к тому, что будет тяжело масшабировать

Copy link
Author

Choose a reason for hiding this comment

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

переделал в dictionary

if (token.Pair == null)
continue;

switch (token.Type)
Copy link

Choose a reason for hiding this comment

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

Виднеется закономерность: как только в коде появляется switch/case он становится менее читаемым.
Как раз для таких вещей придумали полиморфизм)

{ TokenType.Strong, "strong" },
};

public string Convert(List<Token> tokens)
Copy link

Choose a reason for hiding this comment

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

Давай принимать обобщенные типы)
В этом случае вообще IEnumerable достаточно

Copy link
Author

Choose a reason for hiding this comment

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

html.Append(token.Type switch
{
TokenType.Text => token.Content,
TokenType.Italic or TokenType.Strong when token.Pair != null =>
Copy link

Choose a reason for hiding this comment

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

Нарушение SRP. Класс должен нагенерить html по входным данным, а он еще что-то проверяет

Copy link
Author

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