[Writer]Recherche et remplace sur les sélections

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

[Writer]Recherche et remplace sur les sélections

Message par touvenant »

Bonjour à tous,
pour ceux qui connaissent l'extension Grammalecte, celle-ci est géniale mais connaît une limite :
Il n'est pas possible d'effectuer les nettoyages uniquement sur le texte sélectionné, ou uniquement sur les paragraphes formaté par tel ou tel style...
Il me semble que le searchDescriptor est une méthode du document et que cette méthode n'est pas héritée ni accessible par les éléments d'un document... Me trompé-je ?
J'ai trouvé cette discussion :
viewtopic.php?p=223528&hilit=cherche+re ... on#p223528
mais bien que le problème ait été résolu, la question
recherche-remplace dans style spécifique
n'a pas trouvé de réponse...
Est-ce que les choses ont évolué depuis 2013, ou bien je dois faire un recherche sur tout le document et n'appliquer le remplacement que si l'occurence de la recherche a reçu le style donné ?
Cela est une question théorique, il n'y a pas de code pour l'instant, pas de document, donc pas de copie d'écran d'écran non plus.
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1479
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Writer]Recherche et remplace sur les sélections

Message par jeanmi2403 »

Bonsoir,
touvenant a écrit : 23 sept. 2024 10:07 Il me semble que le searchDescriptor est une méthode du document
La méthode exacte est CreateSearchDescriptor qui permet (par macro) de créer un descripteur pour les méthodes Find (Finfirst, FindNext, FindAll) du document.
et que cette méthode n'est pas héritée ni accessible par les éléments d'un document...
Pour moi, cette question est un peu charabia..
Le descripteur créé est évidemment accessible par la macro qui l'a créé !!!
Cet objet descripteur est un structure avec un bon nombre de propriétés utilisables par ces méthodes.
Avec Xray, on y voit la propriété SearchStyles, qui est un Booléen, mais je ne vois pas comment rechercher des styles, car je ne vois rien dans le descripteur qui permette de le définir.
Cela est une question théorique
Alors pas de problème à résoudre ? Donc pas de réponse...
Cordialement,
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: [Writer]Recherche et remplace sur les sélections

Message par touvenant »

cette méthode n'est pas héritée ni accessible par les éléments d'un document...
On peut faire :
Document.CreateSearchDescriptor, la méthode est donc accessible par l'objet document.
Mais si je fait une énumération des éléments de Document :
Quel que soit l'élément, il me semble que je ne peux pas faire :
Document.element.CreateSearchDescriptor
La méthode CreateSearchDescriptor ne seront donc accessible que par le Document, et non par ses éléments ?
pas de problème à résoudre ?
Ce problème et la façon de le contourner, bien que théoriques, n'en demeurent pas moins des problèmes.
Résoudre un problème théorique nécessite une capacité d'abstraction, mais beaucoup d'informaticiens en sont pourvus, tu viens toi même d'y consacrer plusieurs lignes...
Avec Xray, on y voit la propriété SearchStyles, qui est un Booléen, mais je ne vois pas comment rechercher des styles, car je ne vois rien dans le descripteur qui permette de le définir.
Cela permet de rechercher des paragraphes d'un style défini, et je crois qu'on définit le style avec Doc.createSearchDescriptor.SearchString= StyleRecherché ("Titre 1" par exemple).
SearchStyles
If TRUE, it is searched for positions where the paragraph style with the name of the search pattern is applied. More...
Je ne sais pas quelle information cela retourne exactement (positions ?) mais ça me permettrait juste de rechercher les paragraphes d'un style donné (ça, je crois que je sais faire avec paraStyleName), pas de faire des recherches dans les paragraphes d'un style donné.
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1479
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Writer]Recherche et remplace sur les sélections

Message par jeanmi2403 »

Bonsoir,
Finalement j'ai compris le truc, il suffisait de regarder l'interface de recherche.
La recherche d'un mot renvoie une position (au début de l'expression recherchée), on peut créer un curseur à cette position pour mémoriser l'endroit puis se promener dans le texte.
Mais apparemment, il ne semble pas possible de chercher "à partir de cet endroit" (rien trouvé dans le descripteur).

Toutefois, il y a bien un contournement, effectuer la recherche et contrôler le style de l'objet trouvé :

Code : Tout sélectionner

Sub TestRecherche
 oDoc = ThisComponent
 	sCherche ="truc à chercher"
	oCherche = oDoc.CreateSearchDescriptor()
	With oCherche
		.SearchString = sCherche
	End With	
	oTrouve = oDoc.findFirst(oCherche ) ' 
	oCurs = oTrouve.getText().createTextCursorByRange(oTrouve) ' curseur à l'endroit du texte trouvé pour usage ultérieur
