[Issue][Writer] Décalage (as Long) de caractère d'un texte

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 !

[Issue][Writer] Décalage (as Long) de caractère d'un texte

Messagepar Icare » 05 Juin 2018 13:16

Bonjour,

Tout nouveau dans les macros, après moult heures de recherche dans la documentation, je me confronte à un problème certainement ridicule : je voudrais simplement connaitre, en nombre entier, le décalage d'un mot (donc de son premier caractère) dans un texte, en passant bien sûr par l'API.

Par exemple :

Je prends la sélection :

Code : Tout sélectionner   AgrandirRéduire

Dim oVCursor as Object
oVCursor = thisComponent.CurrentController.getViewCursor()



On dispose d’une méthode `getStart()`, mais elle ne renvoie pas un nombre entier (mais un objet contenant énormément de méthodes et de propriétés, mais pas `Start`, par exemple.

Je voudrais pouvoir faire :

Code : Tout sélectionner   AgrandirRéduire

Dim iWordOffset as Integer
iWordOffset = oVCursor.Start ' => Décalage de la sélection



J'ai bien sûr essayé plein de choses, dont l'appel à certains services (mais certainement pas les bons), dont :

Code : Tout sélectionner   AgrandirRéduire

iWordOffset = oVCursor.Start ' NE FONCTIONNE PAS
iWordOffset = oVCursor.getStart().value ' IDEM
iWordOffset = oVCursor.getStart().getValue() ' IDEM


Si le document contient le texte : « Ceci est mon texte sélectionné. », je voudrais que `iWordOffset` contienne 9 (si 0-start).


Un grand merci à vous pour toute information ou toute piste suggérée.

PS : désolé si ce sujet devait plutôt se préfixer « [Basic] », je ne connais pas encore assez le langage des macros pour savoir si le problème peut être utilisé aussi dans Calc et autre.
Dernière édition par Icare le 07 Juin 2018 05:07, édité 1 fois.
LibreOffice 5.1.6.2 sur Mac OS X High Sierra (10.13.2)
Avatar de l’utilisateur
Icare
Membre prOOscrit
 
Message(s) : 13
Inscrit le : 05 Juin 2018 12:15

Re: [Writer] Décalage (as Int) d'un caractère dans un texte

Messagepar Churay » 05 Juin 2018 14:12

Bonjour,

Icare a écrit:je voudrais que `iWordOffset` contienne 9 (si 0-start).
A ma connaissance, Start est à 1, donc dans «Ceci est mon texte sélectionné.», la position de mon texte sélectionné sera 10 et non 9.

Cela étant précisé :
Code : Tout sélectionner   AgrandirRéduire
Option Explicit

Sub Main
Dim oDoc AS Object, oCursor AS Object
Dim sText AS String, sSelect AS String, iWordOffset
   oDoc = thisComponent : oCursor = oDoc.CurrentController.getViewCursor()
   sText = oCursor.Text.String : sSelect = oCursor.String

   iWordOffset = Instr(sText , sSelect)
   MsgBox iWordOffset
End Sub
devrait répondre à ton attente.

S'il y a bien une sélection active.
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2668
Inscrit le : 30 Avr 2009 05:54
Localisation : CATALUNYA

Re: [Writer] Décalage (as Int) d'un caractère dans un texte

Messagepar tintin » 05 Juin 2018 15:34

Bonjour,
votre signature a écrit:LibreOffice 5.1.6.2 sur Mac OS X High Sierra (10.13.2)

Afin de profiter des dernières améliorations, il est fortement recommandé d'être à jour de la dernière version stable 5.4.7
AOO 4.1.6 / macOS 10.14.6 Mojave
Java-8u221 / Firefox / Safari / Thunderbird / Time Machine
Pour préserver vos documents, faites régulièrement des sauvegardes.
Avatar de l’utilisateur
tintin
GourOOu
GourOOu
 
Message(s) : 6160
Inscrit le : 18 Juil 2008 16:29
Localisation : F-Oise + F-Savoie

Re: [Writer] Décalage (as Int) d'un caractère dans un texte

Messagepar Icare » 06 Juin 2018 05:58

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   AgrandirRéduire

         ------------------------------------------
         |  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
LibreOffice 5.1.6.2 sur Mac OS X High Sierra (10.13.2)
Avatar de l’utilisateur
Icare
Membre prOOscrit
 
Message(s) : 13
Inscrit le : 05 Juin 2018 12:15

Re: [Writer] Décalage (as Int) d'un caractère dans un texte

Messagepar Icare » 06 Juin 2018 06:02

tintin a écrit:Afin de profiter des dernières améliorations, il est fortement recommandé d'être à jour de la dernière version stable 5.4.7


Merci @tintin pour la suggestion. J'ai malheureusement la mauvaise habitude d'attendre suffisamment de feedbacks d’utilisateurs avant d’upgrader mes apps. Donc je ne suis jamais à jour…

Bien à toi.
LibreOffice 5.1.6.2 sur Mac OS X High Sierra (10.13.2)
Avatar de l’utilisateur
Icare
Membre prOOscrit
 
Message(s) : 13
Inscrit le : 05 Juin 2018 12:15

Re: [Writer] Décalage (as Int) d'un caractère dans un texte

Messagepar Hubert Lambert » 06 Juin 2018 07:34

Bonjour,

Ci-dessous un exemple, mais qui sans doute ne résout pas la question d'un très long texte (voir ajout).
Cordialement.

 Ajout : Si plus de 65536 caractères séparent deux occurrences, la macro affichera '0'. Mais une version python résoudrait sans difficulté le problème. 
Pièces jointes
Icare.odt
(33.65 Kio) Téléchargé 24 fois
AOOo 4.1.2 sur Win7
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1115
Inscrit le : 06 Avr 2016 08:26

Re: [Writer] Décalage (as Int) d'un caractère dans un texte

Messagepar Icare » 06 Juin 2018 09:09

Bonjour @Hubert_Lambert,

Hubert Lambert a écrit:Ci-dessous un exemple, mais qui sans doute ne résout pas la question d'un très long texte (voir ajout).


Oui, donc, le truc, c'est de calculer la longueur de texte entre le mot n et le mot n+1…

Dommage de devoir en passer par là :-(, mais la solution est maligne… :-)

Un grand merci à toi.

En passant, avec mon fonctionnement ne se pose pas le problème de longueur de texte puisque je ne travaille jamais sur le texte entier.

Je reste bien sûr à l'écoute de toute personne qui pourra m'indiquer comment atteindre la propriété voulue très simplement. Elle doit bien exister quelque part ;-) (mais bon, je comprendrais peut-être lorsque j'aurai compris la philosophie profonde de LibreOffice…).
LibreOffice 5.1.6.2 sur Mac OS X High Sierra (10.13.2)
Avatar de l’utilisateur
Icare
Membre prOOscrit
 
Message(s) : 13
Inscrit le : 05 Juin 2018 12:15

Re: [Writer] Décalage (as Int) d'un caractère dans un texte

Messagepar Hubert Lambert » 06 Juin 2018 11:05

Je ne suis pas du tout sûr que cela existe (quelqu'un infirme le cas échéant) mais, si tu as besoin d'une abstraction de plus haut niveau, pourquoi ne pas te construire une bibliothèque de fonctions par dessus l'API ?
AOOo 4.1.2 sur Win7
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1115
Inscrit le : 06 Avr 2016 08:26

Re: [Writer] Décalage (as Int) d'un caractère dans un texte

Messagepar Icare » 06 Juin 2018 11:19

Hubert Lambert a écrit:Je ne suis pas du tout sûr que cela existe


Tu parles bien au niveau du Basic, là, au niveau des macros. Parce que l'information doit bien exister quelque part, non ?

Sur quoi se base les méthodes `getStart()` (quand elle sert à instancier un `Cursor` par exemple), `compareRegionStarts()` etc.

Hubert Lambert a écrit:mais, si tu as besoin d'une abstraction de plus haut niveau, pourquoi ne pas te construire une bibliothèque de fonctions par dessus l'API ?


Tout simplement parce que je n'en suis pas encore là (je découvre à peine le Basic LO et les macros LibreOffice) et surtout que je pensais juste faire une petite macro facilement pour ça (c'est bête, je butte seulement sur un truc hallucinement simple…).

Je pense, au final, que je vais me contenter de signaler la proximité, sans précision exacte de l'écart de signes (sauf si je reprends ton idée maligne).

Encore merci à toi !
LibreOffice 5.1.6.2 sur Mac OS X High Sierra (10.13.2)
Avatar de l’utilisateur
Icare
Membre prOOscrit
 
Message(s) : 13
Inscrit le : 05 Juin 2018 12:15

Re: [Writer] Décalage (as Int) d'un caractère dans un texte

Messagepar Churay » 06 Juin 2018 21:50

Bonsoir

La limite des 64 k concerne la variable, mais la méthode oCursor.Text.String te renseigne sur la taille exacte (dans mon test : 87995), il est donc possible de travailler sur des textes loooooooooongs, comme l'a brillamment démontré Hubert

Icare a écrit: sans précision exacte de l'écart de signes (sauf si je reprends ton idée maligne).
L'idée est effectivement maligne puisque elle fonctionne sur des textes de plus de 64 K, le seul bémol est que, si la distance est supérieure à 65536 caractères, le retour est 0.
Ce qui en soi n'est pas un problème puisque tu cherches dans l'espace des 1500 caractères : au pire, le mot situé à 12827 caractères ne sera pas signalé...
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2668
Inscrit le : 30 Avr 2009 05:54
Localisation : CATALUNYA

Re: [Writer] Décalage (as Int) d'un caractère dans un texte

Messagepar Icare » 07 Juin 2018 05:04

Bonjour @Churay,

Merci de ta réponse.

Churay a écrit:L'idée est effectivement maligne puisque elle fonctionne sur des textes de plus de 64 K, le seul bémol est que, si la distance est supérieure à 65536 caractères, le retour est 0.


Heu… donc elle ne fonctionne pas sur des textes de plus de 64K ;-).

Churay a écrit:Ce qui en soi n'est pas un problème puisque tu cherches dans l'espace des 1500 caractères : au pire, le mot situé à 12827 caractères ne sera pas signalé...


Sur un espace de 6000 signes, oui (± 3000 par rapport à la sélection).

Oui, bien sûr, c'est possible, mais j'aurais aimé une solution plus élégante, que j'aurais pu obtenir simplement en pouvant atteindre directement la propriété de décalage.

Merci à toi !
LibreOffice 5.1.6.2 sur Mac OS X High Sierra (10.13.2)
Avatar de l’utilisateur
Icare
Membre prOOscrit
 
Message(s) : 13
Inscrit le : 05 Juin 2018 12:15

[Résolu] Ligne impossible à enlever

Messagepar Dude » 13 Juin 2018 16:03

Rappel sur la demande d'amélioration 17171 pour dépasser la limite des 65.534 caractères pour un paragraphe (95 voix à ce jour).

Faut voter !
AOO 4.1.6 sous Windows 7 Pro x64

Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20875
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité