فهرست منبع

Merge pull request #2125 from openNAMU/dev

버그 수정 및 일부 기능 추가
잉여개발기 2 سال پیش
والد
کامیت
f76529a0e8

+ 13 - 1
route/main_setting_phrase.py

@@ -34,7 +34,10 @@ def main_setting_phrase():
             'outdated_doc_warning',
             'outdated_doc_warning_date',
             'category_text',
-            'redirect_text'
+            'redirect_text',
+            'template_var_1',
+            'template_var_2',
+            'template_var_3',
         ]
         if flask.request.method == 'POST':
             curs.executemany(db_change("update other set data = ? where name = ?"), [[flask.request.form.get(for_a, ''), for_a] for for_a in i_list])
@@ -146,6 +149,15 @@ def main_setting_phrase():
                         <hr class="main_hr">
                         <input name="''' + i_list[26] + '''" value="''' + html.escape(d_list[26]) + '''">
 
+                        <h2>''' + get_lang(conn, 'template_var_1') + ''' (''' + get_lang(conn, 'default') + ''' : ''' + get_lang(conn, 'top') + ''') (HTML)</h2>
+                        <textarea class="opennamu_textarea_100" name="''' + i_list[27] + '''">''' + html.escape(d_list[27]) + '''</textarea>
+
+                        <h2>''' + get_lang(conn, 'template_var_2') + ''' (''' + get_lang(conn, 'default') + ''' : ''' + get_lang(conn, 'sidebar') + ''') (HTML)</h2>
+                        <textarea class="opennamu_textarea_100" name="''' + i_list[28] + '''">''' + html.escape(d_list[28]) + '''</textarea>
+
+                        <h2>''' + get_lang(conn, 'template_var_3') + ''' (''' + get_lang(conn, 'default') + ''' : ''' + get_lang(conn, 'bottom') + ''') (HTML)</h2>
+                        <textarea class="opennamu_textarea_100" name="''' + i_list[29] + '''">''' + html.escape(d_list[29]) + '''</textarea>
+
                         <hr class="main_hr">
                         <button id="opennamu_save_button" type="submit">''' + get_lang(conn, 'save') + '''</button>
                     </form>

+ 11 - 3
route/tool/func.py

@@ -1043,7 +1043,7 @@ def skin_check(conn, set_n = 0):
         return skin
     
 def cache_v():
-    return '.cache_v218'
+    return '.cache_v219'
 
 def wiki_css(data):
     global global_wiki_set
@@ -1131,7 +1131,7 @@ def cut_100(data):
     else:
         return ''
 
-def wiki_set(conn, num = 1):
+def wiki_set(conn):
     curs = conn.cursor()
 
     ip = ip_check()
@@ -1193,6 +1193,14 @@ def wiki_set(conn, num = 1):
 
     data_list += [db_data]
 
+    template_var = []
+    for for_a in range(1, 4):
+        curs.execute(db_change("select data from other where name = ?"), ['template_var_' + str(for_a)])
+        db_data = curs.fetchall()
+        template_var += [db_data[0][0]] if db_data else ['']
+
+    data_list += [template_var]
+
     return data_list
 
 def wiki_custom(conn):
@@ -1252,7 +1260,7 @@ def wiki_custom(conn):
         user_head = flask.session['head'] if 'head' in flask.session else ''
         user_head += flask.session['head' + skin_name] if 'head' + skin_name in flask.session else ''
 
-    curs.execute(db_change("select title from rd where title = ? and stop = ''"), ['user:' + ip])
+    curs.execute(db_change("select title from rd where title = ? and stop = '' limit 1"), ['user:' + ip])
     user_topic = '1' if curs.fetchall() else '0'
     
     split_path = flask.request.path.split('/')

BIN
route_go/bin/main.amd64.bin


BIN
route_go/bin/main.amd64.exe


BIN
route_go/bin/main.arm64.bin


BIN
route_go/bin/main.arm64.exe


+ 1 - 0
route_go/go.mod

@@ -39,4 +39,5 @@ require (
 	modernc.org/opt v0.1.3 // indirect
 	modernc.org/strutil v1.2.0 // indirect
 	modernc.org/token v1.1.0 // indirect
+	mvdan.cc/xurls/v2 v2.5.0 // indirect
 )

+ 2 - 0
route_go/go.sum

@@ -131,3 +131,5 @@ modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
 modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
 modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
 modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY=
+mvdan.cc/xurls/v2 v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8=
+mvdan.cc/xurls/v2 v2.5.0/go.mod h1:yQgaGQ1rFtJUzkmKiHYSSfuQxqfYmd//X6PxvholpeE=

+ 75 - 13
route_go/route/tool/markdown.go

