잉여개발기 (SPDV) 3 vuotta sitten
vanhempi
sitoutus
4cb7e43505
1 muutettua tiedostoa jossa 110 lisäystä ja 36 poistoa
  1. 110 36
      route/tool/func_render_namumark.py

+ 110 - 36
route/tool/func_render_namumark.py

@@ -13,6 +13,8 @@ class class_do_render_namumark:
         self.data_temp_storage = {}
         self.data_temp_storage_count = 0
         self.data_backlink = []
+
+        self.math_count = 0
         
         self.data_toc = ''
         self.data_footnote = ''
@@ -29,13 +31,22 @@ class class_do_render_namumark:
         else:
             return name + ' (RENDER LANG)'
 
-    def get_tool_temp_storage(self, data_A = '', data_B = ''):
+    def get_tool_js_safe(self, data):
+        data = re.sub(r'\\', '\\\\\\\\', data)
+        data = re.sub(r'"', '\\"', data)
+        data = re.sub(r'\n', '\\n', data)
+
+        return data
+
+    def get_tool_data_storage(self, data_A = '', data_B = '', data_C = ''):
         self.data_temp_storage_count += 1
         data_name = 'render_' + str(self.data_temp_storage_count)
 
         self.data_temp_storage[data_name] = data_A
         self.data_temp_storage['/' + data_name] = data_B
 
+        self.data_temp_storage['revert_' + data_name] = data_C
+
         return data_name
 
     def get_tool_data_restore(self, data):
@@ -56,11 +67,29 @@ class class_do_render_namumark:
 
         return data
 
+    def get_tool_data_revert(self, data):
+        storage_count = self.data_temp_storage_count * 2
+        storage_regex = r'<(render_(?:[0-9]+))>(?:(?:(?!<(?:\/?render_(?:[0-9]+))>).)*)<\/render_(?:[0-9]+)>'
+
+        while 1:
+            if not re.search(storage_regex, data):
+                break
+            if storage_count < 0:
+                print('Error : render restore count overflow')
+
+                break
+            else:
+                data = re.sub(storage_regex, lambda match : self.data_temp_storage['revert_' + match.group(1)], data, 1)
+
+            storage_count -= 1
+
+        return data
+
     def do_render_text(self):
         # <b> function
         def do_render_text_bold(match):
             data = match.group(1)
-            data_name = self.get_tool_temp_storage('<b>', '</b>')
+            data_name = self.get_tool_data_storage('<b>', '</b>', match.group(0))
             
             return '<' + data_name + '>' + data + '</' + data_name + '>'
 
@@ -70,7 +99,7 @@ class class_do_render_namumark:
         # <i> function
         def do_render_text_italic(match):
             data = match.group(1)
-            data_name = self.get_tool_temp_storage('<i>', '</i>')
+            data_name = self.get_tool_data_storage('<i>', '</i>', match.group(0))
             
             return '<' + data_name + '>' + data + '</' + data_name + '>'
 
@@ -80,7 +109,7 @@ class class_do_render_namumark:
         # <u> function
         def do_render_text_under(match):
             data = match.group(1)
-            data_name = self.get_tool_temp_storage('<u>', '</u>')
+            data_name = self.get_tool_data_storage('<u>', '</u>', match.group(0))
             
             return '<' + data_name + '>' + data + '</' + data_name + '>'
 
@@ -90,7 +119,7 @@ class class_do_render_namumark:
         # <sup> function
         def do_render_text_sup(match):
             data = match.group(1)
-            data_name = self.get_tool_temp_storage('<sup>', '</sup>')
+            data_name = self.get_tool_data_storage('<sup>', '</sup>', match.group(0))
             
             return '<' + data_name + '>' + data + '</' + data_name + '>'
 
@@ -102,7 +131,7 @@ class class_do_render_namumark:
         # <sub> function
         def do_render_text_sub(match):
             data = match.group(1)
-            data_name = self.get_tool_temp_storage('<sub>', '</sub>')
+            data_name = self.get_tool_data_storage('<sub>', '</sub>', match.group(0))
             
             return '<' + data_name + '>' + data + '</' + data_name + '>'
         
