Răsfoiți Sursa

Merge pull request #1600 from openNAMU/dev

Dev
잉여개발기 (SPDV) 3 ani în urmă
părinte
comite
8cc2fdf22f
68 a modificat fișierele cu 548 adăugiri și 3230 ștergeri
  1. 3 3
      app.py
  2. 1 1
      route/api_user_info.py
  3. 19 12
      route/edit.py
  4. 2 2
      route/edit_delete_multiple.py
  5. 1 1
      route/edit_upload.py
  6. 1 1
      route/give_acl.py
  7. 1 1
      route/give_admin_groups.py
  8. 4 4
      route/give_user_ban.py
  9. 1 1
      route/give_user_check.py
  10. 1 1
      route/list_acl.py
  11. 1 1
      route/list_admin.py
  12. 1 1
      route/list_admin_group.py
  13. 25 15
      route/list_admin_use.py
  14. 1 1
      route/list_image_file.py
  15. 1 1
      route/list_long_page.py
  16. 1 1
      route/list_old_page.py
  17. 2 2
      route/list_please.py
  18. 4 4
      route/list_title_index.py
  19. 1 1
      route/list_user.py
  20. 1 1
      route/login_find.py
  21. 1 1
      route/main_func_setting.py
  22. 1 1
      route/main_func_setting_head.py
  23. 21 21
      route/main_func_setting_phrase.py
  24. 1 1
      route/main_func_setting_robot.py
  25. 3 3
      route/main_search_deep.py
  26. 1 1
      route/main_sys_update.py
  27. 6 6
      route/main_tool_admin.py
  28. 9 9
      route/main_tool_other.py
  29. 21 3
      route/recent_discuss.py
  30. 1 1
      route/recent_discuss_delete.py
  31. 2 2
      route/recent_history_add.py
  32. 3 3
      route/recent_history_tool.py
  33. 39 22
      route/tool/func.py
  34. 25 142
      route/tool/func_render.py
  35. 228 40
      route/tool/func_render_namumark.py
  36. 0 0
      route/tool/func_render_wiki.py
  37. 14 3
      route/topic.py
  38. 3 3
      route/topic_comment_tool.py
  39. 1 1
      route/topic_list.py
  40. 3 3
      route/topic_tool.py
  41. 4 2
      route/user_alarm.py
  42. 1 1
      route/user_count.py
  43. 5 5
      route/user_info.py
  44. 1 1
      route/user_setting_head.py
  45. 1 1
      route/user_watch_list.py
  46. 1 1
      route/view_down.py
  47. 1 1
      route/view_raw.py
  48. 8 8
      route/view_read.py
  49. 2 2
      route/view_xref.py
  50. 2 2
      route/vote_add.py
  51. 2 2
      route/vote_end.py
  52. 1 1
      route/vote_list.py
  53. 1 1
      route/vote_select.py
  54. 2 2
      version.json
  55. 42 52
      views/main_css/css/main.css
  56. 4 0
      views/main_css/css/sub/dark.css
  57. 0 2
      views/main_css/js/func/insert_user_info.js
  58. 1 73
      views/main_css/js/func/render_simple.js
  59. 0 95
      views/main_css/js/func/render_user_name.js
  60. 1 32
      views/main_css/js/load_skin_set.js
  61. 0 0
      views/main_css/js/render/html.js
  62. 0 687
      views/main_css/js/render/markdown.js
  63. 0 88
      views/main_css/js/render/wiki.js
  64. 0 1501
      views/main_css/js/render_onmark.js
  65. 0 340
      views/main_css/js/render_wiki.js
  66. 2 4
      views/main_css/js/route/thread.js
  67. 10 4
      views/ringo/css/main.css
  68. 1 1
      views/tenshi/css/main.css

+ 3 - 3
app.py

@@ -348,9 +348,8 @@ def list_admin():
     return list_admin_2()
 
 # /list/admin/auth_use
-@app.route('/admin_log', methods = ['POST', 'GET'])
-def list_admin_use():
-    return list_admin_use_2()
+app.route('/list/admin/auth_use', methods = ['POST', 'GET'])(list_admin_use)
+app.route('/list/admin/auth_use/<arg_search>/<int:arg_num>', methods = ['POST', 'GET'])(list_admin_use)
 
 # /list/user
 @app.route('/user_log')
