word_re = re.compile(r"^\b((([A-Z][a-z0-9]+){2,}/)*([A-Z][a-z0-9]+){2,})\b$")
# FIXME: we accept stuff like foo/../bar and we shouldn't
file_re = re.compile(r"^\b([A-Za-z0-9_\-][A-Za-z0-9_\.\-/]*)\b$")
-img_re = re.compile(r"^.*\.(png|gif|jpg|jpeg|bmp|ico)$", re.IGNORECASE)
+img_re = re.compile(r"^.*\.(png|gif|jpg|jpeg|bmp|ico|ogm|ogg|mkv|mpg|mpeg|mp4|avi|asf|flv|wmv|qt)$", re.IGNORECASE)
video_re = re.compile(r"^.*\.(ogm|ogg|mkv|mpg|mpeg|mp4|avi|asf|flv|wmv|qt)$", re.IGNORECASE)
url_re = re.compile(r"^[a-z]{3,8}://[^\s'\"]+\S$")
link_re = re.compile("(?:\[\[|{{)([^\s\|]+)(?:\s*\|\s*([^\]]+)|)(?:\]\]|}})")
def emit_header(mime_type="text/html"):
print "Content-type: " + mime_type + "; charset=utf-8\n"
+def sendfile(dest_file, src_file):
+ """Efficiently copy file data between file descriptors"""
+ while 1:
+ data = src_file.read(65536)
+ if not data: break
+ dest_file.write(data)
+
def send_guru(msg_text, msg_type):
if not msg_text: return
print '<pre id="guru" onclick="this.style.display = \'none\'" class="' + msg_type + '">'
if msg_type == 'error':
print '\n Guru Meditation #DEADBEEF.ABADC0DE'
print '</pre>'
- # FIXME: This little JS snippet is harder to pass than ACID 3.0
- print """
- <script language="JavaScript" type="text/javascript">
- var guru = document.getElementById('guru');
- // Firefox 2.0 doesn't take border-color, but returns border-top-color fine
- var color = document.defaultView.getComputedStyle(guru,null).getPropertyValue('border-top-color');
-
- function guruOn() {
- guru.style.setProperty('border-color', color, '');
- setTimeout('guruOff()', 1000);
- }
- function guruOff() {
- guru.style.setProperty('border-color', '#000000', '');
- setTimeout('guruOn()', 1000);
- }
- // Safari 2.0 returns this rgba crap
- // Konqueror 3.5.6 doesn't seem to support computed properties
- if (color && color != 'rgba(0, 0, 0, 0)') {
- //window.alert("enabled! color='" + color + "'");
- guruOn();
- }
- </script>"""
+ try:
+ sendfile(sys.stdout, open('gurumeditation.js', 'rb'))
+ except IOError, err:
+ pass
def send_title(name, text="Limbo", msg_text=None, msg_type='error', writable=False):
global title_done
def link_tag(params, text=None, link_class=None, privileged=False):
if text is None:
text = params # default
+ elif img_re.match(text):
+ text = '<img border="0" src="' + text + '" />'
if not link_class:
if is_external_url(params):
def _rule_repl(self, word):
return self._undent() + '\n<hr size="%d" noshade="noshade" />\n' % (len(word) - 2)
- def _word_repl(self, word):
- return link_tag(word)
-
- def _img_repl(self, word):
- pathname = relative_url(word)
- return '<a href="%s"><img border="0" src="%s" /></a>' % (pathname, pathname)
-
- def _url_repl(self, word):
- if img_re.match(word):
- return '<a href="%s"><img border="0" src="%s" /></a>' % (word, word)
- else:
- return '<a href="%s" rel="nofollow" class="external">%s</a>' % (word, word)
-
def _macro_repl(self, word):
m = re.compile("\<\<([^\s\|\>]+)(?:\s*\|\s*([^\>]+)|)\>\>").match(word)
name = m.group(1)
def _hurl_repl(self, word):
m = link_re.match(word)
- name = m.group(1)
- descr = m.group(2)
- if descr is None:
- descr = name
- elif img_re.match(m.group(2)):
- descr = '<img border="0" src="' + descr + '" />'
+ return link_tag(m.group(1), m.group(2))
- return link_tag(name, descr)
+ def _url_repl(self, word):
+ return link_tag(word)
+
+ def _word_repl(self, word):
+ return link_tag(word)
def _inl_repl(self, word):
m = link_re.match(word)
else:
return '<a href="%s"><img border="0" src="%s" /></a>' % (name, name)
+ def _img_repl(self, word):
+ return self._inl_repl('{{' + word + '}}')
+
def _email_repl(self, word):
return '<a href="mailto:%s">%s</a>' % (word, word)
def print_html(self):
print '<div class="wiki"><p>'
- # For each line, we scan through looking for magic
- # strings, outputting verbatim any intervening text
- # TODO: highlight search words (look at referrer)
- scan_re = re.compile(
- r"(?:"
- # Formatting
- + r"(?P<b>\*\*|'''|//|''|##|``|__|\^\^|,,)"
- + r"|(?P<tit>\={2,6})"
- + r"|(?P<br>\\\\)"
- + r"|(?P<rule>^-{3,})"
- + r"|(?P<hi>\b(FIXME|TODO|DONE)\b)"
+ scan_re = re.compile(r"""(?:
+ # Styles and formatting
+ (?P<b> \*\*|'''|//|''|\#\#|``|__|\^\^|,,)
+ | (?P<tit> \={2,6})
+ | (?P<br> \\\\)
+ | (?P<rule> ^-{3,})
+ | (?P<hi> \b(FIXME|TODO|DONE)\b)
# Links
- + r"|(?P<macro>\<\<([^\s\|\>]+)(?:\s*\|\s*([^\>]+)|)\>\>)"
- + r"|(?P<hurl>\[\[([^\s\|]+)(?:\s*\|\s*([^\]]+)|)\]\])"
+ | (?P<macro> \<\<([^\s\|\>]+)(?:\s*\|\s*([^\>]+)|)\>\>)
+ | (?P<hurl> \[\[([^\s\|]+)(?:\s*\|\s*([^\]]+)|)\]\])
# Inline HTML
- + r"|(?P<html><(/|)(br|hr|div|span|form|iframe|input|textarea|a|img|h[1-5])[^>]*>)"
- + r"|(?P<ent>[<>&])"
+ | (?P<html> <(/|)(br|hr|div|span|form|iframe|input|textarea|a|img|h[1-5])[^>]*>)
+ | (?P<ent> [<>&])
# Auto links (LEGACY)
- + r"|(?P<img>\b[a-zA-Z0-9_/-]+\.(png|gif|jpg|jpeg|bmp|ico))"
- + r"|(?P<word>\b(?:[A-Z][a-z]+){2,}\b)"
- + r"|(?P<url>(http|https|ftp|mailto)\:[^\s'\"]+\S)"
- + r"|(?P<email>[-\w._+]+\@[\w.-]+)"
+ | (?P<img> \b[a-zA-Z0-9_/-]+\.(png|gif|jpg|jpeg|bmp|ico|ogm|ogg|mkv|mpg|mpeg|mp4|avi|asf|flv|wmv|qt))
+ | (?P<word> \b(?:[A-Z][a-z]+){2,}\b)
+ | (?P<url> (http|https|ftp|mailto)\:[^\s'\"]+\S)
+ | (?P<email> [-\w._+]+\@[\w.-]+)
# Lists, divs, spans
- + r"|(?P<li>^\s+[\*#] +)"
- + r"|(?P<pre>\{\{\{|\s*\}\}\})"
- + r"|(?P<inl>\{\{([^\s\|]+)(?:\s*\|\s*([^\]]+)|)\}\})"
+ | (?P<li> ^\s+[\*\#]\s+)
+ | (?P<pre> \{\{\{|\s*\}\}\})
+ | (?P<inl> \{\{([^\s\|]+)(?:\s*\|\s*([^\]]+)|)\}\})
# Tables
- + r"|(?P<tr>^\s*\|\|(=|)\s*)"
- + r"|(?P<tre>\s*\|\|(=|)\s*$)"
- + r"|(?P<td>\s*\|\|(=|)\s*)"
- + r")")
- pre_re = re.compile(
- r"(?:"
- + r"(?P<pre>\s*\}\}\})"
- + r"|(?P<ent>[<>&])"
- + r")")
+ | (?P<tr> ^\s*\|\|(=|)\s*)
+ | (?P<tre> \s*\|\|(=|)\s*$)
+ | (?P<td> \s*\|\|(=|)\s*)
+
+ # TODO: highlight search words (look at referrer)
+ )""", re.VERBOSE)
+ pre_re = re.compile("""(?:
+ (?P<pre>\s*\}\}\})
+ | (?P<ent>[<>&])"
+ )""", re.VERBOSE)
blank_re = re.compile(r"^\s*$")
indent_re = re.compile(r"^\s*")
tr_re = re.compile(r"^\s*\|\|")
eol_re = re.compile(r"\r?\n")
+
+ # For each line, we scan through looking for magic strings, outputting verbatim any intervening text
for self.line in eol_re.split(self.raw.expandtabs()):
# Skip pragmas
if self.in_header: