chat: linkificér svar (escape-then-link) + ret kontakt-email til asger@weirsoe.dk overalt
Build & Deploy / deploy (push) Successful in 2m9s
Build & Deploy / deploy (push) Successful in 2m9s
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
1aa918c13d
commit
24492fae93
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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, '&').replace(/</g, '<').replace(/>/g, '>');
|
||||
}
|
||||
// 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.';
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user