Les tests each passent

This commit is contained in:
David Bruant 2025-05-26 19:17:50 +02:00
parent 4db6b899fa
commit 815f5e5adc
3 changed files with 66 additions and 37 deletions

View File

@ -68,7 +68,7 @@ class TemplateDOMBranch{
this.#leafNode = nextLeaf this.#leafNode = nextLeaf
} }
this.#ancestors = getAncestors(this.#branchBaseNode, this.#leafNode).reverse() this.#ancestors = getAncestors(this.#leafNode, this.#branchBaseNode).reverse()
} }
/** /**
@ -76,7 +76,11 @@ class TemplateDOMBranch{
* @param {number} [startIndex] * @param {number} [startIndex]
*/ */
removeRightContent(startIndex = 0){ removeRightContent(startIndex = 0){
console.log('[removeRightContent]', startIndex, this.#ancestors.slice(startIndex).length)
for(const branchNode of this.#ancestors.slice(startIndex)){ for(const branchNode of this.#ancestors.slice(startIndex)){
console.log('[removeRightContent]', branchNode.nodeType, branchNode.nodeName)
let toRemove = branchNode.nextSibling let toRemove = branchNode.nextSibling
while(toRemove){ while(toRemove){
@ -146,6 +150,16 @@ class TemplateDOMBranch{
return pathFromLeafToBase.toReversed() return pathFromLeafToBase.toReversed()
} }
logBranch(message){
console.group('[TemplateDOMBranch] Showing branch')
console.log(message)
for(const node of this.#ancestors){
console.log('branch node', node.nodeType, node.nodeName)
}
console.groupEnd()
}
} }
@ -169,9 +183,13 @@ class TemplateBlock{
// @ts-expect-error xmldom.Node // @ts-expect-error xmldom.Node
this.#commonAncestor = findCommonAncestor(startNode, endNode) this.#commonAncestor = findCommonAncestor(startNode, endNode)
console.log('create start branch')
this.startBranch = new TemplateDOMBranch(this.#commonAncestor, startNode) this.startBranch = new TemplateDOMBranch(this.#commonAncestor, startNode)
console.log('create end branch')
this.endBranch = new TemplateDOMBranch(this.#commonAncestor, endNode) this.endBranch = new TemplateDOMBranch(this.#commonAncestor, endNode)
this.#middleContent = [] this.#middleContent = []
let content = this.startBranch.at(1).nextSibling let content = this.startBranch.at(1).nextSibling
@ -181,20 +199,17 @@ class TemplateBlock{
} }
console.log('\n== TemplateBlock ==') console.log('\n== TemplateBlock ==')
console.log('startBranch', this.startBranch.at(1).textContent) console.log('startBranch', this.startBranch.at(1).nodeName, this.startBranch.at(1).textContent)
console.log('middleContent', this.#middleContent.map(n => n.textContent).join('')) console.log('middleContent', this.#middleContent.map(n => n.textContent).join(''))
console.log('endBranch\n', this.endBranch.at(1).textContent) console.log('endBranch', this.startBranch.at(1).nodeName, this.endBranch.at(1).textContent)
console.log('common ancestor', this.#commonAncestor.nodeName) console.log('common ancestor', this.#commonAncestor.nodeName, '\n')
} }
removeMarkersAndEmptyAncestors(){ removeMarkersAndEmptyAncestors(){
console.log('[removeMarkersAndEmptyAncestors]', this.#commonAncestor.textContent) //console.log('[removeMarkersAndEmptyAncestors]', this.#commonAncestor.textContent)
//console.log('removeMarkersAndEmptyAncestors startBranch')
this.startBranch.removeLeafAndEmptyAncestors() this.startBranch.removeLeafAndEmptyAncestors()
//console.log('removeMarkersAndEmptyAncestors endBranch')
this.endBranch.removeLeafAndEmptyAncestors() this.endBranch.removeLeafAndEmptyAncestors()
//console.log('[removeMarkersAndEmptyAncestors] after', this.#commonAncestor.textContent)
console.log('[removeMarkersAndEmptyAncestors] after', this.#commonAncestor.textContent)
} }
/** /**
@ -217,7 +232,11 @@ class TemplateBlock{
console.log('[fillBlockContentTemplate] after middleContent') console.log('[fillBlockContentTemplate] after middleContent')
const endChild = this.endBranch.at(1) const endChild = this.endBranch.at(1)
console.log('fillBlockContentTemplate] [endBranch]')
this.endBranch.logBranch('endBranch')
if(endChild){ if(endChild){
console.log('[fillBlockContentTemplate] endChild', endChild.nodeName, endChild.textContent)
fillOdtElementTemplate(endChild, compartement) fillOdtElementTemplate(endChild, compartement)
} }
console.log('[fillBlockContentTemplate] after endChild') console.log('[fillBlockContentTemplate] after endChild')
@ -241,7 +260,7 @@ class TemplateBlock{
* @returns {TemplateBlock} * @returns {TemplateBlock}
*/ */
cloneAndAppendAfter(){ cloneAndAppendAfter(){
console.log('[cloneAndAppendAfter]') //console.log('[cloneAndAppendAfter]')
const clonedPieces = [] const clonedPieces = []
let startBranchClone; let startBranchClone;
@ -453,6 +472,7 @@ function fillEachBlock(startNode, iterableExpression, itemExpression, endNode, c
//console.log('fillEachBlock', iterableExpression, itemExpression) //console.log('fillEachBlock', iterableExpression, itemExpression)
const docEl = startNode.ownerDocument.documentElement const docEl = startNode.ownerDocument.documentElement
console.log('[fillEachBlock] docEl', docEl.textContent)
const repeatedTemplateBlock = new TemplateBlock(startNode, endNode) const repeatedTemplateBlock = new TemplateBlock(startNode, endNode)
@ -476,6 +496,7 @@ function fillEachBlock(startNode, iterableExpression, itemExpression, endNode, c
let nextTemplateBlock = repeatedTemplateBlock let nextTemplateBlock = repeatedTemplateBlock
iterable.forEach((item, i) => { iterable.forEach((item, i) => {
console.log('[fillEachBlock] loop i', i, docEl.textContent)
const firstItem = i === 0 const firstItem = i === 0
const lastItem = i === iterable.length - 1 const lastItem = i === iterable.length - 1
let currentTemplateBlock = nextTemplateBlock; let currentTemplateBlock = nextTemplateBlock;
@ -491,19 +512,25 @@ function fillEachBlock(startNode, iterableExpression, itemExpression, endNode, c
__options__: true __options__: true
}) })
if(!firstItem){
currentTemplateBlock.startBranch.removeLeftContent(2)
}
if(!lastItem){
console.log('[fillEachBlock] removeRightContent')
currentTemplateBlock.endBranch.removeRightContent(2)
}
console.log('[fillEachBlock] docEl i before removeMarkers', i, docEl.textContent)
currentTemplateBlock.removeMarkersAndEmptyAncestors() currentTemplateBlock.removeMarkersAndEmptyAncestors()
console.log('recursive call to fillBlockContentTemplate') console.log('[fillEachBlock] docEl i after removeMarkers', i, docEl.textContent)
console.log('\nrecursive call to fillBlockContentTemplate')
currentTemplateBlock.fillBlockContentTemplate(insideCompartment) currentTemplateBlock.fillBlockContentTemplate(insideCompartment)
if(!firstItem){
currentTemplateBlock.startBranch.removeLeftContent()
} console.log('[fillEachBlock] docEl i after remove contents', i, docEl.textContent)
if(!lastItem){
currentTemplateBlock.endBranch.removeRightContent()
}
}) })
} }
@ -521,9 +548,9 @@ const EACH = eachStartMarkerRegex.source
* @returns {void} * @returns {void}
*/ */
export default function fillOdtElementTemplate(rootElement, compartment) { export default function fillOdtElementTemplate(rootElement, compartment) {
//console.log('fillTemplatedOdtElement', rootElement.nodeType, rootElement.nodeName, rootElement.textContent) console.log('[fillTemplatedOdtElement]', rootElement.nodeType, rootElement.nodeName, rootElement.textContent)
//console.log('fillTemplatedOdtElement', rootElement.childNodes[0].childNodes.length) console.log('[fillTemplatedOdtElement]', rootElement.documentElement && rootElement.documentElement.textContent)
let currentlyOpenBlocks = [] let currentlyOpenBlocks = []
/** @type {Node | undefined} */ /** @type {Node | undefined} */

View File

@ -111,7 +111,7 @@ test('template filling with {#each} generating a list', async t => {
}); });
test.skip('template filling with 2 sequential {#each}', async t => { test('template filling with 2 sequential {#each}', async t => {
const templatePath = join(import.meta.dirname, '../fixtures/liste-fruits-et-légumes.odt') const templatePath = join(import.meta.dirname, '../fixtures/liste-fruits-et-légumes.odt')
const templateContent = `Liste de fruits et légumes const templateContent = `Liste de fruits et légumes
@ -163,7 +163,7 @@ Poivron 🫑
}); });
test.skip('template filling with nested {#each}s', async t => { test('template filling with nested {#each}s', async t => {
const templatePath = join(import.meta.dirname, '../fixtures/légumes-de-saison.odt') const templatePath = join(import.meta.dirname, '../fixtures/légumes-de-saison.odt')
const templateContent = `Légumes de saison const templateContent = `Légumes de saison
@ -248,7 +248,7 @@ Hiver
}); });
test.skip('template filling with text after {/each} in same text node', async t => { test('template filling with text after {/each} in same text node', async t => {
const templatePath = join(import.meta.dirname, '../fixtures/text-after-closing-each.odt') const templatePath = join(import.meta.dirname, '../fixtures/text-after-closing-each.odt')
const templateContent = `Légumes de saison const templateContent = `Légumes de saison
@ -278,13 +278,14 @@ test.skip('template filling with text after {/each} in same text node', async t
Asperge, Asperge,
Betterave, Betterave,
Blette, en Printemps Blette,
en Printemps
`) `)
}); });
test.skip('template filling of a table', async t => { test('template filling of a table', async t => {
const templatePath = join(import.meta.dirname, '../fixtures/tableau-simple.odt') const templatePath = join(import.meta.dirname, '../fixtures/tableau-simple.odt')
const templateContent = `Évolution énergie en kWh par personne en France const templateContent = `Évolution énergie en kWh par personne en France
@ -328,22 +329,16 @@ Année
Année Année
Énergie par personne Énergie par personne
1970 1970
36252.637 36252.637
1980 1980
43328.78 43328.78
1990 1990
46971.94 46971.94
2000 2000
53147.277 53147.277
2010 2010
48062.32 48062.32
2020 2020
37859.246 37859.246
`.trim()) `.trim())

View File

@ -12,17 +12,14 @@ const data = {
} }
*/ */
/*const templatePath = join(import.meta.dirname, '../tests/fixtures/enum-courses.odt')
const templatePath = join(import.meta.dirname, '../tests/fixtures/enum-courses.odt')
const data = { const data = {
listeCourses : [ listeCourses : [
'Radis', 'Radis',
`Jus d'orange`, `Jus d'orange`,
'Pâtes à lasagne (fraîches !)' 'Pâtes à lasagne (fraîches !)'
] ]
} }*/
/* /*
const templatePath = join(import.meta.dirname, '../tests/fixtures/liste-fruits-et-légumes.odt') const templatePath = join(import.meta.dirname, '../tests/fixtures/liste-fruits-et-légumes.odt')
@ -106,6 +103,16 @@ const templatePath = join(import.meta.dirname, '../tests/fixtures/partially-form
const data = {nombre : 37} const data = {nombre : 37}
*/ */
const templatePath = join(import.meta.dirname, '../tests/fixtures/text-after-closing-each.odt')
const data = {
saison: 'Printemps',
légumes: [
'Asperge',
'Betterave',
'Blette'
]
}
const odtTemplate = await getOdtTemplate(templatePath) const odtTemplate = await getOdtTemplate(templatePath)