from django.template import Library from django.conf import settings from archweb_dev.lib import markdown import re register = Library() class WikiProcessor: def run(self, lines): in_table = False for i in range(len(lines)): # Linebreaks lines[i] = re.sub("%%", "
", lines[i]) # Internal Links lines[i] = re.sub("\(\(([A-z0-9 :/-]+)\)\)", "\\1", lines[i]) # Small Text lines[i] = re.sub("----([^----]+)----", "\\1", lines[i]) lines[i] = re.sub("--([^--]+)--", "\\1", lines[i]) # TT text lines[i] = re.sub("\{\{([^}\}]+)\}\}", "\\1", lines[i]) # Tables m = re.match("(\|\|)", lines[i]) if m: count = len(re.findall("(\|\|+)", lines[i])) first = True m2 = re.search("(\|\|+)", lines[i]) while m2 and count: count -= 1 colspan = len(m2.group(1)) / 2 if first: repl = "" % (colspan) first = False elif count == 0: repl = "" else: repl = "" % (colspan) lines[i] = re.sub("(\|\|+)", repl, lines[i], 1) # find the next chunk m2 = re.search("(\|\|+)", lines[i]) lines[i] = "" + lines[i] + "" if not in_table: lines[i] = "" + lines[i] in_table = True elif in_table: lines[i] = "
" + lines[i] in_table = False # close leftover table, if open if in_table: lines[len(lines)] = lines[len(lines)] + "" return lines @register.filter def wikify(value): md = markdown.Markdown(value) md.preprocessors.insert(0, WikiProcessor()) html = md.toString() return html