Changeset 9c9a3d9 in Klonkt


Ignore:
Timestamp:
08/08/2026 01:23:14 AM (5 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
02c6231
Parents:
c4b24b3
Message:

FEP-9098 emoji ook op de antwoorden in de thread

Barts punt (8-8): de threadroute liet de tag-array vallen, dus een reply
van een Mastodon-account rendert zijn :shortcode:-emoji als kale tekst.
Alleen de echte Emoji-tags gaan nu door -- naam plus geschoond
icoon-adres, gekapt op 30 -- en de rest van de vreemde tags blijft
achter. De byline-emoji zaten er al in via actorInfo.

Test uitgebreid: de emoji komt door, de hashtag en de emoji zonder
bruikbaar icoon niet, en een antwoord zonder emoji draagt geen tag-veld.

Co-Authored-By: Claude Opus 5 <noreply@…>

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    rc4b24b3 r9c9a3d9  
    34733473      return out.length ? out.slice(0, 8) : undefined;
    34743474    })(),
     3475    // FEP-9098: de custom emoji van het antwoord (":shortcode:" -> plaatje).
     3476    // Zonder deze tags rendert een reply van een Mastodon-account zijn emoji
     3477    // als kale tekst (Barts punt, 8-8). Alleen naam + geschoond icoon-adres
     3478    // gaan door; de rest van de vreemde tag-array blijft achter.
     3479    tag: (() => {
     3480      const j = extractEmojiTags(o.tag);
     3481      if (!j) return undefined;
     3482      const out = JSON.parse(j)
     3483        .map((t) => ({ type: 'Emoji', name: t.name, icon: { type: 'Image', url: safeUrl(t.icon && (t.icon.url || (Array.isArray(t.icon) && t.icon[0] && t.icon[0].url))) } }))
     3484        .filter((t) => t.icon.url)
     3485        .slice(0, 30);
     3486      return out.length ? out : undefined;
     3487    })(),
    34753488    'shaer:author': actorInfo(authors.get(actorUri), actorUri),
    34763489  })).sort((a, b) => String(a.published || '').localeCompare(String(b.published || '')));
  • test/thread.test.js

    rc4b24b3 r9c9a3d9  
    4141const antwoorden = [
    4242  reply(1, VREEMDE, '<p>Hoi! <script>alert(1)</script></p>', '2026-08-01T10:00:00Z'),
    43   reply(2, TANTE, '<p>Dag lieverd</p>', '2026-08-01T09:00:00Z'),
     43  { ...reply(2, TANTE, '<p>Dag lieverd :hartje:</p>', '2026-08-01T09:00:00Z'),
     44    // FEP-9098 zoals Mastodon hem stuurt, plus een niet-Emoji-tag en een
     45    // emoji zonder bruikbaar icoon: alleen de echte hoort erdoor te komen.
     46    tag: [
     47      { type: 'Emoji', name: ':hartje:', icon: { type: 'Image', url: 'https://203.0.113.20/emoji/hartje.png' } },
     48      { type: 'Emoji', name: ':kapot:', icon: {} },
     49      { type: 'Hashtag', name: '#muziek' },
     50    ] },
    4451  reply(3, GEBLOKT, '<p>naar bericht</p>', '2026-08-01T11:00:00Z'),
    4552];
     
    7077  assert.equal(uit.hidden, 0);
    7178  assert.ok(uit.notes.every((n) => n.attributedTo !== GEBLOKT));
     79  // FEP-9098: alleen de echte emoji komt door -- niet de hashtag, niet de
     80  // emoji zonder icoon -- en het icoon-adres is geschoond.
     81  const tags = uit.notes[0].tag;
     82  assert.equal(tags.length, 1);
     83  assert.equal(tags[0].name, ':hartje:');
     84  assert.equal(tags[0].icon.url, 'https://203.0.113.20/emoji/hartje.png');
     85  assert.ok(!uit.notes[1].tag, 'een antwoord zonder emoji draagt geen tag-veld');
    7286});
    7387
Note: See TracChangeset for help on using the changeset viewer.