@@ -114,7 +143,7 @@ class class_do_render_namumark:
         # <sub> function
         def do_render_text_strike(match):
             data = match.group(1)
-            data_name = self.get_tool_temp_storage('<s>', '</s>')
+            data_name = self.get_tool_data_storage('<s>', '</s>', match.group(0))
             
             return '<' + data_name + '>' + data + '</' + data_name + '>'
         
@@ -172,19 +201,19 @@ class class_do_render_namumark:
                     heading_stack_str = re.sub(r'(\.0)+$', '', heading_stack_str)
 
                     toc_list += [['', heading_data_text]]
+
+                    heading_data_text_fix = re.sub(r'<([^<>]*)>', '', heading_data_text)
                     
-                    heading_html_name = self.get_tool_temp_storage(
-                        '<h' + heading_level_str + '>',
-                        '</h' + heading_level_str + '>'
-                    )
+                    data_name = self.get_tool_data_storage('<h' + heading_level_str + ' id="' + heading_data_text_fix + '">', '</h' + heading_level_str + '>', '')
+
                     heading_data_complete = '' + \
                         '\n<front_br>' + \
-                        '<' + heading_html_name + '>' + \
+                        '<' + data_name + '>' + \
                             '<heading_stack>' + \
                                 heading_stack_str + \
                             '</heading_stack>' + \
                             ' ' + heading_data_text + \
-                        '</' + heading_html_name + '>' + \
+                        '</' + data_name + '>' + \
                         '<back_br>\n' + \
                     ''
 
@@ -250,6 +279,7 @@ class class_do_render_namumark:
     def do_render_macro(self):
         # double macro function
         def do_render_macro_double(match):
+            match_org = match
             match = match.groups()
 
             name_data = match[0]
@@ -314,7 +344,9 @@ class class_do_render_namumark:
                 else:
                     video_code = 'https://player.vimeo.com/video/' + video_code
 
-                return '<iframe style="width: ' + video_width + '; height: ' + video_height + ';" src="' + video_code + '" frameborder="0" allowfullscreen></iframe>'
+                data_name = self.get_tool_data_storage('<iframe style="width: ' + video_width + '; height: ' + video_height + ';" src="' + video_code + '" frameborder="0" allowfullscreen></iframe>', '', match_org.group(0))
+
+                return '<' + data_name + '></' + data_name + '>'
             elif name_data == 'ruby':
                 data = re.findall(macro_split_regex, match[1])
 
@@ -333,54 +365,58 @@ class class_do_render_namumark:
                     else:
                         main_text = for_a
 
+                main_text = self.get_tool_data_revert(main_text)
+                sub_text = self.get_tool_data_revert(sub_text)
+
                 # add color
                 if color != '':
                     sub_text = '<span style="color:' + color + ';">' + sub_text + '</span>'
 
-                return '' + \
-                    '<ruby>' + \
-                        main_text + \
-                        '<rp>(</rp>' + \
-                        '<rt>' + \
-                            sub_text + \
-                        '</rt>' + \
-                        '<rp>)</rp>' + \
-                    '</ruby>' + \
-                ''
+                data_name = self.get_tool_data_storage('<ruby>' + main_text + '<rp>(</rp><rt>' + sub_text + '</rt><rp>)</rp></ruby>', '', match_org.group(0))
+
+                return '<' + data_name + '></' + data_name + '>'
             elif name_data == 'age':
                 if re.search(r'^[0-9]{4}-[0-9]{2}-[0-9]{2}$', match[1]):
                     try:
                         date = datetime.datetime.strptime(match[1], '%Y-%m-%d')
                     except:
-                        return 'invalid date'
+                        data_text = 'invalid date'
 
                     date_now = datetime.datetime.today()
 
                     if date > date_now:
-                        return 'invalid date'
+                        data_text = 'invalid date'
                     else:
