Seite 1 von 1
Syntaxhighlighting in Django mit Pygments
Verfasst: Samstag 31. Januar 2009, 14:37
von Mawilo
Hallo,
ich möchte gerne auf einer Site Python-Code mit Pygments darstellen. Wie muss ich da vorgehen? Ich bin für jeden Tip oder jedes Beispiel dankbar.
Grüße
Mawilo
Verfasst: Samstag 31. Januar 2009, 15:06
von hendrikS
Ich habe es so gemacht (meine Seite ist noch nicht online - kommt aber bald)
1.) pygments installieren
2.) Style sheet generieren:
> pygmentize -f html -S emacs > emacs.css
3.) Html generieren:
> pygmentize.exe -f html -O full,style=emacs -o bla.html bla.py
Die div Blöcke kann man dann einfach in die eigenen Seiten kopieren.
Möglicherweise geht es auch einfacher.
Verfasst: Samstag 31. Januar 2009, 15:26
von lunar
Und wozu genau benötigt man bei dem gezeigten Beispiel jetzt den zweiten Schritt?
Verfasst: Samstag 31. Januar 2009, 15:36
von Mawilo
Auf diese Art habe ich statische Seiten erstellt. Ich würde gerne in so einer Art Blog python-Code eingeben, der dann angezeigt werden soll.
Beispieltemplate:
Code: Alles auswählen
{% extends "base.html" %}
{% block title %}{{ object }}{% endblock %}
{% block content %}
<h1>{{ object }}</h1>
<p>Syntax: {{ object.get_syntax_display }}<br>
Date: {{ object.timestamp|date:"r" }}</p>
<code><pre >{{ object.content }}</pre></code>
{% endblock %}
Mawilo
Verfasst: Samstag 31. Januar 2009, 15:53
von hendrikS
@lunar
Ich habe ein zentrales Style sheet. Dort habe ich die pygments Formatierungen hineinkopiert. Aus den generierten Seiten kopiere ich nur die div Blöcke.
@mawilo
Warum formulierst Du Dein Problem nicht gleich konkreter?
Verfasst: Samstag 31. Januar 2009, 16:00
von lunar
hendrikS hat geschrieben:Ich habe ein zentrales Style sheet. Dort habe ich die pygments Formatierungen hineinkopiert. Aus den generierten Seiten kopiere ich nur die div Blöcke.
Und wozu dient dann "-Ofull,style=emacs" in Schritt 3?
Verfasst: Samstag 31. Januar 2009, 16:09
von hendrikS
@ lunar
Danke für die Anmerkung. Die erwähnten Optionen kann man in meinem Fall weglassen. Aber es ist im Grunde Jacke wie Hose wo ich die div Blöcke rauskopiere.
@ mawilo
Für Deinen Zweck wirst Du wohl das Python Programmierinterface bemühen müssen. Siehe pygments Doku.
Verfasst: Samstag 31. Januar 2009, 16:15
von lunar
hendrikS hat geschrieben:Danke für die Anmerkung. Die erwähnten Optionen kann man weglassen. Aber es ist im Grunde Jacke wie Hose wo ich die div Blöcke rauskopiere.
Ohne "-O full" musst du nichts "rauskopieren", weil die Datei nur die div-Blöcke enthält. Man kann die Datei also ohne Nachbearbeitung direkt einbetten, z.B. mit "string.Template()".
Verfasst: Samstag 31. Januar 2009, 16:36
von hendrikS
@ lunar.
Ich weiß leider noch nicht, wie das geht. Meinst Du "Einbetten" in html oder in python code? Wenn es für Dich kein großer Aufwand ist, poste doch bitte mal ein kleines Beispiel.
Danke.
Verfasst: Samstag 31. Januar 2009, 16:46
von lunar
Die so erzeugte HTML-Datei enthält doch nur den DIV-Block mit den Syntax-Highlighting, man muss die überflüssigen Elemente also nicht löschen. Folglich kann man diese Datei dann in die HTML-Ausgabe einbetten. Mit was man das tut, hängt davon ab, was man in welcher Umgebung tut. So kann man dafür SSI nutzen, oder sogar clientseitiges Javascript, dass die Codebeispiele dynamisch vom Server holt.
Wenn du das HTML natürlich alles selbst zusammenbaust, ist es tatsächlich egal.
Verfasst: Samstag 31. Januar 2009, 16:57
von Leonidas
Ich frage mich ja, warum man als Python-Programmierer nicht einfach die ``pygments``-API verwendet, statt ``pygmentize`` extern aufzurufen.
Verfasst: Samstag 31. Januar 2009, 17:04
von hendrikS
Ich bin mit den Webdingen noch nicht ganz so vertraut. Mein bisheriges Konzept sieht vor. Plain Html + Python für dynamische Inhalte. Wobei ich hier noch am Überlegen bin welche Tools für die danamischen Inhalte sinnvoll und notwendig sind. Im Moment ist noch alles auf die Tippeltappeltour generiert.
Verfasst: Freitag 13. Februar 2009, 20:49
von Y0Gi
Ich habe mir folgende Helper definiert, um Codestücke direkt oder aus Dateien als XHTML-Inhalt einzubinden:
Code: Alles auswählen
from pygments import highlight
from pygments.formatters import HtmlFormatter
from pygments.lexers import get_lexer_by_name, get_lexer_for_filename, \
TextLexer
def get_lexer(arg, is_filename=False):
if is_filename:
lookup = get_lexer_for_filename
else:
lookup = get_lexer_by_name
try:
return lookup(arg)
except ValueError:
return TextLexer()
def format_code_as_html(code, lexer):
"""Parse code with ``lexer``, format as HTML and return the output."""
return highlight(code, lexer, HtmlFormatter())
Viel Erfolg damit.