소스 검색

Merge pull request #877 from 2du/master

버그 수정
잉여개발기 (SPDV) 6 년 전
부모
커밋
302913601e

+ 4 - 1
language/en-US.json

@@ -97,6 +97,7 @@
         "view" : "View",
         "content" : "Content",
         "off" : "Off",
+        "unset" : "Unset",
         "delete_admin_group": "Delete admin group",
         "_comment_1.1_" : "Time",
             "second" : "Second(s)",
@@ -248,6 +249,7 @@
                 "register_text" : "Terms of sign-up",
                 "non_login_alert" : "Non-login alert",
                 "edit_bottom_text" : "Editing textarea bottom notice",
+                "copyright_checkbox_text" : "Copyright Agreenment text as checkbox",
                 "check_key_text" : "Check authentication key notice",
                 "email_title" : "Email subject",
                 "email_text" : "Email content",
@@ -369,5 +371,6 @@
             "too_many_dec_error" : "This feature is not supported because there are too many documents.",
             "application_not_found" : "Application not found",
             "invalid_password_error" : "The Password or ID is invalid.",
-            "watchlist_overflow_error": "You cannot add more than ten documents."
+            "watchlist_overflow_error": "You cannot add more than ten documents.",
+            "copyright_disagreed" : "You have to agree copyright noticement to contribute"
 }

+ 5 - 1
language/ko-KR.json

@@ -173,6 +173,7 @@
     "restart": "재시작",
     "oauth_setting": "OAuth 설정",
     "edit_bottom_text": "편집창 하단 문구",
+    "copyright_checkbox_text": "저작권 동의 문구(체크박스 형태)",
     "authority": "권한",
     "document": "문서",
     "decument_exist_error": "이동하려는 문서에 이미 문서가 존재합니다.",
@@ -345,5 +346,8 @@
     "invalid_password_error" : "비밀번호 또는 아이디가 없습니다.",
     "accept_edit_request": "편집 요청 승인",
     "msg_whatchlist_lmt": "다음 개수만큼 추가할 수 있습니다",
-    "watchlist_overflow_error": "추가 한도를 초과했으므로 더 이상 추가할 수 없습니다. 필요없는 항목을 삭재하십시오."
+    "watchlist_overflow_error": "추가 한도를 초과했으므로 더 이상 추가할 수 없습니다. 필요없는 항목을 삭재하십시오.",
+    "unset" : "미설정",
+    "copyright_disagreed" : "저작권 동의문구에 체크하여야 합니다."
+
 }

+ 12 - 1
route/edit.py

@@ -29,6 +29,11 @@ def edit_2(conn, name):
         
         if edit_filter_do(content) == 1:
             return re_error('/error/21')
+            
+        curs.execute(db_change('select data from other where name = "copyright_checkbox_text"'))
+        copyright_checkbox_text_d = curs.fetchall()
+        if copyright_checkbox_text_d and copyright_checkbox_text_d[0][0] != '' and flask.request.form.get('copyright_agreement', '') != 'yes':
+            return re_error('/error/29')
 
         content = savemark(content)
         
@@ -133,6 +138,12 @@ def edit_2(conn, name):
             b_text = '<hr class=\"main_hr\">' + sql_d[0][0]
         else:
             b_text = ''
+        
+        cccb_text = ''
+        curs.execute(db_change('select data from other where name = "copyright_checkbox_text"'))
+        sql_d = curs.fetchall()
+        if sql_d and sql_d[0][0] != '':
+            cccb_text = '<hr class=\"wmain_hr\"><input type="checkbox" name="copyright_agreement" value="yes">' + sql_d[0][0] + '<hr class=\"main_hr\">'
 
         curs.execute(db_change('select data from other where name = "edit_help"'))
         sql_d = curs.fetchall()
@@ -152,7 +163,7 @@ def edit_2(conn, name):
                     <hr class=\"main_hr\">
                     <input placeholder="''' + load_lang('why') + '''" name="send" type="text">
                     <hr class=\"main_hr\">
