Procházet zdrojové kódy

Merge pull request #2002 from openNAMU/dev

Dev
잉여개발기 před 2 roky
rodič
revize
702bfa072f

+ 1 - 0
app.py

@@ -561,6 +561,7 @@ app.route('/bbs/set/<int:bbs_num>', methods = ['POST', 'GET'])(bbs_w_set)
 app.route('/bbs/edit/<int:bbs_num>', methods = ['POST', 'GET'])(bbs_w_edit)
 app.route('/bbs/w/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_post)
 # app.route('/bbs/blind/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_hide)
+app.route('/bbs/pinned/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_pinned)
 app.route('/bbs/delete/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_delete)
 app.route('/bbs/raw/<int:bbs_num>/<int:post_num>')(view_raw_2)
 app.route('/bbs/tool/<int:bbs_num>/<int:post_num>')(bbs_w_tool)

+ 1 - 0
route/__init__.py

@@ -20,6 +20,7 @@ from route.api_bbs_w_comment_one import api_bbs_w_comment_one
 from route.bbs_w_edit import bbs_w_edit
 from route.bbs_make import bbs_make
 # from route.bbs_w_hide import bbs_w_hide
+from route.bbs_w_pinned import bbs_w_pinned
 from route.bbs_w_delete import bbs_w_delete
 from route.bbs_w import bbs_w
 from route.bbs_delete import bbs_delete

+ 14 - 3
route/bbs_w.py

@@ -63,11 +63,17 @@ def bbs_w(bbs_num = '', tool = 'bbs'):
         '''
 
         if tool == 'bbs':
+            curs.execute(db_change('select set_code, set_id, set_name from bbs_data where set_name = "pinned" and set_id like ? order by set_data desc'), [bbs_num])
+            db_data = curs.fetchall()
+            db_data = list(db_data) if db_data else []
+            
             curs.execute(db_change('select set_code, set_id from bbs_data where set_name = "title" and set_id like ? order by set_code + 0 desc'), [bbs_num])
+            db_data_2 = curs.fetchall()
+            db_data += list(db_data_2) if db_data_2 else []
         else:
             curs.execute(db_change('select set_code, set_id, set_data from bbs_data where set_name = "date" order by set_data desc limit 50'))
-        
-        db_data = curs.fetchall()
+            db_data = curs.fetchall()
+
         for for_b in db_data:
             curs.execute(db_change('select set_name, set_data, set_code, set_id from bbs_data where set_code = ? and set_id = ?'), [for_b[0], for_b[1]])
             db_data = curs.fetchall()
@@ -87,8 +93,13 @@ def bbs_w(bbs_num = '', tool = 'bbs'):
             if tool != 'bbs':
                 bbs_name_select = '(' + bbs_name_dict[for_b[1]] + ')'
 
+            if tool == 'bbs':
+                notice = 1 if len(for_b) > 2 else 0
+            else:
+                notice = 0
+
             data += '''
-                <tr>
+                <tr class="''' + ('opennamu_comment_color_red' if notice == 1 else '') + '''">
                     <td>''' + ip_pas(temp_dict['user_id']) + '''</td>
                     <td>''' + temp_dict['date'] + '''</td>
                     <td>''' + last_comment_date + '''</td>

+ 6 - 0
route/bbs_w_delete.py

@@ -1,5 +1,7 @@
 from .tool.func import *
 
+from .api_bbs_w_post import api_bbs_w_post
+
 def bbs_w_delete(bbs_num = '', post_num = ''):
     with get_db_connect() as conn:
         curs = conn.cursor()
@@ -17,6 +19,10 @@ def bbs_w_delete(bbs_num = '', post_num = ''):
         if admin_check() != 1:
             return redirect('/bbs/w/' + bbs_num_str)
         
+        temp_dict = json.loads(api_bbs_w_post(bbs_num_str + '-' + post_num_str).data)
+        if not 'user_id' in temp_dict:
+            return redirect('/bbs/main')
+        
         if flask.request.method == 'POST':
             curs.execute(db_change('delete from bbs_data where set_code = ? and set_id = ?'), [post_num_str, bbs_num_str])
             curs.execute(db_change('delete from bbs_set where set_code = ? and set_id = ?'), [post_num_str, bbs_num_str])

+ 46 - 0
route/bbs_w_pinned.py

@@ -0,0 +1,46 @@
+from .tool.func import *
+
+from .api_bbs_w_post import api_bbs_w_post
+
+def bbs_w_pinned(bbs_num = '', post_num = ''):
+    with get_db_connect() as conn:
+        curs = conn.cursor()
+
+        curs.execute(db_change('select set_data from bbs_set where set_id = ? and set_name = "bbs_name"'), [bbs_num])
+        db_data = curs.fetchall()
+        if not db_data:
+            return redirect('/bbs/main')
+
+        bbs_name = db_data[0][0]
+        
+        bbs_num_str = str(bbs_num)
+        post_num_str = str(post_num)
+
+        if admin_check() != 1:
+            return redirect('/bbs/w/' + bbs_num_str)
+        
+        temp_dict = json.loads(api_bbs_w_post(bbs_num_str + '-' + post_num_str).data)
+        if not 'user_id' in temp_dict:
+            return redirect('/bbs/main')
+        
+        if flask.request.method == 'POST':
+            curs.execute(db_change('select set_data from bbs_data where set_code = ? and set_id = ? and set_name = "pinned"'), [post_num_str, bbs_num_str])
+            if not curs.fetchall():
+                curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('pinned', ?, ?, ?)"), [post_num_str, bbs_num_str, get_time()])
+            else:
+                curs.execute(db_change('delete from bbs_data where set_code = ? and set_id = ? and set_name = "pinned"'), [post_num_str, bbs_num_str])
+            
+            return redirect('/bbs/w/' + bbs_num_str)
+        else:
+            curs.execute(db_change('select set_data from bbs_data where set_code = ? and set_id = ? and set_name = "pinned"'), [post_num_str, bbs_num_str])
+            pinned = load_lang('pinned') if not curs.fetchall() else load_lang('pinned_release')
+
+            return easy_minify(flask.render_template(skin_check(),
+                imp = [load_lang('bbs_post_pinned'), wiki_set(), wiki_custom(), wiki_css(['(' + bbs_name + ')' + ' (' + post_num_str + ')', 0])],
+                data = render_simple_set('''
+                    <form method="post">
+                        <button type="submit">''' + pinned + '''</button>
+                    </form>
+                '''),
+                menu = [['bbs/w/' + bbs_num_str + '/' + post_num_str, load_lang('return')]]
+            ))

+ 5 - 1
route/bbs_w_tool.py

@@ -17,10 +17,14 @@ def bbs_w_tool(bbs_num = '', post_num = ''):
         '''
 
         if admin_check() == 1:
+            curs.execute(db_change('select set_data from bbs_data where set_code = ? and set_id = ? and set_name = "pinned"'), [post_num_str, bbs_num_str])
+            pinned = load_lang('pinned') if not curs.fetchall() else load_lang('pinned_release')
+
             data += '''
-                <h2>''' + load_lang('admin') + '''</h2>
+                <h3>''' + load_lang('admin') + '''</h3>
                 <ul class="opennamu_ul">
                     <li><a href="/bbs/blind/''' + url_pas(bbs_num_str) + '/' + url_pas(post_num_str) + '">' + load_lang('hide') + '''</a></li>
+                    <li><a href="/bbs/pinned/''' + url_pas(bbs_num_str) + '/' + url_pas(post_num_str) + '">' + pinned + '''</a></li>
                 </ul>
             '''
 

+ 1 - 2
route/main_setting_skin_set.py

@@ -6,8 +6,7 @@ def main_setting_skin_set():
     with get_db_connect() as conn:
         curs = conn.cursor()
 
-        ip = ip_check()
-        if ban_check(ip) == 1:
+        if admin_check() != 1:
             return re_error('/ban')
             
         set_list = user_setting_skin_set_main_set_list()

+ 1 - 1
route/tool/func.py

@@ -1001,7 +1001,7 @@ def wiki_css(data):
     data_css = ''
     data_css_add = ''
 
-    data_css_ver = '186'
+    data_css_ver = '187'
     data_css_ver = '.cache_v' + data_css_ver
 
     if 'main_css' in global_wiki_set:

+ 13 - 19
route/tool/func_render_namumark.py

@@ -380,21 +380,19 @@ class class_do_render_namumark:
 
                     toc_list += [['', heading_data_text]]
 
-                    heading_folding = ['⊖', 'block']
+                    heading_folding = ['⊖', 'block', '1']
                     if heading_data[2]:
-                        heading_folding = ['⊕', 'none']
+                        heading_folding = ['⊕', 'none', '0.5']
 
                     data_name = self.get_tool_data_storage(
-                        '<h' + heading_level_str + '>', 
-                        '' + \
+                        '<h' + heading_level_str + '><span id="' + self.doc_include + 'opennamu_heading_' + str(heading_count) + '_sub" style="opacity: ' + heading_folding[2] + '">', 
                             ' <sub>' + \
                                 '<a id="' + self.doc_include + 'edit_load_' + str(heading_count) + '" href="/edit_section/' + str(heading_count) + '/' + url_pas(self.doc_name) + '">✎</a> ' + \
                                 '<a href="javascript:void(0);" onclick="javascript:opennamu_heading_folding(\'' + self.doc_include + 'opennamu_heading_' + str(heading_count) + '\', this);">' + \
                                     heading_folding[0] + \
                                 '</a>'
                             '</sub>' + \
-                            '</h' + heading_level_str + '>' + \
-                        '', 
+                        '</span></h' + heading_level_str + '>', 
                         heading_data_org
                     )
 
@@ -807,7 +805,7 @@ class class_do_render_namumark:
         self.render_data = re.sub(math_regex, do_render_math_sub, self.render_data)
 
     def do_render_link(self):
-        link_regex = r'\[\[((?:(?!\[\[|\]\]|\||<|>).|<(?:\/?(?:slash)_(?:[0-9]+)(?:[^<>]+))>)+)(?:\|((?:(?!\[\[|\]\]|\|).)+))?\]\]'
+        link_regex = r'\[\[((?:(?!\[\[|\]\]|\||<|>).|<(?:\/?(?:slash)_(?:[0-9]+)(?:[^<>]+))>)+)(?:\|((?:(?!\[\[|\]\]|\|).)+))?\]\](\n?)'
         image_count = 0
         link_count_all = len(re.findall(link_regex, self.render_data)) * 4
         while 1:
@@ -816,7 +814,6 @@ class class_do_render_namumark:
                 break
             elif link_count_all < 0:
                 print('Error : render link count overflow')
-
                 break
             else:
                 # link split
@@ -979,7 +976,7 @@ class class_do_render_namumark:
                         else:
                             data_name = self.get_tool_data_storage('', '', link_data_full)
                         
-                        self.render_data = re.sub(link_regex, '<' + data_name + '></' + data_name + '>', self.render_data, 1)
+                        self.render_data = re.sub(link_regex, '<' + data_name + '></' + data_name + '>' + link_data[2], self.render_data, 1)
                 # category
                 elif re.search(r'^(분류|category):', link_main, flags = re.I):
                     link_main = re.sub(r'^(분류|category):', '', link_main, flags = re.I)
@@ -1028,10 +1025,7 @@ class class_do_render_namumark:
 
                         self.data_category += '<a class="' + category_blur + ' ' + link_exist + '" title="' + link_sub + '" href="/w/category:' + link_main + '">' + link_sub + '</a>'
 
-                    if self.render_data.find('\n' + link_data_full + '\n') != -1:
-                        self.render_data = self.render_data.replace('\n' + link_data_full + '\n', '\n', 1)
-                    else:
-                        self.render_data = re.sub(link_regex, '', self.render_data, 1)
+                    self.render_data = re.sub(link_regex, '', self.render_data, 1)
                 # inter link
                 elif re.search(r'^(?:inter|인터):([^:]+):', link_main, flags = re.I):
                     link_inter_regex = re.compile('^(?:inter|인터):([^:]+):', flags = re.I)
@@ -1090,9 +1084,9 @@ class class_do_render_namumark:
 
                         data_name = self.get_tool_data_storage('<a class="opennamu_link_inter" title="' + link_title + '" href="' + link_main + link_data_sharp + '">' + link_sub_storage, '</a>', link_data_full)
                     
-                        self.render_data = re.sub(link_regex, lambda x : ('<' + data_name + '>' + link_sub + '</' + data_name + '>'), self.render_data, 1)
+                        self.render_data = re.sub(link_regex, lambda x : ('<' + data_name + '>' + link_sub + '</' + data_name + '>' + link_data[2]), self.render_data, 1)
                     else:
-                        self.render_data = re.sub(link_regex, '', self.render_data, 1)
+                        self.render_data = re.sub(link_regex, link_data[2], self.render_data, 1)
                 # out link
                 elif re.search(r'^https?:\/\/', link_main, flags = re.I):
                     link_main = self.get_tool_data_restore(link_main, do_type = 'slash')
@@ -1139,7 +1133,7 @@ class class_do_render_namumark:
                             link_class = 'opennamu_link_inter'
 
                     data_name = self.get_tool_data_storage('<a class="' + link_class + '" target="_blank" title="' + link_title + '" href="' + link_main + '">' + link_inter_icon + link_sub_storage, '</a>', link_data_full)
-                    self.render_data = re.sub(link_regex, lambda x : ('<' + data_name + '>' + link_sub + '</' + data_name + '>'), self.render_data, 1)
+                    self.render_data = re.sub(link_regex, lambda x : ('<' + data_name + '>' + link_sub + '</' + data_name + '>' + link_data[2]), self.render_data, 1)
                 # in link
                 else:
                     # under page & fix url
@@ -1204,7 +1198,7 @@ class class_do_render_namumark:
                     self.link_count += 1
 
                     data_name = self.get_tool_data_storage('<a class="' + link_exist + ' ' + link_same + '" title="' + link_title + '" href="' + link_main + link_data_sharp + '">' + link_sub_storage, '</a>', link_data_full)
-                    self.render_data = re.sub(link_regex, lambda x : ('<' + data_name + '>' + link_sub + '</' + data_name + '>'), self.render_data, 1)
+                    self.render_data = re.sub(link_regex, lambda x : ('<' + data_name + '>' + link_sub + '</' + data_name + '>' + link_data[2]), self.render_data, 1)
 
             link_count_all -= 1
 
@@ -1269,7 +1263,7 @@ class class_do_render_namumark:
 
         include_num = 0
         include_set_data = get_main_skin_set(self.curs, self.flask_session, 'main_css_include_link', self.ip)
-        include_regex = re.compile(r'\[include\(((?:(?!\[include\(|\)\]|<\/div>).)+)\)\]', re.I)
+        include_regex = re.compile(r'\[include\(((?:(?!\[include\(|\)\]|<\/div>).)+)\)\](\n?)', re.I)
         include_count_max = len(re.findall(include_regex, self.render_data)) * 2
         include_change_list = {}
         while 1:
@@ -1351,7 +1345,7 @@ class class_do_render_namumark:
 
                         data_name = self.get_tool_data_storage(include_link, '', match_org)
 
-                    self.render_data = re.sub(include_regex, '<' + data_name + '></' + data_name + '>', self.render_data, 1)
+                    self.render_data = re.sub(include_regex, '<' + data_name + '></' + data_name + '>' + match[1], self.render_data, 1)
 
             include_count_max -= 1
 

+ 2 - 9
route/topic_comment_tool.py

@@ -30,22 +30,15 @@ def topic_comment_tool(topic_num = 1, num = 1):
         '''
 
         if admin_check(3) == 1:
-            curs.execute(db_change(
-                "select id from topic where code = ? and id = ? and top = 'O'"
-            ), [topic_num, num])
+            curs.execute(db_change("select id from topic where code = ? and id = ? and top = 'O'"), [topic_num, num])
             top_topic_d = curs.fetchall()
 
-            curs.execute(db_change(
-                "select end from rb where block = ? and ongoing = '1'"
-            ), [data[0][1]])
-            user_ban_d = curs.fetchall()
-
             ban += '''
                 <h2>''' + load_lang('admin_tool') + '''</h2>
                 <ul class="opennamu_ul">
                     <li>
                         <a href="/auth/give/ban/''' + url_pas(data[0][1]) + '''">
-                            ''' + (load_lang('release') if user_ban_d else load_lang('ban')) + '''
+                            ''' + (load_lang('release') if ban_check(data[0][1]) == 1 else load_lang('ban')) + '''
                         </a>
                     </li>
                     <li>

+ 2 - 2
route/view_diff.py

@@ -76,11 +76,11 @@ def view_diff(name = 'Test', num_a = 1, num_b = 1):
                             result += '</td></tr><tr><td style="width: 40px; user-select: none;">' + str(line) + '</td><td>'
 
                     if for_a[1] == 1:
-                        result += '<span style="background: #eaf2c2;">' + html.escape(for_a[2]) + '</span>'
+                        result += '<span class="opennamu_diff_green">' + html.escape(for_a[2]) + '</span>'
                     elif for_a[1] == 0:
                         result += html.escape(for_a[2])
                     else:
-                        result += '<span style="background: #fadad7;">' + html.escape(for_a[2]) + '</span>'
+                        result += '<span class="opennamu_diff_red">' + html.escape(for_a[2]) + '</span>'
 
                 result += '</td></tr></table>'
 

+ 1 - 1
version.json

@@ -1,6 +1,6 @@
 {
     "beta" : {
-        "r_ver" : "v3.4.6-RC5-dev52",
+        "r_ver" : "v3.4.6-RC5-dev57",
         "c_ver" : "3500373",
         "s_ver" : "3500112"
     }

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

@@ -53,6 +53,15 @@ details summary {
     display: list-item;
 }
 
+/* diff */
+.opennamu_diff_green {
+    background: #eaf2c2;
+}
+
+.opennamu_diff_red {
+    background: #fadad7;
+}
+
 /* list */
 .opennamu_ul {
     padding-left: 20px;

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

@@ -73,3 +73,12 @@ blockquote {
 #topic_color {
     background: #325a56;
 }
+
+/* diff */
+.opennamu_diff_green {
+    background: #2e4a2e;
+}
+
+.opennamu_diff_red {
+    background: #803737;
+}

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

@@ -4,8 +4,10 @@ function opennamu_heading_folding(data, element = '') {
     let fol = document.getElementById(data);
     if(fol.style.display === '' || fol.style.display === 'inline-block' || fol.style.display === 'block') {
         document.getElementById(data).style.display = 'none';
+        document.getElementById(data + '_sub').style.opacity = '0.5';
     } else {
         document.getElementById(data).style.display = 'block';
+        document.getElementById(data + '_sub').style.opacity = '1';
     }
     
     if(element !== '') {

+ 3 - 0
views/ringo/css/main.css

@@ -214,6 +214,9 @@ aside .side_button {
     background-color: white;
     
     padding: 10px;
+
+    overflow: hidden;
+    white-space: nowrap;
 }
 
 aside .side_button:hover {

+ 4 - 4
views/ringo/index.html

@@ -231,10 +231,10 @@
             </footer>
         </section>
         <aside>
-            <button id="side_button_1" class="side_button selected">변경</button><!--
-         --><button id="side_button_2" class="side_button">토론</button><!--
-         --><button id="side_button_3" class="side_button">목차</button><!--
-         --><button id="side_button_4" class="side_button">각주</button>
+            <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>

+ 1 - 1
views/ringo/info.json

@@ -1,5 +1,5 @@
 {
     "name" : "Ringo",
-    "skin_ver" : "v1.0.5",
+    "skin_ver" : "v1.0.6",
     "require_ver" : "3500112"
 }

+ 6 - 3
views/tenshi/index.html

@@ -112,11 +112,14 @@
                                         <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
                                     </a>
                                     <div id="add_cel_in" class="cel_in_cel" style="display: none;">
-                                        {% for added_top_menu in imp[1][6] %}
-                                            <a href="{{added_top_menu[1]}}">
+                                        {% for list_n in range(0, imp[1][6]|length) %}
+                                            <a href="{{imp[1][6][list_n][1]}}">
                                                 <span class="iconify" data-icon="ic:baseline-plus" data-inline="true"></span>
-                                                {{added_top_menu[0]}}
+                                                {{imp[1][6][list_n][0]}}
                                             </a>
+                                            {% if list_n + 1 != imp[1][6]|length %}
+                                                <hr>
+                                            {% endif %}
                                         {% endfor %}
                                     </div>
                                 </div>

+ 1 - 1
views/tenshi/info.json

@@ -1,5 +1,5 @@
 {
     "name" : "Tenshi",
-    "skin_ver" : "v2.0.7",
+    "skin_ver" : "v2.0.8",
     "require_ver" : "3500110"
 }

+ 3 - 1
views/tenshi/js/main.js

@@ -20,7 +20,9 @@ function ringo_opening(data) {
 
         for(for_a in element) {
             if(for_a !== '0') { 
-                document.getElementById(element[for_a]).style.display = 'none';
+                if(document.getElementById(element[for_a]) !== null) {
+                    document.getElementById(element[for_a]).style.display = 'none';
+                }
             }
         }