Aller au contenu

JavaScript

phil/block-editor-bundle

Le contrôleur

assets/src/editor_controller.js est un contrôleur Stimulus, enregistré sous le nom phil--block-editor-bundle--editor. Le thème de formulaire écrit son balisage ; une page peut l'écrire à la main, par exemple pour afficher un document en lecture seule hors d'un formulaire :

<div class="phil-block-editor" data-controller="phil--block-editor-bundle--editor"
     data-phil--block-editor-bundle--editor-config-value='{"readOnly": true, "locale": "fr"}'>
    <input type="hidden" value="{{ article.body }}" data-phil--block-editor-bundle--editor-target="input">
    <div data-phil--block-editor-bundle--editor-target="canvas"></div>
    <div class="phil-block-editor__status" data-phil--block-editor-bundle--editor-target="status" role="status"></div>
</div>
CibleRôle
inputLe champ qui contient le JSON UJO, lu quand l'éditeur se connecte et écrit après chaque changement
canvasL'endroit où les blocs sont dessinés ; créé s'il manque
statusUne zone dynamique qui annonce les déplacements, les suppressions et les téléversements

La valeur config est un seul objet :

CléValeur par défautSens
toolstous les outils de blocLes types de blocs offerts
inlineToolstous les outils en ligneLes outils en ligne offerts
readOnlyfalseAfficher sans modifier
placeholderle libellé placeholderL'indication d'un paragraphe vide
localele lang de la pageLa langue des libellés
messages{}Libellés remplacés, par clé
colors[]Les jetons de couleur de l'outil de couleur du texte
uploadUrl, mentionsUrl, linksUrlnullLes points de terminaison ; null désactive la fonctionnalité
csrfCookienullLe nom du témoin et de l'en-tête du jeton CSRF à double soumission ; null n'en envoie aucun, et le téléversement est refusé

L'éditeur ne refuse jamais de s'ouvrir : un JSON qu'il ne peut pas lire donne un document vide, et le serveur juge ce qu'il reçoit.

Événements

ÉvénementSurDétail
changele champ— déclenché chaque fois que l'éditeur écrit une nouvelle valeur, pour l'enregistrement automatique ou un avertissement de formulaire modifié
phil--block-editor-bundle--editor:changel'élément de l'éditeur{json}, la valeur écrite
phil--block-editor-bundle--editor:focusl'élément de l'éditeur{id}, le bloc où le rédacteur est entré ; null quand le focus quitte l'éditeur, ses menus et sa barre d'outils

Écrire à plusieurs

L'éditeur écoute sur son élément les événements qu'émet un contrôleur de collaboration — celui de phil/edit-lock-bundle. Aucun d'eux n'entre dans l'historique d'annulation : un bloc remplacé par un autre rédacteur ne peut pas être annulé localement, et l'historique repart donc à zéro après chacun.

ÉvénementDétailCe que fait l'éditeur
phil-block-editor:apply{block, list, after}Met le bloc à la place du bloc de même identifiant, quelle que soit son imbrication ; sinon, l'insère dans la liste list (root, l'identifiant d'un bloc, ou l'identifiant d'un bloc et une colonne, id:0) après le bloc after, en premier quand after est null, à la fin du document quand la liste n'existe nulle part. Seul ce bloc est redessiné : le curseur reste donc où se trouve le rédacteur
phil-block-editor:remove{id}Enlève le bloc
phil-block-editor:lock{blocks: {id: name}}Ferme les blocs nommés — inert, encadrés, le nom affiché au-dessus — et ouvre les autres

Le document est écrit dans le champ après apply et remove, hors du mode lecture seule, comme après tout changement.

Libellés

Les libellés sont en anglais et en français dans assets/src/lib/i18n.js. Une locale comme fr_CA prend le français, une locale inconnue l'anglais. Tout libellé peut être remplacé par l'option messages du champ ou par la clé messages, selon sa clé — placeholder, delete, turnInto, color.accent et les autres du fichier. {type} dans foreign et converted est remplacé par le type.

Modules

Le contrôleur est construit sur des modules sans DOM, chacun testé sous Node, et sur deux modules qui exigent un navigateur :

ModuleRôle
lib/inline.jsL'assainisseur de texte en ligne : les outils du profil rich de phil/ujo, sa forme canonique, ses règles d'adresses et d'attributs, les styles lus comme des marques
lib/paste.jsLe HTML ou le texte collé transformé en blocs du jeu d'outils
lib/model.jsUJO lu et écrit, les blocs trouvés, déplacés et placés dans les listes imbriquées, les éléments de liste, les lignes et colonnes de tableau, l'historique d'annulation
lib/tools.jsLes données de chaque type de bloc, son texte et ses transformations, le menu /, les actions du menu de bloc
lib/menu.jsLa correspondance et la sélection dans les menus, les déclencheurs /, @ et [[, le HTML d'une suggestion choisie
lib/keys.jsLes raccourcis et les marques à la Markdown
lib/i18n.jsLes libellés
lib/csrf.jsUn nouveau jeton aléatoire pour chaque requête, son témoin, son en-tête et le champ d'un formulaire
lib/caret.jsLe curseur et la sélection dans un champ, la scission, l'insertion, les marques ; exige un navigateur
lib/view.jsLes blocs dessinés en éléments ; exige un navigateur

Tout HTML que dessine l'éditeur passe d'abord par lib/inline.js, et les adresses des liens et des images sont vérifiées selon les mêmes règles que sur le serveur.

La feuille de style

assets/styles/block-editor.css met en forme l'éditeur sous .phil-block-editor avec des propriétés personnalisées : --pbe-text, --pbe-muted, --pbe-surface, --pbe-sunken, --pbe-border, --pbe-accent, --pbe-accent-soft, --pbe-focus, --pbe-danger, --pbe-info, --pbe-success, --pbe-warning, --pbe-mark, --pbe-radius, --pbe-mono, --pbe-gutter et --pbe-shadow. Un bloc tenu par un autre rédacteur, .pbe-locked, est encadré en --pbe-info avec le nom tiré de son attribut data-locked-by. Chaque propriété prend le jeton de PHIL UX de même rôle quand cette feuille de style est chargée, et sinon une valeur tirée de Canvas et CanvasText de la page : elle suit donc le mode clair ou sombre de la page. Redéfinissez-les sur .phil-block-editor pour changer l'apparence. Les cinq jetons de couleur par défaut y sont aussi mis en forme, et les jetons propres à un site demandent chacun une règle.