BBcode to Creole Converter

Django, Flask, Bottle, WSGI, CGI…
Antworten
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Gibt es einen Converter von BBcode nach Creole Syntax? Idealerweise in Python ;) Tante Google hat mir noch nichts verraten
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
lunar

@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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Habe ich eben schnell nach http://de.wikipedia.org/wiki/BBCode zusammengehackt:

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
Stefan
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Das ist keine gute Idee. Solche einfachen Konverter produzieren kaputtes HTML, wenn die Tags falsch geschachtelt sind. Aus

Code: Alles auswählen

[b][i]Hallo[/b][/i]
wird dann

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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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:

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)
oder auch etwas kürzer

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", "[")
Das [ python ] Tag scheint eh automatisch ersetzt zu werden und ist damit entbehrlich.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

sma hat geschrieben:2. Garbage in -> Garbage out: Wer falschen BBCode einfüttert, erhält falsches HTML. Der Browser wird's schon richten.
Bei Foren kommt of falscher BBCode an. Browser freut sich… besser man fängt das schon beim parsen ab.
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.
Nein, aber

Code: Alles auswählen

[code=foo][b]foo[/b]
[/code]
wird zu

Code: Alles auswählen

<pre class='foo'><b>foo</b></pre>
4. ">" habe ich nicht vergessen, das Zeichen muss nicht ersetzt werden.
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.
Antworten