import re from lektor.pluginsystem import Plugin from markupsafe import escape _class_re = re.compile(r'\s+:([a-zA-Z0-9_-]+)') def split_classes(text): classes = [] def _handle_match(match): classes.append(match.group(1)) return '' text = _class_re.sub(_handle_match, text).replace('\\:', ':') return text, classes class MarkdownLinkClassesPlugin(Plugin): name = 'Markdown Link Classes' description = 'Adds the ability to add classes to links.' def on_markdown_config(self, config, **extra): class LinkClassesMixin(object): def link(renderer, link, title, text): text, classes = split_classes(text) if link.startswith('javascript:'): link = '' attr = ['href="%s"' % escape(link)] if title: attr.append('title="%s"' % escape(title)) if classes: attr.append('class="%s"' % ' '.join( escape(x) for x in classes)) return '%s' % (' '.join(attr), text) config.renderer_mixins.append(LinkClassesMixin)