-                    ''' + captcha_get() + ip_warring() + '''
+                    ''' + captcha_get() + ip_warring() + cccb_text + '''
                     <button id="save" type="submit" onclick="go_save_zone = 1;">''' + save_button + '''</button>
                     <button id="preview" type="button" onclick="load_preview(\'''' + url_pas(name) + '\')">' + load_lang('preview') + '''</button>
                 </form>

+ 12 - 1
route/edit_req.py

@@ -51,6 +51,11 @@ def edit_req_2(conn, name):
             if edit_filter_do(content) == 1:
                 return re_error('/error/21')
 
+        curs.execute(db_change('select data from other where name = "copyright_checkbox_text"'))
+        copyright_checkbox_text_d = curs.fetchall()
+        if copyright_checkbox_text_d and copyright_checkbox_text_d[0][0] != '' and flask.request.form.get('copyright_agreement', '') != 'yes':
+            return re_error('/error/29')
+
         content = savemark(content)
 
         if old:
@@ -135,6 +140,12 @@ def edit_req_2(conn, name):
             b_text = '<hr class=\"main_hr\">' + sql_d[0][0]
         else:
             b_text = ''
+            
+        cccb_text = ''
+        curs.execute(db_change('select data from other where name = "copyright_checkbox_text"'))
+        sql_d = curs.fetchall()
+        if sql_d and sql_d[0][0] != '':
+            cccb_text = '<hr class=\"wmain_hr\"><input type="checkbox" name="copyright_agreement" value="yes">' + sql_d[0][0] + '<hr class=\"main_hr\">'
 
         curs.execute(db_change('select data from other where name = "edit_help"'))
         sql_d = curs.fetchall()
@@ -154,7 +165,7 @@ def edit_req_2(conn, name):
                     <hr class=\"main_hr\">
                     <input ''' + disable + ''' placeholder="''' + load_lang('why') + '''" name="send" type="text">
                     <hr class=\"main_hr\">
-                    ''' + captcha_get() + ip_warring() + '''
+                    ''' + captcha_get() + ip_warring() + cccb_text + '''
                     <button id="save" type="submit" onclick="go_save_zone = 1;">''' + save_button + '''</button>
                     <button id="preview" type="button" onclick="load_preview(\'''' + url_pas(name) + '\')">' + load_lang('preview') + '''</button>
                 </form>

+ 2 - 2
route/give_acl.py

@@ -71,7 +71,7 @@ def give_acl_2(conn, name):
         if re.search('^user:', name):
             acl_list = ['', 'user', 'all']
         else:
-            acl_list = ['', 'user', 'admin', 'owner', '50_edit', 'email']
+            acl_list = ['', 'all', 'user', 'admin', 'owner', '50_edit', 'email']
 
         curs.execute(db_change("select decu from acl where title = ?"), [name])
         acl_data = curs.fetchall()
@@ -114,7 +114,7 @@ def give_acl_2(conn, name):
                 <hr class=\"main_hr\">
                 <h2>''' + load_lang('explanation') + '''</h2>
                 <ul>
-                    <li>normal : ''' + load_lang('default') + '''</li>
+                    <li>normal : ''' + load_lang('unset') + '''</li>
                     <li>admin : ''' + load_lang('admin_acl') + '''</li>
                     <li>user : ''' + load_lang('member_acl') + '''</li>
                     <li>50_edit : ''' + load_lang('50_edit_acl') + '''</li>

+ 25 - 20
route/setting.py

@@ -202,6 +202,7 @@ def setting_2(conn, num):
             'contract',
             'no_login_warring',
             'edit_bottom_text',
+            'copyright_checkbox_text',
             'check_key_text',
             'email_title',
             'email_text',
@@ -210,8 +211,8 @@ def setting_2(conn, num):
             'reset_user_text',
             'error_401',
             'error_404',
-            'edit_help',
-            'approval_question'
+            'approval_question',
+            'edit_help'
         ]
         if flask.request.method == 'POST':
             for i in i_list:
