6 changed files with 147 additions and 49 deletions
@ -0,0 +1,15 @@ |
|||||||
|
<script> |
||||||
|
import FN from './FN.svelte'; |
||||||
|
import Name from './Name.svelte'; |
||||||
|
import Org from './Org.svelte'; |
||||||
|
|
||||||
|
let { contact } = $props(); |
||||||
|
</script> |
||||||
|
|
||||||
|
<div> |
||||||
|
<Org vcard={contact.vcard} /><br/> |
||||||
|
<FN vcard={contact.vcard} /><br/> |
||||||
|
<Name vcard={contact.vcard} /> |
||||||
|
<hr/> |
||||||
|
<pre>{contact.vcard}</pre> |
||||||
|
</div> |
||||||
@ -0,0 +1,9 @@ |
|||||||
|
<script> |
||||||
|
import { fn } from '../../vcard.js'; |
||||||
|
|
||||||
|
let { vcard } = $props(); |
||||||
|
|
||||||
|
let name = $derived(fn(vcard)); |
||||||
|
</script> |
||||||
|
|
||||||
|
<span class="formatted name">{name}</span> |
||||||
@ -0,0 +1,23 @@ |
|||||||
|
<script> |
||||||
|
import { name } from '../../vcard.js'; |
||||||
|
|
||||||
|
let { vcard } = $props(); |
||||||
|
|
||||||
|
let n = $derived(name(vcard)); |
||||||
|
</script> |
||||||
|
|
||||||
|
{#if n.prefix} |
||||||
|
<span class="name prefix">{n.prefix}</span> |
||||||
|
{/if} |
||||||
|
{#if n.given} |
||||||
|
<span class="given name">{n.given}</span> |
||||||
|
{/if} |
||||||
|
{#if n.family} |
||||||
|
<span class="family name">{n.family}</span> |
||||||
|
{/if} |
||||||
|
{#if n.additional} |
||||||
|
<span class="additional name">{n.additional}</span> |
||||||
|
{/if} |
||||||
|
{#if n.suffix} |
||||||
|
<span class="name suffix">{n.suffix}</span> |
||||||
|
{/if} |
||||||
@ -0,0 +1,9 @@ |
|||||||
|
<script> |
||||||
|
import { org } from '../../vcard.js'; |
||||||
|
|
||||||
|
let { vcard } = $props(); |
||||||
|
|
||||||
|
let o = $derived(org(vcard)); |
||||||
|
</script> |
||||||
|
|
||||||
|
<span class="organization">{o}</span> |
||||||
@ -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)); |
||||||
|
} |
||||||
Loading…
Reference in new issue