Kaynağa Gözat

Merge pull request #1673 from openNAMU/dev

Dev
잉여개발기 (SPDV) 3 yıl önce
ebeveyn
işleme
e7921a64c1

+ 2 - 1
app.py

@@ -260,7 +260,7 @@ with get_db_connect() as conn:
 if os.path.exists('custom.py'):
     from custom import custom_run
     custom_run('error', app)
-    
+
 # Func
 # Func-inter_wiki
 app.route('/inter_wiki', defaults = { 'tool' : 'inter_wiki' })(filter_inter_wiki)
@@ -495,6 +495,7 @@ app.route('/change/head', methods=['GET', 'POST'], defaults = { 'skin_name' : ''
 app.route('/change/head/<skin_name>', methods=['GET', 'POST'])(user_setting_head)
 app.route('/change/head_reset', methods=['GET', 'POST'])(user_setting_head_reset)
 app.route('/change/skin_set')(user_setting_skin_set)
+app.route('/change/top_menu', methods=['GET', 'POST'])(user_setting_top_menu)
 # 하위 호환용 S
 app.route('/skin_set')(user_setting_skin_set)
 # 하위 호환용 E

+ 28 - 1
lang/en-US.json

@@ -109,6 +109,8 @@
         "beta" : "Beta",
         "example" : "Example",
         "reset" : "Reset",
+        "top" : "Top",
+        "use" : "Use",
         "_comment_1.1_" : "Time",
             "second" : "Second(s)",
             "hour" : "Hour(s)",
@@ -175,7 +177,7 @@
         "password_change" : "Change password",
         "email_change" : "Change email",
         "acl_change" : "Change document ACL",
-		"acl_thread_change" : "Change thread ACL",
+        "acl_thread_change" : "Change thread ACL",
         "user_tool" : "Users tools",
         "skin_info" : "Skin information",
         "closed_discussion" : "Closed discussions",
@@ -238,6 +240,30 @@
         "_comment_" : "Search",
             "search_document_name" : "Search document name",
             "search_document_data" : "Search document data",
+        "_comment_" : "Main skin set",
+            "_comment_" : "Part",
+                "render" : "Render",
+                "strike" : "Strike",
+                "bold" : "Bold",
+                "footnote" : "Footnote",
+                "include_link" : "Include link",
+                "image" : "Image",
+                "exter_link" : "Exter link",
+                "link_delimiter" : "Link delimiter",
+                "force_darkmode" : "Force darkmode",
+                "font_size" : "Font size",
+                "image_paste" : "Paste Image by Ctrl + C and V",
+                "monaco_editor" : "Monaco editor",
+            "_comment_" : "Option",
+                "change_to_normal" : "Change to plain text.",
+                "change_to_link" : "Change to Link.",
+                "click_load" : "Load by click.",
+                "all_off" : "Turn off all",
+                "in_content" : "Turn off automatic TOC",
+                "self_tab" : "Open a link in this tab",
+            "_comment_" : "Footnote",
+                "only_korean" : "Only Korean is available",
+                "unavailable_in_monaco" : "Not available in Monaco editor.",
         "_comment_2.1_" : "Filter",
             "_comment_2.1.1_" : "List",
                 "interwiki_list" : "Interwiki(s) list",
@@ -443,6 +469,7 @@
             "answer": "Answer",
             "approve": "Approve",
             "decline": "Decline",
+            "new_application" : "A new register application exists.",
             "approve_or_decline": "Approve or reject",
             "no_applications_now" : "There are no applications.",
             "approval_requirement_disabled": "Approval requirement is disabled now. You can enable this feature on settings",

+ 24 - 1
lang/ko-KR.json

@@ -493,5 +493,28 @@
     "top_menu_setting": "추가 메뉴 설정",
     "enter_top_menu_setting": "윗 줄에는 이름을 쓰고 아랫 줄에는 URL을 입력하세요.",
     "not_support_skin_warning": "이 기능을 미지원하는 스킨에서는 작동하지 않습니다.",
-    "acl_thread_change": "스레드 ACL 변경"
+    "acl_thread_change": "스레드 ACL 변경",
+    "new_application": "새로운 가입 신청이 있습니다.",
+    "top": "상단",
+    "use": "사용",
+    "change_to_normal": "일반 글자로 변경",
+    "change_to_link": "링크로 변경",
+    "click_load": "클릭시 로드",
+    "all_off": "전부 끄기",
+    "in_content": "자동 목차 끄기",
+    "self_tab": "현재 탭에서 링크 열기",
+    "only_korean": "한국어만 사용 가능",
+    "unavailable_in_monaco": "모나코 에디터 상에서 사용 불가",
+    "render": "렌더링",
+    "strike": "취소선",
+    "bold": "굵게",
+    "footnote": "각주",
+    "include_link": "틀 링크",
+    "image": "이미지",
+    "exter_link": "외부 링크",
+    "link_delimiter": "링크 구분자",
+    "force_darkmode": "강제 다크모드",
+    "font_size": "글자 크기",
+    "image_paste": "이미지 붙여넣기 (컨트롤 C + V로)",
+    "monaco_editor": "모나코 에디터"
 }

+ 1 - 1
route/edit.py

@@ -209,7 +209,7 @@ def edit(name = 'Test', section = 0, do_type = ''):
                     data_preview = render_set(
                         doc_name = name, 
                         doc_data = data,
-                        data_in = ''
+                        data_in = 'from'
                     )
 
             if data_section == '':

+ 7 - 4
route/give_acl.py

@@ -82,7 +82,7 @@ def give_acl_2(name):
 
             for i in acl_get_list:
                 data += '' + \
-                    '<h' + i[2] + '>' + i[3] + ' ' + i[0] + (' (' + load_lang('beta') + ')' if i[2] == '4' else '') + '</h' + i[2] + '>' + \
+                    '<h' + i[2] + '>' + i[0] + (' (' + load_lang('beta') + ')' if i[2] == '4' else '') + '</h' + i[2] + '>' + \
                     '<hr class="main_hr">' + \
                     '<select name="' + i[1] + '" ' + check_ok + '>' + \
                 ''
@@ -100,12 +100,14 @@ def give_acl_2(name):
             acl_data = curs.fetchall()
             acl_why = html.escape(acl_data[0][0]) if acl_data else ''
             data += '' + \
-                '<hr class="main_hr">' + \
+                '<h2>' + load_lang('why') + '</h2>' + \
                 '<input value="' + acl_why + '" placeholder="' + load_lang('why') + '" name="why" ' + check_ok + '>' + \
+                '<hr class="main_hr">' + \
             ''
 
             data += '''
-                <h2 id="exp">''' + load_lang('explanation') + '''</h2>
+                <h2>''' + load_lang('explanation') + '''</h2>
+                <span id="exp"></span>
                 <ul class="opennamu_ul">
                     <li>normal : ''' + load_lang('unset') + '''</li>
                     <li>admin : ''' + load_lang('admin_acl') + '''</li>
@@ -127,7 +129,8 @@ def give_acl_2(name):
                 data = '''
                     <form method="post">
                         <a href="/setting/acl">(''' + load_lang('main_acl_setting') + ''')</a>
-                        ''' + data + '''
+                        <hr class="main_hr">
+                        ''' + render_simple_set(data) + '''
                         <button type="submit" ''' + check_ok + '''>''' + load_lang('save') + '''</button>
                     </form>
                 ''',

+ 9 - 10
route/give_admin_groups.py

@@ -9,9 +9,8 @@ def give_admin_groups_2(name):
         if flask.request.method == 'POST':
             if admin_check(None, 'admin_plus (' + name + ')') != 1:
                 return re_error('/error/3')
-            else:
-                if name in ['owner', 'ban']:
-                    return re_error('/error/3')
+            elif name in get_default_admin_group():
+                return re_error('/error/3')
 
             curs.execute(db_change("delete from alist where name = ?"), [name])
             for i in acl_name_list:
@@ -52,13 +51,13 @@ def give_admin_groups_2(name):
                         <hr class="main_hr">
                         <h2>''' + load_lang('explanation') + '''</h2>
                         <ul class="opennamu_ul">
-                            <li>ban : ''' + load_lang('ban_authority') + '''</li>
-                            <li>toron : ''' + load_lang('discussion_authority') + '''</li>
-                            <li>check : ''' + load_lang('user_check_authority') + '''</li>
-                            <li>acl : ''' + load_lang('document_acl_authority') + '''</li>
-                            <li>hidel : ''' + load_lang('history_hide_authority') + '''</li>
-                            <li>give : ''' + load_lang('authorization_authority') + '''</li>
-                            <li>owner : ''' + load_lang('owner_authority') + '''</li>
+                            <li style="margin-left: 20px;">owner : ''' + load_lang('owner_authority') + '''</li>
+                            <li style="margin-left: 40px; list-style: circle;">ban : ''' + load_lang('ban_authority') + '''</li>
+                            <li style="margin-left: 40px; list-style: circle;">toron : ''' + load_lang('discussion_authority') + '''</li>
+                            <li style="margin-left: 40px; list-style: circle;">check : ''' + load_lang('user_check_authority') + '''</li>
+                            <li style="margin-left: 40px; list-style: circle;">acl : ''' + load_lang('document_acl_authority') + '''</li>
+                            <li style="margin-left: 40px; list-style: circle;">hidel : ''' + load_lang('history_hide_authority') + '''</li>
+                            <li style="margin-left: 40px; list-style: circle;">give : ''' + load_lang('authorization_authority') + '''</li>
                         </ul>
                         <hr class="main_hr">
                         <button ''' + state +  ''' type="submit">''' + load_lang('save') + '''</button>

+ 3 - 0
route/login_register_submit.py

@@ -42,6 +42,9 @@ def login_register_submit_2():
                 json.dumps(user_app_data)
             ])
             conn.commit()
+            
+            for for_a in get_admin_list():
+                add_alarm(for_a, flask.session['submit_id'] + ' | <a href="/app_submit">' + load_lang('new_application') + '</a>')
 
             return redirect('/')
         else:

+ 4 - 1
route/main_func_setting_acl.py

@@ -10,7 +10,10 @@ def main_func_setting_acl():
             3 : 'upload_acl',
             4 : 'all_view_acl',
             5 : 'many_upload_acl',
-            6 : 'vote_acl'
+            6 : 'vote_acl',
+            7 : 'document_edit_acl',
+            8 : 'document_move_acl',
+            9 : 'document_delete_acl'
         }
 
         if flask.request.method == 'POST':

+ 5 - 2
route/main_view.py

@@ -15,9 +15,12 @@ def main_view(name = ''):
                 mime_type = 'text/plain'
             else:
                 mime_type = mime_type[len(mime_type) - 1].lower()
-                image_type = ['jpeg', 'jpg', 'gif', 'png', 'webp', 'ico']
+                image_type = ['jpeg', 'jpg', 'gif', 'png', 'webp', 'ico', 'svg']
                 if mime_type in image_type:
-                    mime_type = 'image/' + mime_type
+                    if not mime_type == 'svg':
+                        mime_type = 'image/' + mime_type
+                    else:
+                        mime_type = 'image/svg+xml'
                 elif mime_type == 'js':
                     mime_type = 'text/javascript'
                 elif mime_type == 'txt':

+ 56 - 18
route/tool/func.py

@@ -707,7 +707,7 @@ def set_init():
 # Func-simple
 ## Func-simple-without_DB
 def get_default_admin_group():
-    return ['owner', 'ban']
+    return ['owner', 'user', 'ban']
 
 def get_default_robots_txt():
     data = '' + \
@@ -1109,6 +1109,7 @@ def cut_100(data):
 def wiki_set(num = 1):
     curs = conn.cursor()
 
+    ip = ip_check()
     skin_name = skin_check(1)
     data_list = []
 
@@ -1147,6 +1148,11 @@ def wiki_set(num = 1):
     db_data = curs.fetchall()
     db_data = db_data[0][0] if db_data else ''
     db_data = db_data.replace('\r', '')
+    
+    curs.execute(db_change("select data from user_set where name = '' and id = ?"), [ip])
+    db_data_2 = curs.fetchall()
+    db_data_2 = db_data_2[0][0] if db_data_2 else ''
+    db_data += db_data_2.replace('\r', '')
     if db_data != '':
         db_data = db_data.split('\n')
     
@@ -1562,6 +1568,54 @@ def captcha_post(re_data, num = 1):
         return 0
 
 # Func-user
+def get_admin_auth_list(num = None):
+    check = {
+        0 : 'owner',
+        1 : 'ban',
+        2 : 'nothing',
+        3 : 'toron',
+        4 : 'check',
+        5 : 'acl',
+        6 : 'hidel',
+        7 : 'give'
+    }
+    if not num:
+        check = check[0]
+    elif num == 'all':
+        check = [check[i] for i in check]
+    else:
+        check = check[num]
+        
+    return check
+
+def get_admin_list(num = None):
+    curs = conn.cursor()
+    
+    if num == 'all':
+        curs.execute(db_change(
+            "select data from user_set where data != 'user' and name = 'acl'"
+        ))
+        db_data = curs.fetchall()
+        db_data = [db_data_in[0] for db_data_in in db_data] if db_data else []
+        
+        return db_data
+    else:
+        check = get_admin_auth_list(num)
+        admin_list = []
+        
+        curs.execute(db_change(
+            'select name from alist where acl = ?'
+        ), [check])
+        db_data = curs.fetchall()
+        for db_data_in in db_data:
+            curs.execute(db_change(
+                "select id from user_set where data = ? and name = 'acl'"
+            ), [db_data_in[0]])
+            db_data_2 = curs.fetchall()
+            admin_list += [db_data_2_in[0] for db_data_2_in in db_data_2] if db_data_2 else []
+            
+        return admin_list
+
 def admin_check(num = None, what = None, name = ''):
     curs = conn.cursor()
 
@@ -1576,24 +1630,8 @@ def admin_check(num = None, what = None, name = ''):
         user_auth = curs.fetchall()
         if user_auth:
             user_auth = user_auth[0][0]
+            check = get_admin_auth_list(num)
             
-            check = {
-                0 : 'owner',
-                1 : 'ban',
-                2 : 'nothing',
-                3 : 'toron',
-                4 : 'check',
-                5 : 'acl',
-                6 : 'hidel',
-                7 : 'give'
-            }
-            if not num:
-                check = check[0]
-            elif num == 'all':
-                check = [check[i] for i in check]
-            else:
-                check = check[num]
-
             curs.execute(db_change(
                 'select name from alist where name = ? and acl = "owner"'
             ), [user_auth])

+ 54 - 22
route/tool/func_render_namumark.py

@@ -550,15 +550,17 @@ class class_do_render_namumark:
                 if re.search(r'^[0-9]{4}-[0-9]{2}-[0-9]{2}$', match[1]):
                     try:
                         date = datetime.datetime.strptime(match[1], '%Y-%m-%d')
+                        data_text = ''
                     except:
                         data_text = 'invalid date'
 
                     date_now = datetime.datetime.today()
 
-                    if date > date_now:
-                        data_text = 'invalid date'
-                    else:
-                        data_text = str((date_now - date).days // 365)
+                    if data_text == '':
+                        if date > date_now:
+                            data_text = 'invalid date'
+                        else:
+                            data_text = str((date_now - date).days // 365)
                 else:
                     data_text = 'invalid date'
 
@@ -569,19 +571,21 @@ class class_do_render_namumark:
                 if re.search(r'^[0-9]{4}-[0-9]{2}-[0-9]{2}$', match[1]):
                     try:
                         date = datetime.datetime.strptime(match[1], '%Y-%m-%d')
+                        data_text = ''
                     except:
                         data_text = 'invalid date'
 
                     date_now = datetime.datetime.today()
                     
-                    date_end = (date_now - date).days
-                    if date_end > 0:
-                        data_text = '+' + str(date_end)
-                    else:
-                        if date_end == 0:
-                            data_text = '-' + str(date_end)
+                    if data_text == '':
+                        date_end = (date_now - date).days
+                        if date_end > 0:
+                            data_text = '+' + str(date_end)
                         else:
-                            data_text = str(date_end)
+                            if date_end == 0:
+                                data_text = '-' + str(date_end)
+                            else:
+                                data_text = str(date_end)
                 else:
                     data_text = 'invalid date'
 
@@ -618,7 +622,12 @@ class class_do_render_namumark:
             elif match in ('목차', 'toc', 'tableofcontents'):
                 return '<toc_need_part>'
             elif match == 'pagecount':
-                return '0'
+                self.curs.execute(db_change('select data from other where name = "count_all_title"'))
+                db_data = self.curs.fetchall()
+                if db_data:
+                    return db_data[0][0]
+                else:
+                    return '0'
             else:
                 return '<macro>' + match_org.group(1) + '</macro>'
 
@@ -768,14 +777,7 @@ class class_do_render_namumark:
                     if file_bgcolor != '':
                         file_bgcolor = 'background:' + self.get_tool_css_safe(file_bgcolor) + ';'
 
-                    if file_out == 0:
-                        file_onclick = 'onclick="javascript:document.location.pathname=\'/w/file:' + url_pas(link_main_org) + '.' + url_pas(link_extension) + '\'"'
-                        file_style = 'cursor: pointer;'
-                    else:
-                        file_onclick = ''
-                        file_style = ''
-
-                    file_end = '<img ' + file_onclick + ' style="' + file_width + file_height + file_align_style + file_bgcolor + file_style + '" alt="' + link_sub + '" src="' + link_main + '">'
+                    file_end = '<img style="' + file_width + file_height + file_align_style + file_bgcolor + '" alt="' + link_sub + '" src="' + link_main + '">'
                     if file_align == 'center':
                         file_end = '<div style="text-align:center;">' + file_end + '</div>'
 
@@ -793,7 +795,10 @@ class class_do_render_namumark:
                             file_pass = 1
 
                         if file_pass == 1:
-                            data_name = self.get_tool_data_storage(file_end, '', link_data_full)
+                            if file_out == 0:
+                                data_name = self.get_tool_data_storage('<a title="' + link_sub + '" href="/w/file:' + url_pas(link_main_org) + '.' + url_pas(link_extension) + '">' + file_end, '</a>', link_data_full)
+                            else:
+                                data_name = self.get_tool_data_storage('<a title="' + link_sub + '" href="' + link_main + '">' + file_end, '</a>', link_data_full)
                         else:
                             data_name = self.get_tool_data_storage('', '', link_data_full)
                         
@@ -1763,7 +1768,7 @@ class class_do_render_namumark:
                         self.render_data += '<hr><' + data_name + '></' + data_name + '>'
                 else:
                     self.render_data = re.sub(r'<footnote_category>', '', self.render_data, 1)
-                    self.render_data = '<' + data_name + '></' + data_name + '><hr>' + self.render_data
+                    self.render_data = '<' + data_name + '></' + data_name + '><hr class="main_hr">' + self.render_data
             else:
                 self.render_data = re.sub(r'<footnote_category>', '', self.render_data, 1)
         else:
@@ -1779,6 +1784,33 @@ class class_do_render_namumark:
         # <render_n> restore
         self.render_data = self.get_tool_data_restore(self.render_data)
 
+        # a fix
+        self.temp_a_link_count = 0
+        def do_render_last_a_link(match):
+            data = match.group(1)
+            if data == '</a>':
+                if self.temp_a_link_count == 0:
+                    return ''
+                elif self.temp_a_link_count > 1:
+                    self.temp_a_link_count -= 1
+                    
+                    return ''
+                else:
+                    self.temp_a_link_count -= 1
+                    
+                    return match.group(0)
+            else:
+                if self.temp_a_link_count > 0:
+                    self.temp_a_link_count += 1
+                    
+                    return ''
+                else:
+                    self.temp_a_link_count += 1
+                    
+                    return match.group(0)
+            
+        self.render_data = re.sub(r'(<a(?: [^<>]*)?>|<\/a>)', do_render_last_a_link, self.render_data)
+        
         # add toc
         def do_render_last_toc(match):
             data = match.group(1)

+ 11 - 17
route/user_count.py

@@ -26,14 +26,8 @@ def user_count(name = None):
         date = get_time()
         date = date.split()
         date = date[0]
-            
-        curs.execute(db_change("select count(*) from history where date like ? and ip = ?"), [date + '%', that])
-        count = curs.fetchall()
-        if count:
-            data_today = count[0][0]
-        else:
-            data_today = 0
-            
+        
+        data_today = 0
         data_today_len = 0
             
         curs.execute(db_change("select leng from history where date like ? and ip = ?"), [date + '%', that])
@@ -44,24 +38,24 @@ def user_count(name = None):
             count_data = count_data.replace('-', '')
 
             data_today_len += int(count_data)
+            data_today += 1
 
         date_yesterday = str((
             datetime.datetime.today() + datetime.timedelta(days = -1)
         ).strftime("%Y-%m-%d"))
-
-        curs.execute(db_change("select count(*) from history where date like ? and ip = ?"), [date_yesterday + '%', that])
-        count = curs.fetchall()
-        if count:
-            data_yesterday = count[0][0]
-        else:
-            data_yesterday = 0
-            
+        
+        data_yesterday = 0
         data_yesterday_len = 0
             
         curs.execute(db_change("select leng from history where date like ? and ip = ?"), [date_yesterday + '%', that])
         db_data = curs.fetchall()
         for count in db_data:
-            data_yesterday_len += int(count[0][1:])
+            count_data = count[0]
+            count_data = count_data.replace('+', '')
+            count_data = count_data.replace('-', '')
+
+            data_yesterday_len += int(count_data)
+            data_yesterday += 1
 
         # 한글 지원 필요
         return easy_minify(flask.render_template(skin_check(),

+ 0 - 2
route/user_info.py

@@ -38,8 +38,6 @@ def user_info(name = ''):
                     <li><a href="/login/find">''' + load_lang('password_search') + '''</a></li>
                 '''
                 
-            tool_menu += '<li><a href="/change/head">' + load_lang('user_head') + '</a></li>'
-                
             login_menu = '<h2>' + load_lang('login') + '</h2><ul class="opennamu_ul">' + login_menu + '</ul>'
             tool_menu = '<h2>' + load_lang('tool') + '</h2><ul class="opennamu_ul">' + tool_menu + '</ul>'
     

+ 2 - 0
route/user_setting.py

@@ -108,6 +108,8 @@ def user_setting():
                             <hr class="main_hr">
                             <span>''' + load_lang('password_instead_key') + ''' : ''' + ramdom_key + ''' <a href="/change/key">(''' + load_lang('key_change') + ''')</a> <a href="/change/key/delete">(''' + load_lang('key_delete') + ''')</a></span>
                             <h2>''' + load_lang('main') + '''</h2>
+                            <a href="/change/head">(''' + load_lang('user_head') + ''')</a> <a href="/change/top_menu">(''' + load_lang('user_top_menu') + ''')</a>
+                            <hr class="main_hr">
                             <span>''' + load_lang('skin') + '''</span>
                             <hr class="main_hr">
                             <select name="skin">''' + div2 + '''</select>

+ 16 - 16
route/user_setting_skin_set_main.py

@@ -24,7 +24,7 @@ def user_setting_skin_set_main():
                 ['normal', load_lang('default')],
                 ['use', load_lang('use')]
             ], 'main_css_category_set' : [
-                ['bottom', load_lang('bottom')],
+                ['bottom', load_lang('default')],
                 ['top', load_lang('top')]
             ], 'main_css_footnote_set' : [
                 ['normal', load_lang('default')],
@@ -107,59 +107,59 @@ def user_setting_skin_set_main():
                 imp = [load_lang('main_skin_set'), wiki_set(), wiki_custom(), wiki_css(['(' + load_lang('beta') + ')', 0])],
                 data = render_simple_set('''
                     <form method="post">
-                        <h2>render</h2>
-                        <h3>strike</h3>
+                        <h2>''' + load_lang("render") + '''</h2>
+                        <h3>''' + load_lang("strike") + '''</h3>
                         <select name="main_css_strike">
                             ''' + set_data["main_css_strike"] + '''
                         </select>
-                        <h3>bold</h3>
+                        <h3>''' + load_lang("bold") + '''</h3>
                         <select name="main_css_bold">
                             ''' + set_data["main_css_bold"] + '''
                         </select>
-                        <h3>category</h3>
+                        <h3>''' + load_lang("category") + '''</h3>
                         <select name="main_css_category_set">
                             ''' + set_data["main_css_category_set"] + '''
                         </select>
-                        <h3>footnote</h3>
+                        <h3>''' + load_lang("footnote") + '''</h3>
                         <select name="main_css_footnote_set">
                             ''' + set_data["main_css_footnote_set"] + '''
                         </select>
-                        <h3>include link</h3>
+                        <h3>''' + load_lang("include_link") + '''</h3>
                         <select name="main_css_include_link">
                             ''' + set_data["main_css_include_link"] + '''
                         </select>
-                        <h3>image</h3>
+                        <h3>''' + load_lang("image") + ''' (''' + load_lang("not_working") + ''')</h3>
                         <select name="main_css_image_set">
                             ''' + set_data["main_css_image_set"] + '''
                         </select>
-                        <h3>toc</h3>
+                        <h3>''' + load_lang("toc") + '''</h3>
                         <select name="main_css_toc_set">
                             ''' + set_data["main_css_toc_set"] + '''
                         </select>
-                        <h3>exter link</h3>
+                        <h3>''' + load_lang("exter_link") + '''</h3>
                         <select name="main_css_exter_link">
                             ''' + set_data["main_css_exter_link"] + '''
                         </select>
-                        <h3>link delimiter</h3>
+                        <h3>''' + load_lang("link_delimiter") + '''</h3>
                         <select name="main_css_link_delimiter">
                             ''' + set_data["main_css_link_delimiter"] + '''
                         </select>
-                        <h3>force darkmode</h3>
+                        <h3>''' + load_lang("force_darkmode") + '''</h3>
                         <select name="main_css_darkmode">
                             ''' + set_data["main_css_darkmode"] + '''
                         </select>
-                        <h3>font size</h3>
+                        <h3>''' + load_lang("font_size") + '''</h3>
                         (EX : 11) (''' + load_lang('off') + ''' : ''' + load_lang('empty') + ''')
                         <hr class="main_hr">
                         <input id="main_css_font_size" value="''' + set_data["main_css_font_size"] + '''">
-                        <h2>editor</h2>
-                        <h3>image paste</h3>
+                        <h2>''' + load_lang("editor") + '''</h2>
+                        <h3>''' + load_lang("image_paste") + '''</h3>
                         <sup>''' + load_lang('only_korean') + '''</sup> <sup>''' + load_lang('unavailable_in_monaco') + '''</sup>
                         <hr class="main_hr">
                         <select name="main_css_image_paste">
                             ''' + set_data["main_css_image_paste"] + '''
                         </select>
-                        <h3>monaco</h3>
+                        <h3>''' + load_lang("monaco_editor") + '''</h3>
                         <select name="main_css_monaco">
                             ''' + set_data["main_css_monaco"] + '''
                         </select>

+ 50 - 0
route/user_setting_top_menu.py

@@ -0,0 +1,50 @@
+from .tool.func import *
+
+def user_setting_top_menu():
+    with get_db_connect() as conn:
+        curs = conn.cursor()
+
+        ip = ip_check()
+        if ban_check(ip) == 1:
+            return re_error('/ban')
+        
+        if flask.request.method == 'POST':
+            curs.execute(db_change("select name from other where name = 'top_menu'"))
+            if curs.fetchall():
+                curs.execute(db_change("update user_set set data = ? where name = 'top_menu' and id = ?"), [flask.request.form.get('content', ''), ip])
+            else:
+                curs.execute(db_change("insert into user_set (name, data, id) values ('top_menu', ?, ?)"), [flask.request.form.get('content', ''), ip])
+
+            conn.commit()
+
+            return redirect('/setting/top_menu')
+        else:
+            curs.execute(db_change("select data from user_set where name = 'top_menu' and id = ?"), [ip])
+            db_data = curs.fetchall()
+            db_data = db_data[0][0] if db_data else ''
+            
+            return easy_minify(flask.render_template(skin_check(),
+                imp = [load_lang('top_menu_setting'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
+                data = '''
+                    <span>
+                        EX)
+                        <br>
+                        ONTS
+                        <br>
+                        https://2du.pythonanywhere.com/
+                        <br>
+                        FrontPage
+                        <br>
+                        /w/FrontPage
+                    </span>
+                    <hr class="main_hr">
+                    ''' + load_lang('not_support_skin_warning') + '''
+                    <hr class="main_hr">
+                    <form method="post">
+                        <textarea class="opennamu_textarea_500" placeholder="''' + load_lang('enter_top_menu_setting') + '''" name="content" id="content">''' + html.escape(db_data) + '''</textarea>
+                        <hr class="main_hr">
+                        <button id="opennamu_save_button" type="submit">''' + load_lang('save') + '''</button>
+                    </form>
+                ''',
+                menu = [['setting', load_lang('return')]]
+            ))

+ 1 - 1
version.json

@@ -1,6 +1,6 @@
 {
     "beta" : {
-        "r_ver" : "v3.4.6-RC2-dev116",
+        "r_ver" : "v3.4.6-RC2-dev124",
         "c_ver" : "3500355",
         "s_ver" : "3500111"
     }

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

@@ -46,9 +46,9 @@ td {
 summary {
     cursor: pointer;
     user-select: none;
-	
-	display: list-item;
-	list-style: inside disclosure-closed;
+    
+    display: list-item;
+    list-style: inside disclosure-closed;
 }
     
 /* list */
@@ -283,10 +283,10 @@ s:hover, strike:hover, del:hover {
 /* 기타 */
 .main_hr {
     border: none;
-	
+    
     padding-top: 6px;
     padding-bottom: 6px;
-	
+    
     margin: 0;
 }
 

Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
views/main_css/file/logo.svg


+ 2 - 2
views/main_css/js/func/ie_end_of_life.js

@@ -2,9 +2,9 @@ function opennamu_do_ie_end_support() {
     if(document.currentScript === undefined) {
         window.location = 'microsoft-edge:' + window.location;
         setTimeout(function() {
-            window.location = 'https://go.microsoft.com/fwlink/?linkid=2135547';
+            window.location = 'https://support.microsoft.com/office/160fa918-d581-4932-9e4e-1075c4713595';
         }, 1);
     }
 }
 
-opennamu_do_ie_end_support();
+opennamu_do_ie_end_support();

+ 339 - 335
views/ringo/css/main.css

@@ -1,336 +1,340 @@
-html {
-    background: #eee;
-}
-
-body {
-    font-family: "나눔바른고딕", "나눔고딕", "맑은고딕", "Sans-Serif";
-    font-size: 14px;
-
-    margin: 0;
-}
-
-h1, h2, h3, h4, h5, h6 {
-    border-bottom: 1px solid gainsboro;
-    
-    padding-bottom: 10px;
-}
-
-h1.blank, h2.blank, h3.blank, h4.blank, h5.blank, h6.blank {
-    border-bottom: none;
-
-    padding-bottom: 0px;
-}
-
-header#main {
-    border-bottom: 0;
-    
-    line-height: 50px;
-    
-    padding-left: 20px;
-    padding-right: 20px;
-    
-    background-color: #99ddff;
-}
-
-header#main a {
-    color: black;
-}
-
-header#main span#right {
-    float: right;
-}
-
-header#main form.not_mobile input.search {
-    display: inline-block;
-    
-    width: 200px;
-}
-
-header#main form.not_mobile {
-    display: inline-block;
-}
-
-header a#logo {
-    height: 52px;
-
-    display: inline-block;
-
-    padding-left: 20px;
-    padding-right: 20px;
-
-    margin-left: -20px;
-}
-
-header a#logo:hover {
-    background-color: #95c3df;
-}
-
-.top_cel {
-    display: inline-block;
-}
-
-.top_cel a {
-    display: inline-block;
-    
-    height: 52px;
-    
-    padding-left: 10px;
-    padding-right: 10px;
-}
-
-.top_cel a:hover {
-    background-color: #95c3df;
-}
-
-.top_cel_in {
-    position: absolute;
-    
-    background: #efd8f7;
-    
-    line-height: initial;
-
-    z-index: 1;
-}
-
-.top_cel_in a {
-    padding: 10px;
-    
-    display: block;
-    
-    height: inherit;
-
-    padding-top: 10px;
-    padding-bottom: 10px;
-}
-
-.top_cel_in a:hover {
-    background-color: #e3baf1;
-}
-
-div#menu {
-    margin-top: 10px;
-
-    margin-left: 6px;
-}
-
-.menu_item_link {
-    border: 0;
-    background-color: white;
-    
-    padding: 10px;
-    
-    display: inline-block;
-
-    margin-left: -6px;
-}
-
-.menu_item_link:hover {
-    background-color: #eee;
-}
-
-input.search {
-    height: 35px;
-    
-    vertical-align: middle;
-    
-    border: 0;
-    
-    padding: 10px;
-}
-
-input.only_mobile.search {
-    width: calc(100% - 70px);
-    
-    display: inline-block;
-}
-
-input.search:focus-visible {
-    outline: none;
-}
-
-button.search_button {
-    width: 35px;
-    height: 35px;
-    
-    vertical-align: middle;
-    
-    margin-left: -6px;
-    
-    border: 0;
-    
-    font-size: 20px;
-    
-    line-height: 0px;
-
-    cursor: pointer;
-}
-
-button.search_button#goto {
-    background-color: #ccffbb;
-}
-
-button.search_button#goto:hover {
-    background-color: #99bf8c;
-}
-
-button.search_button#search {
-    background-color: #ffeecc;
-}
-
-button.search_button#search:hover {
-    background-color: #bcb097;
-}
-
-aside {
-    width: 250px;
-    
-    float: left;
-    
-    display: block;
-    
-    padding-top: 10px;
-    padding-left: 20px;
-    padding-right: 20px;
-    
-    background-color: #ffeaee;
-    
-    height: calc(100vh - (50px + 20px));
-}
-
-aside button {
-    width: 25%;
-}
-
-aside .side_button {
-    border: 0;
-    background-color: white;
-    
-    padding: 10px;
-}
-
-aside .side_button:hover {
-    background-color: #eee;
-
-    cursor: pointer;
-}
-
-#side_button_2 {
-    border-left: 0;
-    border-right: 0;
-}
-
-#side_button_3 {
-    border-right: 0;
-}
-
-#side_content {
-    margin-top: 20px;
-}
-
-section {
-    width: calc(100% - (250px + 40px));
-    
-    display: inline-block;
-    
-    border-left: 0px solid;
-    
-    background-color: white;
-}
-
-header#section {
-    padding-top: 11px;
-    padding-bottom: 11px;
-    
-    border-bottom: 0px solid;
-    
-    background-color: #cceeff;
-}
-
-article.main {
-    max-width: 1000px;
-    
-    padding-left: 20px;
-    padding-right: 20px;
-    
-    margin: auto;
-}
-
-article.main#main_data {
-    padding-top: 20px;
-    
-    min-height: 400px;
-}
-
-article.main#title h1 {
-    margin: 0;
-}
-
-.only_mobile, header#main form.only_mobile {
-    display: none;
-}
-
-@media screen and (max-width: 1000px) {    
-    aside {        
-        float: none;
-        
-        border-top: 0px solid;
-        
-        width: calc(100vw - 40px);
-        height: 100%;
-        
-        padding: 20px;
-    }
-    
-    section {
-        width: 100vw;
-        
-        padding-bottom: 20px;
-        
-        border-left: 0;
-    }
-    
-    .not_mobile, header#main form.not_mobile {
-        display: none;
-    }
-    
-    .only_mobile, header#main form.only_mobile {
-        display: block;
-    }
-
-    .top_cel_in {
-        left: 0;
-
-        width: 100%;
-    }
-}
-
-footer {
-    border-top: 0px solid;
-    
-    margin-top: 20px;
-    background: #eee;
-    
-    padding: 20px;
-}
-
-footer.only_mobile {
-    margin-top: 0px;
-}
-
-input, textarea, button, select {
-    border: 1px solid #aaa;
-    
-    padding: 10px;
-    
-    background-color: white;
-}
-
-#main_data button:hover {
-    background-color: #eee;
-
-    cursor: pointer;
-}
-
-#opennamu_save_button {
-    background: antiquewhite;
+html {
+    background: #eee;
+}
+
+body {
+    font-family: "나눔바른고딕", "나눔고딕", "맑은고딕", "Sans-Serif";
+    font-size: 14px;
+
+    margin: 0;
+}
+
+h1, h2, h3, h4, h5, h6 {
+    border-bottom: 1px solid gainsboro;
+    
+    padding-bottom: 10px;
+}
+
+h1.blank, h2.blank, h3.blank, h4.blank, h5.blank, h6.blank {
+    border-bottom: none;
+
+    padding-bottom: 0px;
+}
+
+header#main {
+    border-bottom: 0;
+    
+    line-height: 50px;
+    
+    padding-left: 20px;
+    padding-right: 20px;
+    
+    background-color: #99ddff;
+}
+
+header#main a {
+    color: black;
+}
+
+header#main span#right {
+    float: right;
+}
+
+header#main form.not_mobile input.search {
+    display: inline-block;
+    
+    width: 200px;
+}
+
+header#main form.not_mobile {
+    display: inline-block;
+}
+
+header a#logo {
+    height: 52px;
+
+    display: inline-block;
+
+    padding-left: 20px;
+    padding-right: 20px;
+
+    margin-left: -20px;
+}
+
+header a#logo:hover {
+    background-color: #95c3df;
+}
+
+.top_cel {
+    display: inline-block;
+}
+
+.top_cel a {
+    display: inline-block;
+    
+    height: 52px;
+    
+    padding-left: 10px;
+    padding-right: 10px;
+}
+
+.top_cel a:hover {
+    background-color: #95c3df;
+}
+
+.top_cel_in {
+    position: absolute;
+    
+    background: #efd8f7;
+    
+    line-height: initial;
+
+    z-index: 1;
+}
+
+.top_cel_in a {
+    padding: 10px;
+    
+    display: block;
+    
+    height: inherit;
+
+    padding-top: 10px;
+    padding-bottom: 10px;
+}
+
+.top_cel_in a:hover {
+    background-color: #e3baf1;
+}
+
+div#menu {
+    margin-top: 10px;
+
+    margin-left: 6px;
+}
+
+.menu_item_link {
+    border: 0;
+    background-color: white;
+    
+    padding: 10px;
+    
+    display: inline-block;
+
+    margin-left: -6px;
+}
+
+.menu_item_link:hover {
+    background-color: #eee;
+}
+
+input.search {
+    height: 35px;
+    
+    vertical-align: middle;
+    
+    border: 0;
+    
+    padding: 10px;
+}
+
+input.only_mobile.search {
+    width: calc(100% - 70px);
+    
+    display: inline-block;
+}
+
+input.search:focus-visible {
+    outline: none;
+}
+
+button.search_button {
+    width: 35px;
+    height: 35px;
+    
+    vertical-align: middle;
+    
+    margin-left: -6px;
+    
+    border: 0;
+    
+    font-size: 20px;
+    
+    line-height: 0px;
+
+    cursor: pointer;
+}
+
+button.search_button#goto {
+    background-color: #ccffbb;
+}
+
+button.search_button#goto:hover {
+    background-color: #99bf8c;
+}
+
+button.search_button#search {
+    background-color: #ffeecc;
+}
+
+button.search_button#search:hover {
+    background-color: #bcb097;
+}
+
+aside {
+    width: 250px;
+    
+    float: left;
+    
+    display: block;
+    
+    padding-top: 10px;
+    padding-left: 20px;
+    padding-right: 20px;
+    
+    background-color: #ffeaee;
+    
+    height: calc(100vh - (50px + 20px));
+}
+
+aside button {
+    width: 25%;
+}
+
+aside .side_button {
+    border: 0;
+    background-color: white;
+    
+    padding: 10px;
+}
+
+aside .side_button:hover {
+    background-color: #eee;
+
+    cursor: pointer;
+}
+
+#side_button_2 {
+    border-left: 0;
+    border-right: 0;
+}
+
+#side_button_3 {
+    border-right: 0;
+}
+
+#side_content {
+    margin-top: 20px;
+}
+
+section {
+    width: calc(100% - (250px + 40px));
+    
+    display: inline-block;
+    
+    border-left: 0px solid;
+    
+    background-color: white;
+}
+
+header#section {
+    padding-top: 11px;
+    padding-bottom: 11px;
+    
+    border-bottom: 0px solid;
+    
+    background-color: #cceeff;
+}
+
+article.main {
+    max-width: 1000px;
+    
+    padding-left: 20px;
+    padding-right: 20px;
+    
+    margin: auto;
+}
+
+article.main#main_data {
+    padding-top: 20px;
+    
+    min-height: 400px;
+}
+
+article.main#title h1 {
+    margin: 0;
+}
+
+.only_mobile, header#main form.only_mobile {
+    display: none;
+}
+
+@media screen and (max-width: 1000px) {    
+    aside {        
+        float: none;
+        
+        border-top: 0px solid;
+        
+        width: calc(100vw - 40px);
+        height: 100%;
+        
+        padding: 20px;
+    }
+    
+    section {
+        width: 100vw;
+        
+        padding-bottom: 20px;
+        
+        border-left: 0;
+    }
+    
+    .not_mobile, header#main form.not_mobile {
+        display: none;
+    }
+    
+    .only_mobile, header#main form.only_mobile {
+        display: block;
+    }
+
+    .top_cel_in {
+        left: 0;
+
+        width: 100%;
+    }
+}
+
+footer {
+    border-top: 0px solid;
+    
+    margin-top: 20px;
+    background: #eee;
+    
+    padding: 20px;
+}
+
+footer.only_mobile {
+    margin-top: 0px;
+}
+
+#b_logo {
+    width: 100px;
+}
+
+input, textarea, button, select {
+    border: 1px solid #aaa;
+    
+    padding: 10px;
+    
+    background-color: white;
+}
+
+#main_data button:hover {
+    background-color: #eee;
+
+    cursor: pointer;
+}
+
+#opennamu_save_button {
+    background: antiquewhite;
 }

+ 234 - 234
views/ringo/index.html

@@ -1,235 +1,235 @@
-<!DOCTYPE html>
-<html lang="{{'language_tag'|load_lang}}">
-    <head>
-        <meta charset="utf-8">
-        {% if imp[3][0] != 0 %}
-            <title>{{imp[0]}} {{imp[3][0]}} - {{imp[1][0]}}</title>
-        {% else %}
-            <title>{{imp[0]}} - {{imp[1][0]}}</title>
-        {% endif %}
-        {{imp[3][3]|safe}}
-        <script src="https://code.iconify.design/1/1.0.3/iconify.min.js"></script>
-        <script src="/views/ringo/js/main.js?ver=2"></script>
-        <link rel="stylesheet" href="/views/ringo/css/main.css?ver=2">
-        <link rel="shortcut icon" href="/views/main_css/file/favicon.ico?ver=1">
-        {{imp[1][5]|safe}}
-        {{imp[2][3]|safe}}
-        {% if imp[3][0] != 0 %}
-            <meta name="title" content="{{imp[0]}}{{imp[3][0]}} - {{imp[1][0]}}">
-        {% else %}
-            <meta name="title" content="{{imp[0]}} - {{imp[1][0]}}">
-        {% endif %}
-        <meta name="keywords" content="{{imp[0]}}">
-        {% if imp[2][12] != 0 and imp[2][12] == 'w' %}
-            <meta name="description" content="{{data|cut_100}}">
-        {% endif %}
-        <meta name="viewport" content="width=device-width, initial-scale=1">
-    </head>
-    <body>
-        <header id="main">
-            <span id="left">
-                <a id="logo" href="/">{{imp[1][4]|safe}}</a>
-            </span>
-            <span id="right">
-                <div class="top_cel" id="recent_cel">
-                    <a href="javascript:ringo_opening('recent_cel_in');">
-                        <span class="iconify" data-icon="ic:baseline-access-time" data-inline="true"></span>
-                        <span class="not_mobile">{{'list'|load_lang}}</span>
-                        <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
-                    </a>
-                    <div class="top_cel_in" id="recent_cel_in" style="display: none;">
-                        <a href="/recent_changes">
-                            <span class="iconify" data-icon="ic:baseline-autorenew" data-inline="true"></span>
-                            {{'recent_change'|load_lang}}
-                        </a>
-                        <a href="/recent_discuss">
-                            <span class="iconify" data-icon="ic:baseline-add-comment" data-inline="true"></span>
-                            {{'recent_discussion'|load_lang}}
-                        </a>
-                        <a href="/vote">
-                            <span class="iconify" data-icon="ic:baseline-how-to-vote" data-inline="true"></span>
-                            {{'vote_list'|load_lang}}
-                        </a>
-                    </div>
-                </div>
-                <div class="top_cel" id="other_cel">
-                    <a href="javascript:ringo_opening('other_cel_in');">
-                        <span class="iconify" data-icon="ic:baseline-archive" data-inline="true"></span>
-                        <span class="not_mobile">{{'tool'|load_lang}}</span>
-                        <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
-                    </a>
-                    <div class="top_cel_in" id="other_cel_in" style="display: none;">
-                        <a href="/random">
-                            <span class="iconify" data-icon="ic:baseline-shuffle" data-inline="true"></span>
-                            {{'random'|load_lang}}
-                        </a>
-                        <a href="/other">
-                            <span class="iconify" data-icon="ic:baseline-build" data-inline="true"></span>
-                            {{'other_tool'|load_lang}}
-                        </a>
-                        {% if imp[2][9] != '0' %}
-                            <a href="/manager">
-                                <span class="iconify" data-icon="ic:baseline-how-to-reg" data-inline="true"></span>
-                                {{'admin_tool'|load_lang}}
-                            </a>
-                        {% endif %}
-                        <a href="/upload">
-                            <span class="iconify" data-icon="ic:baseline-cloud-upload" data-inline="true"></span>
-                            {{'upload'|load_lang}}
-                        </a>
-                        <a href="/change/skin_set">
-                            <span class="iconify" data-icon="ic:baseline-settings" data-inline="true"></span>
-                            {{'skin_setting'|load_lang}}
-                        </a>
-                    </div>
-                </div>
-                <div class="top_cel" id="user_cel">
-                    <a href="javascript:ringo_opening('user_cel_in');">
-                        {% if imp[2][2] == 1 %}
-                            {% if imp[2][8] != '0' %}
-                                <span class="iconify" data-icon="ic:baseline-add-alert" data-inline="true"></span>
-                            {% else %}
-                                <span class="iconify" data-icon="ic:baseline-person-add" data-inline="true"></span>
-                            {% endif %}
-                        {% else %}
-                            <span class="iconify" data-icon="ic:round-person-search" data-inline="true"></span>
-                        {% endif %}
-                        <span class="not_mobile">{{imp[2][5]}}</span>
-                        <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
-                    </a>
-                    <div class="top_cel_in" id="user_cel_in" style="display: none;">
-                        <a href="/user">
-                            <span class="iconify" data-icon="ic:baseline-account-box" data-inline="true"></span>
-                            {{'user_tool'|load_lang}}
-                        </a>
-                        <a href="/change">
-                            <span class="iconify" data-icon="ic:baseline-manage-accounts" data-inline="true"></span>
-                            {{'user_setting'|load_lang}}
-                        </a>
-                        {% if imp[2][2] == 1 %}
-                            <a href="/alarm">
-                                <span class="iconify" data-icon="ic:baseline-contact-mail" data-inline="true"></span>
-                                {{'alarm'|load_lang}} ({{imp[2][8]}})
-                            </a>
-                            <a href="/watch_list">
-                                <span class="iconify" data-icon="ic:round-preview" data-inline="true"></span>
-                                {{'watchlist'|load_lang}}
-                            </a>
-                            <a href="/star_doc">
-                                <span class="iconify" data-icon="ic:twotone-stars" data-inline="true"></span>
-                                {{'star_doc'|load_lang}}
-                            </a>
-                            <a href="/logout">
-                                <span class="iconify" data-icon="ic:baseline-logout" data-inline="true"></span>
-                                {{'logout'|load_lang}}
-                            </a>
-                        {% else %}
-                            <a href="/login">
-                                <span class="iconify" data-icon="ic:baseline-login" data-inline="true"></span>
-                                {{'login'|load_lang}}
-                            </a>
-                            <a href="/register">
-                                <span class="iconify" data-icon="ic:baseline-person-add-alt-1" data-inline="true"></span>
-                                {{'register'|load_lang}}
-                            </a>
-                        {% endif %}
-                    </div>
-                </div>
-                {% if imp[1][6] != '' %}
-                    <div class="top_cel" id="add_cel">
-                        <a href="javascript:ringo_opening('add_cel_in');">
-                            <span class="iconify" data-icon="ic:baseline-playlist-add" data-inline="true"></span>
-                            <span class="not_mobile">{{'added_menu'|load_lang}}</span>
-                            <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
-                        </a>
-                        <div class="top_cel_in" id="add_cel_in" style="display: none;">
-                            {% for added_top_menu in imp[1][6] %}
-                                <a href="{{added_top_menu[1]}}">
-                                    <span class="iconify" data-icon="ic:baseline-plus" data-inline="true"></span>
-                                    {{added_top_menu[0]}}
-                                </a>
-                            {% endfor %}
-                        </div>
-                    </div>
-                {% endif %}
-                <form class="not_mobile" method="post" action="/search" role="search" id="search">
-                    <input class="not_mobile search" name="search" placeholder="{{'search'|load_lang}}" autocomplete="off" type="search">
-                    <button type="submit" id="goto" formaction="/goto" class="search_button">
-                        <span class="iconify" data-icon="ic:round-find-in-page" data-inline="true"></span>
-                    </button>
-                    <button type="submit" id="search" formaction="/search" class="search_button">
-                        <span class="iconify" data-icon="ic:baseline-search" data-inline="true"></span>
-                    </button>
-                </form>
-            </span>
-            <form class="only_mobile" method="post" action="/search" role="search">
-                <input class="only_mobile search" name="search" placeholder="{{'search'|load_lang}}" autocomplete="off" type="search">
-                <button type="submit" id="goto" formaction="/goto" class="search_button">
-                    <span class="iconify" data-icon="ic:round-find-in-page" data-inline="true"></span>
-                </button>
-                <button type="submit" id="search" formaction="/search" class="search_button">
-                    <span class="iconify" data-icon="ic:baseline-search" data-inline="true"></span>
-                </button>
-            </form>
-        </header>
-        <section>
-            <header id="section">
-                <article class="main" id="title">
-                    <h1 class="blank">
-                        <span class="change_space">{{imp[0]}}</span>
-                        {% if imp[3][0] != 0 %}
-                            <sub>{{imp[3][0]}}</sub>
-                        {% endif %}
-                    </h1>
-                    {% if menu != 0 %}
-                        <div id="menu">
-                            {% for menu_data in menu %}
-                                {% if menu[0] == 1 %}
-                                    {% set menu_data_2 = menu_data[0] %}
-                                {% else %}
-                                    {% set menu_data_2 = '/' + menu_data[0] %}
-                                {% endif %}
-                                
-                                {% if menu_data|length > 2 and menu_data[2] == 1 %}
-                                    {% set menu_topic = 'topic_color' %}
-                                {% else %}
-                                    {% set menu_topic = '' %}
-                                {% endif %}
-                                
-                                <a class="menu_item_link" href="{{menu_data_2}}" id="{{menu_topic}}">
-                                    {{menu_data[1]}}
-                                </a>
-                            {% endfor %}
-                        </div>
-                    {% endif %}
-                </article>
-            </header>
-            <article class="main" id="main_data">
-                {{data|safe}}
-            </article>
-            <footer class="not_mobile">
-                <article class="main" id="footer">
-                    {{imp[1][1]|safe}}
-                    <br>
-                    <br>
-                    <a href="https://github.com/openNAMU/openNAMU"><img id="b_logo" src="/views/main_css/file/s_logo.png"></a>
-                </article>
-            </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>
-            <div id="side_content">
-                Loading...
-            </div>
-        </aside>
-        <footer class="only_mobile">
-            {{imp[1][1]|safe}}
-            <br>
-            <br>
-            <a href="https://github.com/openNAMU/openNAMU"><img id="b_logo" src="/views/main_css/file/s_logo.png"></a>
-        </footer>
-    </body>
+<!DOCTYPE html>
+<html lang="{{'language_tag'|load_lang}}">
+    <head>
+        <meta charset="utf-8">
+        {% if imp[3][0] != 0 %}
+            <title>{{imp[0]}} {{imp[3][0]}} - {{imp[1][0]}}</title>
+        {% else %}
+            <title>{{imp[0]}} - {{imp[1][0]}}</title>
+        {% endif %}
+        {{imp[3][3]|safe}}
+        <script src="https://code.iconify.design/1/1.0.3/iconify.min.js"></script>
+        <script src="/views/ringo/js/main.js?ver=2"></script>
+        <link rel="stylesheet" href="/views/ringo/css/main.css?ver=2">
+        <link rel="shortcut icon" href="/views/main_css/file/favicon.ico?ver=1">
+        {{imp[1][5]|safe}}
+        {{imp[2][3]|safe}}
+        {% if imp[3][0] != 0 %}
+            <meta name="title" content="{{imp[0]}}{{imp[3][0]}} - {{imp[1][0]}}">
+        {% else %}
+            <meta name="title" content="{{imp[0]}} - {{imp[1][0]}}">
+        {% endif %}
+        <meta name="keywords" content="{{imp[0]}}">
+        {% if imp[2][12] != 0 and imp[2][12] == 'w' %}
+            <meta name="description" content="{{data|cut_100}}">
+        {% endif %}
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+    </head>
+    <body>
+        <header id="main">
+            <span id="left">
+                <a id="logo" href="/">{{imp[1][4]|safe}}</a>
+            </span>
+            <span id="right">
+                <div class="top_cel" id="recent_cel">
+                    <a href="javascript:ringo_opening('recent_cel_in');">
+                        <span class="iconify" data-icon="ic:baseline-access-time" data-inline="true"></span>
+                        <span class="not_mobile">{{'list'|load_lang}}</span>
+                        <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
+                    </a>
+                    <div class="top_cel_in" id="recent_cel_in" style="display: none;">
+                        <a href="/recent_changes">
+                            <span class="iconify" data-icon="ic:baseline-autorenew" data-inline="true"></span>
+                            {{'recent_change'|load_lang}}
+                        </a>
+                        <a href="/recent_discuss">
+                            <span class="iconify" data-icon="ic:baseline-add-comment" data-inline="true"></span>
+                            {{'recent_discussion'|load_lang}}
+                        </a>
+                        <a href="/vote">
+                            <span class="iconify" data-icon="ic:baseline-how-to-vote" data-inline="true"></span>
+                            {{'vote_list'|load_lang}}
+                        </a>
+                    </div>
+                </div>
+                <div class="top_cel" id="other_cel">
+                    <a href="javascript:ringo_opening('other_cel_in');">
+                        <span class="iconify" data-icon="ic:baseline-archive" data-inline="true"></span>
+                        <span class="not_mobile">{{'tool'|load_lang}}</span>
+                        <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
+                    </a>
+                    <div class="top_cel_in" id="other_cel_in" style="display: none;">
+                        <a href="/random">
+                            <span class="iconify" data-icon="ic:baseline-shuffle" data-inline="true"></span>
+                            {{'random'|load_lang}}
+                        </a>
+                        <a href="/other">
+                            <span class="iconify" data-icon="ic:baseline-build" data-inline="true"></span>
+                            {{'other_tool'|load_lang}}
+                        </a>
+                        {% if imp[2][9] != '0' %}
+                            <a href="/manager">
+                                <span class="iconify" data-icon="ic:baseline-how-to-reg" data-inline="true"></span>
+                                {{'admin_tool'|load_lang}}
+                            </a>
+                        {% endif %}
+                        <a href="/upload">
+                            <span class="iconify" data-icon="ic:baseline-cloud-upload" data-inline="true"></span>
+                            {{'upload'|load_lang}}
+                        </a>
+                        <a href="/change/skin_set">
+                            <span class="iconify" data-icon="ic:baseline-settings" data-inline="true"></span>
+                            {{'skin_setting'|load_lang}}
+                        </a>
+                    </div>
+                </div>
+                <div class="top_cel" id="user_cel">
+                    <a href="javascript:ringo_opening('user_cel_in');">
+                        {% if imp[2][2] == 1 %}
+                            {% if imp[2][8] != '0' %}
+                                <span class="iconify" data-icon="ic:baseline-add-alert" data-inline="true"></span>
+                            {% else %}
+                                <span class="iconify" data-icon="ic:baseline-person-add" data-inline="true"></span>
+                            {% endif %}
+                        {% else %}
+                            <span class="iconify" data-icon="ic:round-person-search" data-inline="true"></span>
+                        {% endif %}
+                        <span class="not_mobile">{{imp[2][5]}}</span>
+                        <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
+                    </a>
+                    <div class="top_cel_in" id="user_cel_in" style="display: none;">
+                        <a href="/user">
+                            <span class="iconify" data-icon="ic:baseline-account-box" data-inline="true"></span>
+                            {{'user_tool'|load_lang}}
+                        </a>
+                        <a href="/change">
+                            <span class="iconify" data-icon="ic:baseline-manage-accounts" data-inline="true"></span>
+                            {{'user_setting'|load_lang}}
+                        </a>
+                        {% if imp[2][2] == 1 %}
+                            <a href="/alarm">
+                                <span class="iconify" data-icon="ic:baseline-contact-mail" data-inline="true"></span>
+                                {{'alarm'|load_lang}} ({{imp[2][8]}})
+                            </a>
+                            <a href="/watch_list">
+                                <span class="iconify" data-icon="ic:round-preview" data-inline="true"></span>
+                                {{'watchlist'|load_lang}}
+                            </a>
+                            <a href="/star_doc">
+                                <span class="iconify" data-icon="ic:twotone-stars" data-inline="true"></span>
+                                {{'star_doc'|load_lang}}
+                            </a>
+                            <a href="/logout">
+                                <span class="iconify" data-icon="ic:baseline-logout" data-inline="true"></span>
+                                {{'logout'|load_lang}}
+                            </a>
+                        {% else %}
+                            <a href="/login">
+                                <span class="iconify" data-icon="ic:baseline-login" data-inline="true"></span>
+                                {{'login'|load_lang}}
+                            </a>
+                            <a href="/register">
+                                <span class="iconify" data-icon="ic:baseline-person-add-alt-1" data-inline="true"></span>
+                                {{'register'|load_lang}}
+                            </a>
+                        {% endif %}
+                    </div>
+                </div>
+                {% if imp[1][6] != '' %}
+                    <div class="top_cel" id="add_cel">
+                        <a href="javascript:ringo_opening('add_cel_in');">
+                            <span class="iconify" data-icon="ic:baseline-playlist-add" data-inline="true"></span>
+                            <span class="not_mobile">{{'added_menu'|load_lang}}</span>
+                            <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
+                        </a>
+                        <div class="top_cel_in" id="add_cel_in" style="display: none;">
+                            {% for added_top_menu in imp[1][6] %}
+                                <a href="{{added_top_menu[1]}}">
+                                    <span class="iconify" data-icon="ic:baseline-plus" data-inline="true"></span>
+                                    {{added_top_menu[0]}}
+                                </a>
+                            {% endfor %}
+                        </div>
+                    </div>
+                {% endif %}
+                <form class="not_mobile" method="post" action="/search" role="search" id="search">
+                    <input class="not_mobile search" name="search" placeholder="{{'search'|load_lang}}" autocomplete="off" type="search">
+                    <button type="submit" id="goto" formaction="/goto" class="search_button">
+                        <span class="iconify" data-icon="ic:round-find-in-page" data-inline="true"></span>
+                    </button>
+                    <button type="submit" id="search" formaction="/search" class="search_button">
+                        <span class="iconify" data-icon="ic:baseline-search" data-inline="true"></span>
+                    </button>
+                </form>
+            </span>
+            <form class="only_mobile" method="post" action="/search" role="search">
+                <input class="only_mobile search" name="search" placeholder="{{'search'|load_lang}}" autocomplete="off" type="search">
+                <button type="submit" id="goto" formaction="/goto" class="search_button">
+                    <span class="iconify" data-icon="ic:round-find-in-page" data-inline="true"></span>
+                </button>
+                <button type="submit" id="search" formaction="/search" class="search_button">
+                    <span class="iconify" data-icon="ic:baseline-search" data-inline="true"></span>
+                </button>
+            </form>
+        </header>
+        <section>
+            <header id="section">
+                <article class="main" id="title">
+                    <h1 class="blank">
+                        <span class="change_space">{{imp[0]}}</span>
+                        {% if imp[3][0] != 0 %}
+                            <sub>{{imp[3][0]}}</sub>
+                        {% endif %}
+                    </h1>
+                    {% if menu != 0 %}
+                        <div id="menu">
+                            {% for menu_data in menu %}
+                                {% if menu[0] == 1 %}
+                                    {% set menu_data_2 = menu_data[0] %}
+                                {% else %}
+                                    {% set menu_data_2 = '/' + menu_data[0] %}
+                                {% endif %}
+                                
+                                {% if menu_data|length > 2 and menu_data[2] == 1 %}
+                                    {% set menu_topic = 'topic_color' %}
+                                {% else %}
+                                    {% set menu_topic = '' %}
+                                {% endif %}
+                                
+                                <a class="menu_item_link" href="{{menu_data_2}}" id="{{menu_topic}}">
+                                    {{menu_data[1]}}
+                                </a>
+                            {% endfor %}
+                        </div>
+                    {% endif %}
+                </article>
+            </header>
+            <article class="main" id="main_data">
+                {{data|safe}}
+            </article>
+            <footer class="not_mobile">
+                <article class="main" id="footer">
+                    {{imp[1][1]|safe}}
+                    <br>
+                    <br>
+                    <a href="https://github.com/openNAMU/openNAMU"><img id="b_logo" src="/views/main_css/file/s_logo.png"></a>
+                </article>
+            </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>
+            <div id="side_content">
+                Loading...
+            </div>
+        </aside>
+        <footer class="only_mobile">
+            {{imp[1][1]|safe}}
+            <br>
+            <br>
+            <a href="https://github.com/openNAMU/openNAMU"><img id="b_logo" src="/views/main_css/file/logo.svg"></a>
+        </footer>
+    </body>
 </html>

+ 4 - 4
views/ringo/info.json

@@ -1,5 +1,5 @@
-{
-    "name" : "Ringo",
-    "skin_ver" : "v0.1.2",
-    "require_ver" : "3500110"
+{
+    "name" : "Ringo",
+    "skin_ver" : "v0.1.2",
+    "require_ver" : "3500110"
 }

+ 49 - 49
views/ringo/js/main.js

@@ -1,50 +1,50 @@
-let ringo_save_data = '';
-let ringo_open = 0;
-let ringo_menu_list = [
-    'recent_cel',
-    'other_cel',
-    'user_cel',
-    'add_cel'
-];
-
-function ringo_opening(data) {
-    let element = [data];
-    
-    for(for_a in ringo_menu_list) {
-        if(ringo_menu_list[for_a] + '_in' !== data) {
-            element.push(ringo_menu_list[for_a] + '_in');
-        }
-    }
-
-    if((document.getElementById(element[0]).style.display == 'none' && ringo_open == 0) || ringo_save_data !== data) {
-        document.getElementById(element[0]).style.display = 'block';
-
-        for(for_a in element) {
-            if(for_a !== '0') { 
-                document.getElementById(element[for_a]).style.display = 'none';
-            }
-        }
-
-        ringo_open = 1;
-        ringo_save_data = data;
-
-        setTimeout(function() { ringo_open = 2; }, 100);
-    } else {
-        document.getElementById(element[0]).style.display = 'none';
-
-        ringo_open = 0
-    }
-}
-
-document.onclick = function(event) {
-    let cel_list = [];
-    for(for_a in ringo_menu_list) {
-        cel_list.push(document.getElementById(ringo_menu_list[for_a]));
-    }
-
-    if(ringo_save_data !== '' && ringo_open == 2) {
-        document.getElementById(ringo_save_data).style.display = 'none';
-
-        setTimeout(function() { ringo_open = 0; }, 100);
-    }
+let ringo_save_data = '';
+let ringo_open = 0;
+let ringo_menu_list = [
+    'recent_cel',
+    'other_cel',
+    'user_cel',
+    'add_cel'
+];
+
+function ringo_opening(data) {
+    let element = [data];
+    
+    for(for_a in ringo_menu_list) {
+        if(ringo_menu_list[for_a] + '_in' !== data) {
+            element.push(ringo_menu_list[for_a] + '_in');
+        }
+    }
+
+    if((document.getElementById(element[0]).style.display == 'none' && ringo_open == 0) || ringo_save_data !== data) {
+        document.getElementById(element[0]).style.display = 'block';
+
+        for(for_a in element) {
+            if(for_a !== '0') { 
+                document.getElementById(element[for_a]).style.display = 'none';
+            }
+        }
+
+        ringo_open = 1;
+        ringo_save_data = data;
+
+        setTimeout(function() { ringo_open = 2; }, 100);
+    } else {
+        document.getElementById(element[0]).style.display = 'none';
+
+        ringo_open = 0
+    }
+}
+
+document.onclick = function(event) {
+    let cel_list = [];
+    for(for_a in ringo_menu_list) {
+        cel_list.push(document.getElementById(ringo_menu_list[for_a]));
+    }
+
+    if(ringo_save_data !== '' && ringo_open == 2) {
+        document.getElementById(ringo_save_data).style.display = 'none';
+
+        setTimeout(function() { ringo_open = 0; }, 100);
+    }
 }

+ 48 - 48
views/tenshi/css/dark.css

@@ -1,49 +1,49 @@
-html, #main {
-    background: black;
-    color: white;
-}
-
-#top {
-    background: black;
-}
-
-.cel_in_cel, #background, div#pre_search, #toc, #cate, #redirect {
-    background: #1f2023;
-    border-color: #1f2023;
-}
-
-#bottom {
-    background: black;
-    color: white;
-}
-
-#top .cel_in_cel a {
-    color: white;
-}
-
-#mobile_search_input, #mobile_search_input::placeholder {
-    background: gray;
-    color: white;
-}
-
-#titlt_a {
-    color: white;
-}
-
-#search_input, textarea, input, button, select, #toc, #cate, #redirect { 
-    border-color: #1f2023; 
-    background: #1f2023;
-    color: white;
-}
-
-#search_input:hover, #search_input:focus {
-    color: white;
-}
-
-#search_input::placeholder {
-    color: white;
-}
-
-button#opennamu_save_button {
-    background: #083808;
+html, #main {
+    background: black;
+    color: white;
+}
+
+#top {
+    background: black;
+}
+
+.cel_in_cel, #background, div#pre_search, #toc, #cate, #redirect {
+    background: #1f2023;
+    border-color: #1f2023;
+}
+
+#bottom {
+    background: black;
+    color: white;
+}
+
+#top .cel_in_cel a {
+    color: white;
+}
+
+#mobile_search_input, #mobile_search_input::placeholder {
+    background: gray;
+    color: white;
+}
+
+#titlt_a {
+    color: white;
+}
+
+#search_input, textarea, input, button, select, #toc, #cate, #redirect { 
+    border-color: #1f2023; 
+    background: #1f2023;
+    color: white;
+}
+
+#search_input:hover, #search_input:focus {
+    color: white;
+}
+
+#search_input::placeholder {
+    color: white;
+}
+
+button#opennamu_save_button {
+    background: #083808;
 }

+ 472 - 468
views/tenshi/css/main.css

@@ -1,469 +1,473 @@
-body, textarea, input, pre, code {
-    font-family: 'Apple SD Gothic', '맑은고딕', 'Nanum Gothic', 'Noto Sans KR', sans-serif;
-}
-
-body {
-    max-width: 100%;
-    
-    word-break: break-all;
-    word-wrap: break-word;
-    
-    margin: 0;
-    
-    font-size: 14px;
-}
-
-select {
-    padding: 5px;
-}
-
-html {
-    background: #eeeeee;
-}
-
-#background {
-    background: #eeeeee;
-}
-
-#main {
-    margin: auto;
-    margin-top: -20px;
-    
-    padding: 20px;
-    padding-bottom: 20px;
-    
-    min-height: 350px;
-    
-    background: white;
-    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
-}
-
-#bottom {
-    width: 100%;
-    
-    background: #eeeeee;
-    
-    margin-top: 10px;
-    padding-bottom: 20px;
-}
-
-#bottom_main {
-    margin: auto;
-    
-    padding-top: 20px;
-}
-
-#tool {
-    float: right;
-    
-    border: none;
-}
-
-@media (min-width: 780px) and (max-width: 1180px) {
-    #main {
-        width: calc(100% - 45px);
-    }
-
-    #top_main, #bottom_main {
-        width: 90%;
-    }
-
-    .is_mobile {
-        display: none;
-    }
-}
-
-
-@media (min-width: 1180px) and (max-width: 2000px) {
-    #main, #top_main, #bottom_main {
-        width: 1000px;
-    }
-    
-    .is_mobile {
-        display: none;
-    }
-}
-
-@media (min-width: 2000px) {
-    #main, #top_main, #bottom_main {
-        width: 55%;
-    }
-
-    .is_mobile {
-        display: none;
-    }
-}
-
-@media (max-width: 780px) {
-    #main {
-        width: 90%;
-        
-        border-left: none;
-        border-right: none;
-    }
-
-    #top_main, #bottom_main {
-        width: 90%;
-    }
-
-    .not_mobile {
-        display: none;
-    }
-
-    #tool {
-        float: none;
-        
-        width: 90%;
-        
-        margin-top: 0px;
-        margin-bottom: 10px;
-    }
-}
-
-h1, h2, h3, h4, h5, h6 {
-    border-bottom: 1px solid gainsboro;
-    
-    padding-bottom: 10px;
-}
-
-#main_top {
-    width: 100%;
-}
-
-/* top */
-#top {
-    width: 100%;
-    line-height: 50px;
-    
-    position: relative;
-    top: 0;
-    left: 0;
-
-    background: #2780e3;
-    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
-}
-
-#top_main {
-    margin: auto;
-}
-
-#top_tool {
-    float: right;
-    color: white;
-}
-
-#top_tool_group {
-    display: inline-block;
-    
-    margin-right: 10px;
-}
-
-#top_tool_cel {
-    display: inline-block;
-    
-    margin-right: -12px;
-}
-
-.top_in_cel {
-    padding-left: 10px;
-    padding-right: 10px;
-    
-    transition: .2s ease-in-out;
-}
-
-.top_in_cel:hover {
-    background: #022988;
-    
-    transition: .2s ease-in-out;
-}
-
-#top_in_user {
-    margin-right: -13px;
-}
-
-#tool_cel {
-    display: inline-block;
-}
-
-#top a {
-    color: white;
-    
-    display: block;
-}
-
-#logo {
-    display: inline-block;
-}
-
-#logo a {
-    padding-left: 20px;
-    padding-right: 20px;
-}
-
-.cel_in_cel {
-    padding: 10px;
-    
-    line-height: initial;
-    
-    position: absolute;
-    
-    background: white;
-    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
-}
-
-#top .cel_in_cel a {
-    color: black;
-    
-    padding-left: 0;
-    padding-right: 0;
-}
-
-/* search */
-#search {
-    display: inline-block;
-    width: 300px;
-}
-
-#search_input {
-    width: 220px;
-    height: 35px;
-    
-    padding-left: 10px;
-    
-    background-color: white;
-    border: solid 2px #2780e3;
-    color: black;
-    box-shadow: none;
-    
-    transition: .2s ease-in-out;
-}
-
-#search_input::placeholder {
-    color: black;
-}
-
-#search_input:hover, #search_input:focus {
-    border: solid 2px #f4aba1;
-    
-    transition: .2s ease-in-out;
-}
-
-#pre_search {
-    padding: 10px;
-    border: 1px solid #4a4a4a;
-    width: 200px;
-    color: black;
-    margin-top: 5px;
-    background: white;
-    position: absolute;
-}
-
-#pre_search a {
-    color: dodgerblue;
-}
-
-#search button {
-    padding: 0;
-    
-    border: none;
-    
-    background: transparent;
-    box-shadow: none;
-    
-    color: white;
-}
-
-/* content */
-a {
-    color: dodgerblue;
-}
-
-#toc {
-    max-width: 300px;
-}
-
-/*
-pre, #toc, #cate, #redirect {
-    border: 1px solid #aaa;
-}
-*/
-
-#redirect, #cate, #toc, blockquote, button#opennamu_save_button, button#opennamu_preview_button {
-    border: 0;
-    
-    padding: 10px;
-    
-    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
-}
-
-button#opennamu_save_button {
-    background: #92f7f4;
-}
-
-button#opennamu_preview_button {
-    margin-left: 5px;
-}
-
-#cate {
-    background: #ccf5bc;
-}
-
-#redirect {
-    background: #d9edf7;
-}
-
-#toc {
-    background: lightyellow;
-    padding: 20px;
-}
-
-textarea, input, pre {    
-    border: 0;
-    
-    padding: 5px;
-    
-    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
-}
-
-pre {
-    padding: 10px;
-}
-
-#syntax {
-    background: #f0f0f0;
-    padding: 5px;
-}
-
-#syntax code {
-    background: transparent;
-}
-
-table {
-    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
-}
-
-button {
-    border: 0;
-    
-    padding: 10px;
-    
-    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
-    background: papayawhip;
-    
-    cursor: pointer;
-}
-
-input[type="checkbox"], input[type="radio"] {
-    box-shadow: None;
-    background: transparent;
-}
-
-select {
-    padding: 0;
-    padding-left: 5px;
-    padding-right: 5px;
-    
-    background: white;
-    border: 0;
-    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
-    
-    min-height: 30px;
-}
-
-/* nav_bar */
-#nav_bar {
-    z-index: 100;
-    
-    font-size: 25px;
-    
-    position: fixed;
-    bottom: 0;
-    right: 0;
-    
-    background: #fa635c;
-    box-shadow: -1px -1px 4px 0 rgba(0,0,0,0.16), -1px -1px 10px 0 rgba(0,0,0,0.12);
-    
-    text-align: center;
-}
-
-#go_toc {
-    display: inline-block;
-
-    padding-right: 10px;
-    padding-left: 10px;
-    padding-top: 5px;
-    padding-bottom: 5px;
-    
-    width: 25px;
-}
-
-#go_top {
-    display: inline-block;
-    
-    padding-right: 10px;
-    padding-left: 10px;
-    
-    width: 25px;
-}
-
-#go_bottom {
-    display: inline-block;
-
-    padding-right: 10px;
-    padding-left: 10px;
-    
-    width: 25px;
-}
-
-#nav_bar a {
-    color: white;
-}
-
-/* content */
-a:hover {
-    text-decoration: underline;
-}
-
-#top a:hover {
-    text-decoration: none;
-}
-
-h1#title {
-    margin-bottom: 10px;
-}
-
-div#last_edit {
-    margin-bottom: 20px;
-}
-
-@media (max-width: 600px) {
-    #top_tool {
-        float: none;
-        display: inline;
-    }
-
-    #top_tool_group {
-        margin-left: 20px;
-    }
-
-    #search {
-        width: 100%;
-    }
-
-    #search_input {
-        width: calc(100% - 60px);
-    }
-}
-
-#titlt_a {
-    color: initial;
-}
-
-blockquote {
-    background-color: #ffefff;
-
-    padding: 15px 40px 15px 15px;
-    border-left: 4px solid #ffb3ff;
-    
-    margin-bottom: 20px;
+body, textarea, input, pre, code {
+    font-family: 'Apple SD Gothic', '맑은고딕', 'Nanum Gothic', 'Noto Sans KR', sans-serif;
+}
+
+body {
+    max-width: 100%;
+    
+    word-break: break-all;
+    word-wrap: break-word;
+    
+    margin: 0;
+    
+    font-size: 14px;
+}
+
+select {
+    padding: 5px;
+}
+
+html {
+    background: #eeeeee;
+}
+
+#background {
+    background: #eeeeee;
+}
+
+#main {
+    margin: auto;
+    margin-top: -20px;
+    
+    padding: 20px;
+    padding-bottom: 20px;
+    
+    min-height: 350px;
+    
+    background: white;
+    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+}
+
+#bottom {
+    width: 100%;
+    
+    background: #eeeeee;
+    
+    margin-top: 10px;
+    padding-bottom: 20px;
+}
+
+#bottom_main {
+    margin: auto;
+    
+    padding-top: 20px;
+}
+
+#tool {
+    float: right;
+    
+    border: none;
+}
+
+@media (min-width: 780px) and (max-width: 1180px) {
+    #main {
+        width: calc(100% - 45px);
+    }
+
+    #top_main, #bottom_main {
+        width: 90%;
+    }
+
+    .is_mobile {
+        display: none;
+    }
+}
+
+
+@media (min-width: 1180px) and (max-width: 2000px) {
+    #main, #top_main, #bottom_main {
+        width: 1000px;
+    }
+    
+    .is_mobile {
+        display: none;
+    }
+}
+
+@media (min-width: 2000px) {
+    #main, #top_main, #bottom_main {
+        width: 55%;
+    }
+
+    .is_mobile {
+        display: none;
+    }
+}
+
+@media (max-width: 780px) {
+    #main {
+        width: 90%;
+        
+        border-left: none;
+        border-right: none;
+    }
+
+    #top_main, #bottom_main {
+        width: 90%;
+    }
+
+    .not_mobile {
+        display: none;
+    }
+
+    #tool {
+        float: none;
+        
+        width: 90%;
+        
+        margin-top: 0px;
+        margin-bottom: 10px;
+    }
+}
+
+h1, h2, h3, h4, h5, h6 {
+    border-bottom: 1px solid gainsboro;
+    
+    padding-bottom: 10px;
+}
+
+#main_top {
+    width: 100%;
+}
+
+/* top */
+#top {
+    width: 100%;
+    line-height: 50px;
+    
+    position: relative;
+    top: 0;
+    left: 0;
+
+    background: #2780e3;
+    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+}
+
+#top_main {
+    margin: auto;
+}
+
+#top_tool {
+    float: right;
+    color: white;
+}
+
+#top_tool_group {
+    display: inline-block;
+    
+    margin-right: 10px;
+}
+
+#top_tool_cel {
+    display: inline-block;
+    
+    margin-right: -12px;
+}
+
+.top_in_cel {
+    padding-left: 10px;
+    padding-right: 10px;
+    
+    transition: .2s ease-in-out;
+}
+
+.top_in_cel:hover {
+    background: #022988;
+    
+    transition: .2s ease-in-out;
+}
+
+#top_in_user {
+    margin-right: -13px;
+}
+
+#tool_cel {
+    display: inline-block;
+}
+
+#top a {
+    color: white;
+    
+    display: block;
+}
+
+#logo {
+    display: inline-block;
+}
+
+#logo a {
+    padding-left: 20px;
+    padding-right: 20px;
+}
+
+.cel_in_cel {
+    padding: 10px;
+    
+    line-height: initial;
+    
+    position: absolute;
+    
+    background: white;
+    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+}
+
+#top .cel_in_cel a {
+    color: black;
+    
+    padding-left: 0;
+    padding-right: 0;
+}
+
+/* search */
+#search {
+    display: inline-block;
+    width: 300px;
+}
+
+#search_input {
+    width: 220px;
+    height: 35px;
+    
+    padding-left: 10px;
+    
+    background-color: white;
+    border: solid 2px #2780e3;
+    color: black;
+    box-shadow: none;
+    
+    transition: .2s ease-in-out;
+}
+
+#search_input::placeholder {
+    color: black;
+}
+
+#search_input:hover, #search_input:focus {
+    border: solid 2px #f4aba1;
+    
+    transition: .2s ease-in-out;
+}
+
+#pre_search {
+    padding: 10px;
+    border: 1px solid #4a4a4a;
+    width: 200px;
+    color: black;
+    margin-top: 5px;
+    background: white;
+    position: absolute;
+}
+
+#pre_search a {
+    color: dodgerblue;
+}
+
+#search button {
+    padding: 0;
+    
+    border: none;
+    
+    background: transparent;
+    box-shadow: none;
+    
+    color: white;
+}
+
+/* content */
+a {
+    color: dodgerblue;
+}
+
+#toc {
+    max-width: 300px;
+}
+
+/*
+pre, #toc, #cate, #redirect {
+    border: 1px solid #aaa;
+}
+*/
+
+#redirect, #cate, #toc, blockquote, button#opennamu_save_button, button#opennamu_preview_button {
+    border: 0;
+    
+    padding: 10px;
+    
+    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+}
+
+button#opennamu_save_button {
+    background: #92f7f4;
+}
+
+button#opennamu_preview_button {
+    margin-left: 5px;
+}
+
+#cate {
+    background: #ccf5bc;
+}
+
+#redirect {
+    background: #d9edf7;
+}
+
+#toc {
+    background: lightyellow;
+    padding: 20px;
+}
+
+textarea, input, pre {    
+    border: 0;
+    
+    padding: 5px;
+    
+    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+}
+
+pre {
+    padding: 10px;
+}
+
+#syntax {
+    background: #f0f0f0;
+    padding: 5px;
+}
+
+#syntax code {
+    background: transparent;
+}
+
+table {
+    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+}
+
+button {
+    border: 0;
+    
+    padding: 10px;
+    
+    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+    background: papayawhip;
+    
+    cursor: pointer;
+}
+
+input[type="checkbox"], input[type="radio"] {
+    box-shadow: None;
+    background: transparent;
+}
+
+select {
+    padding: 0;
+    padding-left: 5px;
+    padding-right: 5px;
+    
+    background: white;
+    border: 0;
+    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+    
+    min-height: 30px;
+}
+
+/* nav_bar */
+#nav_bar {
+    z-index: 100;
+    
+    font-size: 25px;
+    
+    position: fixed;
+    bottom: 0;
+    right: 0;
+    
+    background: #fa635c;
+    box-shadow: -1px -1px 4px 0 rgba(0,0,0,0.16), -1px -1px 10px 0 rgba(0,0,0,0.12);
+    
+    text-align: center;
+}
+
+#go_toc {
+    display: inline-block;
+
+    padding-right: 10px;
+    padding-left: 10px;
+    padding-top: 5px;
+    padding-bottom: 5px;
+    
+    width: 25px;
+}
+
+#go_top {
+    display: inline-block;
+    
+    padding-right: 10px;
+    padding-left: 10px;
+    
+    width: 25px;
+}
+
+#go_bottom {
+    display: inline-block;
+
+    padding-right: 10px;
+    padding-left: 10px;
+    
+    width: 25px;
+}
+
+#nav_bar a {
+    color: white;
+}
+
+/* content */
+a:hover {
+    text-decoration: underline;
+}
+
+#top a:hover {
+    text-decoration: none;
+}
+
+h1#title {
+    margin-bottom: 10px;
+}
+
+div#last_edit {
+    margin-bottom: 20px;
+}
+
+@media (max-width: 600px) {
+    #top_tool {
+        float: none;
+        display: inline;
+    }
+
+    #top_tool_group {
+        margin-left: 20px;
+    }
+
+    #search {
+        width: 100%;
+    }
+
+    #search_input {
+        width: calc(100% - 60px);
+    }
+}
+
+#titlt_a {
+    color: initial;
+}
+
+blockquote {
+    background-color: #ffefff;
+
+    padding: 15px 40px 15px 15px;
+    border-left: 4px solid #ffb3ff;
+    
+    margin-bottom: 20px;
+}
+
+#b_logo {
+    width: 100px;
 }

+ 224 - 224
views/tenshi/index.html

@@ -1,225 +1,225 @@
-<!DOCTYPE html>
-<html lang="{{'language_tag'|load_lang}}">
-    <head>
-        <meta charset="utf-8">
-        {% if imp[3][0] != 0 %}
-            <title>{{imp[0]}} {{imp[3][0]}} - {{imp[1][0]}}</title>
-        {% else %}
-            <title>{{imp[0]}} - {{imp[1][0]}}</title>
-        {% endif %}
-        {{imp[3][3]|safe}}
-        <link rel="stylesheet" href="/views/tenshi/css/main.css?ver=20">
-        {% if request.cookies.get('main_css_darkmode', '') == '1' %}
-            <link rel="stylesheet" href="/views/tenshi/css/dark.css?ver=8">
-        {% endif %}
-        <script src="/views/tenshi/js/skin_set.js?ver=9"></script>
-        <script src="/views/tenshi/js/main.js?ver=3"></script>
-        <script src="https://code.iconify.design/1/1.0.3/iconify.min.js"></script>
-        <link rel="shortcut icon" href="/views/main_css/file/favicon.ico?ver=1">
-        {{imp[1][5]|safe}}
-        {{imp[2][3]|safe}}
-        {% if imp[3][0] != 0 %}
-            <meta name="title" content="{{imp[0]}}{{imp[3][0]}} - {{imp[1][0]}}">
-        {% else %}
-            <meta name="title" content="{{imp[0]}} - {{imp[1][0]}}">
-        {% endif %}
-        <meta name="keywords" content="{{imp[0]}}">
-        {% if imp[2][12] != 0 and imp[2][12] == 'w' %}
-            <meta name="description" content="{{data|cut_100}}">
-        {% endif %}
-        <meta name="viewport" content="width=device-width, initial-scale=1">
-    </head>
-    <body>
-        <div id="background">
-            <div id="top">
-                <div id="top_main">
-                    <div id="logo">
-                        <a href="/" class="top_in_cel">{{imp[1][4]|safe}}</a>
-                    </div>
-                    <div id="top_tool">
-                        <div id="top_tool_group">
-                            <div id="top_tool_cel">
-                                <a href="javascript:opening('recent_cel');" class="top_in_cel">
-                                    <span class="iconify" data-icon="ic:baseline-access-time" data-inline="true"></span>
-                                    <span class="not_mobile">{{'list'|load_lang}}</span>
-                                    <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
-                                </a>
-                                <div id="recent_cel" class="cel_in_cel" style="display: none;">
-                                    <a href="/recent_changes">
-                                        <span class="iconify" data-icon="ic:baseline-autorenew" data-inline="true"></span>
-                                        {{'recent_change'|load_lang}}
-                                    </a>
-                                    <hr>
-                                    <a href="/recent_discuss">
-                                        <span class="iconify" data-icon="ic:baseline-add-comment" data-inline="true"></span>
-                                        {{'recent_discussion'|load_lang}}
-                                    </a>
-                                    <hr>
-                                    <a href="/vote">
-                                        <span class="iconify" data-icon="ic:baseline-how-to-vote" data-inline="true"></span>
-                                        {{'vote_list'|load_lang}}
-                                    </a>
-                                </div>
-                            </div>
-                             
-                            <div id="top_tool_cel">
-                                <a href="javascript:opening('other_cel');" class="top_in_cel">
-                                    <span class="iconify" data-icon="ic:baseline-archive" data-inline="true"></span>
-                                    <span class="not_mobile">{{'tool'|load_lang}}</span>
-                                    <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
-                                </a>
-                                <div id="other_cel" class="cel_in_cel" style="display: none;">
-                                    <a href="/random">
-                                        <span class="iconify" data-icon="ic:baseline-shuffle" data-inline="true"></span>
-                                        {{'random'|load_lang}}
-                                    </a>
-                                    <hr>
-                                    <a href="/other">
-                                        <span class="iconify" data-icon="ic:baseline-build" data-inline="true"></span>
-                                        {{'other_tool'|load_lang}}
-                                    </a>
-                                    {% if imp[2][9] != '0' %}
-                                        <hr>
-                                        <a href="/manager">
-                                            <span class="iconify" data-icon="ic:baseline-how-to-reg" data-inline="true"></span>
-                                            {{'admin_tool'|load_lang}}
-                                        </a>
-                                    {% endif %}
-                                    <hr>
-                                    <a href="/upload">
-                                        <span class="iconify" data-icon="ic:baseline-cloud-upload" data-inline="true"></span>
-                                        {{'upload'|load_lang}}
-                                    </a>
-                                    <hr>
-                                    <a href="/skin_set">
-                                        <span class="iconify" data-icon="ic:baseline-settings" data-inline="true"></span>
-                                        {{'skin_setting'|load_lang}}
-                                    </a>
-                                </div>
-                            </div>
-                             
-                            <div id="top_tool_cel" id="top_in_user">
-                                <a href="/user" class="top_in_cel">
-                                    {% if imp[2][2] == 1 %}
-                                        {% if imp[2][8] != '0' %}
-                                            <span class="iconify" data-icon="ic:baseline-add-alert" data-inline="true"></span>
-                                        {% else %}
-                                            <span class="iconify" data-icon="ic:baseline-person" data-inline="true"></span>
-                                        {% endif %}
-                                    {% else %}
-                                        <span class="iconify" data-icon="ic:round-person-search" data-inline="true"></span>
-                                    {% endif %}
-                                    <span class="not_mobile">{{imp[2][5]}}</span>
-                                </a>
-                            </div>
-                        </div>
-                         
-                        <form method="post" action="/search" id="search" role="search">
-                            <input id="search_input" name="search" placeholder="{{'search'|load_lang}}" autocomplete="off" type="search">
-                            |
-                            <button type="submit" formaction="/goto">
-                                <span class="iconify" data-icon="ic:round-find-in-page" data-inline="true"></span>
-                            </button>
-                            |
-                            <button type="submit" formaction="/search">
-                                <span class="iconify" data-icon="ic:baseline-search" data-inline="true"></span>
-                            </button>
-                            <div id="pre_search" style="display: none;"></div>
-                        </form>
-                    </div>
-                </div>
-            </div>
-            <div id="main">
-                <div id="main_top">
-                    {% if menu != 0 %}
-                        <div id="tool" class="not_mobile">
-                            {% if menu[0] == 1 %}
-                                {% for sub_d in menu %}
-                                    <div id="tool_cel">
-                                        {% if sub_d|length > 2 and sub_d[2] == 1 %}
-                                            <a class="menu-item" href="{{sub_d[0]}}" id="topic_color">{{sub_d[1]}}</a>
-                                        {% else %}
-                                            <a class="menu-item" href="{{sub_d[0]}}">{{sub_d[1]}}</a>
-                                        {% endif %}
-                                    </div>
-                                    {% if menu[loop.index] %}
-                                        |
-                                    {% endif %}
-                                {% endfor %}
-                            {% else %}
-                                {% for sub_d in menu %}
-                                    <div id="tool_cel">
-                                        {% if sub_d|length > 2 and sub_d[2] == 1 %}
-                                            <a class="menu-item" href="/{{sub_d[0]}}" id="topic_color">{{sub_d[1]}}</a>
-                                        {% else %}
-                                            <a class="menu-item" href="/{{sub_d[0]}}">{{sub_d[1]}}</a>
-                                        {% endif %}
-                                    </div>
-                                    {% if menu[loop.index] %}
-                                        |
-                                    {% endif %}
-                                {% endfor %}
-                            {% endif %}
-                        </div>
-                    {% endif %}
-                    <h1 id="title">
-                        <a id="titlt_a" href="#"><span class="change_space">{{imp[0]}}</span></a>
-                        {% if imp[3][0] != 0 %}
-                            <sub>{{imp[3][0]}}</sub>
-                        {% endif %}
-                    </h1>
-                    <div id="last_edit">
-                        {% if imp[3][1] != 0 %}
-                            {{'last_edit_time'|load_lang}} : {{imp[3][1]}}
-                        {% endif %}
-                    </div>
-                    {% if menu != 0 %}
-                        <div id="tool" class="is_mobile">
-                            {% for sub_d in menu %}
-                                <div id="tool_cel">
-                                    {% if sub_d|length > 2 and sub_d[2] == 1 %}
-                                        <a class="menu-item" href="/{{sub_d[0]}}" id="topic_color">{{sub_d[1]}}</a>
-                                    {% else %}
-                                        <a class="menu-item" href="/{{sub_d[0]}}">{{sub_d[1]}}</a>
-                                    {% endif %}
-                                </div>
-                                {% if menu[loop.index] %}
-                                    |
-                                {% endif %}
-                            {% endfor %}
-                        </div>
-                    {% endif %}
-                </div>
-                <div id="main_data">
-                    {{data|safe}}
-                </div>
-            </div>
-        </div>
-        <div id="bottom">
-            <div id="bottom_main">
-                {{imp[1][1]|safe}}
-                <br>
-                <br>
-                <a href="https://github.com/openNAMU/openNAMU"><img id="b_logo" src="/views/main_css/file/s_logo.png"></a>
-            </div>
-        </div>
-        <div id="nav_bar">
-            <div id="go_top">
-                <a href="#top">
-                    <span class="iconify" data-icon="ic:baseline-arrow-upward" data-inline="true"></span>
-                </a>
-            </div>
-            <div id="go_bottom">
-                <a href="#bottom">
-                    <span class="iconify" data-icon="ic:baseline-arrow-downward" data-inline="true"></span>
-                </a>
-            </div>
-            <div id="go_toc">
-                <a href="#toc">
-                    <span class="iconify" data-icon="ic:baseline-list" data-inline="true"></span>
-                </a>
-            </div>
-        </div>
-        <script>window.addEventListener('DOMContentLoaded', skin_set);</script>
-    </body>
+<!DOCTYPE html>
+<html lang="{{'language_tag'|load_lang}}">
+    <head>
+        <meta charset="utf-8">
+        {% if imp[3][0] != 0 %}
+            <title>{{imp[0]}} {{imp[3][0]}} - {{imp[1][0]}}</title>
+        {% else %}
+            <title>{{imp[0]}} - {{imp[1][0]}}</title>
+        {% endif %}
+        {{imp[3][3]|safe}}
+        <link rel="stylesheet" href="/views/tenshi/css/main.css?ver=20">
+        {% if request.cookies.get('main_css_darkmode', '') == '1' %}
+            <link rel="stylesheet" href="/views/tenshi/css/dark.css?ver=8">
+        {% endif %}
+        <script src="/views/tenshi/js/skin_set.js?ver=9"></script>
+        <script src="/views/tenshi/js/main.js?ver=3"></script>
+        <script src="https://code.iconify.design/1/1.0.3/iconify.min.js"></script>
+        <link rel="shortcut icon" href="/views/main_css/file/favicon.ico?ver=1">
+        {{imp[1][5]|safe}}
+        {{imp[2][3]|safe}}
+        {% if imp[3][0] != 0 %}
+            <meta name="title" content="{{imp[0]}}{{imp[3][0]}} - {{imp[1][0]}}">
+        {% else %}
+            <meta name="title" content="{{imp[0]}} - {{imp[1][0]}}">
+        {% endif %}
+        <meta name="keywords" content="{{imp[0]}}">
+        {% if imp[2][12] != 0 and imp[2][12] == 'w' %}
+            <meta name="description" content="{{data|cut_100}}">
+        {% endif %}
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+    </head>
+    <body>
+        <div id="background">
+            <div id="top">
+                <div id="top_main">
+                    <div id="logo">
+                        <a href="/" class="top_in_cel">{{imp[1][4]|safe}}</a>
+                    </div>
+                    <div id="top_tool">
+                        <div id="top_tool_group">
+                            <div id="top_tool_cel">
+                                <a href="javascript:opening('recent_cel');" class="top_in_cel">
+                                    <span class="iconify" data-icon="ic:baseline-access-time" data-inline="true"></span>
+                                    <span class="not_mobile">{{'list'|load_lang}}</span>
+                                    <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
+                                </a>
+                                <div id="recent_cel" class="cel_in_cel" style="display: none;">
+                                    <a href="/recent_changes">
+                                        <span class="iconify" data-icon="ic:baseline-autorenew" data-inline="true"></span>
+                                        {{'recent_change'|load_lang}}
+                                    </a>
+                                    <hr>
+                                    <a href="/recent_discuss">
+                                        <span class="iconify" data-icon="ic:baseline-add-comment" data-inline="true"></span>
+                                        {{'recent_discussion'|load_lang}}
+                                    </a>
+                                    <hr>
+                                    <a href="/vote">
+                                        <span class="iconify" data-icon="ic:baseline-how-to-vote" data-inline="true"></span>
+                                        {{'vote_list'|load_lang}}
+                                    </a>
+                                </div>
+                            </div>
+                             
+                            <div id="top_tool_cel">
+                                <a href="javascript:opening('other_cel');" class="top_in_cel">
+                                    <span class="iconify" data-icon="ic:baseline-archive" data-inline="true"></span>
+                                    <span class="not_mobile">{{'tool'|load_lang}}</span>
+                                    <span class="iconify" data-icon="ic:baseline-arrow-drop-down" data-inline="true"></span>
+                                </a>
+                                <div id="other_cel" class="cel_in_cel" style="display: none;">
+                                    <a href="/random">
+                                        <span class="iconify" data-icon="ic:baseline-shuffle" data-inline="true"></span>
+                                        {{'random'|load_lang}}
+                                    </a>
+                                    <hr>
+                                    <a href="/other">
+                                        <span class="iconify" data-icon="ic:baseline-build" data-inline="true"></span>
+                                        {{'other_tool'|load_lang}}
+                                    </a>
+                                    {% if imp[2][9] != '0' %}
+                                        <hr>
+                                        <a href="/manager">
+                                            <span class="iconify" data-icon="ic:baseline-how-to-reg" data-inline="true"></span>
+                                            {{'admin_tool'|load_lang}}
+                                        </a>
+                                    {% endif %}
+                                    <hr>
+                                    <a href="/upload">
+                                        <span class="iconify" data-icon="ic:baseline-cloud-upload" data-inline="true"></span>
+                                        {{'upload'|load_lang}}
+                                    </a>
+                                    <hr>
+                                    <a href="/skin_set">
+                                        <span class="iconify" data-icon="ic:baseline-settings" data-inline="true"></span>
+                                        {{'skin_setting'|load_lang}}
+                                    </a>
+                                </div>
+                            </div>
+                             
+                            <div id="top_tool_cel" id="top_in_user">
+                                <a href="/user" class="top_in_cel">
+                                    {% if imp[2][2] == 1 %}
+                                        {% if imp[2][8] != '0' %}
+                                            <span class="iconify" data-icon="ic:baseline-add-alert" data-inline="true"></span>
+                                        {% else %}
+                                            <span class="iconify" data-icon="ic:baseline-person" data-inline="true"></span>
+                                        {% endif %}
+                                    {% else %}
+                                        <span class="iconify" data-icon="ic:round-person-search" data-inline="true"></span>
+                                    {% endif %}
+                                    <span class="not_mobile">{{imp[2][5]}}</span>
+                                </a>
+                            </div>
+                        </div>
+                         
+                        <form method="post" action="/search" id="search" role="search">
+                            <input id="search_input" name="search" placeholder="{{'search'|load_lang}}" autocomplete="off" type="search">
+                            |
+                            <button type="submit" formaction="/goto">
+                                <span class="iconify" data-icon="ic:round-find-in-page" data-inline="true"></span>
+                            </button>
+                            |
+                            <button type="submit" formaction="/search">
+                                <span class="iconify" data-icon="ic:baseline-search" data-inline="true"></span>
+                            </button>
+                            <div id="pre_search" style="display: none;"></div>
+                        </form>
+                    </div>
+                </div>
+            </div>
+            <div id="main">
+                <div id="main_top">
+                    {% if menu != 0 %}
+                        <div id="tool" class="not_mobile">
+                            {% if menu[0] == 1 %}
+                                {% for sub_d in menu %}
+                                    <div id="tool_cel">
+                                        {% if sub_d|length > 2 and sub_d[2] == 1 %}
+                                            <a class="menu-item" href="{{sub_d[0]}}" id="topic_color">{{sub_d[1]}}</a>
+                                        {% else %}
+                                            <a class="menu-item" href="{{sub_d[0]}}">{{sub_d[1]}}</a>
+                                        {% endif %}
+                                    </div>
+                                    {% if menu[loop.index] %}
+                                        |
+                                    {% endif %}
+                                {% endfor %}
+                            {% else %}
+                                {% for sub_d in menu %}
+                                    <div id="tool_cel">
+                                        {% if sub_d|length > 2 and sub_d[2] == 1 %}
+                                            <a class="menu-item" href="/{{sub_d[0]}}" id="topic_color">{{sub_d[1]}}</a>
+                                        {% else %}
+                                            <a class="menu-item" href="/{{sub_d[0]}}">{{sub_d[1]}}</a>
+                                        {% endif %}
+                                    </div>
+                                    {% if menu[loop.index] %}
+                                        |
+                                    {% endif %}
+                                {% endfor %}
+                            {% endif %}
+                        </div>
+                    {% endif %}
+                    <h1 id="title">
+                        <a id="titlt_a" href="#"><span class="change_space">{{imp[0]}}</span></a>
+                        {% if imp[3][0] != 0 %}
+                            <sub>{{imp[3][0]}}</sub>
+                        {% endif %}
+                    </h1>
+                    <div id="last_edit">
+                        {% if imp[3][1] != 0 %}
+                            {{'last_edit_time'|load_lang}} : {{imp[3][1]}}
+                        {% endif %}
+                    </div>
+                    {% if menu != 0 %}
+                        <div id="tool" class="is_mobile">
+                            {% for sub_d in menu %}
+                                <div id="tool_cel">
+                                    {% if sub_d|length > 2 and sub_d[2] == 1 %}
+                                        <a class="menu-item" href="/{{sub_d[0]}}" id="topic_color">{{sub_d[1]}}</a>
+                                    {% else %}
+                                        <a class="menu-item" href="/{{sub_d[0]}}">{{sub_d[1]}}</a>
+                                    {% endif %}
+                                </div>
+                                {% if menu[loop.index] %}
+                                    |
+                                {% endif %}
+                            {% endfor %}
+                        </div>
+                    {% endif %}
+                </div>
+                <div id="main_data">
+                    {{data|safe}}
+                </div>
+            </div>
+        </div>
+        <div id="bottom">
+            <div id="bottom_main">
+                {{imp[1][1]|safe}}
+                <br>
+                <br>
+                <a href="https://github.com/openNAMU/openNAMU"><img id="b_logo" src="/views/main_css/file/logo.svg"></a>
+            </div>
+        </div>
+        <div id="nav_bar">
+            <div id="go_top">
+                <a href="#top">
+                    <span class="iconify" data-icon="ic:baseline-arrow-upward" data-inline="true"></span>
+                </a>
+            </div>
+            <div id="go_bottom">
+                <a href="#bottom">
+                    <span class="iconify" data-icon="ic:baseline-arrow-downward" data-inline="true"></span>
+                </a>
+            </div>
+            <div id="go_toc">
+                <a href="#toc">
+                    <span class="iconify" data-icon="ic:baseline-list" data-inline="true"></span>
+                </a>
+            </div>
+        </div>
+        <script>window.addEventListener('DOMContentLoaded', skin_set);</script>
+    </body>
 </html>

+ 4 - 4
views/tenshi/info.json

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

+ 28 - 28
views/tenshi/js/main.js

@@ -1,29 +1,29 @@
-var save_data = '';
-var open = 0;
-
-function opening(data) {
-    save_data = data;
-    if(data === 'recent_cel') {
-        var element = document.getElementById(data);
-        var element_2 = document.getElementById('other_cel');
-    } else {
-        var element = document.getElementById(data);
-        var element_2 = document.getElementById('recent_cel');
-    }
-
-    if(element.style.display == 'none') {
-        element.style.display = 'block';
-        element_2.style.display = 'none';
-    } else {
-        element.style.display = 'none';
-    }
-
-    open = 1;
-    setTimeout(function() { open = 0; }, 100);
-}
-
-document.onclick = function(event) {
-    if(save_data !== '' && open == 0) {
-        document.getElementById(save_data).style.display = 'none';
-    }
+var save_data = '';
+var open = 0;
+
+function opening(data) {
+    save_data = data;
+    if(data === 'recent_cel') {
+        var element = document.getElementById(data);
+        var element_2 = document.getElementById('other_cel');
+    } else {
+        var element = document.getElementById(data);
+        var element_2 = document.getElementById('recent_cel');
+    }
+
+    if(element.style.display == 'none') {
+        element.style.display = 'block';
+        element_2.style.display = 'none';
+    } else {
+        element.style.display = 'none';
+    }
+
+    open = 1;
+    setTimeout(function() { open = 0; }, 100);
+}
+
+document.onclick = function(event) {
+    if(save_data !== '' && open == 0) {
+        document.getElementById(save_data).style.display = 'none';
+    }
 }

+ 52 - 52
views/tenshi/js/skin_set.js

@@ -1,53 +1,53 @@
-function regex_data(data) {
-    return new RegExp('(?:^|; )' + data + '=([^;]*)');
-}
-
-function get_post() {
-    check = document.getElementById('invert');
-    if(check.checked === true) {
-        document.cookie = 'main_css_darkmode=1;';
-    } else {
-        document.cookie = 'main_css_darkmode=0;';
-    }
-
-    history.go(0);
-}
-
-function skin_set() {
-    if(window.location.pathname === '/skin_set') {
-        var set_language = {
-            "en-US" : {
-                "save" : "Save",
-                "darkmode" : "Darkmode"
-            }, "ko-KR" : {
-                "save" : "저장",
-                "darkmode" : "다크모드"
-            }
-        }
-
-        var language = cookies.match(regex_data('language'))[1];
-        var user_language = cookies.match(regex_data('user_language'))[1];
-        if(user_language in set_language) {
-            language = user_language;
-        }
-
-        if(!language in set_language) {
-            language = "en-US";
-        }
-
-        var set_data = {};
-
-        if(
-            cookies.match(regex_data('main_css_darkmode')) &&
-            cookies.match(regex_data('main_css_darkmode'))[1] === '1'
-        ) {
-            set_data["invert"] = "checked";
-        }
-
-        document.getElementById("main_skin_set").innerHTML = ' \
-            <input ' + set_data["invert"] + ' type="checkbox" id="invert" name="invert" value="invert"> ' + set_language[language]['darkmode'] + ' \
-            <hr class="main_hr"> \
-            <button onclick="get_post();">' + set_language[language]['save'] + '</button> \
-        ';
-    }
+function regex_data(data) {
+    return new RegExp('(?:^|; )' + data + '=([^;]*)');
+}
+
+function get_post() {
+    check = document.getElementById('invert');
+    if(check.checked === true) {
+        document.cookie = 'main_css_darkmode=1;';
+    } else {
+        document.cookie = 'main_css_darkmode=0;';
+    }
+
+    history.go(0);
+}
+
+function skin_set() {
+    if(window.location.pathname === '/skin_set') {
+        var set_language = {
+            "en-US" : {
+                "save" : "Save",
+                "darkmode" : "Darkmode"
+            }, "ko-KR" : {
+                "save" : "저장",
+                "darkmode" : "다크모드"
+            }
+        }
+
+        var language = cookies.match(regex_data('language'))[1];
+        var user_language = cookies.match(regex_data('user_language'))[1];
+        if(user_language in set_language) {
+            language = user_language;
+        }
+
+        if(!language in set_language) {
+            language = "en-US";
+        }
+
+        var set_data = {};
+
+        if(
+            cookies.match(regex_data('main_css_darkmode')) &&
+            cookies.match(regex_data('main_css_darkmode'))[1] === '1'
+        ) {
+            set_data["invert"] = "checked";
+        }
+
+        document.getElementById("main_skin_set").innerHTML = ' \
+            <input ' + set_data["invert"] + ' type="checkbox" id="invert" name="invert" value="invert"> ' + set_language[language]['darkmode'] + ' \
+            <hr class="main_hr"> \
+            <button onclick="get_post();">' + set_language[language]['save'] + '</button> \
+        ';
+    }
 }

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor