2du 5 лет назад
Родитель
Сommit
80c42da6b4

+ 1 - 67
app.py

@@ -219,72 +219,6 @@ if not os.path.exists('views'):
     os.makedirs('views')
     os.makedirs('views')
 
 
 print('----')
 print('----')
-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']
 dislay_set_key = ['Host', 'Port', 'Language', 'Markup', 'Encryption method']
 server_set_key = ['host', 'port', 'language', 'markup', 'encode']
 server_set_key = ['host', 'port', 'language', 'markup', 'encode']
@@ -294,7 +228,7 @@ for i in range(len(server_set_key)):
     curs.execute(db_change('select data from other where name = ?'), [server_set_key[i]])
     curs.execute(db_change('select data from other where name = ?'), [server_set_key[i]])
     server_set_val = curs.fetchall()
     server_set_val = curs.fetchall()
     if not server_set_val:
     if not server_set_val:
-        server_set_val = server_init(server_set_key[i])
+        server_set_val = server_init.init(server_set_key[i])
 
 
         curs.execute(db_change('insert into other (name, data) values (?, ?)'), [server_set_key[i], server_set_val])
         curs.execute(db_change('insert into other (name, data) values (?, ?)'), [server_set_key[i], server_set_val])
         conn.commit()
         conn.commit()

+ 75 - 7
route/tool/func.py

@@ -80,6 +80,74 @@ def load_conn(data):
 
 
     load_conn2(data)
     load_conn2(data)
     
     
+class server_init:
+    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']
+    
 def load_image_url():
 def load_image_url():
     curs.execute(db_change('select data from other where name = "image_where"'))
     curs.execute(db_change('select data from other where name = "image_where"'))
     image_where = curs.fetchall()
     image_where = curs.fetchall()
@@ -578,15 +646,15 @@ def other2(data):
 
 
     data = data[0:2] + ['', '''
     data = data[0:2] + ['', '''
         <link   rel="stylesheet"
         <link   rel="stylesheet"
-                href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.1.2/build/styles/default.min.css">
-        <link   rel="stylesheet"
-                href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css"
-                integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X"
+                href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.7.2/build/styles/default.min.css">
+        <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.7.2/build/highlight.min.js"></script>
+        <link   defer rel="stylesheet"
+                href="https://cdn.jsdelivr.net/npm/katex@0.13.2/dist/katex.min.css"
+                integrity="sha384-Cqd8ihRLum0CCg8rz0hYKPoLZ3uw+gES2rXQXycqnL5pgVQIflxAUDS7ZSjITLb5"
                 crossorigin="anonymous">
                 crossorigin="anonymous">
-        <script src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js"
-                integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4"
+        <script src="https://cdn.jsdelivr.net/npm/katex@0.13.2/dist/katex.min.js"
+                integrity="sha384-1Or6BdeNQb0ezrmtGeqQHFpppNd7a/gw29xeiSikBbsb44xu3uAo8c7FwbF5jhbd"
                 crossorigin="anonymous"></script>
                 crossorigin="anonymous"></script>
-        <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.1.2/build/highlight.min.js"></script>
     ''' + data_css + '<script>window.addEventListener(\'DOMContentLoaded\', main_css_skin_load);</script>'] + data[2:]
     ''' + data_css + '<script>window.addEventListener(\'DOMContentLoaded\', main_css_skin_load);</script>'] + data[2:]
 
 
     return data
     return data

+ 55 - 4
route/tool/func_mark.py

@@ -24,13 +24,63 @@ def load_conn2(data):
 
 
     conn = data
     conn = data
     curs = conn.cursor()
     curs = conn.cursor()
