diff --git a/src/Markdig/Extensions/Abbreviations/AbbreviationParser.cs b/src/Markdig/Extensions/Abbreviations/AbbreviationParser.cs
index 5313e32f..d1a18069 100644
--- a/src/Markdig/Extensions/Abbreviations/AbbreviationParser.cs
+++ b/src/Markdig/Extensions/Abbreviations/AbbreviationParser.cs
@@ -51,7 +51,7 @@ namespace Markdig.Extensions.Abbreviations
{
return BlockState.None;
}
- slice.NextChar();
+ slice.SkipChar();
slice.Trim();
diff --git a/src/Markdig/Extensions/GenericAttributes/GenericAttributesParser.cs b/src/Markdig/Extensions/GenericAttributes/GenericAttributesParser.cs
index 21255a86..06a04236 100644
--- a/src/Markdig/Extensions/GenericAttributes/GenericAttributesParser.cs
+++ b/src/Markdig/Extensions/GenericAttributes/GenericAttributesParser.cs
@@ -107,7 +107,7 @@ namespace Markdig.Extensions.GenericAttributes
if (c == '}')
{
isValid = true;
- line.NextChar(); // skip }
+ line.SkipChar(); // skip }
break;
}
@@ -191,7 +191,7 @@ namespace Markdig.Extensions.GenericAttributes
}
// Go to next char, skip any spaces
- line.NextChar();
+ line.SkipChar();
line.TrimStart();
int startValue = -1;
diff --git a/src/Markdig/Extensions/SmartyPants/SmartyPantsInlineParser.cs b/src/Markdig/Extensions/SmartyPants/SmartyPantsInlineParser.cs
index 033939c6..3b8dc1cf 100644
--- a/src/Markdig/Extensions/SmartyPants/SmartyPantsInlineParser.cs
+++ b/src/Markdig/Extensions/SmartyPants/SmartyPantsInlineParser.cs
@@ -52,7 +52,7 @@ namespace Markdig.Extensions.SmartyPants
type = SmartyPantType.Quote; // We will resolve them at the end of parsing all inlines
if (slice.PeekChar() == '\'')
{
- slice.NextChar();
+ slice.SkipChar();
type = SmartyPantType.DoubleQuote; // We will resolve them at the end of parsing all inlines
}
break;
diff --git a/src/Markdig/Extensions/Tables/GridTableParser.cs b/src/Markdig/Extensions/Tables/GridTableParser.cs
index 69ee0e16..85f5b504 100644
--- a/src/Markdig/Extensions/Tables/GridTableParser.cs
+++ b/src/Markdig/Extensions/Tables/GridTableParser.cs
@@ -33,7 +33,7 @@ namespace Markdig.Extensions.Tables
while (c == '+')
{
var columnStart = line.Start;
- line.NextChar();
+ line.SkipChar();
line.TrimStart();
// if we have reached the end of the line, exit
@@ -161,15 +161,16 @@ namespace Markdig.Extensions.Tables
private static bool IsRowSeperator(StringSlice slice)
{
- while (slice.Length > 0)
+ char c = slice.CurrentChar;
+ do
{
- if (slice.CurrentChar != '-' && slice.CurrentChar != '=' && slice.CurrentChar != ':')
+ if (c != '-' && c != '=' && c != ':')
{
- return false;
+ return c == '\0';
}
- slice.NextChar();
+ c = slice.NextChar();
}
- return true;
+ while (true);
}
private static void TerminateCurrentRow(BlockProcessor processor, GridTableState tableState, Table gridTable, bool isLastRow)
diff --git a/src/Markdig/Extensions/Tables/PipeTableParser.cs b/src/Markdig/Extensions/Tables/PipeTableParser.cs
index 4caebc1d..ebd27464 100644
--- a/src/Markdig/Extensions/Tables/PipeTableParser.cs
+++ b/src/Markdig/Extensions/Tables/PipeTableParser.cs
@@ -112,7 +112,7 @@ namespace Markdig.Extensions.Tables
}
tableState.LineHasPipe = true;
tableState.LineIndex = localLineIndex;
- slice.NextChar(); // Skip the `|` character
+ slice.SkipChar(); // Skip the `|` character
tableState.ColumnAndLineDelimiters.Add(processor.Inline);
}
diff --git a/src/Markdig/Extensions/Tables/TableHelper.cs b/src/Markdig/Extensions/Tables/TableHelper.cs
index aff49cce..3526e1e2 100644
--- a/src/Markdig/Extensions/Tables/TableHelper.cs
+++ b/src/Markdig/Extensions/Tables/TableHelper.cs
@@ -60,7 +60,7 @@ namespace Markdig.Extensions.Tables
if (c == ':')
{
hasLeft = true;
- slice.NextChar();
+ slice.SkipChar();
}
slice.TrimStart();
@@ -91,7 +91,7 @@ namespace Markdig.Extensions.Tables
if (c == ':')
{
hasRight = true;
- slice.NextChar();
+ slice.SkipChar();
}
slice.TrimStart();
diff --git a/src/Markdig/Extensions/TaskLists/TaskListInlineParser.cs b/src/Markdig/Extensions/TaskLists/TaskListInlineParser.cs
index e4d3441f..87c8dc83 100644
--- a/src/Markdig/Extensions/TaskLists/TaskListInlineParser.cs
+++ b/src/Markdig/Extensions/TaskLists/TaskListInlineParser.cs
@@ -56,7 +56,7 @@ namespace Markdig.Extensions.TaskLists
return false;
}
// Skip last ]
- slice.NextChar();
+ slice.SkipChar();
// Create the TaskList
var taskItem = new TaskList()
diff --git a/src/Markdig/Helpers/HtmlHelper.cs b/src/Markdig/Helpers/HtmlHelper.cs
index 4d385ad3..0f72f26a 100644
--- a/src/Markdig/Helpers/HtmlHelper.cs
+++ b/src/Markdig/Helpers/HtmlHelper.cs
@@ -127,7 +127,7 @@ namespace Markdig.Helpers
case '\0':
return false;
case '>':
- text.NextChar();
+ text.SkipChar();
builder.Append(c);
return true;
case '/':
@@ -137,7 +137,7 @@ namespace Markdig.Helpers
{
return false;
}
- text.NextChar();
+ text.SkipChar();
builder.Append('>');
return true;
case '=':
@@ -269,7 +269,7 @@ namespace Markdig.Helpers
if (c == '>')
{
- text.NextChar();
+ text.SkipChar();
builder.Append('>');
return true;
}
@@ -304,7 +304,7 @@ namespace Markdig.Helpers
if (c == '>')
{
builder.Append('>');
- text.NextChar();
+ text.SkipChar();
return true;
}
@@ -337,7 +337,7 @@ namespace Markdig.Helpers
c = text.NextChar();
if (c == '>')
{
- text.NextChar();
+ text.SkipChar();
builder.Append('>');
return true;
}
@@ -392,7 +392,7 @@ namespace Markdig.Helpers
if (c == '>')
{
builder.Append('>');
- text.NextChar();
+ text.SkipChar();
return true;
}
return false;
@@ -417,7 +417,7 @@ namespace Markdig.Helpers
if (c == '>' && prevChar == '?')
{
builder.Append('>');
- text.NextChar();
+ text.SkipChar();
return true;
}
prevChar = c;
@@ -532,7 +532,7 @@ namespace Markdig.Helpers
c = slice.PeekChar();
if (c == 'x' || c == 'X')
{
- c = slice.NextChar(); // skip #
+ slice.SkipChar(); // skip #
// expect 1-6 hex digits starting from pos+3
while (c != '\0')
{
diff --git a/src/Markdig/Helpers/ICharIterator.cs b/src/Markdig/Helpers/ICharIterator.cs
index 2ea1f32f..cb11ad1a 100644
--- a/src/Markdig/Helpers/ICharIterator.cs
+++ b/src/Markdig/Helpers/ICharIterator.cs
@@ -31,12 +31,23 @@ namespace Markdig.Helpers
/// The next character. `\0` is end of the iteration.
char NextChar();
+ ///
+ /// Goes to the next character, incrementing the position.
+ ///
+ void SkipChar();
+
+ ///
+ /// Peeks at the next character, without incrementing the position.
+ ///
+ /// The next character. `\0` is end of the iteration.
+ char PeekChar();
+
///
/// Peeks at the next character, without incrementing the position.
///
///
/// The next character. `\0` is end of the iteration.
- char PeekChar(int offset = 1);
+ char PeekChar(int offset);
///
/// Gets a value indicating whether this instance is empty.
diff --git a/src/Markdig/Helpers/LinkHelper.cs b/src/Markdig/Helpers/LinkHelper.cs
index 22296e9b..53931e7c 100644
--- a/src/Markdig/Helpers/LinkHelper.cs
+++ b/src/Markdig/Helpers/LinkHelper.cs
@@ -246,7 +246,7 @@ namespace Markdig.Helpers
break;
}
- text.NextChar();
+ text.SkipChar();
link = builder.ToString();
builder.Length = 0;
return true;
@@ -294,7 +294,7 @@ namespace Markdig.Helpers
if (c == '>')
{
- text.NextChar();
+ text.SkipChar();
link = builder.ToString();
builder.Length = 0;
return true;
@@ -355,7 +355,7 @@ namespace Markdig.Helpers
// 1. An inline link consists of a link text followed immediately by a left parenthesis (,
if (c == '(')
{
- text.NextChar();
+ text.SkipChar();
text.TrimStart();
var pos = text.Start;
@@ -407,7 +407,7 @@ namespace Markdig.Helpers
if (isValid)
{
// Skip ')'
- text.NextChar();
+ text.SkipChar();
title ??= string.Empty;
}
@@ -466,7 +466,7 @@ namespace Markdig.Helpers
}
// Skip last quote
- text.NextChar();
+ text.SkipChar();
isValid = true;
break;
}
@@ -527,7 +527,7 @@ namespace Markdig.Helpers
c = text.NextChar();
if (!hasEscape && c == '>')
{
- text.NextChar();
+ text.SkipChar();
isValid = true;
break;
}
@@ -743,7 +743,7 @@ namespace Markdig.Helpers
label = null;
return false;
}
- text.NextChar(); // Skip ':'
+ text.SkipChar(); // Skip ':'
// Skip any whitespace before the url
text.TrimStart();
@@ -873,7 +873,7 @@ namespace Markdig.Helpers
if (c == ']')
{
- lines.NextChar(); // Skip ]
+ lines.SkipChar(); // Skip ]
if (allowEmpty || hasNonWhiteSpace)
{
// Remove trailing spaces
diff --git a/src/Markdig/Helpers/StringLineGroup.cs b/src/Markdig/Helpers/StringLineGroup.cs
index be779d2f..b0b651c0 100644
--- a/src/Markdig/Helpers/StringLineGroup.cs
+++ b/src/Markdig/Helpers/StringLineGroup.cs
@@ -223,7 +223,7 @@ namespace Markdig.Helpers
{
End += lines.Lines[i].Slice.Length + 1; // Add chars
}
- NextChar();
+ SkipChar();
}
public int Start { get; private set; }
@@ -287,7 +287,11 @@ namespace Markdig.Helpers
return CurrentChar;
}
- public readonly char PeekChar(int offset = 1)
+ public void SkipChar() => NextChar();
+
+ public readonly char PeekChar() => PeekChar(1);
+
+ public readonly char PeekChar(int offset)
{
if (offset < 0) ThrowHelper.ArgumentOutOfRangeException("Negative offset are not supported for StringLineGroup", nameof(offset));
diff --git a/src/Markdig/Helpers/StringSlice.cs b/src/Markdig/Helpers/StringSlice.cs
index 786046d0..cf187677 100644
--- a/src/Markdig/Helpers/StringSlice.cs
+++ b/src/Markdig/Helpers/StringSlice.cs
@@ -119,6 +119,17 @@ namespace Markdig.Helpers
return Text[start];
}
+ ///
+ /// Goes to the next character, incrementing the position.
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void SkipChar()
+ {
+ int start = Start;
+ if (start <= End)
+ Start = start + 1;
+ }
+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal int CountAndSkipChar(char matchChar)
{
diff --git a/src/Markdig/Parsers/BlockProcessor.cs b/src/Markdig/Parsers/BlockProcessor.cs
index c8332792..40132820 100644
--- a/src/Markdig/Parsers/BlockProcessor.cs
+++ b/src/Markdig/Parsers/BlockProcessor.cs
@@ -212,7 +212,7 @@ namespace Markdig.Parsers
}
else
{
- Line.NextChar();
+ Line.SkipChar();
Column++;
}
}
diff --git a/src/Markdig/Parsers/HtmlBlockParser.cs b/src/Markdig/Parsers/HtmlBlockParser.cs
index 2609a399..008fc232 100644
--- a/src/Markdig/Parsers/HtmlBlockParser.cs
+++ b/src/Markdig/Parsers/HtmlBlockParser.cs
@@ -49,7 +49,7 @@ namespace Markdig.Parsers
var line = state.Line;
var startPosition = line.Start;
- line.NextChar();
+ line.SkipChar();
var result = TryParseTagType16(state, line, state.ColumnBeforeIndent, startPosition);
// HTML blocks of type 7 cannot interrupt a paragraph:
diff --git a/src/Markdig/Parsers/Inlines/EmphasisInlineParser.cs b/src/Markdig/Parsers/Inlines/EmphasisInlineParser.cs
index 52c168f4..44a9ad3a 100644
--- a/src/Markdig/Parsers/Inlines/EmphasisInlineParser.cs
+++ b/src/Markdig/Parsers/Inlines/EmphasisInlineParser.cs
@@ -144,7 +144,7 @@ namespace Markdig.Parsers.Inlines
char pc = (char)0;
if (processor.Inline is HtmlEntityInline htmlEntityInline)
{
- if (htmlEntityInline.Transcoded.Length > 0)
+ if (!htmlEntityInline.Transcoded.IsEmpty)
{
pc = htmlEntityInline.Transcoded[htmlEntityInline.Transcoded.End];
}
diff --git a/src/Markdig/Parsers/Inlines/EscapeInlineParser.cs b/src/Markdig/Parsers/Inlines/EscapeInlineParser.cs
index d59c06b6..6712a2a8 100644
--- a/src/Markdig/Parsers/Inlines/EscapeInlineParser.cs
+++ b/src/Markdig/Parsers/Inlines/EscapeInlineParser.cs
@@ -36,7 +36,7 @@ namespace Markdig.Parsers.Inlines
IsFirstCharacterEscaped = true,
};
processor.Inline.Span.End = processor.Inline.Span.Start + 1;
- slice.NextChar();
+ slice.SkipChar();
return true;
}
@@ -52,7 +52,7 @@ namespace Markdig.Parsers.Inlines
Column = column
};
processor.Inline.Span.End = processor.Inline.Span.Start + 1;
- slice.NextChar();
+ slice.SkipChar();
return true;
}
return false;
diff --git a/src/Markdig/Parsers/Inlines/LineBreakInlineParser.cs b/src/Markdig/Parsers/Inlines/LineBreakInlineParser.cs
index 4be7d92d..a29578b4 100644
--- a/src/Markdig/Parsers/Inlines/LineBreakInlineParser.cs
+++ b/src/Markdig/Parsers/Inlines/LineBreakInlineParser.cs
@@ -37,7 +37,7 @@ namespace Markdig.Parsers.Inlines
var startPosition = slice.Start;
var hasDoubleSpacesBefore = slice.PeekCharExtra(-1).IsSpace() && slice.PeekCharExtra(-2).IsSpace();
- slice.NextChar(); // Skip \n
+ slice.SkipChar(); // Skip \n
processor.Inline = new LineBreakInline
{
diff --git a/src/Markdig/Parsers/Inlines/LinkInlineParser.cs b/src/Markdig/Parsers/Inlines/LinkInlineParser.cs
index c65e12e1..9b6ef7de 100644
--- a/src/Markdig/Parsers/Inlines/LinkInlineParser.cs
+++ b/src/Markdig/Parsers/Inlines/LinkInlineParser.cs
@@ -60,7 +60,7 @@ namespace Markdig.Parsers.Inlines
slice = saved;
// Else we insert a LinkDelimiter
- slice.NextChar();
+ slice.SkipChar();
processor.Inline = new LinkDelimiterInline(this)
{
Type = DelimiterType.Open,
@@ -74,7 +74,7 @@ namespace Markdig.Parsers.Inlines
return true;
case ']':
- slice.NextChar();
+ slice.SkipChar();
if (processor.Inline != null)
{
if (TryProcessLinkOrImage(processor, ref slice))
@@ -252,8 +252,8 @@ namespace Markdig.Parsers.Inlines
label = openParent.Label;
labelSpan = openParent.LabelSpan;
isLabelSpanLocal = false;
- text.NextChar(); // Skip [
- text.NextChar(); // Skip ]
+ text.SkipChar(); // Skip [
+ text.SkipChar(); // Skip ]
}
}
else
diff --git a/src/Markdig/Renderers/Normalize/Inlines/LiteralInlineRenderer.cs b/src/Markdig/Renderers/Normalize/Inlines/LiteralInlineRenderer.cs
index 90cd9f26..6b9b6676 100644
--- a/src/Markdig/Renderers/Normalize/Inlines/LiteralInlineRenderer.cs
+++ b/src/Markdig/Renderers/Normalize/Inlines/LiteralInlineRenderer.cs
@@ -15,7 +15,7 @@ namespace Markdig.Renderers.Normalize.Inlines
{
protected override void Write(NormalizeRenderer renderer, LiteralInline obj)
{
- if (obj.IsFirstCharacterEscaped && obj.Content.Length > 0 && obj.Content[obj.Content.Start].IsAsciiPunctuation())
+ if (obj.IsFirstCharacterEscaped && !obj.Content.IsEmpty && obj.Content[obj.Content.Start].IsAsciiPunctuation())
{
renderer.Write('\\');
}