Processus de mise en page - RandomLab/book.blob GitHub Wiki
premier script js appelé «côté client» à pour rôle de :
- configurer les bibliothèques JS (voir la doc de chaque bibliothèques)
- effectuer des modifications sur le document HTML avant les bibliothèques JS qui sont communes à la version web/print
- lance au choix la mise en livre / mise en site
le lancement de preview
de Paged.js, qui lance la mise en livre a lieu dans la configuration de Hyhenopolis :
handleEvent: {
hyphenopolyEnd: function (e) {
window.PagedPolyfill.preview();
}
}
La fonction est donc lancée une fois que tout le traitement des césures a eu lieu dans le document. Celà a permis d'éviter beaucoup de cas de «télescopage» des deux bibliothèques.
le convertiseur markdown -> html considère presque tout comme des paragraphes. Il va donc par exemple mettre les <img>
dans des balises <p>
. Si il y a quelque chose d'écrit juste après, sans saut de ligne, alors il sera mis dans le même <p>
.
par exemple :
![description de l'image](/lien-de-l-image.jpg)
<figcaption>légende de l'image</figcaption>
donnera :
<p><img src='/lien-de-l-image.jpg' alt='description de l'image'></img><figcaption>légende de l'image</figcaption></p>
au delà de l'aspect inutile d'entourer les images de balise <p>
on préférera avoir des balises <figure>
, standard HTML pour des images qui ont des légendes.
Il faudra donc soit changer ça dans le convertisseur markdown ou faire un script qui s'applique avant pagedjs qui fait cette substitution.
Pajedjs.org https://www.pagedjs.org/documentation/04-how-pagedjs-works/ https://gitlab.pagedmedia.org/tools/pagedjs
processus de mise en livre par Pagedjs. La bibliothèque à ses propres étapes intermédiaires qui permettent d'effectuer des modificiations du documents à des moments clés de la mise en livre.
// Previewer
beforePreview(content, renderTo)
afterPreview(pages)
// Chunker
beforeParsed(content)
afterParsed(parsed)
beforePageLayout(page)
afterPageLayout(pageElement, page, breakToken)
afterRendered(pages)
// Polisher
beforeTreeParse(text, sheet)
beforeTreeWalk(ast)
afterTreeWalk(ast, sheet)
onUrl(urlNode)
onAtPage(atPageNode)
onRule(ruleNode)
onDeclaration(declarationNode, ruleNode)
onContent(contentNode, declarationNode, ruleNode)
// Layout
layoutNode(node)
renderNode(node, sourceNode)
onOverflow(overflow, rendered, bounds)
onBreakToken(breakToken, overflow, rendered)
Si on décortique le principe formel des notes de bas de page il s'agit de trouver un équilibre entre le texte présent dans le flux principal de la page (content
) et une autre section en bas de la page dans laquelle se trouve les notes de bas de page dont l'appel de note est présent dans le contenu principal.
Il doit bien y avoir une possibilité de faire des notes de bas de page avec pagedjs. Avec l'aide des Chunker
(sans doute beforePageLayout(page)
), il doit être possible de réduire le texte du contenu de la page selon la taille des notes qu'on rajoute à la page et de remettre ce trop plein dans le contenu pas encore «mis en page».
Parfois cet équilibre est complexe à maintenir quand l'appel de note se trouve la fin du contenu principal puisque ajouter la note réduit l'espace disponible pour le contenu principal et donc "pousse" cet appel de note à la page suivante. Ainsi la note est aussi "poussée" et donc libère assez de place pour l'appel se retrouve sur la page précédente.. ainsi de suite.
On voit donc qu'une mise en algorithme de ce type de mise en page est plus complexe que prévu. Pour éviter cette boucle infini on peut observer d'autres astuces de mise en page automatisables comme le fait de pouvoir basculer un trop plein de note de la page de gauche vers la page de droite ou inversement de rapatrier le début des notes de la page de droite vers la page de gauche. Considérer la zone de notes par double page permet sans doute de se laisser assez de possibilités pour pouvoir automatiser la plus part des cas. Une autre possibilité est aussi de pouvoir basculer les notes de la page de droite vers son verso, cela coupe ainsi le flux de lecture, nécessitant de faire des allez retour d'une double page à une autre mais cette une solution parfois rencontrée dans l'édition classique lorsque le volume des notes est vraiment trop important.
Pour le BLOB n0, j'ai décidé de n'utiliser que des notes de côté et de réduire la largeur de la colonne au 3/4 pour libérer la place pour les notes et prévoir systématiquement la quantité de contenu par page. Ainsi la longueur des notes n'influe pas sur la place disponible pour le contenu. Il faut simplement qu'il y ait assez de place dans la marge ainsi libérée pour toute les notes qui sont appelées dans le contenu de la page. Pour les cas dans les quels il y a un trop gros volume de note, il est possible de basculer le trop plein sur d'autres pages. Ici, seule la solution de rapatrier le début des notes de la page de droite vers la page de gauche a été conservée car elle respecte l'ordre dans lequel est mis en livre le document (de la première à la dernière). Lorsque la page de droite est en train d'être mis en page, la page de gauche l'a déjà été. On peut donc réinjecter le trop plein de note à la suite des notes déjà mises en page de la page de gauche. Le risque est maintenant de dépasser le volume disponible dans la marge de la page de gauche. Les limites de l'automatisation arrive ici. On a donc la possibilité d'interrompre à la main le flux du contenu de la page de gauche en forçant un page-break
pour réduire le nombre de note au sein de la double page et de libérer de la place en bas de la page de gauche. Les notes qui se trouvent toujours en excès dans la marge de la page de gauche basculent alors de droite à gauche dans des colonnes dans l'espace libéré en bas de cette page (il faut bien entendu respecter l'ordre de lecture de gauche à droite, ici les notes se trouvaient toujours à droite et pas comme on le fait traditionnellement dans le petit fond (intérieur)). Cette solution a résolu (par chance) tous les cas rencontrés dans le numéro sans devoir artificiellement rompre le flux du contenu pour libérer de la place ou réduire le nombre de notes par page. Il est donc parfois utile dans un article où il y a beaucoup de notes de prévoir systématiquement des sauts de pages (avant/après chaque sous-titre, image, citation...) pour répartir les notes et libérer des espaces en bas de pages pour accueillir un grand volume de note le cas échéant.
tout ce processus dont je viens d'expliquer l'algorithme à lieu dans le chunker afterPageLayout
de Pajedjs
des scripts qui ne seront appelés qu'à la fin de la mise en livre. outils et interfaces de développement pour aider la mise en page. (compter le nombre de mots / caractères par page, afficher une grille...)