Bonjour,
Merci @Churay pour ta suggestion.
Malheureusement, j'aurais dû plus insister sur le « par l'API » dans ma question (j'aurais voulu le mettre dans le titre du fil, mais on est trop limité en longueur).
D'abord, ta solution plantera LO avec une longue chaine (si je ne m'abuse, une chaine ne peut pas être supérieure à 64Ketc). Vu que je travaille sur des romans, c'est impossible.
Ensuite, je cherche vraiment une
`propriété` de l’instance qui contiendrait ce décalage (ou bien sûr une méthode permettant d'accéder à cette propriété).
Même en passant par le décalage calculé en récupérant le texte puis en cherchant à l’intérieur, je me confronterais au même problème à l'envers.
Pour préciser mon problème :
Le cas en langage humain :
- j'écris un roman.
- En français, un bon roman ne supporte pas de répéter le même mot. La règle veut que deux mots identiques soient au moins séparés d'une page (1500 signes).
- Je voudrais, en cours de ré-écriture (ce qui signifie qu'il peut y avoir du texte avant et après ce que j'écris), pouvoir cliquer sur un bouton pour vérifier si le mot que je suis en train d'écrire possède une proximité impossible (un autre mot identique ou similaire, avant ou après, qui serait à moins de 1500 signes) ou dangereuse (proximité entre 1500 et 3000 signes).
- Si c'est le cas, un message doit signaler le problème à l’auteur(e), mettre le ou les mots en exergue et indiquer le décalage.
Exemple :
Soit le texte :
“““
Ceci est un texte avec un mot
qui devrait ne pas être répété avant le même
mot si un nombre de 1500 signes ne soit
écrit dans le texte avant le mot et [environ 1500 signes] encore
le mot et [environ 5000 signes] le mot à nouveau.
”””
- Je viens d'écrire le mot en bleu.
- Je le sélectionne
- Je clique sur mon bouton de vérification de proximité
- La macro transforme le texte en :
“““
Ceci est un texte avec un
mot
qui devrait ne pas être répété avant le même
mot si un nombre de 1500 signes ne soit
écrit dans le texte avant le
mot et [environ 1500 signes] encore
le
mot et [environ 5000 signes] le mot à nouveau.
”””
- Et la macro affiche le dialog :
Code : Tout sélectionner
------------------------------------------
| Proximité du mot « mot » |
| |
| Trouvé 56 signes avant (!) |
| Trouvé 1752 signes après |
| |
| |
| ___________________ ____ |
| | Supprimer exergue | | OK | |
| ––––––––––––––––––– –––– |
-----------------------------------------
Synopsis :
- Je me concentre sur la section de texte de 3000 signes avant (si possible) à 3000 signes après (si possible) (je sais faire)
- Je crée un descripteur de recherche (qui peut être complexe, avec expression régulière et méthodes de similarités de LibreOffice) (je sais faire)
- Je boucle sur tous les éléments trouvés (il y en a forcément un : le mot cherché) (je sais faire)
- Je passe le mot lui-même (je sais faire, simplement avec `compareRegionStarts`)
- Si un mot se trouve à plus de 1500 signes (JE NE SAIS PAS FAIRE), on signale simplement sa présence, en proximité faible -> application d’un style de caractère
- Si un mot se trouve à moins de 1500 signes (JE NE SAIS PAS FAIRE), on le met en exergue et on signale un problème sérieux -> application d’un style de caractère
Si le code est vraiment nécessaire, je peux l'adjoindre au message, mais en fait, ma demande ne concerne qu'une propriété que je pensais pouvoir atteindre très facilement (la seule difficulté pouvant éventuellement venir des imbrications d'autres objets dans le texte — problème qui n'existe pas ici, c'est toujours un texte continu dont il est question)
Bien sûr, je pourrais (peut-être (*)) passer par le texte.string lui-même, mais ça me semble fastidieux et d’un manque d’élégance absolu…
(*) Comment savoir quel "mot" est celui qu'on doit comparer sans justement connaitre le décalage de la sélection ?
Un grand merci d'avance à ceux qui auront la patience d'aller jusqu'ici et pourront m’aider ou m’aiguiller.
Phil