inline.py 2.6 KB

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