'	 Xray oTrouve	
	MsgBox oTrouve.ParaStyleName ' ou oCurs.ParaStyleName
End Sub
Bonne soirée
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: [Writer]Recherche et remplace sur les sélections

Message par touvenant »

Bonsoir Jeanmi, et merci pour ton implication.
C'est effectivement ce genre de contournement auquel je pense si le searchdescriptor ne propose rien de mieux ? (ce qui est quand même l'essence de ma question)

Mais un

Code : Tout sélectionner

ThisDocument.element.CreateReplaceDesriptor
ou un équivalent serait top !
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1479
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Writer]Recherche et remplace sur les sélections

Message par jeanmi2403 »

Salut,
Personnellement, je n'en vois pas l'intérêt, surtout qu'il faudrait commencer par identifier le paragraphe...
Autre possibilité, sélectionner le paragraphe, puis effectuer la recherche dans la sélection active. L'interface le propose, mais je ne sais pas comment le spécifier au descripteur...
A plus,
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: [Writer]Recherche et remplace sur les sélections

Message par touvenant »

je n'en vois pas l'intérêt
Pour faire une recherche en utilisant les regex sur des paragraphes définis, par exemple supprimer les deux points à la fin des titres, mais pas à la fin des corps de texte.
effectuer la recherche dans la sélection active. L'interface le propose, mais je ne sais pas comment le spécifier au descripteur
Voilà ! C'est ça que je cherche
Je continue de chercher, j'ai peut-être une piste du côté de XTextSearch...
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1479
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Writer]Recherche et remplace sur les sélections

Message par jeanmi2403 »

Salut,
Avec l'enregistreur de macro, on voit qu'il utilise un tableau de paramètres pour la recherche :

Code : Tout sélectionner

dim args1(21) as new com.sun.star.beans.PropertyValue
Le seul qui varie en fonction de la sélection est

Code : Tout sélectionner

args1(18).Name = "SearchItem.Command"
args1(18).Value = 0 ' ou 1
Mais ce sont des paramètres pour la méthode :

Code : Tout sélectionner

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
Qui fait le boulot, mais qui ne renvoie rien...
A voir si ça peut être utilisé dans les arguments du descripteur.
J'ai fouillé un peu dans l'API, mais pas vu.... et pas trouvé dans les arguments de XTextSearch.
A plus
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: [Writer]Recherche et remplace sur les sélections

Message par touvenant »

Merci pour ton aide Jeanmi,
j'ai trouvé une méthode replaceString dans les options pour TextSearch, mais elle ne sert pas à faire du remplacement de SearchString !
Je n'ai pas compris ce qu'elle fait, mais ce n'est pas ce que je cherche.
Je continue à explorer la piste :
recherche des paragraphes avec un style défini avec CreateReplaceDescriptor, les regex et SearchStyle=True
puis sur chaque paragraphe trouvé, faire la recherche voulue avec TextSearch et les regex
puis remplacer chaque occurrence trouvée par la chaine voulue.

ça me semble plus "propre" que
faire un CreateSearchDescriptor et chercher avec les regex
puis tester chaque occurrences trouvée pour vérifier si elle appartient à un paragraphe du style défini
puis, dans l'affirmative, effectuer le remplacement
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1479
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Writer]Recherche et remplace sur les sélections

Message par jeanmi2403 »

Bonsoir,
touvenant a écrit : 27 sept. 2024 14:54 puis sur chaque paragraphe trouvé, faire la recherche voulue avec TextSearch et les regex
Et ça fonctionne comment ?
Pas trouvé de TextSearch dans les méthodes de paragraphe...
A plus
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: [Writer]Recherche et remplace sur les sélections

Message par touvenant »

Pas trouvé de TextSearch dans les méthodes de paragraphe...
TextSearch se fait sur une sélection, laquelle sélection est le résultat d'une recherche de paragraphe avec un style donné.
J'ai employé un raccourci malheureux en parlant d'un TextSearch sur un paragraphe (bien que la sélection soit un paragraphe)

Voici un assemblage des briques trouvées sur ce forum et sur le forum anglophone, et qui fonctionne :

Code : Tout sélectionner

REM  *****  BASIC  *****

Sub Main
	searchStyledParagraph("Titre 1", " :", "")
End Sub



REM cherche les paragraphes auquel le style de paragraphe(F11) passé en paramètre a été appliqué
REM puis pour chacun d'entre eux, lance la routine de recherche et remplacement
sub searchStyledParagraph(style as String, SearchString As String, ReplaceString As String)
	on local error goto bug
	Dim Doc as object
	Dim Descriptor as object
	Dim FoundString as object
	Doc = ThisComponent ' représente le fichier contenant la macro.
	Descriptor = Doc.createReplaceDescriptor()
	with Descriptor
		.SearchString = style
		.SearchStyles = true
		.SearchRegularExpression=true
	end with
	FoundString=Doc.findFirst(Descriptor)
	do while NOT IsNull(FoundString)
		REM ici traitement de chaque occurence trouvée :
		Selection = FoundString.String
		SearchAndReplaceOnSelection(FoundString, SearchString, ReplaceString)
		REM puis on passe à l'occurence suivante
		FoundString=Doc.findNext(FoundString.End,  Descriptor)
	loop
