123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- """
- Supported inline BBCodes: b, u, i
- """
- import re
- from markdown.inlinepatterns import (
- ImagePattern, LinkPattern, SimpleTagPattern, dequote, handleAttributes, util)
- class SimpleBBCodePattern(SimpleTagPattern):
- """
- Case insensitive simple BBCode
- """
- def __init__(self, bbcode, tag=None):
- self.pattern = r'(\[%s\](.*?)\[/%s\])' % (bbcode, bbcode)
- self.compiled_re = re.compile(
- "^(.*?)%s(.*?)$" % self.pattern, re.DOTALL | re.UNICODE | re.IGNORECASE
- )
- # Api for Markdown to pass safe_mode into instance
- self.safe_mode = False
- # Store tag
- self.tag = tag or bbcode.lower()
- bold = SimpleBBCodePattern('b')
- italics = SimpleBBCodePattern('i')
- underline = SimpleBBCodePattern('u')
- class BBcodePattern(object):
- def __init__(self, pattern, markdown_instance=None):
- self.pattern = pattern
- self.compiled_re = re.compile(
- "^(.*?)%s(.*)$" % pattern, re.DOTALL | re.UNICODE | re.IGNORECASE
- )
- self.safe_mode = False
- if markdown_instance:
- self.markdown = markdown_instance
- class BBCodeImagePattern(BBcodePattern, ImagePattern):
- def handleMatch(self, m):
- el = util.etree.Element("img")
- src_parts = m.group(2).split()
- if src_parts:
- src = src_parts[0]
- if src[0] == "<" and src[-1] == ">":
- src = src[1:-1]
- el.set('src', self.sanitize_url(self.unescape(src)))
- else:
- el.set('src', "")
- if len(src_parts) > 1:
- el.set('title', dequote(self.unescape(" ".join(src_parts[1:]))))
- if self.markdown.enable_attributes:
- truealt = handleAttributes(m.group(2), el)
- else:
- truealt = m.group(2)
- el.set('alt', self.unescape(truealt))
- return el
- IMAGE_PATTERN = r'\[img\](.*?)\[/img\]'
- def image(md):
- return BBCodeImagePattern(IMAGE_PATTERN, md)
- class BBCodeUrlPattern(BBcodePattern, LinkPattern):
- def handleMatch(self, m):
- el = util.etree.Element("a")
- if m.group(8):
- el.text = m.group(8).strip()
- href = m.group(5)
- else:
- el.text = m.group(3)
- href = m.group(3)
- if href:
- if href[0] == "<":
- href = href[1:-1]
- el.set("href", self.sanitize_url(self.unescape(href.strip())))
- else:
- el.set("href", "")
- return el
- URL_PATTERN = r'((\[url=("?)(.*?)("?)\])|(\[url\]))(.*?)\[/url\]'
- def url(md):
- return BBCodeUrlPattern(URL_PATTERN, md)
|