2du пре 5 година
родитељ
комит
8ba65ef6cf

+ 74 - 17
app.py

@@ -212,22 +212,79 @@ curs.execute(db_change('select name from alist where acl = "owner"'))
 if not curs.fetchall():
     curs.execute(db_change('insert into alist (name, acl) values ("owner", "owner")'))
 
-curs.execute(db_change('select data from other where name = "image_where"'))
-app_var = curs.fetchall()
-if not app_var:
-    curs.execute(db_change('insert into other (name, data) values ("image_where", "data/images")'))
-    app_var = { 'path_data_image' : 'data/images' }
-else:
-    app_var = { 'path_data_image' : app_var[0][0] }
-
-if not os.path.exists(app_var['path_data_image']):
-    os.makedirs(app_var['path_data_image'])
+if not os.path.exists(load_image_url()):
+    os.makedirs(load_image_url())
 
 if not os.path.exists('views'):
     os.makedirs('views')
 
 print('----')
-import route.tool.init as server_init
+def server_init(key):
+    env_dict = {
+        'host' : os.getenv('NAMU_HOST'),
+        'port' : os.getenv('NAMU_PORT'),
+        'language' : os.getenv('NAMU_LANG'),
+        'markup' : os.getenv('NAMU_MARKUP'),
+        'encode' : os.getenv('NAMU_ENCRYPT')
+    }
+
+    server_set_var = {
+        'host' : {
+            'display' : 'Host',
+            'require' : 'conv',
+            'default' : '0.0.0.0'
+        },
+        'port' : {
+            'display' : 'Port',
+            'require' : 'conv',
+            'default' : '3000'
+        },
+        'language' : {
+            'display' : 'Language',
+            'require' : 'select',
+            'default' : 'ko-KR',
+            'list' : ['ko-KR', 'en-US']
+        },
+        'markup' : {
+            'display' : 'Markup',
+            'require' : 'select',
+            'default' : 'namumark',
+            'list' : ['namumark', 'custom', 'raw']
+        },
+        'encode' : {
+            'display' : 'Encryption method',
+            'require' : 'select',
+            'default' : 'sha3',
+            'list' : ['sha3', 'sha256']
+        }
+    }
+    
+    if env_dict[key] != None:
+        return env_dict[key]
+    else:
+        while 1:
+            if server_set_var[key]['require'] == 'select':
+                list_ = '[' + ', '.join(server_set_var[key]['list']) + ']'
+            else:
+                list_ = ''
+
+            print('{} ({}) {} : '.format(
+                server_set_var[key]['display'],
+                server_set_var[key]['default'],
+                list_
+            ), end = '')
+
+            server_set_val = input()
+            if server_set_val:
+                if server_set_var[key]['require'] == 'select':
+                    if server_set_val not in server_set_var[key]['list']:
+                        pass
+                    else:
+                        return server_set_val
+                else:
+                    return server_set_val
+            else:
+                return server_set_var[key]['default']
 
 dislay_set_key = ['Host', 'Port', 'Language', 'Markup', 'Encryption method']
 server_set_key = ['host', 'port', 'language', 'markup', 'encode']
@@ -237,7 +294,7 @@ for i in range(len(server_set_key)):
     curs.execute(db_change('select data from other where name = ?'), [server_set_key[i]])
     server_set_val = curs.fetchall()
     if not server_set_val:
-        server_set_val = server_init.init(server_set_key[i])
+        server_set_val = server_init(server_set_key[i])
 
         curs.execute(db_change('insert into other (name, data) values (?, ?)'), [server_set_key[i], server_set_val])
         conn.commit()
@@ -452,11 +509,11 @@ def edit_backlink_reset(name = 'Test'):
 
 @app.route('/delete/<everything:name>', methods=['POST', 'GET'])
 def edit_delete(name = None):
-    return edit_delete_2(conn, name, app_var)
+    return edit_delete_2(conn, name)
 
 @app.route('/many_delete', methods=['POST', 'GET'])
 def edit_many_delete(name = None):
-    return edit_many_delete_2(conn, app_var)
+    return edit_many_delete_2(conn)
 
 @app.route('/move/<everything:name>', methods=['POST', 'GET'])
 def edit_move(name = None):
@@ -604,7 +661,7 @@ def recent_history_delete(name = None):
 
 @app.route('/upload', methods=['GET', 'POST'])
 def func_upload():
-    return func_upload_2(conn, app_var)
+    return func_upload_2(conn)
 
 @app.route('/user')
 def user_info():
@@ -637,7 +694,7 @@ def func_title_random():
 
 @app.route('/image/<everything:name>')
 def main_image_view(name = None):
-    return main_image_view_2(conn, name, app_var)
+    return main_image_view_2(conn, name)
 
 @app.route('/skin_set')
 @app.route('/main_skin_set')
@@ -720,7 +777,7 @@ def api_title_index():
 
 @app.route('/api/image/<everything:name>')
 def api_image_view(name = ''):
-    return api_image_view_2(conn, name, app_var)
+    return api_image_view_2(conn, name)
 
 @app.route('/api/sitemap.xml')
 def api_sitemap():

+ 0 - 9
lang/en-US.json

@@ -143,17 +143,12 @@
         "pinned_release" : "Unpinned",
         "discussion_tool" : "Discussion tools",
         "discussion_raw" : "Discussion raw",
-        "oauth_signin_facebook" : "Sign-in with Facebook",
-        "oauth_signin_naver" : "Sign-in with NAVER",
-        "oauth_signin_discord" : "Sign-in with Discord",
-        "oauth_signin_kakao" : "Sign-in with Kakao",
         "connection" : "Connection",
         "new_connection" : "Connect...",
         "user_setting" : "User settings",
         "now_password" : "Current password",
         "new_password" : "New password",
         "password_confirm" : "Confirm password",
-        "oauth_connection" : "OAuth Connection",
         "password_search" : "Password finder",
         "login_able" : "Loginable",
         "band_ban" : "Range block",
@@ -236,7 +231,6 @@
         "_comment_2.2_" : "Setting",
             "setting" : "Setting",
             "restart_required" : "Restart required",
-            "oauth_setting" : "OAuth settings",
             "adsense_setting" : "Adsense settings",
             "adsense_enable" : "Adsense enable",
             "skin_setting" : "Skin settings",