+    
+def backlink_generate(data_markup, doc_data, doc_name):
+    if data_markup == 'namumark':
+        link_re = re.compile(r'\[\[(?!https?:\/\/)((?:(?!\[\[|\]\]|\|).)+)(?:\]\]|\|)', re.I)
+        data_link = link_re.findall(doc_data)
+        data_link_end = []
+        for i in data_link:
+            data_link_in = re.sub(r'#([^#]+)$', '', i)
+            if re.search(r'^(?:분류|category):', data_link_in):
+                data_link_end += [[
+                    doc_name,
+                    re.sub(r'^분류:', 'category:', data_link_in),
+                    'cat'
+                ]]
+            elif re.search(r'^(?:파일|file):', data_link_in):
+                data_link_end += [[
+                    doc_name,
+                    re.sub(r'^파일:', 'file:', data_link_in),
+                    'file'
+                ]]
+            elif data_link_in[0] == ':':
+                data_link_end += [[
+                    doc_name, 
+                    re.sub(r'^:', '', data_link_in), 
+                    ''
+                ]]
+            elif data_link_in[0] == '/':
+                data_link_end += [[
+                    doc_name, 
+                    doc_name + data_link_in, 
+                    ''
+                ]]
+            elif re.search(r'^\.\.\/', data_link_in):
+                data_link_in = re.sub(r'^\.\.\/', '', data_link_in)
+                data_link_end += [[
+                    doc_name, 
+                    re.sub('\/[^/]+$', '', doc_name) + ('/' + data_link_in if data_link_in != '' else ''),
+                    ''
+                ]]
+            else:
+                data_link_end += [[
+                    doc_name, 
+                    data_link_in,
+                    ''
+                ]]
+    else:
+        data_link_end = [[]]
+            
+    return data_link_end
 
 
 def render_do(doc_name, doc_data, data_type, data_in):
 def render_do(doc_name, doc_data, data_type, data_in):
     data_in = None if data_in == '' else data_in
     data_in = None if data_in == '' else data_in
     
     
     curs.execute(db_change('select data from other where name = "markup"'))
     curs.execute(db_change('select data from other where name = "markup"'))
     rep_data = curs.fetchall()
     rep_data = curs.fetchall()
-    if rep_data[0][0] == 'namumark':
+    rep_data = rep_data[0][0] if rep_data else 'namumark'
+    if rep_data == 'namumark':
         data_in = (data_in + '_') if data_in else ''
         data_in = (data_in + '_') if data_in else ''
         data_end = [
         data_end = [
             '<div class="render_content" id="' + data_in + 'render_content">' + html.escape(doc_data) + '</div>', 
             '<div class="render_content" id="' + data_in + 'render_content">' + html.escape(doc_data) + '</div>', 
@@ -44,7 +94,7 @@ def render_do(doc_name, doc_data, data_type, data_in):
             ''',
             ''',
             []
             []
         ]
         ]
-    elif rep_data[0][0] == 'custom':
+    elif rep_data == 'custom':
         data_end = custom_mark(
         data_end = custom_mark(
             conn, 
             conn, 
             doc_data, 
             doc_data, 
@@ -59,10 +109,11 @@ def render_do(doc_name, doc_data, data_type, data_in):
         ]
         ]
 
 
     if data_type == 'backlink':
     if data_type == 'backlink':
-        if data_end[2] == []:
+        backlink = backlink_generate(rep_data, html.escape(doc_data), doc_name)
+        if backlink == []:
             curs.execute(db_change("insert into back (title, link, type) values ('test', ?, 'nothing')"), [doc_name])
             curs.execute(db_change("insert into back (title, link, type) values ('test', ?, 'nothing')"), [doc_name])
         else:
         else:
-            curs.executemany(db_change("insert into back (link, title, type) values (?, ?, ?)"), data_end[2])
+            curs.executemany(db_change("insert into back (link, title, type) values (?, ?, ?)"), backlink)
             curs.execute(db_change("delete from back where title = ? and type = 'no'"), [doc_name])
             curs.execute(db_change("delete from back where title = ? and type = 'no'"), [doc_name])
 
 
         conn.commit()
         conn.commit()

+ 4 - 2
route/user_setting.py

@@ -73,7 +73,8 @@ def user_setting_2(conn, server_init):
                 imp = [load_lang('user_setting'), wiki_set(), custom(), other2([0, 0])],
                 imp = [load_lang('user_setting'), wiki_set(), custom(), other2([0, 0])],
                 data = '''
                 data = '''
                     <form method="post">
                     <form method="post">
