@@ -106,9 +106,60 @@ public static IEnumerable<AnsiMarkupSegment> Parse(string markup, Style? style =
106106 throw new InvalidOperationException ( "Unbalanced markup stack. Did you forget to close a tag?" ) ;
107107 }
108108
109+ // Try resolving auto links (if any)
110+ ResolveAutoLinks ( result ) ;
111+
109112 return result ;
110113 }
111114
115+ private static void ResolveAutoLinks ( List < AnsiMarkupSegment > segments )
116+ {
117+ for ( var segmentIndex = 0 ; segmentIndex < segments . Count ; segmentIndex ++ )
118+ {
119+ var currentLink = segments [ segmentIndex ] . Link ;
120+ if ( currentLink ? . Url . Equals ( Constants . EmptyLink , StringComparison . Ordinal ) != true )
121+ {
122+ // Not a link
123+ continue ;
124+ }
125+
126+ // Find out where the link ends
127+ var lastKnownLinkIndex = segmentIndex + 1 ;
128+ while ( lastKnownLinkIndex < segments . Count && ReferenceEquals ( segments [ lastKnownLinkIndex ] . Link , currentLink ) )
129+ {
130+ lastKnownLinkIndex ++ ;
131+ }
132+
133+ string url ;
134+ if ( lastKnownLinkIndex - segmentIndex == 1 )
135+ {
136+ // This is a plain [link]url[/], so just grab the text
137+ url = segments [ segmentIndex ] . Text ;
138+ }
139+ else
140+ {
141+ // Build the URL using the text from the segments
142+ var builder = new StringBuilder ( ) ;
143+ for ( var i = segmentIndex ; i < lastKnownLinkIndex ; i ++ )
144+ {
145+ builder . Append ( segments [ i ] . Text ) ;
146+ }
147+
148+ url = builder . ToString ( ) ;
149+ }
150+
151+ // Set all segments to the same link
152+ var resolved = new Link ( url ) ;
153+ for ( var i = segmentIndex ; i < lastKnownLinkIndex ; i ++ )
154+ {
155+ segments [ i ] . Link = resolved ;
156+ }
157+
158+ // Continue at the next part
159+ segmentIndex = lastKnownLinkIndex - 1 ;
160+ }
161+ }
162+
112163 /// <summary>
113164 /// Escapes the specified text so that it won’t be interpreted as markup.
114165 /// </summary>
@@ -183,7 +234,7 @@ public sealed class AnsiMarkupSegment
183234 /// <summary>
184235 /// Gets the segment link.
185236 /// </summary>
186- public Link ? Link { get ; }
237+ public Link ? Link { get ; internal set ; }
187238
188239 /// <summary>
189240 /// Initializes a new instance of the <see cref="AnsiMarkupSegment"/> class.
0 commit comments