Seite 1 von 1
Zugriff auf Attribute von Zeichen oder Wörtern
Verfasst: So 18. Mai 2025, 13:42
von ufi
Hallo Forum
Wie kann ich auf einzelne Wörter im LibreOffice Writer zugreifen?
Kann ich diese aus einem Writer- Dokument in eine Python-Liste abspeichern?
Dann möchte ich die Textfarbe für jedes Wort oder für jedes Zeichen abfragen CharColor wie geht das ?
und dann je nach Farbe eine Sprache zuordnen wie geht das mit welchem Objekt ?
loca = CharLocale
loca.Language = "fr"
loca.Country = "FR"
loca.Variant = ""
CharLocale = loca
Ich hatte schon eine ähnliche Anfrage gestellt
Sprachausgabe von Texten mit mehrfachen Sprachen im Text
von ufi » Mo 24. Feb 2025, 15:00
Bei der Lösung mit while cursor.goRight(1, True) funktioniert das gut, wenn nur eine Farbe / Sprache ausgewählt wird, bei der Selektion von gemischten Sprachen / Farben funktioniert das aber nicht.
Die jeweilige Farbe für ein Zeichen wird nicht selektiert und die Sprache kann nicht gesetzt werden (mehrsprachige / mehrfarbige Auswahl). Daher nun mein Ansatz auf die einzelnen Wörter / Zeichen zu gehen, die jeweils farbig markiert sind.
Außerdem war die while Schleife in der oben genannten Anfrage und dem Lösungsansatz nicht auf die selektierte Text- Auswahl beschränkt.
Bei Selektionen mit gemischten Attributen werden diese wohl zusammengefasst und es gehen Informationen verloren. Daher benötige ich einen Zugriff auf Zeichen / Wörter auf nativer Ebene.
Dazu gibt es bestimmt im Repository entsprechende Objekte und Zugriffsmethoden, die ich noch nicht kenne.
Ich bitte um Hinweise.
MfG
ufi
Re: Zugriff auf Attribute von Zeichen oder Wörtern
Verfasst: Do 22. Mai 2025, 08:55
von mikele
Hallo,
Wörter sind keine Objekte auf die direkt einzeln zugegriffen werden kann (das wären z. B. Absätze).
Man kann aber über eine Textcursor wortweise durch den Text gegen und so (im Prinzip) alle Wörter erfassen. Spezielle Bereiche (Textrahmen, Tabellen, Kopf- und Fußzeilen, ...) müssten noch speziell betrachtet werden.
Das zeichenweise Durchlaufen kennst du ja schon.
Bei Selektionen mit gemischten Attributen werden diese wohl zusammengefasst und es gehen Informationen verloren.
Das stimmt insofern, dass, wenn z. B. zwei Wörter in verschiedenen Sprachen ausgewählt sind, diese Auswahl kein Sprachattribut kennt. Bei zeichenweisem Durchlauf kann das aber nicht passieren.
Jeder Absatz (als Objekt) besteht wiederum aus Absatzteilen (nämlich die, die die gleichen Formatierungen aufweisen). Vielleicht wäre es ein sinnvoller Ansatz durch diese zu iterieren.
Re: Zugriff auf Attribute von Zeichen oder Wörtern
Verfasst: So 25. Mai 2025, 18:21
von mikele
Hallo,
um selbst etwas mehr mit Python zu machen, habe ich mal ein bisschen probiert:
Code: Alles auswählen
import uno
def worte():
doc = XSCRIPTCONTEXT.getDocument()
#Definition der Sprachen
sprache_fr=uno.createUnoStruct("com.sun.star.lang.Locale")
sprache_fr.Language="fr"
sprache_fr.Country = "FR"
sprache_en=uno.createUnoStruct("com.sun.star.lang.Locale")
sprache_en.Language="en"
sprache_en.Country = "GB"
#Textcursor erstellen und auf den Anfang setzen
cursor=doc.Text.createTextCursor()
cursor.gotoStart(False)
weiter=True
#Durchlauf wortweise durch den Text
while weiter:
#Cursor bis zum Wortende ausdehnen
cursor.gotoEndOfWord(True)
if cursor.CharColor == 255: # Blau (FF0000 in LibreOffice-Farbcode)
cursor.CharLocale = sprache_fr
elif cursor.CharColor == 16776960: # Gelb (FFFF00)
cursor.CharLocale = sprache_en
#Cursor nach Wortende
cursor.collapseToEnd()
#wenn möglich zum nächsten Wort springen, wenn nicht liefert es False
weiter=cursor.gotoNextWord(False)
Der Text wir nun wortweise durchlaufen und je nach Farbe wird eine Sprache zugeordnet (blau -> französisch, gelb -> englisch).
Re: Zugriff auf Attribute von Zeichen oder Wörtern
Verfasst: Mo 26. Mai 2025, 10:50
von karolus
Hallo
@Mikele. Darf ich ein paar Anmerkungen machen ?
- »uno« ist bei einem internen Funktionsaufruf bereits global importiert und bekannt, muss also nicht importiert werden
- »structs« können direkt importiert werden, da brauchst du das via »…createUnoStruct« ebenfalls nicht.
- Die beiden Farben könnte man als KONSTANTEN mit sprechenden Namen deklarieren (und da schon mit intuitiver lesbaren hexadezimalen Ausdrücken arbeiten)…
- … dann passiert dir auch nicht daß du einerseits richtig schreibst »255« (für blau) aber dahinter falsch kommentierst »FF0000« wäre nämlich rot
Alles zusammen in python:
Code: Alles auswählen
from com.sun.star.lang import Locale
BLAU = int("0000FF",16)
GELB = int("FFFF00",16)
def worte():
doc = XSCRIPTCONTEXT.getDocument()
#Definition der Sprachen
_fr = Locale(Language="fr", Country="FR")
_en = Locale(Language="en", Country="GB")
doc.lockControllers()
#Textcursor erstellen und auf den Anfang setzen
cursor=doc.Text.createTextCursor()
cursor.gotoStart(False)
#Durchlauf wortweise durch den Text
while True:
cursor.gotoEndOfWord(True)
if cursor.CharColor == BLAU:
cursor.CharLocale = _fr
elif cursor.CharColor == GELB:
cursor.CharLocale = _en
if not cursor.gotoNextWord(False):
break
doc.unlockControllers()
Re: Zugriff auf Attribute von Zeichen oder Wörtern
Verfasst: Di 27. Mai 2025, 07:56
von mikele
Hallo karolus,
Darf ich
Ich bitte darum!
Danke.
Re: Zugriff auf Attribute von Zeichen oder Wörtern
Verfasst: Mi 28. Mai 2025, 19:47
von mikele
Hallo,
nun hat es mich doch gereizt, der Frage weiter nachzugehen und die Bearbeitung auf die ggf. gemachte (Mehrfach-)Auswahl einzuschränken.
Im Prinzip habe ich mich an Pitonyak (Kapitel 14.6. Textauswahl) gehalten und es versucht, komprimiert in Python zu übertragen. Dabei habe ich auch nicht jeden Sonderfall betrachtet.
Code: Alles auswählen
from com.sun.star.lang import Locale
BLAU = int("0000FF",16)
GELB = int("FFFF00",16)
def worte():
doc = XSCRIPTCONTEXT.getDocument()
oText=doc.Text
_fr = Locale(Language="fr", Country="FR")
_en = Locale(Language="en", Country="GB")
doc.lockControllers()
#Auswahl überprüfen
oSelections = doc.CurrentSelection
cursors=[]
for oSel in oSelections:
n=len(cursors)
if oSelections.Count==1:
#nur eine Auswahl oder nichts ausgewählt
oCursor = oText.createTextCursorByRange(oSel)
if oCursor.isCollapsed():
# nichts ausgewählt
msgbox("Es ist nichts gewählt -> wähle alles")
oLCursor = oText.createTextCursorByRange(oText.getStart())
oRCursor = oText.createTextCursorByRange(oText.getEnd())
cursors.append((oLCursor,oRCursor))
if not(oSelections.Count==1 and len(cursors)==1):
# Einfach- oder Mehrfachauswahl
oCursor = oText.createTextCursorByRange(oSel)
if not oCursor.isCollapsed():
# bei Mehrfachauswahl enthält oSelctions[0] nichts
if oText.compareRegionEnds(oSel.getStart(), oSel) >= 0:
#normale Auswahl von links nach rechts
oLCursor = oText.createTextCursorByRange(oSel.getStart())
oRCursor = oText.createTextCursorByRange(oSel.getEnd())
else:
oLCursor = oText.createTextCursorByRange(oSel.getEnd())
oRCursor = oText.createTextCursorByRange(oSel.getStart())
cursors.append((oLCursor,oRCursor))
for (cursor,rcursor) in cursors:
#Anfangscursor wählen und Laufrichtung nach rechts definieren
cursor.goRight(0, False)
#Durchlauf wortweise durch den Text
while True:
#Cursor bis zum Wortende ausdehnen
cursor.gotoEndOfWord(True)
#msgbox(cursor.String)
#ab hier wird mit dem Wort etwas getan
if cursor.CharColor == BLAU:
cursor.CharLocale = _fr
elif cursor.CharColor == GELB:
cursor.CharLocale = _en
#wenn möglich zum nächsten Wort springen, wenn nicht liefert es False
if not cursor.gotoNextWord(False) or oText.compareRegionEnds(cursor, rcursor) <= 0:
break
doc.unlockControllers()
Es ist insofern nicht ganz sauber, weil ein ggf. halbes Wort am Ende der Auswahl dann doch im ganzen verarbeitet wird (ein halbes am Anfang nur zur Hälfte).
Die Namenskonvention für die Variablen ist auch nicht konsistent, ...
