From 0e04c583a6971f8df97a4ba997a47f2c45967146 Mon Sep 17 00:00:00 2001 From: Kolkman Date: Sun, 6 Sep 2026 10:48:07 +0200 Subject: [PATCH] Character count in firefox plugin --- CHANGELOG.MD | 1 + VIBE/CHAT_LOG.md | 6 ++ VIBE/PROMPTS.md | 1 + XPI/unsigned/LinkLog-0.3.0.xpi | Bin 0 -> 53033 bytes webextension/_locales/de/messages.json | 4 +- webextension/_locales/en-US/messages.json | 25 +++++++ webextension/_locales/es/messages.json | 4 +- webextension/_locales/fr/messages.json | 4 +- webextension/_locales/nl/messages.json | 4 +- webextension/manifest.json | 2 +- webextension/popup.css | 12 ++++ webextension/popup.html | 1 + webextension/popup.js | 83 +++++++++++++++++++++- 13 files changed, 141 insertions(+), 6 deletions(-) create mode 100644 XPI/unsigned/LinkLog-0.3.0.xpi diff --git a/CHANGELOG.MD b/CHANGELOG.MD index b559560..0724bde 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -5,6 +5,7 @@ * The feed now loads a user-selectable number of entries per page (default 25, configurable via `LINKLOG_FRONTEND_LOADPOSTS`) with Previous/Next and numbered page navigation * Moved tag/user filtering, search, and sorting to the backend, so the feed API returns only the matching, paginated results * The New Entry page shows a live character count and warns when the assembled post would exceed the configurable `LINKLOG_MAX_POST_CHARACTERS` limit (default 500), to help avoid failed Mastodon posts + * The Firefox extension popup now shows the same live character count and over-limit warning as the New Entry page (version 0.3.0) ### Fixed * Restored tag and user filtering on the feed: the decorative header arc no longer intercepts clicks on the filter dropdowns diff --git a/VIBE/CHAT_LOG.md b/VIBE/CHAT_LOG.md index 68f9e9c..eac3f66 100644 --- a/VIBE/CHAT_LOG.md +++ b/VIBE/CHAT_LOG.md @@ -1610,4 +1610,10 @@ In the new-entry form, provide a warning when the total ammount of characters is ### Assistant outcome Added a `LINKLOG_MAX_POST_CHARACTERS` setting (default 500) exposed via `GET /api/public/config`. The New Entry page now shows a live `used/limit characters` counter that recalculates on every relevant input (title, URL, comment, tags, checkbox toggles) by assembling the estimated Mastodon post text the same way the backend's Mastodon plugin does, and switches to a warning style when the limit is exceeded. Verified with the full backend test suite (56 passed) and a live smoke test of `/api/public/config` and the rendered New Entry page. + +### User +Implement the same functionality in the firefox plugin + +### Assistant outcome +Added the same live character-count warning to the Firefox extension popup: it fetches `/api/public/config` for the limit and the user's `/api/user/plugins/mastodon` post prefix, estimates the assembled Mastodon post length the same way as the New Entry page and backend plugin, and shows a localized `used/limit characters` counter (with an over-limit warning message) that updates on every relevant input and tag toggle. Added the `characterCount`/`characterCountOverLimit` translations to all five locale files (en-US, de, es, fr, nl) and verified all locale JSON files parse and `popup.js` passes a Node syntax check. # Chat Log diff --git a/VIBE/PROMPTS.md b/VIBE/PROMPTS.md index 9b37392..912d74d 100644 --- a/VIBE/PROMPTS.md +++ b/VIBE/PROMPTS.md @@ -314,6 +314,7 @@ If the user uses the filters and/or search in the toolbox then those should limi 259. Make sure the CHANGELOG reflects all changes since commit 74b2c400c6 260. Add a skill to maintain the changelog.md 261. In the new-entry form, provide a warning when the total ammount of characters is over LINKLOG_MAX_POST_CHARACTERS=500 (also indicat the number of characters used/500 count). This is to prevent Mastodon posts from failing - so all characters should be counted. +262. Implement the same functionality in the firefox plugin ## Future entries diff --git a/XPI/unsigned/LinkLog-0.3.0.xpi b/XPI/unsigned/LinkLog-0.3.0.xpi new file mode 100644 index 0000000000000000000000000000000000000000..80679a8785ea127883337ff55adadc407361ff81 GIT binary patch literal 53033 zcmagFV~j3Lpso3~ZQH%uw(Z_++qP}nwr$(CZQI)2eZQF>Cpnp9ZYt|vB~_KI%F3!I zB`*yEiV6S*Kms0>$#q^Qx+hIe!7#}SK)aZdR=?_3bz>cD-qr#ywLO_59*s z-cDTc`q2JE{cSLIL{8foAQu8c5ihwIg@j5e^dXvTJP8l2@P$vx(&X=EYMz{G9z|cr z%g{R|tghs73R97M(}(2(d2`7P7&KkYYCQe{6=e{m0`I@tlrZz3>DhW1=mY6#!jM24 zyRl_D_k_-yfT{5|*JIf3*MudAI_31ZSITPiu)_rO9Nx{w`$O&PZiYv7Wuc5f({pA8 zmOvsusAh{R=5AGH`TZ8`T$)nW%(nHgVReYmrHl9OdI zV_lgSOaS186Y!spZ~@kKW_EN=u4ezQVM+cB(8pBdHjMB!(Hab@24;ymGu$ zcDcjo`#G4oI{C^9b8CBZlcWE4Ntc?{b@oPYd#B6S^Zvx%*JX(@)iq}3MxWc$+t=mc z>EPz~aHaQs7}eL+soDC~#?QCi>;2OHZ_STxAf)l%!%Nd$s$aX`cN+WLZE95&7m7}ArKWl4udwqI) zV=q4kCogIUbGyBrK0mkEAa$IG^g2dNcWW4N^mO-7v;TfxM~4j_J`UZf|#%^4@*zXCJ(b#*+wi_jbQe%D_K&zgluF z&y(Ej@_54{_xQHEyFA{1O#KK3Z`=sF>-;qG_WC+X9ellG(t5jmzCSMy>gw!rx4r$G z+e@{-K3A#VtzP7slAiVkYWc_}gqNBU}L=nghp2;r;{`x#P zdU(6LzTI|xg|W-g@A7zgw|^g`{VX2v`+2BH>E%$TsS%yEyv&VC{~krz-mo@nUVpQq zrcvwut(vRR(LGUJTYmgt$-F!`{Wt

