2
0
2du 4 жил өмнө
parent
commit
e8add783ae

+ 1 - 1
readme.md

@@ -41,7 +41,7 @@
 
 ## 지원 문법
  * 나무마크 (NamuMark)
- * 마크다운 (Markdown) (예정)
+ * 마크다운 (Markdown) (Beta)
 
 ## 기타
  * 첫 가입자에게 소유자 권한이 부여됩니다.

+ 2 - 0
route/tool/func.py

@@ -880,6 +880,8 @@ def wiki_css(data):
     data_css_ver = '145'
     
     # Func JS
+    data_css += '<script src="/views/main_css/js/func/func.js?ver=' + data_css_ver + '"></script>'
+    
     data_css += '<script src="/views/main_css/js/func/http_warning_text.js?ver=' + data_css_ver + '"></script>'
     data_css += '<script defer src="/views/main_css/js/func/ie_end_of_life.js?ver=' + data_css_ver + '"></script>'
     data_css += '<script defer src="/views/main_css/js/func/shortcut.js?ver=' + data_css_ver + '"></script>'

+ 2 - 2
views/main_css/css/main.css

@@ -120,7 +120,7 @@ a {
 }
 
 /* 위키 내용 관련 */
-#toc {
+#toc, .opennamuTOC {
     border: 1px solid gainsboro;
     padding: 20px;
     
@@ -146,7 +146,7 @@ pre {
     white-space: pre-wrap;
 }
 
-#toc_title {
+#toc_title, .opennamuTOCtitle {
     font-size: 1.2rem;
 }
 

+ 13 - 0
views/main_css/js/func/func.js