@@ -373,8 +367,6 @@
         "application_submitted": "Applicatied successfully for registration",
         "waiting_for_approval": "Application for registration has been made successfully. Please wait for approval by administrators.",
         "ie_no_data_required" : "Operation cannot continue because all required data has not been collected.",
-        "oauth_settings_not_found" : "The administrator has not provided any data about using this feature.",
-        "oauth_disabled" : "The administrator has disabled this feature.",
         "http_warring" : "Warning: If you are not on HTTPS connection, Your information can be leaked. We won't response to that.",
         "user_head_warring" : "User data will be deleted if you close the browser or when you sign in.",
         "no_login_warring" : "You are not logged in. The IP address will be logged when editing or discussing with non-login.",
@@ -385,7 +377,6 @@
         "many_delete_help" : "Please write down the document[s] name one by one on the line.",
         "sqlite_only" : "SQLite only",
         "approval_question_visible_only_when_approval_on" : "Approval questions are visible only when approval requirement is on",
-        "oauth_explain" : "To use the OAuth login feature, you must set the 'publish_url' value to a domain address that includes the HTTPS protocol, and actually support HTTPS connections.",
         "msg_whatchlist_lmt": "You can add as many as",
         "enter_html" : "Please enter HTML",
         "exp_edit_conflict" : "Editing conflict occurred",

+ 0 - 9
lang/ko-KR.json

@@ -74,7 +74,6 @@
     "wiki_name": "위키 이름",
     "acl_document_list": "ACL 문서 목록",
     "connection": "연결",
-    "oauth_disabled": "관리자가 이 기능을 비활성화시켰습니다.",
     "random": "무작위",
     "filter": "필터",
     "band_blocked": "대역 차단됨",
@@ -91,13 +90,11 @@
     "setting": "설정",
     "end": "끝",
     "error": "오류",
-    "oauth_signin_discord": "디스코드 아이디로 로그인",
     "ban": "차단",
     "email_insert_text": "이메일 입력란 문구",
     "check_key_text": "인증키 검사 문구",
     "other_tool": "기타 도구",
     "recent_discussion": "최근 토론",
-    "oauth_signin_naver": "네이버 아이디로 로그인",
     "record": "기록",
     "owner_authority": "소유자 권한",
     "wiki_port": "위키 포트",
@@ -108,7 +105,6 @@
     "under_category": "하위 분류",
     "range": "대역",
     "edit_filter_rule": "편집 필터 규칙",
-    "oauth_connection": "Oauth 연결",
     "hide_ip": "IP 주소 숨기기",
     "topic_tool": "토론 관리 도구",
     "user_document": "사용자 문서",
@@ -132,7 +128,6 @@
     "regex": "정규표현식",
     "file_filter_add": "파일명 필터 추가",
     "wiki_restart": "위키 엔진 재시작",
-    "oauth_settings_not_found": "관리자가 해당 기능을 수행하기 위해 필요한 데이터를 제공하지 않았습니다.",
     "discussion_raw": "토론 댓글 원본",
     "main_setting": "메인 설정",
     "password": "비밀번호",
@@ -170,7 +165,6 @@
     "recaptcha": "reCAPTCHA",
     "create": "생성",
     "restart": "재시작",
-    "oauth_setting": "OAuth 설정",
     "edit_bottom_text": "편집창 하단 문구",
     "copyright_checkbox_text": "저작권 동의 문구(체크박스 형태)",
     "authority": "권한",
@@ -216,7 +210,6 @@
     "name": "이름",
     "period": "기간",
     "writer": "작성자",
-    "oauth_signin_facebook": "페이스북 아이디로 로그인",
     "long_id_error": "ID는 20자보다 짧아야 합니다.",
     "edit_record_error": "사유는 500자를 넘을 수 없습니다.",
     "revert": "복원",
@@ -232,7 +225,6 @@
     "ban_period": "차단 기간",
     "use_push_alarm": "푸쉬 알림 사용",
     "email_filter_add": "이메일 필터 추가",
-    "oauth_signin_kakao": "카카오톡 아이디로 로그인",
     "authority_error": "권한이 없습니다.",
     "type": "유형",
     "acl_change": "문서 ACL 변경",
@@ -337,7 +329,6 @@
     "all_register_num": "모든 가입 신청자의 수",
     "replace_move": "문서 바꾸기",
     "merge_move": "문서 병합",
-    "oauth_explain": "OAuth 로그인 기능을 사용하려면 'publish_url' 값을 HTTPS 프로토콜을 포함한 도메인 주소로 설정하고, 실제로 HTTPS 연결을 지원해야 합니다.",
     "add_admin_group": "관리자 그룹 추가",
     "add_watchlist": "주시 문서 추가",
     "blocked_user": "차단된 사용자",

+ 2 - 2
route/api_image_view.py

@@ -1,9 +1,9 @@
 from .tool.func import *
 
-def api_image_view_2(conn, name, app_var):
+def api_image_view_2(conn, name):
     curs = conn.cursor()
 
-    if os.path.exists(os.path.join(app_var['path_data_image'], name)):
+    if os.path.exists(os.path.join(load_image_url(), name)):
         return flask.jsonify({ "exist" : "1" })
     else:
         return flask.jsonify({ "exist" : "0" })

+ 2 - 2
route/edit_delete.py

@@ -1,6 +1,6 @@
 from .tool.func import *
 
-def edit_delete_2(conn, name, app_var):
+def edit_delete_2(conn, name):
     curs = conn.cursor()
 
     ip = ip_check()
@@ -49,7 +49,7 @@ def edit_delete_2(conn, name, app_var):
         if file_check:
             file_check = file_check.groups()
             file_directory = os.path.join(
-                app_var['path_data_image'], 
+                load_image_url(), 
                 sha224_replace(file_check[0]) + '.' + file_check[1]
             )
             if os.path.exists(file_directory):

+ 2 - 2
route/edit_many_delete.py

@@ -1,7 +1,7 @@
 from .tool.func import *
 from . import edit_delete
 
-def edit_many_delete_2(conn, app_var):
+def edit_many_delete_2(conn):
     curs = conn.cursor()
 
     ip = ip_check()