@@ -3,7 +3,10 @@ package tool
 import (
 	"bytes"
 	"database/sql"
+	"net/url"
 	"regexp"
+	"strconv"
+	"strings"
 
 	"github.com/yuin/goldmark"
 	"github.com/yuin/goldmark/extension"
@@ -11,13 +14,34 @@ import (
 )
 
 func Markdown(db *sql.DB, db_set map[string]string, data map[string]string) map[string]interface{} {
-	input := []byte(data["data"])
 	backlink := map[string]map[string]string{}
 	link_count := 0
 
+	raw_input := data["data"]
+
+	r := regexp.MustCompile(`\[\]\(([^\(\)]+)\)`)
+	raw_input = r.ReplaceAllStringFunc(raw_input, func(m string) string {
+		match := r.FindStringSubmatch(m)
+
+		return "[" + match[1] + "](" + match[1] + ")"
+	})
+
+	r = regexp.MustCompile(`\[([^\[\]]+)\]\(\)`)
+	raw_input = r.ReplaceAllStringFunc(raw_input, func(m string) string {
+		match := r.FindStringSubmatch(m)
+
+		return "[" + match[1] + "](" + match[1] + ")"
+	})
+
+	input := []byte(raw_input)
 	markdown := goldmark.New(
-		goldmark.WithExtensions(extension.Strikethrough, extension.Table),
-		goldmark.WithRendererOptions(html.WithHardWraps()),
+		goldmark.WithExtensions(
+			extension.Strikethrough,
+			extension.Table,
+		),
+		goldmark.WithRendererOptions(
+			html.WithHardWraps(),
+		),
 	)
 
 	var buf bytes.Buffer
@@ -27,26 +51,62 @@ func Markdown(db *sql.DB, db_set map[string]string, data map[string]string) map[
 
 	string_data := buf.String()
 
-	r := regexp.MustCompile(`\[([^\[\]]+)\]\(([^\(\)]*)\)`)
+	code_stack := []int{}
+	code_stack_idx := 0
+	code_stack_end := map[string]string{}
+
+	r = regexp.MustCompile(`(<code>|<\/code>)`)
+	for idx := r.FindStringIndex(string_data); len(idx) != 0; idx = r.FindStringIndex(string_data) {
+		if string_data[idx[0]:idx[1]] == "<code>" {
+			code_stack = []int{idx[0], idx[1]}
+			string_data = strings.Replace(string_data, "<code>", "<0001>", 1)
+		} else {
+			string_data = strings.Replace(string_data, "<0001>", "<code>", -1)
+
+			code_stack_idx_str := strconv.Itoa(code_stack_idx)
+			code_stack_end["code_"+code_stack_idx_str] = string_data[code_stack[0]:idx[1]]
+			code_stack_idx++
+
+			string_data = string_data[:code_stack[0]] + "<code_" + code_stack_idx_str + ">" + string_data[idx[1]:]
+		}
+	}
+
+	// p := bluemonday.UGCPolicy()
+	// string_data := p.Sanitize(string_data)
+
+	r = regexp.MustCompile(`\[([^\[\]]+)\]\(([^\(\)]*)\)`)
 	string_data = r.ReplaceAllStringFunc(string_data, func(m string) string {
 		match := r.FindStringSubmatch(m)
 
-		return "<a href=\"" + match[2] + "\">" + match[1] + "</a>"
+		link := match[2]
+		if link == "" {
+			link = match[1]
+		}
+
+		return "<a href=\"" + link + "\">" + match[1] + "</a>"
 	})
 
-	// p := bluemonday.UGCPolicy()
-	// result := p.Sanitize(string_data)
+	r = regexp.MustCompile(`<code_[0-9]+>`)
+	string_data = r.ReplaceAllStringFunc(string_data, func(m string) string {
+		m = strings.Replace(m, "<", "", 1)
+		m = strings.Replace(m, ">", "", 1)
+
+		return code_stack_end[m]
+	})
 
 	r = regexp.MustCompile(`<a href="([^"]+)"`)
-	result := r.ReplaceAllStringFunc(string_data, func(m string) string {
+	string_data = r.ReplaceAllStringFunc(string_data, func(m string) string {
 		match := r.FindStringSubmatch(m)
 
 		m1, _ := regexp.MatchString(`^https?:\/\/`, match[1])
 		if m1 {
 			return "<a href=\"" + match[1] + "\" class=\"opennamu_link_out\" target=\"_blank\""
 		} else {
-			if _, ok := backlink[match[1]]; !ok {
-				backlink[match[1]] = map[string]string{}
+			link := ""
+			link, _ = url.QueryUnescape(match[1])
+
+			if _, ok := backlink[link]; !ok {
+				backlink[link] = map[string]string{}
 			}
 
 			var exist string
@@ -57,12 +117,12 @@ func Markdown(db *sql.DB, db_set map[string]string, data map[string]string) map[
 			}
 			defer stmt.Close()
 
-			err = stmt.QueryRow(match[1]).Scan(&exist)
+			err = stmt.QueryRow(link).Scan(&exist)
 			if err != nil {
 				exist = ""
 			}
 
-			backlink[match[1]][""] = ""
+			backlink[link][""] = ""
 			link_count += 1
 
 			class := ""
@@ -74,6 +134,8 @@ func Markdown(db *sql.DB, db_set map[string]string, data map[string]string) map[
 		}
 	})
 
+	string_data = strings.Replace(string_data, "<ul>", "<ul class=\"opennamu_ul\">", -1)
+
 	end_backlink := [][]string{}
 	for k1, v1 := range backlink {
 		for k2, v2 := range v1 {
@@ -87,7 +149,7 @@ func Markdown(db *sql.DB, db_set map[string]string, data map[string]string) map[
 	}
 
 	end_data := make(map[string]interface{})
-	end_data["data"] = result
+	end_data["data"] = string_data
 	end_data["js_data"] = ""
 	end_data["backlink"] = end_backlink
 	end_data["link_count"] = link_count

+ 1 - 1
version.json

@@ -1,6 +1,6 @@
 {
     "beta" : {
-        "r_ver" : "v3.5.0-dev56",
+        "r_ver" : "v3.5.0-dev58",
         "c_ver" : "3500376",
         "s_ver" : "3500113"
     }

+ 1 - 0
views/main_css/css/main.css

@@ -264,6 +264,7 @@ code, pre {
     padding: 10px;
 
     background-color: #efefef;
+    color: initial;
     
     border: 1px solid #cecece;
 

+ 1 - 0
views/main_css/css/sub/dark.css

@@ -68,6 +68,7 @@ blockquote {
 
 .opennamu_popup_footnote {
     background-color: #313236;
+    color: white;
 }
 
 .opennamu_history_blind {

+ 2 - 0
views/main_css/js/route/editor.js

@@ -94,6 +94,8 @@ function pasteListener(e) {
                     '업로드 완료 : ' +
                     '[[파일:' + file_name + ']]'
                 );
+
+                do_insert_data('[[file:' + file_name + ']]');
             } else {
                 console.error("[ERROR] PasteUpload Fail :", res.statusText);
                 if(res.status === 400) {

+ 14 - 8
views/ringo/index.html

@@ -11,7 +11,7 @@
         <link href="https://cdn.jsdelivr.net/gh/sun-typeface/SUIT/fonts/static/woff2/SUIT.css" rel="stylesheet">
         <script src="https://code.iconify.design/1/1.0.3/iconify.min.js"></script>
         <script src="/views/ringo/js/main.js.cache_v2"></script>
-        <script src="/views/ringo/js/sidebar.js.cache_v1"></script>
+        <script src="/views/ringo/js/sidebar.js.cache_v2"></script>
         <script src="/views/ringo/js/skin_set.js.cache_v5"></script>
         <link rel="stylesheet" href="/views/ringo/css/main.css.cache_v8">
         {% if request.cookies.get('main_css_darkmode', '') == '1' %}
@@ -220,7 +220,9 @@
                 </article>
             </header>
             <article class="main" id="main_data">
+                {{imp[1][7][0]|safe}}
                 {{data|safe}}
+                {{imp[1][7][2]|safe}}
             </article>
             <footer class="not_mobile">
                 <article class="main" id="footer">
@@ -233,13 +235,17 @@
         </section>
         <div class="aside_width"> </div>
         <aside class="do_fixed">
-            <button id="side_button_1" class="side_button selected">{{'edit'|load_lang}}</button><!--
-         --><button id="side_button_2" class="side_button">{{'discussion'|load_lang}}</button><!--
-         --><button id="side_button_3" class="side_button">{{'toc'|load_lang}}</button><!--
-         --><button id="side_button_4" class="side_button">{{'footnote'|load_lang}}</button>
-            <div id="side_content">
-                Loading...
-            </div>
+            {% if imp[1][7][1] == '' %}
+                <button id="side_button_1" class="side_button selected">{{'edit'|load_lang}}</button><!--
+             --><button id="side_button_2" class="side_button">{{'discussion'|load_lang}}</button><!--
+             --><button id="side_button_3" class="side_button">{{'toc'|load_lang}}</button><!--
+             --><button id="side_button_4" class="side_button">{{'footnote'|load_lang}}</button>
+                <div id="side_content">
+                    Loading...
+                </div>
+            {% else %}
+                {{imp[1][7][1]|safe}}
+            {% endif %}
         </aside>
         <div id="nav_bar">
             <div id="go_top">

+ 7 - 5
views/ringo/js/sidebar.js

@@ -91,10 +91,12 @@ function ringo_do_side_button_4() {
 let temp_save = ['', '', '', ''];
 
 window.addEventListener('DOMContentLoaded', function() {
-    document.getElementById("side_button_1").addEventListener("click", ringo_do_side_button_1);
-    document.getElementById("side_button_2").addEventListener("click", ringo_do_side_button_2);
-    document.getElementById("side_button_3").addEventListener("click", ringo_do_side_button_3);
-    document.getElementById("side_button_4").addEventListener("click", ringo_do_side_button_4);
+    if(document.getElementById("side_button_1")) {
+        document.getElementById("side_button_1").addEventListener("click", ringo_do_side_button_1);
+        document.getElementById("side_button_2").addEventListener("click", ringo_do_side_button_2);
+        document.getElementById("side_button_3").addEventListener("click", ringo_do_side_button_3);
+        document.getElementById("side_button_4").addEventListener("click", ringo_do_side_button_4);
 
-    ringo_do_side_button_1();
+        ringo_do_side_button_1();
+    }
 });