@@ -471,6 +470,7 @@ app.route('/recent_discuss/open', defaults = { 'tool' : 'open' })(recent_discuss
 app.route('/recent_discuss/delete')(recent_discuss_delete)
 
 app.route('/thread/<int:topic_num>', methods = ['POST', 'GET'])(topic)
+app.route('/thread/0/<everything:doc_name>', defaults = { 'topic_num' : '0' }, methods = ['POST', 'GET'])(topic)
 app.route('/thread_preview/<int:topic_num>', defaults = { 'do_type' : 'preview' }, methods = ['POST'])(topic)
 app.route('/topic/<everything:name>', methods = ['POST', 'GET'])(topic_list)
 

+ 1 - 1
route/api_user_info.py

@@ -7,7 +7,7 @@ def api_user_info(name = ''):
         if flask.request.method == 'POST':
             try:
                 data_list = json.loads(flask.request.form.get('title_list', ''))
-                data_list = list(set(title_list))
+                data_list = list(set(data_list))
             except:
                 data_list = [name]
 

+ 19 - 12
route/edit.py

@@ -33,7 +33,7 @@ def edit(name = 'Test', section = 0, do_type = ''):
                 return re_error('/error/24')
     
             today = get_time()
-            content = flask.request.form.get('content', '').replace('\r\n', '\n')
+            content = flask.request.form.get('content', '').replace('\r', '')
             send = flask.request.form.get('send', '')
             agree = flask.request.form.get('copyright_agreement', '')
             
@@ -47,9 +47,9 @@ def edit(name = 'Test', section = 0, do_type = ''):
                 return re_error('/error/29')
             
             curs.execute(db_change("select data from data where title = ?"), [name])
-            old = curs.fetchall()
-            if old:
-                o_data = old[0][0].replace('\r\n', '\n')
+            db_data = curs.fetchall()
+            if db_data:
+                o_data = db_data[0][0].replace('\r', '')
 
                 if section != '':
                     if flask.request.form.get('doc_section_edit_apply', 'X') != 'X':
@@ -71,11 +71,18 @@ def edit(name = 'Test', section = 0, do_type = ''):
                                     pass
     
                 leng = leng_check(len(o_data), len(content))
-                
-                curs.execute(db_change("update data set data = ? where title = ?"), [content, name])
             else:
                 leng = '+' + str(len(content))
-    
+
+            render_set(
+                doc_name = name,
+                doc_data = content,
+                data_in = ''
+            )
+                
+            if db_data:
+                curs.execute(db_change("update data set data = ? where title = ?"), [content, name])
+            else:    
                 curs.execute(db_change("insert into data (title, data) values (?, ?)"), [name, content])
     
                 curs.execute(db_change('select data from other where name = "count_all_title"'))
@@ -134,7 +141,7 @@ def edit(name = 'Test', section = 0, do_type = ''):
                 curs.execute(db_change("select data from data where title = ?"), [load_title])
                 db_data = curs.fetchall()
                 data = db_data[0][0] if db_data else ''
-                data = data.replace('\r\n', '\n')
+                data = data.replace('\r', '')
 
                 if section != '':
                     curs.execute(db_change('select data from other where name = "markup"'))
@@ -177,7 +184,7 @@ def edit(name = 'Test', section = 0, do_type = ''):
                             count += 1
             else:
                 data = flask.request.form.get('content', '')
-                data = data.replace('\r\n', '\n')
+                data = data.replace('\r', '')
                 
                 data_section_where = flask.request.form.get('doc_section_data_where', '')
                 doc_section_edit_apply = flask.request.form.get('doc_section_edit_apply', '')
@@ -256,7 +263,7 @@ def edit(name = 'Test', section = 0, do_type = ''):
                 editor_display = ''
                 monaco_display = 'style="display: none;"'
                 add_get_file = ''
-                add_script = ''
+                add_script = 'opennamu_edit_turn_off_monaco();'
 
             if editor_top_text != '':
                 editor_top_text += '<hr class="main_hr">'
@@ -292,8 +299,8 @@ def edit(name = 'Test', section = 0, do_type = ''):
                         
                         <div>''' + edit_button('opennamu_edit_textarea', 'opennamu_monaco_editor') + '''</div>
                         
-                        <div id="opennamu_monaco_editor" class="content" ''' + monaco_display + '''></div>
-                        <textarea id="opennamu_edit_textarea" ''' + editor_display + ''' class="content" name="content" placeholder="''' + p_text + '''">''' + html.escape(data_section) + '''</textarea>
+                        <div id="opennamu_monaco_editor" class="opennamu_textarea_500" ''' + monaco_display + '''></div>
+                        <textarea id="opennamu_edit_textarea" ''' + editor_display + ''' class="opennamu_textarea_500" name="content" placeholder="''' + p_text + '''">''' + html.escape(data_section) + '''</textarea>
                         <hr class="main_hr">
                         
                         <input placeholder="''' + load_lang('why') + '''" name="send">

+ 2 - 2
route/edit_delete_multiple.py

@@ -19,7 +19,7 @@ def edit_delete_multiple():
             if do_edit_text_bottom_check_box_check(agree) == 1:
                 return re_error('/error/29')
             
-            all_title = re.findall(r'([^\n]+)\n', flask.request.form.get('content', '').replace('\r\n', '\n') + '\n')
+            all_title = re.findall(r'([^\n]+)\n', flask.request.form.get('content', '').replace('\r', '') + '\n')
             for name in all_title:
                 edit_delete.edit_delete(name)
 
@@ -29,7 +29,7 @@ def edit_delete_multiple():
                 imp = [load_lang('many_delete'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
                 data = '''
                     <form method="post">
-                        <textarea rows="25" placeholder="''' + load_lang('many_delete_help') + '''" name="content"></textarea>
+                        <textarea class="opennamu_textarea_500" placeholder="''' + load_lang('many_delete_help') + '''" name="content"></textarea>
                         <hr class="main_hr">
                         <input placeholder="''' + load_lang('why') + '''" name="send" type="text">
                         <hr class="main_hr">

+ 1 - 1
route/edit_upload.py

@@ -149,7 +149,7 @@ def edit_upload():
                             ''' + license_list + '''
                         </select>
                         <hr class="main_hr">
-                        <textarea rows="10" placeholder="''' + load_lang('other') + '''" name="f_lice">''' + upload_default + '''</textarea>
+                        <textarea class="opennamu_textarea_200" placeholder="''' + load_lang('other') + '''" name="f_lice">''' + upload_default + '''</textarea>
                         <hr class="main_hr">
                         ''' + captcha_get() + '''
                         <button id="opennamu_save_button" type="submit">''' + load_lang('save') + '''</button>

+ 1 - 1
route/give_acl.py

@@ -106,7 +106,7 @@ def give_acl_2(name):
 
             data += '''
                 <h2 id="exp">''' + load_lang('explanation') + '''</h2>
-                <ul class="inside_ul">
+                <ul class="opennamu_ul">
                     <li>normal : ''' + load_lang('unset') + '''</li>
                     <li>admin : ''' + load_lang('admin_acl') + '''</li>
                     <li>user : ''' + load_lang('member_acl') + '''</li>

+ 1 - 1
route/give_admin_groups.py

@@ -51,7 +51,7 @@ def give_admin_groups_2(name):
                         ''' + data + '''
                         <hr class="main_hr">
                         <h2>''' + load_lang('explanation') + '''</h2>
-                        <ul class="inside_ul">
+                        <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>

+ 4 - 4
route/give_user_ban.py

@@ -22,7 +22,7 @@ def give_user_ban(name = None, ban_type = ''):
             why = flask.request.form.get('why', '')
 
             if ban_type == 'multiple':
-                all_user = re.findall(r'([^\n]+)\n', flask.request.form.get('name', 'test').replace('\r\n', '\n') + '\n')
+                all_user = re.findall(r'([^\n]+)\n', flask.request.form.get('name', 'test').replace('\r', '') + '\n')
             else:
                 if name:
                     all_user = [name]
@@ -75,9 +75,9 @@ def give_user_ban(name = None, ban_type = ''):
                     action = 'action="/auth/give/ban/' + url_pas(name) + '"'
 
                 if end[0][0] == '':
-                    data = '<ul class="inside_ul"><li>' + load_lang('limitless') + '</li>'
+                    data = '<ul class="opennamu_ul"><li>' + load_lang('limitless') + '</li>'
                 else:
-                    data = '<ul class="inside_ul"><li>' + load_lang('period') + ' : ' + end[0][0] + '</li>'
+                    data = '<ul class="opennamu_ul"><li>' + load_lang('period') + ' : ' + end[0][0] + '</li>'
 
                 curs.execute(db_change("select block from rb where block = ? and login = 'O' and ongoing = '1'"), [name])
                 if curs.fetchall():
@@ -90,7 +90,7 @@ def give_user_ban(name = None, ban_type = ''):
             else:
                 if ban_type == 'multiple':
                     main_name = load_lang('multiple_ban')
-                    n_name = '<textarea rows="25" placeholder="' + load_lang('name_or_ip_or_regex_multiple') + '" name="name"></textarea><hr class="main_hr">'
+                    n_name = '<textarea class="opennamu_textarea_500" placeholder="' + load_lang('name_or_ip_or_regex_multiple') + '" name="name"></textarea><hr class="main_hr">'
                 else:
                     main_name = load_lang('ban')
                     n_name = '<input placeholder="' + load_lang('name_or_ip_or_regex') + '" value="' + (name if name else '') + '" name="name"><hr class="main_hr">'

+ 1 - 1
route/give_user_check.py

@@ -165,7 +165,7 @@ def give_user_check_2(name):
                 div += '<li><a href="/check/' + url_pas(i[0]) + '?type=simple">' + i[0] + '</a></li>'
 
             if div != '':
-                div = '<ul class="inside_ul">' + div + '</ul>'
+                div = '<ul class="opennamu_ul">' + div + '</ul>'
                 div += next_fix(
                     '/check/' + url_pas(name) + '?type=' + check_type + '&num=', 
                     num, 

+ 1 - 1
route/list_acl.py

@@ -6,7 +6,7 @@ def list_acl_2():
 
         num = int(number_check(flask.request.args.get('num', '1')))
         sql_num = (num * 50 - 50) if num * 50 > 0 else 0
-        div = '<ul class="inside_ul">'
+        div = '<ul class="opennamu_ul">'
 
         curs.execute(db_change(
             "select distinct title, data, type from acl where data != '' and not title like 'user:%' order by title desc limit ?, 50"

+ 1 - 1
route/list_admin.py

@@ -4,7 +4,7 @@ def list_admin_2():
     with get_db_connect() as conn:
         curs = conn.cursor()
 
-        div = '<ul class="inside_ul">'
+        div = '<ul class="opennamu_ul">'
 
         curs.execute(db_change(
             "select id, data from user_set where name = 'acl' and not data = 'user'"

+ 1 - 1
route/list_admin_group.py

@@ -4,7 +4,7 @@ def list_admin_group_2():
     with get_db_connect() as conn:
         curs = conn.cursor()
 
-        list_data = '<ul class="inside_ul">'
+        list_data = '<ul class="opennamu_ul">'
         org_acl_list = get_default_admin_group()
 
         curs.execute(db_change("select distinct name from alist order by name asc"))

+ 25 - 15
route/list_admin_use.py

@@ -1,39 +1,49 @@
 from .tool.func import *
 
-def list_admin_use_2():
+def list_admin_use(arg_num = 1, arg_search = 'normal'):
     with get_db_connect() as conn:
         curs = conn.cursor()
 
-        num = int(number_check(flask.request.args.get('num', '1')))
-        sql_num = (num * 50 - 50) if num * 50 > 0 else 0
+        sql_num = (arg_num * 50 - 50) if arg_num * 50 > 0 else 0
 
         if flask.request.method == 'POST':
-            return redirect('/admin_log?search=' + flask.request.form.get('search', 'normal'))
+            return redirect('/list/admin/auth_use/' + url_pas(flask.request.form.get('search', 'normal')) + '/1')
         else:
-            list_data = '<ul class="inside_ul">'
-
-            if flask.request.args.get('search', 'normal') == 'normal':
+            if arg_search == 'normal':
                 curs.execute(db_change("select who, what, time from re_admin order by time desc limit ?, 50"), [sql_num])
             else:
-                curs.execute(db_change("select who, what, time from re_admin where what like ? order by time desc limit ?, 50"), [
-                    flask.request.args.get('search', 'normal') + "%",
-                    sql_num
-                ])
+                curs.execute(
+                    db_change("select who, what, time from re_admin where what like ? order by time desc limit ?, 50"),
+                    [arg_search + "%", sql_num]
+                )
+
+            list_data = '<ul class="opennamu_ul">'
 
             get_list = curs.fetchall()
             for data in get_list:
-                list_data += '<li>' + ip_pas(data[0]) + ' / ' + html.escape(data[1]) + ' / ' + data[2] + '</li>'
+                do_data = data[1]
+
+                if ip_pas('127.0.0.1', 1) != '127.0.0.1': 
+                    do_data = do_data.split(' ')
+                    if do_data[0] in ('ban'):
+                        do_data = do_data[0]
+                    else:
+                        do_data = data[1]
+
+                list_data += '<li>' + ip_pas(data[0]) + ' | ' + html.escape(do_data) + ' | ' + data[2] + '</li>'
 
             list_data += '</ul>'
-            list_data += next_fix('/admin_log?num=', num, get_list)
+            list_data += next_fix('/list/admin/auth_use/' + url_pas(arg_search) + '/', arg_num, get_list)
 
             return easy_minify(flask.render_template(skin_check(),
                 imp = [load_lang('authority_use_list'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
                 data = '''
                     <form method="post">
-                        <input name="search" id="admin_log_search"> <button type="submit">''' + load_lang('search') + '''</button>
+                        <input name="search">
+                        <hr class="main_hr">
+                        <button type="submit">''' + load_lang('search') + '''</button>
                     </form>
-                    <hr class=\"main_hr\">
+                    <hr class="main_hr">
                 ''' + list_data,
                 menu = [['other', load_lang('return')]]
             ))

+ 1 - 1
route/list_image_file.py

@@ -7,7 +7,7 @@ def list_image_file_2():
         num = int(number_check(flask.request.args.get('num', '1')))
         sql_num = (num * 50 - 50) if num * 50 > 0 else 0
 
-        list_data = '<ul class="inside_ul">'
+        list_data = '<ul class="opennamu_ul">'
         back = ''
 
         curs.execute(db_change("select title from data where title like 'file:%' limit ?, 50"), [sql_num])

+ 1 - 1
route/list_long_page.py

@@ -8,7 +8,7 @@ def list_long_page_2(tool):
         if int(curs.fetchall()[0][0]) > 30000:
             return re_error('/error/25')
 
-        div = '<ul class="inside_ul">'
+        div = '<ul class="opennamu_ul">'
         select_data = 'desc' if tool == 'long_page' else 'asc'
         title = 'long_page' if tool == 'long_page' else 'short_page'
 

+ 1 - 1
route/list_old_page.py

@@ -12,7 +12,7 @@ def list_old_page():
         if int(curs.fetchall()[0][0]) > 30000:
             return re_error('/error/25')
         
-        div = '<ul class="inside_ul">'
+        div = '<ul class="opennamu_ul">'
         
         curs.execute(db_change('' + \
             'select h.title, max(h.date) from history as h where not (title like "user:%" or title like "category:%" or title like "file:%") and exists (select title from data where title = h.title) and not exists (select title from back where link = h.title and type = "redirect") group by h.title order by h.date asc limit ?, 50' + \

+ 2 - 2
route/list_please.py

@@ -11,14 +11,14 @@ def list_please_2():
         if int(curs.fetchall()[0][0]) > 30000:
             return re_error('/error/25')
 
-        div = '<ul class="inside_ul">'
+        div = '<ul class="opennamu_ul">'
 
         curs.execute(db_change("select distinct title, link from back where type = 'no' order by title asc limit ?, 50"), [sql_num])
         data_list = curs.fetchall()
         for data in data_list:
             div += '' + \
                 '<li>' + \
-                    '<a id="not_thing" href="/w/' + url_pas(data[0]) + '">' + html.escape(data[0]) + '</a> ' + \
+                    '<a class="opennamu_not_exist_link" href="/w/' + url_pas(data[0]) + '">' + html.escape(data[0]) + '</a> ' + \
                     '<a href="/w/' + url_pas(data[1]) + '">(' + html.escape(data[1]) + ')</a>' + \
                 '</li>' + \
             ''

+ 4 - 4
route/list_title_index.py

@@ -18,7 +18,7 @@ def list_title_index_2():
         curs.execute(db_change("select title from data order by title asc limit ?, ?"), [sql_num, num])
         title_list = curs.fetchall()
         if title_list:
-            data += '<hr class="main_hr"><ul class="inside_ul">'
+            data += '<hr class="main_hr"><ul class="opennamu_ul">'
 
         for list_data in title_list:
             data += '<li>' + str(all_list) + '. <a href="/w/' + url_pas(list_data[0]) + '">' + html.escape(list_data[0]) + '</a></li>'
@@ -51,11 +51,11 @@ def list_title_index_2():
                 data += '''
                     </ul>
                     <hr class="main_hr">
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li>''' + load_lang('all') + ' : ' + str(count_end[0]) + '''</li>
                     </ul>
                     <hr class="main_hr">
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li>''' + load_lang('category') + ' : ' + str(count_end[1]) + '''</li>
                         <li>''' + load_lang('user_document') + ' : ' + str(count_end[2]) + '''</li>
                         <li>''' + load_lang('file') + ' : ' + str(count_end[3]) + '''</li>
@@ -65,7 +65,7 @@ def list_title_index_2():
                 data += '''
                     </ul>
                     <hr class="main_hr">
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li>''' + load_lang('all') + ' : ' + all_title[0][0] + '''</li>
                 '''
 

+ 1 - 1
route/list_user.py

@@ -7,7 +7,7 @@ def list_user_2():
         num = int(number_check(flask.request.args.get('num', '1')))
         sql_num = (num * 50 - 50) if num * 50 > 0 else 0
 
-        list_data = '<ul class="inside_ul">'
+        list_data = '<ul class="opennamu_ul">'
 
         curs.execute(db_change("select id, data from user_set where name = 'date' order by data desc limit ?, 50"), [sql_num])
         user_list = curs.fetchall()

+ 1 - 1
route/login_find.py

@@ -5,7 +5,7 @@ def login_find():
         return easy_minify(flask.render_template(skin_check(),
             imp = [load_lang('password_search'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
             data = '''
-                <ul class="inside_ul">
+                <ul class="opennamu_ul">
                     <li><a href="/login/find/email">''' + load_lang('email') + '''</a></li>
                     <li><a href="/login/find/key">''' + load_lang('key') + '''</a></li>
                 </ul>

+ 1 - 1
route/main_func_setting.py

@@ -17,6 +17,6 @@ def main_func_setting():
 
         return easy_minify(flask.render_template(skin_check(),
             imp = [load_lang('setting'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
-            data = '<h2>' + load_lang('list') + '</h2><ul class="inside_ul">' + li_data + '</ul>',
+            data = '<h2>' + load_lang('list') + '</h2><ul class="opennamu_ul">' + li_data + '</ul>',
             menu = [['manager', load_lang('return')]]
         ))

+ 1 - 1
route/main_func_setting_head.py

@@ -101,7 +101,7 @@ def main_func_setting_head(num, skin_name = '', set_preview = 0):
                 data = '''
                     <form method="post">
                         ''' + start + '''
-                        <textarea rows="25" placeholder="''' + load_lang('enter_html') + '''" name="content" id="content">''' + html.escape(data) + '''</textarea>
+                        <textarea class="opennamu_textarea_500" placeholder="''' + load_lang('enter_html') + '''" name="content" id="content">''' + html.escape(data) + '''</textarea>
                         <hr class="main_hr">
                         ''' + (load_lang('main_css_warning') + '<hr class="main_hr">' if title == '_head' else '') + '''
                         <button id="opennamu_save_button" type="submit" ''' + form_action + '''>''' + load_lang('save') + '''</button>

+ 21 - 21
route/main_func_setting_phrase.py

@@ -62,69 +62,69 @@ def main_func_setting_phrase():
                 data = '''
                     <form method="post" id="opennamu_simple_render">
                         <h2>1. ''' + load_lang('register_text') + ''' (HTML)</h2>
-                        <textarea rows="3" name="''' + i_list[0] + '''">''' + html.escape(d_list[0]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[0] + '''">''' + html.escape(d_list[0]) + '''</textarea>
 
                         <h2>2. ''' + load_lang('non_login_alert') + ''' (HTML)</h2>
-                        <textarea rows="3" name="''' + i_list[1] + '''">''' + html.escape(d_list[1]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[1] + '''">''' + html.escape(d_list[1]) + '''</textarea>
 
                         <h2>3. ''' + load_lang('edit_bottom_text') + ''' (HTML)</h2>
-                        <textarea rows="3" name="''' + i_list[2] + '''">''' + html.escape(d_list[2]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[2] + '''">''' + html.escape(d_list[2]) + '''</textarea>
 
                         <h2>4. ''' + load_lang('copyright_checkbox_text') + ''' (HTML)</h2>
-                        <textarea rows="3" name="''' + i_list[3] + '''">''' + html.escape(d_list[3]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[3] + '''">''' + html.escape(d_list[3]) + '''</textarea>
 
                         <h2>5. ''' + load_lang('check_key_text') + ''' (HTML)</h2>
-                        <textarea rows="3" name="''' + i_list[4] + '''">''' + html.escape(d_list[4]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[4] + '''">''' + html.escape(d_list[4]) + '''</textarea>
 
                         <h2>6. ''' + load_lang('email_title') + '''</h2>
-                        <textarea rows="3" name="''' + i_list[5] + '''">''' + html.escape(d_list[5]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[5] + '''">''' + html.escape(d_list[5]) + '''</textarea>
 
                         <h2>7. ''' + load_lang('email_text') + '''</h2>
-                        <textarea rows="3" name="''' + i_list[6] + '''">''' + html.escape(d_list[6]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[6] + '''">''' + html.escape(d_list[6]) + '''</textarea>
 
                         <h2>8. ''' + load_lang('email_insert_text') + '''</h2>
-                        <textarea rows="3" name="''' + i_list[7] + '''">''' + html.escape(d_list[7]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[7] + '''">''' + html.escape(d_list[7]) + '''</textarea>
 
                         <h2>9. ''' + load_lang('password_search_text') + '''</h2>
-                        <textarea rows="3" name="''' + i_list[8] + '''">''' + html.escape(d_list[8]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[8] + '''">''' + html.escape(d_list[8]) + '''</textarea>
 
                         <h2>10. ''' + load_lang('reset_user_text') + '''</h2>
-                        <textarea rows="3" name="''' + i_list[9] + '''">''' + html.escape(d_list[9]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[9] + '''">''' + html.escape(d_list[9]) + '''</textarea>
 
                         <h2>11. ''' + load_lang('error_401') + '''</h2>
-                        <textarea rows="3" name="''' + i_list[10] + '''">''' + html.escape(d_list[10]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[10] + '''">''' + html.escape(d_list[10]) + '''</textarea>
 
                         <h2>12. ''' + load_lang('error_404') + '''</h2>
-                        <textarea rows="3" name="''' + i_list[11] + '''">''' + html.escape(d_list[11]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[11] + '''">''' + html.escape(d_list[11]) + '''</textarea>
 
                         <h2>13. ''' + load_lang('approval_question') + '''</h2>
                         <sup>(1)</sup>
                         <hr class="main_hr">
-                        <textarea rows="3" name="''' + i_list[12] + '''">''' + html.escape(d_list[12]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[12] + '''">''' + html.escape(d_list[12]) + '''</textarea>
 
                         <h2>14. ''' + load_lang('edit_help') + '''</h2>
-                        <textarea rows="3" name="''' + i_list[13] + '''">''' + html.escape(d_list[13]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[13] + '''">''' + html.escape(d_list[13]) + '''</textarea>
 
                         <h2>15. ''' + load_lang('upload_help') + ''' (HTML)</h2>
-                        <textarea rows="3" name="''' + i_list[14] + '''">''' + html.escape(d_list[14]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[14] + '''">''' + html.escape(d_list[14]) + '''</textarea>
 
                         <h2>16. ''' + load_lang('upload_default') + '''</h2>
-                        <textarea rows="3" name="''' + i_list[15] + '''">''' + html.escape(d_list[15]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[15] + '''">''' + html.escape(d_list[15]) + '''</textarea>
 
                         <h2>17. ''' + load_lang('bottom_text') + ''' (HTML)</h2>
-                        <textarea rows="3" name="''' + i_list[16] + '''">''' + html.escape(d_list[16]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[16] + '''">''' + html.escape(d_list[16]) + '''</textarea>
 
                         <h2>18. ''' + load_lang('topic_text') + '''</h2>
-                        <textarea rows="3" name="''' + i_list[17] + '''">''' + html.escape(d_list[17]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[17] + '''">''' + html.escape(d_list[17]) + '''</textarea>
                         
                         <h2>19. ''' + load_lang('phrase_user_page_admin') + ''' (HTML)</h2>
-                        <textarea rows="3" name="''' + i_list[18] + '''">''' + html.escape(d_list[18]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[18] + '''">''' + html.escape(d_list[18]) + '''</textarea>
                         
                         <h2>20. ''' + load_lang('phrase_user_page_owner') + ''' (HTML)</h2>
-                        <textarea rows="3" name="''' + i_list[19] + '''">''' + html.escape(d_list[19]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[19] + '''">''' + html.escape(d_list[19]) + '''</textarea>
 
                         <h2>21. ''' + load_lang('phrase_old_page_warring') + ''' (''' + load_lang('beta') + ''') (HTML)</h2>
-                        <textarea rows="3" name="''' + i_list[20] + '''">''' + html.escape(d_list[20]) + '''</textarea>
+                        <textarea class="opennamu_textarea_200" name="''' + i_list[20] + '''">''' + html.escape(d_list[20]) + '''</textarea>
 
                         <hr class="main_hr">
                         <button id="opennamu_save_button" type="submit">''' + load_lang('save') + '''</button>

+ 1 - 1
route/main_func_setting_robot.py

@@ -44,7 +44,7 @@ def main_func_setting_robot():
                     <a href="/robots.txt">(''' + load_lang('view') + ''')</a>
                     <hr class="main_hr">
                     <form method="post">
-                        <textarea rows="25" name="content">''' + html.escape(data) + '''</textarea>
+                        <textarea class="opennamu_textarea_500" name="content">''' + html.escape(data) + '''</textarea>
                         <hr class="main_hr">
                         <input type="checkbox" name="default" ''' + default_data + '''> ''' + load_lang('default') + '''
                         <hr class="main_hr">

+ 3 - 3
route/main_search_deep.py

@@ -27,16 +27,16 @@ def main_search_deep(name = 'Test', search_type = 'title', num = 1):
             div += ' <a href="/search/1/' + url_pas(name_new) + '">(' + name_new + ')</a>'
 
         curs.execute(db_change("select title from data where title = ?"), [name])
-        link_id = '' if curs.fetchall() else 'id="not_thing"'
+        link_id = '' if curs.fetchall() else 'class="opennamu_not_exist_link"'
 
         div += '''
-            <ul class="inside_ul">
+            <ul class="opennamu_ul">
                 <li>
                     <a ''' + link_id + ' href="/w/' + url_pas(name) + '">' + html.escape(name) + '''</a>
                 </li>
             </ul>
             <hr class="main_hr">
-            <ul class="inside_ul">
+            <ul class="opennamu_ul">
         '''
 
         if search_type == 'title':

+ 1 - 1
route/main_sys_update.py

@@ -47,7 +47,7 @@ def main_sys_update():
                 imp = [load_lang('update'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
                 data = load_lang('update_warning') + '''
                     <hr class="main_hr">
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li id="ver_send_2">''' + load_lang('version') + ''' : </li>
                         <li id="ver_send">''' + load_lang('lastest') + ''' : </li>
                     </ul>

+ 6 - 6
route/main_tool_admin.py

@@ -7,7 +7,7 @@ def main_tool_admin():
             data = '''
                 <div id="opennamu_simple_render">
                     <h2>1. ''' + load_lang('admin') + '''</h2>
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li><a href="/manager/2">''' + load_lang('acl_change') + '''</a></li>
                         <li><a href="/manager/3">''' + load_lang('check_user') + '''</a></li>
                         <li><a href="/auth/give/ban">''' + load_lang('ban') + '''</a></li>
@@ -16,7 +16,7 @@ def main_tool_admin():
                         <li><a href="/manager/5">''' + load_lang('authorize') + '''</a></li>
                     </ul>
                     <h2>2. ''' + load_lang('owner') + '''</h2>
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li><a href="/admin_group">''' + load_lang('admin_group_list') + '''</a></li>
                         <li><a href="/delete_multiple">''' + load_lang('many_delete') + '''</a></li>
                         <li><a href="/app_submit">''' + load_lang('application_list') + '''</a></li>
@@ -24,7 +24,7 @@ def main_tool_admin():
                         <li><a href="/setting">''' + load_lang('setting') + '''</a></li>
                     </ul>
                     <h3>2.1. ''' + load_lang('filter') + '''</h3>
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li><a href="/edit_filter">''' + load_lang('edit_filter_list') + '''</a></li>
                         <li><a href="/inter_wiki">''' + load_lang('interwiki_list') + '''</a></li>
                         <li><a href="/edit_top">''' + load_lang('edit_tool_list') + '''</a></li>
@@ -36,18 +36,18 @@ def main_tool_admin():
                         <li><a href="/filter/document/list">''' + load_lang('document_filter_list') + ''' (''' + load_lang('beta') + ''')</a></li>
                     </ul>
                     <h3>2.2. ''' + load_lang('server') + '''</h2>
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li><a href="/restart">''' + load_lang('wiki_restart') + '''</a></li>
                         <li><a href="/shutdown">''' + load_lang('wiki_shutdown') + '''</a></li>
                         <li><a href="/update">''' + load_lang('update') + '''</a></li>
                     </ul>
                     <h2>3. ''' + load_lang('version') + '''</h2>
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li id="ver_send_2">''' + load_lang('version') + ''' : </li>
                         <li id="ver_send">''' + load_lang('lastest') + ''' : </li>
                     </ul>
                     <h3>3.1. ''' + load_lang('skin_info') + '''</h3>
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li><a href="/api/skin_info?all=true">''' + load_lang('skin_info') + '''</a></li>
                         <div id="ver_send_3"></div>
                     </ul>

+ 9 - 9
route/main_tool_other.py

@@ -7,22 +7,22 @@ def main_tool_other():
             data = '''
                 <div id="opennamu_simple_render">
                     <h2>1. ''' + load_lang('record') + '''</h2>
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li><a href="/manager/6">''' + load_lang('edit_record') + '''</a></li>
                         <li><a href="/manager/7">''' + load_lang('discussion_record') + '''</a></li>
                     </ul>
                     <h2>2. ''' + load_lang('list') + '''</h2>
                     <h3>2.1. ''' + load_lang('admin') + '''</h3>
-                    <ul class="inside_ul">               
+                    <ul class="opennamu_ul">               
                         <li><a href="/admin_list">''' + load_lang('admin_list') + '''</a></li>
-                        <li><a href="/admin_log">''' + load_lang('authority_use_list') + '''</a></li>
+                        <li><a href="/list/admin/auth_use">''' + load_lang('authority_use_list') + '''</a></li>
                     </ul>
                     <h3>2.2. ''' + load_lang('discussion') + '''</h3>
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li><a href="/recent_discuss">''' + load_lang('recent_discussion') + '''</a></li>
                     </ul>
                     <h3>2.3. ''' + load_lang('document') + '''</h3>
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li><a href="/recent_changes">''' + load_lang('recent_change') + '''</a></li>
                         <li><a href="/title_index">''' + load_lang('all_document_list') + '''</a></li>
                         <li><a href="/acl_list">''' + load_lang('acl_document_list') + '''</a></li>
@@ -32,22 +32,22 @@ def main_tool_other():
                         <li><a href="/old_page">''' + load_lang('old_page') + '''</a></li>
                     </ul>
                     <h3>2.4. ''' + load_lang('user') + '''</h3>
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li><a href="/block_log">''' + load_lang('recent_ban') + '''</a></li>
                         <li><a href="/user_log">''' + load_lang('member_list') + '''</a></li>
                     </ul>
                     <h3>2.5. ''' + load_lang('other') + '''</h3>
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li><a href="/image_file_list">''' + load_lang('image_file_list') + '''</a></li>
                         <li><a href="/vote">''' + load_lang('vote_list') + '''</a></li>
                     </ul>
                     <h2>3. ''' + load_lang('other') + '''</h2>
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li><a href="/upload">''' + load_lang('upload') + '''</a></li>
                         <li><a href="/manager/10">''' + load_lang('search') + '''</a></li>
                     </ul>
                     <h2>4. ''' + load_lang('admin') + '''</h2>
-                    <ul class="inside_ul">
+                    <ul class="opennamu_ul">
                         <li><a href="/manager/1">''' + load_lang('admin_tool') + '''</a></li>
                     </ul>
                 </div>

+ 21 - 3
route/recent_discuss.py

@@ -27,8 +27,9 @@ def recent_discuss(tool):
                 <table id="main_table_set">
                     <tbody>
                         <tr id="main_table_top_tr">
-                            <td id="main_table_width_half">''' + load_lang('discussion_name') + '''</td>
-                            <td id="main_table_width_half">''' + load_lang('time') + '''</td>
+                            <td id="main_table_width">''' + load_lang('discussion_name') + '''</td>
+                            <td id="main_table_width">''' + load_lang('editor') + '''</td>
+                            <td id="main_table_width">''' + load_lang('time') + '''</td>
                         </tr>
                 '''
 
@@ -39,17 +40,34 @@ def recent_discuss(tool):
         else:
             curs.execute(db_change('select title, sub, date, code from rd where stop != "O" order by date asc limit 50'))
 
-        for data in curs.fetchall():
+        db_data = curs.fetchall()
+
+        last_editor = []
+        for for_a in db_data:
+            curs.execute(db_change("select ip from topic where code = ? order by id + 0 desc limit 1"), [for_a[3]])
+            db_data_2 = curs.fetchall()
+            if db_data_2:
+                last_editor += [db_data_2[0][0]]
+            else:
+                last_editor += ['']
+
+        last_editor_ip_pas = ip_pas(last_editor)
+
+        count = 0
+        for data in db_data:
             div += '' + \
                 '<tr>' + \
                     '<td>' + \
                         '<a href="/thread/' + data[3] + '">' + html.escape(data[1]) + '</a> ' + \
                         '<a href="/topic/' + url_pas(data[0]) + '">(' + html.escape(data[0]) + ')</a>' + \
                     '</td>' + \
+                    '<td>' + last_editor_ip_pas[last_editor[count]] + '</td>' + \
                     '<td>' + data[2] + '</td>' + \
                 '</tr>' + \
             ''
 
+            count += 1
+
         div += '' + \
                 '</tbody>' + \
             '</table>' + \

+ 1 - 1
route/recent_discuss_delete.py

@@ -6,7 +6,7 @@ def recent_discuss_delete():
         
         data_html = '' + \
             '<a href="/recent_discuss">(' + load_lang('normal') + ')</a>' + \
-            '<ul id="inside_ul">' + \
+            '<ul id="opennamu_ul">' + \
         ''
         count = 0
         

+ 2 - 2
route/recent_history_add.py

@@ -40,7 +40,7 @@ def recent_history_add(name = 'Test', do_type = ''):
             data_preview = ''
             if do_type == 'preview':
                 data = flask.request.form.get('content', '')
-                data = data.replace('\r\n', '\n')
+                data = data.replace('\r', '')
 
                 send = flask.request.form.get('send', '')
                 get_ip = flask.request.form.get('get_ip', '')
@@ -57,7 +57,7 @@ def recent_history_add(name = 'Test', do_type = ''):
                     <form method="post">                        
                         <div>''' + edit_button('opennamu_edit_textarea') + '''</div>
                         
-                        <textarea id="opennamu_edit_textarea" class="content" name="content" placeholder="''' + p_text + '''">''' + html.escape(data) + '''</textarea>
+                        <textarea id="opennamu_edit_textarea" class="opennamu_textarea_500" name="content" placeholder="''' + p_text + '''">''' + html.escape(data) + '''</textarea>
                         <hr class="main_hr">
                         
                         <input placeholder="''' + load_lang('why') + '''" name="send" value="''' + html.escape(send) + '''">

+ 3 - 3
route/recent_history_tool.py

@@ -8,7 +8,7 @@ def recent_history_tool(name = 'Test', rev = 1):
 
         data = '' + \
             '<h2>' + load_lang('tool') + '</h2>' + \
-            '<ul class="inside_ul">' + \
+            '<ul class="opennamu_ul">' + \
                 '<li><a href="/raw_rev/' + num + '/' + url_pas(name) + '">' + load_lang('raw') + '</a></li>' + \
         ''
 
@@ -24,7 +24,7 @@ def recent_history_tool(name = 'Test', rev = 1):
 
         if admin_check(6) == 1:
             data += '<h3>' + load_lang('admin') + '</h3>'
-            data += '<ul class="inside_ul">'
+            data += '<ul class="opennamu_ul">'
             curs.execute(db_change('' + \
                 'select title from history ' + \
                 'where title = ? and id = ? and hide = "O"' + \
@@ -40,7 +40,7 @@ def recent_history_tool(name = 'Test', rev = 1):
 
         if admin_check() == 1:
             data += '<h3>' + load_lang('owner') + '</h3>'
-            data += '<ul class="inside_ul">'
+            data += '<ul class="opennamu_ul">'
             data += '<li><a href="/history_delete/' + num + '/' + url_pas(name) + '">' + load_lang('history_delete') + '</li>'
             data += '<li><a href="/history_send/' + num + '/' + url_pas(name) + '">' + load_lang('send_edit') + '</li>'
             data += '</ul>'

+ 39 - 22
route/tool/func.py

@@ -8,6 +8,7 @@ import zipfile
 import shutil
 import logging
 import random
+import ipaddress
 
 import email.mime.text
 import email.utils
@@ -1041,7 +1042,7 @@ def wiki_css(data):
     data += ['' for _ in range(0, 3 - len(data))]
     
     data_css = ''
-    data_css_ver = '156'
+    data_css_ver = '169'
     
     # Func JS + Defer
     data_css += '<script src="/views/main_css/js/func/func.js?ver=' + data_css_ver + '"></script>'
@@ -1054,13 +1055,8 @@ def wiki_css(data):
     data_css += '<script defer src="/views/main_css/js/func/ie_end_of_life.js?ver=' + data_css_ver + '"></script>'
     data_css += '<script defer src="/views/main_css/js/func/shortcut.js?ver=' + data_css_ver + '"></script>'
     
-    data_css += '<script defer src="/views/main_css/js/func/render_user_name.js?ver=' + data_css_ver + '"></script>'
     data_css += '<script defer src="/views/main_css/js/func/render_simple.js?ver=' + data_css_ver + '"></script>'
     
-    # Render JS
-    data_css += '<script src="/views/main_css/js/render/markdown.js?ver=' + data_css_ver + '"></script>'
-    data_css += '<script src="/views/main_css/js/render/wiki.js?ver=' + data_css_ver + '"></script>'
-    
     # Route JS + Defer
     data_css += '<script defer src="/views/main_css/js/route/thread.js?ver=' + data_css_ver + '"></script>'
     
@@ -1068,14 +1064,9 @@ def wiki_css(data):
     data_css += '<script src="/views/main_css/js/load_editor.js?ver=' + data_css_ver + '"></script>'
     data_css += '<script src="/views/main_css/js/load_skin_set.js?ver=' + data_css_ver + '"></script>'
     
-    # 레거시 렌더러 JS
-    data_css += '<script src="/views/main_css/js/render_html.js?ver=' + data_css_ver + '"></script>'
-    data_css += '<script src="/views/main_css/js/render_onmark.js?ver=' + data_css_ver + '"></script>'
-    data_css += '<script src="/views/main_css/js/render_wiki.js?ver=' + data_css_ver + '"></script>'
-    
     # Main CSS
     data_css += '<link rel="stylesheet" href="/views/main_css/css/main.css?ver=' + data_css_ver + '">'
-    
+
     # External
     data_css += '<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.5.0/build/styles/default.min.css">'
     data_css += '<script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.5.0/build/highlight.min.js"></script>'
@@ -1314,12 +1305,17 @@ def render_set(doc_name = '', doc_data = '', data_type = 'view', data_in = '', d
             if db_data and db_data[0][0] != '':
                 get_class_render[0] = '''
                     <style>
-                        .render_content, .opennamu_render_complete {
+                        .opennamu_render_complete {
                             font-size: 14.4px !important;
                         }
-                        .render_content td, .opennamu_render_complete td {
+
+                        .opennamu_render_complete td {
                             padding: 5px 10px !important;
                         }
+
+                        .opennamu_render_complete summary {
+                            list-style: none !important;
+                        }
                     </style>
                 ''' + get_class_render[0]
 
@@ -1835,7 +1831,6 @@ def ban_check(ip = None, tool = ''):
 def ip_pas(raw_ip, type_data = 0):
     curs = conn.cursor()
 
-    hide = 0
     end_ip = {}
 
     return_data = 0
@@ -1853,19 +1848,41 @@ def ip_pas(raw_ip, type_data = 0):
     
     get_ip = list(set(get_ip))
     
-    for raw_ip in get_ip:        
+    for raw_ip in get_ip:
         change_ip = 0
         is_this_ip = ip_or_user(raw_ip)
         if is_this_ip != 0 and ip_view != '':
-            ip = re.sub(r'\.([^.]*)\.([^.]*)$', '.*.*', raw_ip)
-            ip = re.sub(r':([^:]*):([^:]*)$', ':*:*', ip)
+            ip = ipaddress.ip_address(raw_ip)
+            if type(ip) == ipaddress.IPv6Address:
+                ip = ip.exploded
+                ip = re.sub(r':([^:]*):([^:]*)$', ':*:*', ip)
+            else:
+                ip = ip.exploded
+                ip = re.sub(r'\.([^.]*)\.([^.]*)$', '.*.*', ip)
                 
             change_ip = 1
         else:     
             ip = raw_ip
             
         if type_data == 0 and change_ip == 0:
-            ip = '<span class="opennamu_ip_render">' + raw_ip + '</span>'
+            if is_this_ip == 0:
+                ip = '<a href="/w/' + url_pas('user:' + raw_ip) + '">' + raw_ip + '</a>'
+                
+                if admin_check('all', None, raw_ip) == 1:
+                    ip = '<b>' + ip + '</b>'
+
+                curs.execute(db_change('select data from user_set where name = "user_title" and id = ?'), [raw_ip])
+                db_data = curs.fetchall()
+                if db_data:
+                    ip = db_data[0][0] + ip
+
+            if ban_check(raw_ip) == 1:
+                ip = '<s>' + ip + '</s>'
+
+                if ban_check(raw_ip, 'login') == 1:
+                    ip = '<i>' + ip + '</i>'
+
+            ip = ip + ' <a href="/user/' + url_pas(raw_ip) + '">(' + load_lang('tool') + ')</a>'
 
         end_ip[raw_ip] = ip
     
@@ -2260,7 +2277,7 @@ def re_error(data):
         if ban_check() == 1:
             end = '<div id="opennamu_get_user_info">' + ip_check() + '</div>'
         else:
-            end = '<ul class="inside_ul"><li>' + load_lang('authority_error') + '</li></ul>'
+            end = '<ul class="opennamu_ul"><li>' + load_lang('authority_error') + '</li></ul>'
 
         return easy_minify(flask.render_template(skin_check(),
             imp = [load_lang('error'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
@@ -2386,7 +2403,7 @@ def re_error(data):
                 data = '' + \
                     '<div id="main_skin_set">' + \
                         '<h2>' + load_lang('error') + '</h2>' + \
-                        '<ul class="inside_ul">' + \
+                        '<ul class="opennamu_ul">' + \
                             '<li>' + data + '</a></li>' + \
                         '</ul>' + \
                     '</div>' + \
@@ -2398,7 +2415,7 @@ def re_error(data):
                 imp = [load_lang('error'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
                 data = '' + \
                      '<h2>' + load_lang('error') + '</h2>' + \
-                     '<ul class="inside_ul">' + \
+                     '<ul class="opennamu_ul">' + \
                          '<li>' + data + '</li>' + \
                      '</ul>' + \
                 '',

+ 25 - 142
route/tool/func_render.py

@@ -7,103 +7,8 @@ class class_do_render:
         self.conn = conn
 
         self.lang_data = lang_data
-    
-    def do_backlink_generate(self, data_markup, doc_data, doc_name):
-        conn = self.conn
-        curs = self.conn.cursor()
-
-        if data_markup == 'namumark':
-            # Link
-            link_re = re.compile(r'\[\[(?!https?:\/\/|inter:|외부:|out:|#)((?:(?!\[\[|\]\]|\|).)+)(?:\]\]|\|)', re.I)
-
-            data_link = link_re.findall(doc_data)
-            data_link = list(set(data_link))
-
-            data_link_end = {}
-            data_link_end['cat'] = []
-            data_link_end['file'] = []
-            data_link_end['link'] = []
-
-            data_link_end_all = []
-
-            for i in data_link:
-                data_link_in = i
-                if  data_link_in.startswith('분류:') or \
-                    data_link_in.startswith('category:'):
-                    data_link_in = re.sub(r'\\(.)', r'\1', data_link_in)
-                    data_link_end['cat'] += [re.sub(r'^분류:', 'category:', data_link_in)]
-                elif data_link_in.startswith('파일:') or \
-                    data_link_in.startswith('file:'):
-                    data_link_in = re.sub(r'\\(.)', r'\1', data_link_in)
-                    data_link_end['file'] += [re.sub(r'^파일:', 'file:', data_link_in)]
-                else:
-                    data_link_in = re.sub(r'([^\\])#(?:[^#]*)$', r'\1', data_link_in)
-
-                    if data_link_in[0] == ':':
-                        data_link_in = re.sub(r'^:분류:', 'category:', data_link_in)
-                        data_link_in = re.sub(r'^:category:', 'category:', data_link_in)
-
-                        data_link_in = re.sub(r'^:file:', 'file:', data_link_in)
-                        data_link_in = re.sub(r'^:파일:', 'file:', data_link_in)
-                    elif data_link_in[0] == '/':
-                        data_link_in = doc_name + data_link_in
-                    elif len(data_link_in) >= 3 and data_link_in[0:3] == '../':
-                        data_link_in = data_link_in[3:len(data_link_in)]
-                        data_link_in = '' + \
-                            re.sub('\/[^/]+$', '', doc_name) + \
-                            (('/' + data_link_in) if data_link_in != '' else '') + \
-                        ''
-
-                    data_link_in = re.sub(r'\\(.)', r'\1', data_link_in)
-                    data_link_end['link'] += [data_link_in]
-
-            if data_link_end != {}:
-                data_link_end['cat'] = list(set(data_link_end['cat']))
-                data_link_end['file'] = list(set(data_link_end['file']))
-                data_link_end['link'] = list(set(data_link_end['link']))
-
-                data_link_end_all += [[doc_name, i, 'cat'] for i in data_link_end['cat']]
-                data_link_end_all += [[doc_name, i, 'file'] for i in data_link_end['file']]
-                data_link_end_all += [[doc_name, i, ''] for i in data_link_end['link']]
-
-                data_link_no = []
-                for i in data_link_end['link']:
-                    curs.execute(db_change("select title from data where title = ?"), [i])
-                    if not curs.fetchall():
-                        data_link_no += [[doc_name, i, 'no']]
-
-                data_link_end_all += data_link_no
-
-            # Include
-            include_re = re.compile(r'\[include\(((?:(?!\)\]).)+)\)\]', re.I)
-
-            data_include = include_re.findall(doc_data)
-            data_include = list(set(data_include))
-
-            for i in data_include:
-                data_include_in = i
-                data_include_in = re.sub(r'([^\\]),.*$', r'\1', data_include_in)
-
-                data_link_end_all += [[doc_name, data_include_in, 'include']]
-
-            # Redirect
-            redirect_re = re.compile(r'^#(?:redirect|넘겨주기) ([^\n]+)', re.I)
-
-            data_redirect = redirect_re.search(doc_data)
-            if data_redirect:
-                data_redirect = data_redirect.group(1)
-
-                data_redirect = re.sub(r'([^\\])#(?:[^#]*)$', r'\1', data_redirect)
-
-                data_link_end_all += [[doc_name, data_redirect, 'redirect']]
-        else:
-            # markup == null
-            data_link_end_all = []
-
-        return data_link_end_all
 
     def do_render(self, doc_name, doc_data, data_type, data_in):
-        conn = self.conn
         curs = self.conn.cursor()
 
         doc_set = {}
@@ -117,57 +22,35 @@ class class_do_render:
         curs.execute(db_change('select data from other where name = "markup"'))
         rep_data = curs.fetchall()
         rep_data = rep_data[0][0] if rep_data else 'namumark'
-
-        if data_type != 'backlink':
-            if rep_data == 'namumark':
-                doc_data = html.escape(doc_data)
-                doc_name = html.escape(doc_name)
-                
-                data_end = [
-                    '<pre class="render_content_load" id="' + data_in + 'render_content_load">' + doc_data + '</pre>' + \
-                    '<div class="render_content" id="' + data_in + 'render_content" style="display: none;"></div>', 
-                    '''
-                        do_onmark_render(
-                            test_mode = "normal", 
-                            name_id = "''' + data_in + '''render_content",
-                            name_include = "''' + data_in + '''",
-                            name_doc = "''' + doc_name + '''"
-                        );
-                    ''',
-                    {}
-                ]
-            elif rep_data == 'namumark_beta':
-                data_end = class_do_render_namumark(
-                    curs,
-                    doc_name,
-                    doc_data,
-                    doc_set,
-                    self.lang_data
-                )()
-            else:
-                data_end = [
-                    doc_data, 
-                    '', 
-                    {}
-                ]
-
-            return [
-                data_end[0], 
-                data_end[1],
-                data_end[2]
-            ]
+        if rep_data == 'namumark' or rep_data == 'namumark_beta':
+            data_end = class_do_render_namumark(
+                curs,
+                doc_name,
+                doc_data,
+                doc_set,
+                self.lang_data
+            )()
         else:
-            if rep_data == 'namumark':
-                backlink = self.do_backlink_generate(
-                    rep_data, 
-                    doc_data, 
-                    doc_name
-                )
+            data_end = [
+                doc_data, 
+                '', 
+                {}
+            ]
+
+        if data_type == 'backlink':
+            if 'backlink' in data_end[2]:
+                backlink = data_end[2]['backlink']
             else:
                 backlink = []
 
             if backlink != []:
-                curs.executemany(db_change("insert into back (link, title, type) values (?, ?, ?)"), backlink)
+                curs.executemany(db_change("insert into back (link, title, type) values (?, ?, ?)"), data_end[2]['backlink'])
                 curs.execute(db_change("delete from back where title = ? and type = 'no'"), [doc_name])
 
-            conn.commit()
+            self.conn.commit()
+        else:
+            return [
+                data_end[0], 
+                data_end[1],
+                data_end[2]
+            ]

+ 228 - 40
route/tool/func_render_namumark.py

@@ -4,7 +4,7 @@ class class_do_render_namumark:
     def __init__(self, curs, doc_name, doc_data, doc_set, lang_data):
         self.curs = curs
         
-        self.doc_data = doc_data
+        self.doc_data = doc_data.replace('\r', '')
         self.doc_name = doc_name
         self.doc_set = doc_set
         self.doc_include = self.doc_set['doc_include'] if 'doc_include' in self.doc_set else ''
@@ -18,6 +18,7 @@ class class_do_render_namumark:
         self.data_include = []
 
         self.data_math_count = 0
+        self.data_redirect = 0
         
         self.data_toc = ''
         self.data_footnote = {}
@@ -160,7 +161,7 @@ class class_do_render_namumark:
         if len(data) == 1:
             return data[0]
         else:
-            if flask.request.cookies.get('main_css_del_bold', '0') == '0':
+            if flask.request.cookies.get('main_css_darkmode', '0') == '0':
                 return data[0]
             else:
                 return data[1]
@@ -263,6 +264,7 @@ class class_do_render_namumark:
                 break
             else:
                 heading_data = re.search(heading_regex, self.render_data)
+                heading_data_org = heading_data.group(0)
                 heading_data = heading_data.groups()
 
                 heading_data_last_regex = r' ?(#?={1,6}[^=]*)$'
@@ -301,12 +303,10 @@ class class_do_render_namumark:
 
                     toc_list += [['', heading_data_text]]
 
-                    heading_data_text_fix = re.sub(r'<([^<>]*)>', '', heading_data_text)
-                    
                     data_name = self.get_tool_data_storage(
-                        '<h' + heading_level_str + ' id="' + heading_data_text_fix + '">', 
-                        ' <sub><a href="/edit_section/' + str(heading_count) + '/' + url_pas(self.doc_name) + '">✎</a></sub></h' + heading_level_str + '>', 
-                        ''
+                        '<h' + heading_level_str + '>', 
+                        ' <sub><a id="edit_load_' + str(heading_count) + '" href="/edit_section/' + str(heading_count) + '/' + url_pas(self.doc_name) + '">✎</a></sub></h' + heading_level_str + '>', 
+                        heading_data_org
                     )
 
                     heading_data_complete = '' + \
@@ -365,19 +365,21 @@ class class_do_render_namumark:
             toc_data += '' + \
                 '<br>' + \
                 ('<span style="margin-left: 10px;">' * for_a[0].count('.')) + \
-                '<span>' + \
+                '<span class="opennamu_TOC_list">' + \
                     '<a href="#s-' + for_a[0] + '">' + \
                         for_a[0] + '. ' + \
                     '</a>' + \
-                    for_a[1] + \
+                    '<toc_inside>' + for_a[1] + '</toc_inside>' + \
                 '</span>' + \
             ''
 
         if toc_data != '':
             toc_data += '</div>'
 
-        # toc replace
-        self.render_data = re.sub(r'\[(목차|toc|tableofcontents)\]', lambda x : toc_data, self.render_data)
+            self.data_toc = toc_data
+            self.render_data += '<toc_data>' + toc_data + '</toc_data>'
+        else:
+            self.data_toc = ''
 
     def do_render_macro(self):
         # double macro function
@@ -447,6 +449,8 @@ class class_do_render_namumark:
                 data_name = self.get_tool_data_storage('<iframe style="width: ' + video_width + '; height: ' + video_height + ';" src="' + video_code + '" frameborder="0" allowfullscreen></iframe>', '', match_org.group(0))
 
                 return '<' + data_name + '></' + data_name + '>'
+            elif name_data == 'toc':
+                return '<toc_no_auto>'
             elif name_data == 'ruby':
                 data = re.findall(macro_split_regex, match[1])
 
@@ -476,6 +480,12 @@ class class_do_render_namumark:
 
                 data_name = self.get_tool_data_storage('<ruby>' + main_text + '<rp>(</rp><rt>' + sub_text + '</rt><rp>)</rp></ruby>', '', match_org.group(0))
 
+                return '<' + data_name + '></' + data_name + '>'
+            elif name_data == 'anchor':
+                main_text = self.get_tool_data_revert(match[1], do_type = 'render')
+
+                data_name = self.get_tool_data_storage('<span id="' + main_text + '">', '</span>', match_org.group(0))
+
                 return '<' + data_name + '></' + data_name + '>'
             elif name_data == 'age':
                 if re.search(r'^[0-9]{4}-[0-9]{2}-[0-9]{2}$', match[1]):
@@ -544,6 +554,8 @@ class class_do_render_namumark:
                 data_name = self.get_tool_data_storage('<div style="clear: both;"></div>', '', match_org.group(0))
 
                 return '<' + data_name + '></' + data_name + '>'
+            elif match in ('목차', 'toc', 'tableofcontents'):
+                return '<toc_need_part>'
             elif match == 'pagecount':
                 return '0'
             else:
@@ -613,6 +625,7 @@ class class_do_render_namumark:
                     file_height = ''
                     file_align = ''
                     file_bgcolor = ''
+                    file_turn = ''
 
                     file_split_regex = r'(?:^|&amp;) *((?:(?!&amp;).)+)'
                     file_split_sub_regex = r'(^[^=]+) *= *([^=]+)'
@@ -633,6 +646,11 @@ class class_do_render_namumark:
                                         file_align = 'center'
                                 elif data_sub[0] == 'bgcolor':
                                     file_bgcolor = data_sub[1]
+                                elif data_sub[0] == 'theme':
+                                    if data_sub[1] == 'dark':
+                                        file_turn = 'dark'
+                                    elif data_sub[1] == 'light':
+                                        file_turn = 'light'
 
                     link_main_org = ''
                     link_sub = link_main
@@ -657,8 +675,11 @@ class class_do_render_namumark:
                         db_data = self.curs.fetchall()
                         if db_data:
                             link_exist = ''
+                            self.data_backlink += [[self.doc_name, 'file:' + link_main, 'file']]
                         else:
                             link_exist = 'opennamu_not_exist_link'
+                            self.data_backlink += [[self.doc_name, 'file:' + link_main, 'no']]
+                            self.data_backlink += [[self.doc_name, 'file:' + link_main, 'file']]
                         
                         link_extension_regex = r'\.([^.]+)$'
                         link_extension = re.search(link_extension_regex, link_main)
@@ -675,17 +696,28 @@ class class_do_render_namumark:
                     file_width = self.get_tool_css_safe(file_width)
                     file_height = self.get_tool_css_safe(file_height)
 
-                    file_end = '<image style="width:' + file_width + ';height:' + file_height + ';' + file_align + '" src="' + link_main + '">'
+                    file_end = '<image style="width:' + file_width + ';height:' + file_height + ';' + file_align + ';background:' + file_bgcolor + ';" src="' + link_main + '">'
                     if file_align == 'center':
                         file_end = '<div style="text-align:center;">' + file_end + '</div>'
 
                     if link_exist != '':
                         data_name = self.get_tool_data_storage('<a class="' + link_exist + '" href="/upload?name=' + url_pas(link_main_org) + '">', '</a>', link_data_full)
-
                         self.render_data = re.sub(link_regex, lambda x : ('<' + data_name + '>' + link_sub + '</' + data_name + '>'), self.render_data, 1)
                     else:
-                        data_name = self.get_tool_data_storage(file_end, '', link_data_full)
+                        file_pass = 0
+                        if file_turn != '':
+                            if file_turn == 'dark' and flask.request.cookies.get('main_css_darkmode', '0') == '1':
+                                file_pass = 1
+                            elif file_turn == 'light' and flask.request.cookies.get('main_css_darkmode', '0') == '0':
+                                file_pass = 1
+                        else:
+                            file_pass = 1
 
+                        if file_pass == 1:
+                            data_name = self.get_tool_data_storage(file_end, '', link_data_full)
+                        else:
+                            data_name = self.get_tool_data_storage('', '', link_data_full)
+                        
                         self.render_data = re.sub(link_regex, '<' + data_name + '></' + data_name + '>', self.render_data, 1)
                 # category
                 elif re.search(r'^(분류|category):', link_main):
@@ -714,8 +746,11 @@ class class_do_render_namumark:
                     db_data = self.curs.fetchall()
                     if db_data:
                         link_exist = ''
+                        self.data_backlink += [[self.doc_name, 'category:' + link_main, 'cat']]
                     else:
                         link_exist = 'opennamu_not_exist_link'
+                        self.data_backlink += [[self.doc_name, 'category:' + link_main, 'no']]
+                        self.data_backlink += [[self.doc_name, 'category:' + link_main, 'cat']]
 
                     link_main = url_pas(link_main)
 
@@ -818,7 +853,11 @@ class class_do_render_namumark:
                         self.curs.execute(db_change("select title from data where title = ?"), [link_main])
                         db_data = self.curs.fetchall()
                         if not db_data:
+                            self.data_backlink += [[self.doc_name, link_main, 'no']]
+                            self.data_backlink += [[self.doc_name, link_main, '']]
                             link_exist = 'opennamu_not_exist_link'
+                        else:
+                            self.data_backlink += [[self.doc_name, link_main, '']]
 
                     link_same = ''
                     if link_main == self.doc_name and self.doc_include == '':
@@ -876,8 +915,8 @@ class class_do_render_namumark:
 
                 return slash_add + match[2]
 
-        self.render_data = re.sub(r'(\\+)?@([^@= ]+)=((?:\\@|[^@])+)@', do_render_include_default_sub, self.render_data)
-        self.render_data = re.sub(r'(\\+)?@([^@= ]+)@', do_render_include_default_sub, self.render_data)
+        self.render_data = re.sub(r'(\\+)?@([^@= \n]+)=((?:\\@|[^@\n])+)@', do_render_include_default_sub, self.render_data)
+        self.render_data = re.sub(r'(\\+)?@([^@= \n]+)@', do_render_include_default_sub, self.render_data)
 
     def do_render_include(self):
         def do_render_include_default_sub(match):
@@ -949,27 +988,32 @@ class class_do_render_namumark:
                 self.curs.execute(db_change("select data from data where title = ?"), [include_name])
                 db_data = self.curs.fetchall()
                 if db_data:
+                    self.data_backlink += [[self.doc_name, include_name, 'include']]
+
                     # include link func
                     include_link = ''
                     if flask.request.cookies.get('main_css_include_link', '') == '1':
                         include_link = '<div><a href="/w/' + url_pas(include_name) + '">(' + include_name_org + ')</a></div>'
 
-                    include_data = db_data[0][0]
+                    include_data = db_data[0][0].replace('\r', '')
 
                     # parameter replace
-                    include_data = re.sub(r'(\\+)?@([^@= ]+)=((?:\\@|[^@])+)@', do_render_include_default_sub, include_data)
-                    include_data = re.sub(r'(\\+)?@([^@= ]+)@', do_render_include_default_sub, include_data)
+                    include_data = re.sub(r'(\\+)?@([^@= \n]+)=((?:\\@|[^@\n])+)@', do_render_include_default_sub, include_data)
+                    include_data = re.sub(r'(\\+)?@([^@= \n]+)@', do_render_include_default_sub, include_data)
 
                     # remove include
                     include_data = re.sub(include_regex, '', include_data)
+                    include_data = re.sub('^\n+', '', include_data)
 
-                    self.data_include += [[self.doc_include + 'opennamu_include_' + str(include_num), include_name, include_data]]
+                    self.data_include += [[self.doc_include + 'opennamu_include_' + str(include_num), include_name, include_data, 'style="display: inline;"']]
 
                     data_name = self.get_tool_data_storage('' + \
                         include_link + \
                         '<div id="' + self.doc_include + 'opennamu_include_' + str(include_num) + '"></div>' + \
                     '', '', match_org)
                 else:
+                    self.data_backlink += [[self.doc_name, include_name, 'no']]
+
                     include_link = '<div><a class="opennamu_not_exist_link" href="/w/' + url_pas(include_name) + '">(' + include_name_org + ')</a></div>'
 
                     data_name = self.get_tool_data_storage(include_link, '', match_org)
@@ -1034,7 +1078,7 @@ class class_do_render_namumark:
 
     def do_render_redirect(self):
         match = re.search(r'^<back_br>\n#(?:redirect|넘겨주기) ([^\n]+)', self.render_data)
-        if match:
+        if match and self.doc_include == '':
             link_data_full = match.group(0)
             link_main = match.group(1)
 
@@ -1063,8 +1107,12 @@ class class_do_render_namumark:
 
             link_main = self.get_tool_data_restore(link_main, do_type = 'slash')
             link_main = html.unescape(link_main)
+
+            self.data_backlink += [[self.doc_name, link_main, 'redirect']]
+
             link_main = url_pas(link_main)
 
+            self.data_redirect = 1
             if link_main != '':
                 link_main = '/w_from/' + link_main
 
@@ -1082,7 +1130,6 @@ class class_do_render_namumark:
         # get_tool_px_add_check
         # get_tool_css_safe
         # todo : after text render text not use to make table
-        # todo : table caption
         def do_render_table_parameter(cell_count, parameter, data, option = {}):
             table_parameter_all = { "div" : "", "table" : "", "tr" : "", "td" : "", "col" : "", "colspan" : "", "rowspan" : "", "data" : "" }
             
@@ -1135,14 +1182,14 @@ class class_do_render_namumark:
                 elif len(table_parameter_split) == 1:
                     if re.search(r'^-[0-9]+$', table_parameter):
                         table_colspan_auto = 0
-                        table_parameter_all['colspan'] = table_parameter.replace('-', '')
+                        table_parameter_all['colspan'] = re.sub(r'[^0-9]+', '', table_parameter)
                     elif re.search(r'^(\^|v)?\|[0-9]+$', table_parameter):
                         if table_parameter[0] == '^':
                             table_parameter_all['td'] += 'vertical-align: top;'
                         elif table_parameter[0] == 'v':
                             table_parameter_all['td'] += 'vertical-align: bottom;'
 
-                        table_parameter_all['rowspan'] = re.sub(r'^|v|\|', '', table_parameter)
+                        table_parameter_all['rowspan'] = re.sub(r'[^0-9]+', '', table_parameter)
                     elif table_parameter in ('(', ':', ')'):
                         table_align_auto = 0
                         if table_parameter == '(':
@@ -1177,6 +1224,7 @@ class class_do_render_namumark:
 
         table_regex = re.compile('\n((?:(?:(?:(?:\|\|)+)|(?:\|[^|]+\|(?:\|\|)*))\n?(?:(?:(?!\|\|).)+))(?:(?:\|\||\|\|\n|(?:\|\|)+(?!\n)(?:(?:(?!\|\|).)+)\n*)*)\|\|)\n', re.DOTALL)
         table_sub_regex = r'(\n?)((?:\|\|)+)((?:&lt;(?:(?:(?!&lt;|&gt;).)+)&gt;)*)((?:\n*(?:(?:(?:(?!\|\|).)+)\n*)+)|(?:(?:(?!\|\|).)*))'
+        table_caption_regex = r'^\|([^|]+)\|'
         table_count_all = len(re.findall(table_regex, self.render_data)) * 2
         while 1:
             table_data = re.search(table_regex, self.render_data)
@@ -1189,8 +1237,17 @@ class class_do_render_namumark:
             else:
                 table_data_org = table_data.group(0)
                 table_data = table_data.group(1)
+                
+                table_caption = re.search(table_caption_regex, table_data)
+                if table_caption:
+                    table_caption = table_caption.group(1)
+                    table_caption = '<caption>' + table_caption + '</caption>'
 
-                table_parameter = { "div" : "", "table" : "", "col" : {} }
+                    table_data = re.sub(table_caption_regex, '||', table_data)
+                else:
+                    table_caption = ''
+
+                table_parameter = { "div" : "", "table" : "", "col" : {}, "rowspan" : {} }
                 table_data_end = ''
                 table_col_num = 0
                 table_tr_change = 0
@@ -1207,6 +1264,18 @@ class class_do_render_namumark:
                         table_col_num = 0
                         table_data_end += '</tr><tr style="' + table_sub_parameter['tr'] + '">'
 
+                    if not table_col_num in table_parameter['rowspan']:
+                        table_parameter['rowspan'][table_col_num] = 0
+                    else:
+                        if table_parameter['rowspan'][table_col_num] != 0:
+                            table_parameter['rowspan'][table_col_num] -= 1
+                            table_col_num += 1
+
+                    if table_sub_parameter['rowspan'] != '':
+                        rowspan_int = int(table_sub_parameter['rowspan'])
+                        if rowspan_int > 1:
+                            table_parameter['rowspan'][table_col_num] = rowspan_int - 1
+
                     if not table_col_num in table_parameter['col']:
                         table_parameter['col'][table_col_num] = ''
 
@@ -1219,14 +1288,13 @@ class class_do_render_namumark:
                     else:
                         table_tr_change = 0
                     
-                        table_data_end += '<td colspan="' + table_sub_parameter['colspan'] + '" rowspan="' + table_sub_parameter['rowspan'] + '" style="' + table_sub_parameter['td'] + table_parameter['col'][table_col_num] + '">' + table_sub_parameter['data'] + '</td>'
+                        table_data_end += '<td colspan="' + table_sub_parameter['colspan'] + '" rowspan="' + table_sub_parameter['rowspan'] + '" style="' + table_parameter['col'][table_col_num] + table_sub_parameter['td'] + '"><back_br>\n' + table_sub_parameter['data'] + '\n<front_br></td>'
                     
                     table_col_num += 1
 
                 table_data_end += '</tr>'
-                table_data_end = '<table style="' + table_parameter['table'] + '">' + table_data_end + '</table>'
-                if table_parameter['div'] != '':
-                    table_data_end = '<div style="' + table_parameter['div'] + '">' + table_data_end + '</div>'
+                table_data_end = '<table style="' + table_parameter['table'] + '">' + table_caption + table_data_end + '</table>'
+                table_data_end = '<div class="table_safe" style="' + table_parameter['div'] + '">' + table_data_end + '</div>'
 
                 self.render_data = re.sub(table_regex, lambda x : ('\n<front_br>' + table_data_end + '<back_br>\n'), self.render_data, 1)
 
@@ -1467,6 +1535,83 @@ class class_do_render_namumark:
 
         self.render_data = re.sub(r'<temp_(?P<in>(?:slash)_(?:[0-9]+))>', '<\g<in>>', self.render_data)
 
+    def do_render_hr(self):
+        hr_regex = r'\n-{4,9}\n'
+        hr_count_max = len(re.findall(hr_regex, self.render_data)) * 3
+        while 1:
+            hr_data = re.search(hr_regex, self.render_data)
+            if hr_count_max < 0:
+                break
+            elif not hr_data:
+                break
+            else:
+                self.render_data = re.sub(hr_regex, '\n<front_br><hr><back_br>\n', self.render_data, 1)
+
+            hr_count_max -= 1
+
+    def do_render_list(self):        
+        quote_regex = r'((?:\n&gt; *[^\n]+)+)\n'
+        quote_count = 0
+        quote_count_max = len(re.findall(quote_regex, self.render_data)) * 10
+        while 1:
+            quote_data = re.search(quote_regex, self.render_data)
+            if quote_count_max < 0:
+                break
+            elif not quote_data:
+                break
+            else:
+                quote_data_org = quote_data.group(0)
+                quote_data = quote_data.group(1)
+                quote_data = re.sub(r'\n&gt; *(?P<in>[^\n]+)', '\g<in>\n', quote_data)
+                quote_data = html.unescape(quote_data)
+
+                self.data_include += [[self.doc_include + 'opennamu_quote_' + str(quote_count), self.doc_name, quote_data, '']]
+
+                data_name = self.get_tool_data_storage('<div id="' + self.doc_include + 'opennamu_quote_' + str(quote_count) + '"></div>', '', quote_data_org)
+
+                self.render_data = re.sub(quote_regex, lambda x : ('\n<front_br><blockquote><back_br>\n<' + data_name + '></' + data_name + '><front_br></blockquote><back_br>\n'), self.render_data, 1)
+
+            quote_count_max -= 1
+            quote_count += 1
+
+        def do_render_list_sub(match):
+            list_data = match.group(2)
+            list_len = len(match.group(1))
+            if list_len == 0:
+                list_len = 1
+
+            list_style = {
+                1 : 'list-style: unset;',
+                2 : 'list-style: circle;',
+                3 : 'list-style: square;',
+            }
+            list_style_data = 'list-style: square;'
+            if list_len in list_style:
+                list_style_data = list_style[list_len]
+
+            return '<li style="margin-left: ' + str(list_len * 20) + 'px;' + list_style_data + '">' + list_data + '</li>'
+
+        list_regex = r'((?:\n *\* ?[^\n]+)+)\n'
+        list_count_max = len(re.findall(list_regex, self.render_data)) * 3
+        while 1:
+            list_data = re.search(list_regex, self.render_data)
+            if list_count_max < 0:
+                break
+            elif not list_data:
+                break
+            else:
+                list_data = list_data.group(1)
+                list_sub_regex = r'\n( *)\* ?([^\n]+)'
+
+                list_data = re.sub(list_sub_regex, do_render_list_sub, list_data)
+
+                self.render_data = re.sub(list_regex, lambda x : ('\n<front_br><ul class="opennamu_ul">' + list_data + '</ul><back_br>\n'), self.render_data, 1)
+
+            list_count_max -= 1
+
+    def do_render_remark(self):
+        self.render_data = re.sub(r'\n##[^\n]+', '\n<front_br>', self.render_data)
+
     def do_render_last(self):
         # add category
         if self.doc_include == '':
@@ -1496,23 +1641,66 @@ class class_do_render_namumark:
         # <render_n> restore
         self.render_data = self.get_tool_data_restore(self.render_data)
 
+        def do_render_last_toc(match):
+            data = match.group(1)
+
+            data = re.sub(r'<[^<>]*>', '', data)
+            self.render_data = re.sub(r'<h(?P<in>[1-6])>', '<h\g<in> id="' + data + '">', self.render_data, 1)
+            
+            return data
+
+        # add toc
+        if self.data_toc != '':
+            toc_search_regex = r'<toc_data>((?:(?!<toc_data>|<\/toc_data>).)*)<\/toc_data>'
+
+            toc_data_on = 0
+
+            toc_data = re.search(toc_search_regex, self.render_data)
+            toc_data = toc_data.group(1)
+            self.data_toc = toc_data
+            self.data_toc = re.sub(r'<toc_inside>((?:(?!<toc_inside>|<\/toc_inside>).)*)<\/toc_inside>', do_render_last_toc, self.data_toc)
+
+            self.render_data = re.sub(toc_search_regex, '', self.render_data)
+            if flask.request.cookies.get('main_css_toc_set', '0') != '1':
+                if re.search(r'<toc_need_part>', self.render_data):
+                    toc_data_on = 1
+
+                self.render_data = re.sub(r'<toc_need_part>', lambda x : (self.data_toc), self.render_data, 20)
+                self.render_data = re.sub(r'<toc_need_part>', '', self.render_data)
+            else:
+                self.render_data = re.sub(r'<toc_need_part>', '', self.render_data)
+
+            if  self.doc_include != '' or \
+                re.search(r'<toc_no_auto>', self.render_data) or \
+                flask.request.cookies.get('main_css_toc_set', '0') != '0' or \
+                toc_data_on == 1:
+                self.render_data = re.sub(r'<toc_no_auto>', '', self.render_data)
+            else:
+                self.render_data = re.sub(r'(?P<in><h[1-6] id="[^"]*">)', '<br>' + self.data_toc + '\g<in>', self.render_data, 1)
+        else:
+            self.render_data = re.sub(r'<toc_need_part>', '', self.render_data)
+            self.render_data = re.sub(r'<toc_no_auto>', '', self.render_data)
+
         self.render_data = '<div class="opennamu_render_complete">' + self.render_data + '</div>'
 
     def __call__(self):
+        self.do_render_remark()
         self.do_render_include_default()
         self.do_render_slash()
         self.do_render_redirect()
-        self.do_render_include()
-        self.do_render_middle()
-        self.do_render_math()
-        # self.do_render_list()
-        # todo : fix slash
-        self.do_render_table()
-        self.do_render_link()
-        self.do_render_macro()
-        self.do_redner_footnote()
-        self.do_render_text()
-        self.do_render_heading()
+        if self.data_redirect == 0:
+            self.do_render_include()
+            self.do_render_middle()
+            self.do_render_math()
+            self.do_render_table()
+            self.do_render_list()
+            self.do_render_macro()
+            self.do_render_link()
+            self.do_redner_footnote()
+            self.do_render_text()
+            self.do_render_hr()
+            self.do_render_heading()
+            
         self.do_render_last()
 
         # print(self.data_temp_storage)

+ 0 - 0
route/tool/func_render_wiki.py


+ 14 - 3
route/topic.py

@@ -1,6 +1,6 @@
 from .tool.func import *
 
-def topic(topic_num = 0, do_type = ''):
+def topic(topic_num = 0, do_type = '', doc_name = 'Test'):
     with get_db_connect() as conn:
         curs = conn.cursor()
         topic_num = str(topic_num)
@@ -141,7 +141,7 @@ def topic(topic_num = 0, do_type = ''):
                     name_value = flask.request.form.get('topic', '')
                     sub_value = flask.request.form.get('title', '')
                 else:
-                    name_value = ''
+                    name_value = doc_name
                     sub_value = ''
             else:
                 curs.execute(db_change("select title, sub from rd where code = ?"), [topic_num])
@@ -172,9 +172,20 @@ def topic(topic_num = 0, do_type = ''):
             sql_d = curs.fetchall()
             topic_text = html.escape(sql_d[0][0]) if sql_d and sql_d[0][0] != '' else load_lang('content')
 
+            shortcut = '<div class="opennamu_thread_shortcut" id="thread_shortcut">'
+            curs.execute(db_change(
+                "select id from topic where code = ? order by id + 0 asc"
+            ), [topic_num])
+            db_data = curs.fetchall()
+            for for_a in db_data:
+                shortcut += '<a href="#' + for_a[0] + '">#' + for_a[0] + '</a> '
+            
+            shortcut += '</div>'
+
             return easy_minify(flask.render_template(skin_check(),
                 imp = [name, wiki_set(), wiki_custom(), wiki_css(['(' + load_lang('discussion') + ')', 0])],
                 data = '''
+                    ''' + shortcut + '''
                     <h2 id="topic_top_title">''' + html.escape(sub) + '''</h2>
                     
                     <div id="top_topic"></div>
@@ -194,7 +205,7 @@ def topic(topic_num = 0, do_type = ''):
                         
                         <div>''' + edit_button('opennamu_edit_textarea') + '''</div>
 
-                        <textarea id="opennamu_edit_textarea" class="opennamu_comment_textarea" placeholder="''' + topic_text + '''" name="content">''' + html.escape(thread_data) + '''</textarea>
+                        <textarea id="opennamu_edit_textarea" class="opennamu_textarea_200" placeholder="''' + topic_text + '''" name="content">''' + html.escape(thread_data) + '''</textarea>
                         <hr class="main_hr">
                         
                         ''' + captcha_get() + ip_warning() + '''

+ 3 - 3
route/topic_comment_tool.py

@@ -17,12 +17,12 @@ def topic_comment_tool(topic_num = 1, num = 1):
 
         ban = '''
             <h2>''' + load_lang('state') + '''</h2>
-            <ul class="inside_ul">
+            <ul class="opennamu_ul">
                 <li>''' + load_lang('writer') + ' : ''' + ip_pas(data[0][1]) + '''</li>
                 <li>''' + load_lang('time') + ' : ' + data[0][2] + '''</li>
             </ul>
             <h2>''' + load_lang('other_tool') + '''</h2>
-            <ul class="inside_ul">
+            <ul class="opennamu_ul">
                 <li>
                     <a href="/thread/''' + topic_num + '/comment/' + num + '''/raw">''' + load_lang('raw') + '''</a>
                 </li>
@@ -42,7 +42,7 @@ def topic_comment_tool(topic_num = 1, num = 1):
 
             ban += '''
                 <h2>''' + load_lang('admin_tool') + '''</h2>
-                <ul class="inside_ul">
+                <ul class="opennamu_ul">
                     <li>
                         <a href="/auth/give/ban/''' + url_pas(data[0][1]) + '''">
                             ''' + (load_lang('release') if user_ban_d else load_lang('ban')) + '''

+ 1 - 1
route/topic_list.py

@@ -26,7 +26,7 @@ def topic_list(name = 'Test'):
                 <a href="/topic/''' + url_pas(name) + '?tool=close">(' + load_lang('closed_discussion') + ''')</a>
                 <a href="/topic/''' + url_pas(name) + '?tool=agree">(' + load_lang('agreed_discussion') + ''')</a>
                 <hr class="main_hr">
-                <a href="/thread/0">(''' + load_lang('make_new_topic') + ''')</a>
+                <a href="/thread/0/''' + url_pas(name) + '''">(''' + load_lang('make_new_topic') + ''')</a>
             '''
 
             curs.execute(db_change("select code, sub from rd where title = ? and stop != 'O' order by date desc"), [name])

+ 3 - 3
route/topic_tool.py

@@ -45,14 +45,14 @@ def topic_tool(topic_num = 1):
         if admin_check(3) == 1:
             data = '''
                 <h2>''' + load_lang('admin_tool') + '''</h2>
-                <ul class="inside_ul">
+                <ul class="opennamu_ul">
                     <li><a href="/thread/''' + topic_num + '/setting">' + load_lang('topic_setting') + '''</a></li>
                     <li><a href="/thread/''' + topic_num + '/acl">' + load_lang('topic_acl_setting') + '''</a></li>
                 </ul>
             '''
         data += '''
             <h2>''' + load_lang('tool') + '''</h2>
-            <ul class="inside_ul">
+            <ul class="opennamu_ul">
                 <li>''' + load_lang('topic_state') + ''' : ''' + t_state + '''</li>
                 <li>''' + load_lang('topic_acl') + ''' : <a href="/acl/TEST#exp">''' + acl_state + '''</a></li>
                 <li>''' + load_lang('topic_view_acl') + ''' : <a href="/acl/TEST#exp">''' + acl_view_state + '''</a></li>
@@ -62,7 +62,7 @@ def topic_tool(topic_num = 1):
         if admin_check(None) == 1:
             data += '''
                 <h2>''' + load_lang('owner') + '''</h2>
-                <ul class="inside_ul">
+                <ul class="opennamu_ul">
                     <li>
                         <a href="/thread/''' + topic_num + '''/delete">
                             ''' + load_lang('topic_delete') + '''

+ 4 - 2
route/user_alarm.py

@@ -7,7 +7,7 @@ def user_alarm():
         num = int(number_check(flask.request.args.get('num', '1')))
         sql_num = (num * 50 - 50) if num * 50 > 0 else 0
     
-        data = '<ul class="inside_ul">'
+        data = '<ul class="opennamu_ul">'
     
         curs.execute(db_change("select data, date from alarm where name = ? order by date desc limit ?, 50"), [ip_check(), sql_num])
         data_list = curs.fetchall()
@@ -19,7 +19,9 @@ def user_alarm():
             ''
     
             for data_one in data_list:
-                data += '<li>' + data_one[0] + ' (' + data_one[1] + ')</li>'
+                data_split = data_one[0].split(' | ')
+                
+                data += '<li>' + ip_pas(data_split[0]) + (' | ' + ' | '.join(data_split[1:]) if len(data_split) > 1 else '') + ' (' + data_one[1] + ')</li>'
     
         data += '' + \
             '</ul>' + \

+ 1 - 1
route/user_count.py

@@ -67,7 +67,7 @@ def user_count(name = None):
         return easy_minify(flask.render_template(skin_check(),
             imp = [load_lang('count'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
             data = '''
-                <ul class="inside_ul">
+                <ul class="opennamu_ul">
                     <li><a href="/record/''' + url_pas(that) + '''">''' + load_lang('edit_record') + '''</a> : ''' + str(data) + '''</li>
                     <li><a href="/record/topic/''' + url_pas(that) + '''">''' + load_lang('discussion_record') + '''</a> : ''' + str(data_topic) + '''</a></li>
                     <hr>

+ 5 - 5
route/user_info.py

@@ -16,7 +16,7 @@ def user_info(name = ''):
             curs.execute(db_change("select count(*) from alarm where name = ?"), [ip])
             count = curs.fetchall()
             if count and count[0][0] != 0:
-                tool_menu += '<li><a id="not_thing" href="/alarm">' + load_lang('alarm') + ' (' + str(count[0][0]) + ')</a></li>'
+                tool_menu += '<li><a class="opennamu_not_exist_link" href="/alarm">' + load_lang('alarm') + ' (' + str(count[0][0]) + ')</a></li>'
             else:
                 tool_menu += '<li><a href="/alarm">' + load_lang('alarm') + '</a></li>'
     
@@ -40,8 +40,8 @@ def user_info(name = ''):
                 
             tool_menu += '<li><a href="/change/head">' + load_lang('user_head') + '</a></li>'
                 
-            login_menu = '<h2>' + load_lang('login') + '</h2><ul class="inside_ul">' + login_menu + '</ul>'
-            tool_menu = '<h2>' + load_lang('tool') + '</h2><ul class="inside_ul">' + tool_menu + '</ul>'
+            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>'
     
         if admin_check(1) == 1:
             curs.execute(db_change("select block from rb where block = ? and ongoing = '1'"), [ip])
@@ -49,7 +49,7 @@ def user_info(name = ''):
             
             admin_menu = '''
                 <h2>''' + load_lang('admin') + '''</h2>
-                <ul class="inside_ul">
+                <ul class="opennamu_ul">
                     <li><a href="/auth/give/ban/''' + url_pas(ip) + '''">''' + ban_name + '''</a></li>
                     <li><a href="/check/''' + url_pas(ip) + '''">''' + load_lang('check') + '''</a></li>
                 </ul>
@@ -65,7 +65,7 @@ def user_info(name = ''):
                 ''' + login_menu + '''
                 ''' + tool_menu + '''
                 <h2>''' + load_lang('other') + '''</h2>
-                <ul class="inside_ul">
+                <ul class="opennamu_ul">
                     <li><a href="/record/''' + url_pas(ip) + '''">''' + load_lang('record') + '''</a></li>
                     <li><a href="/record/topic/''' + url_pas(ip) + '''">''' + load_lang('discussion_record') + '''</a></li>
                     <li><a href="/topic/user:''' + url_pas(ip) + '''">''' + load_lang('user_discussion') + '''</a></li>

+ 1 - 1
route/user_setting_head.py

@@ -66,7 +66,7 @@ def user_setting_head(skin_name = ''):
                 imp = [load_lang(data = 'user_head', safe = 1), wiki_set(), wiki_custom(), wiki_css(['(HTML)' + sub_name, 0])],
                 data = start + '''
                     <form method="post">
-                        <textarea rows="25" cols="100" name="content">''' + html.escape(data) + '''</textarea>
+                        <textarea class="opennamu_textarea_500" cols="100" name="content">''' + html.escape(data) + '''</textarea>
                         <hr class="main_hr">
                         ''' + load_lang('user_css_warning') + ''' : <a href="/change/head_reset">/change/head_reset</a>
                         <hr class="main_hr">

+ 1 - 1
route/user_watch_list.py

@@ -45,7 +45,7 @@ def user_watch_list(tool):
 
         if data:
             div = '' + \
-                '<ul class="inside_ul">' + div + '</ul>' + \
+                '<ul class="opennamu_ul">' + div + '</ul>' + \
                 '<hr class="main_hr">' + \
             ''
 

+ 1 - 1
route/view_down.py

@@ -4,7 +4,7 @@ def view_down(name = 'Test'):
     with get_db_connect() as conn:
         curs = conn.cursor()
 
-        div = '<ul class="inside_ul">'
+        div = '<ul class="opennamu_ul">'
 
         curs.execute(db_change("select title from data where title like ?"), [name + '/%'])
         for data in curs.fetchall():

+ 1 - 1
route/view_raw.py

@@ -50,7 +50,7 @@ def view_raw_2(name = None, topic_num = None, num = None, doc_acl = 0):
 
         data = curs.fetchall()
         if data:
-            p_data += '<textarea readonly rows="25">' + html.escape(data[0][0]) + '</textarea>'
+            p_data += '<textarea readonly class="opennamu_textarea_500">' + html.escape(data[0][0]) + '</textarea>'
             
             if doc_acl == 1:
                 p_data = '' + \

+ 8 - 8
route/view_read.py

@@ -43,7 +43,7 @@ def view_read(name = 'Test', doc_rev = '', doc_from = '', do_type = ''):
                     category_doc += '' + \
                         '<li>' + \
                             '<a href="/w/' + url_pas(data[0]) + '">' + html.escape(data[0]) + '</a> ' + \
-                            '<a id="inside" href="/xref/' + url_pas(data[0]) + '">(' + load_lang('backlink') + ')</a>' + \
+                            '<a class="opennamu_link_inter" href="/xref/' + url_pas(data[0]) + '">(' + load_lang('backlink') + ')</a>' + \
                         '</li>' + \
                     ''
 
@@ -52,7 +52,7 @@ def view_read(name = 'Test', doc_rev = '', doc_from = '', do_type = ''):
             if category_doc != '':
                 category_doc = '' + \
                     '<h2 id="cate_normal">' + load_lang('category_title') + '</h2>' + \
-                    '<ul class="inside_ul">' + \
+                    '<ul class="opennamu_ul">' + \
                         '<li>' + load_lang('all') + ' : ' + str(count_category) + '</li>' + \
                         category_doc + \
                     '</ul>' + \
@@ -61,7 +61,7 @@ def view_read(name = 'Test', doc_rev = '', doc_from = '', do_type = ''):
             if category_sub != '':
                 category_doc += '' + \
                     '<h2 id="cate_under">' + load_lang('under_category') + '</h2>' + \
-                    '<ul class="inside_ul">' + \
+                    '<ul class="opennamu_ul">' + \
                         '<li>' + load_lang('all') + ' : ' + str(count_sub_category) + '</li>' + \
                         category_sub + \
                     '</ul>' + \
@@ -153,18 +153,18 @@ def view_read(name = 'Test', doc_rev = '', doc_from = '', do_type = ''):
             curs.execute(db_change('select data from other where name = "error_401"'))
             sql_d = curs.fetchall()
             if sql_d and sql_d[0][0] != '':
-                end_data = '<h2>' + load_lang('error') + '</h2><ul class="inside_ul"><li>' + sql_d[0][0] + '</li></ul>'
+                end_data = '<h2>' + load_lang('error') + '</h2><ul class="opennamu_ul"><li>' + sql_d[0][0] + '</li></ul>'
             else:
-                end_data = '<h2>' + load_lang('error') + '</h2><ul class="inside_ul"><li>' + load_lang('authority_error') + '</li></ul>'
+                end_data = '<h2>' + load_lang('error') + '</h2><ul class="opennamu_ul"><li>' + load_lang('authority_error') + '</li></ul>'
         elif end_data == 'HTTP Request 404':
             response_data = 404
 
             curs.execute(db_change('select data from other where name = "error_404"'))
             sql_d = curs.fetchall()
             if sql_d and sql_d[0][0] != '':
-                end_data = '<h2>' + load_lang('error') + '</h2><ul class="inside_ul"><li>' + sql_d[0][0] + '</li></ul>'
+                end_data = '<h2>' + load_lang('error') + '</h2><ul class="opennamu_ul"><li>' + sql_d[0][0] + '</li></ul>'
             else:
-                end_data = '<h2>' + load_lang('error') + '</h2><ul class="inside_ul"><li>' + load_lang('decument_404_error') + '</li></ul>'
+                end_data = '<h2>' + load_lang('error') + '</h2><ul class="opennamu_ul"><li>' + load_lang('decument_404_error') + '</li></ul>'
 
             curs.execute(db_change('' + \
                 'select ip, date, leng, send, id from history ' + \
@@ -172,7 +172,7 @@ def view_read(name = 'Test', doc_rev = '', doc_from = '', do_type = ''):
             ''), [name])
             sql_d = curs.fetchall()
             if sql_d:
-                end_data += '<h2>' + load_lang('history') + '</h2><ul class="inside_ul">'
+                end_data += '<h2>' + load_lang('history') + '</h2><ul class="opennamu_ul">'
                 for i in sql_d:
                     if re.search(r"\+", i[2]):
                         leng = '<span style="color:green;">(' + i[2] + ')</span>'

+ 2 - 2
route/view_xref.py

@@ -19,7 +19,7 @@ def view_xref(name = 'Test', xref_type = 1):
 
             data_sub = '(' + load_lang('link_in_this') + ')'
 
-        div += '<ul class="inside_ul">'
+        div += '<ul class="opennamu_ul">'
 
         sql_insert = ['link', 'title'] if xref_type == 1 else ['title', 'link']
         curs.execute(db_change("" + \
@@ -41,7 +41,7 @@ def view_xref(name = 'Test', xref_type = 1):
             curs.execute(db_change("select title from back where title = ? and type = 'include'"), [data[0]])
             db_data = curs.fetchall()
             if db_data:
-                div += ' <a id="inside" href="/xref/' + url_pas(data[0]) + '">(' + load_lang('backlink') + ')</a>'
+                div += ' <a class="opennamu_link_inter" href="/xref/' + url_pas(data[0]) + '">(' + load_lang('backlink') + ')</a>'
 
             div += '</li>'
 

+ 2 - 2
route/vote_add.py

@@ -58,9 +58,9 @@ def vote_add():
                     '<form method="post">' + \
                         '<input name="name" placeholder="' + load_lang('name') + '">' + \
                         '<hr class="main_hr">' + \
-                        '<textarea rows="3" name="subject" placeholder="' + load_lang('explanation') + '"></textarea>' + \
+                        '<textarea class="opennamu_textarea_200" name="subject" placeholder="' + load_lang('explanation') + '"></textarea>' + \
                         '<hr class="main_hr">' + \
-                        '<textarea rows="10" name="data" placeholder="' + load_lang('1_line_1_q') + '"></textarea>' + \
+                        '<textarea class="opennamu_textarea_500" name="data" placeholder="' + load_lang('1_line_1_q') + '"></textarea>' + \
                         '<hr class="main_hr">' + \
                         '<input type="checkbox" value="Y" name="open_select"> ' + load_lang('open_vote') + \
                         '<h2>' + load_lang('period') + '</h2>'

+ 2 - 2
route/vote_end.py

@@ -28,10 +28,10 @@ def vote_end(num = 1):
         data += '<b>' + data_list[0][1] + '</b><hr class="main_hr">' if data_list[0][1] != '' else ''
         data += '<span>~ ' + time_limit + '</span><hr class="main_hr">' if time_limit != '' else ''
 
-        vote_data = re.findall(r'([^\n]+)', data_list[0][2].replace('\r\n', '\n'))
+        vote_data = re.findall(r'([^\n]+)', data_list[0][2].replace('\r', ''))
         for i in range(0, len(vote_data)):
             data += '<h2>' + vote_data[i] + '</h2>'
-            data += '<ul class="inside_ul">'
+            data += '<ul class="opennamu_ul">'
 
             curs.execute(db_change('select user from vote where id = ? and user != "" and data = ?'), [num, str(i)])
             data_list_2 = curs.fetchall()

+ 1 - 1
route/vote_list.py

@@ -16,7 +16,7 @@ def vote_list(list_type = 'normal', num = 1):
             sub = '(' + load_lang('closed') + ')'
             curs.execute(db_change('select name, id, type from vote where type = "close" or type = "n_close" limit ?, 50'), [sql_num])
 
-        data += '<ul class="inside_ul">'
+        data += '<ul class="opennamu_ul">'
 
         data_list = curs.fetchall()
         for i in data_list:

+ 1 - 1
route/vote_select.py

@@ -33,7 +33,7 @@ def vote_select(num = 1):
             if time_today > time_db:
                 return redirect('/vote/end/' + num)
 
-        vote_data = re.findall(r'([^\n]+)', data_list[0][2].replace('\r\n', '\n'))
+        vote_data = re.findall(r'([^\n]+)', data_list[0][2].replace('\r', ''))
 
         if flask.request.method == 'POST':
             try:

+ 2 - 2
version.json

@@ -1,7 +1,7 @@
 {
     "beta" : {
-        "r_ver" : "v3.4.5-unstable (stable2) (beta5-68)",
+        "r_ver" : "v3.4.5-unstable (stable2) (beta6-92)",
         "c_ver" : "3500354",
-        "s_ver" : "3500110"
+        "s_ver" : "3500111"
     }
 }

+ 42 - 52
views/main_css/css/main.css

@@ -7,6 +7,8 @@ body {
     word-break: break-all;
     
     overflow: auto;
+
+    font-size: 14px;
 }
 
 /* 텍스트 필드 */
@@ -29,12 +31,24 @@ table {
 
 td {
     border: 0.5px solid gainsboro;
-    
+    border-width: 0.5px;
+
     padding: 8px 10px;
 }
 
+@supports (-webkit-touch-callout: none) {
+    td {
+        border: 1px solid gainsboro;
+        border-width: 1px;
+    }
+}
+
 /* list */
-.inside_ul li {
+.opennamu_ul {
+    padding-left: 20px;
+}
+
+.opennamu_ul li {
     margin-left: 20px;
 
     margin-top: 5px;
@@ -83,10 +97,6 @@ td {
     display: none;
 }
 
-.opennamu_comment_textarea {
-    height: 200px;
-}
-
 /* render */
 /* - link */
 a {
@@ -95,19 +105,31 @@ a {
     text-decoration: none;
 }
 
-#not_thing, .opennamu_not_exist_link {
+a:hover {
+    color: darkblue;
+}
+
+.opennamu_not_exist_link {
     color: red;
 }
 
+.opennamu_not_exist_link:hover {
+    color: darkred;
+}
+
 .opennamu_same_link {
     font-weight: bold;
 }
 
-#inside, #out_link, .opennamu_link_out, .opennamu_link_inter {
+.opennamu_link_out, .opennamu_link_inter {
     color: green;
 }
 
-#out_link::before, .opennamu_link_out::before {
+.opennamu_link_out:hover, .opennamu_link_inter:hover {
+    color: darkgreen;
+}
+
+.opennamu_link_out::before {
     content: '🅴';
     
     font-weight: lighter;
@@ -115,12 +137,8 @@ a {
     background: transparent;
 }
 
-#include_link {
-    display: none;
-}
-
 /* - toc */
-#toc, .opennamu_TOC {
+.opennamu_TOC {
     border: 1px solid gainsboro;
     padding: 20px;
     
@@ -134,8 +152,8 @@ a {
     margin-top: 10px;
 }
 
-#toc_title, .opennamu_TOC_title {
-    font-size: 1.2rem;
+.opennamu_TOC_title {
+    font-size: 18px;
 }
 
 /* - category */
@@ -153,18 +171,6 @@ a {
     filter: none;
 }
 
-#cate {
-    margin-top: 20px;
-}
-
-.hidden_link {
-    filter: blur(3px);
-}
-
-.hidden_link:hover {
-    filter: none;
-}
-
 /* - footnote */
 .opennamu_footnote {
     border-top: 1px solid gainsboro;
@@ -174,13 +180,7 @@ a {
     margin-top: 10px;
 }
 
-#footnote_data {
-    border-top: 1px solid gainsboro;
-    
-    padding-top: 10px;
-}
-
-#cate, pre, #redirect {
+pre, #redirect {
     border: 1px solid gainsboro;
     
     padding: 10px;
@@ -190,21 +190,15 @@ pre {
     white-space: pre-wrap;
 }
 
-@media (max-width: 768px) {
-    table {
-        min-width: 100%;
-    }
-    
-    .table_safe {
-        min-width: 100%;
-    }
+.opennamu_textarea_500 {
+    height: 500px;
 }
 
-.content {
-    height: 500px;
+.opennamu_textarea_200 {
+    height: 200px;
 }
 
-.spead_footnote {
+.opennamu_spead_footnote {
     color: #555;
     background-color: #efefef;
     
@@ -216,7 +210,7 @@ hr {
     border-top: 1px solid gainsboro;
 }
 
-.render_content_load, .render_content, .opennamu_render_complete {
+.opennamu_render_complete {
     white-space: pre-wrap;
     
     line-break: anywhere;
@@ -271,7 +265,7 @@ s:hover, strike:hover, del:hover {
 }
 
 #main_table_top_tr {
-    background: aquamarine;
+    background: gainsboro;
 }
 
 .opennamu_history_blind {
@@ -286,10 +280,6 @@ s:hover, strike:hover, del:hover {
     margin-bottom: 8px;
 }
 
-#admin_log_search {
-    width: 100px;
-}
-
 .change_space {
     white-space: pre-line;
 }

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

@@ -3,6 +3,10 @@ html, body {
     color: white;
 }
 
+a:hover {
+    color: cornflowerblue;
+}
+
 textarea, input, button, select {
     background: #1f2023;
     color: white;

+ 0 - 2
views/main_css/js/func/insert_user_info.js

@@ -102,8 +102,6 @@ function do_insert_user_info() {
                         '';
                         
                         document.getElementById('opennamu_get_user_info').innerHTML = data;
-                        
-                        opennamu_do_ip_parser();
                     }
                 }
             }

+ 1 - 73
views/main_css/js/func/render_simple.js

@@ -1,72 +1,3 @@
-"use strict";
-
-function opennamu_do_render_simple(name_ele) {
-    let skin_set_data = document.getElementById(name_ele).innerHTML;
-    
-    // 목차 구현
-    let toc_all_data = '<div id="toc"><span id="toc_title">TOC</span><br>';
-    let split_toc;
-    let toc_data;
-    
-    let i = 1;
-    while(1) {
-        toc_data = skin_set_data.match(/<h[1-6]>([^<>]+)<\/h[1-6]>/);
-        if(toc_data) {
-            split_toc = toc_data[1].match(/^([^ ]+)(.+)/);
-            toc_all_data += '' + 
-                '<br>' +
-                '<span style="margin-left: ' + String(((toc_data[1].match(/\./g) || []).length - 1) * 10) + 'px;">' +
-                    '<a href="#toc_' + String(i) + '">' + split_toc[1] + '</a>' + split_toc[2] +
-                '</span>' +
-            '';
-
-            skin_set_data = skin_set_data.replace(
-                /<(h[1-6])>([^<>]+)<\/h[1-6]>/, 
-                '<$1 id="toc_' + String(i) + '"><a href="#toc">' + split_toc[1] + '</a>' + split_toc[2] + '</$1>'
-            );
-            
-            i += 1;
-        } else {
-            break;
-        }
-    }
-    
-    skin_set_data = toc_all_data + '</div>' + skin_set_data;
-
-    // 각주 구현
-    var note_list = {};
-    var plus_note;
-    
-    i = 1;
-    while(1) {
-        toc_data = skin_set_data.match(/<sup>([^<>]+)<\/sup>/);
-        if(toc_data) {
-            if(!note_list[toc_data[1]]) {
-                note_list[toc_data[1]] = [String(i), 0];
-            } else {
-                note_list[toc_data[1]][1] += 1;
-            }
-
-            if(note_list[toc_data[1]][1] != 0) {
-                plus_note = '_' + String(note_list[toc_data[1]][1]);
-            } else {
-                plus_note = '';
-            }
-            
-            skin_set_data = skin_set_data.replace(
-                /<sup>([^<>]+)<\/sup>/, 
-                '<sup><a id="note_' + note_list[toc_data[1]][0] + plus_note + '" href="#note_' + note_list[toc_data[1]][0] + '_end">$1</a></sup>'
-            );
-            
-            i += 1;
-        } else {
-            break;
-        }
-    }
-    
-    document.getElementById(name_ele).innerHTML = skin_set_data;
-}
-
 let opennamu_do_render_simple_url = [
     '/manager/1',
     '/manager',
@@ -75,7 +6,4 @@ let opennamu_do_render_simple_url = [
     '/setting/main',
     '/setting/external',
     '/change/skin_set/main'
-];
-if(opennamu_do_render_simple_url.includes(window.location.pathname)) {
-    opennamu_do_render_simple('opennamu_simple_render');
-}
+];

+ 0 - 95
views/main_css/js/func/render_user_name.js

@@ -1,95 +0,0 @@
-"use strict";
-
-function opennamu_do_user_document_check() {
-    let data_all = document.getElementsByClassName('opennamu_user_link');
-    for(let for_a = 0; for_a < data_all.length; for_a++) {
-        if(data_all && data_all[for_a]) {
-            if(data_all[for_a].getAttribute('complete') === '1') {
-                continue;
-            }
-        }
-        
-        let data = data_all[for_a].innerHTML;
-        
-        let xhr = new XMLHttpRequest();
-        xhr.open("POST", "/api/user_info/" + opennamu_do_url_encode(data));
-        xhr.send();
-        
-        document.getElementsByClassName('opennamu_user_link')[for_a].setAttribute('complete', '1');
-        xhr.onreadystatechange = function() {
-            if(this.readyState === 4 && this.status === 200) {
-                // start part
-                let xhr_data = JSON.parse(this.responseText);
-                
-                // user document part
-                if(xhr_data[data]['document'] === '0') {
-                    document.getElementsByClassName('opennamu_user_link')[for_a].id = "not_thing";
-                }
-                
-                // user auth part
-                let user_data = document.getElementsByClassName('opennamu_user_link')[for_a].innerHTML;
-                if(xhr_data[data]['auth'] === '0') {
-                    
-                } else if(xhr_data[data]['auth'] === '1') {
-                    
-                } else {
-                    user_data = '<b>' + user_data + '</b>';
-                }
-                
-                if(xhr_data[data]['ban'] != '0') {
-                    user_data = '<s>' + user_data + '</s>';
-                }
-                
-                // user title part
-                user_data = xhr_data[data]['user_title'] + user_data;
-                
-                // end part
-                document.getElementsByClassName('opennamu_user_link')[for_a].innerHTML = user_data;
-            }
-        }
-    }
-}
-
-function opennamu_do_ip_parser() {
-    let data_all = document.getElementsByClassName('opennamu_ip_render');
-    let data_list = {};
-    for(let for_a = 0; for_a < data_all.length; for_a++) {
-        if(data_all && data_all[for_a]) {
-            if(data_all[for_a].getAttribute('complete') === '1') {
-                continue;
-            }
-        }
-        
-        let data = data_all[for_a].innerHTML;
-        let data_raw = data;
-        
-        if(data_list[data_raw]) {
-            document.getElementsByClassName('opennamu_ip_render')[for_a].innerHTML = data_list[data_raw];
-            document.getElementsByClassName('opennamu_ip_render')[for_a].setAttribute('complete', '1');
-            
-            continue;
-        }
-        
-        if(opennamu_do_id_check(data_raw)) {
-            data = '' + 
-                '<a class="opennamu_user_link" ' + 
-                    'href="/w/user:' + opennamu_do_url_encode(data_raw) + '">' + 
-                    data_raw + 
-                '</a>' +
-            '';
-        } else {
-            
-        }
-        
-        data += ' <a href="/user/' + opennamu_do_url_encode(data_raw) + '">(🛠︎)</a>';
-
-        document.getElementsByClassName('opennamu_ip_render')[for_a].innerHTML = data;
-        document.getElementsByClassName('opennamu_ip_render')[for_a].setAttribute('complete', '1');
-
-        data_list[data_raw] = data;
-    }
-    
-    opennamu_do_user_document_check();
-}
-
-opennamu_do_ip_parser();

+ 1 - 32
views/main_css/js/load_skin_set.js

@@ -96,29 +96,6 @@ function main_css_get_post() {
 
 function main_css_skin_load() {    
     var head_data = document.querySelector('head');
-    if(document.cookie.match(opennamu_cookie_split_regex('main_css_del_strike'))) {
-        if(document.cookie.match(opennamu_cookie_split_regex('main_css_del_strike'))[1] === '1') {
-            head_data.innerHTML += '<style>s { text-decoration: none; } s:hover { background-color: transparent; }</style>';
-        } else if(document.cookie.match(opennamu_cookie_split_regex('main_css_del_strike'))[1] === '2') {
-            head_data.innerHTML += '<style>s { display: none; }</style>';
-        }
-    }
-
-    if(document.cookie.match(opennamu_cookie_split_regex('main_css_del_bold'))) {
-        if(document.cookie.match(opennamu_cookie_split_regex('main_css_del_bold'))[1] === '1') {
-            head_data.innerHTML += '<style>b { font-weight: normal; }</style>';
-        } else if(document.cookie.match(opennamu_cookie_split_regex('main_css_del_bold'))[1] === '2') {
-            head_data.innerHTML += '<style>b { display: none; }</style>';
-        }
-    }
-
-    if(
-        document.cookie.match(opennamu_cookie_split_regex('main_css_include_link')) &&
-        document.cookie.match(opennamu_cookie_split_regex('main_css_include_link'))[1] === '1'
-    ) {
-        head_data.innerHTML += '<style>#include_link { display: inline; }</style>';
-    }
-
     if(document.cookie.match(opennamu_cookie_split_regex('main_css_toc_set'))) {
         if(document.cookie.match(opennamu_cookie_split_regex('main_css_toc_set'))[1] === '2') {
             head_data.innerHTML += '<style>#auto_toc { display: none; }</style>';
@@ -134,15 +111,7 @@ function main_css_skin_load() {
         head_data.innerHTML += '<style>body, input, textarea { font-size: ' + document.cookie.match(opennamu_cookie_split_regex('main_css_font_size'))[1] + 'px; }</style>';
     }
     
-    if(
-        document.cookie.match(opennamu_cookie_split_regex('main_css_darkmode')) &&
-        document.cookie.match(opennamu_cookie_split_regex('main_css_darkmode'))[1] === '1'
-    ) {
-        head_data.innerHTML += '' +
-            '<link rel="stylesheet" href="/views/main_css/css/sub/dark.css?ver=5">' +
-        '';
-    }
-    
+    /* 개편 필요 */
     if(
         document.cookie.match(opennamu_cookie_split_regex('main_css_link_delimiter')) &&
         document.cookie.match(opennamu_cookie_split_regex('main_css_link_delimiter'))[1] === '1'

+ 0 - 0
views/main_css/js/render/html.js


+ 0 - 687
views/main_css/js/render/markdown.js

@@ -1,687 +0,0 @@
-"use strict";
-
-class opennamu_render_markdown {
-    // Init Part
-    constructor(
-        render_part_id,
-        render_part_id_after,
-        render_part_id_add,
-        doc_name
-    ) {
-        this.doc_data = document.getElementById(render_part_id_add + render_part_id).innerHTML;
-            
-        this.doc_data = this.doc_data.replace(/_/g, '<uBar>');
-
-        this.doc_data = this.doc_data.replace(/&amp;/g, '&');
-        this.doc_data = '<brStart>\n' + this.doc_data + '\n<brEnd>';
-        this.doc_data.replace(/\r/g, '');
-
-        this.doc_name = doc_name;
-            
-        this.parser_data_temp = {};
-        this.parser_data_temp_other = {};
-        this.parser_data_temp_other['toc'] = '';
-        this.parser_data_temp_other['footnote'] = '';
-        this.parser_data_temp_other['category'] = '';
-
-        this.parser_data_js = [];
-        
-        this.parser_count = {};
-        this.parser_count['parser'] = 0;
-        this.parser_count['nowiki'] = 0;
-        
-        this.render_part_id = render_part_id;
-        this.render_part_id_add = render_part_id_add;
-        this.render_part_id_after = render_part_id_after;
-    }
-    
-    // Func Part
-    do_func_parser_to_text(data, parser_type = 'parser') {
-        let parser_data_temp = this.parser_data_temp;
-        let parser_match;
-        if(parser_type === 'nowiki' || parser_type === 'nowikiLink' || parser_type === 'nowikiEnd') {
-            parser_match = /<(\/?nowiki[0-9]+Span)>/;
-        } else {
-            parser_match = /<(\/?render[0-9]+Span)>/;
-        }
-        
-        while(data.match(parser_match)) {
-            data = data.replace(parser_match, function(match, x1) {
-                if(parser_type === 'nowikiEnd') {
-                    return parser_data_temp[x1 + 'End'];
-                } else if(parser_type === 'nowikiLink') {
-                    let nowiki_data = parser_data_temp[x1];
-                    nowiki_data = nowiki_data.replace(/\\(.)/g, '$1');
-                    
-                    return nowiki_data;
-                } else {
-                    return parser_data_temp[x1];
-                }
-            });
-        }
-        
-        return data;
-    }
-    
-    do_func_xss_encode(data) {
-        data = data.replace(/'/g, '&#x27;');
-        data = data.replace(/"/g, '&quot;');
-        data = data.replace(/</g, '&lt;');
-        data = data.replace(/</g, '&gt;');
-        data = data.replace(/&/g, '&amp;');
-        
-        return data;
-    }
-    
-    do_func_xss_decode(data) {
-        data = data.replace(/&#x27;/g, '\'');
-        data = data.replace(/&quot;/g, '"');
-        data = data.replace(/&lt;/g, '<');
-        data = data.replace(/&gt;/g, '>');
-        data = data.replace(/&amp;/g, '&');
-        
-        return data;
-    }
-    
-    // Render Part
-    do_part_text() {
-        let parser_count = this.parser_count['parser'];
-        let parser_data_temp = this.parser_data_temp;
-        
-        this.doc_data = this.doc_data.replace(/~~((?:(?!~~|\n).)+)~~/g, function(match, x1) {
-            parser_count += 1;
-            let parser_count_str = String(parser_count);
-            
-            parser_data_temp['render' + parser_count_str + 'Span'] = '<s>';
-            parser_data_temp['/render' + parser_count_str + 'Span'] = '</s>';
-            
-            return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
-        });
-        
-        this.doc_data = this.doc_data.replace(/\*\*((?:(?!\*\*|\n).)+)\*\*/g, function(match, x1) {
-            parser_count += 1;
-            let parser_count_str = String(parser_count);
-            
-            parser_data_temp['render' + parser_count_str + 'Span'] = '<b>';
-            parser_data_temp['/render' + parser_count_str + 'Span'] = '</b>';
-            
-            return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
-        });
-        
-        this.doc_data = this.doc_data.replace(/<uBar><uBar>((?:(?!<uBar><uBar>|\n).)+)<uBar><uBar>/g, function(match, x1) {
-            parser_count += 1;
-            let parser_count_str = String(parser_count);
-            
-            parser_data_temp['render' + parser_count_str + 'Span'] = '<b>';
-            parser_data_temp['/render' + parser_count_str + 'Span'] = '</b>';
-            
-            return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
-        });
-        
-        this.doc_data = this.doc_data.replace(/\*([^*\n]+)\*/g, function(match, x1) {
-            parser_count += 1;
-            let parser_count_str = String(parser_count);
-            
-            parser_data_temp['render' + parser_count_str + 'Span'] = '<i>';
-            parser_data_temp['/render' + parser_count_str + 'Span'] = '</i>';
-            
-            return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
-        });
-        
-        this.doc_data = this.doc_data.replace(/<uBar>(((?!<uBar>).)+)<uBar>/g, function(match, x1) {
-            parser_count += 1;
-            let parser_count_str = String(parser_count);
-            
-            parser_data_temp['render' + parser_count_str + 'Span'] = '<i>';
-            parser_data_temp['/render' + parser_count_str + 'Span'] = '</i>';
-            
-            return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
-        });
-        
-        this.doc_data = this.doc_data.replace(/&lt;ins&gt;((?:(?!&lt;ins&gt;|&lt;\/ins&gt;|\n).)+)&lt;\/ins&gt;/g, function(match, x1) {
-            parser_count += 1;
-            let parser_count_str = String(parser_count);
-            
-            parser_data_temp['render' + parser_count_str + 'Span'] = '<u>';
-            parser_data_temp['/render' + parser_count_str + 'Span'] = '</u>';
-            
-            return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
-        });
-        
-        this.doc_data = this.doc_data.replace(/&lt;sub&gt;((?:(?!&lt;sub&gt;|&lt;\/sub&gt;|\n).)+)&lt;\/sub&gt;/g, function(match, x1) {
-            parser_count += 1;
-            let parser_count_str = String(parser_count);
-            
-            parser_data_temp['render' + parser_count_str + 'Span'] = '<sub>';
-            parser_data_temp['/render' + parser_count_str + 'Span'] = '</sub>';
-            
-            return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
-        });
-        
-        this.doc_data = this.doc_data.replace(/&lt;sup&gt;((?:(?!&lt;sup&gt;|&lt;\/sup&gt;|\n).)+)&lt;\/sup&gt;/g, function(match, x1) {
-            parser_count += 1;
-            let parser_count_str = String(parser_count);
-            
-            parser_data_temp['render' + parser_count_str + 'Span'] = '<sup>';
-            parser_data_temp['/render' + parser_count_str + 'Span'] = '</sup>';
-            
-            return '<render' + parser_count_str + 'Span>' + x1 + '</render' + parser_count_str + 'Span>';
-        });
-        
-        this.parser_count['parser'] = parser_count;
-        this.parser_data_temp = parser_data_temp;
-    }
-    
-    do_part_heading() {
-        let parser_count = this.parser_count['parser'];
-        let parser_data_temp = this.parser_data_temp;
-        
-        let toc_data = '';
-        
-        let heading_n = 0;
-        let heading_list = [0, 0, 0, 0, 0, 0];
-        let heading_regex = /\n(#{1,6})([^#][^\n]*)\n/;
-        while(this.doc_data.match(heading_regex)) {
-            this.doc_data = this.doc_data.replace(heading_regex, function(match, x1, x2) {
-                let heading_level = x1.length - 1;
-                let heading_level_str = String(heading_level + 1);
-
-                heading_list[heading_level] += 1;
-                for(let for_a = heading_level + 1; for_a < 6; for_a++) {
-                    heading_list[for_a] = 0;
-                }
-
-                let heading_list_str = '';
-                for(let for_a = 0; for_a < 6; for_a++) {
-                    if(heading_list[for_a] !== 0) {
-                        heading_list_str += String(heading_list[for_a]) + '.'
-                    }
-                }
-                
-                let heading_list_str_2 = heading_list_str.replace(/\.$/, '');
-                
-                heading_n += 1;
-                let heading_n_str = String(heading_n);
-                
-                toc_data += '' +
-                    '<a href="#opennamu_heading_' + heading_list_str_2 + '">' + heading_list_str + '</a> ' +
-                    '<span id="opennamu_TOC_content_' + heading_n_str + '"></span>' +
-                    '<br>' +
-                ''
-                
-                let heading_data = x2;
-                heading_data = heading_data.replace(/^ /, '');
-
-                return '' + 
-                    '\n<brEnd>' + 
-                    '<h' + heading_level_str + ' id="opennamu_heading_' + heading_list_str_2 + '">' + 
-                        '<a href="#opennamu_TOC">' + heading_list_str + '</a> ' + 
-                        '<span id="opennamu_heading_content_' + heading_n_str + '">' + heading_data + '</span>' + 
-                    '</h' + heading_level_str + '>' +
-                    '<brStart>\n' +
-                '';
-            });
-        }
-        
-        this.parser_data_temp_other['toc'] = toc_data;
-    }
-    
-    do_part_image() {
-        let render_main = this;
-        let render_part_id_add = this.render_part_id_add;
-        
-        let parser_count = this.parser_count['parser'];
-        let parser_data_temp = this.parser_data_temp;
-        
-        this.doc_data = this.doc_data.replace(/!\[([^\[\]\n]*)\]\(([^\(\)\n]*)\)/g, function(match, x1, x2) {
-            if(x1 === '' && x2 === '') {
-                return '<imageBlink>';
-            } else {
-                if(x2 !== '' && x2.match(/^https?:\/\//)) {
-                    parser_count += 1;
-                    let parser_count_str = String(parser_count);
-                    
-                    let image_src = render_main.do_func_xss_encode(x2);
-                    let image_alt;
-                    if(x1 !== '') {
-                        image_alt = render_main.do_func_xss_encode(x1);
-                    } else {
-                        image_alt = image_src;
-                    }
-                    
-                    parser_data_temp['render' + parser_count_str + 'Span'] = '<img alt="' + image_alt + '" src="' + image_src + '">';
-                    parser_data_temp['/render' + parser_count_str + 'Span'] = '';
-
-                    return '<render' + parser_count_str + 'Span></render' + parser_count_str + 'Span>';
-                } else {
-                    parser_count += 1;
-                    let parser_count_str = String(parser_count);
-
-                    parser_data_temp['render' + parser_count_str + 'Span'] = '<img>';
-                    parser_data_temp['/render' + parser_count_str + 'Span'] = '';
-
-                    return '<render' + parser_count_str + 'Span></render' + parser_count_str + 'Span>';
-                }
-            }
-        });
-        
-        this.doc_data = this.doc_data.replace(/<imageBlink>/g, '![]()');
-        
-        this.parser_count['parser'] = parser_count;
-        this.parser_data_temp = parser_data_temp;
-    }
-    
-    do_part_link() {
-        let render_main = this;
-        let render_part_id_add = this.render_part_id_add;
-        
-        let parser_count = this.parser_count['parser'];
-        let parser_data_temp = this.parser_data_temp;
-        
-        this.doc_data = this.doc_data.replace(/\[([^\[\]\n]*)\]\(([^\(\)\n]*)\)/g, function(match, x1, x2) {
-            if(x1 === '' && x2 === '') {
-                return '<linkBlink>';
-            } else {
-                if(x2 !== '' && x2.match(/^https?:\/\//)) {
-                    parser_count += 1;
-                    let parser_count_str = String(parser_count);
-                    
-                    let link_main = render_main.do_func_parser_to_text(x2, 'nowikiLink');
-                    link_main = render_main.do_func_xss_encode(link_main);
-                    
-                    let link_sub;
-                    if(x1 === '') {
-                        link_sub = x2;
-                    } else {
-                        link_sub = x1;
-                    }
-                    
-                    parser_data_temp['render' + parser_count_str + 'Span'] = '<a class="opennamu_link_out" href="' + link_main + '">';
-                    parser_data_temp['/render' + parser_count_str + 'Span'] = '</a>';
-
-                    return '<render' + parser_count_str + 'Span>' + link_sub + '</render' + parser_count_str + 'Span>';
-                } else {
-                    parser_count += 1;
-                    let parser_count_str = String(parser_count);
-
-                    let link_main;
-                    let link_sub;
-                    let link_title;
-                    if(x2 === '') {
-                        link_main = x1;
-                        link_sub = x1;
-                    } else if(x1 === '') {
-                        link_main = x2;
-                        link_sub = x2;
-                    } else {
-                        link_main = x2;
-                        link_sub = x1;
-                    }
-                    
-                    link_main = render_main.do_func_parser_to_text(link_main, 'nowikiLink');
-                    link_main = render_main.do_func_xss_encode(link_main);
-                    
-                    link_title = link_main;
-
-                    link_main = render_main.do_func_xss_decode(link_main);
-                    link_main = opennamu_do_url_encode(link_main);
-
-                    parser_data_temp['render' + parser_count_str + 'Span'] = '<a class="' + render_part_id_add + 'opennamu_link" title="' + link_title + '" href="/w/' + link_main + '">';
-                    parser_data_temp['/render' + parser_count_str + 'Span'] = '</a>';
-
-                    return '<render' + parser_count_str + 'Span>' + link_sub + '</render' + parser_count_str + 'Span>';
-                }
-            }
-        });
-        
-        this.doc_data = this.doc_data.replace(/<linkBlink>/g, '[]()');
-        
-        this.doc_data = this.doc_data.replace(/&lt;(https?:\/\/(?:(?:(?!&lt;|&gt;).)+))&gt;/g, function(match, x1) {
-            parser_count += 1;
-            let parser_count_str = String(parser_count);
-            
-            let link_main = render_main.do_func_parser_to_text(x1, 'nowikiLink');
-            link_main = render_main.do_func_xss_encode(link_main);
-            
-            let link_sub = x1;
-
-            parser_data_temp['render' + parser_count_str + 'Span'] = '<a class="opennamu_link_out" href="' + link_main + '">';
-            parser_data_temp['/render' + parser_count_str + 'Span'] = '</a>';
-
-            return '<render' + parser_count_str + 'Span>' + link_sub + '</render' + parser_count_str + 'Span>';
-        });
-        
-        this.parser_count['parser'] = parser_count;
-        this.parser_data_temp = parser_data_temp;
-    }
-    
-    do_part_footnote_list() {
-        if(this.parser_data_temp_other['footnote'] !== '') {
-            let footnote = '';
-            footnote += '<ul id="footnote_data">';
-            footnote += this.parser_data_temp_other['footnote'];
-            footnote += '</ul>';
-            
-            this.parser_data_temp_other['footnote'] = '';
-            
-            return footnote;
-        } else {
-            return '';
-        }
-    }
-    
-    do_part_footnote() {
-        let render_main = this;
-        
-        let parser_count = this.parser_count['parser'];
-        let parser_data_temp = this.parser_data_temp;
-        let parser_data_temp_other = this.parser_data_temp_other;
-        
-        let footnote_n = 0;
-        let footnote_name_all = {};
-        this.doc_data = this.doc_data.replace(/(?:\[\^((?:(?!\[\^| ).)*)(?: ((?:(?!\[\^|\]).)+))?\]|(\[fnote\(\)]))/g, function(match, x1, x2, x3) {
-            if(x3 === undefined) {
-                if(x1 === '' && x2 === undefined) {
-                    return '<footnoteBlink>';
-                } else {
-                    footnote_n += 1;
-
-                    let footnote_name;
-                    let footnote_id = String(footnote_n);
-                    if(x1 === '') {
-                        footnote_name = footnote_id;
-                    } else {
-                        footnote_name = x1;
-                    }
-                    
-                    let footnote_content;
-                    if(x2 === undefined) {
-                        if(footnote_name_all[footnote_name]) {
-                            footnote_content = footnote_name_all[footnote_name];
-                        } else {
-                            footnote_content = '';
-                            footnote_name_all[footnote_name] = footnote_content;
-                        }
-                    } else {
-                        footnote_content = x2;
-                        footnote_name_all[footnote_name] = footnote_content;
-                    }
-                    
-                    let footnote_list = '';
-                    footnote_list += '<li>';
-                    footnote_list += '<a id="opennamuFnGo' + footnote_id + '" href="#opennamuFnIn' + footnote_id + '">'
-                    footnote_list += '(' + footnote_name + ')';
-                    footnote_list += '</a>';
-                    footnote_list += ' ';
-                    footnote_list += footnote_content;
-                    footnote_list += '</li>';
-                    
-                    parser_data_temp_other['footnote'] += footnote_list;
-
-                    parser_count += 1;
-                    let parser_count_str = String(parser_count);
-                    
-                    let footnote_data = '';
-                    footnote_data += '<sup>'
-                    footnote_data += '<a id="opennamuFnIn' + footnote_id + '" href="#opennamuFnGo' + footnote_id + '">';
-                    footnote_data += '(' + footnote_name + ')';
-                    footnote_data += '</a>';
-                    footnote_data += '</sup>';
-
-                    parser_data_temp['render' + parser_count_str + 'Span'] = footnote_data;
-                    parser_data_temp['/render' + parser_count_str + 'Span'] = '';
-
-                    return '<render' + parser_count_str + 'Span></render' + parser_count_str + 'Span>';
-                }
-            } else {
-                return render_main.do_part_footnote_list();
-            }
-        });
-        
-        this.doc_data = this.doc_data.replace(/<footnoteBlink>/g, '[^]');
-        this.doc_data += this.do_part_footnote_list();
-        
-        this.parser_count['parser'] = parser_count;
-        this.parser_data_temp = parser_data_temp;
-        this.parser_data_temp_other = parser_data_temp_other;
-    }
-    
-    do_part_macro() {
-        let render_main = this;
-        let render_part_id_add = this.render_part_id_add;
-        
-        let parser_count = this.parser_count['parser'];
-        let parser_data_temp = this.parser_data_temp;
-        let parser_data_temp_other = this.parser_data_temp_other;
-        
-        this.doc_data = this.doc_data.replace(/\[([^\[\(<>\n]+)\(((?:(?!\(|\)\]|<|>|\n).)*)\)\]/g, function(match, x1, x2) {
-            if(x1 === 'anchor') {
-                parser_count += 1;
-                let parser_count_str = String(parser_count);
-                
-                let anchor_data = render_main.do_func_parser_to_text(x2, 'nowiki');
-                anchor_data = render_main.do_func_xss_encode(anchor_data);
-
-                parser_data_temp['render' + parser_count_str + 'Span'] = '<span id="' + anchor_data + '">';
-                parser_data_temp['/render' + parser_count_str + 'Span'] = '</span>';
-
-                return '<render' + parser_count_str + 'Span></render' + parser_count_str + 'Span>' 
-            } else if(x1 === 'category') {
-                let category = x2.split(',');
-
-                let category_data = render_main.do_func_parser_to_text(category[0], 'nowiki');
-                
-                let link_main = 'category:' + category_data;
-                let link_title = render_main.do_func_xss_encode(link_main);
-                
-                link_main = render_main.do_func_xss_decode(link_main);
-                link_main = opennamu_do_url_encode(link_main);
-                
-                parser_data_temp_other['category'] += '<a class="' + render_part_id_add + 'opennamu_link" title="' + link_title + '" href="/w/' + link_main + '">';
-                parser_data_temp_other['category'] += category_data;
-                parser_data_temp_other['category'] += '</a>';
-                parser_data_temp_other['category'] += ' | ';
-                
-                return '';
-            } else if(x1 === 'toc') {
-                if(parser_data_temp_other['toc'] !== '') {
-                    return '' +
-                        '<div id="opennamu_TOC" class="opennamu_TOC">' + 
-                            '<span class="opennamu_TOC_title">' +
-                                'TOC' +
-                            '</span>' + 
-                            '<br>' + 
-                            '<br>' + 
-                            parser_data_temp_other['toc'] + 
-                        '</div>' +
-                    '';
-                } else {
-                    return '';
-                }
-            }
-            else {
-                return match;
-            }
-        });
-        
-        this.parser_count['parser'] = parser_count;
-        this.parser_data_temp = parser_data_temp;
-        this.parser_data_temp_other = parser_data_temp_other;
-    }
-    
-    do_part_nowiki() {
-        let render_main = this;
-        
-        let parser_count = this.parser_count['parser'];
-        let parser_data_temp = this.parser_data_temp;
-
-        this.doc_data = this.doc_data.replace(/\\\n/g, '\n');
-        this.doc_data = this.doc_data.replace(/\\(&#x27;|&quot;|&lt;|&gt;|&amp;|.)/g, function(match, x1) {
-            let nowiki_data = x1;
-            
-            parser_count += 1;
-            let parser_count_str = String(parser_count);
-
-            parser_data_temp['nowiki' + parser_count_str + 'Span'] = match;
-            parser_data_temp['/nowiki' + parser_count_str + 'Span'] = '';
-            
-            parser_data_temp['nowiki' + parser_count_str + 'SpanEnd'] = '<code>' + nowiki_data;
-            parser_data_temp['/nowiki' + parser_count_str + 'SpanEnd'] = '</code>';
-            
-            return '<nowiki' + parser_count_str + 'Span>' + '</nowiki' + parser_count_str + 'Span>';
-        });
-        
-        this.doc_data = this.doc_data.replace(/```((?:(?:(?!```).)|\n)+)```/g, function(match, x1) {
-            let nowiki_data = render_main.do_func_parser_to_text(x1, 'nowiki');
-            
-            parser_count += 1;
-            let parser_count_str = String(parser_count);
-            
-            if(nowiki_data.match(/\n/)) {
-                parser_data_temp['nowiki' + parser_count_str + 'Span'] = match;
-                parser_data_temp['/nowiki' + parser_count_str + 'Span'] = '';
-                
-                parser_data_temp['nowiki' + parser_count_str + 'SpanEnd'] = '<pre>' + nowiki_data;
-                parser_data_temp['/nowiki' + parser_count_str + 'SpanEnd'] = '</pre>';
-            } else {
-                parser_data_temp['nowiki' + parser_count_str + 'Span'] = match;
-                parser_data_temp['/nowiki' + parser_count_str + 'Span'] = '';
-                
-                parser_data_temp['nowiki' + parser_count_str + 'SpanEnd'] = '<code>' + nowiki_data;
-                parser_data_temp['/nowiki' + parser_count_str + 'SpanEnd'] = '</code>';
-            }
-            
-            return '<nowiki' + parser_count_str + 'Span>' + '</nowiki' + parser_count_str + 'Span>';
-        });
-        
-        this.doc_data = this.doc_data.replace(/`([^`\n]+)`/g, function(match, x1) {
-            let nowiki_data = render_main.do_func_parser_to_text(x1, 'nowiki');
-            
-            parser_count += 1;
-            let parser_count_str = String(parser_count);
-            
-            parser_data_temp['nowiki' + parser_count_str + 'Span'] = match;
-            parser_data_temp['/nowiki' + parser_count_str + 'Span'] = '';
-
-            parser_data_temp['nowiki' + parser_count_str + 'SpanEnd'] = '<code>' + nowiki_data;
-            parser_data_temp['/nowiki' + parser_count_str + 'SpanEnd'] = '</code>';
-            
-            return '<nowiki' + parser_count_str + 'Span>' + '</nowiki' + parser_count_str + 'Span>';
-        });
-        
-        this.parser_count['parser'] = parser_count;
-        this.parser_data_temp = parser_data_temp;
-    }
-    
-    do_part_horizon() {        
-        let horizone_regex = /\n((?:\*|\* |-|- ){3,})\n/;
-        while(this.doc_data.match(horizone_regex)) {
-            this.doc_data = this.doc_data.replace(horizone_regex, function(match, x1, x2) {
-                return '\n<brEnd><hr><brStart>\n';
-            });
-        }
-    }
-    
-    do_part_blockquote() {
-        let parser_count = this.parser_count['parser'];
-        let parser_data_temp = this.parser_data_temp;
-        
-        let blockquote_regex = /((?:\n&gt;(?:[^\n]+))+)/;
-        while(this.doc_data.match(blockquote_regex)) {
-            this.doc_data = this.doc_data.replace(blockquote_regex, function(match, x1) {
-                let blockquote_data = '<brStart>' + x1;
-                blockquote_data = blockquote_data.replace(/\n&gt;    ?/g, '\n');
-
-                parser_count += 1;
-                let parser_count_str = String(parser_count);
-
-                parser_data_temp['render' + parser_count_str + 'Span'] = '<blockquote>';
-                parser_data_temp['/render' + parser_count_str + 'Span'] = '</blockquote>';
-
-                return '\n<brEnd><render' + parser_count_str + 'Span>' + blockquote_data + '</render' + parser_count_str + 'Span>';
-            });
-        }
-        
-        this.parser_count['parser'] = parser_count;
-        this.parser_data_temp = parser_data_temp;
-    }
-    
-    do_part_list() {
-        let parser_count = this.parser_count['parser'];
-        let parser_data_temp = this.parser_data_temp;
-        
-        /*
-        // 여기 파트 개선 필요
-        this.doc_data = this.doc_data.replace(/((?:\n(?: )*\* ?(?:[^\n]+))+)/g, function(match, x1) {
-            let list_data = x1;
-            let list_depth = -1;
-            
-            list_data = list_data.replace(/\n( )*\* ?([^\n]+)/g, function(match, x1, x2) {
-                return '';
-            });
-
-            parser_count += 1;
-            let parser_count_str = String(parser_count);
-
-            parser_data_temp['render' + parser_count_str + 'Span'] = '<ul>';
-            parser_data_temp['/render' + parser_count_str + 'Span'] = '</ul>';
-
-            return '\n<brEnd><render' + parser_count_str + 'Span>' + list_data + '</render' + parser_count_str + 'Span>';
-        });
-        */
-        
-        this.parser_count['parser'] = parser_count;
-        this.parser_data_temp = parser_data_temp;
-    }
-    
-    do_part_final() {
-        this.doc_data = this.doc_data.replace(/<brStart>\n?/g, '');
-        this.doc_data = this.doc_data.replace(/\n?<brEnd>/g, '');
-        
-        this.doc_data = this.doc_data.replace(/<uBar>/g, '_');
-        
-        this.doc_data = this.doc_data.replace(/\n/g, '<br>');
-        
-        if(this.parser_data_temp_other['category'] !== '') {
-            let category = this.parser_data_temp_other['category'];
-            category = category.replace(/ \| $/, '');
-            
-            this.doc_data += '<hr class="main_hr">';
-            this.doc_data += '<div id="cate_all"><div id="cate">';
-            this.doc_data += 'Category : ';
-            this.doc_data += category;
-            this.doc_data += '</div></div>';
-        }
-    }
-    
-    // Main Part
-    do_main() {
-        this.do_part_nowiki();
-        this.do_part_list();
-        this.do_part_blockquote();
-        this.do_part_heading();
-        this.do_part_horizon();
-        this.do_part_footnote();
-        this.do_part_macro();
-        this.do_part_image();
-        this.do_part_link();
-        this.do_part_text();
-        this.do_part_final();
-        
-        this.doc_data = this.do_func_parser_to_text(this.doc_data);
-        this.doc_data = this.do_func_parser_to_text(this.doc_data, 'nowikiEnd');
-        
-        document.getElementById(this.render_part_id_add + this.render_part_id_after).innerHTML = this.doc_data;
-        
-        document.getElementById(this.render_part_id_add + this.render_part_id).style.display = "none";
-        document.getElementById(this.render_part_id_add + this.render_part_id_after).style.display = "";
-        
-        for(let x1 in this.parser_data_js) {
-            eval(this.parser_data_js[x1]);
-        }
-        
-        new opennamu_render_wiki(
-            render_part_id_add = this.render_part_id_add
-        ).do_main();
-    }
-}

+ 0 - 88
views/main_css/js/render/wiki.js

@@ -1,88 +0,0 @@
-"use strict";
-
-class opennamu_render_wiki {
-    constructor(
-        render_part_id_add
-    ) {
-        this.render_part_id_add = render_part_id_add;
-    }
-    
-    do_part_image() {
-        
-    }
-    
-    do_part_link() {
-        let render_part_id_add = this.render_part_id_add;
-        
-        let link_list = {};
-        let link_list_sub = [];
-        for(
-            let for_a = 0;
-            document.getElementsByClassName(this.render_part_id_add + 'opennamu_link')[for_a];
-            for_a++
-        ) {
-            let link_data = document.getElementsByClassName(this.render_part_id_add + 'opennamu_link')[for_a];
-            
-            link_list_sub.push(link_data.title);
-            
-            if(!link_list[link_data.title]) {
-                link_list[link_data.title] = [for_a];
-            } else {
-                link_list[link_data.title].push(for_a);
-            }
-        }
-        
-        let data_form = new FormData();
-        data_form.append('title_list', JSON.stringify(link_list_sub));
-        
-        let xhr = new XMLHttpRequest();
-        xhr.open("POST", "/api/w/test/doc_tool/exist");
-        xhr.send(data_form);
-        xhr.onreadystatechange = function() {
-            if(this.readyState === 4 && this.status === 200) {
-                let xhr_data = JSON.parse(this.responseText);
-                for(let for_a in link_list) {
-                    if(!xhr_data[for_a]) {
-                        for(let for_b in link_list[for_a]) {
-                            document.getElementsByClassName(render_part_id_add + 'opennamu_link')[link_list[for_a][for_b]].id = "not_thing";
-                        }
-                    }
-                }
-            }
-        }
-    }
-    
-    do_part_toc() {
-        if(document.getElementById('opennamu_TOC_content_1')) {
-            for(
-                let for_a = 1;
-                document.getElementById('opennamu_heading_content_' + String(for_a));
-                for_a++
-            ) {
-                let heading_data = document.getElementById('opennamu_heading_content_' + String(for_a));
-                document.getElementById('opennamu_TOC_content_' + String(for_a)).innerHTML = heading_data.innerText;
-
-                document.getElementById('opennamu_heading_content_' + String(for_a)).id = heading_data.innerText;
-            }
-
-            let toc_data_all = document.getElementsByClassName('opennamu_TOC');
-            let toc_data = '';
-            for(
-                let for_a = 0;
-                for_a < toc_data_all.length;
-                for_a++
-            ) {
-                if(toc_data === '') {
-                    toc_data = toc_data_all[0].innerHTML;
-                }
-
-                document.getElementsByClassName('opennamu_TOC')[for_a].innerHTML = toc_data;
-            }
-        }
-    }
-    
-    do_main() {
-        this.do_part_link();
-        this.do_part_toc();
-    }
-}

+ 0 - 1501
views/main_css/js/render_onmark.js

@@ -1,1501 +0,0 @@
-// 중괄호 문법 정리
-// Tool
-function do_url_change(data) {
-    return encodeURIComponent(data);
-}
-
-function do_nowiki_change(data, data_nowiki, type = 'normal') {
-    return data.replace(/<span id="((?:[^"]*)(?:nowiki_(?:[^"]+)))"><\/span>/g, function(x, x_1) {
-        if(type === 'normal') {
-            return data_nowiki[x_1];
-        } else {
-            return '\\' + data_nowiki[x_1];
-        }
-    });
-}
-
-function do_link_change(data, data_nowiki, no_change) {
-    data = data.replace(/^:/, '');
-    
-    if(no_change === 0) {
-        data = data.replace(/^사용자:/, 'user:');
-        data = data.replace(/^분류:/, 'category:');
-        data = data.replace(/^파일:/, 'file:');
-    }
-    
-    var data_var = data.split('#');
-    var link_main = data.replace(/#(.*)$/, '');
-    var link_sub = data_var.length !== 1 ? ('#' + data_var[data_var.length - 1]) : '';
-    
-    link_main = do_nowiki_change(link_main, data_nowiki);
-    link_main = do_xss_change(link_main);
-    
-    return [link_main, link_sub];
-}
-
-function do_darkmode_split(data) {
-    if(
-        document.cookie.match(opennamu_cookie_split_regex('main_css_darkmode')) &&
-        document.cookie.match(opennamu_cookie_split_regex('main_css_darkmode'))[1] === '1'
-    ) {
-        let data_split = data.split(',');
-        if(data_split.length > 1) {
-            return data.split(',')[1];
-        } else {
-            return data.split(',')[0];
-        }
-    } else {
-        return data.split(',')[0];
-    }
-}
-
-function do_js_safe_change(data, br_on = 1) {
-    data = data.replace(/\\/g, '\\\\');
-    data = data.replace(/"/g, '\\"');
-    if(br_on === 1) {
-        data = data.replace(/\n/g, '<br>');
-    } else {
-        data = data.replace(/\n/g, '\\n');
-    }
-    
-    return data;
-}
-
-function do_math_try_insert(name_ob, data) {
-    return '' + 
-        'try {\n' + 
-            'katex.render("' + data + '", document.getElementById(\"' + name_ob + '\"));\n' + 
-        '} catch {\n' + 
-            'document.getElementById(\"' + name_ob + '\").innerHTML = "<span style=\'color: red;\'>' + data + '</span>";\n' + 
-        '}\n' + 
-    ''
-}
-
-function do_data_try_insert(name_ob, data) {
-    return '' +
-        'if(document.getElementById("' + name_ob + '")) {\n' + 
-            'document.getElementById("' + name_ob + '").innerHTML = "' + data + '";\n' + 
-        '}\n' +
-    ''
-}
-
-function do_all_try(data) {
-    return '' +
-        'try {\n'
-            + data + 
-        '} catch {}\n' +
-    ''
-}
-
-function do_px_add(data) {
-    if(data) {
-        return data.match(/^[0-9]+$/) ? (data + 'px') : data;
-    } else {
-        return '';
-    }
-}
-
-function do_return_date() {
-    var today_data = new Date();
-
-    return '' +
-        String(today_data.getFullYear()) + '-' + 
-        ((today_data.getMonth() + 1) < 10 ? '0' : '') + String(today_data.getMonth() + 1) + '-' + 
-        (today_data.getDate() < 10 ? '0' : '') + String(today_data.getDate()) + ' ' + 
-        (today_data.getHours() < 10 ? '0' : '') + String(today_data.getHours()) + ':' + 
-        (today_data.getMinutes() < 10 ? '0' : '') + String(today_data.getMinutes()) + ':' + 
-        (today_data.getSeconds() < 10 ? '0' : '') + String(today_data.getSeconds()) +
-    '';
-}
-
-function do_xss_change(data) {
-    data = data.replace(/&lt;/g, '<');
-    data = data.replace(/&gt;/g, '>');
-    data = data.replace(/&amp;/g, '&');
-    data = data.replace(/&quot;/g, '"');
-    
-    return data;
-}
-
-function do_html_escape(data) {
-    data = data.replace(/</g, '&lt;');
-    data = data.replace(/>/g, '&gt;');
-    data = data.replace(/&/g, '&amp;');
-    data = data.replace(/"/g, '&quot;');
-    
-    return data
-}
-
-function do_end_br_replace(data) {
-    data = data.replace(/(\n| )+$/, '\n');
-    
-    return data;
-}
-
-// Sub
-function do_onmark_text_render(data) {    
-    data = data.replace(/'''((?:(?!''').)+)'''/g, '<b>$1</b>');
-    data = data.replace(/''((?:(?!'').)+)''/g, '<i>$1</i>');
-    data = data.replace(/__((?:(?!__).)+)__/g, '<u>$1</u>');
-    
-    data = data.replace(/\^\^\^((?:(?!\^\^\^).)+)\^\^\^/g, '<sup>$1</sup>');
-    data = data.replace(/\^\^((?:(?!\^\^).)+)\^\^/g, '<sup>$1</sup>');
-    
-    data = data.replace(/,,,((?:(?!,,,).)+),,,/g, '<sub>$1</sub>');
-    data = data.replace(/,,((?:(?!,,).)+),,/g, '<sub>$1</sub>');
-    
-    data = data.replace(/--((?:(?!--).)+)--/g, '<s>$1</s>');
-    data = data.replace(/~~((?:(?!~~).)+)~~/g, '<s>$1</s>');
-    
-    return data;
-}
-
-function do_onmark_set_toc_name(toc_name) {
-    let toc_data = document.getElementById("heading_text_" + toc_name).innerText;
-    
-    for(let for_a = 0; document.getElementsByClassName("toc_text_" + toc_name)[for_a]; for_a++) {
-        document.getElementsByClassName("toc_text_" + toc_name)[for_a].innerHTML = toc_data;
-    }
-}
-
-function do_onmark_heading_render(
-    data, 
-    data_js, 
-    name_doc, 
-    name_include
-) {
-    var heading_re = /\n(={1,6})(#)? ?([^\n]+) ?#?={1,6}\n/;
-    var heading_level_all = [0, 0, 0, 0, 0, 0];
-    var toc_data = '';
-    var toc_n = 0;
-    while(1) {        
-        toc_n += 1;
-        
-        var heading_data = data.match(heading_re);
-        if(!heading_data) {
-            break;
-        }
-        
-        if(toc_data === '') {
-            toc_data += '<div id="toc"><div id="toc_title">TOC</div>\n';
-        }
-          
-        var heading_level = heading_data[1].length;
-        heading_level_all[heading_level - 1] += 1;
-
-        var i = 6;
-        while(i > heading_level - 1) {
-            heading_level_all[i] = 0;
-
-            i -= 1;
-        }
-
-        heading_level = String(heading_level);
-        var heading_level_string = '';
-        i = 0;
-        while(i < 6) {
-            if(heading_level_all[i] !== 0) {
-                heading_level_string += String(heading_level_all[i]) + '.';
-            }
-
-            i += 1;
-        }
-        
-        var heading_level_string_no_end = heading_level_string.replace(/\.$/, '');
-        
-        var heading_data_text = heading_data[3].replace(/=+$/, '');
-        heading_data_text = heading_data_text.replace(/#$/, '');
-        heading_data_text = heading_data_text.replace(/ $/, '');
-        
-        toc_data += '' +
-            '<span style="margin-left: ' + String((heading_level_string.match(/\./g).length - 1) * 10) + 'px;">' +
-                '<a href="#s-' + heading_level_string_no_end + '">' + 
-                    heading_level_string + 
-                '</a> ' + 
-                '<span class="toc_text_' + heading_level_string_no_end + '"></span>' +
-            '</span>' +
-            '\n' +
-        ''
-        data_js += 'do_onmark_set_toc_name("' + heading_level_string_no_end + '");\n';
-        
-        data = data.replace(heading_re, function() {
-            return '' +
-                '\n' +
-                (toc_n === 1 ? '' : '</div>') +
-                '<h' + heading_level + ' class="render_heading_text">' + 
-                    '<a href="#toc" id="s-' + heading_level_string_no_end + '">' + heading_level_string + '</a> ' + 
-                    '<span id="heading_text_' + heading_level_string_no_end + '">' +
-                        heading_data_text + 
-                    '</span> ' +
-                    '<a id="edit_load_' + String(toc_n) + '" ' +
-                        'style="font-size: 70%;"' +
-                        'href="/edit_section/' + String(toc_n) + '/' + do_url_change(name_doc) + '">✎</a> ' +
-                    '<a href="javascript:void(0);" ' +
-                        'onclick="javascript:do_open_folding(\'' + name_include + 'in_data_' + String(toc_n) + '\', this);"' +
-                        'style="font-size: 70%;">' + (heading_data[2] ? '⊕' : '⊖') + '</a>' +
-                '</h' + heading_level + '>' +
-                '<div   id="' + name_include + 'in_data_' + String(toc_n) + '" ' +
-                        'style="display: ' + (heading_data[2] ? 'none' : 'block') + ';">' +
-                '<end_point>\n' +
-            ''
-        });
-    }
-    
-    if(toc_data !== '') {
-        toc_data += '</div>';
-
-        data = do_end_br_replace(data) + '</div>';
-    }
-    
-    var toc_auto_add = data.match(/\[(?:목차|toc)\(no\)\]/);
-    var toc_re = /\[(?:toc|목차)\]/g;
-    if(toc_auto_add) {
-        data = data.replace(/\[(?:목차|toc)\(no\)\]/g, '');
-    } else {
-        if(name_include === '' && !data.match(toc_re)) {
-            data = data.replace(/(<h[1-6] (?:[^>]+)>)/, '<div id="auto_toc">' + toc_data + '</div>$1');
-        }
-    }
-    
-    data = data.replace(toc_re, toc_data);
-    
-    return [data, data_js];
-}
-
-function do_onmark_link_render(data, data_js, name_doc, name_include, data_nowiki, data_wiki_set) {
-    var num_link = 0;
-    
-    var category_data = '';
-    
-    var category_re = /^(분류|category):/i;
-    let inter_re = /^inter:([^:]+):/i;
-    let out_link_re = /^http(s)?:\/\//i;
-    var file_re = /^(파일|file|외부|out):/i;
-    
-    var link_re = /\[\[(((?!\[\[|\]\]).)+)\]\]/;
-    
-    while(data.match(link_re)) {
-        data = data.replace(link_re, function(x, x_1) {
-            var link_split = x_1.split('|');
-            var link_real = link_split[0];
-            var link_out = link_split[1] ? link_split[1] : link_split[0];
-            var link_out_2 = link_split[1] ? link_split[1] : '';
-
-            num_link += 1;
-            var num_link_str = String(num_link - 1);
-            if(link_real.match(/<|>/)) {
-                return '<link_s>' + x_1 + '<link_e>';
-            } else if(link_real.match(file_re)) {
-                var file_load_type = link_real.match(file_re)[1];
-                var file_name = link_real.replace(file_re, '');
-
-                if(file_load_type === '파일' || file_load_type === 'file') {
-                    var file_type = file_name.split('.');
-                    file_name = file_type.slice(0, file_type.length - 1).join('.');
-                    file_type = file_type[file_type.length - 1];
-
-                    var file_src = do_url_change(do_xss_change(file_name)) + '.' + do_html_escape(file_type);
-                    var file_alt = do_html_escape(file_name + '.' + file_type);
-                    var file_exist = 1;
-                } else {
-                    var file_src = do_html_escape(file_name);
-                    var file_alt = do_html_escape(file_name);
-                    var file_exist = 0;
-                }
-
-                var file_style = '';
-                var file_bgcolor = '';
-                var file_align = '';
-
-                var file_set = link_out_2.split('&amp;');
-                for(let i = 0; file_set[i]; i++) {
-                    var file_set_name = file_set[i].split('=');
-                    var file_set_data = file_set_name[1];
-                    file_set_name = file_set_name[0];
-                    
-                    if(file_set_data) {
-                        if(file_set_name === 'width') {
-                            file_style += 'width:' + do_px_add(file_set_data) + ';';
-                        } else if(file_set_name === 'height') {
-                            file_style += 'height:' + do_px_add(file_set_data) + ';';
-                        } else if(file_set_name === 'bgcolor') {
-                            file_bgcolor += 'background:' + file_set_data + ';';
-                        } else if(file_set_name === 'alt') {
-                            file_alt += file_set_data;
-                        } else if(file_set_name === 'align') {
-                            if(file_set_data === 'center') {
-                                file_align = 'display: block; text-align: center;';
-                            } else {
-                                file_align = 'float: ' + file_set_data + ';';
-                            }
-                        }
-                    }
-                }
-
-                return '' +
-                    '<span style="' + file_align + '">' + 
-                        '<span  style="' + file_bgcolor + '" ' +
-                                'class="' + name_include + 'file_finder" ' +
-                                'under_style="' + file_style + '" ' +
-                                'under_alt="' + file_alt + '" ' +
-                                'under_src="' + file_src + '" ' +
-                                'under_href="' + (file_exist === 0 ? "out_link" : '/upload?name=' + file_src.replace(/\.[^.]+$/, '')) + '">' +
-                        '</span>' + 
-                    '</span>' +
-                ''
-            } else if(link_real.match(category_re)) {
-                var category_link = link_real.replace(category_re, '');
-
-                data_js += '' +
-                    'document.getElementsByName("' + name_include + 'set_link_' + num_link_str + '")[0].href = ' + 
-                        '"/w/category:' + do_url_change(category_link) + '";' +
-                    '\n' +
-                '';
-                data_js += '' +
-                    'document.getElementsByName("' + name_include + 'set_link_' + num_link_str + '")[0].title = ' + 
-                        '"' + do_js_safe_change(do_xss_change('category:' + category_link)) + '";' +
-                    '\n' +
-                '';
-
-                category_data += '' +
-                    '<a class="' + name_include + 'link_finder" ' +
-                        'name="' + name_include + 'set_link_' + num_link_str + '" ' +
-                        'href="" ' +
-                        'title="">' +
-                        category_link +
-                    '</a> | ' +
-                ''
-
-                return '';
-            } else if(link_real.match(out_link_re)) {
-                var i = 0;
-                while(i < 2) {
-                    if(i === 0) {
-                        var var_link_type = 'href';
-                    } else {
-                        var var_link_type = 'title';
-                    }
-
-                    data_js += '' +
-                        'document.getElementsByName("' + name_include + 'set_link_' + num_link_str + '")[0].' + var_link_type + ' = ' + 
-                            '"' + do_js_safe_change(do_xss_change(link_real)) + '";' +
-                        '\n' +
-                    '';
-
-                    i += 1;
-                }
-
-                return  '<a id="out_link" ' +
-                            'class="' + name_include + 'link_finder" ' +
-                            'target="_blank" ' +
-                            'name="' + name_include + 'set_link_' + num_link_str + '" ' + 
-                            'title=""' +
-                            'href="">' + link_out + '</a>';
-            } else if(link_real.match(inter_re)) {
-                let data_inter = link_real.match(inter_re);
-                
-                let data_inter_link = '';
-                let data_inter_logo = '';
-                if(data_inter) {
-                    if(link_real === link_out) {
-                        link_real = link_real.replace(
-                            inter_re, 
-                            ''
-                        );
-                        
-                        link_out = link_real;
-                    } else {
-                        link_real = link_real.replace(
-                            inter_re, 
-                            ''
-                        );
-                    }
-                    
-                    var data_inter_var = do_link_change(link_real, data_nowiki, 1);
-                    var data_inter_link_main = data_inter_var[0];
-                    var data_inter_link_sub = data_inter_var[1];
-                        
-                    let data_inter_get = data_wiki_set['inter_wiki'][data_inter[1]];
-                    if(data_inter_get) {
-                        data_inter_link = data_inter_get['link'];
-                        if(data_inter_get['logo'] !== '') {
-                            data_inter_logo = data_inter_get['logo'];
-                            data_inter_logo = data_inter_logo.replace(/&lt;/g, '<').replace(/&gt;/g, '>');
-                        } else {
-                            data_inter_logo = data_inter[1] + ':';
-                        }
-                    } else {
-                        return '';
-                    }
-                    
-                    data_js += '' +
-                        'document.getElementsByName("' + name_include + 'set_link_' + num_link_str + '")[0].title = ' + 
-                        '"' + do_js_safe_change(do_xss_change(data_inter[1] + ':' + link_real)) + '";' +
-                            '\n' +
-                    '';
-                    data_js += '' +
-                        'document.getElementsByName("' + name_include + 'set_link_' + num_link_str + '")[0].href = ' + 
-                        '"' + data_inter_link + do_url_change(data_inter_link_main) + data_inter_link_sub + '";' +
-                            '\n' +
-                    '';
-
-                    return  '<a id="inside" ' +
-                                'class="' + name_include + 'link_finder" ' +
-                                'target="_blank" ' +
-                                'name="' + name_include + 'set_link_' + num_link_str + '" ' + 
-                                'title=""' +
-                                'href="">' + data_inter_logo + link_out + '</a>'; 
-                } else {
-                    return '';
-                }
-            } else {
-                if(link_real.match(/^\//)) {
-                    link_real = name_doc + link_real;
-                } else if(link_real.match(/^\.\.\//)) {
-                    link_real = link_real.replace(/^\.\.\//, '');
-                    link_real = name_doc.replace(/\/[^/]+$/, '') + (link_real !== '' ? '/' + link_real : '');
-                }
-                
-                var link_data_var = do_link_change(link_real, data_nowiki, 0);
-                var link_main = link_data_var[0];
-                var link_sub = link_data_var[1];
-                
-                let link_id = "real_normal_link"
-
-                var i = 0;
-                while(i < 2) {
-                    if(i === 0) {
-                        var var_link_type = 'href';
-                        if(link_main === '') {
-                            link_id = "in_doc_link"
-                            var var_link_data = link_sub;
-                        } else {
-                            var var_link_data = '/w/' + do_url_change(link_main) + link_sub;
-                        }
-                    } else {
-                        var var_link_type = 'title';
-                        var var_link_data = do_js_safe_change(link_main);
-                    }
-
-                    data_js += '' +
-                        'document.getElementsByName("' + name_include + 'set_link_' + num_link_str + '")[0].' + var_link_type + ' = ' + 
-                            '"' + var_link_data + '";' +
-                        '\n' +
-                    '';
-
-                    i += 1;
-                }
-
-                return  '<a class="' + name_include + 'link_finder" ' +
-                            'id="' + link_id + '"' +
-                            'name="' + name_include + 'set_link_' + num_link_str + '" ' +
-                            'title="" ' +
-                            'href="">' + link_out + '</a>';
-            }
-        });
-    }
-    
-    data = data.replace(/<link_s>/, '[[');
-    data = data.replace(/<link_e>/, ']]');
-
-    if(category_data !== '') {
-        if(name_include === '') {
-            category_data = '<div id="cate_all"><div id="cate">Category : ' + category_data;
-        } else {
-            category_data = '<div style="display: none;" id="cate_all"><div id="cate">Category : ' + category_data;
-        }
-        
-        category_data = category_data.replace(/\| $/, '') + '</div></div>';
-    }
-    
-    return [data, data_js, category_data];
-}
-
-function do_onmark_footnote_render(data, name_include) {
-    var footnote_end_data = '';
-    var footnote_all_data = {};
-    var footnote_re = /(?:\[\*([^ \]]*)(?: ((?:(?!\]).)+))?\]|\[(footnote|각주)\])/;
-    var i = 1;
-    while(1) {
-        var footnote_data = data.match(footnote_re);
-        if(!footnote_data) {
-            break;
-        }
-        
-        if(!footnote_data[3]) {
-            if(!footnote_data[2]) {
-                var footnote_line_data = '';
-            } else {
-                var footnote_line_data = footnote_data[2];
-            }
-            
-            if(!footnote_data[1]) {
-                var footnote_name = String(i);
-            } else {
-                var footnote_name = footnote_data[1];
-            }
-            
-            if(!footnote_all_data[footnote_name]) {
-                footnote_all_data[footnote_name] = footnote_line_data;
-            }
-
-            footnote_line_data = footnote_all_data[footnote_name];
-            
-            footnote_end_data += '' +
-                '<li>' +
-                    '<a href="javascript:do_open_foot(\'' + name_include + '\', \'fn-' + String(i) + '\', 1);" ' +
-                        'id="' + name_include + 'cfn-' + String(i) + '">' +
-                        '(' + footnote_name + ')' +
-                    '</a> <span id="' + name_include + 'fn-' + String(i) + '">' + footnote_line_data + '</span>' +
-                '</li>' +
-            '';
-            data = data.replace(footnote_re, function() {
-                return '' +
-                    '<sup>' +
-                        '<a href="javascript:do_open_foot(\'' + name_include + '\', \'fn-' + String(i) + '\', 0);" ' +
-                            'id="' + name_include + 'rfn-' + String(i) + '">' +
-                            '(' + footnote_name + ')' +
-                        '</a>' +
-                    '</sup><span id="' + name_include + 'dfn-' + String(i) + '"></span>' +
-               ''
-            });
-            
-            i += 1;
-        } else {
-            if(footnote_end_data !== '') {
-                footnote_end_data = '<ul id="footnote_data">' + footnote_end_data + '</ul>';   
-            }
-            
-            data = data.replace(footnote_re, function() { return footnote_end_data });    
-            footnote_end_data = '';
-        }
-    }
-    
-    if(footnote_end_data !== '') {
-        data = do_end_br_replace(data) + '<ul id="footnote_data">' + footnote_end_data + '</ul>';
-    }
-    
-    return data;
-}
-
-function do_onmark_macro_render(data, data_js) {
-    data = data.replace(/\[([^[\](]+)\(((?:(?!\)\]).)+)\)\]/g, function(x, x_1, x_2) {
-        x_1 = x_1.toLowerCase();
-        if(x_1 === 'youtube' || x_1 === 'kakaotv' || x_1 === 'nicovideo' || x_1 === 'navertv' || x_1 === 'vimeo') {
-            var video_code = x_2.match(/^([^,]+)/);
-            video_code = video_code ? video_code[1] : '';
-            
-            var video_width = x_2.match(/,(?: *)width=([0-9]+)/);
-            video_width = video_width ? (video_width[1] + 'px') : '640px';
-            
-            var video_height = x_2.match(/,(?: *)height=([0-9]+)/);
-            video_height = video_height ? (video_height[1] + 'px') : '360px';
-            
-            if(x_1 === 'youtube') {
-                var video_start = x_2.match(/,(?: *)start=([0-9]+)/);
-                video_start = video_start ? ('?start=' + video_start[1]) : '';
-                
-                video_code = video_code.replace(/^https:\/\/www\.youtube\.com\/watch\?v=/, '');
-                video_code = video_code.replace(/^https:\/\/youtu\.be\//, '');
-                
-                var video_src = 'https://www.youtube.com/embed/' + video_code + video_start
-            } else if(x_1 === 'kakaotv') {
-                video_code = video_code.replace(/^https:\/\/tv\.kakao\.com\/channel\/9262\/cliplink\//, '');
-                video_code = video_code.replace(/^http:\/\/tv\.kakao\.com\/v\//, '');
-                
-                var video_src = 'https://tv.kakao.com/embed/player/cliplink/' + video_code +'?service=kakao_tv'
-            } else if(x_1 === 'nicovideo') {
-                var video_src = 'https://embed.nicovideo.jp/watch/' + video_code
-            } else if(x_1 === 'navertv') {
-                var video_src = 'https://tv.naver.com/embed/' + video_code
-            } else {
-        var video_src = 'https://player.vimeo.com/video/' + video_code
-        }
-            
-            return '<iframe style="width: ' + video_width + '; height: ' + video_height + ';" src="' + video_src + '" frameborder="0" allowfullscreen></iframe>';
-        } else if(x_1 === 'anchor') {
-            return '<span id="' + x_2 + '"></span>';
-        } else if(x_1 === 'ruby') {
-            let ruby_main_data = x_2.match(/^([^,]+)/);
-            if(ruby_main_data) {
-                ruby_main_data = ruby_main_data[1];
-            } else {
-                ruby_main_data = 'Test';
-            }
-            
-            let ruby_sub_data = x_2.match(/,(?: *)ruby=([^,]+)/);
-            if(ruby_sub_data) {
-                ruby_sub_data = ruby_sub_data[1];
-            } else {
-                ruby_sub_data = 'Test';
-            }
-            
-            return '<ruby>' + ruby_main_data + '<rp>(</rp><rt>' + ruby_sub_data + '</rt><rp>)</rp></ruby>';
-        } else if(x_1 === 'dday') {
-            var date_old = new Date(x_2);
-            var date_now = new Date(do_return_date());
-            
-            var date_end = Math.floor((date_now - date_old) / (24 * 60 * 60 * 1000));
-            
-            return (date_end > 0 ? '+' : '') + date_end;
-        } else if(x_1 === 'age') {
-            var date_old = new Date(x_2);
-            var date_now = new Date(do_return_date());
-            
-            var date_end = Math.floor((date_now - date_old) / (365 * 24 * 60 * 60 * 1000));
-            
-            return date_end > 0 ? date_end : '';            
-        } else if(x_1 === 'pagecount') {
-            return '0';
-        } else {
-            return '<macro_start>' + x_1 + '(' + x_2 + ')<macro_end>';
-        }
-    });
-    
-    var pagecount_n = 0;
-    data = data.replace(/\[([^[*()\]]+)\]/g, function(x, x_1) {
-        x_1 = x_1.toLowerCase();
-        if(x_1 === 'date' || x_1 === 'datetime') {
-            return do_return_date();
-        } else if(x_1 === 'clearfix') {
-            return '<div style="clear:both"></div>';
-        } else if(x_1 === 'br') { 
-            return '<br>';
-        } else if(x_1 === 'pagecount') {
-            if(pagecount_n === 0) {
-                pagecount_n += 1;
-                
-                data_js += 'page_count();\n';
-            }
-            
-            return '<span class="all_page_count"></span>';
-        } else {
-            return '<macro_start>' + x_1 + '<macro_end>';
-        }
-    });
-    
-    data = data.replace(/<macro_start>/g, '[');
-    data = data.replace(/<macro_end>/g, ']');
-    
-    return [data, data_js];
-}
-
-function do_onmark_middle_render(data, data_js, name_include, data_nowiki, name_doc) {
-    // 이것도 nowiki 처럼 가야할 듯
-    
-    var middle_re = /{{{((?:(?!{{{|}}}).)+)}}}/s;
-    
-    var html_n = 0;
-    var syntax_n = 0;
-    var nowiki_n = 0;
-    var folding_n = 0;
-    
-    while(data.match(middle_re)) {        
-        data = data.replace(middle_re, function(x, x_1) {
-            var middle_data_before = x_1.match(/^({+)/);
-            middle_data_before = middle_data_before ? middle_data_before[1] : '';
-            var middle_data_x_1 = x_1.replace(/^({+)/, '');
-            
-            var middle_data = middle_data_x_1.match(/^([^ ]+) /);
-            middle_data = middle_data ? middle_data[1] : '';
-            if(middle_data) {
-                var middle_data_all = middle_data_x_1.replace(/^([^ ]+) /, '');    
-            }
-
-            var middle_type = middle_data.match(
-                /^(?:(?:(#|@)((?:[0-9a-f-A-F]{3}){1,2}|\w+))(?:,(?:(#|@)((?:[0-9a-f-A-F]{3}){1,2}|\w+)))?|(\+|-)([1-5])|#!(html|wiki|syntax|folding|html))$/i
-            );
-            if(middle_type) {
-                if(middle_data_x_1[middle_data_x_1.length - 1] === '\\') {
-                    return middle_data_before + '{{{' + middle_data_x_1 + '<mid_e>';
-                } else if(middle_type[1]) {
-                    let data_color = middle_type[2];
-                    if(middle_type[3]) {
-                        data_color = do_darkmode_split(middle_type[2] + ',' + middle_type[4])    
-                    }
-                    
-                    let data_sharp = '';
-                    if(data_color.match(/^(?:[0-9a-f-A-F]{3}){1,2}$/)) {
-                        data_sharp = '#';
-                    }
-                    
-                    if(middle_type[1] === '@') {
-                        return middle_data_before + '<span style="background: ' + data_sharp + data_color + '">' + middle_data_all + '</span>';
-                    } else {
-                        return middle_data_before + '<span style="color: ' + data_sharp + data_color + '">' + middle_data_all + '</span>';
-                    }
-                } else if(middle_type[5]) {
-                    if(middle_type[5] === '+') {
-                        return middle_data_before + '<span style="font-size: ' + String(100 + (Number(middle_type[6]) * 20)) + '%">' + middle_data_all + '</span>';
-                    } else {
-                        return middle_data_before + '<span style="font-size: ' + String(100 - (Number(middle_type[6]) * 10)) + '%">' + middle_data_all + '</span>';
-                    }
-                } else if(middle_type[7]) {
-                    var middle_type_sub = middle_type[7].toLowerCase();
-                    if(middle_type_sub === 'html') {
-                        html_n += 1;
-
-                        data_nowiki[name_include + 'nowiki_html_' + String(html_n)] = middle_data_all;
-                        data_js += do_data_try_insert(
-                            name_include + 'nowiki_html_' + String(html_n),
-                            do_js_safe_change(middle_data_all)
-                        );
-
-                        return middle_data_before + '<span id="' + name_include + 'nowiki_html_' + String(html_n) + '"></span>';
-                    } else if(middle_type_sub === 'wiki') {
-                        var middle_wiki_re = /^(?:[^ ]+)(?: style=['"]([^\n'"]*)['"])?[^\n]*\n?/;
-                        var middle_wiki = middle_data_x_1.match(middle_wiki_re);
-                        middle_wiki = middle_wiki[1] ? middle_wiki[1] : '';
-                        middle_wiki = middle_wiki.replace(/position/, '');
-
-                        middle_data_all = middle_data_x_1.replace(middle_wiki_re, '');
-                        
-                        return middle_data_before + '' +
-                            '<wiki_s style="' + middle_wiki + '">' +
-                                '<end_point>\n' + 
-                                middle_data_all + 
-                                '\n<start_point>' +
-                            '<wiki_e>' +
-                        '';
-                    } else if(middle_type_sub === 'folding') {
-                        folding_n += 1;
-                        
-                        var middle_folding_re = /^(?:[^ ]+)(?: ([^\n]*))?\n?/;
-                        var middle_folding = middle_data_x_1.match(middle_folding_re);
-                        middle_folding = middle_folding ? middle_folding[1] : 'open';
-                        
-                        middle_data_all = middle_data_x_1.replace(middle_folding_re, '');
-
-                        data_js += do_data_try_insert('get_' + name_include + 'folding_' + String(folding_n), do_js_safe_change(middle_folding));
-                        return middle_data_before + 
-                            '<div>' +
-                                '<b>' + 
-                                    '<a href="javascript:do_open_folding(\'' + name_include + 'folding_' + String(folding_n) + '\');" ' + 
-                                        'id="get_' + name_include + 'folding_' + String(folding_n) + '">' + 
-                                    '</a>' + 
-                                '</b>' + 
-                                '<div id="' + name_include + 'folding_' + String(folding_n) + '" style="display: none;">' +
-                                    '<wiki_s style="">' +
-                                        '\n' +
-                                        middle_data_all +
-                                        '\n<start_point>' +
-                                    '<wiki_e>' +
-                                '</div>' +
-                            '</div>' +
-                        ''
-                    } else if(middle_type_sub === 'syntax') {
-                        syntax_n += 1;
-
-                        let middle_syntax_re = /^(?:[^ ]+) ([^\n]+)\n?/;
-                        var middle_syntax = middle_data_x_1.match(middle_syntax_re);
-                        middle_syntax = middle_syntax ? middle_syntax[1] : 'python';
-
-                        middle_data_all = middle_data_x_1.replace(middle_syntax_re, '');
-
-                        data_nowiki[name_include + 'nowiki_syntax_' + String(syntax_n)] = middle_data_all;
-                        data_js += do_data_try_insert(
-                            name_include + 'nowiki_syntax_' + String(syntax_n),
-                            do_js_safe_change(do_xss_change(middle_data_all), 0)
-                        );
-
-                        return middle_data_before +
-                            '<pre id="syntax">' +
-                                '<code  id="' + name_include + 'nowiki_syntax_' + String(syntax_n) + '" ' +
-                                        'class="' + middle_syntax + '"></code>' +
-                            '</pre>' +
-                        ''
-                    }
-                }
-            }
-            
-            // 최대한 노력해봐야함
-            nowiki_n += 1;
-            
-            data_nowiki[name_include + 'nowiki_' + String(nowiki_n)] = middle_data_x_1;
-            data_js = do_data_try_insert(
-                name_include + 'nowiki_' + String(nowiki_n),
-                do_js_safe_change(middle_data_x_1)
-            ) + data_js;
-            
-            return middle_data_before + '<span id="' + name_include + 'nowiki_' + String(nowiki_n) + '"></span>';
-        });
-    }
-    
-    data = data.replace(/<mid_s>/g, '{{{');
-    data = data.replace(/<mid_e>/g, '}}}');
-    
-    if(syntax_n > 0) {
-        data_js += 'hljs.highlightAll();\n';
-    }
-    
-    return [data, data_js, data_nowiki];
-}
-
-function do_onmark_last_render(data, name_include, data_category) {       
-    // middle_render 마지막 처리
-    data = data.replace(/<wiki_s_[0-9] /g, '<div ');
-    data = data.replace(/<wiki_e_[0-9]>/g, '</div>');
-    
-    // heading_render 마지막 처리
-    data = data.replace(/\n?<start_point>/g, '');
-    data = data.replace(/<end_point>\n?/g, '');
-    
-    // br 마지막 처리
-    data = data.replace(/^(\n| )+/, '');
-    data = do_end_br_replace(data);
-    data = data.replace(/\n/g, '<br>');
-    
-    if(
-        document.cookie.match(opennamu_cookie_split_regex('main_css_category_set')) &&
-        document.cookie.match(opennamu_cookie_split_regex('main_css_category_set'))[1] === '1'
-    ) {
-        if(data_category !== '') {
-            data = data_category + '<hr class="main_hr">' + data;
-        }
-    } else {
-        data += data_category;
-    }
-
-    return data;
-}
-
-function do_onmark_include_render(data, data_js, name_include, data_nowiki) {
-    var include_re = /\[include\(((?:(?!\)\]).)+)\)\]/i;
-    
-    if(name_include === '') {
-        var i = 0;
-        while(1) {
-            i += 1;
-            
-            var include_data = data.match(include_re);
-            if(!include_data) {
-                break;
-            }
-            
-            var include_name = do_nowiki_change(
-                include_data[1].match(/^([^,]+)/)[1],
-                data_nowiki
-            );
-            var include_add_re = /, *([^=]+)=((?:(?:(?!\)]|,).)+)+)/;
-            var include_add_data = []
-            var include_data = include_data[1];
-            while(1) {
-                var include_add = include_data.match(include_add_re);
-                if(!include_add) {
-                    break;
-                }
-                
-                include_add_data.push([
-                    include_add[1], 
-                    do_nowiki_change(include_add[2], data_nowiki)
-                ]);
-                include_data = include_data.replace(include_add_re, '');
-            }
-            
-            data = data.replace(include_re, function() {
-                return '' + 
-                    '<a id="' + name_include + 'include_link" class="include_' + String(i) + '" href="">(' + include_name + ')</a>' +
-                    '<div id="' + name_include + 'include_' + String(i) + '"></div>' +
-                ''
-            });
-            
-            data_js += 'load_include("' + do_js_safe_change(include_name) + '", "' + name_include + 'include_' + String(i) + '", ' + JSON.stringify(include_add_data) + ');\n'
-        }
-    } else {
-        while(1) {
-            var include_data = data.match(include_re);
-            if(!include_data) {
-                break;
-            }
-            
-            data = data.replace(include_re, '');
-        }
-    }
-    
-    return [data, data_js];
-}
-
-function do_onmark_nowiki_before_render(data, data_js, name_include, data_nowiki) {   
-    var num_nowiki = 0;
-    data = data.replace(/\\(&gt;|&lt;|.)/g, function(x, x_1) {
-        num_nowiki += 1;
-        data_nowiki[name_include + 'nowiki_one_' + String(num_nowiki)] = x_1;
-        data_js += do_data_try_insert(name_include + 'nowiki_one_' + String(num_nowiki), do_js_safe_change(x_1));
-        return '<span id="' + name_include + 'nowiki_one_' + String(num_nowiki) + '"></span>';
-    });
-    
-    return [data, data_js, data_nowiki, num_nowiki];
-}
-
-function do_onmark_table_render_sub(data, data_col) {
-    var data_option_all = {
-        "div" : "",
-        "table" : "",
-        "tr" : "",
-        "td" : "",
-        "col" : data_col,
-        "colspan" : "",
-        "rowspan" : "",
-        "data" : ""
-    };
-    var align_auto = 1;
-    
-    var table_option_re = /&lt;((?:(?!&lt;|&gt;).)+)&gt;/;
-    while(1) {
-        var no_option = '';
-        var data_option = data.match(table_option_re);
-        if(!data_option) {
-            break;
-        }
-        
-        data_option = data_option[1];
-        var data_option_var = data_option.split('=');
-        if(data_option_var.length === 2) {
-            var table_option_name = data_option_var[0].replace(/ /g, '');
-            var table_option_data = data_option_var[1].replace(/"/g, '');
-            if(table_option_name === 'tablebgcolor') {
-                // table
-               data_option_all['table'] += 'background:' + do_darkmode_split(table_option_data) + ';';
-            } else if(table_option_name === 'tablewidth') {
-                data_option_all['table'] += 'width:' + do_px_add(table_option_data) + ';';
-            } else if(table_option_name === 'tableheight') {
-                data_option_all['table'] += 'height:' + do_px_add(table_option_data) + ';';
-            } else if(table_option_name === 'tablealign') {
-                if(table_option_data === 'right') {
-                    data_option_all['div'] += 'float:right;';
-                } else if(table_option_data === 'center') {
-                    data_option_all['div'] += 'margin:auto;';
-                    data_option_all['table'] += 'margin:auto;';
-                }
-            } else if(table_option_name === 'tabletextalign') {
-                data_option_all['table'] += 'text-align:' + table_option_data + ';';
-            } else if(table_option_name === 'tablecolor') {
-                data_option_all['table'] += 'color:' + do_darkmode_split(table_option_data) + ';';
-            } else if(table_option_name === 'tablebordercolor') {
-                data_option_all['table'] += 'border:2px solid ' + do_darkmode_split(table_option_data) + ';';
-            } else if(table_option_name === 'rowbgcolor') {
-                // tr
-                data_option_all['tr'] += 'background:' + do_darkmode_split(table_option_data) + ';';
-            } else if(table_option_name === 'rowtextalign') {
-                data_option_all['tr'] += 'text-align:' + table_option_data + ';';
-            } else if(table_option_name === 'rowcolor') {
-                data_option_all['tr'] += 'color:' + do_darkmode_split(table_option_data) + ';';
-            } else if(table_option_name === 'colcolor') {
-                // col
-                data_option_all['col'] += 'color:' + do_darkmode_split(table_option_data) + ';';
-            } else if(table_option_name === 'colbgcolor') {
-                data_option_all['col'] += 'background:' + do_darkmode_split(table_option_data) + ';';
-            } else if(table_option_name === 'bgcolor') {
-                // td
-                data_option_all['td'] += 'background:' + do_darkmode_split(table_option_data) + ';';
-            } else if(table_option_name === 'color') {
-                data_option_all['td'] += 'color:' + do_darkmode_split(table_option_data) + ';';
-            } else if(table_option_name === 'width') {
-                data_option_all['td'] += 'width:' + do_px_add(table_option_data) + ';';
-            } else if(table_option_name === 'height') {
-                data_option_all['td'] += 'height:' + do_px_add(table_option_data) + ';';
-            } else {
-                no_option = '<lt>' + data_option + '<gt>';
-            }
-        } else {
-            if(data_option.match(/^-[0-9]+$/)) {
-                // span
-                data_option_all['colspan'] = data_option.replace('-', '');
-            } else if(data_option.match(/^(\^|v)?\|[0-9]+$/)) {
-                if(data_option[0] === '^') {
-                    data_option_all['td'] += 'vertical-align: top;';
-                } else if(data_option[0] === 'v') {
-                    data_option_all['td'] += 'vertical-align: bottom;';
-                }
-                
-                data_option_all['rowspan'] = data_option.replace(/[^0-9]+/g, '');
-            } else if(
-                data_option === '(' ||
-                data_option === ':' ||
-                data_option === ')'
-            ) {
-                align_auto = 0;
-                
-                // align
-                if(data_option === '(') {
-                    data_option_all['td'] += 'text-align: left;';
-                } else if(data_option === ':') {
-                    data_option_all['td'] += 'text-align: center;';
-                } else {
-                    data_option_all['td'] += 'text-align: right;';
-                }
-                
-                
-            } else {
-                var table_option_data = data_option.replace(/"/g, '')
-                table_option_data = table_option_data.match(/^((?:(?:#(?:[a-zA-Z0-9]{3}){1,2})|\w+)(?:,(?:(?:#(?:[a-zA-Z0-9]{3}){1,2})|\w+))?)/);
-                if(table_option_data) {
-                    data_option_all['td'] += 'background:' + do_darkmode_split(table_option_data[1]) + ';';
-                } else {
-                    no_option = '<lt>' + data_option + '<gt>';
-                }
-            }
-        }
-        
-        data = data.replace(table_option_re, function() { return no_option });
-    }
-    
-    data = data.replace('<lt>', '&lt;');
-    data = data.replace('<gt>', '&gt;');
-    data_option_all['data'] = data;
-    
-    if(align_auto === 1) {
-        if(
-            data_option_all['data'][0] === ' ' &&
-            data_option_all['data'][data_option_all['data'].length - 1] === ' '
-        ) {
-            data_option_all['td'] += 'text-align:center;';
-        } else if(data_option_all['data'][0] === ' ') {
-            data_option_all['td'] += 'text-align:right;';
-        }
-    }
-    
-    data_option_all['data'] = data_option_all['data'].replace(/^ +| +$/g, '');
-    
-    return data_option_all;
-}
-
-function do_onmark_table_render_main(data) {
-    var table_re = /\n((?:(?:(?:(?:\|\|)+)|(?:\|[^|]+\|(?:\|\|)*))\n?(?:(?:(?!\|\|).)+))(?:(?:\|\||\|\|\n|(?:\|\|)+(?!\n)(?:(?:(?!\|\|).)+)\n*)*)\|\|)\n/gs;
-    data = data.replace(table_re, function(x, x_1) {
-        var table_cel_re = /((?:\|\|)+)((?:(?!\|\|).)*)/gs;
-        var table_data = '';
-        var table_data_org = x_1;
-        
-        var table_col = 0;
-        var table_col_data = {};
-        var table_col_count = {};
-        
-        let table_caption_re = /^\|([^|]+)\|/;
-        let table_caption = '';
-        let table_caption_get = table_data_org.match(table_caption_re);
-        if(table_caption_get) {
-            table_caption = '<caption>' + table_caption_get[1] + '</caption>';
-            table_data_org = table_data_org.replace(table_caption_re, '||');
-        }
-            
-        table_data_org = table_data_org.replace(table_cel_re, function(x, x_1, x_2) {
-            if(!table_col_data[table_col]) {
-                table_col_data[table_col] = '';
-            }
-            
-            if(!table_col_count[table_col]) {
-                table_col_count[table_col] = 0;
-            }
-            
-            if(table_col_count[table_col] !== 0) {
-                table_col_count[table_col] -= 1;
-                table_col += 1;
-            }
-
-            var table_data_option = do_onmark_table_render_sub(x_2, table_col_data[table_col]);
-            table_col_data[table_col] = table_data_option['col'];
-            if(table_data_option['colspan'] === '') {
-                table_data_option['colspan'] = String(x_1.length / 2);
-            }
-
-            if(table_data === '') {
-                table_data += '' + 
-                    '<div class="table_safe" style="' + table_data_option['div'] + '">' +
-                        '<table style="' + table_data_option['table'] + '">' +
-                            table_caption +
-                '';
-            }
-
-            if(x_1 === '||' && (x_2 === '\n' || x_2 === '')) {
-                table_data += '</tr>';
-                table_col = 0;
-            } else if(x_2 === '\n' || x_2 === '') {
-                table_data += '</tr><tr></tr>';
-                table_col = 0;
-            } else {
-                if(table_col === 0) {
-                    table_data += '' + 
-                        '<tr style="' + table_data_option['tr'] + '">' +
-                    ''
-                }
-
-                if(table_data_option['rowspan'] !== '') {
-                    table_col_count[table_col] += Number(table_data_option['rowspan']) - 1;
-                }
-                
-                table_data += '' +
-                    '<td     colspan="' + table_data_option['colspan'] + '" ' +
-                            'rowspan="' + table_data_option['rowspan'] + '" ' +
-                            'style="' + table_data_option['col'] + table_data_option['td'] + '">' + 
-                        table_data_option['data'] + 
-                    '</td>' +
-                '';
-                table_col += 1;
-            }
-
-            return '';
-        });
-        
-        if(table_col === 0) {
-            table_data += '</table></div>';
-        } else {
-            table_data += '</tr></table></div>';
-        }
-        
-        return '\n' + table_data + '\n';
-    });
-    
-    return data;
-}
-
-function do_onmark_table_render(data) {
-    data = data.replace(/\n +\|\|/g, '\n||');
-    
-    var wiki_re = /<wiki_s ([^>]+)>((?:(?!<wiki_s |<wiki_e>).)+)<wiki_e>/s;
-    while(1) {
-        if(!data.match(wiki_re)) {
-            break;
-        }
-        
-        data = data.replace(wiki_re, function(x, x_1, x_2) {
-            return '<wiki_s_2 ' + x_1 + '>' + do_onmark_table_render_main(x_2) + '<wiki_e_2>';
-        });
-    }
-    
-    data = do_onmark_table_render_main(data);
-    
-    return data;
-}
-
-function do_onmark_list_sub_render(data) {
-    var quote_re = /\n((?:(?:(?:&gt;)+) ?(?:(?:(?!\n).)*)\n)+)/;
-    var quote_short_re = /((?:&gt;)+) ?((?:(?!\n).)*)\n/g;
-    var quote_leng = 1;
-    while(1) {
-        var quote_data = data.match(quote_re);
-        if(!quote_data) {
-            break;
-        }
-        
-        var quote_end_data = quote_data[1].replace(quote_short_re, function(x, x_1, x_2) {
-            var quote_leng_now = (x_1.length / 4);
-            var quote_data_part_1 = '';
-            var quote_data_part_2 = '';
-            if(quote_leng < quote_leng_now) {
-                var quote_data_part_1 = ('<blockquote><end_point>\n'.repeat(quote_leng_now - quote_leng));
-            } else if(quote_leng > quote_leng_now) {
-                var quote_data_part_1 = ('\n<start_point></blockquote>'.repeat(quote_leng - quote_leng_now));
-            }
-            
-            quote_leng = quote_leng_now;
-            
-            return '' +
-                quote_data_part_1 + 
-                x_2 + '\n'
-                quote_data_part_2 +
-            '';
-        });
-
-        data = data.replace(quote_re, function() {
-            return '' +
-                '\n' +
-                '<blockquote>' + 
-                    '<end_point>\n' +
-                    quote_end_data + 
-                    '\n<start_point>' +
-                '</blockquote>' +
-                '<end_point>\n' +
-           ''
-        });
-    }
-    
-    var list_re = /\n((?:(?:(?: )*)\* ?(?:(?:(?!\n).)+)\n)+)/;
-    var list_short_re = /((?: )*)\* ?((?:(?!\n).)+)\n/g;
-    while(1) {
-        var list_data = data.match(list_re);
-        if(!list_data) {
-            break;
-        }
-        
-        var list_end_data = list_data[1].replace(list_short_re, function(x, x_1, x_2) {
-            var list_leng = x_1.length;
-            
-            list_leng = list_leng > 0 ? list_leng : 1;
-            
-            return '<li style="margin-left: ' + String(list_leng * 20) + 'px">' + x_2 + '</li>';
-        });
-
-        data = data.replace(list_re, function() { return '\n<ul>' + list_end_data + '</ul><end_point>\n' });
-    }
-    
-    return data;
-}
-
-function do_onmark_list_render(data) {    
-    var wiki_re = /<wiki_s_2 ([^>]+)>((?:(?!<wiki_s_2 |<wiki_e_2>).)+)<wiki_e_2>/s;
-    while(1) {
-        if(!data.match(wiki_re)) {
-            break;
-        }
-
-        data = data.replace(wiki_re, function(x, x_1, x_2) {
-            return '<wiki_s_3 ' + x_1 + '>' + x_2.replace(/\n/g, '<t_br>') + '<wiki_e_3>';
-        });
-    }
-    
-    data = do_onmark_list_sub_render(data);
-    
-    var wiki_re = /<wiki_s_3 ([^>]+)>((?:(?!<wiki_s_3 |<wiki_e_3>).)+)<wiki_e_3>/s;
-    while(1) {
-        if(!data.match(wiki_re)) {
-            break;
-        }
-
-        data = data.replace(wiki_re, function(x, x_1, x_2) {
-            return '<wiki_s_4 ' + x_1 + '>' + x_2.replace(/<t_br>/g, '\n') + '<wiki_e_4>';
-        });
-    }
-    
-    data = do_onmark_list_sub_render(data);
-    
-    return data;
-}
-
-function do_onmark_math_render(data, data_js, name_include, data_nowiki) {
-    data = data.replace(/&lt;math&gt;((?:(?!&lt;\/math&gt;).)+)&lt;\/math&gt;/g, '[math($1)]');
-    
-    var i = 0;
-    data = data.replace(/\[math\((((?!\)]).)+)\)]/g, function(x, x_1) {
-        i += 1;
-        
-        data_js += do_math_try_insert(
-            name_include + 'math_' + String(i), 
-            do_js_safe_change(do_xss_change(do_nowiki_change(x_1, data_nowiki, 'math')))
-        );
-        
-        return '<span id="' + name_include + 'math_' + String(i) + '"></span>';
-    });
-    
-    return [data, data_js];
-}
-
-function do_onmark_hr_render(data) {
-    var hr_re = /\n-{4,9}\n/;
-    while(1) {
-        if(!data.match(hr_re)) {
-            break;
-        }
-        
-        data = data.replace(hr_re, '\n<hr><end_point>\n');
-    }
-    
-    return data;
-}
-
-function do_onmark_redirect_render(data, data_js, name_doc) {
-    var redirect_re = /^\n#(?:redirect|넘겨주기) ([^\n]+)/i;
-    var data_redirect = data.match(redirect_re);
-    if(data_redirect) {
-        var link_data_var = do_link_change(data_redirect[1], {}, 1);
-        var link_main = link_data_var[0];
-        var link_sub = link_data_var[1];
-        
-        if(
-            name_include == '' &&
-            window.location.search === '' &&
-            window.location.pathname.match(/\/w\//)
-        ) {
-            window.location.href = '/w_from/' + do_url_change(link_main);
-        }
-        
-        return [
-            '/w_from/' + do_url_change(link_main), 
-            link_sub,
-            data_js, 
-            1
-        ];
-    } else {
-        return [data, data_js, 0];
-    }
-}
-
-function do_onmark_remark_render(data) {
-    data = data.replace(/\n##([^\n]+)/g, '');
-    
-    return data;
-}
-
-// Main
-// var 쓰인 부분 전부 let으로 변경하기 (호이스팅 혼용 방지)
-// 중첩 함수 구조로 개편하기
-function do_onmark_render(
-    test_mode = 'test', 
-    name_id = '', 
-    name_include = '', 
-    name_doc = '', 
-    doc_data = ''
-) {
-    let data_wiki_set = {};
-    if(test_mode === 'normal') {
-        var data = '\n' + 
-            document.getElementById(name_id + '_load').innerHTML.replace(/\r/g, '') + 
-        '\n';
-    } else if(test_mode === 'manual') { 
-        var data = '\n' + 
-            doc_data.replace(/\r/g, '') + 
-        '\n';
-    } else {
-        var data = '\n' + (
-``
-        ).replace(/\r/g, '') + '\n';
-    }
-    var data_js = '';
-    var data_backlink = [];
-    var data_nowiki = {};
-        
-    name_doc = do_xss_change(name_doc);
-
-    let xhr = new XMLHttpRequest();
-    xhr.open("GET", "/api/setting/inter_wiki");
-    xhr.send();
-
-    xhr.onreadystatechange = function() {
-        if(this.readyState === 4 && this.status === 200) {
-            data_wiki_set = JSON.parse(this.responseText);
-            let data_wiki_set_inter_wiki = { "inter_wiki" : {}};
-            if(data_wiki_set["inter_wiki"]) {
-                for(let i = 0; i < data_wiki_set["inter_wiki"].length; i++) {
-                    data_wiki_set_inter_wiki["inter_wiki"][
-                        data_wiki_set["inter_wiki"][i][0]
-                    ] = {
-                        "link" : data_wiki_set["inter_wiki"][i][1],
-                        "logo" : data_wiki_set["inter_wiki"][i][2]
-                    }
-                }
-            }
-            
-            let data_var = do_onmark_redirect_render(
-                data, 
-                data_js, 
-                name_doc, 
-                name_include
-            );
-            data = data_var[0];
-            data_js = data_var[1];
-            let passing = data_var[2];
-            
-            if(passing === 1) {
-                if(test_mode === 'normal') {
-                    document.getElementById(name_id).innerHTML = data + '<script>' + data_js + '</script>';
-                    eval(data_js);
-                } else if(test_mode === 'manual') {
-                    return [data, data_js];
-                } else {
-                    console.log([data, data_js]);
-                }
-                
-                return 0;
-            }
-            
-            data = do_onmark_remark_render(data);
-            
-            data_var = do_onmark_nowiki_before_render(
-                data, 
-                data_js, 
-                name_include, 
-                data_nowiki
-            );
-            data = data_var[0];
-            data_js = data_var[1];
-            data_nowiki = data_var[2];
-            
-            data_var = do_onmark_math_render(
-                data, 
-                data_js, 
-                name_include, 
-                data_nowiki
-            );
-            data = data_var[0];
-            data_js = data_var[1];
-        
-            data_var = do_onmark_include_render(
-                data, 
-                data_js, 
-                name_include, 
-                data_nowiki
-            );
-            data = data_var[0];
-            data_js = data_var[1];
-        
-            data_var = do_onmark_middle_render(
-                data, 
-                data_js, 
-                name_include, 
-                data_nowiki, 
-                name_doc
-            );
-            data = data_var[0];
-            data_js = data_var[1];
-            data_nowiki = data_var[2];
-        
-            data = do_onmark_text_render(data);
-            data_var = do_onmark_heading_render(
-                data, 
-                data_js, 
-                name_doc, 
-                name_include
-            );
-            data = data_var[0];
-            data_js = data_var[1];
-            
-            data = do_onmark_table_render(data);
-        
-            data_var = do_onmark_link_render(
-                data, 
-                data_js, 
-                name_doc, 
-                name_include,
-                data_nowiki,
-                data_wiki_set_inter_wiki
-            );
-            data = data_var[0];
-            data_js = data_var[1];
-            var data_category = data_var[2];
-        
-            data_var = do_onmark_macro_render(data, data_js);
-            data = data_var[0];
-            data_js = data_var[1];
-            
-            data = do_onmark_list_render(data);
-            data = do_onmark_hr_render(data);
-            data = do_onmark_footnote_render(data, name_include);
-            data = do_onmark_last_render(
-                data, 
-                name_include, 
-                data_category
-            );
-            
-            data_js += '' + 
-                'do_heading_move();\n' + 
-                'get_link_state("' + name_include + '");\n' + 
-                'get_file_state("' + name_include + '");\n' + 
-                'get_heading_name();\n' +
-                'render_html("' + name_include + 'nowiki_html");\n' +
-            ''
-            
-            if(test_mode === 'normal') {
-                document.getElementById(name_id).innerHTML = data + '<script>' + data_js + '</script>';
-                
-                document.getElementById(name_id).style.display = "";
-                document.getElementById(name_id + '_load').style.display = "none";
-                
-                eval(data_js);
-            } else if(test_mode === 'manual') {
-                return [data, data_js];
-            } else {
-                console.log([data, data_js]);
-            }
-        }
-    }
-}

+ 0 - 340
views/main_css/js/render_wiki.js

@@ -1,340 +0,0 @@
-function get_link_state(data) {
-    let data_exter_link = '0';
-    if(document.cookie.match(opennamu_cookie_split_regex('main_css_exter_link'))) {
-        data_exter_link = document.cookie.match(opennamu_cookie_split_regex('main_css_exter_link'))[1];
-    }
-    
-    var link_list = [];
-    var link_list_2 = {}
-    for(var i = 0; document.getElementsByClassName(data + 'link_finder')[i]; i++) {
-        var data_class = document.getElementsByClassName(data + 'link_finder')[i];
-        if(
-            data_class.id !== 'out_link' && 
-            data_class.id !== 'inside' && 
-            data_class.id !== 'in_doc_link'
-        ) {            
-            link_list.push(data_class.title);
-            
-            if(!link_list_2[data_class.title]) {
-                link_list_2[data_class.title] = [i];
-            } else {
-                link_list_2[data_class.title].push(i);
-            }
-        } else if(
-            data_exter_link === '1' && 
-            (
-                data_class.id === 'out_link' ||
-                data_class.id === 'inside'
-            )
-        ) {
-            document.getElementsByClassName(data + 'link_finder')[i].target = '_self';
-        }
-    }
-    
-    var data_form = new FormData();
-    data_form.append('title_list', JSON.stringify(link_list));
-    
-    var xhr = new XMLHttpRequest();
-    xhr.open("POST", "/api/w/test/doc_tool/exist");
-    xhr.send(data_form);
-
-    xhr.onreadystatechange = function() {
-        if(this.readyState === 4 && this.status === 200) {
-            var data_xhr = JSON.parse(this.responseText);
-            for(var key in link_list_2) {
-                if(!data_xhr[key]) {
-                    for(var key_2 in link_list_2[key]) {
-                        document.getElementsByClassName(data + 'link_finder')[link_list_2[key][key_2]].id = "not_thing";
-                    }
-                }
-            }
-        }
-    }
-}
-
-function get_heading_name() {
-    let heading_name = document.getElementsByClassName('render_heading_text');
-    for(let i = 0; i < heading_name.length; i++) {
-        heading_name[i].id = heading_name[i].innerText.replace(/^([0-9]+\.)+ /, '').replace(/ ✎ ⊖$/, '');
-    }
-}
-
-function do_heading_move() {
-    let data_url_v = window.location.hash.replace(/^#/, '');
-    if(data_url_v !== '') {
-        if(document.getElementById(data_url_v)) {
-            document.getElementById(data_url_v).focus();
-        }
-    }
-}
-
-function load_image_link(data, data_type = 0) {
-    let data_end = '';
-    data_end = '' +
-        '<img   style="' + data.getAttribute('under_style') + '" ' + 
-                'alt="' + data.getAttribute('under_alt') + '" ' + 
-                'src="' + data.getAttribute('under_src') + '">' +
-    '';
-    
-    if(data_type === 0) {
-        data.innerHTML = data_end;
-    } else {
-        return data_end;
-    }
-}
-
-function get_file_state_extermal(data, data_exter) {
-    if(document.cookie.match(opennamu_cookie_split_regex('main_css_image_set'))) {
-        var data_image_set = document.cookie.match(opennamu_cookie_split_regex('main_css_image_set'))[1];
-    } else {
-        var data_image_set = '0';
-    }
-    
-    var data_class = document.getElementsByClassName(data + 'file_finder');
-    for(var key in data_exter) {
-        var key = data_exter[key];
-        
-        if(data_image_set === '1') {
-            document.getElementsByClassName(data + 'file_finder')[key].innerHTML = '' +
-                '<a href="' + data_class[key].getAttribute('under_src') + '" ' +
-                    'title="' + data_class[key].getAttribute('under_src') + '">' + 
-                    '(External image link)' + 
-                '</a>' +
-            '';
-        } else if(data_image_set === '2') {
-            document.getElementsByClassName(data + 'file_finder')[key].innerHTML = '' +
-                '<a href="javascript:void(0);" ' +
-                    'onclick="load_image_link(this); this.onclick = \'\';" ' + 
-                    'under_style="' + data_class[key].getAttribute('under_style') + '" ' +
-                    'under_alt="' + data_class[key].getAttribute('under_alt') + '" ' +
-                    'under_src="' + data_class[key].getAttribute('under_src') + '" ' +
-                    'title="' + data_class[key].getAttribute('under_src') + '">' + 
-                    '(External image load)' + 
-                '</a>' +
-            '';
-        } else {
-            document.getElementsByClassName(data + 'file_finder')[key].innerHTML = '' +
-                load_image_link(data_class[key], 1) +
-            '';
-        }
-    }
-}
-
-function get_file_state_intermal(data, data_inter) {
-    var data_dict = {};
-    var data_list = [];
-    for(var key in data_inter) {
-        var data_class = document.getElementsByClassName(data + 'file_finder')[data_inter[key]];
-    
-        var file_org = data_class.getAttribute('under_alt');
-        var file_type = file_org.split('.');
-        var file_name = file_type.slice(0, file_type.length - 1).join('.');
-        file_type = file_type[file_type.length - 1];
-        
-        if(!data_dict[file_org]) {
-            data_dict[file_org] = {};
-        }
-        
-        data_dict[file_org]['file_name'] = file_name;
-        data_dict[file_org]['file_type'] = file_type;
-        
-        data_list.push(file_name);
-        
-        if(!data_dict[file_org]['list']) {
-            data_dict[file_org]['list'] = [data_inter[key]];
-        } else {
-            data_dict[file_org]['list'].push(data_inter[key]);
-        }
-    }
-    
-    if(document.cookie.match(opennamu_cookie_split_regex('main_css_image_set'))) {
-        var data_image_set = document.cookie.match(opennamu_cookie_split_regex('main_css_image_set'))[1];
-    } else {
-        var data_image_set = '0';
-    }
-    
-    var data_form = new FormData();
-    data_form.append('title_list', JSON.stringify(data_list));
-
-    var xhr = new XMLHttpRequest();
-    xhr.open("POST", '/api/sha224/test');
-    xhr.send(data_form);
-
-    xhr.onreadystatechange = function() {
-        if(this.readyState === 4 && this.status === 200) {
-            var file_sha224 = JSON.parse(this.responseText);
-            var data_list_2 = [];
-            for(var key in data_dict) {
-                data_dict[key]['file_sha224'] = file_sha224[data_dict[key]['file_name']]
-
-                data_list_2.push(data_dict[key]['file_sha224'] + '.' + data_dict[key]['file_type'])
-            }
-            
-            var data_form_2 = new FormData();
-            data_form_2.append('title_list', JSON.stringify(data_list_2));
-            
-            var xhr_2 = new XMLHttpRequest();
-            xhr_2.open("POST", '/api/image/test');
-            xhr_2.send(data_form_2);
-
-            xhr_2.onreadystatechange = function() {
-                if(this.readyState === 4 && this.status === 200) {
-                    var file_data = JSON.parse(this.responseText);
-                    var data_class = document.getElementsByClassName(data + 'file_finder');
-                    for(var key_3 in data_dict) {
-                        if(!file_data[data_dict[key_3]['file_sha224'] + '.' + data_dict[key_3]['file_type']]) {
-                            for(var key_4 in data_dict[key_3]['list']) {
-                                var key_4 = data_dict[key_3]['list'][key_4];
-                                document.getElementsByClassName(data + 'file_finder')[key_4].innerHTML = '' +
-                                    '<a href="' + data_class[key_4].getAttribute('under_href') + '" ' + 
-                                        'id="not_thing">' +
-                                        '(' + data_class[key_4].getAttribute('under_alt') + ')' +
-                                    '</a>' +
-                                '';
-                            }
-                        } else {
-                            if(data_image_set === '1') {
-                                for(var key_4 in data_dict[key_3]['list']) {
-                                    var key_4 = data_dict[key_3]['list'][key_4];
-                                    document.getElementsByClassName(data + 'file_finder')[key_4].innerHTML = '' +
-                                        '<a href="/image/' + data_dict[key_3]['file_sha224'] + '.' + data_dict[key_3]['file_type'] + '">' +
-                                            '(' + data_class[key_4].getAttribute('under_alt') + ')' +
-                                        '</a>' +
-                                    '';
-                                }
-                            } else if(data_image_set === '2') {
-                                for(var key_4 in data_dict[key_3]['list']) {
-                                    var key_4 = data_dict[key_3]['list'][key_4];
-                                    document.getElementsByClassName(data + 'file_finder')[key_4].innerHTML = '' +
-                                        '<a href="javascript:void(0);" ' +
-                                            'onclick="load_image_link(this); this.onclick = \'\';" ' + 
-                                            'under_style="' + data_class[key_4].getAttribute('under_style') + '" ' +
-                                            'under_alt="' + data_class[key_4].getAttribute('under_alt') + '" ' +
-                                            'under_src="/image/' + data_dict[key_3]['file_sha224'] + '.' + data_dict[key_3]['file_type'] + '">' + 
-                                            '(' + data_class[key_4].getAttribute('under_alt') + ' GET)' +
-                                        '</a>' +
-                                    '';
-                                }
-                            } else {
-                                for(var key_4 in data_dict[key_3]['list']) {
-                                    var key_4 = data_dict[key_3]['list'][key_4];
-                                    document.getElementsByClassName(data + 'file_finder')[key_4].innerHTML = '' +
-                                        '<img   style="' + data_class[key_4].getAttribute('under_style') + ';cursor: pointer;" ' + 
-                                                'onclick="window.location.href=\'/w/file:' + data_class[key_4].getAttribute('under_src') + '\';"' +
-                                                'alt="' + data_class[key_4].getAttribute('under_alt') + '" ' + 
-                                                'src="/image/' + data_dict[key_3]['file_sha224'] + '.' + data_dict[key_3]['file_type'] + '">' +
-                                    '';
-                                }
-                            }
-                        }   
-                    }
-                }
-            }
-        }
-    }
-}
-
-function get_file_state(data, i = 0) {
-    var data_exter = [];
-    var data_inter = [];
-    for(var i = 0; document.getElementsByClassName(data + 'file_finder')[i]; i++) {
-        var data_class = document.getElementsByClassName(data + 'file_finder')[i];
-        if(data_class.getAttribute('under_href') === 'out_link') {
-            data_exter.push(i);
-        } else {
-            data_inter.push(i);
-        }
-    }
-    
-    get_file_state_extermal(data, data_exter);
-    get_file_state_intermal(data, data_inter);
-}
-
-function load_include(name_doc, name_ob, data_include, name_org = '') {
-    var data_form = new FormData();
-    data_form.append('include_list', JSON.stringify(data_include));
-    data_form.append('name_include', name_ob);
-    data_form.append('name_org', name_org);
-    
-    var xhr = new XMLHttpRequest();
-    xhr.open("POST", "/api/w/" + encodeURI(name_doc) + "/doc_tool/include");
-    xhr.send(data_form);
-
-    document.getElementsByClassName(name_ob)[0].href = "/w/" + do_url_change(name_doc);
-    xhr.onreadystatechange = function() {
-        if(this.readyState === 4 && this.status === 200) {
-            if(this.responseText === "{}\n") {
-                document.getElementById(name_ob).innerHTML = "";
-                document.getElementsByClassName(name_ob)[0].id = "not_thing";
-            } else {
-                var data_load = JSON.parse(this.responseText);
-                document.getElementById(name_ob).innerHTML = data_load['data'];
-                eval(data_load['js_data']);
-            }
-        }
-    }
-}
-
-function page_count() {
-    var url = "/api/title_index";
-
-    var xhr = new XMLHttpRequest();
-    xhr.open("GET", url);
-    xhr.send();
-
-    xhr.onreadystatechange = function() {
-        if(this.readyState === 4 && this.status === 200) {
-            var i = 0;
-            while(document.getElementsByClassName('all_page_count')[i]) {
-                document.getElementsByClassName('all_page_count')[i].innerHTML = JSON.parse(this.responseText)['count'];
-                
-                i += 1;
-            }
-        }
-    }
-}
-
-function do_open_folding(data, element = '') {
-    var fol = document.getElementById(data);
-    if(fol.style.display === '' || (fol.style.display === 'inline-block' || fol.style.display === 'block')) {
-        document.getElementById(data).style.display = 'none';
-    } else {
-        document.getElementById(data).style.display = 'block';
-    }
-    
-    if(element != '') {
-        var fol_data = element.innerHTML;
-        if(fol_data != '⊖') {
-            element.innerHTML = '⊖';
-        } else {
-            element.innerHTML = '⊕';
-        }
-    }
-}
-
-function do_open_foot(front_data, name, num = 0) {    
-    if(
-        document.cookie.match(opennamu_cookie_split_regex('main_css_footnote_set')) &&
-        document.cookie.match(opennamu_cookie_split_regex('main_css_footnote_set'))[1] === '1'
-    ) {
-        if(num === 1) {
-            document.getElementById(front_data + 'r' + name).focus();
-        } else {
-            var get_data = document.getElementById(front_data + name).innerHTML;
-            var org_data = document.getElementById(front_data + 'd' + name).innerHTML;
-            if(org_data === '') {
-                document.getElementById(front_data + 'd' + name).innerHTML = '' +
-                    '<a href="#' + front_data + 'c' + name + '">(Go)</a> ' + get_data +
-                '';
-                document.getElementById(front_data + 'd' + name).className = 'spead_footnote';
-            } else {
-                document.getElementById(front_data + 'd' + name).innerHTML = '';
-                document.getElementById(front_data + 'd' + name).className = '';
-            }
-        }
-    } else {
-        document.getElementById(front_data + 'r' + name).style.color = 'red';
-        document.getElementById(front_data + 'c' + name).style.color = (num === 1 ? 'inherit' : 'red');
-        document.getElementById(front_data + (num === 1 ? 'r' : 'c') + name).focus();
-    }
-}

+ 2 - 4
views/main_css/js/route/thread.js

@@ -70,7 +70,7 @@ function opennamu_do_thread_make(topic_num, type_do = 'top', some = '', where =
                 }
                 
                 if(blind === 'O') {
-                    ip += ' <a href="/admin_log?search=blind%20(code%20' + topic_num + '#' + key + '">(B)</a>';
+                    ip += ' <a href="/list/admin/auth_use/' + opennamu_do_url_encode('blind (code ' + topic_num + '#' + key) + '/1">(B)</a>';
                     
                     if(admin === '1') {
                         ip += ' <a href="javascript:opennamu_do_open_comment(\'' + key + '\');">(O)</a>';
@@ -97,7 +97,7 @@ function opennamu_do_thread_make(topic_num, type_do = 'top', some = '', where =
                     '<table class="opennamu_comment">' + 
                         '<tr>' + 
                             '<td class="' + color_t + '">' + 
-                                '<a href="javascript:void(0);" id="' + key + '">#' + key + '</a> ' + 
+                                '<a href="#thread_shortcut" id="' + key + '">#' + key + '</a> ' + 
                                 ip + 
                                 '<span style="float: right;">' + data_t[key]['date'] + '</span>' + 
                             '</td>' + 
@@ -126,8 +126,6 @@ function opennamu_do_thread_make(topic_num, type_do = 'top', some = '', where =
             
             eval(data_all_js);
             
-            opennamu_do_ip_parser();
-            
             if(type_do === 'top') {
                 opennamu_do_thread_make(topic_num, 'main', '', 'main_topic');
             } else if(type_do === 'main') {

+ 10 - 4
views/ringo/css/main.css

@@ -1,10 +1,12 @@
-body {
-    margin: 0;
+html {
+    background: #eee;
 }
 
-html {
+body {
     font-family: "나눔바른고딕", "나눔고딕", "맑은고딕", "Sans-Serif";
-    background: #eee;
+    font-size: 14px;
+
+    margin: 0;
 }
 
 h1, h2, h3, h4, h5, h6 {
@@ -327,4 +329,8 @@ input, textarea, button, select {
     background-color: #eee;
 
     cursor: pointer;
+}
+
+#opennamu_save_button {
+    background: antiquewhite;
 }

+ 1 - 1
views/tenshi/css/main.css

@@ -10,7 +10,7 @@ body {
     
     margin: 0;
     
-    font-size: 0.85rem;
+    font-size: 14px;
 }
 
 select {