inline.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. """
  2. Supported inline BBCodes: b, u, i
  3. """
  4. import re
  5. from markdown.inlinepatterns import IMAGE_LINK_RE, ImagePattern, SimpleTagPattern, util
  6. class SimpleBBCodePattern(SimpleTagPattern):
  7. """
  8. Case insensitive simple BBCode
  9. """
  10. def __init__(self, bbcode, tag=None):
  11. self.pattern = r'(\[%s\](.*?)\[/%s\])' % (bbcode, bbcode)
  12. self.compiled_re = re.compile(
  13. "^(.*?)%s(.*?)$" % self.pattern, re.DOTALL | re.UNICODE | re.IGNORECASE
  14. )
  15. # Api for Markdown to pass safe_mode into instance
  16. self.safe_mode = False
  17. # Store tag
  18. self.tag = tag or bbcode.lower()
  19. bold = SimpleBBCodePattern('b')
  20. italics = SimpleBBCodePattern('i')
  21. underline = SimpleBBCodePattern('u')
  22. class BBcodePattern(object):
  23. def __init__(self, pattern, markdown_instance=None):
  24. self.pattern = pattern
  25. self.compiled_re = re.compile(
  26. "^(.*?)%s(.*)$" % pattern, re.DOTALL | re.UNICODE | re.IGNORECASE)
  27. self.safe_mode = False
  28. if markdown_instance:
  29. self.markdown = markdown_instance
  30. class BBCodeImagePattern(BBcodePattern, ImagePattern):
  31. def handleMatch(self, m):
  32. el = util.etree.Element("img")
  33. src_parts = m.group(2).split()
  34. if src_parts:
  35. src = src_parts[0]
  36. if src[0] == "<" and src[-1] == ">":
  37. src = src[1:-1]
  38. el.set('src', self.sanitize_url(self.unescape(src)))
  39. else:
  40. el.set('src', "")
  41. if len(src_parts) > 1:
  42. el.set('title', dequote(self.unescape(" ".join(src_parts[1:]))))
  43. if self.markdown.enable_attributes:
  44. truealt = handleAttributes(m.group(2), el)
  45. else:
  46. truealt = m.group(2)
  47. el.set('alt', self.unescape(truealt))
  48. return el
  49. IMAGE_PATTERN = r'\[img\](.*?)\[/img\]'
  50. def image(md):
  51. return BBCodeImagePattern(IMAGE_PATTERN, md)
  52. # todo: URL
  53. # note: can't just replace url's bbcode with md cos:
  54. # [url=http://onet.pl][1][/url] => [[1]](http://onet.pl)