@@ -358,13 +358,63 @@ parseInline text
358358 | T. null text = []
359359 | otherwise =
360360 case T. uncons text of
361- Just (' [' , _) -> parseCheckbox text
361+ Just (' [' , _) -> parseLinkOrCheckbox text
362362 Just (' *' , _) -> parseDecoration ' *' text
363363 Just (' _' , _) -> parseDecoration ' _' text
364364 Just (' ~' , _) -> parseStrikethrough text
365365 Just (' <' , _) -> parseHtmlTags text
366366 _ -> parsePlainText text
367367
368+ parseLinkOrCheckbox :: Text -> [MDElement ]
369+ parseLinkOrCheckbox text
370+ | T. isPrefixOf (T. pack " [x]" ) text || T. isPrefixOf (T. pack " [ ]" ) text =
371+ parseCheckbox text
372+ | T. isPrefixOf (T. pack " [" ) text =
373+ parseBracketLink text
374+ | otherwise = parsePlainText text
375+
376+ parseBracketLink :: Text -> [MDElement ]
377+ parseBracketLink text =
378+ let linkTextStart = T. tail $ T. takeWhile (/= ' ]' ) text
379+ urlStart = T. drop 2 $ T. dropWhile (/= ' (' ) text
380+ (linkUrl, rest) = T. break (== ' )' ) urlStart
381+ cleanUrl = T. strip linkUrl
382+
383+ -- Check for optional title
384+ (titlePart, remainingText) =
385+ case T. uncons rest of
386+ Just (_, titleText) ->
387+ let stripped = T. strip $ T. takeWhile (/= ' )' ) titleText
388+ titleRemaining = T. drop (T. length stripped + 1 ) titleText
389+ in if T. isPrefixOf (T. pack " \" " ) stripped && T. isSuffixOf (T. pack " \" " ) stripped
390+ then (Just (T. init $ T. tail stripped), titleRemaining)
391+ else (Nothing , rest)
392+ Nothing -> (Nothing , rest)
393+
394+ linkTextParsed = parseInline linkTextStart
395+ nextText = T. drop 1 remainingText
396+ in case linkTextParsed of
397+ [] -> Link cleanUrl cleanUrl Nothing : parseInline nextText
398+ [PlainText t] -> Link t cleanUrl titlePart : parseInline nextText
399+ multipleElems -> Link (T. concat $ map renderPlainText multipleElems) cleanUrl titlePart : parseInline nextText
400+ where
401+ renderPlainText (PlainText t) = t
402+ renderPlainText _ = T. empty
403+
404+ parseAngleBracketLink :: Text -> [MDElement ]
405+ parseAngleBracketLink text =
406+ let (link, rest) = T. break (== ' >' ) (T. tail text)
407+ cleanLink = T. strip link
408+ in Link cleanLink cleanLink Nothing : parseInline (T. drop 1 rest)
409+
410+ renderPlainText :: MDElement -> Text
411+ renderPlainText (PlainText t) = t
412+ renderPlainText (Bold t) = t
413+ renderPlainText (Italic t) = t
414+ renderPlainText (BoldItalic t) = t
415+ renderPlainText (Paragraph elems) = T. concat $ map renderPlainText elems
416+ renderPlainText _ = T. empty
417+
368418parseCheckbox :: Text -> [MDElement ]
369419parseCheckbox text
370420 | T. isPrefixOf (T. pack " [x]" ) text || T. isPrefixOf (T. pack " [X]" ) text =
0 commit comments