chat: linkificér svar (escape-then-link) + ret kontakt-email til asger@weirsoe.dk overalt
Build & Deploy / deploy (push) Successful in 2m9s

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Asger Geel Weirsøe
2026-06-12 17:06:00 +02:00
co-authored by Claude Opus 4.8
parent 1aa918c13d
commit 24492fae93
7 changed files with 21 additions and 9 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
Contact: mailto:asger@weircon.dk
Contact: mailto:asger@weirsoe.dk
Expires: 2027-06-30T22:00:00.000Z
Preferred-Languages: da, en
Canonical: https://asger.xn--weirse-fya.dk/.well-known/security.txt
+1 -1
View File
@@ -30,7 +30,7 @@
KONTAKT
-------
Web: https://asger.weirsøe.dk
Email: asger@weircon.dk
Email: asger@weirsoe.dk
LinkedIn: linkedin.com/in/ag-weirsøe
Mastodon: @asgerweirsoee@mastodon.social
Git: gitea.weircon.dk/agw
+1 -1
View File
@@ -1,6 +1,6 @@
/* TEAM */
Alt det her: Asger Geel Weirsøe
Kontakt: asger@weircon.dk
Kontakt: asger@weirsoe.dk
Mastodon: @asgerweirsoee@mastodon.social
Lokation: Nørresundby, Danmark
+1 -1
View File
@@ -57,7 +57,7 @@
{ type: 'action', title: 'Tema: mørkt', run: () => setTheme('dark') },
{ type: 'action', title: 'Tema: lyst', run: () => setTheme('light') },
{ type: 'action', title: 'Tema: terminal', run: () => setTheme('terminal') },
{ type: 'action', title: 'Kopiér email (asger@weircon.dk)', run: () => navigator.clipboard?.writeText('asger@weircon.dk') },
{ type: 'action', title: 'Kopiér email (asger@weirsoe.dk)', run: () => navigator.clipboard?.writeText('asger@weirsoe.dk') },
{ type: 'link', title: 'LinkedIn ↗', url: 'https://www.linkedin.com/in/ag-weirs%C3%B8e/', ext: true },
{ type: 'link', title: 'Mastodon ↗', url: 'https://mastodon.social/@asgerweirsoee', ext: true },
{ type: 'link', title: 'Gitea ↗', url: 'https://gitea.weircon.dk/agw', ext: true },
+2 -2
View File
@@ -4,7 +4,7 @@ export const SITE = {
description: 'Asger Weirsøe er datalog (cand.scient. fra Aalborg Universitet) og Technical Solution Architect hos Digisense. Peppol, NemHandel, e-faktura, selvhosting, Proxmox og AI.',
url: 'https://asger.xn--weirse-fya.dk',
lang: 'da',
email: 'asger@weircon.dk',
email: 'asger@weirsoe.dk',
location: 'Nørresundby, Danmark',
giteaUser: 'agw',
giteaBase: 'https://gitea.weircon.dk',
@@ -21,7 +21,7 @@ export const SOCIALS = [
{ href: 'https://www.linkedin.com/in/ag-weirs%C3%B8e/', label: 'LinkedIn' },
{ href: 'https://mastodon.social/@asgerweirsoee', label: 'Mastodon' },
{ href: 'https://gitea.weircon.dk/agw', label: 'Gitea' },
{ href: 'mailto:asger@weircon.dk', label: 'Email' },
{ href: 'mailto:asger@weirsoe.dk', label: 'Email' },
];
// Styr hvad der vises på /projekter.
+14 -2
View File
@@ -24,12 +24,24 @@ import Base from '../layouts/Base.astro';
var form = document.getElementById('chat-form');
if (!form || form.__wired) return; form.__wired = true;
var history = [];
function esc(s) {
return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}
// Escape FØRST, linkificér så — rene URL'er og e-mails bliver klikbare, intet HTML slipper igennem.
function linkify(text) {
var html = esc(text);
html = html.replace(/\b(https?:\/\/[^\s<]+[^\s<.,!?:;)])/g,
'<a href="$1" target="_blank" rel="noopener" class="text-accent underline">$1</a>');
html = html.replace(/\b([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})\b/g,
'<a href="mailto:$1" class="text-accent underline">$1</a>');
return html;
}
function bubble(role, text) {
var log = document.getElementById('chat-log');
var d = document.createElement('div');
d.className = 'rounded-2xl border border-border p-4 text-sm whitespace-pre-wrap ' +
(role === 'user' ? 'bg-surface-2 ml-8' : 'bg-surface/60 mr-8');
d.textContent = text;
if (role === 'user') d.textContent = text; else d.innerHTML = linkify(text);
log.appendChild(d);
d.scrollIntoView({ behavior: 'smooth', block: 'end' });
return d;
@@ -50,7 +62,7 @@ import Base from '../layouts/Base.astro';
});
var data = await r.json();
if (!r.ok) { wait.textContent = data.error || 'Chatten er offline lige nu — prøv senere.'; return; }
wait.textContent = data.reply;
wait.innerHTML = linkify(data.reply);
history.push({ role: 'assistant', content: data.reply });
} catch (_) {
wait.textContent = 'Kunne ikke nå chatten — prøv igen om lidt.';
+1 -1
View File
@@ -38,7 +38,7 @@ const stack = [
<section class="mt-10">
<h2 class="text-sm font-semibold uppercase tracking-widest text-accent">Sikkerhed</h2>
<p class="mt-3 max-w-2xl text-sm text-muted">
Fundet noget der ser forkert ud? Skriv til <a class="text-accent hover:underline" href="mailto:asger@weircon.dk">asger@weircon.dk</a>
Fundet noget der ser forkert ud? Skriv til <a class="text-accent hover:underline" href="mailto:asger@weirsoe.dk">asger@weirsoe.dk</a>
— der ligger også en <a class="text-accent hover:underline" href="/.well-known/security.txt">security.txt</a> (RFC 9116).
Og ja, der er en <a class="text-accent hover:underline" href="/humans.txt">humans.txt</a> til de nysgerrige.
</p>