From 15aaf441cd16e48b3dbef760a73ba790b17d7189 Mon Sep 17 00:00:00 2001 From: Julie Blanc Date: Sun, 15 Mar 2026 11:30:36 +0100 Subject: [PATCH] support double line in subtitles --- maquette-tests/assets/css/subtitles.css | 10 +++ maquette-tests/assets/css/text.css | 17 ++++- maquette-tests/index.html | 29 ++------ maquette-tests/js/items-decor.js | 90 +++++++++++++++++-------- 4 files changed, 93 insertions(+), 53 deletions(-) diff --git a/maquette-tests/assets/css/subtitles.css b/maquette-tests/assets/css/subtitles.css index 1999136..836ac4e 100644 --- a/maquette-tests/assets/css/subtitles.css +++ b/maquette-tests/assets/css/subtitles.css @@ -21,6 +21,11 @@ h3, h4{ line-height: var(--sign-baseline); } +.h3-line { + display: flex; + justify-content: flex-end; +} + .h3-before{ padding-right: 0.75ch; } @@ -29,6 +34,11 @@ h3, h4{ padding-left: 0.75ch; } +.h3-text{ + background-color: yellow; + flex-grow: 2; +} + .decor-h3{ font-size: var(--sign-size); color: var(--sign-color); diff --git a/maquette-tests/assets/css/text.css b/maquette-tests/assets/css/text.css index ce6997c..7053909 100644 --- a/maquette-tests/assets/css/text.css +++ b/maquette-tests/assets/css/text.css @@ -9,14 +9,29 @@ } + + + .container-following-note + p, p + p{ - text-indent: 30%; + /* text-indent: 30%; */ position: relative; /* text-indent: -6ch; */ } +p::before{ + content: "............."; + font-size: var(--sign-size); + color: var(--sign-color); + letter-spacing: var(--sign-spacing); + line-height: var(--sign-baseline); + position: relative; + top: -3px; + /* position: absolute; + left: 0; */ +} + h4{ diff --git a/maquette-tests/index.html b/maquette-tests/index.html index 47b7816..6add4c2 100644 --- a/maquette-tests/index.html +++ b/maquette-tests/index.html @@ -224,33 +224,12 @@ aussi précises qu’elles s’avèrent uniformes10.

- + + -
-
=
-
==
-
===
-
==
-
=
-
+

La langage est un champ de bataille

-

===La langage est un champ de bataille====

- -
-
=
-
==
-
===
-
====
-
===
-
==
-
=
-
+

Si les LLM apparaissent comme de nouveaux acteurs sociolinguistiques, leurs usages, nombreux et divers, cristallisent aussi une forme de lutte diff --git a/maquette-tests/js/items-decor.js b/maquette-tests/js/items-decor.js index 3ca98da..e11f0d3 100644 --- a/maquette-tests/js/items-decor.js +++ b/maquette-tests/js/items-decor.js @@ -18,43 +18,79 @@ export default class itemsDecor extends Handler { return div; } + 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; + } + afterPageLayout(pageElement, page, breakToken) { const symbol = this.symbol; const isLeft = pageElement.classList.contains("pagedjs_left_page"); const smallSizes = [1, 2, 3, 2, 1]; const bigSizes = [1, 2, 3, 4, 3, 2, 1]; - let subtitles = pageElement.querySelectorAll("h3"); - subtitles.forEach(subtitle => { - if (!subtitle.querySelector(".h3-before")) { - const spanBefore = document.createElement("span"); - spanBefore.className = "h3-before"; - spanBefore.textContent = symbol.repeat(3); - subtitle.insertBefore(spanBefore, subtitle.firstChild); - } + pageElement.querySelectorAll("h3").forEach(subtitle => { + if (subtitle.querySelector(".h3-line")) return; - let spanAfter = subtitle.querySelector(".h3-after"); - if (!spanAfter) { - spanAfter = document.createElement("span"); - spanAfter.className = "h3-after"; - subtitle.appendChild(spanAfter); - } + const children = Array.from(subtitle.childNodes); - spanAfter.textContent = ""; - const baseHeight = subtitle.offsetHeight; - let count = 0; - // Pour compléter la ligne: ajoute le symbole dans le span en vérifiant la hauteur du titre, si l'ajout d'un symbole augmente la hauteur du titre, alors on enleve un symbole - while (count < 300) { - count++; - spanAfter.textContent = symbol.repeat(count); - if (subtitle.offsetHeight > baseHeight) { - spanAfter.textContent = symbol.repeat(count - 1); - break; + // Découper en segments à chaque
+ const segments = []; + let current = []; + children.forEach(node => { + if (node.nodeName === "BR") { + segments.push(current); + current = []; + } else { + current.push(node); } - } + }); + segments.push(current); - const firstDecor = this.createDecor(symbol, isLeft ? smallSizes : bigSizes, isLeft ? "decor-h3_small" : "decor-h3_big"); - const secondDecor = this.createDecor(symbol, isLeft ? bigSizes : smallSizes, isLeft ? "decor-h3_big" : "decor-h3_small"); + // Reconstruire le h3 avec des .h3-line + subtitle.innerHTML = ""; + segments.forEach(nodes => { + const line = this.createLine(symbol, nodes); + subtitle.appendChild(line); + + const spanAfter = line.querySelector(".h3-after"); + const baseHeight = line.offsetHeight; + let count = 0; + while (count < 300) { + count++; + spanAfter.textContent = symbol.repeat(count); + if (line.offsetHeight > baseHeight) { + spanAfter.textContent = symbol.repeat(count - 1); + break; + } + } + }); + + 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"); + } subtitle.parentNode.insertBefore(firstDecor, subtitle); subtitle.parentNode.insertBefore(secondDecor, subtitle.nextSibling); });