WP Passe moi le vert (Optimisation)

Je dois pouvoir changer dans un objet WP tous les attributs qui utilisent une couleur précise par une autre couleur.
J’avais pensé faire un ST lire texte, remplacer chaine puis ST fixer texte. Mais c’était trop beau pour être vrai , je perds des tabulations, les couleurs d’encadrements ne sont pas modifiées, etc.
Conclusion, la solution mise en œuvre est de traiter les attributs couleurs du document puis de boucler sur chaque paragraphe et enfin sur chaque caractère.
Comme la méthode est utilisée très régulièrement, peu être que vous avez une autre solution

Voici le code qui est opérationnel. Vos remarques d’optimisation seront les bienvenues.

<code 4D>
C_TEXTE($WP_areaName)
C_POINTEUR($WP_areaPtr)
C_ENTIER LONG($i;$PositionDébut;$PositionFin;$PositionFinMot)

C_TEXTE($Color_CSS_A;$Color_CSS_B;$Color)
C_OBJET($WP_object_Sel;$Objet_paragraphe;$WP_object_SelMot)

Si (Vrai)
// Transformation Bleu en vert
$Color_CSS_A:="#0099FF" // Bleu index 7 dans la palette 4D
$Color_CSS_B:="#10D800" // Vert index 185 dans la palette 4D
Sinon
// Transformation vert en bleu
$Color_CSS_A:="#10D800"// Vert index 185 dans la palette 4D
$Color_CSS_B:="#0099FF"// Bleu index 7 dans la palette 4D
Fin de si

TABLEAU TEXTE($TbxAtt_ColorDPI;6) // Attributs pour la Couleur du document, paragraphe ou image
$TbxAtt_ColorDPI{1}:=wk background color
$TbxAtt_ColorDPI{2}:=wk border color
$TbxAtt_ColorDPI{3}:=wk border color bottom/
$TbxAtt_ColorDPI{4}:=wk border color left
$TbxAtt_ColorDPI{5}:=wk border color right
$TbxAtt_ColorDPI{6}:=wk border color top

TABLEAU TEXTE($TbxUtil1;5) // Attributs pour la Couleur des caractères
$TbxUtil1{1}:=wk text color //Définit la couleur du texte Caractères
$TbxUtil1{2}:=wk text linethrough color
$TbxUtil1{3}:=wk text shadow color //Définit la couleur d’ombre du texte sélectionné. Caractères
$TbxUtil1{4}:=wk text underline color //Définit la couleur du trait de soulignement. Caractères
$TbxUtil1{5}:=wk background color // Définit la couleur de fond du texte (A noter que ce n’est pas documenté dans la liste des attributs Section Police et texte destination Caractères

$WP_areaName:=“WParea”
$WP_areaPtr:=OBJET Lire pointeur(Objet nommé;$WP_areaName)
WP SÉLECTIONNER($WP_areaPtr->;wk start text;wk end text)

$WP_object_Sel:=WP Lire selection(*;$WP_areaName) // Récupération de la séléction
$PositionDébut:=OB Lire($WP_object_Sel;wk range start) // Position du début de la sélection
$PositionFin:=OB Lire($WP_object_Sel;wk range end)

// Traitement des attributs couleur du document
Boucle ($i;1;Taille tableau($TbxAtt_ColorDPI))
WP LIRE ATTRIBUTS($WP_areaPtr->;$TbxAtt_ColorDPI{$i};$Color)
Si ($Color=$Color_CSS_A)
WP FIXER ATTRIBUTS($WP_areaPtr->;$TbxAtt_ColorDPI{$i};$Color_CSS_B)
Fin de si
Fin de boucle

Repeter
WP SÉLECTIONNER(;$WP_areaName;$PositionDébut;$PositionDébut+1)
$WP_object_Sel:=WP Lire selection(
;$WP_areaName)

  // Traitement des attributs couleur du paragraphe
$Objet_paragraphe:=WP Lire paragraphes($WP_object_Sel)
Boucle ($i;1;Taille tableau($TbxAtt_ColorDPI))
	WP LIRE ATTRIBUTS($Objet_paragraphe;$TbxAtt_ColorDPI{$i};$Color)
	Si ($Color=$Color_CSS_A)
		WP FIXER ATTRIBUTS($Objet_paragraphe;$TbxAtt_ColorDPI{$i};$Color_CSS_B)
	Fin de si 
Fin de boucle 

  // Traitement des attributs couleur des caractères
Boucle ($i;1;Taille tableau($TbxUtil1))
	WP LIRE ATTRIBUTS($WP_object_Sel;$TbxUtil1{$i};$Color)
	Si ($Color=$Color_CSS_A)
		$PositionFinMot:=$PositionDébut+1
		
		Repeter   // On sélectionne les cratères suivants jusqu'à ce que l'attribut couleur soit différent de la couleur cherchée
			WP SÉLECTIONNER(*;$WP_areaName;$PositionDébut;$PositionFinMot+1)
			$WP_object_SelMot:=WP Lire selection(*;$WP_areaName)
			
			WP LIRE ATTRIBUTS($WP_object_SelMot;$TbxUtil1{$i};$Color)
			$PositionFinMot:=$PositionFinMot+1
			
		Jusque ($Color#$Color_CSS_A) | ($PositionFinMot>=$PositionFin)
		
		WP SÉLECTIONNER(*;$WP_areaName;$PositionDébut;$PositionFinMot-1)  // On sélectionne le groupe de caractères qui ont l'attribut correspondant à la couleur cherchée
		$WP_object_Sel:=WP Lire selection(*;$WP_areaName)  // On récupère la sélection
		
		WP FIXER ATTRIBUTS($WP_object_Sel;$TbxUtil1{$i};$Color_CSS_B)  // Affectation de la nouvelle couleur
		
	Fin de si 
Fin de boucle 

$PositionDébut:=$PositionDébut+1

Jusque ($PositionDébut>=$PositionFin)

</code 4D>