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-17 15:07:01 +01:00
createDecor ( symbol , sizes , sizeClass , baseClass = "decor-h3" ) {
2026-03-15 11:09:25 +01:00
const div = document . createElement ( "div" ) ;
2026-03-17 15:07:01 +01:00
div . className = ` ${ baseClass } ${ 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" ) ;
2026-03-16 15:27:31 +01:00
line . className = "subtitle-line" ;
2026-03-15 11:30:36 +01:00
const spanBefore = document . createElement ( "span" ) ;
2026-03-16 15:27:31 +01:00
spanBefore . className = "subtitle-before" ;
2026-03-15 11:30:36 +01:00
spanBefore . textContent = symbol . repeat ( 3 ) ;
line . appendChild ( spanBefore ) ;
const spanText = document . createElement ( "span" ) ;
2026-03-16 15:27:31 +01:00
spanText . className = "subtitle-text" ;
2026-03-15 11:30:36 +01:00
nodes . forEach ( node => spanText . appendChild ( node ) ) ;
line . appendChild ( spanText ) ;
const spanAfter = document . createElement ( "span" ) ;
2026-03-16 15:27:31 +01:00
spanAfter . className = "subtitle-after" ;
2026-03-15 11:30:36 +01:00
spanAfter . textContent = "" ;
line . appendChild ( spanAfter ) ;
return line ;
}
2026-03-17 15:07:01 +01:00
2026-03-16 09:48:16 +01:00
processTitle ( subtitle , symbol , withDecor , isLeft ) {
2026-03-16 15:27:31 +01:00
if ( subtitle . querySelector ( ".subtitle-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 ) ;
2026-03-16 15:27:31 +01:00
// Reconstruire le titre avec des .subtitle-line
2026-03-16 09:48:16 +01:00
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 ) ;
2026-03-16 15:27:31 +01:00
const spanAfter = line . querySelector ( ".subtitle-after" ) ;
2026-03-16 09:48:16 +01:00
const baseHeight = line . offsetHeight ;
let count = 0 ;
2026-03-16 15:27:31 +01:00
// subtitle-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é
2026-03-16 09:48:16 +01:00
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-17 15:07:01 +01:00
pageElement . querySelectorAll ( "h6" ) . forEach ( h6 => {
if ( h6 . closest ( ".h6_container" ) ) return ;
const smallSizes = [ 1 , 2 , 3 , 2 , 1 ] ;
const bigSizes = [ 1 , 2 , 3 , 4 , 5 , 4 , 3 , 2 , 1 ] ;
const firstDecor = isLeft
? this . createDecor ( symbol , smallSizes , "decor-h6_small" , "decor-h6" )
: this . createDecor ( symbol , bigSizes , "decor-h6_big" , "decor-h6" ) ;
const container = document . createElement ( "div" ) ;
container . className = "h6_container" ;
h6 . parentNode . insertBefore ( container , h6 ) ;
container . appendChild ( firstDecor ) ;
container . appendChild ( h6 ) ;
} ) ;
2026-02-23 11:35:07 +01:00
}
2026-03-16 12:01:16 +01:00
2026-02-23 11:35:07 +01:00
}