잉여개발기 (SPDV) 3 лет назад
Родитель
Сommit
03a6ffe56d
1 измененных файлов с 89 добавлено и 16 удалено
  1. 89 16
      route/tool/func_render_namumark.py

+ 89 - 16
route/tool/func_render_namumark.py

@@ -12,9 +12,10 @@ class class_do_render_namumark:
 
 
         self.data_temp_storage = {}
         self.data_temp_storage = {}
         self.data_temp_storage_count = 0
         self.data_temp_storage_count = 0
+
         self.data_backlink = []
         self.data_backlink = []
 
 
-        self.math_count = 0
+        self.data_math_count = 0
         
         
         self.data_toc = ''
         self.data_toc = ''
         self.data_footnote = ''
         self.data_footnote = ''
@@ -38,20 +39,29 @@ class class_do_render_namumark:
 
 
         return data
         return data
 
 
-    def get_tool_data_storage(self, data_A = '', data_B = '', data_C = ''):
+    def get_tool_data_storage(self, data_A = '', data_B = '', data_C = '', do_type = 'render'):
         self.data_temp_storage_count += 1
         self.data_temp_storage_count += 1
-        data_name = 'render_' + str(self.data_temp_storage_count)
+        if do_type == 'render':
+            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[data_name] = data_A
+            self.data_temp_storage['/' + data_name] = data_B
+            self.data_temp_storage['revert_' + data_name] = data_C
+        else:
+            data_name = 'slash_' + str(self.data_temp_storage_count)
 
 
-        self.data_temp_storage['revert_' + data_name] = data_C
+            self.data_temp_storage[data_name] = data_A
 
 
         return data_name
         return data_name
 
 
-    def get_tool_data_restore(self, data):
+    def get_tool_data_restore(self, data, do_type = 'all'):
         storage_count = self.data_temp_storage_count * 3
         storage_count = self.data_temp_storage_count * 3
-        storage_regex = r'<(\/?render_(?:[0-9]+))>'
+        if do_type == 'all':
+            storage_regex = r'<(\/?(?:render|slash)_(?:[0-9]+))>'
+        elif do_type == 'render':
+            storage_regex = r'<(\/?(?:render)_(?:[0-9]+))>'
+        else:
+            storage_regex = r'<(\/?(?:slash)_(?:[0-9]+))>'
 
 
         while 1:
         while 1:
             if not re.search(storage_regex, data):
             if not re.search(storage_regex, data):
@@ -452,12 +462,13 @@ class class_do_render_namumark:
 
 
     def do_render_math(self):
     def do_render_math(self):
         def do_render_math_sub(match):
         def do_render_math_sub(match):
-            data = html.unescape(match.group(1))
+            data = self.get_tool_data_restore(match.group(1), do_type = 'slash')
+            data = html.unescape(data)
             data = self.get_tool_js_safe(data)
             data = self.get_tool_js_safe(data)
 
 
             data_html = self.get_tool_js_safe(match.group(1))
             data_html = self.get_tool_js_safe(match.group(1))
 
 
-            name_ob = 'opennamu_math_' + str(self.math_count)
+            name_ob = 'opennamu_math_' + str(self.data_math_count)
 
 
             data_name = self.get_tool_data_storage('<span id="' + name_ob + '">', '</span>', match.group(0))
             data_name = self.get_tool_data_storage('<span id="' + name_ob + '">', '</span>', match.group(0))
 
 
@@ -469,14 +480,73 @@ class class_do_render_namumark:
                 '}\n' + \
                 '}\n' + \
             ''
             ''
 
 
-            self.math_count += 1
+            self.data_math_count += 1
 
 
             return '<' + data_name + '></' + data_name + '>'
             return '<' + data_name + '></' + data_name + '>'
 
 
         self.render_data = re.sub(r'\[math\(((?:(?!\)\]).)+)\)\]', do_render_math_sub, self.render_data)
         self.render_data = re.sub(r'\[math\(((?:(?!\)\]).)+)\)\]', do_render_math_sub, self.render_data)
 
 
     def do_render_link(self):
     def do_render_link(self):
-        pass
+        link_regex = r'\[\[((?:(?!\[\[|\]\]|\||<|>).|<slash_[0-9]+>)+)(?:\|((?:(?!\[\[|\]\]|\|).)+))?\]\]'
+        link_count_all = len(re.findall(link_regex, self.render_data)) * 4
+        while 1:
+            if not re.search(link_regex, self.render_data):
+                break
+            elif link_count_all < 0:
+                print('Error : render heading count overflow')
+
+                break
+            else:
+                link_data = re.search(link_regex, self.render_data)
+                link_data_full = link_data.group(0)
+                link_data = link_data.groups()
+
+                link_main = link_data[0]
+                link_main_org = link_main
+
+                # sharp
+                link_data_sharp_regex = r'#([^#]+)$'
+                link_data_sharp = re.search(link_data_sharp_regex, link_main)
+                if link_data_sharp:
+                    link_data_sharp = link_data_sharp.group(1)
+                    link_data_sharp = html.unescape(link_data_sharp)
+                    link_data_sharp = '#' + url_pas(link_data_sharp)
+
+                    link_main = re.sub(link_data_sharp_regex, '', link_main)
+                else:
+                    link_data_sharp = ''
+
+                # under page
+                if link_main == '../':
+                    link_main = self.doc_name
+                    link_main = re.sub(r'(\/[^/]+)$', '', link_main)
+                elif re.search(r'^\/', link_main):
+                    link_main = re.sub(r'^\/', self.doc_name + '/', link_main)
+
+                # sub not exist -> sub = main
+                link_main = self.get_tool_data_restore(link_main, do_type = 'slash')
+                link_main = html.unescape(link_main)
+                if link_data[1]:
+                    link_sub = link_data[1]
+                else:
+                    link_sub = link_main_org
+
+                if link_main != '':
+                    link_main = '/w/' + url_pas(link_main)
+
+                link_end = '<a href="' + link_main + link_data_sharp + '">' + link_sub + '</a>'
+
+                self.render_data = re.sub(link_regex, link_end, self.render_data, 1)
+
+            link_count_all -= 1
+
+    def do_render_slash(self):
+        def do_render_slash_sub(match):
+            data_name = self.get_tool_data_storage(match.group(1), do_type = 'slash')
+
+            return '<' + data_name + '>'
+
+        self.render_data = re.sub(r'\\(.)', do_render_slash_sub, self.render_data)
 
 
     def do_render_last(self):
     def do_render_last(self):
         # remove front_br and back_br
         # remove front_br and back_br
@@ -490,11 +560,12 @@ class class_do_render_namumark:
         self.render_data = self.get_tool_data_restore(self.render_data)
         self.render_data = self.get_tool_data_restore(self.render_data)
 
 
     def __call__(self):
     def __call__(self):
+        self.do_render_slash()
         self.do_render_math()
         self.do_render_math()
         # self.do_render_middle()
         # self.do_render_middle()
         self.do_render_text()
         self.do_render_text()
         self.do_render_macro()
         self.do_render_macro()
-        # self.do_render_link()
+        self.do_render_link()
         self.do_render_heading()
         self.do_render_heading()
         self.do_render_last()
         self.do_render_last()
 
 
@@ -502,7 +573,9 @@ class class_do_render_namumark:
         # print(self.render_data)
         # print(self.render_data)
 
 
         return [
         return [
-            self.render_data, # HTML
-            self.render_data_js, # JS
-            [] # Other
+            self.render_data, # html
+            self.render_data_js, # js
+            [
+                self.data_backlink # backlink
+            ] # other
         ]
         ]