working on vcard display

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2025-10-07 08:55:30 +02:00
parent e39ae982f4
commit 0ceeba0701
6 changed files with 147 additions and 49 deletions

82
frontend/src/vcard.js Normal file
View File

@@ -0,0 +1,82 @@
export function parse(data){
var code = data.vcard;
const lines = code.split("\n");
let unprocessed = null;
var o = {};
for (var line of lines){
if (unprocessed = null) unprocessed = line;
if (line.startsWith(' ')) { // extend line
unprocessed += line.substring(1);
} else {
// process complete line
const parts = line.split(':');
var prefix = parts[0];
var val = parts.slice(1).join(':');
var key = prefix.split(';')[0].toUpperCase();
switch (key) {
case "ADR": o[key] = parseAdr(prefix,val); break;
default:
if (key) o[prefix]=val;
}
unprocessed = line;
}
}
console.log(o);
}
function parseAdr(key,val){
var parts = val.split(';');
var adr = {
postbox : parts[0],
ext : parts[1],
street : parts[2],
locality : parts[3],
region : parts[4],
code : parts[5],
country : parts[6]
}
parts = key.split(';');
for (let part of parts){
let inner = part.split('=');
if (inner.length<2) continue;
const k = inner[0];
const v = inner.slice(1).join('=');
adr[k] = v;
}
return adr;
}
export function fn(vcard){
const match = vcard.match(/^FN:(.+)$/m);
return match ? match[1].trim() : '';
}
export function org(vcard){
const match = vcard.match(/^ORG:(.+)$/m);
return match ? match[1].trim() : '';
}
export function name(vcard){
const match = vcard.match(/^N:(.+)$/m);
let name = {
family: null,
given: null,
additional: null,
prefix: null,
suffix: null
}
if (match){
const parts = match[1].trim().split(';');
name.family = parts[0];
name.given = parts[1];
name.additional = parts[2];
name.prefix = parts[3];
name.suffix = parts[4];
}
return name;
}
export function byName(a,b){
return fn(a.vcard).localeCompare(fn(b.vcard));
}