X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2Fparsers%2FVcard21Parser.java;h=4f9431733f122cf3f7b819e22e98fdc3c443ca9b;hb=cf77cb3542f2aefbebdb9aa00b358dbeb4489a73;hp=cc7421672d62ec3b74d3f74ad92ece2f65478a1a;hpb=ce822a7cd8ff95a031e477e37d23c114228cc5b6;p=jvcard.git diff --git a/src/be/nikiroo/jvcard/parsers/Vcard21Parser.java b/src/be/nikiroo/jvcard/parsers/Vcard21Parser.java index cc74216..4f94317 100644 --- a/src/be/nikiroo/jvcard/parsers/Vcard21Parser.java +++ b/src/be/nikiroo/jvcard/parsers/Vcard21Parser.java @@ -64,8 +64,9 @@ public class Vcard21Parser { String group = ""; if (line.contains(":")) { - String rest = line.split(":")[0]; - value = line.substring(rest.length() + 1); + int colIndex = line.indexOf(':'); + String rest = line.substring(0, colIndex); + value = line.substring(colIndex + 1); if (rest.contains(";")) { String tab[] = rest.split(";"); @@ -73,9 +74,11 @@ public class Vcard21Parser { for (int i = 1; i < tab.length; i++) { if (tab[i].contains("=")) { - String tname = tab[i].split("=")[0]; - String tvalue = tab[i].substring(tname - .length() + 1); + int equIndex = tab[i].indexOf('='); + String tname = tab[i] + .substring(0, equIndex); + String tvalue = tab[i] + .substring(equIndex + 1); types.add(new TypeInfo(tname, tvalue)); } else { types.add(new TypeInfo(tab[i], "")); @@ -89,8 +92,9 @@ public class Vcard21Parser { } if (name.contains(".")) { - group = name.split("\\.")[0]; - name = name.substring(group.length() + 1); + int dotIndex = name.indexOf('.'); + group = name.substring(0, dotIndex); + name = name.substring(dotIndex + 1); } datas.add(new Data(types, name, value, group)); @@ -101,51 +105,94 @@ public class Vcard21Parser { return contacts; } - // -1 = no bkeys - public static String toString(Contact contact, int startingBKey) { - StringBuilder builder = new StringBuilder(); + /** + * Return a {@link String} representation of the given {@link Card}, line by + * line. + * + * @param card + * the card to convert + * + * @param startingBKey + * the starting BKey number (all the other will follow) or -1 for + * no BKey + * + * @return the {@link String} representation + */ + public static List toStrings(Contact contact, int startingBKey) { + List lines = new LinkedList(); - builder.append("BEGIN:VCARD"); - builder.append("\r\n"); - builder.append("VERSION:2.1"); - builder.append("\r\n"); - for (Data data : contact.getContent()) { + lines.add("BEGIN:VCARD"); + lines.add("VERSION:2.1"); + for (Data data : contact) { + StringBuilder dataBuilder = new StringBuilder(); if (data.getGroup() != null && !data.getGroup().trim().equals("")) { - builder.append(data.getGroup().trim()); - builder.append('.'); + dataBuilder.append(data.getGroup().trim()); + dataBuilder.append('.'); } - builder.append(data.getName()); - for (TypeInfo type : data.getTypes()) { - builder.append(';'); - builder.append(type.getName()); + dataBuilder.append(data.getName()); + for (TypeInfo type : data) { + dataBuilder.append(';'); + dataBuilder.append(type.getName()); if (type.getValue() != null && !type.getValue().trim().equals("")) { - builder.append('='); - builder.append(type.getValue()); + dataBuilder.append('='); + dataBuilder.append(type.getValue()); } } - builder.append(':'); + dataBuilder.append(':'); // TODO: bkey! - builder.append(data.getValue()); - builder.append("\r\n"); + dataBuilder.append(data.getValue()); + + // RFC says: Content lines SHOULD be folded to a maximum width of 75 + // octets -> since it is SHOULD, we will just cut it as 74/75 chars + // depending if the last one fits in one char (note: chars != octet) + boolean continuation = false; + while (dataBuilder.length() > 0) { + int stop = 74; + if (continuation) + stop--; // the space takes 1 + if (dataBuilder.length() > stop) { + char car = dataBuilder.charAt(stop - 1); + // RFC forbids cutting a character in 2 + if (Character.isHighSurrogate(car)) { + stop++; + } + } + + stop = Math.min(stop, dataBuilder.length()); + if (continuation) { + lines.add(' ' + dataBuilder.substring(0, stop)); + } else { + lines.add(dataBuilder.substring(0, stop)); + } + dataBuilder.delete(0, stop); + + continuation = true; + } } - builder.append("END:VCARD"); - builder.append("\r\n"); + lines.add("END:VCARD"); - return builder.toString(); + return lines; } - public static String toString(Card card) { - StringBuilder builder = new StringBuilder(); + /** + * Return a {@link String} representation of the given {@link Card}, line by + * line. + * + * @param card + * the card to convert + * + * @return the {@link String} representation + */ + public static List toStrings(Card card) { + List lines = new LinkedList(); - for (Contact contact : card.getContactsList()) { - builder.append(toString(contact, -1)); + for (Contact contact : card) { + lines.addAll(toStrings(contact, -1)); } - - builder.append("\r\n"); - return builder.toString(); + return lines; } /**