🙏 Bitte helfen Sie uns das LibreOffice Forum zu erhalten. 🙏
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🍀 Wir hoffen auf Ihre Unterstützung - vielen Dank!🍀
>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗
Zugriff auf Attribute von Zeichen oder Wörtern
Zugriff auf Attribute von Zeichen oder Wörtern
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
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
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.
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.
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.
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.Bei Selektionen mit gemischten Attributen werden diese wohl zusammengefasst und es gehen Informationen verloren.
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.
Gruß,
mikele
mikele
Re: Zugriff auf Attribute von Zeichen oder Wörtern
Hallo,
um selbst etwas mehr mit Python zu machen, habe ich mal ein bisschen probiert:
Der Text wir nun wortweise durchlaufen und je nach Farbe wird eine Sprache zugeordnet (blau -> französisch, gelb -> englisch).
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)
Gruß,
mikele
mikele
Re: Zugriff auf Attribute von Zeichen oder Wörtern
Hallo
@Mikele. Darf ich ein paar Anmerkungen machen ?
@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
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()
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Re: Zugriff auf Attribute von Zeichen oder Wörtern
Hallo karolus,
Danke.
Ich bitte darum!Darf ich
Danke.
Gruß,
mikele
mikele
Re: Zugriff auf Attribute von Zeichen oder Wörtern
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.
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, ...
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()
Die Namenskonvention für die Variablen ist auch nicht konsistent, ...

Gruß,
mikele
mikele
An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:
Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.