-                        return str((date_now - date).days // 365)
+                        data_text = str((date_now - date).days // 365)
                 else:
-                    return 'invalid date'
+                    data_text = 'invalid date'
+
+                data_name = self.get_tool_data_storage(data_text, '', match_org.group(0))
+
+                return '<' + data_name + '></' + data_name + '>'
             elif name_data == 'dday':
                 if re.search(r'^[0-9]{4}-[0-9]{2}-[0-9]{2}$', match[1]):
                     try:
                         date = datetime.datetime.strptime(match[1], '%Y-%m-%d')
                     except:
-                        return 'invalid date'
+                        data_text = 'invalid date'
 
                     date_now = datetime.datetime.today()
                     
                     date_end = (date_now - date).days
                     if date_end > 0:
-                        return '+' + str(date_end)
+                        data_text = '+' + str(date_end)
                     else:
                         if date_end == 0:
-                            return '-' + str(date_end)
+                            data_text = '-' + str(date_end)
                         else:
-                            return str(date_end)
+                            data_text = str(date_end)
                 else:
-                    return 'invalid date'
+                    data_text = 'invalid date'
+
+                data_name = self.get_tool_data_storage(data_text, '', match_org.group(0))
+
+                return '<' + data_name + '></' + data_name + '>'
             else:
                 return '<macro>' + match[0] + '(' + match[1] + ')' + '</macro>'
 
@@ -389,14 +425,21 @@ class class_do_render_namumark:
 
         # single macro function
         def do_render_macro_single(match):
+            match_org = match
             match = match.group(1)
 
             if match in ('date', 'datetime'):
-                return get_time()
+                data_name = self.get_tool_data_storage(get_time(), '', match_org.group(0))
+
+                return '<' + data_name + '></' + data_name + '>'
             elif match == 'br':
-                return '<br>'
+                data_name = self.get_tool_data_storage('<br>', '', match_org.group(0))
+
+                return '<' + data_name + '></' + data_name + '>'
             elif match == 'clearfix':
-                return '<div style="clear: both;"></div>'
+                data_name = self.get_tool_data_storage('<div style="clear: both;"></div>', '', match_org.group(0))
+
+                return '<' + data_name + '></' + data_name + '>'
             else:
                 return '<macro>' + match + '</macro>'
 
@@ -407,6 +450,34 @@ class class_do_render_namumark:
         self.render_data = re.sub(r'<macro>', '[', self.render_data)
         self.render_data = re.sub(r'<\/macro>', ']', self.render_data)
 
+    def do_render_math(self):
+        def do_render_math_sub(match):
+            data = html.unescape(match.group(1))
+            data = self.get_tool_js_safe(data)
+
+            data_html = self.get_tool_js_safe(match.group(1))
+
+            name_ob = 'opennamu_math_' + str(self.math_count)
+
+            data_name = self.get_tool_data_storage('<span id="' + name_ob + '">', '</span>', match.group(0))
+
+            self.render_data_js += '' + \
+                'try {\n' + \
+                    'katex.render("' + data + '", document.getElementById(\"' + name_ob + '\"));\n' + \
+                '} catch {\n' + \
+                    'document.getElementById(\"' + name_ob + '\").innerHTML = "<span style=\'color: red;\'>' + data_html + '</span>";\n' + \
+                '}\n' + \
+            ''
+
+            self.math_count += 1
+
+            return '<' + data_name + '></' + data_name + '>'
+
+        self.render_data = re.sub(r'\[math\(((?:(?!\)\]).)+)\)\]', do_render_math_sub, self.render_data)
+
+    def do_render_link(self):
+        pass
+
     def do_render_last(self):
         # remove front_br and back_br
         self.render_data = re.sub(r'\n?<front_br>', '', self.render_data)
@@ -419,8 +490,11 @@ class class_do_render_namumark:
         self.render_data = self.get_tool_data_restore(self.render_data)
 
     def __call__(self):
+        self.do_render_math()
+        # self.do_render_middle()
         self.do_render_text()
         self.do_render_macro()
+        # self.do_render_link()
         self.do_render_heading()
         self.do_render_last()