package org.limewire.ui.swing.friends.chat; import java.util.regex.Matcher; import java.util.regex.Pattern; class URLWrapper { private static Pattern REGEX; public static boolean isURL(String input) { Matcher matcher = getRegex().matcher(input.toLowerCase()); return matcher.matches(); } public static String createAnchorTag(String url, String text) { StringBuilder bldr = new StringBuilder(); bldr.append("<a href=\""); if (url.matches("magnet://.*")) { //no-op guard to prevent appending http:// } else if (!url.matches("http[s]?://.*")) { bldr.append("http://"); } bldr.append(url).append("\">"); bldr.append(text); bldr.append("</a>"); return bldr.toString(); } private static Pattern getRegex() { if (REGEX == null) { REGEX = buildRegex(); } return REGEX; } private static Pattern buildRegex() { //This regular expression was borrowed from Mastering Regular Expressions (2nd Edition) String SubDomain = "(?i:[a-z0-9]|[a-z0-9][-a-z0-9]*[a-z0-9])"; String TopDomains = "(?x-i:com\\b \n" + " |aero\\b \n" + " |asia\\b \n" + " |biz\\b \n" + " |cat\\b \n" + " |coop\\b \n" + " |edu\\b \n" + " |gov\\b \n" + " |in(?:t|fo)\\b \n" + " |jobs\\b \n" + " |mil\\b \n" + " |mobi\\b \n" + " |museum\\b \n" + " |name\\b \n" + " |net\\b \n" + " |org\\b \n" + " |pro\\b \n" + " |tel\\b \n" + " |travel\\b \n" + " |[a-z][a-z]\\b \n" + // country codes ") \n"; String Hostname = "(?:" + SubDomain + "\\.)+" + TopDomains; String NOT_IN = ";\"'<>()\\[\\]\\{\\}\\s\\x7F-\\xFF"; String NOT_END = ".,?"; String ANYWHERE = "[^" + NOT_IN + NOT_END + "]"; String EMBEDDED = "[" + NOT_END + "]"; String UrlPath = "/"+ANYWHERE + "*("+EMBEDDED+"+"+ANYWHERE+"+)*"; String Url = "(?x: \n"+ " \\b \n"+ " ## match the hostname part \n"+ " ( \n"+ " (?: magnet | ftp | http s? ): // [-\\w]+(\\.\\w[-\\w]*)+ \n"+ " | \n"+ " " + Hostname + " \n"+ " ) \n"+ " # allow optional port \n"+ " (?: \\d+ )? \n"+ " \n"+ " # rest of url is optional, and begins with / \n"+ " (?: " + UrlPath + ")? \n"+ ")"; return Pattern.compile(Url); } }