From 9e35737995617d12fb3d987805c17be8a387a0e0 Mon Sep 17 00:00:00 2001 From: David Bruant Date: Tue, 29 Apr 2025 13:44:01 +0200 Subject: [PATCH] test if qui passe --- scripts/odf/fillOdtTemplate.js | 68 +++++++++++++++++++++----- tests/fill-odt-template/if.js | 6 +-- tests/fixtures/description-nombre.odt | Bin 13096 -> 13290 bytes 3 files changed, 58 insertions(+), 16 deletions(-) diff --git a/scripts/odf/fillOdtTemplate.js b/scripts/odf/fillOdtTemplate.js index 08222b6..085c918 100644 --- a/scripts/odf/fillOdtTemplate.js +++ b/scripts/odf/fillOdtTemplate.js @@ -173,28 +173,70 @@ function extractBlockContent(blockStartNode, blockEndNode){ * @param {Compartment} compartment */ function fillIfBlock(ifOpeningMarkerNode, ifElseMarkerNode, ifClosingMarkerNode, ifBlockConditionExpression, compartment){ - console.log('fillIfBlock pas encore codée') - const conditionValue = compartment.evaluate(ifBlockConditionExpression) - if(conditionValue){ - // récupérer le morceau entre ifOpeningMarkerNode et ifElseMarkerNode - // l'executer + let startChild + let endChild + + let markerNodes = new Set() + + let chosenFragment + + if(ifElseMarkerNode){ + const { + startChild: startIfThenChild, + endChild: endIfThenChild, + content: thenFragment + } = extractBlockContent(ifOpeningMarkerNode, ifElseMarkerNode) + + const { + startChild: startIfElseChild, + endChild: endIfElseChild, + content: elseFragment + } = extractBlockContent(ifElseMarkerNode, ifClosingMarkerNode) + + chosenFragment = conditionValue ? thenFragment : elseFragment + startChild = startIfThenChild + endChild = endIfElseChild + + markerNodes + .add(startIfThenChild).add(endIfThenChild) + .add(startIfElseChild).add(endIfElseChild) } else{ + const { + startChild: startIfThenChild, + endChild: endIfThenChild, + content: thenFragment + } = extractBlockContent(ifOpeningMarkerNode, ifClosingMarkerNode) + chosenFragment = conditionValue ? thenFragment : undefined + startChild = startIfThenChild + endChild = endIfThenChild + + markerNodes + .add(startIfThenChild).add(endIfThenChild) } - // dans tous les cas, recupérer ce qu'il y a entre ifOpeningMarkerNode et ifClosingMarkerNode - // et le supprimer de l'arbre + if(chosenFragment){ + fillTemplatedOdtElement( + chosenFragment, + compartment + ) + endChild.parentNode.insertBefore(chosenFragment, endChild) + } + + for(const markerNode of markerNodes){ + try{ + // may throw if node already out of tree + // might happen if + markerNode.parentNode.removeChild(markerNode) + } + catch(e){} + } - /*throw `PPP - - executer l'expression - - selon la valeur, choisir le bon block à extraire/remplir - - - `*/ } @@ -242,7 +284,7 @@ function fillEachBlock(startNode, iterableExpression, itemExpression, endNode, c endChild.parentNode.insertBefore(itemFragment, endChild) } - // remove block elements + // remove block marker elements startChild.parentNode.removeChild(startChild) endChild.parentNode.removeChild(endChild) } diff --git a/tests/fill-odt-template/if.js b/tests/fill-odt-template/if.js index f41ddf2..729f0ca 100644 --- a/tests/fill-odt-template/if.js +++ b/tests/fill-odt-template/if.js @@ -10,10 +10,10 @@ test('basic template filling with {#if}', async t => { const templatePath = join(import.meta.dirname, '../fixtures/description-nombre.odt') const templateContent = `Description du nombre {n} -{#if n >5} -n est un grand nombre -{:else} +{#if n<5} n est un petit nombre +{:else} +n est un grand nombre {/if} ` diff --git a/tests/fixtures/description-nombre.odt b/tests/fixtures/description-nombre.odt index 7ede55edf3c0ba474e6ab2aa32ce9c997d15aec8..e44bd4f56bfaed15e2dd7a291dbee8d42af863db 100644 GIT binary patch delta 10466 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 F{{!XBTBHB~ delta 10305 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 U1?6%OLJNXAIcO28nEzV;KO90c761SM