Seite 1 von 1

Einzelne Zeichen auf einmal formatieren

Verfasst: Mo 5. Jan 2015, 21:07
von Quinto42
Hallo liebe Leute

Ich grübel schon seit längerem an etwas rum und da ich keine Lösung finde, will ich andere fragen.

Ich habe ein Tabellendokument mit Python-Code und ich würde diesen Code nun gerne (wie bei Programmierumgebungen) einfärben. Da wären beispielsweise die Strings, diese fangen ja immer mit einem Apostroph (') an und hören mit einem auf.
Beispielsweise

Code: Alles auswählen

['1', '2', '3']
Da ich natürlich zu faul bin, das jetzt alles zu Fuss einzufärben, versuchte ich mit Suchen und Ersetzen (Reguläre Ausdrücke eingeschaltet) nach '.*' zu suchen. Dies klappte soweit auch, nur wählt er dann die Zellen aus und nicht die einzelnen Inhalte. Soll heissen: Wenn ich jetzt färben will, färbt er die ganzen Zellinhalte ein und nicht nur die gewünschten Zellelemente.

Hat jemand eine Lösung parat? Vielleicht habe ich ja völlig die falsche Funktion benutzt.

Re: Einzelne Zeichen auf einmal formatieren

Verfasst: Mo 5. Jan 2015, 21:48
von karolus
Hallo

Oha! komplettes Syntaxhightlighting in Calc - das ist nicht gerade einfach.

hier ist nur mal ein Minimal-Beispiel wie man Text mit individueller Formatierung in eine Zelle schreibt.

Code: Alles auswählen

def word_formatter():
    doc = XSCRIPTCONTEXT.getDocument()
    sel = doc.CurrentSelection
    cursor = sel.createTextCursor()
    sentence = 'nur 33 Wörter'.split()
    sizes = (30,25,15)
    fonts = ('Carlito', 'Linux Biolinum G:name=1', 'Droid Sans')
    colors = [int(color, 16) for color in ('aa0000', '00aa00', '000fff')]
    for word, size, font, color in zip(sentence, sizes, fonts, colors):
        cursor = cursor.End
        cursor.CharHeight = size
        cursor.CharFontName = font
        cursor.CharColor = color
        cursor.Text.insertString(cursor, '%s\n' % word, False) 
Karolus

Re: Einzelne Zeichen auf einmal formatieren

Verfasst: Sa 10. Jan 2015, 18:43
von Quinto42
Da bin ich wohl jetzt etwas überfordert :D Ich bin noch nicht sehr lange bei LibreOffice. Ich benutzte vorher Excel. Wo kann ich solche Funktionen definieren? Kann man sowas vielleicht sogar in der Formatvorlage definieren?

Also ich schreibe irgendetwas normal in eine Zelle, z.B.

Code: Alles auswählen

['1', '2', '3']
Und möchte dann dieses Syntaxhighlighting, ohne, dass ich den Text separat einfärbe. -->

Code: Alles auswählen

['1', '2', '3'] 
Für den Anfang reich ein Highlighting für die Zeichenketten.

Danke bisher

Re: Einzelne Zeichen auf einmal formatieren

Verfasst: So 11. Jan 2015, 13:30
von lorbass
Quinto42 hat geschrieben:Für den Anfang reich ein Highlighting für die Zeichenketten.
Na, da hat Karolus ja genau das richtige getroffen:
karolus hat geschrieben:hier ist nur mal ein Minimal-Beispiel wie man Text mit individueller Formatierung in eine Zelle schreibt.
Du wirst nicht umhinkommen, dich mit der Programmierung deiner Funktionen etwa in StarBasic, Java oder Python zu beschäftigen. Hilfe dazu bekommst du in diesem Forum im Bereich LibreOffice Programmierung. Informationen rund um den Einstieg in die StarBasic-Programmierung findest du im Forum OpenOffice.info im Beitrag Informationen zur StarBasic-Programmierung.

Gruß
lorbass

Re: Einzelne Zeichen auf einmal formatieren

Verfasst: So 11. Jan 2015, 20:06
von karolus
Hallo

Ich hatte ja schon länger daran gedacht, in der Richtung etwas zu basteln.

Dazu brauchst du aber `pygments` - installieren am besten mit:

Code: Alles auswählen

pip3 install pygments --user
siehe angehängtes Beispieldokument.

Code: Alles auswählen

from pygments import lex
from pygments.lexers import Python3Lexer as py3
from pygments.styles.default import DefaultStyle

from com.sun.star.awt.FontSlant import ITALIC, NONE

style = DefaultStyle().styles

def getprops(keyval):
    
    color, slant, weight = -1, NONE, 100.0
    keyval = keyval.split('#')    
    if len(keyval)==2:
        color = int(keyval[1],16)
    attribut = keyval[0]
    if attribut and not attribut.startswith('no'):
        if 'bold' in attribut:
            weight = 150.0
        if 'italic' in attribut:
            slant = ITALIC
    return (color, weight, slant)

def write_format_token(cursor, string, props):
    propnames = ('CharColor','CharWeight', 'CharPosture')
    cursor.setPropertyValues(propnames, props)
    cursor.Text.insertString(cursor, '%s' % string, False) 
    
def main(*_):
    sel = XSCRIPTCONTEXT.getDocument().CurrentSelection
    if not hasattr(sel, 'String' ):
        sel = sel.getByIndex(0)
    code = sel.String.strip()
    sel.String = ''
    cursor = sel.createTextCursor()
    cursor.CharFontName = 'Source Code Pro'
    loc = cursor.CharLocale
    loc.Language = 'zxx'
    loc.Country = ''
    loc.Variant =''
    cursor.CharLocale = loc
    formatdict = dict()
    for propkey, string in lex(code, py3()):
        if not propkey in formatdict:
            formatdict[propkey] = getprops(style[propkey])
        cursor = cursor.End
        write_format_token(cursor, string, formatdict[propkey])
        
 
codehightlight.ods
(35.04 KiB) 131-mal heruntergeladen