Ib#Dl>ZkeNB?{gyyr&U8g20}gUG1X3XY)s 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 o->kH9D*9|;Z7*I~dWhx=*0b#36y}_93RqvSS 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 YeZ&9a#YsH?*a*I6z&>)jS>mJL0HMO32LJ#7 literal 0 HcmV?d00001 diff --git a/webextension/_locales/de/messages.json b/webextension/_locales/de/messages.json index 7a5f1e8..948bb5e 100644 --- a/webextension/_locales/de/messages.json +++ b/webextension/_locales/de/messages.json @@ -53,5 +53,7 @@ "loginFailed": {"message": "Anmeldung fehlgeschlagen"}, "loggedInSuccessfully": {"message": "Erfolgreich angemeldet"}, "unableToLogIn": {"message": "Anmeldung nicht möglich. Überprüfe Backend-URL und Zugangsdaten."}, - "signedOut": {"message": "Abgemeldet"} + "signedOut": {"message": "Abgemeldet"}, + "characterCount": {"message": "$USED$/$LIMIT$ Zeichen", "placeholders": {"used": {"content": "$1"}, "limit": {"content": "$2"}}}, + "characterCountOverLimit": {"message": "$USED$/$LIMIT$ Zeichen - überschreitet das Mastodon-Beitragslimit um $OVER$", "placeholders": {"used": {"content": "$1"}, "limit": {"content": "$2"}, "over": {"content": "$3"}}} } diff --git a/webextension/_locales/en-US/messages.json b/webextension/_locales/en-US/messages.json index cb43c41..726eae2 100644 --- a/webextension/_locales/en-US/messages.json +++ b/webextension/_locales/en-US/messages.json @@ -181,5 +181,30 @@ }, "signedOut": { "message": "Signed out" + }, + "characterCount": { + "message": "$USED$/$LIMIT$ characters", + "placeholders": { + "used": { + "content": "$1" + }, + "limit": { + "content": "$2" + } + } + }, + "characterCountOverLimit": { + "message": "$USED$/$LIMIT$ characters - exceeds the Mastodon post limit by $OVER$", + "placeholders": { + "used": { + "content": "$1" + }, + "limit": { + "content": "$2" + }, + "over": { + "content": "$3" + } + } } } \ No newline at end of file diff --git a/webextension/_locales/es/messages.json b/webextension/_locales/es/messages.json index b445b7d..71a3ee3 100644 --- a/webextension/_locales/es/messages.json +++ b/webextension/_locales/es/messages.json @@ -53,5 +53,7 @@ "loginFailed": {"message": "Error de inicio de sesión"}, "loggedInSuccessfully": {"message": "Sesión iniciada correctamente"}, "unableToLogIn": {"message": "No se pudo iniciar sesión. Comprueba la URL y las credenciales."}, - "signedOut": {"message": "Sesión cerrada"} + "signedOut": {"message": "Sesión cerrada"}, + "characterCount": {"message": "$USED$/$LIMIT$ caracteres", "placeholders": {"used": {"content": "$1"}, "limit": {"content": "$2"}}}, + "characterCountOverLimit": {"message": "$USED$/$LIMIT$ caracteres: supera el límite de publicación de Mastodon en $OVER$", "placeholders": {"used": {"content": "$1"}, "limit": {"content": "$2"}, "over": {"content": "$3"}}} } diff --git a/webextension/_locales/fr/messages.json b/webextension/_locales/fr/messages.json index 9b50b9b..826b138 100644 --- a/webextension/_locales/fr/messages.json +++ b/webextension/_locales/fr/messages.json @@ -53,5 +53,7 @@ "loginFailed": {"message": "Échec de la connexion"}, "loggedInSuccessfully": {"message": "Connexion réussie"}, "unableToLogIn": {"message": "Connexion impossible. Vérifiez l’URL du serveur et vos identifiants."}, - "signedOut": {"message": "Déconnecté"} + "signedOut": {"message": "Déconnecté"}, + "characterCount": {"message": "$USED$/$LIMIT$ caractères", "placeholders": {"used": {"content": "$1"}, "limit": {"content": "$2"}}}, + "characterCountOverLimit": {"message": "$USED$/$LIMIT$ caractères : dépasse la limite de publication Mastodon de $OVER$", "placeholders": {"used": {"content": "$1"}, "limit": {"content": "$2"}, "over": {"content": "$3"}}} } diff --git a/webextension/_locales/nl/messages.json b/webextension/_locales/nl/messages.json index 78099fc..12f8010 100644 --- a/webextension/_locales/nl/messages.json +++ b/webextension/_locales/nl/messages.json @@ -53,5 +53,7 @@ "loginFailed": {"message": "Inloggen mislukt"}, "loggedInSuccessfully": {"message": "Succesvol ingelogd"}, "unableToLogIn": {"message": "Inloggen mislukt. Controleer de backend-URL en inloggegevens."}, - "signedOut": {"message": "Uitgelogd"} + "signedOut": {"message": "Uitgelogd"}, + "characterCount": {"message": "$USED$/$LIMIT$ tekens", "placeholders": {"used": {"content": "$1"}, "limit": {"content": "$2"}}}, + "characterCountOverLimit": {"message": "$USED$/$LIMIT$ tekens - overschrijdt de Mastodon-postlimiet met $OVER$", "placeholders": {"used": {"content": "$1"}, "limit": {"content": "$2"}, "over": {"content": "$3"}}} } diff --git a/webextension/manifest.json b/webextension/manifest.json index 3f8deed..7ef2a06 100644 --- a/webextension/manifest.json +++ b/webextension/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "__MSG_extensionName__", - "version": "0.2.0", + "version": "0.3.0", "description": "__MSG_extensionDescription__", "default_locale": "en-US", "permissions": [ diff --git a/webextension/popup.css b/webextension/popup.css index bce211b..9eadcda 100644 --- a/webextension/popup.css +++ b/webextension/popup.css @@ -149,6 +149,18 @@ button { color: #f38ba8; } +.char-count { + margin: -6px 0 10px; + color: #a6adc8; + font-size: 0.75rem; + text-align: right; +} + +.char-count.over-limit { + color: #f38ba8; + font-weight: 600; +} + .auth-session { margin-bottom: 10px; border: 1px solid #585b70; diff --git a/webextension/popup.html b/webextension/popup.html index 41d4a7b..252e235 100644 --- a/webextension/popup.html +++ b/webextension/popup.html @@ -37,6 +37,7 @@ Comment +