@@ -255,40 +256,40 @@ def setting_2(conn, num):
                         <span>''' + load_lang('edit_bottom_text') + ''' (HTML)</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[2] + '''" value="''' + html.escape(d_list[2]) + '''">
-                        <hr>
-                        <span>''' + load_lang('check_key_text') + ''' (HTML)</span>
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('copyright_checkbox_text') + ''' (HTML)</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[3] + '''" value="''' + html.escape(d_list[3]) + '''">
-                        <hr>
-                        <span>''' + load_lang('email_title') + '''</span>
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('check_key_text') + ''' (HTML)</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[4] + '''" value="''' + html.escape(d_list[4]) + '''">
-                        <hr>
-                        <span>''' + load_lang('email_text') + '''</span>
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('email_title') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[5] + '''" value="''' + html.escape(d_list[5]) + '''">
-                        <hr>
-                        <span>''' + load_lang('email_insert_text') + '''</span>
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('email_text') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[6] + '''" value="''' + html.escape(d_list[6]) + '''">
-                        <hr>
-                        <span>''' + load_lang('password_search_text') + '''</span>
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('email_insert_text') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[7] + '''" value="''' + html.escape(d_list[7]) + '''">
-                        <hr>
-                        <span>''' + load_lang('reset_user_text') + '''</span>
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('password_search_text') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[8] + '''" value="''' + html.escape(d_list[8]) + '''">
-                        <hr>
-                        <span>''' + load_lang('error_401') + '''</span>
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('reset_user_text') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[9] + '''" value="''' + html.escape(d_list[9]) + '''">
-                        <hr>
-                        <span>''' + load_lang('error_404') + '''</span>
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('error_401') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[10] + '''" value="''' + html.escape(d_list[10]) + '''">
-                        <hr>
-                        <span>''' + load_lang('edit_help') + '''</span>
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('error_404') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[11] + '''" value="''' + html.escape(d_list[11]) + '''">
                         <hr>
