2
0

markdown.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. toc_num_str = str(self.toc_num)
  24. self.toc_num += 1
  25. head_level_str = ('.'.join([str(i) for i in self.head_level]) + '.').replace('0.', '')
  26. head_level_str_2 = re.sub(r'\.$', '', head_level_str)
  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_href="' + ("out_link" if exist else '/upload?name=' + tool.url_pas(file_name)) + '">' + \
  61. '</span>' + \
  62. ''
  63. else:
  64. if re.search(r'^http(s)?:\/\/', match[3], flags = re.I):
  65. self.plus_data += '' + \
  66. 'document.getElementsByName("' + self.include_name + 'set_link_' + str_e_link_id + '")[0].href = ' + \
  67. '"' + match[3] + '";' + \
  68. '\n' + \
  69. ''
  70. return '<a id="out_link" ' + \
  71. 'href="" ' + \
  72. 'name="' + self.include_name + 'set_link_' + str_e_link_id + '">' + match[2] + '</a>'
  73. else:
  74. self.plus_data += '' + \
  75. 'document.getElementsByName("' + self.include_name + 'set_link_' + str_e_link_id + '")[0].href = ' + \
  76. '"/w/' + tool.url_pas(match[3]) + '";' + \
  77. '\n' + \
  78. ''
  79. self.plus_data += '' + \
  80. 'document.getElementsByName("' + self.include_name + 'set_link_' + str_e_link_id + '")[0].title = ' + \
  81. '"' + match[3] + '";' + \
  82. '\n' + \
  83. ''
  84. return '<a class="' + self.include_name + 'link_finder" ' + \
  85. 'title="" ' + \
  86. 'href="" ' + \
  87. 'name="' + self.include_name + 'set_link_' + str_e_link_id + '">' + match[2] + '</a>'
  88. def get_plus_data(self):
  89. return self.plus_data
  90. def markdown(conn, data, title, include_name):
  91. backlink = []
  92. include_name = include_name + '_' if include_name else ''
  93. plus_data = '' + \
  94. 'get_link_state("' + include_name + '");\n' + \
  95. 'get_file_state("' + include_name + '");\n' + \
  96. ''
  97. data = html.escape(data)
  98. data = data.replace('\r\n', '\n')
  99. data = '\n' + data
  100. head_r = r'\n(#{1,6}) ?([^\n]+)'
  101. head_do = head_render()
  102. data = re.sub(head_r, head_do, data)
  103. data = head_do.get_toc() + data
  104. link_r = r'(!)?\[((?:(?!\]\().)+)\]\(([^\]]+)\)'
  105. link_do = link_render(plus_data, include_name)
  106. data = re.sub(link_r, link_do, data)
  107. plus_data = link_do.get_plus_data() + plus_data
  108. data = re.sub(r'\*\*((?:(?!\*\*).)+)\*\*', '<b>\1</b>', data)
  109. data = re.sub(r'__((?:(?!__).)+)__', '<i>\1</i>', data)
  110. data = re.sub('^\n', '', data)
  111. data = re.sub('\n', '<br>', data)
  112. return [data, plus_data, backlink]