-                        <span>''' + load_lang('id') + ''' : ''' + ip_pas(ip) + '''</span>
+                        <div id="get_user_info"></div>
+                        <script>load_user_info("''' + ip + '''");</script>
                         <hr class="main_hr">
                         <hr class="main_hr">
                         <a href="/pw_change">(''' + load_lang('password_change') + ''')</a>
                         <a href="/pw_change">(''' + load_lang('password_change') + ''')</a>
                         <hr class="main_hr">
                         <hr class="main_hr">
@@ -124,7 +125,8 @@ def user_setting_2(conn, server_init):
                 imp = [load_lang('user_setting'), wiki_set(), custom(), other2([0, 0])],
                 imp = [load_lang('user_setting'), wiki_set(), custom(), other2([0, 0])],
                 data = '''
                 data = '''
                     <form method="post">
                     <form method="post">
-                        <span>''' + load_lang('id') + ''' : ''' + ip_pas(ip) + '''</span>
+                        <div id="get_user_info"></div>
+                        <script>load_user_info("''' + ip + '''");</script>
                         <hr class="main_hr">
                         <hr class="main_hr">
                         <h2>''' + load_lang('main') + '''</h2>
                         <h2>''' + load_lang('main') + '''</h2>
                         <span>''' + load_lang('skin') + '''</span>
                         <span>''' + load_lang('skin') + '''</span>

+ 1 - 4
route/view_read.py

@@ -6,7 +6,6 @@ def view_read_2(conn, name):
     sub = ''
     sub = ''
     div = ''
     div = ''
     ip = ip_check()
     ip = ip_check()
-    run_redirect = ''
     name_doc_pass = flask.request.args.get('from', '')
     name_doc_pass = flask.request.args.get('from', '')
     uppage = re.sub(r"([^/]+)$", '', name)
     uppage = re.sub(r"([^/]+)$", '', name)
 
 
@@ -164,10 +163,8 @@ def view_read_2(conn, name):
     else:
     else:
         watch_list = 0
         watch_list = 0
 
 
-    div += run_redirect
-
     return easy_minify(flask.render_template(skin_check(),
     return easy_minify(flask.render_template(skin_check(),
-        imp = [flask.request.args.get('show', name), wiki_set(), custom(), other2([sub, r_date, watch_list])],
+        imp = [name, wiki_set(), custom(), other2([sub, r_date, watch_list])],
         data = div,
         data = div,
         menu = menu
         menu = menu
     )), response_data
     )), response_data

+ 14 - 25
route/view_xref.py

@@ -7,36 +7,25 @@ def view_xref_2(conn, name):
         return re_error('/ban')
         return re_error('/ban')
 
 
     num = int(number_check(flask.request.args.get('num', '1')))
     num = int(number_check(flask.request.args.get('num', '1')))
-    if num * 50 > 0:
-        sql_num = num * 50 - 50
-    else:
-        sql_num = 0
-
-    if flask.request.args.get('change', '1') == '1':
+    sql_num = (num * 50 - 50) if num * 50 > 0 else 0
+    
+    xref_type = flask.request.args.get('change', '1')
+    if xref_type == '1':
         div = '<a href="?change=2">(' + load_lang('link_in_this') + ')</a><hr class="main_hr">'
         div = '<a href="?change=2">(' + load_lang('link_in_this') + ')</a><hr class="main_hr">'
     else:
     else:
         div = '<a href="?change=1">(' + load_lang('normal') + ')</a><hr class="main_hr">'
         div = '<a href="?change=1">(' + load_lang('normal') + ')</a><hr class="main_hr">'
 
 
     div += '<ul class="inside_ul">'
     div += '<ul class="inside_ul">'
 
 
