[gelöst] Suche nach Formaten (in Writer-Text)

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

[gelöst] Suche nach Formaten (in Writer-Text)

Beitrag von Toxitom »

Hey zusammen,

ich versuche gerade, eine Suche nach Formaten in Writer mit Basic-API Methoden nachzustellen und komme leider nicht weiter.

Hintergrund:
In Writer ist es möglich, eine "Suchen & Ersetzen" Anfrage zu starten und bestimmte Formate (in dem Fall spezielle Zeichenformatierungen - nämlich "Hervorhebungen") zu suchen und durch andere Formatierungen zu ersetzen.

Diese Möglichkeit versuche ich nun mit Basic umzusetzen. Bisher finde ich lediglich die Möglichkeit, im com.sun.star.util.SearchDescriptor Objekt die Eigenschaft "SearchStyles" auf True zu setzen und entsprechend den Absatz-Format Namen im Searchstring zu platzieren.

Nicht das, was ich suche.

Per Makro-Rekorder kann ich zwar den passenden Dispatcher-Code aufzeichnen, der sieht dann wie folgt aus (Ausschnitt):

Code: Alles auswählen

rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(21) as new com.sun.star.beans.PropertyValue
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 0
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = true
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = false
args1(4).Name = "SearchItem.SearchFiltered"
args1(4).Value = false
args1(5).Name = "SearchItem.Backward"
args1(5).Value = false
args1(6).Name = "SearchItem.Pattern"
args1(6).Value = false
args1(7).Name = "SearchItem.Content"
args1(7).Value = false
args1(8).Name = "SearchItem.AsianOptions"
args1(8).Value = false
args1(9).Name = "SearchItem.AlgorithmType"
args1(9).Value = 1
args1(10).Name = "SearchItem.SearchFlags"
args1(10).Value = 65536
args1(11).Name = "SearchItem.SearchString"
args1(11).Value = ""
args1(12).Name = "SearchItem.ReplaceString"
args1(12).Value = ""
args1(13).Name = "SearchItem.Locale"
args1(13).Value = 255
args1(14).Name = "SearchItem.ChangedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.DeletedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.InsertedChars"
args1(16).Value = 2
args1(17).Name = "SearchItem.TransliterateFlags"
args1(17).Value = 1073743104
args1(18).Name = "SearchItem.Command"
args1(18).Value = 1
args1(19).Name = "SearchItem.SearchFormatted"
args1(19).Value = false
args1(20).Name = "SearchItem.AlgorithmType2"
args1(20).Value = 2
args1(21).Name = "Quiet"
args1(21).Value = true

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
und zur Not kann ich damit leben (als Unterroutine) - lieber aber würde ich das direkt im Basic-code spezifizieren und umsetzen.

Leider Fehlen mir dazu die richtigen Einstiegspunkte.
Ich schätze mal, die beiden Dispatcher-Eigenschaften "SearchItem.SearchFlags" und "SearchItem.TransliterateFlags" müssten der Schlüssel zum Ergebnis sein, leider kann ich keine entsprechenden Hinweise in der API Referenz auf diese Werte und evt. Ausprägungen finden.

Vielleicht hat jemand eine Idee?

Das Ziel:
Ein beliebiger Writer-Text wurde von einem Benutzer mit Hilfe des Icons "Farbe für Hervorhebungen" an beliebigen Stellen markiert. Faktisch wird dabei lediglich die Hintergrundfarbe des Zeichens verändert. Das Makro nun soll alle diesen Stellen die "harte" Formatierung entfernen und durch eine Zeichenformat-Vorlage ersetzen.

Theoretisch wäre zwar eine Iteration über alle Zeichen des Textes möglich, bei einer Datei mit mehreren hundert Seiten Text jedoch überhaupt nicht mehr perform. Die bereits eingebaute Suchroutine hingegen ist sehr perform und mit der Möglichkeit, alle Stellen "in einem Rutsch" zu bearbeiten perfekt.

Für sachdienliche Hinweise bin ich sehr dankbar.

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Suche nach Formaten (in Writer-Text)

Beitrag von Stephan »

Hallo Tom,

ich habe momentan keine Zeit den Code durchzusehen, aber in AltSearch (https://extensions.openoffice.org/en/pr ... -altsearch) ist die Suche nach Textmarkierungen enthalten und also muss dazu auch im Code die Lösung stehen (oder an der Stelle würde dort auch mit Dispatcher gearbeitet).



Gruß
Stephan
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Suche nach Formaten (in Writer-Text)

Beitrag von Toxitom »

Danke Stephan,

schaue ich gern mal rein:)

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Suche nach Formaten (in Writer-Text)

Beitrag von Toxitom »

ok, Code gefunden und getestet. Passt:)

Für´s Archiv:

Code: Alles auswählen

...
  nBGColor = rgb(255,255,0)   'gesuchte Hintergrundfarbe - hier Gelb2
  dim oAttr(0) as new com.sun.star.beans.PropertyValue
  oTKDesc = odoc.createReplaceDescriptor()
  oTKDesc.SearchAll = true
  oTKDesc.ValueSearch = true    'Attribute werden übergeben
  oTKDesc.SearchStyles = true   'Formate suchen an, werden dann mit Attributen spezifiziert
  oAttr(0).Name = "CharBackColor"
  oAttr(0).Value = nBGColor
  oTKDesc.SetSearchAttributes(oAttr())  
  
  oSuche = oDoc.findAll(oTKDesc)
  ...
Danke Stephan nochmal für den passenden Link:)

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Antworten