Update lanterna, fix bugs, implement save...
[jvcard.git] / src / be / nikiroo / jvcard / parsers / Vcard21Parser.java
CommitLineData
a3b510ab
NR
1package be.nikiroo.jvcard.parsers;
2
bcb54330 3import java.util.Iterator;
a3b510ab
NR
4import java.util.LinkedList;
5import java.util.List;
6
7import be.nikiroo.jvcard.Card;
8import be.nikiroo.jvcard.Contact;
9import be.nikiroo.jvcard.Data;
10import be.nikiroo.jvcard.TypeInfo;
11
12public class Vcard21Parser {
bcb54330
NR
13 public static List<Contact> parse(Iterable<String> textData) {
14 Iterator<String> lines = textData.iterator();
a3b510ab
NR
15 List<Contact> contacts = new LinkedList<Contact>();
16 List<Data> datas = null;
17
bcb54330
NR
18 String nextRawLine = null;
19 if (lines.hasNext()) {
20 nextRawLine = lines.next();
21 while (lines.hasNext() && isContinuation(nextRawLine)) {
22 // BAD INPUT FILE. IGNORE.
23 System.err
24 .println("VCARD Parser warning: CONTINUATION line seen before any data line");
25 nextRawLine = lines.next();
26 }
27 }
28
29 while (nextRawLine != null) {
30 StringBuilder rawLine = new StringBuilder(nextRawLine.trim());
31 if (lines.hasNext())
32 nextRawLine = lines.next();
33 else
34 nextRawLine = null;
35
36 while (isContinuation(nextRawLine)) {
37 rawLine.append(nextRawLine.trim());
38 if (lines.hasNext())
39 nextRawLine = lines.next();
40 else
41 nextRawLine = null;
42 }
43
44 String line = rawLine.toString();
a3b510ab
NR
45 if (line.equals("BEGIN:VCARD")) {
46 datas = new LinkedList<Data>();
47 } else if (line.equals("END:VCARD")) {
48 if (datas == null) {
49 // BAD INPUT FILE. IGNORE.
50 System.err
51 .println("VCARD Parser warning: END:VCARD seen before any VCARD:BEGIN");
52 } else {
53 contacts.add(new Contact(datas));
54 }
55 } else {
56 if (datas == null) {
57 // BAD INPUT FILE. IGNORE.
58 System.err
59 .println("VCARD Parser warning: data seen before any VCARD:BEGIN");
60 } else {
61 List<TypeInfo> types = new LinkedList<TypeInfo>();
62 String name = "";
63 String value = "";
64 String group = "";
65
66 if (line.contains(":")) {
67 String rest = line.split(":")[0];
68 value = line.substring(rest.length() + 1);
69
70 if (rest.contains(";")) {
71 String tab[] = rest.split(";");
72 name = tab[0];
73
74 for (int i = 1; i < tab.length; i++) {
75 if (tab[i].contains("=")) {
76 String tname = tab[i].split("=")[0];
77 String tvalue = tab[i].substring(tname
78 .length() + 1);
79 types.add(new TypeInfo(tname, tvalue));
80 } else {
81 types.add(new TypeInfo(tab[i], ""));
82 }
83 }
84 } else {
85 name = rest;
86 }
87 } else {
88 name = line;
89 }
90
91 if (name.contains(".")) {
92 group = name.split("\\.")[0];
93 name = name.substring(group.length() + 1);
94 }
95
96 datas.add(new Data(types, name, value, group));
97 }
98 }
99 }
100
101 return contacts;
102 }
103
104 // -1 = no bkeys
105 public static String toString(Contact contact, int startingBKey) {
106 StringBuilder builder = new StringBuilder();
107
108 builder.append("BEGIN:VCARD");
109 builder.append("\r\n");
110 builder.append("VERSION:2.1");
111 builder.append("\r\n");
112 for (Data data : contact.getContent()) {
113 if (data.getGroup() != null && !data.getGroup().trim().equals("")) {
114 builder.append(data.getGroup().trim());
115 builder.append('.');
116 }
117 builder.append(data.getName());
118 for (TypeInfo type : data.getTypes()) {
119 builder.append(';');
120 builder.append(type.getName());
121 if (type.getValue() != null
122 && !type.getValue().trim().equals("")) {
123 builder.append('=');
124 builder.append(type.getValue());
125 }
126 }
127 builder.append(':');
bcb54330
NR
128
129 // TODO: bkey!
a3b510ab
NR
130 builder.append(data.getValue());
131 builder.append("\r\n");
132 }
133 builder.append("END:VCARD");
134 builder.append("\r\n");
135
136 return builder.toString();
137 }
138
139 public static String toString(Card card) {
140 StringBuilder builder = new StringBuilder();
141
bcb54330 142 for (Contact contact : card.getContactsList()) {
a3b510ab
NR
143 builder.append(toString(contact, -1));
144 }
bcb54330
NR
145
146 builder.append("\r\n");
a3b510ab
NR
147
148 return builder.toString();
149 }
bcb54330
NR
150
151 /**
152 * Check if the given line is a continuation line or not.
153 *
154 * @param line
155 * the line to check
156 *
157 * @return TRUE if the line is a continuation line
158 */
159 private static boolean isContinuation(String line) {
160 if (line != null && line.length() > 0)
161 return (line.charAt(0) == ' ' || line.charAt(0) == '\t');
162 return false;
163 }
a3b510ab 164}