diff --git a/Markdown/Md.cs b/Markdown/Md.cs index e0e4a8727..cbeedfab1 100644 --- a/Markdown/Md.cs +++ b/Markdown/Md.cs @@ -8,7 +8,9 @@ namespace Markdown { public class Md { + //Todo plainMd - ассоциация с plainText-ом, а тип - массив строк. private readonly string[] plainMd; + private readonly string baseUrl; private readonly CssClassInfo cssClassInfo; @@ -27,6 +29,7 @@ public class Md private int currLineIndex; + //Todo Зачем нужна CurrLine? Может вообще лучше формальную грамматику сделать? Sprache private string CurrLine { get { return plainMd[currLineIndex]; } @@ -60,10 +63,11 @@ public Md(string plainMd, string baseUrl = "", CssClassInfo cssClassInfo = null) currLineIndex = 0; } + //Todo в spec.md ничего не нашел про Header private HtmlToken ParseHeader() { + //Todo .Replace("\\", "") - это зачем? var headerText = CurrLine.Replace("#", "").Replace("\\", ""); - var headerImportance = CurrLine.Length - headerText.Length; currLineIndex++; @@ -274,10 +278,13 @@ private static HtmlToken ParseEmInStrong(string currLine, ref int index, ref int return htmlToken; } + //Todo непонятное имя: не внутри цифр private static bool NotInsideDigits(int tagIndex, string currLine) { - if (tagIndex + 1 == currLine.Length || tagIndex - 1 == -1) + //Todo tagIndex == 0 + if(tagIndex + 1 == currLine.Length || tagIndex - 1 == -1) return true; + //Todo !char.IsDigit(currLine[tagIndex + 1]) - tag всегда из 1 символа? return !char.IsDigit(currLine[tagIndex - 1]) && !char.IsDigit(currLine[tagIndex + 1]); } @@ -327,6 +334,8 @@ private static Tag ParseTag(string currLine, int tagIndex) return Tag.A; if (currLine[tagIndex] != '_') return Tag.Empty; + + //Todo непонятно if (tagIndex == currLine.Length - 1) return Tag.Em; return currLine[tagIndex + 1] == '_' @@ -338,6 +347,8 @@ private static LineType GetLineTypeTag(string currLine) { if (currLine.StartsWith("#")) return LineType.Header; + + //Todo у некоторых людей сдвиги по 2 пробела. Константы в коде if (currLine.StartsWith(" ") || currLine.StartsWith("\t")) return LineType.CodeBlock; if (char.IsDigit(currLine[0])) diff --git a/Markdown/Spec.md b/Markdown/Spec.md index 144ddfb3a..f440c10d1 100644 --- a/Markdown/Spec.md +++ b/Markdown/Spec.md @@ -1,6 +1,6 @@ # Спецификация языка разметки -Процессору принимает на вход строку формата описанного ниже и возвращает HTML-код эквивалентный данной строке. +Процессор принимает на вход строку формата, описанного ниже, и возвращает HTML-код эквивалентный данной строке. ###Описание правил: Текст diff --git a/Markdown/Tag.cs b/Markdown/Tag.cs index 84d95effa..441948e2a 100644 --- a/Markdown/Tag.cs +++ b/Markdown/Tag.cs @@ -5,8 +5,11 @@ namespace Markdown { public class Tag { + //Todo непонятно, что это public string Md { get; } + public string Html { get; } + public static readonly Tag Em = new Tag("_", "em"); public static readonly Tag Strong = new Tag("__", "strong"); public static readonly Tag Empty = new Tag("", ""); diff --git a/Markdown/Test/HtmlToken_Should.cs b/Markdown/Test/HtmlToken_Should.cs index de979fbd4..5e3bf0a60 100644 --- a/Markdown/Test/HtmlToken_Should.cs +++ b/Markdown/Test/HtmlToken_Should.cs @@ -16,6 +16,7 @@ public void ShouldInsertDataInToTags_WhenToStringCalls() token.Render(null).Should().Be("data"); } + //Todo непонятные названия тестов [Test] public void ShouldConcatManyTags_WhenHasInsertedTags() { diff --git a/Markdown/Test/MD_Should.cs b/Markdown/Test/MD_Should.cs index 63f14d3ec..4c0eabb4f 100644 --- a/Markdown/Test/MD_Should.cs +++ b/Markdown/Test/MD_Should.cs @@ -180,6 +180,7 @@ private static string GenerateMd(Random rnd) return md.ToString(); } + //Todo зачем нужен этот тест? Линейность? Переписать нормально [Test] [Explicit] public void PerformanceTest() diff --git a/Markdown/Tokens/AHtmlToken.cs b/Markdown/Tokens/AHtmlToken.cs index ecb40b0dd..560e4a649 100644 --- a/Markdown/Tokens/AHtmlToken.cs +++ b/Markdown/Tokens/AHtmlToken.cs @@ -7,16 +7,16 @@ public class AHtmlToken : HtmlToken private readonly string url; private readonly string baseUrl; private bool IsReferece => url.StartsWith("/"); - public override int Length => Data.Length + url.Length + 4 + EscapedCharacters; + public int Length => Data.Length + url.Length + 4 + EscapedCharsCount; - public AHtmlToken(string data, string url, int escapedCharacters, string baseUrl) : base("a", data, escapedCharacters) + public AHtmlToken(string data, string url, int escapedCharsCount, string baseUrl) : base("a", data, escapedCharsCount) { this.url = url; this.baseUrl = baseUrl; } - public AHtmlToken(List parsedTokens, int escapedCharacters) - : base("a", parsedTokens, escapedCharacters) + public AHtmlToken(List parsedTokens, int escapedCharsCount) + : base("a", parsedTokens, escapedCharsCount) { } diff --git a/Markdown/Tokens/CodeHtmlToken.cs b/Markdown/Tokens/CodeHtmlToken.cs index 924046cdd..ba486809f 100644 --- a/Markdown/Tokens/CodeHtmlToken.cs +++ b/Markdown/Tokens/CodeHtmlToken.cs @@ -14,7 +14,7 @@ public CodeHtmlToken(List parsedTokens) : base("code", parsedTokens, public override string Render(CssClassInfo cssClassInfo) { - return InsertInToTags("pre", InsertInToTags(Data, cssClassInfo), cssClassInfo); + return WrapWithTag("pre", WrapWithTag(Data, cssClassInfo), cssClassInfo); } } } \ No newline at end of file diff --git a/Markdown/Tokens/EmHtmlToken.cs b/Markdown/Tokens/EmHtmlToken.cs index 8a5a40a1b..67ab7d3be 100644 --- a/Markdown/Tokens/EmHtmlToken.cs +++ b/Markdown/Tokens/EmHtmlToken.cs @@ -4,14 +4,15 @@ namespace Markdown.Tokens { public class EmHtmlToken : HtmlToken { - public override int Length => base.Length + 2; + //Todo Непонятно. Выглядит как какой-то хак + public int Length => base.Length + 2; - public EmHtmlToken(string data, int escapedCharacters) : base("em", data, escapedCharacters) + public EmHtmlToken(string data, int escapedCharsCount) : base("em", data, escapedCharsCount) { } - public EmHtmlToken(List parsedTokens, int escapedCharacters) - : base("em", parsedTokens, escapedCharacters) + public EmHtmlToken(List parsedTokens, int escapedCharsCount) + : base("em", parsedTokens, escapedCharsCount) { } } diff --git a/Markdown/Tokens/HtmlToken.cs b/Markdown/Tokens/HtmlToken.cs index cd15b314c..a7b6879e8 100644 --- a/Markdown/Tokens/HtmlToken.cs +++ b/Markdown/Tokens/HtmlToken.cs @@ -3,41 +3,47 @@ namespace Markdown.Tokens { + //Todo много однотипных классов XxxHtmlToken - цель? public abstract class HtmlToken { protected readonly string Tag; protected readonly List ParsedTokens; protected readonly string Data; - protected virtual bool IsTagged => !string.IsNullOrEmpty(Tag); + public int Length; - public virtual int Length => ParsedTokens.Sum(x => x.Length) + (Data ?? "").Length + EscapedCharacters; + protected readonly int EscapedCharsCount; - protected readonly int EscapedCharacters; - - protected HtmlToken(string tag, string data, int escapedCharacters) + protected HtmlToken(string tag, string data, int escapedCharsCount) { Tag = tag; Data = data; - EscapedCharacters = escapedCharacters; + EscapedCharsCount = escapedCharsCount; ParsedTokens = new List(); + Length = CalcLength(); } - protected HtmlToken(string tag, List parsedTokens, int escapedCharacters) + protected HtmlToken(string tag, List parsedTokens, int escapedCharsCount) { Tag = tag; ParsedTokens = parsedTokens; - EscapedCharacters = escapedCharacters; + EscapedCharsCount = escapedCharsCount; + Length = CalcLength(); + } + + private int CalcLength() + { + return ParsedTokens.Sum(x => x.Length) + (Data ?? "").Length + EscapedCharsCount; } - protected virtual string InsertInToTags(string dataToInsert, CssClassInfo cssClassInfo) + protected virtual string WrapWithTag(string dataToInsert, CssClassInfo cssClassInfo) { - return IsTagged - ? InsertInToTags(Tag, dataToInsert, cssClassInfo) + return !string.IsNullOrEmpty(Tag) + ? WrapWithTag(Tag, dataToInsert, cssClassInfo) : dataToInsert; } - protected virtual string InsertInToTags(string tag, string dataToInsert, CssClassInfo cssClassInfo) + protected virtual string WrapWithTag(string tag, string dataToInsert, CssClassInfo cssClassInfo) { return $"<{tag}{GetCssClassDef(cssClassInfo)}>{dataToInsert}"; } @@ -50,8 +56,8 @@ protected static string GetCssClassDef(CssClassInfo cssClassInfo) public virtual string Render(CssClassInfo cssClassInfo) { return ParsedTokens.Count > 0 - ? InsertInToTags(string.Join("", ParsedTokens.Select(token => token.Render(cssClassInfo))), cssClassInfo) - : InsertInToTags(Data, cssClassInfo); + ? WrapWithTag(string.Join("", ParsedTokens.Select(token => token.Render(cssClassInfo))), cssClassInfo) + : WrapWithTag(Data, cssClassInfo); } } } \ No newline at end of file diff --git a/Markdown/Tokens/StrongHtmlToken.cs b/Markdown/Tokens/StrongHtmlToken.cs index 8ed4ebbcc..641bdfc18 100644 --- a/Markdown/Tokens/StrongHtmlToken.cs +++ b/Markdown/Tokens/StrongHtmlToken.cs @@ -4,14 +4,14 @@ namespace Markdown.Tokens { public class StrongHtmlToken : HtmlToken { - public override int Length => base.Length + 4; + public int Length => base.Length + 4; - public StrongHtmlToken(string data, int escapedCharacters) : base("strong", data, escapedCharacters) + public StrongHtmlToken(string data, int escapedCharsCount) : base("strong", data, escapedCharsCount) { } - public StrongHtmlToken(List parsedTokens, int escapedCharacters) - : base("strong", parsedTokens, escapedCharacters) + public StrongHtmlToken(List parsedTokens, int escapedCharsCount) + : base("strong", parsedTokens, escapedCharsCount) { } }