view src/nabble/view/lib/ViewUtils.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line source

package nabble.view.lib;


// used outside nabble, so do not use Init
public final class ViewUtils {

	private ViewUtils() {}  // never

	private static char removeAccent(char c) {
		int code = (int) c;
		if (code >= 192 && code <= 196) return 'A';
		else if (code >= 200 && code <= 203) return 'E';
		else if (code >= 204 && code <= 207) return 'I';
		else if (code >= 210 && code <= 214) return 'O';
		else if (code >= 217 && code <= 220) return 'U';
		else if (code >= 224 && code <= 228) return 'a';
		else if (code >= 232 && code <= 235) return 'e';
		else if (code >= 236 && code <= 239) return 'i';
		else if (code >= 242 && code <= 246) return 'o';
		else if (code >= 249 && code <= 252) return 'u';
		else if (code == 231) return 'c';
		else if (code == 199) return 'C';
		else return c;
	}

	public static String subjectEncode(String s) {
		StringBuilder builder = new StringBuilder();
		final char[] chars = s.toCharArray();
		char lastChar = '-';
		for (char c : chars) {
			c = removeAccent(c);
			boolean isDigit = c >= '0' && c <= '9';
			boolean isLowerChar = c >= 'a' && c <= 'z';
			boolean isUpperChar = c >= 'A' && c <= 'Z';
			if (isDigit || isLowerChar || isUpperChar) {
				builder.append(c);
				lastChar = c;
			} else {
				if (lastChar != '-' && builder.length() > 0)
					builder.append('-');
				lastChar = '-';
			}
		}
		// Truncate if bigger than 100 chars
		if (builder.length() > 100) {
			builder.delete(100, builder.length()-1);
		}

		int lastPos = builder.length()-1;
		if (builder.lastIndexOf("-") == lastPos && lastPos >= 0)
			builder.deleteCharAt(lastPos);
		return builder.toString();
	}

	public static String getDefaultBaseUrl(long siteId,String subject,String host) {
		String subjectPart = subjectEncode(subject).toLowerCase();
		if (subjectPart.length() == 0)
			subjectPart = "x";

		// The max length of a domain is 255 chars, but each part (aka octet) can only
		// have 63 chars (RFC 2181). So we truncate the subject if it goes beyond that size.
		if (subjectPart.length() > 63) {
			subjectPart = subjectPart.substring(0, 62);
		}
		if (subjectPart.endsWith("-"))
			subjectPart = subjectPart.substring(0, subjectPart.length()-1);
		return subjectPart + '.' + siteId + '.' + host;
	}

}