-    if flask.request.args.get('change', '1') == '1':
-        curs.execute(db_change("" + \
-            "select distinct link, type from back " + \
-            "where title = ? and not type = 'cat' and not type = 'no' and not type = 'nothing'" + \
-            "order by link asc limit ?, 50" + \
-        ""), [
-            name,
-            sql_num
-        ])
-    else:
-        curs.execute(db_change("" + \
-            "select distinct title, type from back " + \
-            "where link = ? and not type = 'cat' and not type = 'no' and not type = 'nothing'" + \
-            "order by link asc limit ?, 50" + \
-        ""), [
-            name,
-            sql_num
-        ])
+    sql_insert = ['link', 'title'] if xref_type == '1' else ['title', 'link']
+    curs.execute(db_change("" + \
+        "select distinct " + sql_insert[0] + ", type from back " + \
+        "where " + sql_insert[1] + " = ? and not type = 'cat' and not type = 'no' and not type = 'nothing'" + \
+        "order by type asc, title asc limit ?, 50" + \
+    ""), [
+        name,
+        sql_num
+    ])
 
 
     data_list = curs.fetchall()
     data_list = curs.fetchall()
     for data in data_list:
     for data in data_list:
@@ -52,7 +41,7 @@ def view_xref_2(conn, name):
 
 
         div += '</li>'
         div += '</li>'
 
 
