inline.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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(6):
  58. el.text = m.group(8)
  59. href = m.group(5)
  60. else:
  61. el.text = m.group(8).strip()
  62. href = m.group(8)
  63. if href:
  64. el.set("href", self.sanitize_url(self.unescape(href.strip())))
  65. else:
  66. el.set("href", "")
  67. return el
  68. URL_PATTERN = r'((\[url=("?)(.*?)("?)\])|(\[url\]))(.*?)\[/url\]'
  69. def url(md):
  70. return BBCodeUrlPattern(URL_PATTERN, md)