-
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
Вильданов Савелий #226
Open
Saveliy21
wants to merge
7
commits into
kontur-courses:master
Choose a base branch
from
Saveliy21:master
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Вильданов Савелий #226
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
69f2aee
create project
Saveliy21 0d90bbb
refactor Token.cs
Saveliy21 310cbcb
implementation of basic tags
Saveliy21 ce80477
Add Markdown Tests
Saveliy21 2c6ce1a
refactor MarkdownTest.cs
Saveliy21 095bdf0
Add link tag
Saveliy21 ba8e821
refactor project
Saveliy21 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
using System.Text; | ||
|
||
namespace Markdown; | ||
|
||
public class Converter | ||
{ | ||
public string ConvertWithTokens(List<Token> tokens) | ||
{ | ||
StringBuilder result = new(); | ||
|
||
foreach (var token in tokens) | ||
{ | ||
result.Append(token.Context); | ||
} | ||
|
||
return result.ToString(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
namespace Markdown; | ||
|
||
public class ListOfTokens<T> : List<T> | ||
{ | ||
public new void Add(T token) | ||
{ | ||
if (!(token is null)) | ||
base.Add(token); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<OutputType>Exe</OutputType> | ||
<TargetFramework>net8.0</TargetFramework> | ||
<ImplicitUsings>enable</ImplicitUsings> | ||
<Nullable>enable</Nullable> | ||
</PropertyGroup> | ||
|
||
</Project> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
namespace Markdown; | ||
|
||
public class Md | ||
{ | ||
public static string Render(string markdown) | ||
{ | ||
TokenGenerator tokenGenerator = new TokenGenerator(); | ||
Converter converter = new Converter(); | ||
return converter.ConvertWithTokens(tokenGenerator.SplitParagraphs(markdown)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
using System.Collections; | ||
using System.Security.Principal; | ||
using Markdown.TagsType; | ||
|
||
namespace Markdown.Parsers; | ||
|
||
public class BoldParser : IParser | ||
{ | ||
private readonly Stack<Token> tagsStack; | ||
private readonly GeneralParser.IsValidTag isValidOpenBoldTag; | ||
private readonly GeneralParser.IsValidTag isValidCloseBoldTag; | ||
private readonly GeneralParser.AddInsert addBoldTag; | ||
public bool IsHaveInsideBoldTag; | ||
public static bool IsBoldClosed; | ||
private int index; | ||
|
||
public BoldParser() | ||
{ | ||
IsBoldClosed = true; | ||
IsHaveInsideBoldTag = false; | ||
tagsStack = GeneralParser.tagsStack; | ||
addBoldTag = GeneralParser.AddInsideTag; | ||
isValidOpenBoldTag = GeneralParser.IsValidOpenTag; | ||
isValidCloseBoldTag = GeneralParser.IsValidCloserTag; | ||
index = 0; | ||
} | ||
|
||
private Token BoldParse(string text, int i) | ||
{ | ||
index = i; | ||
index++; | ||
|
||
if (i != 0 && i != text.Length - 2) | ||
IsHaveInsideBoldTag = true; | ||
if (IsEmptyStringInsideBold(text, i)) | ||
{ | ||
index = text.Length; | ||
return new Token("____", new TextTag()); | ||
} | ||
|
||
if (IsBoldClosed) | ||
{ | ||
if (!isValidOpenBoldTag(text, i + 1)) | ||
{ | ||
return (new Token("__", new TextTag())); | ||
} | ||
} | ||
else | ||
{ | ||
if (!isValidCloseBoldTag(text, i)) | ||
{ | ||
if (isValidOpenBoldTag(text, i)) | ||
{ | ||
if (tagsStack.Count != 0) | ||
tagsStack.Pop(); | ||
return addBoldTag(new BoldTag(), true); | ||
} | ||
|
||
return new Token("__", new TextTag()); | ||
} | ||
} | ||
|
||
if (tagsStack.Count > 1 && | ||
tagsStack.Any(p => p.Type is {MarkdownTag: "_"}) && | ||
tagsStack.Peek().Type is {MarkdownTag: "__"}) | ||
{ | ||
tagsStack.Pop(); | ||
} | ||
|
||
if (!IsBoldClosed && i == text.Length - 1) | ||
{ | ||
tagsStack.Pop(); | ||
} | ||
|
||
var boldTag = addBoldTag(new BoldTag(), IsBoldClosed); | ||
IsBoldClosed = !IsBoldClosed; | ||
|
||
|
||
return boldTag; | ||
} | ||
|
||
public bool IsNextSymbolBold(string text, int i) | ||
{ | ||
var nextIndex = i + 1; | ||
if (nextIndex < text.Length) | ||
{ | ||
if (text[nextIndex] == '_') | ||
{ | ||
return true; | ||
} | ||
} | ||
|
||
return false; | ||
} | ||
|
||
private bool IsEmptyStringInsideBold(string text, int i) | ||
{ | ||
int nextIndex = i + 1; | ||
if (nextIndex < text.Length - 2 && IsNextSymbolBold(text, nextIndex)) | ||
{ | ||
return true; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
public bool TryParse(char symbol, string text, int i) | ||
{ | ||
return symbol == '_' && IsNextSymbolBold(text, i); | ||
} | ||
|
||
public Token Parse(string text, ref int i) | ||
{ | ||
var token = BoldParse(text, i); | ||
i = index; | ||
return token; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
using Markdown.TagsType; | ||
|
||
namespace Markdown.Parsers; | ||
|
||
public static class GeneralParser | ||
{ | ||
public static Stack<Token> tagsStack = new(); | ||
|
||
public delegate Token AddInsert(ITagsType tags, bool isClose); | ||
|
||
public delegate bool IsValidTag(string text, int index); | ||
|
||
public static Token AddInsideTag(ITagsType tag, bool isClose) | ||
{ | ||
var result = GenerateTagToken(tag, isClose); | ||
if (!isClose && tagsStack.Count != 0 && tagsStack.Peek().Type?.MarkdownTag == tag.MarkdownTag) | ||
ClosePairTag(tagsStack.Pop()); | ||
return result; | ||
} | ||
|
||
public static Token GenerateTagToken(ITagsType tag, bool isClose) | ||
{ | ||
if (isClose) | ||
{ | ||
var temp = new Token(tag.GetHtmlOpenTag, tag); | ||
tagsStack.Push(temp); | ||
return temp; | ||
} | ||
|
||
if (tagsStack.Count != 0 && tagsStack.Peek().Type?.MarkdownTag == tag.MarkdownTag) | ||
tag.HasPair = true; | ||
return new Token(tag.GetHtmlCloseTag, tag); | ||
} | ||
|
||
public static void ClosePairTag(Token token) | ||
{ | ||
if (token.Type != null) token.Type.HasPair = true; | ||
} | ||
|
||
public static bool IsValidCloserTag(string text, int index) | ||
{ | ||
if (index == 0) | ||
return false; | ||
if (index > 0 && text[index - 1] == ' ') | ||
return false; | ||
|
||
return true; | ||
} | ||
|
||
public static bool IsValidOpenTag(string text, int index) | ||
{ | ||
if (index == text.Length - 1) | ||
return false; | ||
if (index < text.Length - 1 && text[index + 1] == ' ') | ||
return false; | ||
|
||
return true; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
using Markdown.TagsType; | ||
|
||
namespace Markdown.Parsers; | ||
|
||
public class HeadingParser : IParser | ||
{ | ||
public bool TryParse(char symbol, string text, int index) | ||
{ | ||
return symbol == '#'; | ||
} | ||
|
||
public Token Parse(string text, ref int index) | ||
{ | ||
var headingTag = new HeadingTag(); | ||
return new Token(headingTag.GetHtmlOpenTag, headingTag); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
namespace Markdown.Parsers; | ||
|
||
public interface IParser | ||
{ | ||
bool TryParse(char symbol, string text, int index); | ||
Token Parse(string text, ref int index); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
using Markdown.TagsType; | ||
|
||
namespace Markdown.Parsers; | ||
|
||
public class ItalicParser : IParser | ||
{ | ||
private readonly GeneralParser.IsValidTag isValidOpenItalicTag; | ||
private readonly GeneralParser.IsValidTag isValidCloseItalicTag; | ||
private readonly GeneralParser.AddInsert addItalicTag; | ||
private bool isItalicClosed; | ||
private readonly Stack<Token> tagsStack; | ||
public bool IsHaveInsideItalicTag; | ||
|
||
|
||
public ItalicParser() | ||
{ | ||
isItalicClosed = true; | ||
tagsStack = GeneralParser.tagsStack; | ||
addItalicTag = GeneralParser.AddInsideTag; | ||
isValidOpenItalicTag = GeneralParser.IsValidOpenTag; | ||
isValidCloseItalicTag = GeneralParser.IsValidCloserTag; | ||
IsHaveInsideItalicTag = false; | ||
} | ||
|
||
private Token ItalicParse(string text, int i) | ||
{ | ||
if (i != 0 && i != text.Length - 1) | ||
IsHaveInsideItalicTag = true; | ||
if (isItalicClosed) | ||
{ | ||
if (!isValidOpenItalicTag(text, i)) | ||
{ | ||
return new Token("_", new TextTag()); | ||
} | ||
} | ||
else | ||
{ | ||
if (!isValidCloseItalicTag(text, i)) | ||
{ | ||
if (isValidOpenItalicTag(text, i)) | ||
{ | ||
if (tagsStack.Count != 0) | ||
tagsStack.Pop(); | ||
return addItalicTag(new ItalicTag(), true); | ||
} | ||
|
||
return new Token("_", new TextTag()); | ||
} | ||
} | ||
|
||
if (tagsStack.Count > 1 && !isItalicClosed && BoldParser.IsBoldClosed) | ||
{ | ||
tagsStack.Pop(); | ||
} | ||
|
||
var result = addItalicTag(new ItalicTag(), isItalicClosed); | ||
isItalicClosed = !isItalicClosed; | ||
if (!isItalicClosed && i == text.Length - 1) | ||
{ | ||
tagsStack.Pop(); | ||
} | ||
|
||
return result; | ||
} | ||
|
||
public bool TryParse(char symbol, string text, int i) | ||
{ | ||
return symbol == '_'; | ||
} | ||
|
||
public Token Parse(string text, ref int index) | ||
{ | ||
return ItalicParse(text, index); | ||
} | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
Это скорее
CanParse
наверное? Обычно методыTry...
пытаются вернуть какой-то результат вout
параметре, то есть "пытаются что-то сделать и вернуть успешность этого действия" - например,int.TryParse(..., out value)
,dictionary.TryGetValue(..., out value)
, а в твоем случае этого параметра нет