from typing import TYPE_CHECKING, Match

from ..util import escape_url

if TYPE_CHECKING:
    from ..core import InlineState
    from ..inline_parser import InlineParser
    from ..markdown import Markdown

__all__ = ['url']

URL_LINK_PATTERN = r'''https?:\/\/[^\s<]+[^<.,:;"')\]\s]'''


def parse_url_link(inline: "InlineParser", m: Match[str], state: "InlineState") -> int:
    text = m.group(0)
    pos = m.end()
    if state.in_link:
        inline.process_text(text, state)
        return pos
    state.append_token({
        'type': 'link',
        'children': [{'type': 'text', 'raw': text}],
        'attrs': {'url': escape_url(text)},
    })
    return pos


def url(md: "Markdown") -> None:
    md.inline.register("url_link", URL_LINK_PATTERN, parse_url_link)
