in src/PSRule/Parser/MarkdownReader.cs [341:424]
private bool Link()
{
if (_Stream.Current != BracketOpen || _Stream.IsEscaped)
return false;
_Stream.MarkExtentStart();
_Stream.Checkpoint();
// Skip [
_Stream.Next();
// Find end ]
var text = _Stream.CaptureUntil(LinkNameStopCharacters);
// Check if closing bracket was found in line
if (_Stream.Current != BracketClose)
{
// Ignore and add as text
_Stream.Rollback();
_Stream.Next();
var ending = GetEnding(_Stream.SkipLineEnding(max: 0));
_Output.Text("[", flag: ending);
return true;
}
// Skip ]
_Stream.Next();
if (string.IsNullOrEmpty(text))
{
var ending = GetEnding(_Stream.SkipLineEnding(max: 0));
_Output.Text("[]", flag: ending);
return true;
}
// Check for link destination indicated by '('. i.e. [text](destination)
if (_Stream.Skip(ParenthesesOpen))
{
var uri = _Stream.CaptureUntil(LinkUrlStopCharacters);
// Check if closing bracket was found in line
if (_Stream.Current != ParenthesesClose)
{
// TODO: Looks like error, double check, will position be lost
return true;
}
// Skip )
_Stream.Next();
_Output.Link(text, uri);
}
// Check for link label indicated by '['. i.e. [text][label]
else if (_Stream.Skip(BracketOpen))
{
var linkRef = _Stream.CaptureUntil(LinkNameStopCharacters);
// Skip ]
_Stream.Next();
_Output.LinkReference(text, linkRef);
}
// Check for link reference definition indicated by ':'. i.e. [label]: destination
else if (_Stream.Skip(Colon))
{
_Stream.SkipWhitespace();
var destination = _Stream.CaptureUntil(LineEndingCharacters);
_Output.LinkReferenceDefinition(text, destination);
}
else
{
_Output.LinkReference(text, text);
}
var extent = _Stream.GetExtent();
return true;
}