inline.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. """
  2. Supported inline BBCodes: b, u, i
  3. """
  4. import re
  5. from markdown.inlinepatterns import (
  6. ImagePattern, LinkPattern, SimpleTagPattern, dequote, handleAttributes, util)
  7. class SimpleBBCodePattern(SimpleTagPattern):
  8. """
  9. Case insensitive simple BBCode
  10. """
  11. def __init__(self, bbcode, tag=None):
  12. self.pattern = r'(\[%s\](.*?)\[/%s\])' % (bbcode, bbcode)
  13. self.compiled_re = re.compile(
  14. "^(.*?)%s(.*?)$" % self.pattern, re.DOTALL | re.UNICODE | re.IGNORECASE
  15. )
  16. # Api for Markdown to pass safe_mode into instance
  17. self.safe_mode = False
  18. # Store tag
  19. self.tag = tag or bbcode.lower()
  20. bold = SimpleBBCodePattern('b')
  21. italics = SimpleBBCodePattern('i')
  22. underline = SimpleBBCodePattern('u')
  23. class BBcodePattern(object):
  24. def __init__(self, pattern, markdown_instance=None):
  25. self.pattern = pattern
  26. self.compiled_re = re.compile(
  27. "^(.*?)%s(.*)$" % pattern, re.DOTALL | re.UNICODE | re.IGNORECASE
  28. )
  29. self.safe_mode = False
  30. if markdown_instance:
  31. self.markdown = markdown_instance
  32. class BBCodeImagePattern(BBcodePattern, ImagePattern):
  33. def handleMatch(self, m):
  34. el = util.etree.Element("img")
  35. src_parts = m.group(2).split()
  36. if src_parts:
  37. src = src_parts[0]
  38. if src[0] == "<" and src[-1] == ">":
  39. src = src[1:-1]
  40. el.set('src', self.sanitize_url(self.unescape(src)))
  41. else:
  42. el.set('src', "")
  43. if len(src_parts) > 1:
  44. el.set('title', dequote(self.unescape(" ".join(src_parts[1:]))))
  45. if self.markdown.enable_attributes:
  46. truealt = handleAttributes(m.group(2), el)
  47. else:
  48. truealt = m.group(2)
  49. el.set('alt', self.unescape(truealt))
  50. return el
  51. IMAGE_PATTERN = r'\[img\](.*?)\[/img\]'
  52. def image(md):
  53. return BBCodeImagePattern(IMAGE_PATTERN, md)
  54. class BBCodeUrlPattern(BBcodePattern, LinkPattern):
  55. def handleMatch(self, m):
  56. el = util.etree.Element("a")
  57. if m.group(8):
  58. el.text = m.group(8).strip()
  59. href = m.group(5)
  60. else:
  61. el.text = m.group(3)
  62. href = m.group(3)
  63. if href:
  64. if href[0] == "<":
  65. href = href[1:-1]
  66. el.set("href", self.sanitize_url(self.unescape(href.strip())))
  67. else:
  68. el.set("href", "")
  69. return el
  70. URL_PATTERN = r'((\[url=("?)(.*?)("?)\])|(\[url\]))(.*?)\[/url\]'
  71. def url(md):
  72. return BBCodeUrlPattern(URL_PATTERN, md)