
BBcode to Creole Converter
@burli: Ich wüsste nichts, doch es gibt im Cheeseshop bestimmte Module sowohl für BBCode als auch für Creole, und insbesondere BBCode ist nun nicht so komplex, als dass man die Konvertierung nicht selbst schreiben könnte.
Habe ich eben schnell nach http://de.wikipedia.org/wiki/BBCode zusammengehackt:
Stefan
Code: Alles auswählen
def bbcode_to_html(s):
s = s.replace('&', '&').replace('<', '<')
# format bold, italic, underline
s = re.sub(r"(?is)\[b\](.*?)\[/b\]", r"<b>\1</b>", s)
s = re.sub(r"(?is)\[i\](.*?)\[/i\]", r"<i>\1</i>", s)
s = re.sub(r"(?is)\[u\](.*?)\[/u\]", r"<u>\1</u>", s)
# ignore center, font, color and size
s = re.sub(r"(?is)\[center\](.*?)\[/center\]", r"\1", s)
s = re.sub(r"(?is)\[font[^\]]*\](.*?)\[/font\]", r"\1", s)
s = re.sub(r"(?is)\[color[^\]]*\](.*?)\[/color\]", r"\1", s)
s = re.sub(r"(?is)\[size[^\]]*\](.*?)\[/size\]", r"\1", s)
# lists
s = re.sub(r"(?is)\[list[^\]]*\](.*?)\[/list\]",
lambda m:"<ul>%s</ul>" % re.sub(r"\[\*\]", r"<li>", m.group(1)), s)
# urls
s = re.sub(r"(?is)\[url\](.*?)\[/url\]", r"<a href='\1'>\1</a>", s)
s = re.sub(r"(?is)\[url\s*=\s*([^\]]*)\](.*?)\[/url\]", r"<a href='\1'>\2</a>", s)
# images
s = re.sub(r"(?is)\[img\](.*?)\[/img\]", r"<img src='\1'>", s)
# code and python
s = re.sub(r"(?is)\[code\s*=\s*([^\]]*)\](.*?)\[/code\]", r"<pre class='\1'>\2</pre>", s)
s = re.sub(r"(?is)\[python\](.*?)\[/python\]", r"<pre class='python'>\1</pre>", s)
return s
Das ist keine gute Idee. Solche einfachen Konverter produzieren kaputtes HTML, wenn die Tags falsch geschachtelt sind. Aus
wird dann
.
Und der Code-Block wie in diesem Beitrag verwendet, wäre so auch nicht möglich. Außerdem hast du „>“ vergessen.
Code: Alles auswählen
[b][i]Hallo[/b][/i]
Code: Alles auswählen
<b><i>Hallo</b></i>
Und der Code-Block wie in diesem Beitrag verwendet, wäre so auch nicht möglich. Außerdem hast du „>“ vergessen.
1. Es war es schneller Hack.
2. Garbage in -> Garbage out: Wer falschen BBCode einfüttert, erhält falsches HTML. Der Browser wird's schon richten.
3. Meinen Beitrag kann ich problemlos in meine Funktion einfüttern und der Code-Block wird zu <pre class='python'>...</pre> und die -Tags werden nicht ersetzt, weil sie ja alle noch ein \ enthalten, falls das die Befürchtung war.
4. ">" habe ich nicht vergessen, das Zeichen muss nicht ersetzt werden.
Was meine Funktion nicht kann, ist Absätze finden.
Stefan
PS: Wenn Innerhalb von [ code ] nix ersetzt werden soll:
oder auch etwas kürzer
Das [ python ] Tag scheint eh automatisch ersetzt zu werden und ist damit entbehrlich.
2. Garbage in -> Garbage out: Wer falschen BBCode einfüttert, erhält falsches HTML. Der Browser wird's schon richten.
3. Meinen Beitrag kann ich problemlos in meine Funktion einfüttern und der Code-Block wird zu <pre class='python'>...</pre> und die -Tags werden nicht ersetzt, weil sie ja alle noch ein \ enthalten, falls das die Befürchtung war.
4. ">" habe ich nicht vergessen, das Zeichen muss nicht ersetzt werden.
Was meine Funktion nicht kann, ist Absätze finden.
Stefan
PS: Wenn Innerhalb von [ code ] nix ersetzt werden soll:
Code: Alles auswählen
...
# code
t = []
def extract_code(m):
t.append(m.group(2))
return '<pre class="%s">%s</pre>' % (m.group(1), len(t))
s = re.sub(r"(?is)\[code\s*=\s*([^\]]*)\](.*?)\[/code\]", extract_code, s)
...
return re.sub(r">(\d+)</pre>", lambda m:">%s</pre>" % t[int(m.group(1)) - 1], s)
Code: Alles auswählen
...
# code
s = re.sub(r"(?is)\[code\s*=\s*([^\]]*)\](.*?)\[/code\]",
lambda m:"<pre class='%s'>%s</pre>" % (m.group(1), m.group(2).replace("[", "\1")), s)
...
return s.replace("\1", "[")
Bei Foren kommt of falscher BBCode an. Browser freut sich… besser man fängt das schon beim parsen ab.sma hat geschrieben:2. Garbage in -> Garbage out: Wer falschen BBCode einfüttert, erhält falsches HTML. Der Browser wird's schon richten.
Nein, aber3. Meinen Beitrag kann ich problemlos in meine Funktion einfüttern und der Code-Block wird zu <pre class='python'>...</pre> und die -Tags werden nicht ersetzt, weil sie ja alle noch ein \ enthalten, falls das die Befürchtung war.
Code: Alles auswählen
[code=foo][b]foo[/b]
wird zu
Code: Alles auswählen
<pre class='foo'><b>foo</b></pre>
Muss nicht, aber sollte. Gibt keinen Grund deswegen seltsames Browserverhalten in Kauf zu nehmen. Du musst auch nicht & immer ersetzten, macht es aber trotzdem einfacher.4. ">" habe ich nicht vergessen, das Zeichen muss nicht ersetzt werden.