Skip to content

Commit 8b60dc9

Browse files
committed
Move ConvertToAbsoluteSpan and GetAbsolutePosition to StringLineGroup
1 parent ca41be0 commit 8b60dc9

2 files changed

Lines changed: 43 additions & 41 deletions

File tree

src/Markdig/Helpers/StringLineGroup.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// This file is licensed under the BSD-Clause 2 license.
33
// See the license.txt file in the project root for more information.
44

5+
using Markdig.Syntax;
56
using System.Collections;
67
using System.Diagnostics;
78
using System.Runtime.CompilerServices;
@@ -190,6 +191,33 @@ public void Trim()
190191
}
191192
}
192193

194+
internal SourceSpan ConvertToAbsoluteSpan(SourceSpan span)
195+
{
196+
if (span.IsEmpty || Count == 0) return span;
197+
198+
var startPosition = GetAbsolutePosition(span.Start);
199+
var endPosition = GetAbsolutePosition(span.End);
200+
201+
return new SourceSpan(startPosition, endPosition);
202+
}
203+
204+
private int GetAbsolutePosition(int position)
205+
{
206+
int offset = 0;
207+
for (int i = 0; i < Count; i++)
208+
{
209+
ref StringSlice slice = ref Lines[i].Slice;
210+
var lineLength = slice.Length + slice.NewLine.Length();
211+
212+
if (i == Count - 1 || position < offset + lineLength)
213+
{
214+
return slice.Start + (position - offset);
215+
}
216+
offset += lineLength;
217+
}
218+
return Lines[Count - 1].Slice.End + 1;
219+
}
220+
193221
/// <summary>
194222
/// Gets or sets the enumerator.
195223
/// </summary>

src/Markdig/Parsers/ParagraphBlockParser.cs

