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

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.
Und möchte dann dieses Syntaxhighlighting, ohne, dass ich den Text separat einfärbe. -->
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:
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])