Ich habe folgendes Modul geschrieben:
Code: Alles auswählen
# -*- coding: utf-8 -*-
import re
from random import random
from md5 import md5
from time import time
class parser:
def __init__(self, text):
self.text = text
self.table = {}
def parse(self):
self.extract()
self.textformat()
self.assamble()
def extract(self):
areas = [
("\[code\]", "\[/code\]", self.do_code)
]
for area in areas:
token_id = self.__create_token_id()
try:
regex = re.compile(area[0]+"(.*?)"+area[1], re.I | re.S | re.M)
result = regex.search(self.text)
self.table[token_id] = (area[2], result.group(1))
self.text = self.text.replace(result.group(0), token_id, 1)
except:
pass
def textformat(self):
text = self.text
rules = [
("\[b\](.*?)\[/b\]", self.do_bold),
("\[i\](.*?)\[/i\]", self.do_italic),
("\[u\](.*?)\[/u\]", self.do_underline)
]
for rule in rules:
regex = re.compile(rule[0], re.I | re.S | re.M)
text = rule[1](regex, text)
self.text = text.replace("\n", "<br />\n")
def assamble(self):
text = self.text
for token in self.table:
handler = self.table[token][0]
content = self.table[token][1]
block = handler(content)
text = text.replace(token, block)
self.text = text
def __create_token_id(self):
while True:
token = "~~"+md5(str(time() + random())).hexdigest()+"~~"
if not self.table.has_key(token):
return token
def do_bold(self, regex, text):
return regex.sub(r"<strong>\1</strong>", text)
def do_italic(self, regex, text):
return regex.sub(r"<em>\1</em>", text)
def do_underline(self, regex, text):
return regex.sub(r"<u>\1</u>", text)
def do_code(self, content):
rules = {
"\n ":"\n ",
" ": " ",
"\t": " "
}
for rule in rules:
content = content.replace(rule, rules[rule])
result = "<div class=\"code\">"+content+"</div>"
return result
Aber alles zwischen diesen beiden Tags soll zuerst durch eine Funktion laufen.
Nur. Wie kann ich das machen?
Meine Idee war in etwa so:
Code: Alles auswählen
def do_link(self, regex, text):
caption = regex.group(1)
return regex.sub(r"<u>"+caption+"</u>", text)
Genauergesagt will ich sowas wie PHPs preg_replace_callback