Tags diff --git a/webextension/popup.js b/webextension/popup.js index 017c5d7..1942e28 100644 --- a/webextension/popup.js +++ b/webextension/popup.js @@ -14,10 +14,14 @@ const authWarning = document.getElementById('auth-warning'); const warningSettingsButton = document.getElementById('warning-settings'); const authSession = document.getElementById('auth-session'); const refetchTitleButton = document.getElementById('refetch-title'); +const characterCountEl = document.getElementById('character-count'); const sessionStore = browser.storage.session; const t = window.linklogI18n; +let maxPostCharacters = 500; +let mastodonPostPrefix = 'From my #LinkLog: '; + function normalizeBackendOrigin(backendUrl) { try { const url = new URL(backendUrl); @@ -192,9 +196,11 @@ async function loadExistingTags() { const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.value = tag; + checkbox.addEventListener('change', updateCharacterCount); label.append(checkbox, document.createTextNode(` ${tag}`)); return label; })); + updateCharacterCount(); } function getTags() { @@ -203,6 +209,79 @@ function getTags() { return [...new Set([...selected, ...newTags])].slice(0, 10); } +// Load public app settings (e.g. the Mastodon post length limit) once a backend is configured. +async function loadConfig() { + const settings = await getSettings(); + if (!settings.backendUrl || !(await hasBackendPermission(settings.backendUrl))) return; + try { + const response = await fetch(`${settings.backendUrl}/api/public/config`); + if (!response.ok) return; + const config = await response.json(); + if (config.max_post_characters) maxPostCharacters = config.max_post_characters; + } catch (error) { + // Character-count warning is advisory; ignore config load failures. + } + updateCharacterCount(); +} + +// Load the user's configured Mastodon post prefix, so the estimated post length matches the server. +async function loadMastodonPrefix() { + const settings = await getSettings(); + if (!settings.backendUrl || !settings.accessToken || !(await hasBackendPermission(settings.backendUrl))) return; + try { + const response = await fetch(`${settings.backendUrl}/api/user/plugins/mastodon`, { + headers: {'Authorization': `Bearer ${settings.accessToken}`}, + }); + if (!response.ok) return; + const config = await response.json(); + if (config.post_prefix) { + mastodonPostPrefix = config.post_prefix; + } else if (config.hashtag) { + mastodonPostPrefix = `#${String(config.hashtag).trim().replace(/^#/, '')} `; + } + } catch (error) { + // Character-count warning is advisory; ignore config load failures. + } + updateCharacterCount(); +} + +// Format a UTC timestamp the same way the Mastodon plugin does, so the estimated post length matches the server. +function formatMastodonTimestamp(date) { + const months = [ + 'January', 'February', 'March', 'April', 'May', 'June', + 'July', 'August', 'September', 'October', 'November', 'December', + ]; + const pad = (value) => String(value).padStart(2, '0'); + return `${date.getUTCFullYear()} ${months[date.getUTCMonth()]} ${pad(date.getUTCDate())} - ${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}`; +} + +// Estimate the assembled Mastodon post length, mirroring backend/app/services/plugin_manager.py. +function estimatePostLength() { + const title = titleInput.value.trim(); + const comment = commentInput.value.trim(); + const url = removeKnownTrackingParams(urlInput.value.trim()); + const parts = [mastodonPostPrefix.trim()]; + if (title) parts.push(title); + if (comment) parts.push(comment); + if (title) parts.push(`Logged on ${formatMastodonTimestamp(new Date())} UTC from: ${url}`); + const tags = getTags(); + if (tags.length) parts.push(tags.join(' ')); + return parts.join('\n\n').length; +} + +function updateCharacterCount() { + const length = estimatePostLength(); + const overLimit = length > maxPostCharacters; + characterCountEl.textContent = overLimit + ? t('characterCountOverLimit', [String(length), String(maxPostCharacters), String(length - maxPostCharacters)]) + : t('characterCount', [String(length), String(maxPostCharacters)]); + characterCountEl.classList.toggle('over-limit', overLimit); +} + +[titleInput, urlInput, commentInput, newTagsInput].forEach((input) => { + input.addEventListener('input', updateCharacterCount); +}); + function removeKnownTrackingParams(urlString) { try { const url = new URL(urlString); @@ -361,6 +440,8 @@ refetchTitleButton.addEventListener('click', (e) => { titleInput.value = ''; fetchTitle(url, { force: true }); }); -populateCurrentTab().then(checkExistingLink); +populateCurrentTab().then(checkExistingLink).then(updateCharacterCount); loadExistingTags(); updateFeedLink(); +loadConfig(); +loadMastodonPrefix();