Skip to content

Commit 20ea209

Browse files
committed
Support anchors in markdown
1 parent da385eb commit 20ea209

1 file changed

Lines changed: 32 additions & 1 deletion

File tree

‎Telegram/Common/MarkdownToInstantView.cs‎

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,9 @@ private static void ConvertBlock(Block block, List<PageBlock> output)
315315
switch (block)
316316
{
317317
case HeadingBlock h:
318-
output.Add(MakeHeading(h.Level, ConvertInlinesTopLevel(h.Inline)));
318+
var inline = ConvertInlinesTopLevel(h.Inline);
319+
output.Add(new PageBlockAnchor(Slugify(inline.ToPlainText())));
320+
output.Add(MakeHeading(h.Level, inline));
319321
break;
320322

321323
case ParagraphBlock p:
@@ -699,6 +701,16 @@ private static RichText ConvertLink(LinkInline link)
699701
innerText = new RichTextPlain { Text = url };
700702
}
701703

704+
if (url.StartsWith('#'))
705+
{
706+
return new RichTextAnchorLink
707+
{
708+
Text = innerText,
709+
Url = url,
710+
AnchorName = url.TrimStart('#')
711+
};
712+
}
713+
702714
return new RichTextUrl
703715
{
704716
Text = innerText,
@@ -772,5 +784,24 @@ private static bool IsEmpty(RichText rt)
772784
{
773785
return rt is RichTextPlain p && string.IsNullOrEmpty(p.Text);
774786
}
787+
788+
private static string Slugify(string text)
789+
{
790+
if (string.IsNullOrEmpty(text)) return string.Empty;
791+
792+
var sb = new StringBuilder(text.Length);
793+
foreach (var ch in text)
794+
{
795+
if (char.IsLetterOrDigit(ch) || ch == '_' || ch == '-')
796+
{
797+
sb.Append(char.ToLowerInvariant(ch));
798+
}
799+
else if (char.IsWhiteSpace(ch))
800+
{
801+
sb.Append('-');
802+
}
803+
}
804+
return sb.ToString();
805+
}
775806
}
776807
}

0 commit comments

Comments
 (0)