diff --git a/TODO.rst b/TODO.rst index 9f2d873..49d2de0 100644 --- a/TODO.rst +++ b/TODO.rst @@ -1,5 +1,5 @@ * tab and shift-tab bindings for completion -* better url matching regex +* improved matching capabilities (not just urls) * hint mode overlay for urls (like elinks/vimperator/pentadactyl) * scrollback search needs to be improved upstream [1]_ * expose keybindings in ``termite.cfg`` diff --git a/termite.c b/termite.c index 1b21e28..3d7add1 100644 --- a/termite.c +++ b/termite.c @@ -14,7 +14,19 @@ #define CSI "\x1b[" -static const char * const url_regex = "(ftp|http)s?://[-a-zA-Z0-9.?$%&/=_~#.,:;+()]*"; +#define USERCHARS "-[:alnum:]" +#define USERCHARS_CLASS "[" USERCHARS "]" +#define PASSCHARS_CLASS "[-[:alnum:]\\Q,?;.:/!%$^*&~\"#'\\E]" +#define HOSTCHARS_CLASS "[-[:alnum:]]" +#define HOST HOSTCHARS_CLASS "+(\\." HOSTCHARS_CLASS "+)*" +#define PORT "(?:\\:[[:digit:]]{1,5})?" +#define PATHCHARS_CLASS "[-[:alnum:]\\Q_$.+!*,;@&=?/~#%\\E]" +#define PATHTERM_CLASS "[^\\Q]'.}>) \t\r\n,\"\\E]" +#define SCHEME "(?:news:|telnet:|nntp:|file:\\/|https?:|ftps?:|sftp:|webcal:)" +#define USERPASS USERCHARS_CLASS "+(?:" PASSCHARS_CLASS "+)?" +#define URLPATH "(?:(/" PATHCHARS_CLASS "+(?:[(]" PATHCHARS_CLASS "*[)])*" PATHCHARS_CLASS"*)*"PATHTERM_CLASS ")?" + +static const char * const url_regex = SCHEME "//(?:" USERPASS "\\@)?" HOST PORT URLPATH; typedef enum overlay_mode { OVERLAY_HIDDEN = 0,