source: Klonkt/src/assets/js/mod/lib.js@ fb9a8ad

main
Last change on this file since fb9a8ad was fb9a8ad, checked in by roboburr <roboburr@…>, 5 weeks ago

De posteditor, de laatste (shaer-bqr, stap 3g)

Zeven blokken, ruim 1000 regels, 34 vertaalsleutels en een tijdzone. Daarmee is
er in pages en partials geen inline script meer over, op embed-player na -- die
staat los (res.render, eigen CSP, altijd een volledige laadbeurt).

ESCAPEN. Deze pagina bouwt op plekken HTML met stringplakwerk, en daar gingen de
vertalingen doorheen als escapende EJS-tag. Een module heeft die niet, dus er is
een esc() bij gekomen in lib.js en alle 34 gaan daardoorheen. Dat is
gedragsgelijk aan wat er stond, en het houdt een apostrof in een vertaling uit
het attribuut waar hij in staat -- het soort fout dat pas in een andere taal
opvalt.

EEN FOUT DIE DE STEEKPROEF VING: ik liet de vervanging kiezen tussen een enkele
en een dubbele aanhalingsvorm op grond van het teken ernaast. Maar bij
aria-label="..." is dat aanhalingsteken HTML en niet de grens van de JS-string;
die is overal enkel. Resultaat was aria-label="" + esc(T.title) + "". Teruggezet
en uniform de enkele vorm gebruikt.

post-edit neemt de playlist-editor op, dus de route vraagt om beide modules.

Templates compileren, 23 modules schoon en syntactisch geldig, suite 565/565.

  • Property mode set to 100644
File size: 1.7 KB
Line 
1// Gedeeld gereedschap voor de pagina-modules (shaer-bqr).
2
3/**
4 * De servergegevens van deze pagina.
5 *
6 * Een module is een statisch bestand, dus er kan geen EJS in. Wat het script van
7 * de server nodig heeft -- vertalingen, ids, instellingen -- zet de pagina in
8 * een <script type="application/json"> via partials/page-data.ejs, en dit leest
9 * het terug.
10 *
11 * ELKE KEER OPNIEUW LEZEN en niet eenmalig onthouden: bij een htmx-navigatie
12 * wisselt de inhoud terwijl de module blijft leven, dus een gegevensblok dat je
13 * bij het laden vasthoudt is een pagina later verouderd.
14 *
15 * Nooit een uitzondering: een module die valt over ontbrekende gegevens neemt de
16 * hele pagina mee. Wat er niet is, is een leeg object.
17 */
18export function pageData() {
19 try {
20 var el = document.querySelector('script[type="application/json"][data-page-data]');
21 return el ? (JSON.parse(el.textContent) || {}) : {};
22 } catch (e) {
23 return {};
24 }
25}
26
27/**
28 * Een enkele waarde, met een terugval. Scheelt in elke module hetzelfde
29 * gedoe met ontbrekende sleutels.
30 */
31export function pageValue(key, fallback) {
32 var d = pageData();
33 return (d && Object.prototype.hasOwnProperty.call(d, key)) ? d[key] : fallback;
34}
35
36/**
37 * Een tekst veilig in HTML zetten.
38 *
39 * De modules bouwen op sommige plekken HTML met stringplakwerk. Vroeger ging een
40 * vertaling daar door de escapende EJS-tag heen; nu niet meer. Zonder deze functie
41 * breekt een apostrof in een vertaling het attribuut af waar hij in staat -- het
42 * soort fout dat pas in een andere taal opvalt.
43 */
44export function esc(s) {
45 return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) {
46 return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c];
47 });
48}
Note: See TracBrowser for help on using the repository browser.