@@ -11,7 +11,7 @@ def edit_many_delete_2(conn, app_var):
     if flask.request.method == 'POST':
         all_title = re.findall(r'([^\n]+)\n', flask.request.form.get('content', '').replace('\r\n', '\n') + '\n')
         for name in all_title:
-            edit_delete.edit_delete_2(conn, name, app_var)
+            edit_delete.edit_delete_2(conn, name)
 
         return redirect('/recent_changes')
     else:

+ 7 - 6
route/func_upload.py

@@ -1,6 +1,6 @@
 from .tool.func import *
 
-def func_upload_2(conn, app_var):
+def func_upload_2(conn):
     curs = conn.cursor()
 
     if acl_check(None, 'upload') == 1:
@@ -59,15 +59,16 @@ def func_upload_2(conn, app_var):
                 if t_re.search(name):
                     return redirect('/file_filter')
 
-            if os.path.exists(os.path.join(app_var['path_data_image'], e_data)):
-                os.remove(os.path.join(app_var['path_data_image'], e_data))
-                data.save(os.path.join(app_var['path_data_image'], e_data))
+            data_url_image = load_image_url()
+            if os.path.exists(os.path.join(data_url_image, e_data)):
+                os.remove(os.path.join(data_url_image, e_data))
+                data.save(os.path.join(data_url_image, e_data))
             else:
-                data.save(os.path.join(app_var['path_data_image'], e_data))
+                data.save(os.path.join(data_url_image, e_data))
 
             ip = ip_check()
             g_lice = flask.request.form.get('f_lice', '')
-            file_size = os.stat(os.path.join(app_var['path_data_image'], e_data)).st_size
+            file_size = os.stat(os.path.join(data_url_image, e_data)).st_size
 
             curs.execute(db_change("select data from other where name = 'markup'"))
             db_data = curs.fetchall()

+ 2 - 2
route/main_image_view.py

@@ -1,7 +1,7 @@
 from .tool.func import *
 from . import main_error_404
 
-def main_image_view_2(conn, name, app_var):
+def main_image_view_2(conn, name):
     curs = conn.cursor()
 
     mime_type = re.search(r'([^.]+)$', name)
@@ -11,7 +11,7 @@ def main_image_view_2(conn, name, app_var):
             mime_type = 'svg+xml'
         
         return flask.send_from_directory(
-            './' + app_var['path_data_image'], name, 
+            './' + load_image_url(), name, 
             mimetype = 'image/' + mime_type
         )
     else:

+ 1 - 1
route/recent_changes.py

@@ -142,7 +142,7 @@ def recent_changes_2(conn, name, tool):
                     <td>''' + date + '''</td>
                 </tr>
                 <tr ''' + style[1] + '''>
-                    <td colspan="3">''' + send_parser(send) + '''</td>
+                    <td colspan="3">''' + html.escape(send) + '''</td>
                 </tr>
             '''
 

+ 25 - 21
route/tool/func.py

@@ -1,41 +1,39 @@
-import os
 import sys
 import platform
+import json
+import smtplib
+import zipfile
+import shutil
+import logging
+import random
 
 for i in range(0, 2):
     try:
         from diff_match_patch import diff_match_patch
         import werkzeug.routing
         import werkzeug.debug
+        
+        import flask
         import flask_reggie
+        
         import tornado.ioloop
         import tornado.httpserver
         import tornado.wsgi
+        
         import urllib.request
+        
         import email.mime.text
         import email.utils
         import email.header
+        
         import requests
-        import sqlite3
+
         import pymysql
-        import hashlib
-        import smtplib
-        import asyncio
-        import zipfile
-        import shutil
-        import threading
+
         import PIL
-        import logging
-        import random
-        import flask
-        import json
-        import html
-        import re
 
         if sys.version_info < (3, 6):
             import sha3
-
-        from .mark import *
     except ImportError as e:
         if i == 0:
             print(e)
@@ -63,9 +61,11 @@ for i in range(0, 2):
         print(e)
         raise
 
+from .func_mark import *
+        
 global_lang = {}
 
-data_css_ver = '78'
+data_css_ver = '79'
 data_css = ''
 
 conn = ''
@@ -79,6 +79,13 @@ def load_conn(data):
     curs = conn.cursor()
 
     load_conn2(data)
+    
+def load_image_url():
+    curs.execute(db_change('select data from other where name = "image_where"'))
+    image_where = curs.fetchall()
+    image_where = image_where[0][0] if image_where else 'data/images'
+    
+    return image_where
 
 def http_warring():
     return '''
@@ -159,11 +166,8 @@ def load_domain():
 def load_random_key(long = 64):
     return ''.join(random.choice("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") for i in range(long))
 
-def last_change(data):
-    return data
-
 def easy_minify(data, tool = None):
-    return last_change(data)
+    return data
 
 def render_set(doc_name = '', doc_data = '', data_type = 'view', data_in = '', doc_acl = ''):
     # data_type in ['view', 'raw', 'api_view', 'backlink']

+ 0 - 0
route/tool/func_init.py


+ 3 - 19
route/tool/mark.py → route/tool/func_mark.py

@@ -1,12 +1,9 @@
-from .tool import *
-
-import re
 import os
 import html
 import sqlite3
-import asyncio
 import threading
-import urllib.parse
+
+from .func_tool import *
 
 conn = ''
 curs = ''
@@ -28,22 +25,9 @@ def load_conn2(data):
     conn = data
     curs = conn.cursor()
 
-def send_parser(data):
-    if not re.search(r'^<br>$', data):
-        data = html.escape(data)
-
-        data = re.sub(r'javascript:', '', data, flags = re.I)
-        data = data.replace('&lt;br&gt;', '')
-
-    link_re = re.compile(r'&lt;a(?: (?:(?:(?!&gt;).)*))?&gt;(?P<in>(?:(?!&lt;).)*)&lt;\/a&gt;')
-    link_data = link_re.findall(data)
-    for i in link_data:
-        data = link_re.sub('<a href="/w/' + urllib.parse.quote(i).replace('/','%2F') + '">' + i + '</a>', data, 1)
-
-    return data
-
 def render_do(doc_name, doc_data, data_type, data_in):
     data_in = None if data_in == '' else data_in
+    
     curs.execute(db_change('select data from other where name = "markup"'))
     rep_data = curs.fetchall()
     if rep_data[0][0] == 'namumark':

