Ignore:
Timestamp:
08/09/2026 08:34:57 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
5ae4d61
Parents:
d60c498
Message:

Een hashtag hoort te staan zoals hij geschreven is (Robins punt, 9-8)

Stond een tag zowel in het tagveld als in het lijf van de post, dan won de vorm
uit het veld. Die gaat door tagParts, want een hashtag mag geen spaties
bevatten en "Doen we Niet" wordt daar #DoenWeNiet van. Nodig voor een tag die
alleen in het veld staat -- maar als iemand in zijn tekst #DoenweNiet heeft
getypt is dat geen benadering meer maar de tag zelf, en die verdween als
duplicaat van de genormaliseerde vorm.

Nu gaat het lijf voor: de geschreven vorm wint, en het tagveld vult aan wat er
niet staat. De slug in de href blijft kleingeschreven -- dat is een adres, geen
naam.

En de uitgave-collectie gebruikt nu diezelfde lijst in plaats van een eigen: ze
miste de tags uit de tekst helemaal, en spelde de rest anders dan dezelfde post
elders deed. buildHashtagList en hashtagTags zijn daarvoor van
ActivityPubService naar ap-core verhuisd, want music/ mag daar niet uit
importeren.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    rd60c498 rea3e722  
    2929import Blocklist from './BlocklistService.js';
    3030import * as Guardianship from './guardianship/index.js';
    31 import { PUBLIC, AP_CONTEXT, safeUrl, actorId, noteId, guessMediaType, normalizeTags, tagParts } from './ap-core.js';
     31import { PUBLIC, AP_CONTEXT, safeUrl, actorId, noteId, guessMediaType, normalizeTags, tagParts, hashtagTags, buildHashtagList } from './ap-core.js';
    3232// Doorgeven wat hier altijd vandaan kwam, zodat elke bestaande aanroep blijft werken.
    3333export { AP_CONTEXT, actorId, noteId, guessMediaType };
     
    29602960
    29612961// Extract the AP Hashtag tag objects from already-linked reply content.
    2962 function hashtagTags(base, content) {
    2963   const tags = [], seen = new Set();
    2964   const re = /class="[^"]*\bhashtag\b[^"]*"[^>]*>#([\p{L}\p{M}\p{N}_]+)</giu;
    2965   let m;
    2966   while ((m = re.exec(content || ''))) {
    2967     const k = m[1].toLowerCase();
    2968     if (seen.has(k)) continue; seen.add(k);
    2969     tags.push({ type: 'Hashtag', href: `${base}/tag/${encodeURIComponent(k)}`, name: '#' + m[1] });
    2970   }
    2971   return tags;
    2972 }
    29732962
    29742963// Normalise a post's tags field (array, JSON-string, or comma-string) to an array.
     
    29802969// Merge a post's tags field + the #hashtags linked inline in its body into one deduped
    29812970// Hashtag tag list (with hrefs to our /tag page).
    2982 function buildHashtagList(base, tagsField, content) {
    2983   const out = [], seen = new Set();
    2984   for (const t of normalizeTags(tagsField)) {
    2985     const p = tagParts(t); if (!p || seen.has(p.slug)) continue; seen.add(p.slug);
    2986     out.push({ type: 'Hashtag', href: `${base}/tag/${encodeURIComponent(p.slug)}`, name: '#' + p.label });
    2987   }
    2988   for (const h of hashtagTags(base, content)) {
    2989     const k = h.name.slice(1).toLowerCase(); if (seen.has(k)) continue; seen.add(k);
    2990     out.push(h);
    2991   }
    2992   return out;
    2993 }
     2971// hashtagTags en buildHashtagList staan sinds shaer-38y in ap-core: music/
     2972// heeft dezelfde lijst nodig en mag hier niet uit importeren.
    29942973
    29952974// Extract Mention tag objects from already-linked content (class="u-url mention").
Note: See TracChangeset for help on using the changeset viewer.