@@ -296,6 +297,10 @@ def setting_2(conn, num):
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[12] + '''" value="''' + html.escape(d_list[12]) + '''">
                         <hr class=\"main_hr\">
+                        <span>''' + load_lang('edit_help') + '''</span>
+                        <hr class=\"main_hr\">
+                        <input name="''' + i_list[12] + '''" value="''' + html.escape(d_list[12]) + '''">
+                        <hr class=\"main_hr\">
                         <button id="save" type="submit">''' + load_lang('save') + '''</button>
                         <hr>
                         <ul>

+ 19 - 17
route/tool/func.py

@@ -201,7 +201,7 @@ def update(ver_num):
         print('Add init set')
         set_init()
 
-    if ver_num < 3160400:
+    if ver_num < 3160500:
         curs.execute(db_change('delete from cache_data'))
 
     conn.commit()
@@ -289,23 +289,20 @@ def pw_check(data, data2, type_d = 'no', id_d = ''):
 
 def captcha_post(re_data, num = 1):
     if num == 1:
-        if ip_or_user() != 0 and captcha_get() != '':
-            curs.execute(db_change('select data from other where name = "sec_re"'))
-            sec_re = curs.fetchall()
-            if sec_re and sec_re[0][0] != '':
-                try:
-                    data = urllib.request.urlopen('https://www.google.com/recaptcha/api/siteverify?secret=' + sec_re[0][0] + '&response=' + re_data)
-                except:
-                    pass
+        curs.execute(db_change('select data from other where name = "sec_re"'))
+        sec_re = curs.fetchall()
+        if sec_re and sec_re[0][0] != '' and ip_or_user() != 0 and captcha_get() != '':
+            try:
+                data = urllib.request.urlopen('https://www.google.com/recaptcha/api/siteverify?secret=' + sec_re[0][0] + '&response=' + re_data)
+            except:
+                pass
 
-                if data and data.getcode() == 200:
-                    json_data = json.loads(data.read().decode(data.headers.get_content_charset()))
-                    if json_data['success'] == True:
-                        return 0
-                    else:
-                        return 1
-                else:
+            if data and data.getcode() == 200:
+                json_data = json.loads(data.read().decode(data.headers.get_content_charset()))
+                if json_data['success'] == True:
                     return 0
+                else:
+                    return 1
             else:
                 return 0
         else:
@@ -813,7 +810,7 @@ def acl_check(name = 'test', tool = '', sub = 'test'):
     if ban_check() == 1:
         return 1
 
-    if tool != 'topic' and tool != 'render' and name:
+    if tool == '' and tool != 'render' and name:
         acl_c = re.search("^user:((?:(?!\/).)*)", name)
         if acl_c:
             acl_n = acl_c.groups()
@@ -883,6 +880,9 @@ def acl_check(name = 'test', tool = '', sub = 'test'):
 
         acl_data = curs.fetchall()
         if acl_data and acl_data[0][0] != 'normal':
+            if acl_data[0][0] == 'all':
+                return 1
+
             if acl_data[0][0] == 'user':
                 if ip_or_user(ip) == 1:
                     return 1
@@ -1171,6 +1171,8 @@ def re_error(data):
                 data = load_lang("invalid_password_error")
             elif num == 28:
                 data = load_lang('watchlist_overflow_error')
+            elif num == 29:
+                data = load_lang('copyright_disagreed')
             else:
                 data = '???'
 

+ 2 - 7
route/tool/mark.py

@@ -56,13 +56,8 @@ def render_do(title, data, num, include):
         if data[2] == []:
             curs.execute(db_change("insert into back (title, link, type) values ('test', ?, 'nothing')"), [title])
         else:
-            for data_in in data[2]:
-                try:
-                    curs.execute(db_change("insert into back (title, link, type) values (?, ?, ?)"), [data_in[1], data_in[0], data_in[2]])
-                except:
-                    pass
-
-                curs.execute(db_change("delete from back where title = ? and type = 'no'"), [title])
+            curs.executemany(db_change("insert into back (link, title, type) values (?, ?, ?)"), data[2])
+            curs.execute(db_change("delete from back where title = ? and type = 'no'"), [title])
 
         if back_num != 3:
             conn.commit()

+ 0 - 0
route/tool/set_mark/markdown.py


+ 4 - 1
route/view_raw.py

@@ -39,7 +39,10 @@ def view_raw_2(conn, name, topic_num, num):
         v_name = load_lang('discussion_raw')
         sub = ' (#' + str(num) + ')'
 
-        menu = [['topic/' + url_pas(name) + '/sub/' + url_pas(sub_title) + '#' + str(num), load_lang('discussion')], ['topic/' + url_pas(name) + '/sub/' + url_pas(sub_title) + '/admin/' + str(num), load_lang('return')]]
+        menu = [
+            ['topic/' + url_pas(name) + '/sub/' + url_pas(sub_title) + '#' + str(num), load_lang('discussion')], 
+            ['topic/' + url_pas(name) + '/sub/' + url_pas(sub_title) + '/admin/' + str(num), load_lang('return')]
+        ]
     else:
         curs.execute(db_change("select data from data where title = ?"), [name])
 

+ 2 - 2
route/view_read.py

@@ -85,7 +85,7 @@ def view_read_2(conn, name):
         else:
             curs.execute(db_change("select data from data where title = ?"), [name])
 
-    if cache_data:
+    if cache_data and acl_check(name, 'render') != 1:
         end_data = cache_data[0][0]
     else:
         data = curs.fetchall()
@@ -108,7 +108,7 @@ def view_read_2(conn, name):
             data = else_data
         )
 
-        if not num:
+        if not num and acl_check(name, 'render') != 1:
             curs.execute(db_change("delete from cache_data where title = ?"), [name])
             if last_history_num:
                 curs.execute(db_change("insert into cache_data (title, data, id) values (?, ?, ?)"), [name, end_data, last_history_num[0][0]])

+ 4 - 4
version.json

@@ -1,11 +1,11 @@
 {
     "master" : {
-        "r_ver" : "v3.1.6-stable-04",
-        "c_ver" : "3160400",
+        "r_ver" : "v3.1.6-stable-05",
+        "c_ver" : "3160500",
         "s_ver" : "7"
     }, "stable" : {
-        "r_ver" : "v3.1.6-stable-04",
-        "c_ver" : "3160400",
+        "r_ver" : "v3.1.6-stable-05",
+        "c_ver" : "3160500",
         "s_ver" : "7"
     }
 }

+ 11 - 2
views/main_css/file/easter_egg.html

@@ -1,8 +1,17 @@
 <div id="easter_egg"></div>
 <script>
-    var random_num = String(Math.floor(Math.random() * 3));
+    var random_num = String(Math.floor(Math.random() * 7));
     var random_code = '';
-    if(random_num === '2') {
+    
+    if(random_num === '6') {
+        random_code = 'DzjjcMNrTHU';
+    } else if(random_num === '5') {
+        random_code = 'xpg2Ag-xt_c';
+    } else if(random_num === '4') {
+        random_code = 'IKIoAlhQV-c';
+    } else if(random_num === '3') {
+        random_code = 'MLOvyLsYJvo';
+    } else if(random_num === '2') {
         random_code = 'Fsppuynb440';
     } else if(random_num === '1') {
         random_code = 'DbTIoBK9Wvo';

+ 2 - 2
views/marisa/index.html

@@ -11,7 +11,7 @@
         <link rel="stylesheet" href="/views/marisa/css/main.css?ver=7">
         <script src="/views/marisa/js/skin_set.js?ver=3"></script>
         <script src="/views/marisa/js/main.js?ver=3"></script>
-        <script>window.onload = function () { skin_set(); }</script>
+        <script>window.onload = function () { skin_set(); main_load(); }</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}}
@@ -101,7 +101,7 @@
                         </div>
                         <form method="post" action="/search" id="search" role="search">
-                            <input id="search_input" name="search" onclick="view_search();" placeholder="{{'search'|load_lang}}" autocomplete="off" type="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>

+ 1 - 1
views/marisa/info.json

@@ -1,5 +1,5 @@
 {
     "name" : "Marisa",
-    "skin_ver" : "v1.1.7",
+    "skin_ver" : "v1.1.8",
     "require_ver" : "7"
 }

+ 109 - 60
views/marisa/js/skin_set.js

@@ -1,5 +1,5 @@
 function get_post() {
-    check = document.getElementById('strike');
+    var check = document.getElementById('strike');
     if(check.value === 'normal') {
         document.cookie = 'del_strike=0;';
     } else if(check.value === 'change') {
@@ -31,11 +31,18 @@ function get_post() {
         document.cookie = 'invert=0;';
     }
 
+    check = document.getElementById('category');
+    if(check.value === 'bottom') {
+        document.cookie = 'category_set=0;';
+    } else {
+        document.cookie = 'category_set=1;';
+    }
+
     history.go(0);
 }
 
 function main_load() {
-    head_data = document.querySelector('head');
+    var head_data = document.querySelector('head');
     if(cookies.match(regex_data('del_strike'))) {
         if(cookies.match(regex_data('del_strike'))[1] === '1') {
             head_data.innerHTML += '<style>s { text-decoration: none; } s:hover { background-color: transparent; }</style>';
@@ -65,18 +72,33 @@ function main_load() {
     ) {
         head_data.innerHTML += '<link rel="stylesheet" href="/views/marisa/css/dark.css?ver=5">';
     }
+
+    if(
+        cookies.match(regex_data('category_set')) &&
+        cookies.match(regex_data('category_set'))[1] === '1'
+    ) {
+        var get_category = document.getElementById('cate_all');
+        if(get_category) {
+            var backup_category = get_category.innerHTML;
+            var in_data = document.getElementById('in_data_0').innerHTML;
+            get_category.innerHTML = '';
+
+            backup_category = backup_category.replace('<hr>', '') + '<hr>';
+
+            document.getElementById('in_data_0').innerHTML = backup_category + in_data;
+        }
+    }
 }
 
 function regex_data(data) {
     return new RegExp('(?:^|; )' + data + '=([^;]*)');
 }
 
-cookies = document.cookie;
-main_load();
+var cookies = document.cookie;
 
 function skin_set() {
     if(window.location.pathname === '/skin_set') {
-        set_language = {
+        var set_language = {
             "en-US" : {
                 "default" : "Default",
                 "change_to_normal" : "Change to normal text",
@@ -86,7 +108,10 @@ function skin_set() {
                 "strike" : "Strike",
                 "bold" : "Bold",
                 "other" : "Other",
-                "darkmode" : "Darkmode"
+                "darkmode" : "Darkmode",
+                "where_category" : "Set category location",
+                "bottom" : "Bottom",
+                "top" : "Top"
             }, "ko-KR" : {
                 "default" : "기본값",
                 "change_to_normal" : "일반 텍스트로 변경",
@@ -96,12 +121,15 @@ function skin_set() {
                 "strike" : "취소선",
                 "bold" : "볼드체",
                 "other" : "기타",
-                "darkmode" : "다크모드"
+                "darkmode" : "다크모드",
+                "where_category" : "분류 위치 설정",
+                "bottom" : "아래",
+                "top" : "위"
             }
         }
 
-        language = cookies.match(regex_data('language'))[1];
-        user_language = cookies.match(regex_data('user_language'))[1];
+        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;
         }
@@ -110,63 +138,55 @@ function skin_set() {
             language = "en-US";
         }
 
-        data = document.getElementById("main_skin_set");
-        set_data = {};
-
-        if(cookies.match(regex_data('del_strike'))) {
-            if(cookies.match(regex_data('del_strike'))[1] === '0') {
-                set_data["strike"] = ' \
-                    <option value="normal">' + set_language[language]['default'] + '</option> \
-                    <option value="change">' + set_language[language]['change_to_normal'] + '</option> \
-                    <option value="delete">' + set_language[language]['delete'] + '</option> \
-                ';
-            } else if(cookies.match(regex_data('del_strike'))[1] === '1') {
-                set_data["strike"] = ' \
-                    <option value="change">' + set_language[language]['change_to_normal'] + '</option> \
-                    <option value="normal">' + set_language[language]['default'] + '</option> \
-                    <option value="delete">' + set_language[language]['delete'] + '</option> \
-                ';
+        var data = document.getElementById("main_skin_set");
+        var set_data = {};
+
+        var strike_list = [
+            ['0', 'normal', set_language[language]['default']],
+            ['1', 'change', set_language[language]['change_to_normal']],
+            ['2', 'delete', set_language[language]['delete']]
+        ];
+        set_data["strike"] = '';
+        var i = 0;
+        while(1) {
+            if(strike_list[i]) {
+                if(
+                    cookies.match(regex_data('del_strike')) && 
+                    cookies.match(regex_data('del_strike'))[1] === strike_list[i][0]
+                ) {
+                    set_data["strike"] = '<option value="' + strike_list[i][1] + '">' + strike_list[i][2] + '</option>' + set_data["strike"];
+                } else {
+                    set_data["strike"] += '<option value="' + strike_list[i][1] + '">' + strike_list[i][2] + '</option>';
+                }
+
+                i += 1;
             } else {
-                set_data["strike"] = ' \
-                    <option value="delete">' + set_language[language]['delete'] + '</option> \
-                    <option value="normal">' + set_language[language]['default'] + '</option> \
-                    <option value="change">' + set_language[language]['change_to_normal'] + '</option> \
-                ';
+                break;
             }
-        } else {
-            set_data["strike"] = ' \
-                <option value="normal">' + set_language[language]['default'] + '</option> \
-                <option value="change">' + set_language[language]['change_to_normal'] + '</option> \
-                <option value="delete">' + set_language[language]['delete'] + '</option> \
-            ';
         }
 
-        if(cookies.match(regex_data('del_bold'))) {
-            if(cookies.match(regex_data('del_bold'))[1] === '0') {
-                set_data["bold"] = ' \
-                    <option value="normal">' + set_language[language]['default'] + '</option> \
-                    <option value="change">' + set_language[language]['change_to_normal'] + '</option> \
-                    <option value="delete">' + set_language[language]['delete'] + '</option> \
-                ';
-            } else if(cookies.match(regex_data('del_bold'))[1] === '1') {
-                set_data["bold"] = ' \
-                    <option value="change">' + set_language[language]['change_to_normal'] + '</option> \
-                    <option value="normal">' + set_language[language]['default'] + '</option> \
-                    <option value="delete">' + set_language[language]['delete'] + '</option> \
-                ';
+        var bold_list = [
+            ['0', 'normal', set_language[language]['default']],
+            ['1', 'change', set_language[language]['change_to_normal']],
+            ['2', 'delete', set_language[language]['delete']]
+        ];
+        set_data["bold"] = '';
+        var i = 0;
+        while(1) {
+            if(bold_list[i]) {
+                if(
+                    cookies.match(regex_data('del_bold')) && 
+                    cookies.match(regex_data('del_bold'))[1] === bold_list[i][0]
+                ) {
+                    set_data["bold"] = '<option value="' + bold_list[i][1] + '">' + bold_list[i][2] + '</option>' + set_data["bold"];
+                } else {
+                    set_data["bold"] += '<option value="' + bold_list[i][1] + '">' + bold_list[i][2] + '</option>';
+                }
+
+                i += 1;
             } else {
-                set_data["bold"] = ' \
-                    <option value="delete">' + set_language[language]['delete'] + '</option> \
-                    <option value="normal">' + set_language[language]['default'] + '</option> \
-                    <option value="change">' + set_language[language]['change_to_normal'] + '</option> \
-                ';
+                break;
             }
-        } else {
-            set_data["bold"] = ' \
-                <option value="normal">' + set_language[language]['default'] + '</option> \
-                <option value="change">' + set_language[language]['change_to_normal'] + '</option> \
-                <option value="delete">' + set_language[language]['delete'] + '</option> \
-            ';
         }
 
         if(
@@ -183,6 +203,30 @@ function skin_set() {
             set_data["invert"] = "checked";
         }
 
+        var category_list = [
+            ['0', 'bottom', set_language[language]['bottom']],
+            ['1', 'top', set_language[language]['top']],
+        ];
+        set_data["category"] = '';
+        var i = 0;
+        while(1) {
+            if(category_list[i]) {
+                if(
+                    cookies.match(regex_data('category_set')) && 
+                    cookies.match(regex_data('category_set'))[1] === category_list[i][0]
+                ) {
+                    set_data["category"] = '<option value="' + category_list[i][1] + '">' + category_list[i][2] + '</option>' + set_data["category"];
+                } else {
+                    set_data["category"] += '<option value="' + category_list[i][1] + '">' + category_list[i][2] + '</option>';
+                }
+
+                i += 1;
+            } else {
+                break;
+            }
+        }
+
+
         data.innerHTML = ' \
             <h2>' + set_language[language]['strike'] + '</h2> \
             <hr class="main_hr"> \
@@ -193,6 +237,11 @@ function skin_set() {
             <select id="bold" name="bold"> \
                 ' + set_data["bold"] + ' \
             </select> \
+            <h2>' + set_language[language]['where_category'] + '</h2> \
+            <select id="category" name="category"> \
+                ' + set_data["category"] + ' \
+            </select> \
+            <hr class="main_hr"> \
             <h2>' + set_language[language]['other'] + '</h2> \
             <input ' + set_data["include"] + ' type="checkbox" id="include" name="include" value="include"> ' + set_language[language]['include_link'] + ' \
             <hr class="main_hr"> \