\d+))', re.I)
bug_fmt = r'\g'
cve_re = re.compile(r'\bC(VE|AN)-(19|20|21)\d\d-\d{4,7}\b')
cve_fmt = r'\g<0>'
# regxlib.com
email_re = re.compile(r'([a-zA-Z0-9_\+\-\.]+)@(([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)')
email_fmt = r'\g<0>'
url_re = re.compile(r'(ht|f)tps?\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&;%\$#\=~])*')
def convert_to_html(self, title, text):
self.set_title(title)
return self._render(text)
def _html_encode(self, text):
return text.replace('&', '&').replace('<', '<').replace('>', '>')
def _render_text(self, htmltext, text):
text = self._html_encode(text);
text = self.lp_bug_stanza_re.sub(lambda m: self.lp_bug_re.sub(self.lp_bug_fmt, m.group(0)), text)
text = self.bug_stanza_re.sub(lambda m: self.bug_re.sub(self.bug_fmt, m.group(0)), text)
text = self.cve_re.sub(self.cve_fmt, text)
text = self.email_re.sub(self.email_fmt, text)
htmltext.write(text)
def _render_line(self, htmltext, line):
prevpos = 0
for match in self.url_re.finditer(line):
self._render_text(htmltext, line[prevpos:match.start()]);
prevpos = match.end()
url = match.group();
if url[-1] in ('.', ',', ';', '?', '\''):
url = url[:-1]
prevpos -= 1
htmltext.write('%s' % (url, self._html_encode(url)))
self._render_text(htmltext, line[prevpos:]);
def _render(self, text):
htmltext = io.StringIO()
htmltext.write('''
''')
htmltext.write(self.title)
htmltext.write('''
''')
for line in text.split('\n'):
self._render_line(htmltext, line)
htmltext.write('\n')
htmltext.write('')
return htmltext.getvalue()
class browser_frd(html, runcommand_drop_privs, ttyconfirm, fancyprogress, frontend):
def __init__(self, *args):
super().__init__(*args)
self.command = shlex.split(self.config.get('browser', 'sensible-browser'))
self.suffix = '.html'
self.enc = ALChacks.utf8_encoding()
def needs_tty_stdin(self):
return True
class xterm_browser_frd(xterm, browser_frd):
pass