func_render_namumark.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. from .func_tool import *
  2. class class_do_render_namumark:
  3. def __init__(
  4. self,
  5. curs,
  6. doc_name,
  7. doc_data,
  8. doc_include
  9. ):
  10. self.curs = curs
  11. self.doc_data = doc_data
  12. self.doc_name = doc_name
  13. self.doc_include = doc_include
  14. self.data_temp_storage = {}
  15. self.data_temp_storage_count = 0
  16. self.data_backlink = []
  17. self.data_toc = ''
  18. self.data_footnote = ''
  19. self.data_category = ''
  20. self.render_data = self.doc_data
  21. self.render_data = html.escape(self.render_data)
  22. self.render_data = '<back_br>\n' + self.render_data + '\n<front_br>'
  23. self.render_data_js = ''
  24. def get_tool_temp_storage(self, data_A = '', data_B = ''):
  25. self.data_temp_storage_count += 1
  26. data_name = 'render_' + str(self.data_temp_storage_count)
  27. self.data_temp_storage[data_name] = data_A
  28. self.data_temp_storage['/' + data_name] = data_B
  29. return data_name
  30. def get_tool_data_restore(self, data):
  31. storage_count = self.data_temp_storage_count * 3
  32. storage_regex = r'<(\/?render_(?:[0-9]+))>'
  33. while 1:
  34. if not re.search(storage_regex, data):
  35. break
  36. if storage_count < 0:
  37. print('Error : render restore count overflow')
  38. break
  39. else:
  40. data = re.sub(storage_regex, lambda match : self.data_temp_storage[match.group(1)], data, 1)
  41. storage_count -= 1
  42. return data
  43. def do_render_text(self):
  44. # <b> function
  45. def do_render_text_bold(match):
  46. data = match.group(1)
  47. data_name = self.get_tool_temp_storage('<b>', '</b>')
  48. return '<' + data_name + '>' + data + '</' + data_name + '>'
  49. # <b>
  50. self.render_data = re.sub(r"&#x27;&#x27;&#x27;((?:(?!&#x27;&#x27;&#x27;).)+)&#x27;&#x27;&#x27;", do_render_text_bold, self.render_data)
  51. # <i> function
  52. def do_render_text_italic(match):
  53. data = match.group(1)
  54. data_name = self.get_tool_temp_storage('<i>', '</i>')
  55. return '<' + data_name + '>' + data + '</' + data_name + '>'
  56. # <i>
  57. self.render_data = re.sub(r"&#x27;&#x27;((?:(?!&#x27;&#x27;).)+)&#x27;&#x27;", do_render_text_italic, self.render_data)
  58. # <u> function
  59. def do_render_text_under(match):
  60. data = match.group(1)
  61. data_name = self.get_tool_temp_storage('<u>', '</u>')
  62. return '<' + data_name + '>' + data + '</' + data_name + '>'
  63. # <u>
  64. self.render_data = re.sub(r"__((?:(?!__).)+)__", do_render_text_under, self.render_data)
  65. # <sup> function
  66. def do_render_text_sup(match):
  67. data = match.group(1)
  68. data_name = self.get_tool_temp_storage('<sup>', '</sup>')
  69. return '<' + data_name + '>' + data + '</' + data_name + '>'
  70. # <sup>
  71. self.render_data = re.sub(r"\^\^\^((?:(?!\^\^\^).)+)\^\^\^", do_render_text_sup, self.render_data)
  72. # <sup> 2
  73. self.render_data = re.sub(r"\^\^((?:(?!\^\^).)+)\^\^", do_render_text_sup, self.render_data)
  74. # <sub> function
  75. def do_render_text_sub(match):
  76. data = match.group(1)
  77. data_name = self.get_tool_temp_storage('<sub>', '</sub>')
  78. return '<' + data_name + '>' + data + '</' + data_name + '>'
  79. # <sub>
  80. self.render_data = re.sub(r",,,((?:(?!,,,).)+),,,", do_render_text_sub, self.render_data)
  81. # <sub> 2
  82. self.render_data = re.sub(r",,((?:(?!,,).)+),,", do_render_text_sub, self.render_data)
  83. # <sub> function
  84. def do_render_text_strike(match):
  85. data = match.group(1)
  86. data_name = self.get_tool_temp_storage('<s>', '</s>')
  87. return '<' + data_name + '>' + data + '</' + data_name + '>'
  88. # <s>
  89. self.render_data = re.sub(r"--((?:(?!--).)+)--", do_render_text_strike, self.render_data)
  90. # <s> 2
  91. self.render_data = re.sub(r"~~((?:(?!~~).)+)~~", do_render_text_strike, self.render_data)
  92. def do_render_heading(self):
  93. heading_regex = r'\n((={1,6})(#?) ?([^\n]+))\n'
  94. heading_count_all = len(re.findall(heading_regex, self.render_data)) * 3
  95. while 1:
  96. if not re.search(heading_regex, self.render_data):
  97. break
  98. elif heading_count_all < 0:
  99. print('Error : render heading count overflow')
  100. break
  101. else:
  102. heading_data = re.search(heading_regex, self.render_data)
  103. heading_data = heading_data.groups()
  104. heading_data_last_regex = r' ?(#?={1,6})$'
  105. heading_data_last = re.search(heading_data_last_regex, heading_data[3])
  106. heading_data_text = re.sub(heading_data_last_regex, '', heading_data[3])
  107. # front != back -> restore
  108. heading_data_diff = heading_data[2] + heading_data[1]
  109. if heading_data_diff != heading_data_last:
  110. heading_data_all = heading_data[0]
  111. for for_a in reversed(range(1, 7)):
  112. for_a_str = str(for_a)
  113. heading_restore_regex = re.compile('^={' + for_a_str + '}|={' + for_a_str + '}$')
  114. heading_data_all = re.sub(heading_restore_regex, '<heading_' + for_a_str + '>', heading_data_all)
  115. self.render_data = re.sub(heading_regex, '\n' + heading_data_all + '\n', self.render_data, 1)
  116. else:
  117. self.render_data = re.sub(heading_regex, heading_data_text, self.render_data, 1)
  118. heading_count_all -= 1
  119. for for_a in range(1, 7):
  120. for_a_str = str(for_a)
  121. heading_restore_regex = re.compile('<heading_' + for_a_str + '>')
  122. self.render_data = re.sub(heading_restore_regex, ('=' * for_a), self.render_data)
  123. print(('=' * for_a))
  124. def do_render_last(self):
  125. # remove front_br and back_br
  126. self.render_data = re.sub(r'\n?<front_br>', '', self.render_data)
  127. self.render_data = re.sub(r'<back_br>\n?', '', self.render_data)
  128. # \n to <br>
  129. self.render_data = re.sub(r'\n', '<br>', self.render_data)
  130. # <render_n> restore
  131. self.render_data = self.get_tool_data_restore(self.render_data)
  132. def __call__(self):
  133. self.do_render_text()
  134. # self.do_render_macro()
  135. self.do_render_heading()
  136. self.do_render_last()
  137. print(self.data_temp_storage)
  138. print(self.render_data)
  139. return [
  140. self.render_data, # HTML
  141. self.render_data_js, # JS
  142. [] # Other
  143. ]