|
@@ -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); |
|
|