blob: ddb9bb3217d5b9a4583ecd957fcf0574df4687c2 [file] [log] [blame]
# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd
"""Some constants of regexes used in Monorail to validate urls and emails."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
import re
import settings
# We linkify http, https, ftp, and mailto schemes only.
LINKIFY_SCHEMES = r'https?://|ftp://|mailto:'
# This regex matches shorthand URLs that we know are valid.
# Example: go/monorail
# The scheme is optional, and if it is missing we add it to the link.
IS_A_SHORT_LINK_RE = re.compile(
r'(?<![-/._])\b(%s)?' # Scheme is optional for short links.
r'(%s)' # The list of know shorthand links from settings.py
r'/([^\s<]+)' # Allow anything, checked with validation code.
% (LINKIFY_SCHEMES, '|'.join(settings.autolink_shorthand_hosts)),
re.UNICODE)
IS_A_NUMERIC_SHORT_LINK_RE = re.compile(
r'(?<![-/._])\b(%s)?' # Scheme is optional for short links.
r'(%s)' # The list of know shorthand links from settings.py
r'/([0-9]+)' # Allow digits only for these domains.
% (LINKIFY_SCHEMES, '|'.join(settings.autolink_numeric_shorthand_hosts)),
re.UNICODE)
# This regex matches fully-formed URLs, starting with a scheme.
# Example: http://chromium.org or mailto:user@example.com
# We link to the specified URL without adding anything.
# Also count a start-tag '<' as a url delimeter, since the autolinker
# is sometimes run against html fragments.
IS_A_LINK_RE = re.compile(
r'\b(%s)' # Scheme must be a whole word.
r'([^\s<]+)' # Allow anything, checked with validation code.
% LINKIFY_SCHEMES, re.UNICODE)
# This regex matches text that looks like a URL despite lacking a scheme.
# Example: crrev.com
# Since the scheme is not specified, we prepend "http://".
IS_IMPLIED_LINK_RE = re.compile(
r'(?<![-/._])\b[a-z]((-|\.)?[a-z0-9])+\.(com|net|org|edu)\b' # Domain.
r'(/[^\s<]*)?', # Allow anything, check with validation code.
re.UNICODE)
# This regex matches text that looks like an email address.
# Example: user@example.com
# These get linked to the user profile page if it exists, otherwise
# they become a mailto:.
IS_IMPLIED_EMAIL_RE = re.compile(
r'\b[a-z]((-|\.)?[a-z0-9])+@' # Username@
r'[a-z]((-|\.)?[a-z0-9])+\.(com|net|org|edu)\b', # Domain
re.UNICODE)