diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nabble/view/lib/ViewUtils.java	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,70 @@
+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;
+	}
+
+}