2026-02-23 11:35:07 +01:00
|
|
|
import { Handler } from '/csspageweaver/lib/paged.esm.js';
|
|
|
|
|
|
|
|
|
|
|
2026-03-15 11:09:25 +01:00
|
|
|
export default class itemsDecor extends Handler {
|
2026-02-23 11:35:07 +01:00
|
|
|
constructor(chunker, polisher, caller) {
|
|
|
|
|
super(chunker, polisher, caller);
|
2026-03-16 12:01:16 +01:00
|
|
|
this.symbol = "+";
|
2026-02-23 11:35:07 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-16 12:01:16 +01:00
|
|
|
|
|
|
|
|
|
2026-03-15 11:09:25 +01:00
|
|
|
createDecor(symbol, sizes, sizeClass) {
|
|
|
|
|
const div = document.createElement("div");
|
|
|
|
|
div.className = `decor-h3 ${sizeClass}`;
|
2026-03-16 12:01:16 +01:00
|
|
|
sizes.forEach((n, i) => {
|
2026-03-15 11:09:25 +01:00
|
|
|
const line = document.createElement("div");
|
2026-03-16 12:01:16 +01:00
|
|
|
line.dataset.count = i + 1;
|
2026-03-15 11:09:25 +01:00
|
|
|
line.textContent = symbol.repeat(n);
|
|
|
|
|
div.appendChild(line);
|
|
|
|
|
});
|
|
|
|
|
return div;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-15 11:30:36 +01:00
|
|
|
createLine(symbol, nodes) {
|
|
|
|
|
const line = document.createElement("span");
|
|
|
|
|
line.className = "h3-line";
|
|
|
|
|
|
|
|
|
|
const spanBefore = document.createElement("span");
|
|
|
|
|
spanBefore.className = "h3-before";
|
|
|
|
|
spanBefore.textContent = symbol.repeat(3);
|
|
|
|
|
line.appendChild(spanBefore);
|
|
|
|
|
|
|
|
|
|
const spanText = document.createElement("span");
|
|
|
|
|
spanText.className = "h3-text";
|
|
|
|
|
nodes.forEach(node => spanText.appendChild(node));
|
|
|
|
|
line.appendChild(spanText);
|
|
|
|
|
|
|
|
|
|
const spanAfter = document.createElement("span");
|
|
|
|
|
spanAfter.className = "h3-after";
|
|
|
|
|
spanAfter.textContent = "";
|
|
|
|
|
line.appendChild(spanAfter);
|
|
|
|
|
|
|
|
|
|
return line;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-16 09:48:16 +01:00
|
|
|
processTitle(subtitle, symbol, withDecor, isLeft) {
|
|
|
|
|
if (subtitle.querySelector(".h3-line")) return;
|
2026-03-15 11:09:25 +01:00
|
|
|
|
2026-03-16 09:48:16 +01:00
|
|
|
const children = Array.from(subtitle.childNodes);
|
|
|
|
|
|
|
|
|
|
// Découper en segments à chaque <br>
|
|
|
|
|
const segments = [];
|
|
|
|
|
let current = [];
|
|
|
|
|
children.forEach(node => {
|
|
|
|
|
if (node.nodeName === "BR") {
|
|
|
|
|
segments.push(current);
|
|
|
|
|
current = [];
|
|
|
|
|
} else {
|
|
|
|
|
current.push(node);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
segments.push(current);
|
|
|
|
|
|
|
|
|
|
// Reconstruire le titre avec des .h3-line
|
|
|
|
|
subtitle.innerHTML = "";
|
2026-03-16 15:20:27 +01:00
|
|
|
segments.filter(seg => seg.length > 0).forEach(nodes => {
|
2026-03-16 09:48:16 +01:00
|
|
|
const line = this.createLine(symbol, nodes);
|
|
|
|
|
subtitle.appendChild(line);
|
|
|
|
|
|
|
|
|
|
const spanAfter = line.querySelector(".h3-after");
|
|
|
|
|
const baseHeight = line.offsetHeight;
|
|
|
|
|
let count = 0;
|
|
|
|
|
// h3-after → Ajouter des symboles à la ligne en vérifiant la hauteur de la ligne, si la ligne devient plus haute, supprimer le dernier symbole ajouté
|
|
|
|
|
while (count < 300) {
|
|
|
|
|
count++;
|
|
|
|
|
spanAfter.textContent = symbol.repeat(count);
|
|
|
|
|
if (line.offsetHeight > baseHeight) {
|
|
|
|
|
spanAfter.textContent = symbol.repeat(count - 1);
|
|
|
|
|
break;
|
2026-03-15 11:30:36 +01:00
|
|
|
}
|
2026-03-16 09:48:16 +01:00
|
|
|
}
|
|
|
|
|
});
|
2026-03-15 11:30:36 +01:00
|
|
|
|
2026-03-16 09:48:16 +01:00
|
|
|
if (withDecor) {
|
|
|
|
|
const smallSizes = [1, 2, 3, 2, 1];
|
|
|
|
|
const bigSizes = [1, 2, 3, 4, 5, 4, 3, 2, 1];
|
2026-03-15 11:30:36 +01:00
|
|
|
let firstDecor, secondDecor;
|
|
|
|
|
if (isLeft) {
|
|
|
|
|
firstDecor = this.createDecor(symbol, smallSizes, "decor-h3_small");
|
|
|
|
|
secondDecor = this.createDecor(symbol, bigSizes, "decor-h3_big");
|
|
|
|
|
} else {
|
|
|
|
|
firstDecor = this.createDecor(symbol, bigSizes, "decor-h3_big");
|
|
|
|
|
secondDecor = this.createDecor(symbol, smallSizes, "decor-h3_small");
|
|
|
|
|
}
|
2026-03-16 12:01:16 +01:00
|
|
|
const container = document.createElement("div");
|
|
|
|
|
container.className = "h3_container";
|
|
|
|
|
subtitle.parentNode.insertBefore(container, subtitle);
|
|
|
|
|
container.appendChild(firstDecor);
|
|
|
|
|
container.appendChild(secondDecor);
|
|
|
|
|
container.appendChild(subtitle);
|
2026-03-16 09:48:16 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-16 12:01:16 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
beforeParsed(content){
|
|
|
|
|
content.querySelectorAll("h3").forEach(subtitle => {
|
|
|
|
|
const next = subtitle.nextElementSibling;
|
|
|
|
|
if (next) next.classList.add("following-h3");
|
|
|
|
|
});
|
|
|
|
|
content.querySelectorAll("h4").forEach(subtitle => {
|
|
|
|
|
const next = subtitle.nextElementSibling;
|
|
|
|
|
if (next) next.classList.add("following-h4");
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-03-16 09:48:16 +01:00
|
|
|
afterPageLayout(pageElement, page, breakToken) {
|
|
|
|
|
const symbol = this.symbol;
|
|
|
|
|
const isLeft = pageElement.classList.contains("pagedjs_left_page");
|
|
|
|
|
|
|
|
|
|
pageElement.querySelectorAll("h3").forEach(subtitle => {
|
|
|
|
|
this.processTitle(subtitle, symbol, true, isLeft);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
pageElement.querySelectorAll("h4").forEach(subtitle => {
|
|
|
|
|
this.processTitle(subtitle, symbol, false, isLeft);
|
2026-03-16 12:01:16 +01:00
|
|
|
const container = document.createElement("div");
|
|
|
|
|
container.className = "h4_container";
|
|
|
|
|
subtitle.parentNode.insertBefore(container, subtitle);
|
|
|
|
|
container.appendChild(subtitle);
|
2026-02-23 11:35:07 +01:00
|
|
|
});
|
|
|
|
|
}
|
2026-03-16 12:01:16 +01:00
|
|
|
|
|
|
|
|
|
2026-02-23 11:35:07 +01:00
|
|
|
}
|