Seite 1 von 1

BBcode to Creole Converter

Verfasst: Freitag 31. Dezember 2010, 12:31
von burli
Gibt es einen Converter von BBcode nach Creole Syntax? Idealerweise in Python ;) Tante Google hat mir noch nichts verraten

Re: BBcode to Creole Converter

Verfasst: Freitag 31. Dezember 2010, 14:03
von 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.

Re: BBcode to Creole Converter

Verfasst: Freitag 31. Dezember 2010, 15:36
von sma
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

Re: BBcode to Creole Converter

Verfasst: Samstag 1. Januar 2011, 16:54
von Darii
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.

Re: BBcode to Creole Converter

Verfasst: Samstag 1. Januar 2011, 17:30
von sma
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.

Re: BBcode to Creole Converter

Verfasst: Samstag 1. Januar 2011, 17:55
von Darii
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.