Просмотр исходного кода

호구마의 코드를 하위 호환성 유지한 채로 왕창 수정

Surplus_Up (2DU) 6 лет назад
Родитель
Сommit
94e1679bb7

+ 0 - 4
app.py

@@ -406,10 +406,6 @@ def server_restart():
 def server_now_update():
     return server_now_update_2(conn, version_list['master']['r_ver'])
 
-@app.route('/oauth_setting', methods=['GET', 'POST'])
-def setting_oauth():
-    return setting_oauth_2(conn)
-
 @app.route('/adsense_setting', methods=['GET', 'POST'])
 def setting_adsense():
     return setting_adsense_2(conn)

+ 0 - 5
data/oauthsettings.json

@@ -1,9 +1,4 @@
 {
-    "_README" : {
-        "en" : "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.",
-        "ko" : "OAuth 로그인 기능을 사용하려면 'publish_url' 값을 HTTPS 프로토콜을 포함한 도메인 주소로 설정하고, 실제로 HTTPS 연결을 지원해야 합니다.",
-        "support" : ["discord", "facebook", "naver", "kakao"]
-    },
     "publish_url" : "https://",
     "discord" : {
         "client_id" : "",

+ 1 - 0
language/en-US.json

@@ -328,6 +328,7 @@
         "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.",
         "_comment_3.1_" : "Error",
             "update_error" : "Auto update is not supported.",
             "inter_error" : "Internal error.",

+ 2 - 1
language/ko-KR.json

@@ -332,5 +332,6 @@
     "approval_requirement_disabled": "현재 가입시 승인필요 설정이 비활성화되어있습니다. 필요시 설정에서 활성화할 수 있습니다.",
     "all_register_num" : "모든 가입 신청자의 수",
     "replace_move" : "문서 바꾸기",
-    "merge_move" : "문서 병합"
+    "merge_move" : "문서 병합",
+    "oauth_explain" : "OAuth 로그인 기능을 사용하려면 'publish_url' 값을 HTTPS 프로토콜을 포함한 도메인 주소로 설정하고, 실제로 HTTPS 연결을 지원해야 합니다."
 }

+ 0 - 1
route/main_manager.py

@@ -54,7 +54,6 @@ def main_manager_2(conn, num, r_ver):
                     <ul>
                         <li><a href="/restart">''' + load_lang('wiki_restart') + '''</a></li>
                         <li><a href="/update">''' + load_lang('update') + '''</a></li>
-                        <li><a href="/oauth_setting">''' + load_lang('oauth_setting') + '''</a></li>
                         <li><a href="/adsense_setting">''' + load_lang('adsense_setting') + '''</a></li>
                     </ul>
                     <br>

+ 120 - 35
route/setting.py

@@ -15,7 +15,8 @@ def setting_2(conn, num):
             'robots.txt',
             'Google',
             load_lang('main_bottom_body'),
-            load_lang('main_acl_setting')
+            load_lang('main_acl_setting'),
+            load_lang('oauth_setting')
         ]
 
         x = 0
@@ -134,59 +135,59 @@ def setting_2(conn, num):
                         <span>''' + load_lang('wiki_name') + '''</span>
                         <hr class=\"main_hr\">
                         <input type="text" name="name" value="''' + html.escape(d_list[0]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('wiki_logo') + ''' (HTML)</span>
                         <hr class=\"main_hr\">
                         <input type="text" name="logo" value="''' + html.escape(d_list[1]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('main_page') + '''</span>
                         <hr class=\"main_hr\">
                         <input type="text" name="frontpage" value="''' + html.escape(d_list[2]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('bottom_text') + ''' (HTML)</span>
                         <hr class=\"main_hr\">
                         <input type="text" name="license" value="''' + html.escape(d_list[3]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('max_file_size') + ''' (MB)</span>
                         <hr class=\"main_hr\">
                         <input type="text" name="upload" value="''' + html.escape(d_list[4]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('backup_interval') + ' (' + load_lang('hour') + ') (' + load_lang('off') + ' : 0) (' + load_lang('sqlite_only') + ') (' + load_lang('restart_required') + ''')</span>
                         <hr class=\"main_hr\">
                         <input type="text" name="back_up" value="''' + html.escape(d_list[9]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('wiki_skin') + '''</span>
                         <hr class=\"main_hr\">
                         <select name="skin">''' + load_skin(d_list[5]) + '''</select>
