Syntaxhighlighting in Django mit Pygments

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

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
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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

Und wozu genau benötigt man bei dem gezeigten Beispiel jetzt den zweiten Schritt?
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

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
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

@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?
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?
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

@ 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.
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()".
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

@ 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.
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich frage mich ja, warum man als Python-Programmierer nicht einfach die ``pygments``-API verwendet, statt ``pygmentize`` extern aufzurufen.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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