Changeset ea3e722 in Klonkt for src/services/ap-core.js


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/ap-core.js

    rd60c498 rea3e722  
    124124  return { label, slug };
    125125}
     126
     127/**
     128 * De #hashtags die in het LIJF van een post gelinkt staan, zoals ze GESCHREVEN
     129 * zijn. De slug in de href is kleingeschreven -- dat is een adres -- maar de
     130 * naam niet: #DoenweNiet blijft #DoenweNiet.
     131 */
     132export function hashtagTags(base, content) {
     133  const tags = [], seen = new Set();
     134  const re = /class="[^"]*\bhashtag\b[^"]*"[^>]*>#([\p{L}\p{M}\p{N}_]+)</giu;
     135  let m;
     136  while ((m = re.exec(content || ''))) {
     137    const k = m[1].toLowerCase();
     138    if (seen.has(k)) continue; seen.add(k);
     139    tags.push({ type: 'Hashtag', href: `${base}/tag/${encodeURIComponent(k)}`, name: '#' + m[1] });
     140  }
     141  return tags;
     142}
     143
     144/**
     145 * Het tagveld van een post en de #hashtags uit het lijf, samen en ontdubbeld.
     146 *
     147 * HET LIJF GAAT VOOR (Robin, 9-8): staat een tag allebei, dan wint de vorm
     148 * zoals hij GESCHREVEN is. Het tagveld gaat door tagParts, en die maakt van
     149 * "Doen we Niet" het CamelCase #DoenWeNiet -- nodig, want een hashtag mag geen
     150 * spaties bevatten. Maar als iemand in zijn tekst #DoenweNiet heeft getypt is
     151 * dat geen benadering meer maar de tag zelf, en dan hoort die te staan zoals
     152 * hij er staat. Eerder won het veld, en verdween de geschreven vorm.
     153 */
     154export function buildHashtagList(base, tagsField, content) {
     155  const out = [], seen = new Set();
     156  for (const h of hashtagTags(base, content)) {
     157    const k = h.name.slice(1).toLowerCase(); if (seen.has(k)) continue; seen.add(k);
     158    out.push(h);
     159  }
     160  for (const t of normalizeTags(tagsField)) {
     161    const p = tagParts(t); if (!p || seen.has(p.slug)) continue; seen.add(p.slug);
     162    out.push({ type: 'Hashtag', href: `${base}/tag/${encodeURIComponent(p.slug)}`, name: '#' + p.label });
     163  }
     164  return out;
     165}
Note: See TracChangeset for help on using the changeset viewer.