markdown.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. from . import tool
  2. import datetime
  3. import html
  4. import re
  5. class head_render:
  6. def __init__(self):
  7. self.head_level = [0, 0, 0, 0, 0, 0]
  8. self.toc_data = '' + \
  9. '<div id="toc">' + \
  10. '<span id="toc_title">TOC</span>' + \
  11. '<br>' + \
  12. '<br>' + \
  13. ''
  14. self.toc_num = 0
  15. def __call__(self, match):
  16. head_len_num = len(match[1])
  17. head_len = str(head_len_num)
  18. head_len_num -= 1
  19. head_data = match[2]
  20. self.head_level[head_len_num] += 1
  21. for i in range(head_len_num + 1, 6):
  22. self.head_level[i] = 0
  23. self.toc_num += 1
  24. toc_num_str = str(self.toc_num)
  25. head_level_str_2 = '.'.join([str(i) for i in self.head_level if i != 0])
  26. head_level_str = head_level_str_2 + '.'
  27. self.toc_data += '<a href="#s-' + head_level_str_2 + '">' + head_level_str + '</a> ' + head_data + '<br>'
  28. return '<h' + head_len + ' id="s-' + head_level_str_2 + '"><a href="#toc">' + head_level_str + '</a> ' + head_data + '</h' + head_len + '>'
  29. def get_toc(self):
  30. return self.toc_data + '</div>'
  31. class link_render:
  32. def __init__(self, plus_data, include_name):
  33. self.str_e_link_id = 0
  34. self.plus_data = ''
  35. self.include_name = include_name
  36. def __call__(self, match):
  37. str_e_link_id = str(self.str_e_link_id)
  38. self.str_e_link_id += 1
  39. if match[1] == '!':
  40. file_name = ''
  41. if re.search(r'^http(s)?:\/\/', match[3], flags = re.I):
  42. file_src = match[3]
  43. file_alt = match[3]
  44. exist = '1'
  45. else:
  46. file_name = re.search(r'^([^.]+)\.([^.]+)$', match[3])
  47. if file_name:
  48. file_end = file_name.group(2)
  49. file_name = file_name.group(1)
  50. else:
  51. file_name = 'Test'
  52. file_end = 'jpg'
  53. file_src = '/image/' + tool.sha224_replace(file_name) + '.' + file_end
  54. file_alt = 'file:' + file_name + '.' + file_end
  55. exist = None
  56. return '' + \
  57. '<span class="' + self.include_name + 'file_finder" ' + \
  58. 'under_alt="' + file_alt + '" ' + \
  59. 'under_src="' + file_src + '" ' + \
  60. 'under_style="" ' + \
  61. 'under_href="' + ("out_link" if exist else '/upload?name=' + tool.url_pas(file_name)) + '">' + \
  62. '</span>' + \
  63. ''
  64. else:
  65. if re.search(r'^http(s)?:\/\/', match[3], flags = re.I):
  66. self.plus_data += '' + \
  67. 'document.getElementsByName("' + self.include_name + 'set_link_' + str_e_link_id + '")[0].href = ' + \
  68. '"' + match[3] + '";' + \
  69. '\n' + \
  70. ''
  71. return '<a id="out_link" ' + \
  72. 'href="" ' + \
  73. 'name="' + self.include_name + 'set_link_' + str_e_link_id + '">' + match[2] + '</a>'
  74. else:
  75. self.plus_data += '' + \
  76. 'document.getElementsByName("' + self.include_name + 'set_link_' + str_e_link_id + '")[0].href = ' + \
  77. '"/w/' + tool.url_pas(match[3]) + '";' + \
  78. '\n' + \
  79. ''
  80. self.plus_data += '' + \
  81. 'document.getElementsByName("' + self.include_name + 'set_link_' + str_e_link_id + '")[0].title = ' + \
  82. '"' + match[3] + '";' + \
  83. '\n' + \
  84. ''
  85. return '<a class="' + self.include_name + 'link_finder" ' + \
  86. 'title="" ' + \
  87. 'href="" ' + \
  88. 'name="' + self.include_name + 'set_link_' + str_e_link_id + '">' + match[2] + '</a>'
  89. def get_plus_data(self):
  90. return self.plus_data
  91. def markdown(conn, data, title, include_name):
  92. backlink = []
  93. include_name = include_name + '_' if include_name else ''
  94. plus_data = '' + \
  95. 'get_link_state("' + include_name + '");\n' + \
  96. 'get_file_state("' + include_name + '");\n' + \
  97. ''
  98. data = html.escape(data)
  99. data = data.replace('\r\n', '\n')
  100. data = '\n' + data
  101. head_r = r'\n(#{1,6}) ?([^\n]+)'
  102. head_do = head_render()
  103. data = re.sub(head_r, head_do, data)
  104. data = head_do.get_toc() + data
  105. link_r = r'(!)?\[((?:(?!\]\().)+)\]\(([^\]]+)\)'
  106. link_do = link_render(plus_data, include_name)
  107. data = re.sub(link_r, link_do, data)
  108. plus_data = link_do.get_plus_data() + plus_data
  109. data = re.sub(r'\*\*(?P<A>(?:(?!\*\*).)+)\*\*', '<b>\g<A></b>', data)
  110. data = re.sub(r'__(?P<A>(?:(?!__).)+)__', '<i>\g<A></i>', data)
  111. data = re.sub('^\n', '', data)
  112. data = data.replace('\n', '<br>')
  113. data = re.sub(r'(?P<A><\/h[0-6]>)<br>', '\g<A>', data)
  114. return [data, plus_data, backlink]