Badges and printed views need a PDF writer, an embedded font whose metrics the tests can measure, and the paper the machine prints on. pdf-lib with fontkit writes the sheet; Noto Sans (OFL) ships with its provenance and SHA-256, and travels into www/ with every third-party notice that the minified bundle drops. The paper is kept per machine in reglages_locaux.json. A4 and Letter derive the A6 grid from their dimensions; the PDF libraries load in two deferred chunks, each under the 1000 kB threshold. Checked: 3048 node, 639 browser and 67 long tests green from the index. --- FR --- [ADD] sorties : pdf-lib, Noto Sans, formats de papier, imposition Les badges et les vues imprimables exigent un producteur de PDF, une police embarquée que les épreuves mesurent, et le papier de la machine. pdf-lib et fontkit écrivent la planche ; Noto Sans (OFL) arrive avec sa provenance et son SHA-256, et voyage dans www/ avec chaque avis de tiers que le paquet minifié retire. Le papier se garde par machine dans reglages_locaux.json. A4 et Lettre dérivent la grille A6 de leurs dimensions ; les bibliothèques PDF se chargent en deux morceaux différés, chacun sous le seuil de 1000 ko. Vérifié : 3048 node, 639 navigateur et 67 longues vertes depuis l'index. Assisted-by: Claude Opus 5.5
31 lines
1.1 KiB
JavaScript
31 lines
1.1 KiB
JavaScript
// © 2026 TechnoLibre (http://www.technolibre.ca)
|
|
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
|
|
|
// La police embarquée lue sous node : les épreuves y lisent les fichiers de
|
|
// src/polices par le disque, là où la page les reçoit de Vite par « ?inline »
|
|
// (src/polices/chargement.js), syntaxe que node ne connaît pas (§ 14.8).
|
|
import { readFileSync } from 'node:fs';
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
const DOSSIER = new URL('../src/polices/', import.meta.url);
|
|
|
|
/** Les fichiers de la police, par graisse. */
|
|
export const FICHIERS_POLICES = Object.freeze({
|
|
regulier: 'NotoSans-Regular.ttf',
|
|
gras: 'NotoSans-Bold.ttf',
|
|
});
|
|
|
|
/** Le chemin absolu d'un fichier de src/polices. */
|
|
export const cheminPolice = (nom) => fileURLToPath(new URL(nom, DOSSIER));
|
|
|
|
/**
|
|
* Les octets des deux graisses, lus du disque à chaque appel.
|
|
*
|
|
* @returns {{regulier: Uint8Array, gras: Uint8Array}}
|
|
*/
|
|
export function lirePolices() {
|
|
return {
|
|
regulier: new Uint8Array(readFileSync(cheminPolice(FICHIERS_POLICES.regulier))),
|
|
gras: new Uint8Array(readFileSync(cheminPolice(FICHIERS_POLICES.gras))),
|
|
};
|
|
}
|