@@ -0,0 +1,13 @@
+"use strict";
+
+function opennamu_do_id_check(data) {
+    if(data.match(/\.|\:/)) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+function opennamu_do_url_encode(data) {
+    return encodeURIComponent(data);
+}

+ 0 - 12
views/main_css/js/func/user_name_parser.js

@@ -1,17 +1,5 @@
 "use strict";
 
-function opennamu_do_id_check(data) {
-    if(data.match(/\.|\:/)) {
-        return 0;
-    } else {
-        return 1;
-    }
-}
-
-function opennamu_do_url_encode(data) {
-    return encodeURIComponent(data);
-}
-
 function opennamu_do_user_document_check() {
     let data_all = document.getElementsByClassName('opennamu_user_link');
     for(let for_a = 0; for_a < data_all.length; for_a++) {

+ 54 - 22
views/main_css/js/render/markdown.js

@@ -67,10 +67,6 @@ class opennamu_render_markdown {
         return data;
     }
     
-    do_func_url_encode(data) {
-        return encodeURIComponent(data);
-    }
-    
     // Render Part
     do_part_text() {
         let parser_count = this.parser_count['parser'];
@@ -165,26 +161,49 @@ class opennamu_render_markdown {
         let parser_data_temp = this.parser_data_temp;
         
         let toc_data = '';
-        let toc_list = [0, 0, 0, 0, 0, 0];
-        let toc_regex = /\n(#{1,6})([^\n]+)\n/;
-        while(this.doc_data.match(toc_regex)) {
-            this.doc_data = this.doc_data.replace(toc_regex, function(match, x1, x2) {
-                let toc_level = x1.length - 1;
-                let toc_level_str = String(toc_level + 1);
+        
+        let heading_n = 0;
+        let heading_list = [0, 0, 0, 0, 0, 0];
+        let heading_regex = /\n(#{1,6})([^\n]+)\n/;
+        while(this.doc_data.match(heading_regex)) {
+            this.doc_data = this.doc_data.replace(heading_regex, function(match, x1, x2) {
+                let heading_level = x1.length - 1;
+                let heading_level_str = String(heading_level + 1);
 
-                toc_list[toc_level] += 1;
-                for(let for_a = toc_level + 1; for_a < 6; for_a++) {
-                    toc_list[for_a] = 0;
+                heading_list[heading_level] += 1;
+                for(let for_a = heading_level + 1; for_a < 6; for_a++) {
+                    heading_list[for_a] = 0;
                 }
 
-                let toc_list_str = '';
+                let heading_list_str = '';
                 for(let for_a = 0; for_a < 6; for_a++) {
-                    if(toc_list[for_a] !== 0) {
-                        toc_list_str += String(toc_list[for_a]) + '.'
+                    if(heading_list[for_a] !== 0) {
+                        heading_list_str += String(heading_list[for_a]) + '.'
                     }
                 }
+                
+                let heading_list_str_2 = heading_list_str.replace(/\.$/, '');
+                
+                heading_n += 1;
+                let heading_n_str = String(heading_n);
+                
+                toc_data += '' +
+                    '<a href="#opennamuHeading' + heading_list_str_2 + '">' + heading_list_str + '</a> ' +
+                    '<span id="opennamuTOCcontent' + heading_n_str + '"></span>' +
+                    '<br>' +
+                ''
+                
+                let heading_data = x2;
+                heading_data = heading_data.replace(/^ /, '');
 
-                return '\n<brEnd><h' + toc_level_str + '>' + toc_list_str + x2 + '</h' + toc_level_str + '><brStart>\n';
+                return '' + 
+                    '\n<brEnd>' + 
+                    '<h' + heading_level_str + ' id="opennamuHeading' + heading_list_str_2 + '">' + 
+                        '<a href="#opennamuTOC">' + heading_list_str + '</a> ' + 
+                        '<span id="opennamuHeadingContent' + heading_n_str + '">' + heading_data + '</span>' + 
+                    '</h' + heading_level_str + '>' +
+                    '<brStart>\n' +
+                '';
             });
         }
         
@@ -284,7 +303,7 @@ class opennamu_render_markdown {
                     link_title = render_main.do_func_xss_encode(link_main);
 
                     link_main = render_main.do_func_xss_decode(link_main);
-                    link_main = render_main.do_func_url_encode(link_main);
+                    link_main = opennamu_do_url_encode(link_main);
 
                     parser_data_temp['render' + parser_count_str + 'Span'] = '<a class="' + render_part_id_add + 'opennamuLink" title="' + link_title + '" href="/w/' + link_main + '">';
                     parser_data_temp['/render' + parser_count_str + 'Span'] = '</a>';
@@ -399,7 +418,7 @@ class opennamu_render_markdown {
         let parser_data_temp = this.parser_data_temp;
         let parser_data_temp_other = this.parser_data_temp_other;
         
-        this.doc_data = this.doc_data.replace(/\[([^\[\(<>]+)\(((?:(?!\(|\)\]|<|>).)+)\)\]/g, function(match, x1, x2) {
+        this.doc_data = this.doc_data.replace(/\[([^\[\(<>]+)\(((?:(?!\(|\)\]|<|>).)*)\)\]/g, function(match, x1, x2) {
             if(x1 === 'anchor') {
                 parser_count += 1;
                 let parser_count_str = String(parser_count);
@@ -420,7 +439,7 @@ class opennamu_render_markdown {
                 let link_title = render_main.do_func_xss_encode(link_main);
                 
                 link_main = render_main.do_func_xss_decode(link_main);
-                link_main = render_main.do_func_url_encode(link_main);
+                link_main = opennamu_do_url_encode(link_main);
                 
                 parser_data_temp_other['category'] += '<a class="' + render_part_id_add + 'opennamuLink" title="' + link_title + '" href="/w/' + link_main + '">';
                 parser_data_temp_other['category'] += category_data;
@@ -428,8 +447,21 @@ class opennamu_render_markdown {
                 parser_data_temp_other['category'] += ' | ';
                 
                 return '';
-            } else if(x1 === 'toc') {                
-                return parser_data_temp_other['toc'];
+            } else if(x1 === 'toc') {
+                if(parser_data_temp_other['toc'] !== '') {
+                    return '' +
+                        '<div class="opennamuTOC">' + 
+                            '<span class="opennamuTOCtitle">' +
+                                'TOC' +
+                            '</span>' + 
+                            '<br>' + 
+                            '<br>' + 
+                            parser_data_temp_other['toc'] + 
+                        '</div>' +
+                    '';
+                } else {
+                    return '';
+                }
             }
             else {
                 return '';

+ 28 - 0
views/main_css/js/render/wiki.js

@@ -52,7 +52,35 @@ class opennamu_render_wiki {
         }
     }
     
+    do_part_toc() {
+        for(
+            let for_a = 1;
+            document.getElementById('opennamuHeadingContent' + String(for_a));
+            for_a++
+        ) {
+            let heading_data = document.getElementById('opennamuHeadingContent' + String(for_a));
+            document.getElementById('opennamuTOCcontent' + String(for_a)).innerHTML = heading_data.innerText;
+            
+            document.getElementById('opennamuHeadingContent' + String(for_a)).id = heading_data.innerText;
+        }
+        
+        let toc_data_all = document.getElementsByClassName('opennamuTOC');
+        let toc_data = '';
+        for(
+            let for_a = 0;
+            for_a < toc_data_all.length;
+            for_a++
+        ) {
+            if(toc_data === '') {
+                toc_data = toc_data_all[0].innerHTML;
+            }
+            
+            document.getElementsByClassName('opennamuTOC')[for_a].innerHTML = toc_data;
+        }
+    }
+    
     do_main() {
         this.do_part_link();
+        this.do_part_toc();
     }
 }