+ 0 - 0
route/tool/tool.py → route/tool/func_tool.py


+ 0 - 68
route/tool/init.py

@@ -1,68 +0,0 @@
-import os
-
-env_dict = {
-    'host' : os.getenv('NAMU_HOST'),
-    'port' : os.getenv('NAMU_PORT'),
-    'language' : os.getenv('NAMU_LANG'),
-    'markup' : os.getenv('NAMU_MARKUP'),
-    'encode' : os.getenv('NAMU_ENCRYPT')
-}
-
-server_set_var = {
-    'host' : {
-        'display' : 'Host',
-        'require' : 'conv',
-        'default' : '0.0.0.0'
-    },
-    'port' : {
-        'display' : 'Port',
-        'require' : 'conv',
-        'default' : '3000'
-    },
-    'language' : {
-        'display' : 'Language',
-        'require' : 'select',
-        'default' : 'ko-KR',
-        'list' : ['ko-KR', 'en-US']
-    },
-    'markup' : {
-        'display' : 'Markup',
-        'require' : 'select',
-        'default' : 'namumark',
-        'list' : ['namumark', 'custom', 'raw']
-    },
-    'encode' : {
-        'display' : 'Encryption method',
-        'require' : 'select',
-        'default' : 'sha3',
-        'list' : ['sha3', 'sha256']
-    }
-}
-
-def init(key):
-    if env_dict[key] != None:
-        return env_dict[key]
-    else:
-        while 1:
-            if server_set_var[key]['require'] == 'select':
-                list_ = '[' + ', '.join(server_set_var[key]['list']) + ']'
-            else:
-                list_ = ''
-
-            print('{} ({}) {} : '.format(
-                server_set_var[key]['display'],
-                server_set_var[key]['default'],
-                list_
-            ), end = '')
-
-            server_set_val = input()
-            if server_set_val:
-                if server_set_var[key]['require'] == 'select':
-                    if server_set_val not in server_set_var[key]['list']:
-                        pass
-                    else:
-                        return server_set_val
-                else:
-                    return server_set_val
-            else:
-                return server_set_var[key]['default']

+ 1 - 1
version.json

@@ -1,6 +1,6 @@
 {
     "beta" : {
-        "r_ver" : "v3.3.0-stable-01 (beta-01) (dev-2021-04-11-01)",
+        "r_ver" : "v3.3.0-stable-01 (beta-02) (dev-2021-04-17-01)",
         "c_ver" : "3300101",
         "s_ver" : "11"
     }

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

@@ -30,7 +30,7 @@ table {
 
 td {
     border: 1px solid;
-    padding: 5px;
+    padding: 5px 10px;
 }
 
 a {

+ 0 - 72
views/main_css/css/oauth.css

@@ -1,72 +0,0 @@
-.oauth-wrapper {
-    display: inline-block;
-}
-
-.oauth-list {
-    list-style: none;
-    padding: 0;
-}
-
-.oauth-list li {
-    display: inline-block;
-    margin: 10px;
-}
-
-.oauth-btn {
-    position: relative;
-    margin-left: 20px;
-    border: none;
-    display: inline-block;
-    padding: 25px;
-    padding-left: 75px;
-    border-radius: 10px;
-    color: #fff;
-}
-
-.oauth-btn a {
-    position: relative;
-}
-
-.oauth-btn.oauth-btn-facebook {
-    background-color: #3b5998;
-}
-
-.oauth-btn.oauth-btn-naver {
-    background-color: #00d337;
-}
-.oauth-btn.oauth-btn-discord {
-    background-color: #2C2F33;
-}
-.oauth-btn.oauth-btn-kakao {
-    background-color: #ffde00;
-    color: #3c1e1e;
-}
-
-.oauth-btn-logo {
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 10px;
-    height: 10px;
-    margin: 20px;
-    margin-left: 25px;
-    padding: 10px;
-    background-size: cover;
-    background-position: center center;
-}
-
-.oauth-btn-logo.oauth-btn-facebook {
-    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNOSA4aC0zdjRoM3YxMmg1di0xMmgzLjY0MmwuMzU4LTRoLTR2LTEuNjY3YzAtLjk1NS4xOTItMS4zMzMgMS4xMTUtMS4zMzNoMi44ODV2LTVoLTMuODA4Yy0zLjU5NiAwLTUuMTkyIDEuNTgzLTUuMTkyIDQuNjE1djMuMzg1eiIvPjwvc3ZnPg==);
-}
-
-.oauth-btn-logo.oauth-btn-naver {
-    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMjU2IiB2aWV3Qm94PSIwIDAgMjU2IDI1NiI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEzLDI3VjIyOS45NzJIOTEuNTRWMTI2LjcwNmw3NC44NDQsMTAzLjI4NUwyNDQsMjI5Ljk3MlYyNy4wMDlIMTY2LjM4NFYxMjguNDg2TDkyLjQ2NCwyNy4wMDlaIi8+PC9zdmc+)
-}
-
-.oauth-btn-logo.oauth-btn-discord {
-    background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjQ1IDI0MCI+PHN0eWxlPi5zdDB7ZmlsbDojRkZGRkZGO308L3N0eWxlPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMDQuNCAxMDMuOWMtNS43IDAtMTAuMiA1LTEwLjIgMTEuMXM0LjYgMTEuMSAxMC4yIDExLjFjNS43IDAgMTAuMi01IDEwLjItMTEuMS4xLTYuMS00LjUtMTEuMS0xMC4yLTExLjF6TTE0MC45IDEwMy45Yy01LjcgMC0xMC4yIDUtMTAuMiAxMS4xczQuNiAxMS4xIDEwLjIgMTEuMWM1LjcgMCAxMC4yLTUgMTAuMi0xMS4xcy00LjUtMTEuMS0xMC4yLTExLjF6Ii8+PHBhdGggY2xhc3M9InN0MCIgZD0iTTE4OS41IDIwaC0xMzRDNDQuMiAyMCAzNSAyOS4yIDM1IDQwLjZ2MTM1LjJjMCAxMS40IDkuMiAyMC42IDIwLjUgMjAuNmgxMTMuNGwtNS4zLTE4LjUgMTIuOCAxMS45IDEyLjEgMTEuMiAyMS41IDE5VjQwLjZjMC0xMS40LTkuMi0yMC42LTIwLjUtMjAuNnptLTM4LjYgMTMwLjZzLTMuNi00LjMtNi42LTguMWMxMy4xLTMuNyAxOC4xLTExLjkgMTguMS0xMS45LTQuMSAyLjctOCA0LjYtMTEuNSA1LjktNSAyLjEtOS44IDMuNS0xNC41IDQuMy05LjYgMS44LTE4LjQgMS4zLTI1LjktLjEtNS43LTEuMS0xMC42LTIuNy0xNC43LTQuMy0yLjMtLjktNC44LTItNy4zLTMuNC0uMy0uMi0uNi0uMy0uOS0uNS0uMi0uMS0uMy0uMi0uNC0uMy0xLjgtMS0yLjgtMS43LTIuOC0xLjdzNC44IDggMTcuNSAxMS44Yy0zIDMuOC02LjcgOC4zLTYuNyA4LjMtMjIuMS0uNy0zMC41LTE1LjItMzAuNS0xNS4yIDAtMzIuMiAxNC40LTU4LjMgMTQuNC01OC4zIDE0LjQtMTAuOCAyOC4xLTEwLjUgMjguMS0xMC41bDEgMS4yYy0xOCA1LjItMjYuMyAxMy4xLTI2LjMgMTMuMXMyLjItMS4yIDUuOS0yLjljMTAuNy00LjcgMTkuMi02IDIyLjctNi4zLjYtLjEgMS4xLS4yIDEuNy0uMiA2LjEtLjggMTMtMSAyMC4yLS4yIDkuNSAxLjEgMTkuNyAzLjkgMzAuMSA5LjYgMCAwLTcuOS03LjUtMjQuOS0xMi43bDEuNC0xLjZzMTMuNy0uMyAyOC4xIDEwLjVjMCAwIDE0LjQgMjYuMSAxNC40IDU4LjMgMCAwLTguNSAxNC41LTMwLjYgMTUuMnoiLz48L3N2Zz4=);
-}
-
-.oauth-btn-logo.oauth-btn-kakao{
-    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii03NSAtOTAgMzUwIDM1MCI+PHBhdGggY2xhc3M9Imtha2FvIGxvZ28iIGZpbGw9IiMzYzFlMWUiIGQ9Ik00NSAxNDBsLTUgNDUgNTAtMzUtNDUtMTB6Ii8+PGVsbGlwc2UgY2xhc3M9Imtha2FvIGxvZ28iIGZpbGw9IiMzYzFlMWUiIGN4PSIxMDAiIGN5PSI4MCIgcng9IjEwMCIgcnk9IjgwIi8+PC9zdmc+);
-}

