Initial commit

This commit is contained in:
sarahgarcin1 2026-01-05 19:33:15 +01:00
commit 388079e6bb
1108 changed files with 330121 additions and 0 deletions

View file

@ -0,0 +1,367 @@
// Imposition for booklet(s)
//
// This script re-arrange the pages of your document in order to make an imposed sheet layouts for printing.
// Two pages per sheet, double-sided
class Booklet extends Paged.Handler {
constructor(chunker, polisher, caller) {
super(chunker, polisher, caller);
this.pagedbooklet;
this.sourceSize;
this.pageStart;
this.pageEnd;
}
onAtPage(node, item, list) {}
onDeclaration(declaration, dItem, dList, rule) {
if (declaration.property == "--paged-layout") {
if (declaration.value.value.includes("booklet")) {
this.pagedbooklet = true;
let valuesBooklet = declaration.value.value.split(' ');
let index = valuesBooklet.indexOf("booklet");
/* Set first page of the imposition */
if(valuesBooklet[index + 1]){
this.pageStart = parseInt(valuesBooklet[index + 1]);
}else{
this.pageStart = 1;
}
/* Set last page of the imposition */
if(valuesBooklet[index + 2]){
this.pageEnd = parseInt(valuesBooklet[index + 2]);
}
}
}
}
afterRendered(pages) {
/* Verify this.pageEnd */
if(!this.pageEnd){
let allPagesBefore = document.querySelectorAll(".pagedjs_page").length;
this.pageEnd = allPagesBefore;
}
/* Verify this.pageStart */
if(this.pageStart == 0){
this.pageStart = 1;
}else if(this.pageStart % 2 == 0){
this.pageStart = this.pageStart - 1;
}
// Bouton pour activer/désactiver l'imposition
const imposeButton = document.querySelector("#imposition-toggle");
let styleElement; // Variable pour stocker l'élément <style>
imposeButton.addEventListener("click", () => {
if (imposeButton.checked) {
imposeBooklet();
} else {
resetOrder();
}
});
function imposeBooklet() {
const allPages = Array.from(document.querySelectorAll(".pagedjs_page"));
const totalPages = allPages.length;
// Ajouter des pages vierges pour arriver à un multiple de 4
const pagesToAdd = (4 - (totalPages % 4)) % 4;
for (let i = 0; i < pagesToAdd; i++) {
const blankPage = document.createElement("div");
blankPage.classList.add("pagedjs_page", "blank");
blankPage.innerText = "Blank Page";
document.querySelector(".pagedjs_pages").appendChild(blankPage);
}
// Répartition des pages pour booklet
const pages = Array.from(document.querySelectorAll(".pagedjs_page"));
const totalBookletPages = pages.length;
const bookletOrder = [];
const half = totalBookletPages / 2;
for (let i = 0; i < half; i++) {
bookletOrder.push(totalBookletPages - i); // Dernière page
bookletOrder.push(i + 1); // Première page
}
// Réordonner les pages dans le DOM
bookletOrder.forEach((pageNumber, index) => {
const pageElement = document.querySelector(`#page-${pageNumber}`);
if (pageElement) {
pageElement.style.order = index; // Affecter un ordre CSS
}
});
// Injecter le CSS pour les styles booklet
injectCSS();
console.log("Booklet imposition completed.");
}
function resetOrder() {
// Réinitialiser l'ordre des pages
const allPages = document.querySelectorAll(".pagedjs_page");
allPages.forEach((page, index) => {
page.style.order = index; // Remettre à l'ordre initial
});
// Supprimer les styles injectés
removeCSS();
console.log("Order reset to default.");
}
function injectCSS() {
let format = document.querySelector(".pagedjs_page");
/* Width of page without bleed, extract the first number of calc() function */
let width = getCSSCustomProp("--pagedjs-width", format);
let numbers = width
.match(/[0-9]+/g)
.map(function (n) {
return + (n);
});
width = parseInt(numbers[0]);
/* Height of page with bleed, addition of all the numbers of calc() function*/
let height = getCSSCustomProp("--pagedjs-height", format);
numbers = height
.match(/[0-9]+/g)
.map(function (n) {
return + (n);
});
const reducer = (previousValue, currentValue) => previousValue + currentValue;
height = numbers.reduce(reducer);
/* Bleed of the page */
let bleed = getCSSCustomProp("--pagedjs-bleed-top", format);
let bleedNum = parseInt(bleed);
/* Spread and half-spread*/
let spread = width * 2 + bleedNum * 2;
let spreadHalf = width + bleedNum;
let numberOfPages = getCSSCustomProp("--pagedjs-page-count", format);
let halfNumberOfPages = numberOfPages / 2;
// Créer un élément <style> avec les styles CSS pour l'imposition
styleElement = document.createElement("style");
styleElement.textContent = `
@media print{
@page{
size: ${spread}mm ${height}mm;
}
pagedjs_pages {
width: auto;
}
}
@media screen{
.pagedjs_pages{
max-width: calc(var(--pagedjs-width) * 2);
}
}
.pagedjs_pages {
display: flex !important;
flex-wrap: wrap;
transform: none !important;
height: 100% !important;
min-height: 100%;
max-height: 100%;
overflow: visible;
}
.pagedjs_page {
margin: 0;
padding: 0;
max-height: 100%;
min-height: 100%;
height: 100% !important;
}
.pagedjs_sheet {
margin: 0;
padding: 0;
max-height: 100%;
min-height: 100%;
height: 100% !important;
}
body{
--pagedjs-bleed-right-left: 0mm;
}
.pagedjs_left_page{
z-index: 20;
width: calc(var(--pagedjs-bleed-left) + var(--pagedjs-pagebox-width))!important;
}
.pagedjs_right_page {
left: 0;
}
.pagedjs_left_page .pagedjs_bleed-right .pagedjs_marks-crop {
border-color: transparent;
}
.pagedjs_right_page,
.pagedjs_right_page .pagedjs_sheet{
width: calc(var(--pagedjs-bleed-right-right) + var(--pagedjs-pagebox-width))!important;
}
.pagedjs_right_page .pagedjs_sheet{
grid-template-columns: [bleed-left] var(--pagedjs-bleed-right-left) [sheet-center] 1fr [bleed-right] var(--pagedjs-bleed-right-right);
}
/*.pagedjs_right_page .pagedjs_bleed-left{
display: none;
}*/
.pagedjs_right_page .pagedjs_bleed-top .pagedjs_marks-crop:nth-child(1),
.pagedjs_right_page .pagedjs_bleed-bottom .pagedjs_marks-crop:nth-child(1){
width: 0!important;
}
/* 10 dernières pages de droite (qui sont en réalité à gauche) */
.pagedjs_right_page:nth-child(n+${halfNumberOfPages}){
left:0;
z-index: 10;
width: calc(var(--pagedjs-bleed-left) + var(--pagedjs-pagebox-width))!important;
}
/*.pagedjs_right_page:nth-child(n+${halfNumberOfPages}) .pagedjs_bleed-right .pagedjs_marks-crop {
border-color: transparent;
}*/
.pagedjs_right_page:nth-child(n+${halfNumberOfPages}),
.pagedjs_right_page:nth-child(n+${halfNumberOfPages}) .pagedjs_sheet{
width: calc(var(--pagedjs-bleed-right-right) + var(--pagedjs-pagebox-width))!important;
}
.pagedjs_right_page:nth-child(n+${halfNumberOfPages}) {
z-index: 10;
position: relative;
left: 0;
}
.pagedjs_right_page:nth-child(n+${halfNumberOfPages}) .pagedjs_sheet{
grid-template-columns: [bleed-left] var(--pagedjs-bleed-left) [sheet-center] calc(var(--pagedjs-width) - var(--pagedjs-bleed-left) - var(--pagedjs-bleed-right)) [bleed-right] var(--pagedjs-bleed-right);
}
/*.pagedjs_right_page:nth-child(n+${halfNumberOfPages}) .pagedjs_bleed-left{
display: none;
}*/
.pagedjs_right_page:nth-child(n+${halfNumberOfPages}) .pagedjs_bleed-top .pagedjs_marks-crop:nth-child(1),
.pagedjs_right_page:nth-child(n+${halfNumberOfPages}) .pagedjs_bleed-bottom .pagedjs_marks-crop:nth-child(1){
width: calc(var(--pagedjs-bleed-left-left) - var(--pagedjs-crop-stroke)) !important;
}
.pagedjs_right_page:nth-child(n+${halfNumberOfPages}) .pagedjs_bleed-left .pagedjs_marks-crop:nth-child(1),.pagedjs_right_page:nth-child(n+${halfNumberOfPages}) .pagedjs_bleed-left .pagedjs_marks-crop:nth-child(3){
width: calc(var(--pagedjs-bleed-left-left) - var(--pagedjs-crop-stroke) - 5px) !important;
}
/* 10 premières pages de gauche (qui sont en réalité à droite) */
.pagedjs_left_page:nth-child(-n+${halfNumberOfPages}),
.pagedjs_left_page:nth-child(-n+${halfNumberOfPages}) .pagedjs_sheet{
width: calc(var(--pagedjs-bleed-right-right) + var(--pagedjs-pagebox-width))!important;
}
.pagedjs_left_page:nth-child(-n+${halfNumberOfPages}) {
z-index: 10;
position: relative;
left: 0;
}
.pagedjs_left_page:nth-child(-n+${halfNumberOfPages}) .pagedjs_sheet{
grid-template-columns: [bleed-left] var(--pagedjs-bleed-right-left) [sheet-center] 1fr [bleed-right] var(--pagedjs-bleed-right-right);
}
.pagedjs_left_page:nth-child(-n+${halfNumberOfPages}) .pagedjs_bleed-left{
display: none;
}
.pagedjs_left_page:nth-child(-n+${halfNumberOfPages}) .pagedjs_bleed-top .pagedjs_marks-crop:nth-child(1),
.pagedjs_left_page:nth-child(-n+${halfNumberOfPages}) .pagedjs_bleed-bottom .pagedjs_marks-crop:nth-child(1){
width: 0!important;
}
.pagedjs_left_page:nth-child(-n+${halfNumberOfPages}) .pagedjs_bleed-left{
display: block;
}
.pagedjs_left_page:nth-child(-n+${halfNumberOfPages}) .pagedjs_bleed-right .pagedjs_marks-crop{
border-color: var(--pagedjs-crop-color);
}
.pagedjs_first_page {
margin-left: 0;
}
body{
margin: 0
}
.pagedjs_page:nth-of-type(even){
break-after: always;
}
.pagedjs_page,
.pagedjs_sheet{
width: ${spreadHalf - 0.1}mm!important;
}
`;
// Ajouter l'élément <style> au <head> du document
document.head.appendChild(styleElement);
}
function removeCSS() {
if (styleElement && styleElement.parentNode) {
styleElement.parentNode.removeChild(styleElement);
styleElement = null;
}
}
}
}
Paged.registerHandlers(Booklet);
/**
* Pass in an element and its CSS Custom Property that you want the value of.
* Optionally, you can determine what datatype you get back.
*
* @param {String} propKey
* @param {HTMLELement} element=document.documentElement
* @param {String} castAs='string'
* @returns {*}
*/
const getCSSCustomProp = (
propKey,
element = document.documentElement,
castAs = "string"
) => {
let response = getComputedStyle(element).getPropertyValue(propKey);
// Tidy up the string if there's something to work with
if (response.length) {
response = response
.replace(/\'|"/g, "")
.trim();
}
// Convert the response into a whatever type we wanted
switch (castAs) {
case "number":
case "int":
return parseInt(response, 10);
case "float":
return parseFloat(response, 10);
case "boolean":
case "bool":
return response === "true" || response === "1";
}
// Return the string response by default
return response;
};