-    div += '</ul>' + next_fix('/xref/' + url_pas(name) + '?num=', num, data_list)
+    div += '</ul>' + next_fix('/xref/' + url_pas(name) + '?change=' + xref_type + '&num=', num, data_list)
 
 
     return easy_minify(flask.render_template(skin_check(),
     return easy_minify(flask.render_template(skin_check(),
         imp = [name, wiki_set(), custom(), other2(['(' + load_lang('backlink') + ')', 0])],
         imp = [name, wiki_set(), custom(), other2(['(' + load_lang('backlink') + ')', 0])],

+ 3 - 0
views/main_css/css/main.css

@@ -235,9 +235,12 @@ a {
 blockquote {
 blockquote {
     padding: 15px 40px 15px 15px;
     padding: 15px 40px 15px 15px;
     margin: 15px 0 0;
     margin: 15px 0 0;
+    
     display: table;
     display: table;
+    
     border: 2px solid #ccc;
     border: 2px solid #ccc;
     border-left: 5px solid black;
     border-left: 5px solid black;
+    
     background-image: url('/views/main_css/file/quote.png');
     background-image: url('/views/main_css/file/quote.png');
     background-position: calc(100% - 10px) 10px;
     background-position: calc(100% - 10px) 10px;
     background-repeat: no-repeat;
     background-repeat: no-repeat;

+ 1 - 1
views/main_css/js/render_namumark.js

@@ -7,7 +7,7 @@ function get_link_state(data, i = 0) {
             var xhr = new XMLHttpRequest();
             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.send();
-
+            
             xhr.onreadystatechange = function() {
             xhr.onreadystatechange = function() {
                 if(this.readyState === 4 && this.status === 200) {
                 if(this.readyState === 4 && this.status === 200) {
                     if(JSON.parse(this.responseText)['exist'] !== '1') {
                     if(JSON.parse(this.responseText)['exist'] !== '1') {

+ 91 - 58
views/main_css/js/render_onmark.js

@@ -10,7 +10,7 @@ function do_nowiki_change(data, data_nowiki) {
     });
     });
 }
 }
 
 
-function do_link_change(data, data_nowiki, no_change, data_nowiki) {
+function do_link_change(data, data_nowiki, no_change) {
     data = data.replace(/^:/, '');
     data = data.replace(/^:/, '');
     
     
     if(no_change === 0) {
     if(no_change === 0) {
@@ -293,19 +293,15 @@ function do_onmark_link_render(data, data_js, name_doc, name_include, data_nowik
         } else {
         } else {
             if(link_real.match(/^\//)) {
             if(link_real.match(/^\//)) {
                 link_real = name_doc + link_real;
                 link_real = name_doc + link_real;
-            } else if(link_real === '../') {
-                link_real = name_doc.split('/');
-                if(link_real.length > 1) {
-                    link_real = link_real.slice(0, link_real.length - 1).join('/');
-                } else {
-                    link_real = name_doc;
-                }
+            } else if(link_real.match(/^\.\.\//)) {
+                link_real = link_real.replace(/^\.\.\//, '');
+                link_real = name_doc.replace(/\/[^/]+$/, '') + (link_real !== '' ? '/' + link_real : '');
             }
             }
             
             
             var i = 0;
             var i = 0;
             while(i < 2) {
             while(i < 2) {
                 if(i === 0) {
                 if(i === 0) {
-                    var link_data_var = do_link_change(link_real, data_nowiki, 0, data_nowiki);
+                    var link_data_var = do_link_change(link_real, data_nowiki, 0);
                     var link_main = link_data_var[0];
                     var link_main = link_data_var[0];
                     var link_sub = link_data_var[1];
                     var link_sub = link_data_var[1];
                     
                     
@@ -488,6 +484,7 @@ function do_onmark_middle_render(data, data_js, name_include, data_nowiki, name_
     
     
     var html_n = 0;
     var html_n = 0;
     var folding_n = 0;
     var folding_n = 0;
+    var syntax_n = 0;
     
     
     while(1) {
     while(1) {
         var middle_data = data.match(middle_re);
         var middle_data = data.match(middle_re);
@@ -536,6 +533,18 @@ function do_onmark_middle_render(data, data_js, name_include, data_nowiki, name_
 
 
                     data = data.replace(middle_re, '<span id="' + name_include + 'render_contect_' + String(html_n) + '">');
                     data = data.replace(middle_re, '<span id="' + name_include + 'render_contect_' + String(html_n) + '">');
                     middle_stack.push('</span>');
                     middle_stack.push('</span>');
+                } else if(middle_data[1] === '#!syntax') {
+                    syntax_n += 1;
+                    
+                    var syntax_re = /{{{#!syntax(?: ([^\n]+)\n)?/;
+                    
+                    var syntax = data.match(syntax_re);
+                    var syntax_name = syntax[1] ? syntax[1] : 'python';
+                    
+                    data = data.replace(syntax_re, 
+                        '<pre id="syntax"><code id="get_' + name_include + 'syntax_' + String(syntax_n) + '" class="' + syntax_name + '"><nowiki_start>'
+                    );
+                    middle_stack.push('<nowiki_end></code></pre>');
                 } else if(middle_data[1] === '#!folding') {
                 } else if(middle_data[1] === '#!folding') {
                     folding_n += 1;
                     folding_n += 1;
                     
                     
@@ -544,18 +553,7 @@ function do_onmark_middle_render(data, data_js, name_include, data_nowiki, name_
                     var folding = data.match(folding_re);
                     var folding = data.match(folding_re);
                     var folding_name = folding[1] ? folding[1] : 'open';
                     var folding_name = folding[1] ? folding[1] : 'open';
                     
                     
-                    if(folding_n > 100) {
-                        break;
-                    }
-                    
-                    data_js += '' +
-                        'if(document.getElementById("get_' + name_include + 'folding_' + String(folding_n) + '")) { ' + 
-                            'document.getElementById("get_' + name_include + 'folding_' + String(folding_n) + '").innerHTML = ' + 
-                                '"' + do_js_safe_change(folding_name) + '"; ' + 
-                            '' + 
-                        '}' + 
-                        '\n' + 
-                    ''
+                    data_js += do_data_try_insert('get_' + name_include + 'folding_' + String(folding_n), do_js_safe_change(folding_name));
                     data = data.replace(folding_re, '' +
                     data = data.replace(folding_re, '' +
                         '<div style="display: inline-block;">' +
                         '<div style="display: inline-block;">' +
                             '<b>' + 
                             '<b>' + 
@@ -568,7 +566,7 @@ function do_onmark_middle_render(data, data_js, name_include, data_nowiki, name_
                             '\n' +
                             '\n' +
                             '<wiki_start style="">' +
                             '<wiki_start style="">' +
                     '');
                     '');
-                    middle_stack.push('<folding_end>');
+                    middle_stack.push('<wiki_end></div>');
                 } else {
                 } else {
                     data = data.replace(middle_re, '<nowiki_start>' + middle_data[1]);
                     data = data.replace(middle_re, '<nowiki_start>' + middle_data[1]);
                     middle_stack.push('<nowiki_end>');
                     middle_stack.push('<nowiki_end>');
@@ -582,7 +580,6 @@ function do_onmark_middle_render(data, data_js, name_include, data_nowiki, name_
         middle_stack.pop();
         middle_stack.pop();
     }
     }
     
     
-    data = data.replace(/<folding_end>/g, '<wiki_end></div>');
     data = data.replace(/\n<wiki_end>/g, '<wiki_end>');
     data = data.replace(/\n<wiki_end>/g, '<wiki_end>');
     
     
     data = data.replace(/<middle_start>/g, '{{{');
     data = data.replace(/<middle_start>/g, '{{{');
@@ -622,6 +619,10 @@ function do_onmark_middle_render(data, data_js, name_include, data_nowiki, name_
         data = data.replace(wiki_re, '<div ' + wiki_data_style + '>' + wiki_data[0] + '</div>');
         data = data.replace(wiki_re, '<div ' + wiki_data_style + '>' + wiki_data[0] + '</div>');
     }
     }
     
     
+    if(syntax_n > 0) {
+        data_js += 'hljs.initHighlightingOnLoad();\n';
+    }
+    
     return [data, data_js, data_nowiki];
     return [data, data_js, data_nowiki];
 }
 }
 
 
@@ -962,6 +963,31 @@ function do_onmark_hr_render(data) {
     return data;
     return data;
 }
 }
 
 
+function do_onmark_redirect_render(data, data_js, name_doc) {
+    var redirect_re = /#(?:redirect|넘겨주기) ([^\n]+)/;
+    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(
+            window.location.search === '' &&
+            window.location.pathname.match(/^\/w\//)
+        ) {
+            window.location.href = '/w/' + do_url_change(link_main) + '?from=' + do_url_change(name_doc) + link_sub;
+        }
+        
+        return [
+            data.replace(redirect_re, '/w/' + do_url_change(link_main) + '?from=' + do_url_change(name_doc) + link_sub), 
+            data_js, 
+            1
+        ];
+    } else {
+        return [data, data_js, 0];
+    }
+}
+
 // Main
 // Main
 function do_onmark_render(test_mode = 'test', name_id = '', name_include = '', name_doc = '', doc_data = '') {    
 function do_onmark_render(test_mode = 'test', name_id = '', name_include = '', name_doc = '', doc_data = '') {    
 	if(test_mode === 'normal') {
 	if(test_mode === 'normal') {
@@ -980,44 +1006,51 @@ asdf || asdf`
     var data_backlink = [];
     var data_backlink = [];
     var data_nowiki = {};
     var data_nowiki = {};
     
     
-    var data_var = do_onmark_math_render(data, data_js, name_include);
-    data = data_var[0];
-    data_js = data_var[1];
-    console.log('math')
-    
-    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')
-    
-    data_var = do_onmark_include_render(data, data_js, name_include, data_nowiki);
+    var data_var = do_onmark_redirect_render(data, data_js, name_doc);
     data = data_var[0];
     data = data_var[0];
     data_js = data_var[1];
     data_js = data_var[1];
-    console.log('include')
+    var passing = data_var[2];
     
     
-    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')
-    
-    data = do_onmark_text_render(data);
-    data = do_onmark_heading_render(data, name_doc, name_include);
-    data = do_onmark_table_render(data);
-    console.log('table')
-    
-    data_var = do_onmark_link_render(data, data_js, name_doc, name_include, data_nowiki);
-    data = data_var[0];
-    data_js = data_var[1];
-    
-    data = do_onmark_macro_render(data);
-    data = do_onmark_quote_render(data);
-    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);
-    console.log('all')
+    if(passing === 0) {
+        var data_var = do_onmark_math_render(data, data_js, name_include);
+        data = data_var[0];
+        data_js = data_var[1];
+        console.log('math')
+
+        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')
+
+        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')
+
+        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')
+
+        data = do_onmark_text_render(data);
+        data = do_onmark_heading_render(data, name_doc, name_include);
+        data = do_onmark_table_render(data);
+        console.log('table')
+
+        data_var = do_onmark_link_render(data, data_js, name_doc, name_include, data_nowiki);
+        data = data_var[0];
+        data_js = data_var[1];
+
+        data = do_onmark_macro_render(data);
+        data = do_onmark_quote_render(data);
+        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);
+        console.log('all')
+    }
     
     
     data_js += '' + 
     data_js += '' + 
         'get_link_state("' + name_include + '");\n' + 
         'get_link_state("' + name_include + '");\n' + 

+ 15 - 1
views/tenshi/css/dark.css

@@ -3,6 +3,10 @@ html, #main {
     color: white;
     color: white;
 }
 }
 
 
+#top {
+    background: black;
+}
+
 .cel_in_cel, #background, div#pre_search, #toc, #cate, #redirect {
 .cel_in_cel, #background, div#pre_search, #toc, #cate, #redirect {
     background: #1f2023;
     background: #1f2023;
     border-color: #1f2023;
     border-color: #1f2023;
@@ -26,8 +30,18 @@ a#titlt_a {
     color: white;
     color: white;
 }
 }
 
 
-textarea, input, button, select, #toc, #cate, #redirect { 
+#search_input, textarea, input, button, select, #toc, #cate, #redirect { 
     border-color: #1f2023; 
     border-color: #1f2023; 
+    background: #1f2023;
+    color: white;
+}
+
+#search_input:hover, #search_input:focus {
+    color: white;
+}
+
+#search_input::placeholder {
+    color: white;
 }
 }
 
 
 button#save {
 button#save {

+ 101 - 35
views/tenshi/css/main.css

@@ -1,3 +1,7 @@
+body, textarea, input, pre, code {
+    font-family: 'Apple SD Gothic', '맑은고딕', 'Nanum Gothic', 'Noto Sans KR', sans-serif;
+}
+
 body {
 body {
     max-width: 100%;
     max-width: 100%;
     
     
@@ -6,7 +10,6 @@ body {
     
     
     margin: 0;
     margin: 0;
     
     
-    font-family: 'Apple SD Gothic', '맑은고딕', 'Nanum Gothic', 'Noto Sans KR', sans-serif;
     font-size: 0.85rem;
     font-size: 0.85rem;
 }
 }
 
 
@@ -14,24 +17,6 @@ select {
     padding: 5px;
     padding: 5px;
 }
 }
 
 
-hr {
-    border: 0;
-    border-top: 1px solid gainsboro;
-}
-
-button {
-    padding: 10px;
-    
-    border: 1px solid #aaa;
-    background: white;
-    
-    cursor: pointer;
-}
-
-td {
-    border: 1px solid gainsboro;
-}
-
 html {
 html {
     background: #eeeeee;
     background: #eeeeee;
 }
 }
@@ -248,6 +233,7 @@ h1, h2, h3, h4, h5, h6 {
     background-color: white;
     background-color: white;
     border: solid 2px #2780e3;
     border: solid 2px #2780e3;
     color: black;
     color: black;
+    box-shadow: none;
     
     
     transition: .2s ease-in-out;
     transition: .2s ease-in-out;
 }
 }
@@ -262,10 +248,6 @@ h1, h2, h3, h4, h5, h6 {
     transition: .2s ease-in-out;
     transition: .2s ease-in-out;
 }
 }
 
 
-#search_input:hover::placeholder, #search_input:focus::placeholder {
-    color: black;
-}
-
 #pre_search {
 #pre_search {
     padding: 10px;
     padding: 10px;
     border: 1px solid #4a4a4a;
     border: 1px solid #4a4a4a;
@@ -282,8 +264,12 @@ h1, h2, h3, h4, h5, h6 {
 
 
 #search button {
 #search button {
     padding: 0;
     padding: 0;
+    
     border: none;
     border: none;
+    
     background: transparent;
     background: transparent;
+    box-shadow: none;
+    
     color: white;
     color: white;
 }
 }
 
 
@@ -296,26 +282,110 @@ a {
     max-width: 300px;
     max-width: 300px;
 }
 }
 
 
-#syntax {
-    background: #f0f0f0;
+/*
+pre, #toc, #cate, #redirect {
+    border: 1px solid #aaa;
+}
+*/
+
+#redirect, #cate, #toc, blockquote, button#save, button#preview {
+    border: 0;
+    
+    padding: 10px;
+    
+    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+}
+
+button#save {
+    background: #92f7f4;
+}
+
+button#preview {
+    margin-left: 5px;
+}
+
+blockquote {
+    background: #ffefff;
+    padding: 20px;
+    border-left: 4px solid #ffb3ff;
+    margin-bottom: 20px;
+}
+
+#cate {
+    background: #ccf5bc;
+}
+
+#redirect {
+    background: #d9edf7;
+}
+
+#toc {
+    background: lightyellow;
+    padding: 20px;
+}
+
+textarea, input, pre {    
+    border: 0;
+    
     padding: 5px;
     padding: 5px;
+    
+    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
 }
 }
 
 
-pre, #toc, #cate, #redirect {
-    border: 1px solid #aaa;
+pre {
+    padding: 10px;
 }
 }
 
 
-textarea, input {
-    font-family: 'Apple SD Gothic', '맑은고딕', 'Nanum Gothic', 'Noto Sans KR', sans-serif;
-    border: 1px solid #aaa;
+#syntax {
+    background: #f0f0f0;
     padding: 5px;
     padding: 5px;
-    margin-left: -5px;
 }
 }
 
 
 #syntax code {
 #syntax code {
     background: transparent;
     background: transparent;
 }
 }
 
 
+table {
+    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+}
+
+td {
+    border: 1px solid gainsboro;
+}
+
+hr {
+    border: 0;
+    border-top: 1px solid gainsboro;
+}
+
+button {
+    border: 0;
+    
+    padding: 10px;
+    
+    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+    background: papayawhip;
+    
+    cursor: pointer;
+}
+
+input[type="checkbox"] {
+    box-shadow: None;
+    background: transparent;
+}
+
+select {
+    padding: 0;
+    padding-left: 5px;
+    padding-right: 5px;
+    
+    background: white;
+    border: 0;
+    box-shadow: 0 2px 4px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12);
+    
+    min-height: 30px;
+}
+
 /* nav_bar */
 /* nav_bar */
 #nav_bar {
 #nav_bar {
     z-index: 100;
     z-index: 100;
@@ -410,8 +480,4 @@ div#last_edit {
 
 
 #titlt_a {
 #titlt_a {
     color: initial;
     color: initial;
-}
-
-button#save {
-    background: #c6ffc6;
 }
 }

+ 2 - 2
views/tenshi/index.html

@@ -8,8 +8,8 @@
             <title>{{imp[0]}} - {{imp[1][0]}}</title>
             <title>{{imp[0]}} - {{imp[1][0]}}</title>
         {% endif %}
         {% endif %}
         {{imp[3][3]|safe}}
         {{imp[3][3]|safe}}
-        <link rel="stylesheet" href="/views/tenshi/css/main.css?ver=17">
-        <script src="/views/tenshi/js/skin_set.js?ver=6"></script>
+        <link rel="stylesheet" href="/views/tenshi/css/main.css?ver=18">
+        <script src="/views/tenshi/js/skin_set.js?ver=7"></script>
         <script src="/views/tenshi/js/main.js?ver=3"></script>
         <script src="/views/tenshi/js/main.js?ver=3"></script>
         <script>main_load(); window.addEventListener('DOMContentLoaded', skin_set);</script>
         <script>main_load(); window.addEventListener('DOMContentLoaded', skin_set);</script>
         <script src="https://code.iconify.design/1/1.0.3/iconify.min.js"></script>
         <script src="https://code.iconify.design/1/1.0.3/iconify.min.js"></script>

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

@@ -16,8 +16,8 @@ function main_load() {
         cookies.match(regex_data('main_css_darkmode'))[1] === '1'
         cookies.match(regex_data('main_css_darkmode'))[1] === '1'
     ) {
     ) {
         head_data.innerHTML += '' +
         head_data.innerHTML += '' +
-            '<link rel="stylesheet" href="/views/main_css/css/sub/dark.css?ver=2">' +
-            '<link rel="stylesheet" href="/views/tenshi/css/dark.css?ver=6">' +
+            '<link rel="stylesheet" href="/views/main_css/css/sub/dark.css?ver=3">' +
+            '<link rel="stylesheet" href="/views/tenshi/css/dark.css?ver=7">' +
         '';
         '';
     }
     }
 }
 }