+ 106 - 100
views/main_css/js/render_namumark.js

@@ -1,25 +1,21 @@
-function get_link_state(data, i = 0) { 
+function get_link_state(data, i = 0) {    
     var get_class = document.getElementsByClassName(data + 'link_finder')[i];
     if(get_class) {
-        if(get_class.href.match(/^#/)) {
-            document.getElementsByClassName(data + 'link_finder')[i].id = "";
-        } else {
+        get_link_state(data, i + 1);
+        
+        if(!get_class.href.match(/^#/)) {
             var xhr = new XMLHttpRequest();
-            xhr.open("GET", get_class.href.replace('/w/', '/api/w/').replace(/#([^#]*)/, '') + "?exist=1");
+            xhr.open("GET", get_class.href.replace('/w/', '/api/w/').replace(/#([^#]*)$/, '') + "?exist=1");
             xhr.send();
 
             xhr.onreadystatechange = function() {
                 if(this.readyState === 4 && this.status === 200) {
                     if(JSON.parse(this.responseText)['exist'] !== '1') {
                         document.getElementsByClassName(data + 'link_finder')[i].id = "not_thing";
-                    } else {
-                        document.getElementsByClassName(data + 'link_finder')[i].id = "";
                     }
                 }
             }
         }
-
-        get_link_state(data, i + 1);
     }
 }
 
@@ -31,106 +27,116 @@ function load_image_link(data) {
     '';
 }
 
-function get_file_state(data, i = 0) {      
-    // 개인적인 생각엔 이 부분 개편 필요
+function get_file_state_extermal(data, i) {
     var get_class = document.getElementsByClassName(data + 'file_finder')[i];
-    if(get_class) {            
-        if(get_class.getAttribute('under_href') === 'out_link') {
-            if(
-                document.cookie.match(main_css_regex_data('main_css_image_set')) &&
-                document.cookie.match(main_css_regex_data('main_css_image_set'))[1] === '1'
-            ) {
-                document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
-                    '<a href="' + get_class.getAttribute('under_src') + '" ' +
-                        'title="' + get_class.getAttribute('under_src') + '">' + 
-                        '(External image link)' + 
-                    '</a>' +
-                '';
-            } else if(
-                document.cookie.match(main_css_regex_data('main_css_image_set')) &&
-                document.cookie.match(main_css_regex_data('main_css_image_set'))[1] === '2'
-            ) {
-                document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
-                    '<a href="javascript:void(0);" ' +
-                        'onclick="load_image_link(this); this.onclick = \'\';" ' + 
-                        'under_style="' + get_class.getAttribute('under_style') + '" ' +
-                        'under_alt="' + get_class.getAttribute('under_alt') + '" ' +
-                        'under_src="' + get_class.getAttribute('under_src') + '" ' +
-                        'title="' + get_class.getAttribute('under_src') + '">' + 
-                        '(External image load)' + 
-                    '</a>' +
-                '';
-            } else {
-                document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
-                    '<img   style="' + get_class.getAttribute('under_style') + '" ' + 
-                            'alt="' + get_class.getAttribute('under_alt') + '" ' + 
-                            'src="' + get_class.getAttribute('under_src') + '">' +
-                '';
-            }
-        } else {
-            var file_type = get_class.getAttribute('under_src').split('.');
-            var file_name = file_type.slice(0, file_type.length - 1).join('.');
-            file_type = file_type[file_type.length - 1].toLowerCase();
-            
-            var xhr = new XMLHttpRequest();
-            xhr.open("GET", '/api/sha224/' + file_name);
-            xhr.send();
-            
-            xhr.onreadystatechange = function() {
+    if(
+        document.cookie.match(main_css_regex_data('main_css_image_set')) &&
+        document.cookie.match(main_css_regex_data('main_css_image_set'))[1] === '1'
+    ) {
+        document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
+            '<a href="' + get_class.getAttribute('under_src') + '" ' +
+                'title="' + get_class.getAttribute('under_src') + '">' + 
+                '(External image link)' + 
+            '</a>' +
+        '';
+    } else if(
+        document.cookie.match(main_css_regex_data('main_css_image_set')) &&
+        document.cookie.match(main_css_regex_data('main_css_image_set'))[1] === '2'
+    ) {
+        document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
+            '<a href="javascript:void(0);" ' +
+                'onclick="load_image_link(this); this.onclick = \'\';" ' + 
+                'under_style="' + get_class.getAttribute('under_style') + '" ' +
+                'under_alt="' + get_class.getAttribute('under_alt') + '" ' +
+                'under_src="' + get_class.getAttribute('under_src') + '" ' +
+                'title="' + get_class.getAttribute('under_src') + '">' + 
+                '(External image load)' + 
+            '</a>' +
+        '';
+    } else {
+        document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
+            '<img   style="' + get_class.getAttribute('under_style') + '" ' + 
+                    'alt="' + get_class.getAttribute('under_alt') + '" ' + 
+                    'src="' + get_class.getAttribute('under_src') + '">' +
+        '';
+    }
+}
+
+function get_file_state_intermal(data, i) {
+    var get_class = document.getElementsByClassName(data + 'file_finder')[i];
+    
+    var file_type = get_class.getAttribute('under_src').split('.');
+    var file_name = file_type.slice(0, file_type.length - 1).join('.');
+    file_type = file_type[file_type.length - 1].toLowerCase();
+
+    var xhr = new XMLHttpRequest();
+    xhr.open("GET", '/api/sha224/' + file_name);
+    xhr.send();
+
+    xhr.onreadystatechange = function() {
+        if(this.readyState === 4 && this.status === 200) {
+            file_name = JSON.parse(this.responseText)['data'];
+
+            var xhr_2 = new XMLHttpRequest();
+            xhr_2.open("GET", '/api/image/' + file_name + '.' + file_type);
+            xhr_2.send();
+
+            xhr_2.onreadystatechange = function() {
                 if(this.readyState === 4 && this.status === 200) {
-                    file_name = JSON.parse(this.responseText)['data'];
-                    
-                    var xhr_2 = new XMLHttpRequest();
-                    xhr_2.open("GET", '/api/image/' + file_name + '.' + file_type);
-                    xhr_2.send();
-
-                    xhr_2.onreadystatechange = function() {
-                        if(this.readyState === 4 && this.status === 200) {
-                            if(JSON.parse(this.responseText)['exist'] !== '1') {
-                                document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
-                                    '<a href="' + get_class.getAttribute('under_href') + '" ' + 
-                                        'id="not_thing">' +
-                                        '(' + get_class.getAttribute('under_alt') + ')' +
-                                    '</a>' +
-                                '';
-                            } else {
-                                if(
-                                    document.cookie.match(main_css_regex_data('main_css_image_set')) &&
-                                    document.cookie.match(main_css_regex_data('main_css_image_set'))[1] === '1'
-                                ) {
-                                    document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
-                                        '<a href="/image/' + file_name + '.' + file_type + '">' +
-                                            '(' + get_class.getAttribute('under_alt') + ')' +
-                                        '</a>' +
-                                    '';
-                                } else if(
-                                    document.cookie.match(main_css_regex_data('main_css_image_set')) &&
-                                    document.cookie.match(main_css_regex_data('main_css_image_set'))[1] === '2'
-                                ) {
-                                    document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
-                                        '<a href="javascript:void(0);" ' +
-                                            'onclick="load_image_link(this); this.onclick = \'\';" ' + 
-                                            'under_style="' + get_class.getAttribute('under_style') + '" ' +
-                                            'under_alt="' + get_class.getAttribute('under_alt') + '" ' +
-                                            'under_src="/image/' + file_name + '.' + file_type + '">' + 
-                                            '(' + get_class.getAttribute('under_alt') + ' load)' +
-                                        '</a>' +
-                                    '';
-                                } else {
-                                    document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
-                                        '<img   style="' + get_class.getAttribute('under_style') + '" ' + 
-                                                'alt="' + get_class.getAttribute('under_alt') + '" ' + 
-                                                'src="/image/' + file_name + '.' + file_type + '">' +
-                                    '';
-                                }
-                            }
+                    if(JSON.parse(this.responseText)['exist'] !== '1') {
+                        document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
+                            '<a href="' + get_class.getAttribute('under_href') + '" ' + 
+                                'id="not_thing">' +
+                                '(' + get_class.getAttribute('under_alt') + ')' +
+                            '</a>' +
+                        '';
+                    } else {
+                        if(
+                            document.cookie.match(main_css_regex_data('main_css_image_set')) &&
+                            document.cookie.match(main_css_regex_data('main_css_image_set'))[1] === '1'
+                        ) {
+                            document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
+                                '<a href="/image/' + file_name + '.' + file_type + '">' +
+                                    '(' + get_class.getAttribute('under_alt') + ')' +
+                                '</a>' +
+                            '';
+                        } else if(
+                            document.cookie.match(main_css_regex_data('main_css_image_set')) &&
+                            document.cookie.match(main_css_regex_data('main_css_image_set'))[1] === '2'
+                        ) {
+                            document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
+                                '<a href="javascript:void(0);" ' +
+                                    'onclick="load_image_link(this); this.onclick = \'\';" ' + 
+                                    'under_style="' + get_class.getAttribute('under_style') + '" ' +
+                                    'under_alt="' + get_class.getAttribute('under_alt') + '" ' +
+                                    'under_src="/image/' + file_name + '.' + file_type + '">' + 
+                                    '(' + get_class.getAttribute('under_alt') + ' load)' +
+                                '</a>' +
+                            '';
+                        } else {
+                            document.getElementsByClassName(data + 'file_finder')[i].innerHTML = '' +
+                                '<img   style="' + get_class.getAttribute('under_style') + '" ' + 
+                                        'alt="' + get_class.getAttribute('under_alt') + '" ' + 
+                                        'src="/image/' + file_name + '.' + file_type + '">' +
+                            '';
                         }
                     }
                 }
             }
         }
+    }
+}
 
+function get_file_state(data, i = 0) {
+    var get_class = document.getElementsByClassName(data + 'file_finder')[i];
+    if(get_class) {
         get_file_state(data, i + 1);
+        
+        if(get_class.getAttribute('under_href') === 'out_link') {
+            get_file_state_extermal(data, i);
+        } else {
+            get_file_state_intermal(data, i);
+        }
     }
 }
 

+ 78 - 56
views/main_css/js/render_onmark.js

@@ -31,6 +31,10 @@ function do_link_change(data, data_nowiki, no_change, data_nowiki) {
     return [link_main, link_sub];
 }
 
+function do_darkmode_split(data) {
+    return data.split(',')[0];
+}
+
 function do_js_safe_change(data) {
     data = data.replace(/\\/g, '\\\\');
     data = data.replace(/"/g, '\\"');
@@ -57,6 +61,10 @@ function do_data_try_insert(name_ob, data) {
     ''
 }
 
+function do_px_add(data) {
+    return data.match(/^[0-9]+$/) ? (data + 'px') : data;
+}
+
 function do_return_date() {
     var today_data = new Date();
 
@@ -94,15 +102,19 @@ function do_onmark_text_render(data) {
 function do_onmark_heading_render(data, name_doc, name_include) {
     var heading_re = /\n(={1,6})(#)? ?([^=#]+) ?#?={1,6}\n/;
     var heading_level_all = [0, 0, 0, 0, 0, 0];
-    var toc_data = '<div id="toc"><div id="toc_title">TOC</div>\n';
+    var toc_data = '';
     var toc_n = 0;
-    while(1) {
+    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;
@@ -136,7 +148,7 @@ function do_onmark_heading_render(data, name_doc, name_include) {
             '\n' +
         ''
         data = data.replace(heading_re, 
-            '\n' +
+            '\n<start_point>' +
             (toc_n === 1 ? '' : '</div>') +
             '<h' + heading_level + ' id="s-' + heading_level_string_no_end + '">' + 
                 '<a href="#toc">' + heading_level_string + '</a> ' + 
@@ -149,23 +161,28 @@ function do_onmark_heading_render(data, name_doc, name_include) {
                     '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') + ';"><toc_end_point>' +
-            '\n'
+                    'style="display: ' + (heading_data[2] ? 'none' : 'block') + ';">' +
+            '<end_point>\n'
        );
     }
     
-    toc_data += '</div>';
-    
-    data = data.replace(/\[(?:toc|목차)\]/g, toc_data);
-    data += '</div>';
+    if(toc_data !== '') {
+        toc_data += '</div>';
+        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 {
-        data = data.replace(/(<h[1-6] (?:[^>]+)>)/, toc_data + '$1');
+        if(!data.match(toc_re)) {
+            data = data.replace(/(<h[1-6] (?:[^>]+)>)/, toc_data + '$1');
+        }
     }
     
+    data = data.replace(toc_re, toc_data);
+    
     return data;
 }
 
@@ -423,6 +440,22 @@ function do_onmark_macro_render(data) {
             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 === '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 : '-' + 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>';
         }
@@ -436,6 +469,8 @@ function do_onmark_macro_render(data) {
             return '<div style="clear:both"></div>';
         } else if(x_1 === 'br') { 
             return '<br>';
+        } else if(x_1 === 'pagecount') {
+            return '0';
         } else {
             return '<macro_start>' + x_1 + '<macro_end>';
         }
@@ -539,7 +574,7 @@ function do_onmark_middle_render(data, data_js, name_include, data_nowiki, name_
         data = data.replace(code_re, '<span id="' + name_include + 'nowiki_mid_' + String(code_n) + '"></span>');
     }
     
-    var wiki_re = /<wiki_start (?:[^>]+)>(\n*(?:(?:(?!<wiki_start (?:[^>]+)>|<wiki_end>).)+\n*)+)<wiki_end>/;
+    var wiki_re = /<wiki_start ([^>]+)>(\n*(?:(?:(?!<wiki_start (?:[^>]+)>|<wiki_end>).)+\n*)+)<wiki_end>/;
     var wiki_n = 0;
     while(1) {
         wiki_n += 1;
@@ -549,12 +584,14 @@ function do_onmark_middle_render(data, data_js, name_include, data_nowiki, name_
             break;
         }
         
-        wiki_data = do_nowiki_change(wiki_data[1]);
+        var wiki_data_style = wiki_data[1];
+        wiki_data = do_nowiki_change(wiki_data[2]);
         wiki_data = do_onmark_render('manual', '', name_include + 'wiki_' + String(wiki_n) + '_', name_doc, wiki_data);
         
-        console.log(wiki_n);
+        console.log([wiki_data[0]]);
+        
         data_js += wiki_data[1];
-        data = data.replace(wiki_re, wiki_data[0]);
+        data = data.replace(wiki_re, '<div ' + wiki_data_style + '>' + wiki_data[0] + '</div>');
     }
     
     return [data, data_js, data_nowiki];
@@ -566,7 +603,8 @@ function do_onmark_last_render(data) {
     data = data.replace(/<wiki_end>/g, '</div>');
     
     // heading_render 마지막 처리
-    data = data.replace(/<toc_end_point>\n?/g, '');
+    data = data.replace(/\n?<start_point>/g, '');
+    data = data.replace(/<end_point>\n?/g, '');
     
     // list_render 마지막 처리
     data = data.replace(/(<\/ul>)\n/g, '$1');
@@ -661,11 +699,11 @@ function do_onmark_table_render_sub(data, data_col) {
             var table_option_data = data_option_var[1].replace(/"/g, '');
             if(table_option_name === 'tablebgcolor') {
                 // table
-               data_option_all['table'] += 'background:' + table_option_data + ';';
+               data_option_all['table'] += 'background:' + do_darkmode_split(table_option_data) + ';';
             } else if(table_option_name === 'tablewidth') {
-                data_option_all['table'] += 'width:' + table_option_data + ';';
+                data_option_all['table'] += 'width:' + do_px_add(table_option_data) + ';';
             } else if(table_option_name === 'tableheight') {
-                data_option_all['table'] += 'height:' + table_option_data + ';';
+                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;';
@@ -676,30 +714,30 @@ function do_onmark_table_render_sub(data, data_col) {
             } 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:' + table_option_data + ';';
+                data_option_all['table'] += 'color:' + do_darkmode_split(table_option_data) + ';';
             } else if(table_option_name === 'tablebordercolor') {
-                data_option_all['table'] += 'border:2px solid ' + table_option_data + ';';
+                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:' + table_option_data + ';';
+                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:' + table_option_data + ';';
+                data_option_all['tr'] += 'color:' + do_darkmode_split(table_option_data) + ';';
             } else if(table_option_name === 'colcolor') {
                 // col
-                data_option_all['col'] += 'color:' + table_option_data + ';';
+                data_option_all['col'] += 'color:' + do_darkmode_split(table_option_data) + ';';
             } else if(table_option_name === 'colbgcolor') {
-                data_option_all['col'] += 'background:' + table_option_data + ';';
+                data_option_all['col'] += 'background:' + do_darkmode_split(table_option_data) + ';';
             } else if(table_option_name === 'bgcolor') {
                 // td
-                data_option_all['td'] += 'background:' + table_option_data + ';';
+                data_option_all['td'] += 'background:' + do_darkmode_split(table_option_data) + ';';
             } else if(table_option_name === 'color') {
-                data_option_all['td'] += 'color:' + table_option_data + ';';
+                data_option_all['td'] += 'color:' + do_darkmode_split(table_option_data) + ';';
             } else if(table_option_name === 'width') {
-                data_option_all['td'] += 'width:' + table_option_data + ';';
+                data_option_all['td'] += 'width:' + do_px_add(table_option_data) + ';';
             } else if(table_option_name === 'height') {
-                data_option_all['td'] += 'height:' + table_option_data + ';';
+                data_option_all['td'] += 'height:' + do_px_add(table_option_data) + ';';
             } else {
                 no_option = '<lt>' + data_option + '<gt>';
             }
@@ -708,13 +746,13 @@ function do_onmark_table_render_sub(data, data_col) {
                 // span
                 data_option_all['colspan'] = data_option.replace('-', '');
             } else if(data_option.match(/^(\^|v)?\|[0-9]+$/)) {
-                // 이 부분 다듬어야함
-                var rowspan_vertical = data_option.match(/^(\^|v)/);
-                if(rowspan_vertical) {
-                    data_option_all['td'] += rowspan_vertical[1] === '^' ? 'vertical-align: top;' : 'vertical-align: bottom;';
+                if(data_option[0] === '^') {
+                    data_option_all['td'] += 'vertical-align: top;';
+                } else if(data[1] === 'v') {
+                    data_option_all['td'] += 'vertical-align: bottom;';
                 }
                 
-                data_option_all['rowspan'] = data_option.replace(/^(\^|v)?\|/, '');
+                data_option_all['rowspan'] = data_option.replace(/[^0-9]+/g, '');
             } else if(
                 data_option === '(' ||
                 data_option === ':' ||
@@ -731,12 +769,11 @@ function do_onmark_table_render_sub(data, data_col) {
                 
                 align_auto = 0;
             } else {
-                // 이 부분 다시 해야함
-                var table_option_data = data_option.replace(/"/g, '');
-                if(table_option_data.match(/^[a-zA-Z0-9]{6}|[a-zA-Z0-9]{3}$/)) {
-                    data_option_all['td'] += 'background:#' + table_option_data + ';';
+                var table_option_data = data_option.replace(/"/g, '').match(/^((?:#[a-zA-Z0-9]{3}){1,2}|\w+)/);
+                if(table_option_data) {
+                    data_option_all['td'] += 'background:' + table_option_data[1] + ';';
                 } else {
-                    data_option_all['td'] += 'background:' + table_option_data + ';';    
+                    no_option = '<lt>' + data_option + '<gt>';
                 }
             }
         }
@@ -850,11 +887,11 @@ function do_onmark_list_render(data) {
             break;
         }
         
-        var list_end_data = '<ul>' + list_data[1].replace(list_short_re, function(x, x_1, x_2) {
+        var list_end_data = '<ul style="padding: 0;">' + list_data[1].replace(list_short_re, function(x, x_1, x_2) {
             return '<li style="margin-left: ' + String(x_1.length * 20) + 'px;">' + x_2 + '</li>';
         }) + '</ul>';
 
-        data = data.replace(list_re, '\n' + list_end_data + '\n');
+        data = data.replace(list_re, '\n<start_point>' + list_end_data + '<end_point>\n');
     }
     
     return data;
@@ -892,49 +929,36 @@ asdf || asdf`
     var data_backlink = [];
     var data_nowiki = {};
     
-    console.log(name_include);
     var data_var = do_onmark_math_render(data, data_js, name_include);
     data = data_var[0];
     data_js = data_var[1];
-    console.log('math pass');
     
     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];
-    console.log('nowiki before pass');
     
     data_var = do_onmark_include_render(data, data_js, name_include, data_nowiki);
     data = data_var[0];
     data_js = data_var[1];
-    console.log('include pass');
     
     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];
-    console.log('middle pass');
     
     data = do_onmark_text_render(data);
-    console.log('text pass');
     data = do_onmark_heading_render(data, name_doc, name_include);
-    console.log('heading pass');
     data = do_onmark_table_render(data);
-    console.log('table pass');
     
     data_var = do_onmark_link_render(data, data_js, name_doc, name_include, data_nowiki);
     data = data_var[0];
     data_js = data_var[1];
-    console.log('link pass');
     
     data = do_onmark_macro_render(data);
-    console.log('macro pass');
     data = do_onmark_list_render(data);
-    console.log('list pass');
     data = do_onmark_footnote_render(data, name_include);
-    console.log('footnote pass');
     data = do_onmark_last_render(data, name_include);
-    console.log('last pass');
     
     data_js += '' + 
         'get_link_state("' + name_include + '");\n' + 
@@ -950,6 +974,4 @@ asdf || asdf`
     } else {
     	console.log([data, data_js]);
     }
-}
-
-do_onmark_render();
+}