-                        <hr class=\"main_hr\">
+                        <hr>
                         <input type="checkbox" name="reg" ''' + check_box_div[0] + '''> ''' + load_lang('no_register') + '''
-                        <hr class=\"main_hr\">
+                        <hr>
                         <input type="checkbox" name="ip_view" ''' + check_box_div[1] + '''> ''' + load_lang('hide_ip') + '''
-                        <hr class=\"main_hr\">
+                        <hr>
                         <input type="checkbox" name="email_have" ''' + check_box_div[2] + '''> ''' + load_lang('email_required') + ' <a href="/setting/6">(' + load_lang('google_imap_required') + ''')</a>
-                        <hr class=\"main_hr\">
+                        <hr>
                         <input type="checkbox" name="requires_approval" ''' + check_box_div[3] + '''> ''' + load_lang('requires_approval') + '''
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('wiki_host') + '''</span>
                         <hr class=\"main_hr\">
                         <input type="text" name="host" value="''' + html.escape(d_list[16]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('wiki_port') + '''</span>
                         <hr class=\"main_hr\">
                         <input type="text" name="port" value="''' + html.escape(d_list[10]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('wiki_secret_key') + '''</span>
                         <hr class=\"main_hr\">
                         <input type="password" name="key" value="''' + html.escape(d_list[11]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('update_branch') + '''</span>
                         <hr class=\"main_hr\">
                         <select name="update">''' + branch_div + '''</select>
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('encryption_method') + '''</span>
                         <hr class=\"main_hr\">
                         <select name="encode">''' + acl_div[0] + '''</select>
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('slow_edit') + ' (' + load_lang('second') + ') (' + load_lang('off') + ''' : 0)</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[19] + '''" value="''' + html.escape(d_list[19]) + '''">
@@ -246,51 +247,51 @@ def setting_2(conn, num):
                         <span>''' + load_lang('register_text') + ''' (HTML)</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[0] + '''" value="''' + html.escape(d_list[0]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('non_login_alert') + ''' (HTML)</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[1] + '''" value="''' + html.escape(d_list[1]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('edit_bottom_text') + ''' (HTML)</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[2] + '''" value="''' + html.escape(d_list[2]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('check_key_text') + ''' (HTML)</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[3] + '''" value="''' + html.escape(d_list[3]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('email_title') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[4] + '''" value="''' + html.escape(d_list[4]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('email_text') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[5] + '''" value="''' + html.escape(d_list[5]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('email_insert_text') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[6] + '''" value="''' + html.escape(d_list[6]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('password_search_text') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[7] + '''" value="''' + html.escape(d_list[7]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('reset_user_text') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[8] + '''" value="''' + html.escape(d_list[8]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('error_401') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[9] + '''" value="''' + html.escape(d_list[9]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('error_404') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[10] + '''" value="''' + html.escape(d_list[10]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('edit_help') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[11] + '''" value="''' + html.escape(d_list[11]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('approval_question') + '''</span> <a href="#rfn-1" id="fn-1">(1)</a>
                         <hr class=\"main_hr\">
                         <input name="''' + i_list[12] + '''" value="''' + html.escape(d_list[12]) + '''">
@@ -500,7 +501,7 @@ def setting_2(conn, num):
                         <span>HTML</span>
                         <hr class=\"main_hr\">
                         <input name="recaptcha" placeholder='&lt;div class="g-recaptcha" data-sitekey="''' + load_lang('public_key') + '''"&gt;&lt;/div&gt;' value="''' + html.escape(d_list[0]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('secret_key') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="sec_re" value="''' + html.escape(d_list[1]) + '''">
@@ -509,7 +510,7 @@ def setting_2(conn, num):
                         <span>''' + load_lang('google_email') + '''</span>
                         <hr class=\"main_hr\">
                         <input name="g_email" value="''' + html.escape(d_list[2]) + '''">
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span><a href="https://security.google.com/settings/security/apppasswords">''' + load_lang('google_app_password') + '''</a></span>
                         <hr class=\"main_hr\">
                         <input type="password" name="g_pass" value="''' + html.escape(d_list[3]) + '''">
@@ -578,19 +579,19 @@ def setting_2(conn, num):
                         <span>''' + load_lang('document_acl') + '</span> <a href="/acl/TEST">(' + load_lang('reference') + ''')</a>
                         <hr class=\"main_hr\">
                         <select name="edit">''' + acl_div[0] + '''</select>
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('discussion_acl') + '''</span>
                         <hr class=\"main_hr\">
                         <select name="discussion">''' + acl_div[1] + '''</select>
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('upload_acl') + '''</span>
                         <hr class=\"main_hr\">
                         <select name="upload_acl">''' + acl_div[2] + '''</select>
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('view_acl') + '''</span>
                         <hr class=\"main_hr\">
                         <select name="all_view_acl">''' + acl_div[3] + '''</select>
-                        <hr class=\"main_hr\">
+                        <hr>
                         <span>''' + load_lang('edit_req_acl') + '''</span>
                         <hr class=\"main_hr\">
                         <select name="edit_req_acl">''' + acl_div[4] + '''</select>
@@ -600,5 +601,89 @@ def setting_2(conn, num):
                 ''',
                 menu = [['setting', load_lang('return')]]
             ))
+    elif num == 9:
+        oauth_supported = load_oauth('_README')['support']
+
+        if admin_check() != 1:
+            return re_error('/error/3')
+
+        if flask.request.method == 'POST':
+            admin_check(None, 'oauth setting')
+            return_json_data = '{ "publish_url" : "' + flask.request.form.get('publish_url_box', '') + ', '
+
+            for i in range(len(oauth_supported)):
+                return_json_data += '"discord" : { '
+                for j in range(2):
+                    if j == 0:
+                        load_target = 'id'
+                    elif j == 1:
+                        load_target = 'secret'
+
+                    target_data = flask.request.form.get(oauth_supported[i] + '_client_' + load_target, '')
+                    return_json_data += '"client_' + load_target  + '" : "' + target_data + '"' + (',' if j == 0 else '')
+
+                return_json_data += ' }'
+
+                try:
+                    _ = oauth_supported[i + 1]
+
+                    return_json_data += ', '
+                except:
+                    pas
+
+            with open(app_var['path_oauth_setting'], 'w', encoding='utf-8') as f:
+                f.write(return_json_data)
+
+            return redirect('/oauth_setting')
+        else:
+            body_content = load_lang('oauth_explain') + '<hr>'
+            body_content += '''
+                <input placeholder="publish_url" id="publish_url_box" name="publish_url_box">
+                <hr>
+                <script>
+                    function check_value (target) {
+                        target_box = document.getElementById(target.id + "_box");
+                        if (target.value !== "") {
+                            target_box.checked = true;
+                        } else {
+                            target_box.checked = false;
+                        }
+                    }
+                </script>
+            '''
+
+            init_js = ''
+            body_content += '<form method="post">'
+
+            for i in range(len(oauth_supported)):
+                oauth_data = load_oauth(oauth_supported[i])
+
+                for j in range(2):
+                    if j == 0:
+                        load_target = 'id'
+                    elif j == 1:
+                        load_target = 'secret'
+
+                    init_js += 'check_value(document.getElementById("' + oauth_supported[i] + '_client_' + load_target + '"));'
+                    body_content += '''
+                        <input id="''' + oauth_supported[i] + '''_client_''' + load_target + '''_box" type="checkbox" disabled>
+                        <input  placeholder="''' + oauth_supported[i] + '''_client_''' + load_target + '''" 
+                                id="''' + oauth_supported[i] + '''_client_''' + load_target + '''" 
+                                name="''' + oauth_supported[i] + '''_client_''' + load_target + '''" 
+                                value="''' + oauth_data['client_' + load_target] + '''" 
+                                type="text" 
+                                onChange="check_value(this)" 
+                                style="width: 80%;">
+                        ''' + ('<hr>' if j == 1 else '<hr class=\"main_hr\">') + '''
+                    '''
+
+            body_content += '<button id="save" type="submit">' + load_lang('save') + '</button></form>'
+            body_content += '<script>' + init_js + '</script>'
+
+            return easy_minify(flask.render_template(skin_check(),
+                imp = [load_lang('oauth_setting'), wiki_set(), custom(), other2([0, 0])],
+                data = body_content,
+                menu = [['other', load_lang('return')]]
+            ))
     else:
         return redirect()

+ 0 - 100
route/setting_oauth.py

@@ -1,100 +0,0 @@
-from .tool.func import *
-
-def setting_oauth_2(conn):
-    curs = conn.cursor()
-
-    if admin_check(None, 'oauth setting') != 1:
-        return re_error('/error/3')
-
-    if flask.request.method == 'POST':
-        try:
-            facebook_client_id = flask.request.form['facebook_client_id']
-            facebook_client_secret = flask.request.form['facebook_client_secret']
-
-            naver_client_id = flask.request.form['naver_client_id']
-            naver_client_secret = flask.request.form['naver_client_secret']
-        except:
-            return easy_minify(flask.render_template(skin_check(),
-                imp = [load_lang('inter_error'), wiki_set(), custom(), other2([0, 0])],
-                data = '<h2>ie_no_data_required</h2>' + load_lang('ie_no_data_required'),
-                menu = [['other', load_lang('return')]]
-            ))
-
-        with open(app_var['path_oauth_setting'], 'r', encoding='utf-8') as f:
-            legacy = json.loads(f.read())
-
-        with open(app_var['path_oauth_setting'], 'w', encoding='utf-8') as f:
-            f.write('''
-                {
-                    "_README" : {
-                        "en" : "''' + legacy['_README']['en'] + '''",
-                        "ko" : "''' + legacy['_README']['ko'] + '''",
-                        "support" : ''' + str(legacy['_README']['support']).replace("'", '"') + '''
-                    },
-                    "publish_url" : "''' + legacy['publish_url'] + '''",
-                    "facebook" : {
-                        "client_id" : "''' + facebook_client_id + '''",
-                        "client_secret" : "''' + facebook_client_secret + '''"
-                    },
-                    "naver" : {
-                        "client_id" : "''' + naver_client_id + '''",
-                        "client_secret" : "''' + naver_client_secret + '''"
-                    }
-                }
-            ''')
-
-        return flask.redirect('/oauth_setting')
-
-    oauth_supported = load_oauth('_README')['support']
-
-    body_content = ''
-    body_content += '''
-        <script>
-            function check_value (target) {
-                target_box = document.getElementById(target.id + "_box");
-                if (target.value !== "") {
-                    target_box.checked = true;
-                } else {
-                    target_box.checked = false;
-                }
-            }
-        </script>
-    '''
-
-    init_js = ''
-    body_content += '<form method="post">'
-
-    for i in range(len(oauth_supported)):
-        oauth_data = load_oauth(oauth_supported[i])
-        for j in range(2):
-            if j == 0:
-                load_target = 'id'
-            elif j == 1:
-                load_target = 'secret'
-
-            init_js += 'check_value(document.getElementById("{}_client_{}"));'.format(oauth_supported[i], load_target)
-
-            body_content += '''
-                <input id="{}_client_{}_box" type="checkbox" disabled>
-                <input placeholder="{}_client_{}" id="{}_client_{}" name="{}_client_{}" value="{}" type="text" onChange="check_value(this)" style="width: 80%;">
-                <hr>
-            '''.format(
-                oauth_supported[i],
-                load_target,
-                oauth_supported[i],
-                load_target,
-                oauth_supported[i],
-                load_target,
-                oauth_supported[i],
-                load_target,
-                oauth_data['client_{}'.format(load_target)]
-            )
-
-    body_content += '<button id="save" type="submit">' + load_lang('save') + '</button></form>'
-    body_content += '<script>' + init_js + '</script>'
-
-    return easy_minify(flask.render_template(skin_check(),
-        imp = [load_lang('oauth_setting'), wiki_set(), custom(), other2([0, 0])],
-        data = body_content,
-        menu = [['other', load_lang('return')]]
-    ))

+ 5 - 2
route/tool/func.py

@@ -306,9 +306,12 @@ def load_lang(data, num = 2, safe = 0):
             return load_lang(data, 1, safe)
 
 def load_oauth(provider):
-    oauth = json.loads(open(app_var['path_oauth_setting'], encoding='utf-8').read())
+    if(provider == '_README'):
+        return { "support" : ["discord", "facebook", "naver", "kakao"] }
+    else:
+        oauth = json.loads(open(app_var['path_oauth_setting'], encoding='utf-8').read())
 
-    return oauth[provider]
+        return oauth[provider]
 
 def update_oauth(provider, target, content):
     oauth = json.loads(open(app_var['path_oauth_setting'], encoding='utf-8').read())

+ 1 - 1
route/tool/init.py

@@ -29,7 +29,7 @@ server_set_var = {
         'display' : 'Markup',
         'require' : 'select',
         'default' : 'namumark',
-        'list' : ['namumark', 'markdown', 'raw', 'js_namumark']
+        'list' : ['namumark', 'raw', 'js_namumark']
     },
     'encode' : {
         'display' : 'Encryption method',

+ 1 - 1
version.json

@@ -1,6 +1,6 @@
 {
     "master" : {
-        "r_ver" : "v3.1.6-master-10",
+        "r_ver" : "v3.1.6-master-11",
         "c_ver" : "400009",
         "s_ver" : "7"
     }, "stable" : {

+ 72 - 36
views/main_css/js/render_namumark.js

@@ -62,19 +62,13 @@ function render_namumark(target) {
                 var img_src = JSON.parse(this.responseText)['data'];
                 
                 xhr.onreadystatechange = function() {
-                    if(this.readyState === 4 && this.status === 200) {
-                        if(JSON.parse(this.responseText)['exist'] !== '1') {
-                            document.getElementById(file_data[1]).innerHTML = '' +
-                                '<a href="/upload?name=' + encodeURIComponent(file_data[0]) + '" id="not_thing">' + file_data[0] + '</a>' +
-                            '';
-                        } else {
-                            document.getElementById(file_data[1]).innerHTML = '' +
-                                '<img src="/image/' + img_src + file_type + '">' +
-                            '';
-                        }
+                    if(this.readyState === 4 && this.status === 200 && JSON.parse(this.responseText)['exist'] === '1') {
+                        document.getElementById(file_data[1]).innerHTML = '' +
+                            '<img style="' + file_data[2] + '" src="/image/' + img_src + file_type + '">' +
+                        '';
                     } else {
                         document.getElementById(file_data[1]).innerHTML = '' +
-                            '<a href="/upload?name=' + encodeURIComponent(file_data[0]) + '" id="not_thing">' + file_data[0] + '</a>' +
+                            '<a href="/upload?name=' + encodeURIComponent(file_name) + '" id="not_thing">' + file_data[0] + '</a>' +
                         '';
                     }
                 }
@@ -327,23 +321,18 @@ function render_namumark(target) {
         return '<span id="math_' + String(math_num) + '"></span>';
     });
 
-    var i = 0;
     var mid_num = 0;
     var mid_stack = 0;
     var mid_list = [];
     var html_num = 0;
     var fol_num = 0;
     var mid_regex = /(?:{{{(?:((?:(?! |{{{|}}}|&lt;).)*) ?)|(?:}}}))/;
-    // 이거 손 봐야함
     while(1) {
         var all_mid_data = data.match(mid_regex);
-        console.log(all_mid_data);
         if(all_mid_data) {
             var all = all_mid_data[0];
             var in_data = all_mid_data[1];
 
-            i += 1;
-
             if(all === '}}}') {
                 if(mid_stack > 0) {
                     mid_stack -= 1;
@@ -413,16 +402,45 @@ function render_namumark(target) {
                         } else if(in_data.match(/#!wiki/i)) {
                             mid_list.push('div_1');
 
-                            data = data.replace(mid_regex, '<div id="wiki_div_before">');
+
+                            var div_style_data = data.match(/{{{#!wiki(?: style=([^\n]+))?\n?/i);
+                            if(!div_style_data[1]) {
+                                div_style_data = '';
+                            } else {
+                                div_style_data = div_style_data[1];
+                                console.log(div_style_data);
+
+                                div_style_data = div_style_data.replace(/('|")/g, '');
+                                div_style_data = div_style_data.replace(/position/ig, '');
+                            }
+
+                            data = data.replace(/{{{#!wiki(?: style=([^\n]+))?\n?/i, '<div id="wiki_div" style="' + div_style_data + '">');
                         } else if(in_data.match(/#!syntax/i)) {
                             mid_list.push('pre');
                             mid_stack += 1;
+
+                            var syntax_data = data.match(/{{{#!syntax(?: ([^\n]+))?\n?/i);
+                            if(!syntax_data[1]) {
+                                syntax_data = 'python';
+                            } else {
+                                syntax_data = syntax_data[1];
+                            }
                             
-                            data = data.replace(mid_regex, '<pre><code id="syntax_before">');
+                            data = data.replace(/{{{#!syntax(?: ([^\n]+))?\n?/i, '<pre id="syntax"><code class="' + syntax_data + '">');
                         } else if(in_data.match(/#!folding/i)) {
                             mid_list.push('div_2');
+
+                            var fol_data = data.match(/{{{#!folding(?: ([^\n]+))?\n?/i);
+                            if(!fol_data[1]) {
+                                fol_data = 'TEST';
+                            } else {
+                                fol_data = fol_data[1];
+                            }
+                            
+                            fol_num += 1;
                             
-                            data.replace(mid_regex, '' +
+                            data = data.replace(/{{{#!folding( ([^\n]+))?\n?/i, '' +
+                                fol_data +
                                 '<div style="display: inline-block;">' + 
                                     '<a href="javascript:void(0);" onclick="do_open_folding(\'folding_' + String(fol_num) + '\', this);">' +
                                         '[+]' +
@@ -455,15 +473,21 @@ function render_namumark(target) {
         }
     }
 
+    data = data.replace(/<mid>/g, '{{{');
+    data = data.replace(/<\/mid>/g, '}}}');
     data = data.replace(/<\/div> *\n/ig, '</div>');
 
     var nowiki_num = 0;
     var nowiki_list = {};
-    data = data.replace(/<code>(\n*((?:(?!<\/code>).)+\n*)+)<\/code>/g, function(all, in_data) {
+    data = data.replace(/<code( (?:class="(?:[^"]+)"))?>(\n*((?:(?!<\/code>).)+\n*)+)<\/code>/g, function(all, class_data, in_data) {
         nowiki_num += 1;
         nowiki_list['nowiki_' + String(nowiki_num)] = in_data;
 
-        return '<span id="nowiki_' + String(nowiki_num) + '"></span>';
+        if(class_data) {
+            return '<code' + class_data + '><span id="nowiki_' + String(nowiki_num) + '"></span></code>';
+        } else {
+            return '<span id="nowiki_' + String(nowiki_num) + '"></span>';
+        }
     });
 
     data = data.replace(/\r\n/g, '\n');
@@ -473,26 +497,19 @@ function render_namumark(target) {
     data = data.replace(/\|\|(?: +)\n/g, '||\n');
 
     data = data.replace(/\n##(?:(?:(?!\n).)+)/g, '');
-    data = data.replace(/<div id="wiki_div" style="">\n/g, '<div id="wiki_div" style="">');
-    data = data.replace(/<div id="wiki_div" style=""> +/g, '<div id="wiki_div" style="">');
-
-    console.log(data);
-    console.log('----')
 
     while(1) {
-        wiki_table_data = data.match(/<div id="wiki_div" ((?:(?!>).)+)>((?:(?!<div id="wiki_div"|<\/div_1>).\n*)+)<\/div_1>/i);
+        wiki_table_data = data.match(/<div id="wiki_div"( (?:[^>]*))>((?:(?:\n| )*)(?:(?!<div id="wiki_div"|<\/div_1>).\n*)+)<\/div_1>/i);
         if(wiki_table_data) {
             if(wiki_table_data[2].match(/\|\|/)) {
-                console.log('1')
-                console.log(wiki_table_data[2]);
                 var end_table_render = table_render('\n' + wiki_table_data[2] + '\n').replace(/^\n/, '').replace(/\n$/, '');
             } else {
                 var end_table_render = wiki_table_data[2];
             }
 
             data = data.replace(
-                /<div id="wiki_div" ((?:(?!>).)+)>((?:(?!<div id="wiki_div"|<\/div_1>).\n*)+)<\/div_1>/i, 
-                '<div ' + wiki_table_data[1] + '>' + end_table_render + '</div>'
+                /<div id="wiki_div"( (?:[^>]*))>((?:(?:\n| )*)(?:(?!<div id="wiki_div"|<\/div_1>).\n*)+)<\/div_1>/i, 
+                '<div' + wiki_table_data[1] + '>' + end_table_render + '</div>'
             );
         } else {
             break;
@@ -594,7 +611,6 @@ function render_namumark(target) {
         return '\n<span style="margin-left: ' + String(margin_data.length * 10) + 'px"></span>'
     });
 
-    console.log(data);
     data = table_render(data);
 
     var link_list = [];
@@ -625,7 +641,26 @@ function render_namumark(target) {
 
                     return '';
                 } else if(in_data.match(/^(?:file|파일):/i)) {
-                    file_list.push([in_data.replace(/^(?:file|파일):/i, ''), 'file_' + String(file_num)]);
+                    if(in_data.match(/\|/)) {
+                        var file_name = in_data.replace(/^(?:file|파일):/i, '');
+                        file_name = file_name.match(/^([^|]+)/)[1];
+                    } else {
+                        var file_name = in_data.replace(/^(?:file|파일):/i, '');
+                    }
+
+                    var file_style = '';
+                    
+                    var file_state = in_data.match(/\|width=([^|]+)/);
+                    if(file_state) {
+                        file_style += 'width:' + file_state[1];
+                    }
+
+                    file_state = in_data.match(/\|height=([^|]+)/);
+                    if(file_state) {
+                        file_style += 'height:' + file_state[1];
+                    }
+
+                    file_list.push([file_name, 'file_' + String(file_num), file_style]);
                     file_num += 1;
                     
                     return '<span id="file_' + String(file_num - 1) + '"></span>';
@@ -637,7 +672,7 @@ function render_namumark(target) {
 
                     return '<a id="out_link" href="' + back_data + '">' + front_data + '</a>'; 
                 } else {
-                    var link_part = divi_link(in_data);
+                    var link_part = divi_link(in_data.replace(/^:/, ''));
                     
                     var front_data = link_part[0];
                     var back_data = link_part[1];
@@ -873,9 +908,10 @@ function render_namumark(target) {
         }
     }
 
+    console.log('render end')
     hljs.initHighlightingOnLoad();
     render_html("html_render_contect");    
 
-    // v0.0.6
-    // 어느 정도 괜찮은 수준까진 옴
+    // v0.0.8
+    // 완성 직전
 }