working on vcard destructuring

This commit is contained in:
2025-10-07 21:03:47 +02:00
parent da1fdc85a3
commit 3e8c3f1d3a
4 changed files with 64 additions and 52 deletions

View File

@@ -0,0 +1,31 @@
<script>
import { addr } from '../../vcard.js';
let { vcard } = $props();
let address = $derived(addr(vcard));
</script>
<div class="address">
{#if address.box}
<span class="post_box">{address.box}</span>
{/if}
{#if address.ext}
<span class="extended">{address.ext}</span>
{/if}
{#if address.street}
<span class="street">{address.street}</span>
{/if}
{#if address.code}
<span class="code">{address.code}</span>
{/if}
{#if address.loc}
<span class="locality">{address.loc}</span>
{/if}
{#if address.region}
<span class="region">{address.region}</span>
{/if}
{#if address.country}
<span class="country">{address.country}</span>
{/if}
</div>

View File

@@ -1,4 +1,5 @@
<script> <script>
import Address from './Address.svelte';
import FN from './FN.svelte'; import FN from './FN.svelte';
import Name from './Name.svelte'; import Name from './Name.svelte';
import Org from './Org.svelte'; import Org from './Org.svelte';
@@ -7,9 +8,10 @@
</script> </script>
<div> <div>
<Org vcard={contact.vcard} /><br/> <FN vcard={contact.vcard} />
<FN vcard={contact.vcard} /><br/> <Org vcard={contact.vcard} />
<Name vcard={contact.vcard} /> <Name vcard={contact.vcard} />
<Address vcard={contact.vcard} />
<hr/> <hr/>
<pre>{contact.vcard}</pre> <pre>{contact.vcard}</pre>
</div> </div>

View File

@@ -6,18 +6,20 @@
let n = $derived(name(vcard)); let n = $derived(name(vcard));
</script> </script>
<div class="name">
{#if n.prefix} {#if n.prefix}
<span class="name prefix">{n.prefix}</span> <span class="prefix">{n.prefix}</span>
{/if} {/if}
{#if n.given} {#if n.given}
<span class="given name">{n.given}</span> <span class="given">{n.given}</span>
{/if}
{#if n.family}
<span class="family name">{n.family}</span>
{/if} {/if}
{#if n.additional} {#if n.additional}
<span class="additional name">{n.additional}</span> <span class="additional">{n.additional}</span>
{/if}
{#if n.family}
<span class="family">{n.family}</span>
{/if} {/if}
{#if n.suffix} {#if n.suffix}
<span class="name suffix">{n.suffix}</span> <span class="suffix">{n.suffix}</span>
{/if} {/if}
</div>

View File

@@ -1,51 +1,28 @@
export function parse(data){ export function addr(vcard){
var code = data.vcard; const match = vcard.match(/^ADR:(.+)$/m);
const lines = code.split("\n"); let adr = {
let unprocessed = null; box: null,
var o = {}; ext: null,
for (var line of lines){ street: null,
if (unprocessed = null) unprocessed = line; locality: null,
if (line.startsWith(' ')) { // extend line region: null,
unprocessed += line.substring(1); code: null,
} else { country: null
// 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); if (match){
} const parts = match[1].trim().split(';');
adr.box = parts[0];
function parseAdr(key,val){ adr.ext = parts[1];
var parts = val.split(';'); adr.street = parts[2];
var adr = { adr.loc = parts[3];
postbox : parts[0], adr.region = parts[4];
ext : parts[1], adr.code = parts[5];
street : parts[2], adr.country = parts[6];
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; return adr;
} }
export function fn(vcard){ export function fn(vcard){
const match = vcard.match(/^FN:(.+)$/m); const match = vcard.match(/^FN:(.+)$/m);
return match ? match[1].trim() : ''; return match ? match[1].trim() : '';