bug:
	bug(Erl, Err, Error, "searchStyledParagraph")
End Sub



REM cherche SearchString et remplace par ReplaceString dans FoundString
Sub SearchAndReplaceOnSelection(Selection As Object, SearchString As String, ReplaceString As String)
	on local error goto bug
	oTextSearch = CreateUnoService("com.sun.star.util.TextSearch") ' crée un objet TextSearch
	oOptions = CreateUnoStruct("com.sun.star.util.SearchOptions") ' crée un objet SearchOptions
	REM paramètre les options de l'objet SearchOptions
	oOptions.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
	oOptions.searchString = SearchString
    	REM attribue les options à l'objet TextSearch
	oTextSearch.setOptions(oOptions)
	REM lance la commande de recherche vers l'avant
	REM searchForward(laChaineOuChercher, LaPositionDeDepartDeLaRecherche, LaPositionDeFinDeLaRecherche)
	REM LaPositionDeDepartDeLaRecherche est incluse (pour la recherche en avant)
	REM LaPositionDeFinDeLaRecherche est exclue (pour la recherche en avant)
	oFound = oTextSearch.searchForward(Selection.String, 0, Len(Selection.String))
	If oFound.subRegExpressions = 0 then Exit Sub ' si oFound est vide, on sort !
	Dim SelectionToString As String
	SelectionToString = Selection.String()
	mid(SelectionToString, oFound.startOffset(0) +1, oFound.endOffset(0) - oFound.startOffset(0), ReplaceString)
	Selection.String = SelectionToString
	Exit Sub
bug:
	bug(Erl, Err, Error, "SearchAndReplaceOnSelection")
End Sub



Sub bug(sErl$, sErr$, sError$, sFce$)  ' affiche le message d erreur
	msgbox("Err : " & sErr & chr(13) & "Error : " & sError & chr(13) & "Line : " & sErl & chr(13), 16, sFce)
End Sub
Je ne sais pas trop si je dois baliser ce post comme résolu. J'ai contourné le problème mais, bien que je pense qu'il ne soit pas possible de faire un CreateReplaceDescriptor sur un élément de document (un paragraphe ou une sélection) plutôt que sur le document lui-même, je n'en ai pas la certitude absolue...
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1479
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Writer]Recherche et remplace sur les sélections

Message par jeanmi2403 »

Salut,
Bien joué !! Solution astucieuse. Je n'avais pas compris que tu utilisais l’objet de l'API.
J'ai contourné le problème mais, bien que je pense qu'il ne soit pas possible de faire un CreateReplaceDescriptor sur un élément de document (un paragraphe ou une sélection) plutôt que sur le document lui-même, je n'en ai pas la certitude absolue...
On ne peut pas être sûr de tout, mais là, je penche fortement pour l'impossibilité....
Je pense que tu peux baliser Résolu.
Cordialement,
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: [Writer]Recherche et remplace sur les sélections

Message par touvenant »

En fait, il existe un doute raisonnable.
Je ne sais pas comment fonctionne le dispatcher, qui est sollicité par l'enregistreur de macro.
Mais je sais qu'il est possible de l'utiliser dans les macro enregistrées.
Et comme, sur les sélections actives, la fonction cherche et remplace native de libreOffice (Ctrl +H) me semble plus rapide que l'extension AltSearch je m'interroge...
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1479
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Writer]Recherche et remplace sur les sélections

Message par jeanmi2403 »

Bonsoir,
touvenant a écrit : 29 sept. 2024 03:59 Je ne sais pas comment fonctionne le dispatcher, qui est sollicité par l'enregistreur de macro.
Mais je sais qu'il est possible de l'utiliser dans les macro enregistrées.
De la doc sur OpenOffice ici (mais rébarbative) avec la liste des commandes du Dispatcher.
Pour LibreOffice, un peu plus documenté, c'est ici.
Il y a deux exemples dans la bible Marcelly-Godard.
Et aussi des exemples d'usage sur l'excellente doc d'Andrew Pitonyak.
Bonne soirée,
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: [Writer]Recherche et remplace sur les sélections

Message par touvenant »

