private bool Link()

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;
        }