Ich möchte bei PyLucid das Rendern der Seite ändern...
Dazu soll eine HTML-Seite zum Browser geschickt werden, dabei alle PyLucid-Tags abgefangen und mit leben gefüllt werden...
Ich dachte daran einen SGMLParser so zu konfigurieren, das alle Daten, bis auf die speziellen Tags (z.B. <lucidTag:main_menu/> oder <lucidFunction:RSS>URL</lucidFunction>) unverändert durchgereicht werden...
Stößt der Parser auf die lucid-Tags werden aktionen ausgeführt um die Tags mit Inhalten zu ersetzten...
Aber wie mache ich das am besten??? Muß ich alle Methoden wie handle_starttag(), handle_data() usw. selber Programmieren?
Eine andere Lösung wäre sowas wie Zeilenweise verarbeiten und mit RE die Tags rausfischen... So ähnlich funktioniert es z.Z. (Ganz ähnlich wie blackbird's parser: http://www.python-forum.de/viewtopic.php?p=18944#18944 )
Ich möchte allerdings gern einen Datenstrom erzeugen, statt die Seite komplett im Speicher zusammen zu bauen und dann erst zum Browser zu schicken...
SGMLParser zum rausfischen von Tags...
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hm... Hab mir da gerade was mit re gebastelt:
Was haltet ihr davon???
EDIT: Ach mist, es klappt zwar ganz prima bei einfachen Tags wie <lucidTag:main_menu/> aber leider nicht direkt bei Tags mit Informationen, wie <lucidFunction:RSS>URL</lucidFunction>, denn die URL will ich ja haben...
Code: Alles auswählen
import sys, cgi, re
class parser:
def feed( self, content ):
for matchobj in re.finditer( "(.*?)(<.*?>)(.*?)(?us)", content ):
sys.stdout.write( matchobj.group(1) )
tag = matchobj.group(2)
if tag.startswith( "<lucid" ):
self.handle_tag( tag )
else:
sys.stdout.write( tag )
sys.stdout.write( matchobj.group(3) )
def handle_tag( self, tag ):
# Hier wird was passieren... ;)
sys.stdout.write( "*%s*" % tag )
EDIT: Ach mist, es klappt zwar ganz prima bei einfachen Tags wie <lucidTag:main_menu/> aber leider nicht direkt bei Tags mit Informationen, wie <lucidFunction:RSS>URL</lucidFunction>, denn die URL will ich ja haben...
Hallo jens,
ich hatte vor einiger Zeit mal was ähnliches gebastelt (PHP).
Dabei hab ich einfach die die XML Namensräume ausgenutzt.
(<lucidFunction:RSS>URL</lucidFunction:RSS>) ich kenn mich nicht so aus mit XML und Python würde dir aber dazu raten mit SAX zu arbeiten.
Hab mich grad an was erinnert:
http://aspn.activestate.com/ASPN/Cookbo ... ipe/149284
Vieleicht ist das ein Ideenanstoß
MfG
Andreas
ich hatte vor einiger Zeit mal was ähnliches gebastelt (PHP).
Dabei hab ich einfach die die XML Namensräume ausgenutzt.
(<lucidFunction:RSS>URL</lucidFunction:RSS>) ich kenn mich nicht so aus mit XML und Python würde dir aber dazu raten mit SAX zu arbeiten.
Hab mich grad an was erinnert:
http://aspn.activestate.com/ASPN/Cookbo ... ipe/149284
Vieleicht ist das ein Ideenanstoß
MfG
Andreas
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Naja, die Tags jetzt noch ändern wollte ich eigentlich nicht, da es schon einige Seiten gibt in denen die geändert werden müßten Nagut, könnte man mittels suchen-ersetzten auch automatisch erledigen lassen...XT@ngel hat geschrieben:Dabei hab ich einfach die die XML Namensräume ausgenutzt. (<lucidFunction:RSS>URL</lucidFunction:RSS>) ich kenn mich nicht so aus mit XML und Python würde dir aber dazu raten mit SAX zu arbeiten.
Mit ist aber eingefallen, das es garnicht wirklich möglich ist, alles in einem Stream zu erledigen...
Erstens hat man bei CGI eh nicht's davon, weil der Server anscheinend erst die Daten zum Browser schickt wenn alles erledigt ist
Zweitens hab ich z.B. den Tag <lucidTag:page_msg/> der wird von Nachrichten aus dem PyLucid-System ersetzt. Nur die Nachrichten können auch fast am Ende der Abarbeitung erst entstehen...
Weiß jemand wie es andere Systeme erledigen???
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
OK, ich hab mir jetzt folgendes gebastelt:
Schön ist allerdings die ausnahme Behandlung nicht...
Code: Alles auswählen
import sys, cgi, re
class parser:
def feed( self, content ):
content = re.sub( "<lucidTag:(.*?)/?>", self.handle_tag, content )
content = re.sub( "<lucidFunction:(.*?)>(.*?)</lucidFunction>", self.handle_function, content )
print content
def handle_tag( self, matchobj ):
tag = matchobj.group(1)
if tag == "page_msg": # Außnahme, soll noch nicht ersetzt werden.
return matchobj.group(0)
return "*%s*" % tag
def handle_function( self, matchobj ):
function_name = matchobj.group(1)
function_info = matchobj.group(2)
return "++%s,%s++" % (function_name, function_info)