🙏 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!🍀

❤️ DANKE >> << DANKE ❤️

>> 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

Alles zur Programmierung im LibreOffice.
Antworten
ufi
Beiträge: 3
Registriert: Mo 24. Feb 2025, 12:35
Wohnort: Berlin

Zugriff auf Attribute von Zeichen oder Wörtern

Beitrag von ufi » So 18. Mai 2025, 13:42

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

mikele
* LO-Experte *
Beiträge: 1927
Registriert: Mo 1. Aug 2011, 20:51

Re: Zugriff auf Attribute von Zeichen oder Wörtern

Beitrag von mikele » Do 22. Mai 2025, 08:55

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.
Gruß,
mikele

mikele
* LO-Experte *
Beiträge: 1927
Registriert: Mo 1. Aug 2011, 20:51

Re: Zugriff auf Attribute von Zeichen oder Wörtern

Beitrag von mikele » So 25. Mai 2025, 18:21

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).
Gruß,
mikele

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2533
Registriert: Fr 10. Dez 2010, 10:01

Re: Zugriff auf Attribute von Zeichen oder Wörtern

Beitrag von karolus » Mo 26. Mai 2025, 10:50

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()
    LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
    LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

    mikele
    * LO-Experte *
    Beiträge: 1927
    Registriert: Mo 1. Aug 2011, 20:51

    Re: Zugriff auf Attribute von Zeichen oder Wörtern

    Beitrag von mikele » Di 27. Mai 2025, 07:56

    Hallo karolus,
    Darf ich
    Ich bitte darum!
    Danke.
    Gruß,
    mikele

    mikele
    * LO-Experte *
    Beiträge: 1927
    Registriert: Mo 1. Aug 2011, 20:51

    Re: Zugriff auf Attribute von Zeichen oder Wörtern

    Beitrag von mikele » Mi 28. Mai 2025, 19:47

    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, ... :oops:
    Gruß,
    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.



    Antworten