[bottle] pygments

Django, Flask, Bottle, WSGI, CGI…
Antworten
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hi Community,

ich möchte auf meiner Seite ein paar Code Snippets bereit stellen. Dabei bin ich mir nicht ganz sicher wie ich das ganze realisieren soll. Ich will möglichst alles ohne manuelles rumkopieren von Code ermöglichen. Am besten soll also alles dynamisch erzeugt werden.

Wie kann ich also von anderen Templates aus auf den Lexer bzw. auf den Formater von pygments zugreifen?

oder ist mein Denkansatz falsch?

Grüße,
anogayales
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Pygments importieren und verwenden wie hier gezeigt: http://pygments.org/docs/quickstart/
the more they change the more they stay the same
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Mir ist schon klar wie ich pygemnts in einem normalen Python programm benutzte, aber nicht wie ich es in Bottle benutzen soll.

Natürlich kann ich:

Code: Alles auswählen

%from pygments import highlight
%from pygments.lexers import PythonLexer
%from pygments.formatters import HtmlFormatter

%code = 'print "Hello World"'
%print highlight(code, PythonLexer(), HtmlFormatter())
einfach irgendwo reinsetzten. Ich such aber einen Ansatz der mir erlaubt, das ganze nur einmal importieren zu müssen. Ich möchte nicht in jedem Template das ganze ding importieren müssen.

Grüße,
anogayales
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wieso denn in einem Template? Schreib Dir doch eine Funktion, die einen String mit Quellcode umwandelt und übergebe dann das fertige HTML an das Template!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Der Quellcode steht ja im Template drinne. Wie kann das Template dann auf die Funktion zugreifen? Wie gesagt, mein Denkansatz ist falsch. Dennoch kann ich nicht sehen wie ich deine Methode realisieren soll.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

anogayales hat geschrieben:Der Quellcode steht ja im Template drinne.
Na dann erzeuge das Highlighting vorher manuell! :K
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Ja, das will ich ja gerade nicht.

Wie würde den dein Ansatz aussehen? Wo befindet sich bei dir der anzuzeigende Quellcode? Im Hauptprogramm, wo alles geroutet wird?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

anogayales hat geschrieben:Ja, das will ich ja gerade nicht.
Wieso? Augenscheinlich sind diese ja statisch; also bietet sich das Verfahren imho an
anogayales hat geschrieben:Wie würde den dein Ansatz aussehen? Wo befindet sich bei dir der anzuzeigende Quellcode? Im Hauptprogramm, wo alles geroutet wird?
Irgendwo eben. Im Dateisystem, in ner Datenbank, ...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Na dann, ich find es sehr aufwendig, dass ganze manuell machen zu müssen.
Vor allem wenn man viele unterschiedliche Code Snippets hat und diese sich auch oft ändern.

Naja, vielleicht hat jemand eine bessere Idee.
BlackJack

@anogayales: Wenn die sich oft ändern, warum stehen sie dann in den Templates? Templates sind doch in der Regel eher statisch und enthalten keinen Inhalt. Der wird dynamisch in die Templates eingefügt.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Ich bin gerade dabei eine Seite aufzusetzen, die einiges an Code zeigen will. Dabei ändert sich die Seite bei der Entwicklung oft. Nach dieser Phase wird wohl nicht mehr viel an den Snippets gemacht.
Ich will einfach nicht, dass ich alle 10 Minuten, dass Zeug manuell erstellen muss nur um einen "Eindruck" von meiner Seite zu bekommen. Mir mangelt es nicht an Vorstellungskraft, ich will eben nutzen was möglich ist.

Ich habe bereits verstanden wie ich externe Daten in Templates einschläusen kann. Wie soll ich das ganze - vorerst- dynamisch aufbauen? Muss ich für jeden Code Snippet eine variable deklarieren und die dann durchreichen?

Wie würdet ihr es machen? Ich steh - wie bereits öfters gesagt - auf dem Schlauch.

Grüße
anogayales
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

a) verwende eine Datenbank und speicher das Zeug da rein oder b) bastel dir eine Funktion, die du im Template aufrufst, die einen String mit dem Snippet beinhaltet und HTML erzeugt.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Ich sehe da einen fundamentalen Denkfehler: Templates sind nicht dazu da, Daten wie Artikel oder Code-Beispiele zu halten oder Parser zu bedienen. Sie dienen dazu, Daten in eine darstellbare Form zu bringen. Wenn Code-Beispiele oder ganze pygnemts setup Routinen in deinem Template stehen, läuft was falsch. Templates sollten so dumm wie möglich und so schlau wie nötig sein. Das gilt sowohl für Daten als auch für enthaltene Logik.

Ich würde dir empfehlen, dir mal Markdown oder reStructuredText anzusehen und deine Texte in diesem Format irgendwo zu speichern. Dann kannst du eine Route definieren, die abhängig von der URL eine bestimmte dieser Dateien nimmt, durch den markdown/rst Parser jagt, XHTML daraus macht und dieses XHTML Fragment an ein Template weiter reicht, das es in dein Seiten-Layout einfügt. Dann musst du dich auch nicht mehr mit HTML oder pygments rum schlagen, das machen diese Packete automatisch.

Später im laufenden betrieb würde ich dann einen Cache-Mechanismus einbauen, um die Dateien nicht jedes mal parsen zu müssen. Dazu speicherst du die fertigen XHTML Fragmente einfach irgendwo auf der Festplatte und kontrollierst nur noch, ob die quell-Datei nicht neuer ist als die cache-Datei. Um das ganze zu vereinfachen, kannst du dir dafür ne get_page(name) Funktion basteln. Die könntest du sogar von innerhalb der templates benutzen, wenn du sie vorher importierst oder an bottle.BaseTemplate.defaults dran hängst.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@anogayales: ein Ansatz mal als Pseudo-Code:

Code: Alles auswählen

code = holeMeinenSourceCode()
code_html = pygments.mach_mal_html(code)
return bottle.template('mein_template.tpl', html=code_html)
Das Template sieht dann minimal so aus:

Code: Alles auswählen

<p>Der Source-Code:</p>
{{!html}}
Ob man dann wirklich ein Template braucht oder nicht hängt davon ab, ob du noch zusätzliche Info reinpacken willst.

Ansonsten einfach nochmal in Ruhe drüber nachdenken und die Programmstruktur überdenken. Den Denkfehler hatte ich am Anfang (mit Bottle) auch, dass ich zu viel Funtkionalität ins Template packen wohl. Grundregel, wie Defnull ja auch sagt: Sobald die meinst, in deinem Template muss eine "import"-Anweisung stehen ist was falsch. :-)

Gruß, noisefloor

Gruß, noisefloor
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

noisefloor hat geschrieben:Den Denkfehler hatte ich am Anfang (mit Bottle) auch, dass ich zu viel Funtkionalität ins Template packen wohl. Grundregel, wie Defnull ja auch sagt: Sobald die meinst, in deinem Template muss eine "import"-Anweisung stehen ist was falsch. :-)
Zumindest solange man keine Markos hat, die man importieren will ;)
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

DasIch hat geschrieben:Zumindest solange man keine Markos hat, die man importieren will ;)
Selbst da würde ich bottle.BaseTemplate.defaults empfehlen (ein dict mit default-werten für alle templates). Das Feature ist noch nicht dokumentiert und ich habe meine Vermutung noch nicht validiert, aber ich denke mal das dict-Zugriffe signifikant schneller sind als import Anweisungen. Und bei templates ist Performance ziemlich wichtig.
Bottle: Micro Web Framework + Development Blog
Antworten