Lines changed: 15 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,10 @@ private static bool TryMatchLinkReferenceDefinition(ref StringLineGroup lines, B
213213
// Correct the locations of each field
214214
linkReferenceDefinition.Line = lines.Lines[0].Line;
215215

216-
linkReferenceDefinition.Span = ConvertToAbsoluteSpan(lines, linkReferenceDefinition.Span);
217-
linkReferenceDefinition.LabelSpan = ConvertToAbsoluteSpan(lines, linkReferenceDefinition.LabelSpan);
218-
linkReferenceDefinition.UrlSpan = ConvertToAbsoluteSpan(lines, linkReferenceDefinition.UrlSpan);
219-
linkReferenceDefinition.TitleSpan = ConvertToAbsoluteSpan(lines, linkReferenceDefinition.TitleSpan);
216+
linkReferenceDefinition.Span = lines.ConvertToAbsoluteSpan(linkReferenceDefinition.Span);
217+
linkReferenceDefinition.LabelSpan = lines.ConvertToAbsoluteSpan(linkReferenceDefinition.LabelSpan);
218+
linkReferenceDefinition.UrlSpan = lines.ConvertToAbsoluteSpan(linkReferenceDefinition.UrlSpan);
219+
linkReferenceDefinition.TitleSpan = lines.ConvertToAbsoluteSpan(linkReferenceDefinition.TitleSpan);
220220
lines = iterator.Remaining();
221221
}
222222
else
@@ -255,22 +255,22 @@ private static bool TryMatchLinkReferenceDefinitionTrivia(ref StringLineGroup li
255255
lrd.Line = lines.Lines[0].Line;
256256
var text = lines.Lines[0].Slice.Text;
257257

258-
triviaBeforeLabel = ConvertToAbsoluteSpan(lines, triviaBeforeLabel);
259-
labelWithTrivia = ConvertToAbsoluteSpan(lines, labelWithTrivia);
260-
triviaBeforeUrl = ConvertToAbsoluteSpan(lines, triviaBeforeUrl);
261-
unescapedUrl = ConvertToAbsoluteSpan(lines, unescapedUrl);
262-
triviaBeforeTitle = ConvertToAbsoluteSpan(lines, triviaBeforeTitle);
263-
unescapedTitle = ConvertToAbsoluteSpan(lines, unescapedTitle);
264-
triviaAfterTitle = ConvertToAbsoluteSpan(lines, triviaAfterTitle);
265-
lrd.Span = ConvertToAbsoluteSpan(lines, lrd.Span);
258+
triviaBeforeLabel = lines.ConvertToAbsoluteSpan(triviaBeforeLabel);
259+
labelWithTrivia = lines.ConvertToAbsoluteSpan(labelWithTrivia);
260+
triviaBeforeUrl = lines.ConvertToAbsoluteSpan(triviaBeforeUrl);
261+
unescapedUrl = lines.ConvertToAbsoluteSpan(unescapedUrl);
262+
triviaBeforeTitle = lines.ConvertToAbsoluteSpan(triviaBeforeTitle);
263+
unescapedTitle = lines.ConvertToAbsoluteSpan(unescapedTitle);
264+
triviaAfterTitle = lines.ConvertToAbsoluteSpan(triviaAfterTitle);
265+
lrd.Span = lines.ConvertToAbsoluteSpan(lrd.Span);
266266
lrd.TriviaBefore = new StringSlice(text, triviaBeforeLabel.Start, triviaBeforeLabel.End);
267-
lrd.LabelSpan = ConvertToAbsoluteSpan(lines, lrd.LabelSpan);
267+
lrd.LabelSpan = lines.ConvertToAbsoluteSpan(lrd.LabelSpan);
268268
lrd.LabelWithTrivia = new StringSlice(text, labelWithTrivia.Start, labelWithTrivia.End);
269269
lrd.TriviaBeforeUrl = new StringSlice(text, triviaBeforeUrl.Start, triviaBeforeUrl.End);
270-
lrd.UrlSpan = ConvertToAbsoluteSpan(lines, lrd.UrlSpan);
270+
lrd.UrlSpan = lines.ConvertToAbsoluteSpan(lrd.UrlSpan);
271271
lrd.UnescapedUrl = new StringSlice(text, unescapedUrl.Start, unescapedUrl.End);
272272
lrd.TriviaBeforeTitle = new StringSlice(text, triviaBeforeTitle.Start, triviaBeforeTitle.End);
273-
lrd.TitleSpan = ConvertToAbsoluteSpan(lines, lrd.TitleSpan);
273+
lrd.TitleSpan = lines.ConvertToAbsoluteSpan(lrd.TitleSpan);
274274
lrd.UnescapedTitle = new StringSlice(text, unescapedTitle.Start, unescapedTitle.End);
275275
lrd.TriviaAfter = new StringSlice(text, triviaAfterTitle.Start, triviaAfterTitle.End);
276276
lrd.LinesBefore = paragraph.LinesBefore;
@@ -290,30 +290,4 @@ private static bool TryMatchLinkReferenceDefinitionTrivia(ref StringLineGroup li
290290
return atLeastOneFound;
291291
}
292292

293-
private static SourceSpan ConvertToAbsoluteSpan(StringLineGroup lines, SourceSpan span)
294-
{
295-
if (span.IsEmpty) return span;
296-
297-
var startPosition = GetAbsolutePosition(lines, span.Start);
298-
var endPosition = GetAbsolutePosition(lines, span.End);
299-
300-
return new SourceSpan(startPosition, endPosition);
301-
}
302-
303-
private static int GetAbsolutePosition(StringLineGroup lines, int position)
304-
{
305-
int offset = 0;
306-
for (int i = 0; i < lines.Count; i++)
307-
{
308-
ref StringSlice slice = ref lines.Lines[i].Slice;
309-
var lineLength = slice.Length + slice.NewLine.Length();
310-
311-
if (i == lines.Count - 1 || position < offset + lineLength)
312-
{
313-
return slice.Start + (position - offset);
314-
}
315-
offset += lineLength;
316-
}
317-
return lines.Lines[lines.Count - 1].Slice.End + 1;
318-
}
319293
}

0 commit comments

Comments
 (0)