잉여개발기 (SPDV) 3 лет назад
Родитель
Сommit
aad5bd4d84
7 измененных файлов с 247 добавлено и 242 удалено
  1. 2 20
      app.py
  2. 163 0
      route/__init__.py
  3. 57 29
      route/api_topic.py
  4. 10 2
      route/bbs_w_post.py
  5. 10 5
      route/topic.py
  6. 5 1
      views/main_css/css/main.css
  7. 0 185
      views/main_css/js/route/thread.js

+ 2 - 20
app.py

@@ -3,26 +3,7 @@ import os
 import re
 
 from route.tool.func import *
-# from route import *
-
-for i_data in os.listdir("route"):
-    f_src = re.search(r"(.+)\.py$", i_data)
-    f_src = f_src.group(1) if f_src else ""
-    
-    if not f_src in ('', '__init__'):
-        try:
-            exec(
-                "from route." + f_src + " " + 
-                "import " + f_src
-            )
-        except:
-            try:
-                exec(
-                    "from route." + f_src + " " + 
-                    "import " + f_src + "_2"
-                )
-            except:
-                pass
+from route import *
 
 # Init-Version
 version_list = json.loads(open(
@@ -599,6 +580,7 @@ app.route('/api/skin_info/<name>')(api_skin_info)
 app.route('/api/user_info/<name>', methods = ['POST', 'GET'])(api_user_info)
 app.route('/api/setting/<name>')(api_setting)
 
+app.route('/api/thread/<int:topic_num>/<tool>/<int:num>/<render>')(api_topic)
 app.route('/api/thread/<int:topic_num>/<tool>/<int:num>')(api_topic)
 app.route('/api/thread/<int:topic_num>/<tool>')(api_topic)
 app.route('/api/thread/<int:topic_num>')(api_topic)

+ 163 - 0
route/__init__.py

@@ -0,0 +1,163 @@
+from route.api_func_lang import api_func_lang
+from route.api_func_sha224 import api_func_sha224
+from route.api_image_view import api_image_view
+from route.api_raw import api_raw
+from route.api_recent_change import api_recent_change
+from route.api_recent_discuss import api_recent_discuss
+from route.api_search import api_search
+from route.api_setting import api_setting
+from route.api_skin_info import api_skin_info
+from route.api_title_index import api_title_index
+from route.api_topic import api_topic
+from route.api_user_info import api_user_info
+from route.api_version import api_version
+from route.api_w import api_w
+
+from route.bbs_edit import bbs_edit
+from route.bbs_main import bbs_main
+from route.bbs_make import bbs_make
+from route.bbs_w import bbs_w
+from route.bbs_w_post import bbs_w_post
+from route.bbs_w_set import bbs_w_set
+
+from route.edit import edit
+from route.edit_backlink_reset import edit_backlink_reset
+from route.edit_delete import edit_delete
+from route.edit_delete_file import edit_delete_file
+from route.edit_delete_multiple import edit_delete_multiple
+from route.edit_move import edit_move
+from route.edit_revert import edit_revert
+from route.edit_upload import edit_upload
+
+from route.filter_document import filter_document
+from route.filter_document_add import filter_document_add
+from route.filter_document_delete import filter_document_delete
+from route.filter_inter_wiki import filter_inter_wiki
+from route.filter_inter_wiki_add import filter_inter_wiki_add
+from route.filter_inter_wiki_delete import filter_inter_wiki_delete
+
+from route.give_admin_groups import give_admin_groups_2
+from route.give_auth import give_auth
+from route.give_delete_admin_group import give_delete_admin_group_2
+from route.give_user_ban import give_user_ban
+from route.give_user_check import give_user_check_2
+from route.give_user_check_delete import give_user_check_delete_2
+from route.give_user_fix import give_user_fix
+
+from route.list_acl import list_acl
+from route.list_admin import list_admin
+from route.list_admin_auth_use import list_admin_auth_use
+from route.list_admin_group import list_admin_group_2
+from route.list_image_file import list_image_file
+from route.list_long_page import list_long_page
+from route.list_old_page import list_old_page
+from route.list_please import list_please
+from route.list_title_index import list_title_index
+from route.list_user import list_user
+
+from route.login_find import login_find
+from route.login_find_email import login_find_email
+from route.login_find_email_check import login_find_email_check
+from route.login_find_key import login_find_key
+from route.login_login import login_login_2
+from route.login_login_2fa import login_login_2fa_2
+from route.login_login_2fa_email import login_login_2fa_email_2
+from route.login_logout import login_logout
+
+from route.login_register import login_register_2
+from route.login_register_email import login_register_email_2
+from route.login_register_email_check import login_register_email_check_2
+from route.login_register_submit import login_register_submit_2
+
+from route.main_func_easter_egg import main_func_easter_egg
+from route.main_func_error_404 import main_func_error_404
+
+from route.main_search import main_search
+from route.main_search_deep import main_search_deep
+from route.main_search_goto import main_search_goto
+
+from route.main_setting import main_setting
+from route.main_setting_acl import main_setting_acl
+from route.main_setting_external import main_setting_external
+from route.main_setting_head import main_setting_head
+from route.main_setting_main import main_setting_main
+from route.main_setting_main_logo import main_setting_main_logo
+from route.main_setting_phrase import main_setting_phrase
+from route.main_setting_robot import main_setting_robot
+from route.main_setting_sitemap import main_setting_sitemap
+from route.main_setting_skin_set import main_setting_skin_set
+from route.main_setting_top_menu import main_setting_top_menu
+
+from route.main_sys_restart import main_sys_restart
+from route.main_sys_shutdown import main_sys_shutdown
+from route.main_sys_update import main_sys_update
+
+from route.main_tool_admin import main_tool_admin
+from route.main_tool_other import main_tool_other
+from route.main_tool_redirect import main_tool_redirect
+
+from route.main_view import main_view
+from route.main_view_file import main_view_file
+from route.main_view_image import main_view_image
+
+from route.recent_app_submit import recent_app_submit_2
+
+from route.recent_block import recent_block_2
+from route.recent_change import recent_change
+from route.recent_discuss import recent_discuss
+from route.recent_history_add import recent_history_add
+from route.recent_history_delete import recent_history_delete
+from route.recent_history_hidden import recent_history_hidden
+from route.recent_history_reset import recent_history_reset
+from route.recent_history_send import recent_history_send
+from route.recent_history_tool import recent_history_tool
+from route.recent_record_reset import recent_record_reset
+from route.recent_record_topic import recent_record_topic
+
+from route.topic import topic
+from route.topic_comment_blind import topic_comment_blind
+from route.topic_comment_delete import topic_comment_delete
+from route.topic_comment_notice import topic_comment_notice
+from route.topic_comment_tool import topic_comment_tool
+from route.topic_list import topic_list
+from route.topic_tool import topic_tool
+from route.topic_tool_acl import topic_tool_acl
+from route.topic_tool_change import topic_tool_change
+from route.topic_tool_delete import topic_tool_delete
+from route.topic_tool_setting import topic_tool_setting
+
+from route.user_alarm import user_alarm
+from route.user_alarm_delete import user_alarm_delete
+from route.user_challenge import user_challenge
+from route.user_count import user_count
+from route.user_info import user_info
+
+from route.user_setting import user_setting
+from route.user_setting_email import user_setting_email_2
+from route.user_setting_email_check import user_setting_email_check_2
+from route.user_setting_email_delete import user_setting_email_delete
+from route.user_setting_head import user_setting_head
+from route.user_setting_head_reset import user_setting_head_reset
+from route.user_setting_key import user_setting_key
+from route.user_setting_key_delete import user_setting_key_delete
+from route.user_setting_pw import user_setting_pw
+from route.user_setting_skin_set import user_setting_skin_set
+from route.user_setting_skin_set_main import user_setting_skin_set_main
+from route.user_setting_top_menu import user_setting_top_menu
+
+from route.user_watch_list import user_watch_list
+from route.user_watch_list_name import user_watch_list_name
+
+from route.view_acl import view_acl
+from route.view_diff import view_diff
+from route.view_down import view_down
+from route.view_random import view_random
+from route.view_raw import view_raw_2
+from route.view_read import view_read
+from route.view_xref import view_xref
+
+from route.vote_add import vote_add
+from route.vote_close import vote_close
+from route.vote_end import vote_end
+from route.vote_list import vote_list
+from route.vote_select import vote_select

+ 57 - 29
route/api_topic.py

@@ -1,6 +1,7 @@
 from .tool.func import *
+from .bbs_w_post import bbs_w_post_make_thread
 
-def api_topic(topic_num = 1, tool = 'normal', num = ''):
+def api_topic(topic_num = 1, tool = 'normal', num = '', render = ''):
     with get_db_connect() as conn:
         curs = conn.cursor()
 
@@ -9,32 +10,19 @@ def api_topic(topic_num = 1, tool = 'normal', num = ''):
         if acl_check('', 'topic_view', topic_num) != 1:
             if tool == 'normal':
                 if num != '':
-                    curs.execute(db_change(
-                        "select id, data, date, ip, block, top from topic where code = ? and id + 0 = ? + 0 order by id + 0 asc"
-                    ), [
-                        topic_num,
-                        num
-                    ])
+                    curs.execute(db_change("select id, data, date, ip, block, top from topic where code = ? and id + 0 = ? + 0 order by id + 0 asc"), [topic_num, num])
                 else:
-                    curs.execute(db_change(
-                        "select id, data, date, ip, block, top from topic where code = ? order by id + 0 asc"
-                    ), [
-                        topic_num
-                    ])
-            elif tool == 'length':
+                    curs.execute(db_change("select id, data, date, ip, block, top from topic where code = ? order by id + 0 asc"), [topic_num])
+            elif tool == 'top':
+                curs.execute(db_change("select id, data, date, ip, block, top from topic where code = ? and top = 'O' order by id + 0 asc"), [topic_num])
+            else:
+                # tool == 'length'
                 curs.execute(db_change("select id from topic where code = ? order by id + 0 desc limit 1"), [topic_num])
                 db_data = curs.fetchall()
-
                 if db_data:
                     return flask.jsonify({ 'length' : db_data[0][0] })
                 else:
                     return flask.jsonify({})
-            else:
-                curs.execute(db_change(
-                    "select id, data, date, ip, block, top from topic where code = ? and top = 'O' order by id + 0 asc"
-                ), [
-                    topic_num
-                ])
 
             data = curs.fetchall()
             if data:
@@ -48,28 +36,68 @@ def api_topic(topic_num = 1, tool = 'normal', num = ''):
                     "ip_first" : ip_pas(data_f, 1),
                     "admin" : str(admin)
                 }
+                data_a['data'] = []
 
                 ip_a = ip_pas([i[3] for i in data])
                 ip_a_2 = ip_pas([i[3] for i in data], 1)
                 for i in data:
                     data_v = i[1] if i[4] != 'O' or admin == 1 else ''
+                    if data_v != '':
+                        data_v = render_set(
+                            doc_data = data_v, 
+                            data_type = 'api_view',
+                            data_in = 'topic_' + topic_num + '_' + i[0],
+                            doc_acl = 0
+                        )
+                        data_v[0] = re.sub(
+                            r'&lt;topic_a&gt;(?P<in>(?:(?!&lt;\/topic_a&gt;).)+)&lt;\/topic_a&gt;',
+                            '<a href="\g<in>">\g<in></a>',
+                            data_v[0]
+                        )
+                        data_v[0] = re.sub(
+                            r'&lt;topic_call&gt;@(?P<in>(?:(?!&lt;\/topic_call&gt;).)+)&lt;\/topic_call&gt;',
+                            '<a href="/w/user:\g<in>">@\g<in></a>',
+                            data_v[0]
+                        )
+
+                    data_a['data'] += [{
+                        "id" : i[0],
 
-                    data_a[i[0]] = {
                         "data" : data_v,
                         "date" : i[2],
                         "ip" : ip_a_2[i[3]],
                         "blind" : i[4],
 
                         "ip_pas" : ip_a[i[3]],
-                        "data_pas" : render_set(
-                            doc_data = data_v, 
-                            data_type = 'api_view',
-                            data_in = 'topic_' + topic_num + '_' + i[0],
-                            doc_acl = 0
-                        )
-                    }
+                        "data_pas" : data_v
+                    }]
+
+                if render == '':
+                    return flask.jsonify(data_a)
+                else:
+                    data_r = ''
+                    if 'data' in data_a:
+                        for for_a in data_a['data']:
+                            if tool == 'top':
+                                color = 'red'
+                            else:
+                                if data_a['data_main']["ip_first"] == for_a["ip"]:
+                                    color = 'green'
+                                else:
+                                    color = 'default'
+
+                            data_r += bbs_w_post_make_thread(
+                                for_a["ip_pas"],
+                                '<a href="/thread/' + topic_num + '/comment/' + for_a["id"] + '/tool">(' + load_lang('tool') + ')</a> ' + for_a["date"],
+                                for_a["data_pas"][0] + for_a["data_pas"][1],
+                                for_a["id"],
+                                color = color,
+                                blind = for_a["blind"],
+                                add_style = ''
+                            )
+                            data_r += '<hr class="main_hr">'
 
-                return flask.jsonify(data_a)
+                    return flask.jsonify({ "data" : data_r })
             else:
                 return flask.jsonify({})
         else:

+ 10 - 2
route/bbs_w_post.py

@@ -1,17 +1,25 @@
 from .tool.func import *
 
 def bbs_w_post_make_thread(user_id, date, data, code, color = '', blind = '', add_style = ''):
+    if blind != '':
+        if data == '':
+            color_b = 'opennamu_comment_blind'
+        else:
+            color_b = 'opennamu_comment_blind_admin'
+    else:
+        color_b = 'opennamu_comment_blind_not'
+
     return '''
         <table class="opennamu_comment" style="''' + add_style + '''">
             <tr>
                 <td class="opennamu_comment_color_''' + color + '''">
-                    <a href="#thread_shortcut" id="comment_''' + code + '''">#''' + code + '''</a>
+                    <a href="#thread_shortcut" id="''' + code + '''">#''' + code + '''</a>
                     ''' + user_id + '''
                     <span style="float: right;">''' + date + '''</span>
                 </td>
             </tr>
             <tr>
-                <td class="" id="opennamu_comment_data_main">
+                <td class="''' + color_b + '''" id="opennamu_comment_data_main">
                     ''' + data + '''
                 </td>
             </tr>

+ 10 - 5
route/topic.py

@@ -1,9 +1,6 @@
 from .tool.func import *
 from .api_topic import api_topic
 
-def topic_make(data, ip_first = ''):
-    data = ''
-
 def topic(topic_num = 0, do_type = '', doc_name = 'Test'):
     with get_db_connect() as conn:
         curs = conn.cursor()
@@ -186,14 +183,22 @@ def topic(topic_num = 0, do_type = '', doc_name = 'Test'):
             
             shortcut += '</div>'
 
+            top_topic = ''
+            json_data = json.loads(api_topic(int(topic_num), 'top', '', 'render').data)
+            top_topic += json_data['data'] if 'data' in json_data else ''
+            
+            main_topic = ''
+            json_data = json.loads(api_topic(int(topic_num), 'normal', '', 'render').data)
+            main_topic += json_data['data'] if 'data' in json_data else ''
+
             return easy_minify(flask.render_template(skin_check(),
                 imp = [name, wiki_set(), wiki_custom(), wiki_css(['(' + load_lang('discussion') + ')', 0])],
                 data = '''
                     ''' + shortcut + '''
                     <h2 id="topic_top_title">''' + html.escape(sub) + '''</h2>
                     
-                    <div id="top_topic"></div>
-                    <div id="main_topic"></div>
+                    <div id="top_topic">''' + top_topic + '''</div>
+                    <div id="main_topic">''' + main_topic + '''</div>
                     <div id="plus_topic"></div>
                     
                     <a href="/thread/''' + topic_num + '/tool">(' + load_lang('topic_tool') + ''')</a>

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

@@ -93,6 +93,10 @@ summary {
     display: none;
 }
 
+.opennamu_comment_blind_admin {
+    background: gainsboro;
+}
+
 .opennamu_comment_scroll {
     max-height: 500px;
     
@@ -255,7 +259,7 @@ hr {
 
 blockquote {
     padding: 15px 40px 15px 15px;
-    margin: 15px 0 0;
+    margin: 0;
 
     display: inline-block;
 

+ 0 - 185
views/main_css/js/route/thread.js

@@ -1,185 +0,0 @@
-// 폐지하고 다시 SSR 방식으로 전환 예정
-function opennamu_do_thread_make(topic_num, type_do = 'top', some = '', where = 'top_topic') {
-    let url = '';
-    if(type_do === 'top') {
-        url = "/api/thread/" + topic_num + "/top";
-    } else if(type_do === 'main') {
-        url = "/api/thread/" + topic_num;
-    } else {
-        url = "/api/thread/" + topic_num + some;
-    }
-
-    let xhr = new XMLHttpRequest();
-    xhr.open("GET", url);
-    xhr.send();
-
-    xhr.onreadystatechange = function() {
-        if(this.readyState === 4 && this.status === 200) {
-            let data_t = JSON.parse(this.responseText);
-            
-            let start = 0;
-            let key_v = '/normal/1';
-            let admin = '';
-            let ip_first = '';
-            
-            let data_all = '';
-            let data_all_js = '';
-            
-            let count = 0;
-            for(let key in data_t) {
-                let data_a = '';
-                
-                if(start === 0) {
-                    admin = data_t['data_main']['admin'];
-                    ip_first = data_t['data_main']['ip_first'];
-                
-                    start = 1;
-                }
-                
-                if(key === 'data_main') {
-                    continue;
-                }
-                
-                key_v = '/normal/' + String(Number(key) + 1);
-                
-                let color_b = '';
-                let color_t = '';
-                
-                let ip = data_t[key]['ip_pas'];
-                let ip_o = data_t[key]['ip'];
-                let blind = data_t[key]['blind'];
-                let data_i_pas = data_t[key]['data_pas'][0];
-                let data_get_list = [];
-
-                if(data_i_pas === '') {
-                    data_i_pas = '<br>';
-                } else {
-                    let load_thread_regex = /&lt;topic_a&gt;((?:(?!&lt;\/topic_a&gt;).)+)&lt;\/topic_a&gt;/g;
-
-                    data_get_list = data_i_pas.match(load_thread_regex);
-
-                    data_i_pas = data_i_pas.replace(load_thread_regex, '<a href="$1">$1</a>');
-                    data_i_pas = data_i_pas.replace(/&lt;topic_call&gt;@((?:(?!&lt;\/topic_call&gt;).)+)&lt;\/topic_call&gt;/g, '<a href="/w/user:$1">@$1</a>');
-                }
-                
-                if(blind === 'O') {
-                    color_b = 'opennamu_comment_blind';
-                } else {
-                    color_b = 'opennamu_comment_blind_not';
-                }
-                
-                if(blind === 'O') {
-                    ip += ' <a href="/list/admin/auth_use/' + opennamu_do_url_encode('blind (code ' + topic_num + '#' + key) + '/1">(B)</a>';
-                    
-                    if(admin === '1') {
-                        ip += ' <a href="javascript:opennamu_do_open_comment(\'' + key + '\');">(O)</a>';
-                    }
-                }
-                
-                if(admin === '1' || blind !== 'O') {
-                    ip += ' <a href="/thread/' + topic_num + '/comment/' + key + '/tool">(T)</a>';
-                }
-                
-                if(type_do === 'top') {
-                    color_t = 'opennamu_comment_color_red';
-                } else if(blind === '1') {
-                    color_t = 'opennamu_comment_color_blue';
-                } else if(blind === 'O') {
-                    color_t = 'opennamu_comment_color_gray';
-                } else if(ip_o === ip_first) {
-                    color_t = 'opennamu_comment_color_green';
-                } else {
-                    color_t = 'opennamu_comment_color_default';
-                }
-                
-                data_a += '' + 
-                    '<table class="opennamu_comment">' + 
-                        '<tr>' + 
-                            '<td class="' + color_t + '">' + 
-                                '<a href="#thread_shortcut" id="' + key + '">#' + key + '</a> ' + 
-                                ip + 
-                                '<span style="float: right;">' + data_t[key]['date'] + '</span>' + 
-                            '</td>' + 
-                        '</tr>' + 
-                        '<tr>' + 
-                            '<td class="' + color_b + '" id="opennamu_comment_data_' + key + '">' + 
-                                '<div class="opennamu_comment_scroll">' + data_i_pas + '</div>' + 
-                            '</td>' + 
-                        '</tr>' +
-                    '</table>' + 
-                    '<hr class="main_hr">' + 
-                ''
-
-                document.getElementById(where).innerHTML += data_a;
-                
-                count += 1;
-                data_all_js += data_t[key]['data_pas'][1] + '\n';
-                
-                if(count > 100) {
-                    eval(data_all_js);
-                    
-                    count = 0;
-                    data_all_js = '';
-                }
-            }
-            
-            eval(data_all_js);
-            
-            if(type_do === 'top') {
-                opennamu_do_thread_make(topic_num, 'main', '', 'main_topic');
-            } else if(type_do === 'main') {
-                let data_url_v = window.location.hash.replace(/^#/, '');
-                if(data_url_v !== '') {
-                    if(document.getElementById(data_url_v)) {
-                        document.getElementById(data_url_v).focus();
-                    }
-                }
-                
-                opennamu_do_thread_make(topic_num, 're', key_v, where);
-            } else if(type_do === 're') {
-                setTimeout(function() {
-                    if(start === 0) {
-                        opennamu_do_thread_make(topic_num, 're', some, where);
-                    } else {
-                        opennamu_do_thread_make(topic_num, 're', key_v, where);
-                    }
-                }, 2000);
-            }
-        }
-    }
-}
-
-function opennamu_do_open_comment(key) {
-    let element_state = document.getElementById('opennamu_comment_data_' + key).style.display;
-    if(!element_state || element_state === 'none') {
-        document.getElementById('opennamu_comment_data_' + key).style.display = 'block';
-    } else {
-        document.getElementById('opennamu_comment_data_' + key).style.display = 'none';
-    }
-}
-
-if(window.location.pathname.match(/^\/(thread|thread_preview)\//)) {
-    let thread_num = window.location.pathname.match(/^\/(?:thread|thread_preview)\/([0-9]+)/)[1];
-
-    opennamu_do_thread_make(thread_num);
-} else if(window.location.pathname.match(/^\/topic\//)) {
-    for(let for_a = 0; document.getElementsByClassName('topic_pre')[for_a]; for_a++) {
-        let thread_num = document.getElementsByClassName('topic_pre')[for_a].id;
-        thread_num = thread_num.match(/^opennamu_thread_([0-9]+)/)[1];
-
-        opennamu_do_thread_make(thread_num, "list", "/normal/1", "opennamu_thread_" + thread_num);
-
-        let xhr = new XMLHttpRequest();
-        xhr.open("GET", "/api/thread/" + thread_num + "/length");
-        xhr.send();
-
-        xhr.onreadystatechange = function() {
-            if(this.readyState === 4 && this.status === 200) {
-                let thread_length = JSON.parse(this.responseText)['length'];
-                if(thread_length !== '1') {
-                    opennamu_do_thread_make(thread_num, "list", "/normal/" + thread_length, "opennamu_thread_back_" + thread_num);
-                }
-            }
-        }
-    }
-}