| @@ -100,13 +100,7 @@ namespace Discord.Rest | |||||
| { | { | ||||
| var tags = ImmutableArray.CreateBuilder<ITag>(); | var tags = ImmutableArray.CreateBuilder<ITag>(); | ||||
| int index = 0; | int index = 0; | ||||
| int codeBlockIndex = 0; | |||||
| int closeIndex; | |||||
| bool isBlock = false; | |||||
| //var codeBlockRegex = new Regex(@"((?!\\)`){3}", RegexOptions.Compiled); | |||||
| ////var codeInlineRegex = new Regex(@"[^\\]`", RegexOptions.Compiled); | |||||
| //var codeInlineRegex = new Regex(@"((?!\\)`)", RegexOptions.Compiled); | |||||
| var codeIndex = 0; | |||||
| var inlineRegex = new Regex(@"[^\\]?(`).+?[^\\](`)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | var inlineRegex = new Regex(@"[^\\]?(`).+?[^\\](`)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
| var blockRegex = new Regex(@"[^\\]?(```).+?[^\\](```)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | var blockRegex = new Regex(@"[^\\]?(```).+?[^\\](```)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
| @@ -118,30 +112,32 @@ namespace Discord.Rest | |||||
| bool EnclosedInBlock(Match m) | bool EnclosedInBlock(Match m) | ||||
| => m.Groups[1].Index < index && index < m.Groups[2].Index; | => m.Groups[1].Index < index && index < m.Groups[2].Index; | ||||
| // need to check if the upper bound is beyond the end of the regex | |||||
| while (codeBlockIndex < index) | |||||
| // loop through all code blocks that are before the start of the tag | |||||
| while (codeIndex < index) | |||||
| { | { | ||||
| var blockMatch = blockRegex.Match(text, codeBlockIndex); | |||||
| var blockMatch = blockRegex.Match(text, codeIndex); | |||||
| if (blockMatch.Success) | if (blockMatch.Success) | ||||
| { | { | ||||
| if (EnclosedInBlock(blockMatch)) | if (EnclosedInBlock(blockMatch)) | ||||
| { | { | ||||
| return true; | return true; | ||||
| } | } | ||||
| codeBlockIndex += blockMatch.Groups[2].Index + blockMatch.Groups[2].Length; | |||||
| if (codeBlockIndex < index) | |||||
| // continue if the end of the current code was before the start of the tag | |||||
| codeIndex += blockMatch.Groups[2].Index + blockMatch.Groups[2].Length; | |||||
| if (codeIndex < index) | |||||
| continue; | continue; | ||||
| return false; | return false; | ||||
| } | } | ||||
| var inlineMatch = inlineRegex.Match(text, codeBlockIndex); | |||||
| var inlineMatch = inlineRegex.Match(text, codeIndex); | |||||
| if (inlineMatch.Success) | if (inlineMatch.Success) | ||||
| { | { | ||||
| if (EnclosedInBlock(inlineMatch)) | if (EnclosedInBlock(inlineMatch)) | ||||
| { | { | ||||
| return true; | return true; | ||||
| } | } | ||||
| codeBlockIndex += inlineMatch.Groups[2].Index + inlineMatch.Groups[2].Length; | |||||
| if (codeBlockIndex < index) | |||||
| // continue if the end of the current code was before the start of the tag | |||||
| codeIndex += inlineMatch.Groups[2].Index + inlineMatch.Groups[2].Length; | |||||
| if (codeIndex < index) | |||||
| continue; | continue; | ||||
| return false; | return false; | ||||
| } | } | ||||
| @@ -199,8 +195,7 @@ namespace Discord.Rest | |||||
| } | } | ||||
| index = 0; | index = 0; | ||||
| codeBlockIndex = 0; | |||||
| closeIndex = 0; | |||||
| codeIndex = 0; | |||||
| while (true) | while (true) | ||||
| { | { | ||||
| index = text.IndexOf("@everyone", index); | index = text.IndexOf("@everyone", index); | ||||
| @@ -213,8 +208,7 @@ namespace Discord.Rest | |||||
| } | } | ||||
| index = 0; | index = 0; | ||||
| codeBlockIndex = 0; | |||||
| closeIndex = 0; | |||||
| codeIndex = 0; | |||||
| while (true) | while (true) | ||||
| { | { | ||||
| index = text.IndexOf("@here", index); | index = text.IndexOf("@here", index); | ||||