public Token CreateEmphasisMark()
{
// Capture current state
char ch = Current;
char altch = ch == '*' ? '_' : '*';
int savepos = Position;
// Check for a consecutive sequence of just '_' and '*'
if (Bof || char.IsWhiteSpace(CharAtOffset(-1)))
{
while (IsEmphasisChar(Current))
SkipForward(1);
if (Eof || char.IsWhiteSpace(Current))
{
return new Token(TokenType.Html, savepos, Position - savepos);
}
// Rewind
Position = savepos;
}
// Scan backwards and see if we have space before
while (IsEmphasisChar(CharAtOffset(-1)))
SkipForward(-1);
bool bSpaceBefore = Bof || char.IsWhiteSpace(CharAtOffset(-1));
Position = savepos;
// Count how many matching emphasis characters
while (Current == ch)
{
SkipForward(1);
}
int count=Position-savepos;
// Scan forwards and see if we have space after
while (IsEmphasisChar(CharAtOffset(1)))
SkipForward(1);
bool bSpaceAfter = Eof || char.IsWhiteSpace(Current);
Position = savepos + count;
// This should have been stopped by check above
System.Diagnostics.Debug.Assert(!bSpaceBefore || !bSpaceAfter);
if (bSpaceBefore)
{
return CreateToken(TokenType.opening_mark, savepos, Position - savepos);
}
if (bSpaceAfter)
{
return CreateToken(TokenType.closing_mark, savepos, Position - savepos);
}
if (m_Markdown.ExtraMode && ch == '_' && (Char.IsLetterOrDigit(Current)))
return null;
return CreateToken(TokenType.internal_mark, savepos, Position - savepos);
}