package be.nikiroo.jvcard.parsers;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import be.nikiroo.jvcard.TypeInfo;
public class Vcard21Parser {
- public static List<Contact> parse(List<String> lines) {
+ public static List<Contact> parse(Iterable<String> textData) {
+ Iterator<String> lines = textData.iterator();
List<Contact> contacts = new LinkedList<Contact>();
List<Data> datas = null;
- for (String l : lines) {
- String line = l.trim();
+ String nextRawLine = null;
+ if (lines.hasNext()) {
+ nextRawLine = lines.next();
+ while (lines.hasNext() && isContinuation(nextRawLine)) {
+ // BAD INPUT FILE. IGNORE.
+ System.err
+ .println("VCARD Parser warning: CONTINUATION line seen before any data line");
+ nextRawLine = lines.next();
+ }
+ }
+
+ while (nextRawLine != null) {
+ StringBuilder rawLine = new StringBuilder(nextRawLine.trim());
+ if (lines.hasNext())
+ nextRawLine = lines.next();
+ else
+ nextRawLine = null;
+
+ while (isContinuation(nextRawLine)) {
+ rawLine.append(nextRawLine.trim());
+ if (lines.hasNext())
+ nextRawLine = lines.next();
+ else
+ nextRawLine = null;
+ }
+
+ String line = rawLine.toString();
if (line.equals("BEGIN:VCARD")) {
datas = new LinkedList<Data>();
} else if (line.equals("END:VCARD")) {
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(";");
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], ""));
}
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));
builder.append("\r\n");
builder.append("VERSION:2.1");
builder.append("\r\n");
- for (Data data : contact.getContent()) {
+ for (int indexData = 0; indexData < contact.size(); indexData++) {
+ Data data = contact.get(indexData);
if (data.getGroup() != null && !data.getGroup().trim().equals("")) {
builder.append(data.getGroup().trim());
builder.append('.');
}
builder.append(data.getName());
- for (TypeInfo type : data.getTypes()) {
+ for (int indexType = 0; indexType < data.size(); indexType++) {
+ TypeInfo type = data.get(indexType);
builder.append(';');
builder.append(type.getName());
if (type.getValue() != null
}
}
builder.append(':');
-
- //TODO: bkey!
+
+ // TODO: bkey!
builder.append(data.getValue());
builder.append("\r\n");
}
public static String toString(Card card) {
StringBuilder builder = new StringBuilder();
- for (Contact contact : card.getContacts()) {
- builder.append(toString(contact, -1));
+ for (int index = 0; index < card.size(); index++) {
+ builder.append(toString(card.get(index), -1));
}
+ builder.append("\r\n");
+
return builder.toString();
}
+
+ /**
+ * Check if the given line is a continuation line or not.
+ *
+ * @param line
+ * the line to check
+ *
+ * @return TRUE if the line is a continuation line
+ */
+ private static boolean isContinuation(String line) {
+ if (line != null && line.length() > 0)
+ return (line.charAt(0) == ' ' || line.charAt(0) == '\t');
+ return false;
+ }
}