[Résolu][Writer] Comment faire plusieurs index lexicaux

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 !
Maumau35
Fraîchement OOthentifié
Messages : 8
Inscription : 13 avr. 2015 10:47

[Résolu][Writer] Comment faire plusieurs index lexicaux

Message par Maumau35 »

Bonjour,

Ceci n'est pas vraiment une question, mais un contournement pour ceux qui ont besoin de plusieurs index lexicaux dans leurs documents, que vos lumières permettront peut-être d'améliorer, pour le plus grand bien de la communauté...

Je travaille sur un projet de plusieurs milliers de pages, à terme plusieurs volumes de 5-600 pages chacun. J'ai besoin pour chacun d'un index des patronymes et d'un index des toponymes. Comme LibreOffice ne sait gérer qu'un seul index lexical, j'ai opté pour une solution donnée quelque part sur ce forum : utiliser des clés pour différencier les deux types d'entrées.
J'ai ensuite inséré l'index en laissant la possibilité de le modifier manuellement. J'ai donc une clef "Table des patronymes", et une clef "Table des toponymes". Quand je met à jour mon index, ça me donne un truc style :
Table des patronymes
Dupont 1
Duval 5
Martin 3
Table des toponymes
Brest 1
Nantes 2
Perpignan 9
Toulon 8
Je supprime les lignes des clefs et celles des toponymes, et nickel, ça me donne ce que je veux. Je fais de même pour la table des toponymes, qui sont sur des pages séparées.
Dupont 1
Duval 5
Martin 3
Sauf que chacun de mes index fait plusieurs pages, que je vais avoir plusieurs volumes à gérer, et donc faire cette manip à chaque mise à jour devient vite ch pénible. J'ai donc fait une petite macro qui s'occupe de ça. Une entrée d'index zzzzz me permet de détecter la fin de l'index (cette entrée zzzzz est effacée de la table par le script).

Code : Tout sélectionner

Sub Main

  dim oDoc as object
  dim oSearchZone as object
  dim oTrouveZone as object
  dim oTrouveApresZone as object
  dim oCurseurVisible as object
  
  call MiseAJourIndex
 
  oDoc = thiscomponent
 
  oSearchZone = oDoc.createSearchDescriptor()
  oSearchZone.SearchCaseSensitive = true
  oSearchZone.SearchRegularExpression = true
 
  oSearchZone.SearchString = "Table des patronymes\t+$" 
  oTrouveZone = oDoc.findFirst(oSearchZone)
 
  if isnull(oTrouveZone) then
    msgbox "Table Patronymes NON mise à jour", 64, "Maumau macro"
    exit sub
  end if

  oTrouveZone.gotoEndOfParagraph(true)
  oTrouveZone.goRight(1,true)
  oTrouveZone.string = ""
  oSearchZone.SearchString = "Table des toponymes\t+$"
  oTrouveZone = oDoc.findNext(oTrouveZone.End, oSearchZone)
  if isnull(oTrouveZone) then
    msgbox "Table Patronymes MAL mise à jour 1", 64, "Maumau macro"
    exit Sub
  endif

  oSearchZone.SearchString = "zzzzz\t[0-9]+$"
  oTrouveZoneFin = oDoc.findNext(oTrouveZone.End, oSearchZone)
  if isnull(oTrouveZoneFin) then
    msgbox "Table Patronymes MAL mise à jour 2", 64, "Maumau macro"
    exit Sub
  end if

  oCurseurAEffacer = oDoc.currentcontroller.viewCursor
  oCurseurAEffacer.gotoRange(oTrouveZone.Start, false)
  oCurseurAEffacer.gotoRange(oTrouveZoneFin.End, True)
  oCurseurAEffacer.goRight(1,true)
  oCurseurAEffacer.string = ""
    
  rem Maintenant la table des toponymes
  
  oSearchZone.SearchString = "Table des patronymes\t+$" 
  oTrouveZone = oDoc.findFirst(oSearchZone)
 
  if isnull(oTrouveZone) then
    msgbox "Table Toponymes NON mise à jour", 64, "Maumau macro"
    exit sub
  end if

  oSearchZone.SearchString = "Table des toponymes\t+$"
  oTrouveZoneFin = oDoc.findNext(oTrouveZone.End, oSearchZone)
  if isnull(oTrouveZoneFin) then
    msgbox "Table Toponymes MAL mise à jour 1", 64, "Maumau macro"
    exit Sub
  endif

  oCurseurAEffacer.gotoRange(oTrouveZone.Start, false)
  oCurseurAEffacer.gotoRange(oTrouveZoneFin.End, True)
  oCurseurAEffacer.goRight(1,true)
  oCurseurAEffacer.string = ""

  oSearchZone.SearchString = "zzzzz\t[0-9]+$"
  oTrouveZoneFin = oDoc.findNext(oTrouveZoneFin.End, oSearchZone)
  if isnull(oTrouveZoneFin) then
    msgbox "Table Toponymes MAL mise à jour 2", 64, "Maumau macro"
    exit Sub
  end if
  
  oTrouveZoneFin.gotoEndOfParagraph(true)
  oTrouveZoneFin.goRight(1,true)
  oTrouveZoneFin.string = ""
  oTrouveZoneFin.goLeft(1,true)
  oTrouveZoneFin.string = ""
  
  msgBox "OK"

End Sub

Sub MiseAJourIndex

  dim i as long
  for i = 0 TO thisComponent.getDocumentIndexes().count - 1
     thisComponent.getDocumentIndexes().getByIndex(I).update()     
  next i
  
End Sub
Et le document kivabien pour tester, ci-joint (la macro est dedans)...
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par micmac le 01 oct. 2015 13:50, modifié 1 fois.
Raison : Ajout de la coche
LibreOffice 4.4.5/Win10