Merci, Jeanmi !
Edit le 11/12/2024 :
Je n'ai pas encore reçu le livre de Marcelly/Goddard, et je n'ai pas encore de certitude concernant la possibilité de réaliser un recherche et remplace sur un style de paragraphe avec le dispatcher.
Par contre, j'ai à présent bien épluché le searchdescriptor et la piste que j'avais cru entrapercevoir ne donne rien :
il est possible d'effectuer un cherche et remplace uniquement sur des caractères ayant reçu certains attributs que l'on définit dans un tableau, mais il s'agit là d'attributs de caractères (je ne sais pas si ces attributs peuvent avoir été appliqués par style ou directement ou les deux) pas de style de caractère... impasse !
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12554
Inscription : 08 nov. 2005 16:23
Localisation : Brest, France

Re: [Writer]Recherche et remplace sur les sélections

Message par Bidouille »

Bonjour,
touvenant a écrit : 27 sept. 2024 17:34Je ne sais pas trop si je dois baliser ce post comme résolu. J'ai contourné le problème
C'est vous qui savez si votre problème est solutionné ou non.
Pour avoir une solution clé-en-main de votre contournement, merci de fournir un document embarquant votre macro.
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: [Writer]Recherche et remplace sur les sélections

Message par touvenant »

Bonjour,
pas résolu pour le moment. Je viens juste de recevoir le livre de Marcelly-Goddard, dès que je l'aurai épluché (du moins la partie qui m'intéresse pour l'instant), j'en saurai s'il y a une soluce du côté du dispatcher.
Je n'ai pas besoin de solution pour mon contournement : celui-ci fonctionne parfaitement et n'a besoin de rien. Je l'ai juste collé pour ceux que ça intéresse, il n'y a qu'à le copier et le coller dans l'EDI.
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12554
Inscription : 08 nov. 2005 16:23
Localisation : Brest, France

Re: [Writer]Recherche et remplace sur les sélections

Message par Bidouille »

touvenant a écrit : 15 déc. 2024 16:00 Je n'ai pas besoin de solution pour mon contournement
Il ne s'agit pas de vous mais des autres. Merci donc de fournir le document demandé.
C'est le principe de base de ce forum : partager la connaissance.
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1479
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Writer]Recherche et remplace sur les sélections

Message par jeanmi2403 »

Bonjour,
Bidouille a écrit : 16 déc. 2024 08:18 Merci donc de fournir le document demandé.
L'ami touvenant a fourni le code de sa solution dans ce post.
Néanmoins, je pense qu'il devrait baliser son sujet [Résolu] et poser une demande d'amélioration pour répondre à sa question initiale.
Bonne journée,
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: [Writer]Recherche et remplace sur les sélections

Message par touvenant »

Bonjour,
Je n'ai pas encore eu le temps d'étudier le Dispatcher, et la vérité en découle...
Donc, le sujet n'est pas encore résolu...
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1078
Inscription : 19 août 2018 05:20

Re: [Writer]Recherche et remplace sur les sélections

Message par Dolev »

Bonjour,
jeanmi2403 a écrit : 16 déc. 2024 15:07
Bidouille a écrit : 16 déc. 2024 08:18 Merci donc de fournir le document demandé.
L'ami touvenant a fourni le code de sa solution dans ce post.
Et vous avez réussi à le faire fonctionner ? Sur quel texte exactement ?
Chez moi, cela renvoie une erreur.
Open Office 4.1.15 sous Windows 11
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: [Writer]Recherche et remplace sur les sélections

Message par touvenant »

Oui, je l'ai fait fonctionner sur un document libreOffice.
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1078
Inscription : 19 août 2018 05:20

Re: [Writer]Recherche et remplace sur les sélections

Message par Dolev »

touvenant a écrit : 04 janv. 2025 12:22 Oui, je l'ai fait fonctionner sur un document libreOffice.
Et où est ce document ?
Open Office 4.1.15 sous Windows 11
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: [Writer]Recherche et remplace sur les sélections

Message par touvenant »

Et où est ce document ?
Où je range mes affaires, ça ne te regarde pas...
Peut-être qu'une macro développée avec libreOffice 24 n'est pas compatible avec OpenOffice 5 ?
Peut-être qu'en décrivant l'erreur que tu rencontres (et en joignant ton document et la macro qui te pose problème ?) tu recevrais de l'aide ?
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1078
Inscription : 19 août 2018 05:20

Re: [Writer]Recherche et remplace sur les sélections

Message par Dolev »

touvenant a écrit : 05 janv. 2025 16:18 Où je range mes affaires, ça ne te regarde pas...
Fournir un exemple anonymisé, c'est trop dur alors ?
touvenant a écrit : 05 janv. 2025 16:18eut-être qu'en décrivant l'erreur que tu rencontres (et en joignant ton document et la macro qui te pose problème ?) tu recevrais de l'aide ?
Voici un document fait avec l'autotexte
touvenant.odt
Expliquez moi comment le faire fonctionner avec votre macro ?
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Open Office 4.1.15 sous Windows 11