Quellcode durchsuchen

Merge pull request #472 from 2DU/master

Master
Surplus_Up (2DU) vor 8 Jahren
Ursprung
Commit
7d8d1e9459
12 geänderte Dateien mit 183 neuen und 153 gelöschten Zeilen
  1. 4 27
      ISSUE_TEMPLATE.md
  2. 21 0
      Readme-Ko.md
  3. BIN
      Test2.db
  4. 1 1
      Version-Ko.md
  5. 89 75
      app.py
  6. 4 1
      func.py
  7. 4 2
      language/en-US.json
  8. 5 3
      language/ko-KR.json
  9. 14 0
      license.md
  10. 2 2
      mark.py
  11. 13 16
      readme.md
  12. 26 26
      set_mark/start.py

+ 4 - 27
ISSUE_TEMPLATE.md

@@ -1,30 +1,7 @@
-## 설명
-<!-- 해당 이슈에 대한 자세한 설명을 작성해주세요.
+## Explanation (설명)
 
-예시: 로그아웃 직후 로그인 시 로그인이 되지 않습니다. -->
+## Desired results (원하는 결과)
 
-## 과정
-<!-- 해당 이슈를 발생한 당시의 행동을 최대한 자세하게 나열해주세요.
+## Current Results (현재 결과)
 
-예시:
-1. 로그인 버튼을 눌러 로그인을 합니다.
-2. 로그아웃 버튼을 눌러 로그아웃을 합니다.
-3. 다시 로그인 버튼을 눌러 로그인을 합니다. -->
-
-## 정상 동작 시의 결과
-<!-- 이 과정을 통해 얻어야할 결과가 무엇인가요? 
-
-예시: 로그인이 되어야 합니다. -->
-
-## 현재 결과
-<!-- 이 과정을 통해 얻은 결과를 설명해주세요.
-
-예시: 로그인이 되지 않습니다. -->
-
-## 스크린샷
-<!-- 오류가 발생한 스크린샷을 최소 한장 이상 첨부해주세요. -->
-
-## 수정 되어야 할 부분
-<!-- 만약 수정되어야 할 부분이나 해결 방법을 아신다면 기재해주세요.
-
-예시: 만약 로그아웃 페이지에서 로그인을 할 경우 대문 페이지로 이동시켜면 될 것 같습니다. -->
+## Screenshot (스크린샷)

+ 21 - 0
Readme-Ko.md

@@ -0,0 +1,21 @@
+## 개요
+나무마크 기반의 파이썬 위키 엔진. (3.5 이상)
+
+## 클론 명령어
+### 일반
+ * git clone https://github.com/2DU/openNAMU.git
+
+### 베타
+ * git clone -b master https://github.com/2DU/openNAMU.git
+
+## 설치법
+ * [참조](http://namu.ml/w/오픈나무%2F설치법)
+ 
+## set.json 설명
+ * db = 데이터베이스 이름
+
+set.json를 삭제하면 다시 새로 만들 수 있습니다.
+
+## 기타
+ * [테스트 서버](http://namu.ml/)
+ * 첫 번째 가입자에게 소유자 권한이 부여됩니다.

BIN
Test2.db


+ 1 - 1
version.md → Version-Ko.md

@@ -173,7 +173,7 @@
 
 ----
 ## 기타
- * 현재 버전 : v3.0.3
+ * 현재 버전 : v3.0.4
 
 ----
 ## 개발 이념

+ 89 - 75
app.py

@@ -19,7 +19,7 @@ import sys
 from func import *
 
 # 버전 표기
-r_ver = 'v3.0.4-Final-Beta-' + re.sub('^[0-9]{2}', '', str(int(datetime.datetime.fromtimestamp(os.path.getmtime('app.py')).strftime('%Y%m%d'))))
+r_ver = 'v3.0.4-Stable-' + re.sub('^[0-9]{2}', '', str(int(datetime.datetime.fromtimestamp(os.path.getmtime('app.py')).strftime('%Y%m%d'))))
 print('Version : ' + r_ver)
 
 # set.json 설정 확인
@@ -309,7 +309,7 @@ def alarm():
     data += '</ul>'
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('alarm'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('alarm'), wiki_set(), custom(), other2([0, 0])],
         data = data,
         menu = [['user', load_lang('user')]]
     ))
@@ -358,7 +358,7 @@ def inter_wiki(tools = None):
             div += '<a href="/' + plus_link + '">(' + load_lang('plus') + ')</a>'
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [title, wiki_set(1), custom(), other2([0, 0])],
+        imp = [title, wiki_set(), custom(), other2([0, 0])],
         data = div,
         menu = [['other', load_lang('other')]]
     ))
@@ -399,7 +399,7 @@ def plus_inter(tools = None):
             form_data = '<input placeholder="HTML" type="text" name="title">'
 
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [title, wiki_set(1), custom(), other2([0, 0])],
+            imp = [title, wiki_set(), custom(), other2([0, 0])],
             data = '<form method="post">' + form_data + '<hr><button type="submit">' + load_lang('plus') + '</button></form>',
             menu = [['other', load_lang('other')]]
         ))
@@ -422,7 +422,7 @@ def edit_set(num = 0):
             li_data += '<li><a href="/edit_set/' + str(x) + '">' + li + '</a></li>'
 
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [load_lang('setting'), wiki_set(1), custom(), other2([0, 0])],
+            imp = [load_lang('setting'), wiki_set(), custom(), other2([0, 0])],
             data = '<h2>' + load_lang('list') + '</h2><ul>' + li_data + '</ul>',
             menu = [['manager', load_lang('admin')]]
         ))
@@ -492,7 +492,7 @@ def edit_set(num = 0):
                     div2 += '<option value="' + skin_data + '">' + skin_data + '</option>'
 
             return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-                imp = ['Normal', wiki_set(1), custom(), other2([0, 0])],
+                imp = ['Normal', wiki_set(), custom(), other2([0, 0])],
                 data = '''
                         <form method="post">
                             <span>''' + load_lang('name') + '''</span>
@@ -585,7 +585,7 @@ def edit_set(num = 0):
             conn.commit()
 
             return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-                imp = ['Set Text', wiki_set(1), custom(), other2([0, 0])],
+                imp = ['Set Text', wiki_set(), custom(), other2([0, 0])],
                 data = '''
                         <form method="post">
                             <span>Register Text</span>
@@ -625,7 +625,7 @@ def edit_set(num = 0):
                 data = ''
 
             return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-                imp = ['Main HEAD', wiki_set(1), custom(), other2([0, 0])],
+                imp = ['Main HEAD', wiki_set(), custom(), other2([0, 0])],
                 data = '''
                         <form method="post">
                             <textarea rows="25" name="content">''' + html.escape(data) + '''</textarea>
@@ -668,7 +668,7 @@ def edit_set(num = 0):
                 data = ''.join(lines)
 
             return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-                imp = ['robots.txt', wiki_set(1), custom(), other2([0, 0])],
+                imp = ['robots.txt', wiki_set(), custom(), other2([0, 0])],
                 data = '''
                         <a href="/robots.txt">(View)</a>
                         <hr>
@@ -711,7 +711,7 @@ def edit_set(num = 0):
             conn.commit()
 
             return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-                imp = ['Google', wiki_set(1), custom(), other2([0, 0])],
+                imp = ['Google', wiki_set(), custom(), other2([0, 0])],
                 data = '''
                         <form method="post">
                             <span>reCAPTCHA (HTML)</span>
@@ -746,7 +746,7 @@ def not_close_topic():
     div += '</ul>'
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('open') + ' ' + load_lang('discussion') + ' ' + load_lang('list'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('open') + ' ' + load_lang('discussion') + ' ' + load_lang('list'), wiki_set(), custom(), other2([0, 0])],
         data = div,
         menu = [['manager', load_lang('admin')]]
     ))
@@ -776,7 +776,7 @@ def acl_list():
     div += '</ul>'
     
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = ['ACL ' + load_lang('document') + ' ' + load_lang('list'), wiki_set(1), custom(), other2([0, 0])],
+        imp = ['ACL ' + load_lang('document') + ' ' + load_lang('list'), wiki_set(), custom(), other2([0, 0])],
         data = div,
         menu = [['other', load_lang('other')]]
     ))
@@ -856,7 +856,7 @@ def admin_plus(name = None):
         data += '<li><input type="checkbox" ' + state +  ' name="owner" ' + exist_list[7] + '> ' + load_lang('owner') + '</li></ul>'
 
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [load_lang('admin_group') + ' ' + load_lang('plus'), wiki_set(1), custom(), other2([0, 0])],
+            imp = [load_lang('admin_group') + ' ' + load_lang('plus'), wiki_set(), custom(), other2([0, 0])],
             data = '<form method="post">' + data + '<hr><button id="save" ' + state +  ' type="submit">' + load_lang('save') + '</button></form>',
             menu = [['manager', load_lang('admin')]]
         ))        
@@ -877,7 +877,7 @@ def admin_list():
     div += '</ul>'
                 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('admin') + ' ' + load_lang('list'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('admin') + ' ' + load_lang('list'), wiki_set(), custom(), other2([0, 0])],
         data = div,
         menu = [['other', load_lang('other')]]
     ))
@@ -941,7 +941,7 @@ def user_log():
     list_data += next_fix('/user_log?num=', num, user_list)
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('recent') + ' ' + load_lang('register'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('recent') + ' ' + load_lang('register'), wiki_set(), custom(), other2([0, 0])],
         data = list_data,
         menu = 0
     ))
@@ -965,7 +965,7 @@ def admin_log():
     list_data += next_fix('/admin_log?num=', num, get_list)
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('recent') + ' ' + load_lang('authority'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('recent') + ' ' + load_lang('authority'), wiki_set(), custom(), other2([0, 0])],
         data = list_data,
         menu = 0
     ))
@@ -985,7 +985,7 @@ def give_log():
     list_data += '</ul><hr><a href="/manager/8">(' + load_lang('create') + ')</a>'
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('admin_group') + ' ' + load_lang('list'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('admin_group') + ' ' + load_lang('list'), wiki_set(), custom(), other2([0, 0])],
         data = list_data,
         menu = [['other', load_lang('other')]]
     ))
@@ -1067,7 +1067,7 @@ def update():
                 return redirect('/re_start')
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('update'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('update'), wiki_set(), custom(), other2([0, 0])],
         data = 'Auto Update Is Not Support. <a href="https://github.com/2DU/openNAMU">(GitHub)</a>',
         menu = [['manager/1', load_lang('admin')]]
     ))
@@ -1092,13 +1092,13 @@ def xref(name = None):
         
         div += '</li>'
         
-        if re.search('^:', data[0]):
+        if re.search('^' + load_lang('template') + ':', data[0]):
             div += '<li><a id="inside" href="/xref/' + url_pas(data[0]) + '">' + data[0] + '</a> (' + load_lang('backlink') + ')</li>'
       
     div += '</ul>' + next_fix('/xref/' + url_pas(name) + '?num=', num, data_list)
     
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [name, wiki_set(1), custom(), other2([' (' + load_lang('backlink') + ')', 0])],
+        imp = [name, wiki_set(), custom(), other2([' (' + load_lang('backlink') + ')', 0])],
         data = div,
         menu = [['w/' + url_pas(name), load_lang('document')]]
     ))
@@ -1125,7 +1125,7 @@ def please():
     div += '</ul>' + next_fix('/please?num=', num, data_list)
     
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('need') + ' ' + load_lang('document'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('need') + ' ' + load_lang('document'), wiki_set(), custom(), other2([0, 0])],
         data = div,
         menu = [['other', load_lang('other')]]
     ))
@@ -1171,7 +1171,7 @@ def recent_discuss(tools = 'normal'):
         div += '</tbody></table>'
             
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('recent') + ' ' + load_lang('discussion'), wiki_set(1), custom(), other2([m_sub, 0])],
+        imp = [load_lang('recent') + ' ' + load_lang('discussion'), wiki_set(), custom(), other2([m_sub, 0])],
         data = div,
         menu = 0
     ))
@@ -1186,16 +1186,16 @@ def block_log(name = None, tool = None, tool2 = None):
     else:
         sql_num = 0
     
-    div = '<table style="width: 100%; text-align: center;"><tbody><tr><td style="width: 33.3%;">' + load_lang('blocked') + '</td><td style="width: 33.3%;">' + load_lang('admin') + '</td><td style="width: 33.3%;">' + load_lang('period ') + '</td></tr>'
+    div = '<table style="width: 100%; text-align: center;"><tbody><tr><td style="width: 33.3%;">' + load_lang('blocked') + '</td><td style="width: 33.3%;">' + load_lang('admin') + '</td><td style="width: 33.3%;">' + load_lang('period') + '</td></tr>'
     
     data_list = ''
     
     if not name:
         if not tool2:
             div = '''
-                    <a href="/manager/11">(' + load_lang('blocked') + ')</a> <a href="/manager/12">(''' + load_lang('admin') + ''')</a>
+                    <a href="/manager/11">(''' + load_lang('blocked') + ''')</a> <a href="/manager/12">(''' + load_lang('admin') + ''')</a>
                     <hr>
-                    <a href="/block_log/ip">(IP)</a> <a href="/block_log/user">(''' + load_lang('subscriber') + ')</a> <a href="/block_log/never_end">(' + load_lang('limitless') + ')</a> <a href="/block_log/can_end">(' + load_lang('period ') + ')</a> <a href="/block_log/end">(' + load_lang('release') + ')</a> <a href="/block_log/now">(' + load_lang('now') + ')</a> <a href="/block_log/edit_filter">(' + load_lang('edit_filter') + ''')</a>
+                    <a href="/block_log/ip">(IP)</a> <a href="/block_log/user">(''' + load_lang('subscriber') + ')</a> <a href="/block_log/never_end">(' + load_lang('limitless') + ')</a> <a href="/block_log/can_end">(' + load_lang('period') + ')</a> <a href="/block_log/end">(' + load_lang('release') + ')</a> <a href="/block_log/now">(' + load_lang('now') + ')</a> <a href="/block_log/edit_filter">(' + load_lang('edit_filter') + ''')</a>
                     <hr>
                     ''' + div
             
@@ -1237,7 +1237,7 @@ def block_log(name = None, tool = None, tool2 = None):
 
                 curs.execute("select why, block, blocker, end, today from rb where blocker = ? order by today desc limit ?, '50'", [load_lang('tool') + ':' + load_lang('edit_filter'), str(sql_num)])
             else:
-                sub = '(' + load_lang('period ') + ')'
+                sub = '(' + load_lang('period') + ')'
                 
                 curs.execute("select why, block, blocker, end, today from rb where end like ? order by today desc limit ?, '50'", ['%\-%', str(sql_num)])
     else:
@@ -1285,7 +1285,7 @@ def block_log(name = None, tool = None, tool2 = None):
         div += next_fix('/' + url_pas(tool) + '/' + url_pas(name) + '?num=', num, data_list)
                 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('recent') + ' ' + load_lang('ban'), wiki_set(1), custom(), other2([sub, 0])],
+        imp = [load_lang('recent') + ' ' + load_lang('ban'), wiki_set(), custom(), other2([sub, 0])],
         data = div,
         menu = menu
     ))
@@ -1343,7 +1343,7 @@ def deep_search(name = None):
     div += next_fix('/search/' + url_pas(name) + '?num=', num, all_list)
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [name, wiki_set(1), custom(), other2([' (' + load_lang('search') + ')', 0])],
+        imp = [name, wiki_set(), custom(), other2([' (' + load_lang('search') + ')', 0])],
         data = div,
         menu = 0
     ))
@@ -1387,7 +1387,7 @@ def raw_view(name = None, sub_title = None, num = None):
         p_data = '<textarea readonly rows="25">' + p_data + '</textarea>'
         
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [v_name, wiki_set(1), custom(), other2([sub, 0])],
+            imp = [v_name, wiki_set(), custom(), other2([sub, 0])],
             data = p_data,
             menu = menu
         ))
@@ -1427,7 +1427,11 @@ def revert(name = None):
                 curs.execute("insert into data (title, data) values (?, ?)", [name, data[0][0]])
                 
             history_plus(name, data[0][0], get_time(), ip_check(), flask.request.form.get('send', None) + ' (' + str(num) + load_lang('version') + ')', leng)
-            namumark(name, data[0][0], 1)
+            namumark_re(
+                name = name,
+                data = data[0][0],
+                set_num = 1
+            )
             
             conn.commit()
             
@@ -1438,7 +1442,7 @@ def revert(name = None):
             return redirect('/w/' + url_pas(name))
 
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [name, wiki_set(1), custom(), other2([' (' + load_lang('revert') + ')', 0])],
+            imp = [name, wiki_set(), custom(), other2([' (' + load_lang('revert') + ')', 0])],
             data =  '''
                     <form method="post">
                         <span>''' + flask.request.args.get('num', '0') + load_lang('version') + '''</span>
@@ -1482,7 +1486,7 @@ def big_delete():
         return redirect('/')
     else:
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [load_lang('bulk_delete'), wiki_set(1), custom(), other2([0, 0])],
+            imp = [load_lang('bulk_delete'), wiki_set(), custom(), other2([0, 0])],
             data = '''
                     <span>
                         Title A
@@ -1520,7 +1524,7 @@ def edit_filter():
         div = '<a href="/manager/9">(' + load_lang('plus') + ')</a>'
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('edit_filter') + ' ' + load_lang('list'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('edit_filter') + ' ' + load_lang('list'), wiki_set(), custom(), other2([0, 0])],
         data = div,
         menu = [['manager', load_lang('admin')]]
     ))
@@ -1575,7 +1579,7 @@ def set_edit_filter(name = None):
             stat = ''
 
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [name, wiki_set(1), custom(), other2([' (' + load_lang('edit_filter') + ')', 0])],
+            imp = [name, wiki_set(), custom(), other2([' (' + load_lang('edit_filter') + ')', 0])],
             data = '''
                     <form method="post">
                         <input ''' + stat + ''' type="checkbox" ''' + time_data + ''' name="ban">
@@ -1681,7 +1685,11 @@ def edit(name = None):
         curs.execute("delete from back where link = ?", [name])
         curs.execute("delete from back where title = ? and type = 'no'", [name])
         
-        namumark(name, content, 1)
+        namumark_re(
+            name = name,
+            data = content,
+            set_num = 1
+        )
         
         conn.commit()
         
@@ -1725,7 +1733,7 @@ def edit(name = None):
         js_data = edit_help_button()
 
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [name, wiki_set(1), custom(), other2([' (' + load_lang('edit') + ')', 0])],
+            imp = [name, wiki_set(), custom(), other2([' (' + load_lang('edit') + ')', 0])],
             data = get_name + js_data[0] + '''
                     <form method="post" action="/edit/''' + url_pas(name) + action + '''">
                         ''' + js_data[1] + '''
@@ -1756,7 +1764,10 @@ def preview(name = None):
     new_data = re.sub('^\r\n', '', new_data)
     new_data = re.sub('\r\n$', '', new_data)
     
-    end_data = namumark(name, new_data, 0)
+    end_data = namumark_re(
+        name = name,
+        data = new_data
+    )
     
     if flask.request.args.get('section', None):
         action = '?section=' + flask.request.args.get('section', None)
@@ -1766,7 +1777,7 @@ def preview(name = None):
     js_data = edit_help_button()
     
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [name, wiki_set(1), custom(), other2([' (' + load_lang('preview') + ')', 0])],
+        imp = [name, wiki_set(), custom(), other2([' (' + load_lang('preview') + ')', 0])],
         data = js_data[0] + '''
                 <form method="post" action="/edit/''' + url_pas(name) + action + '''">
                     ''' + js_data[1] + '''
@@ -1819,7 +1830,7 @@ def delete(name = None):
             return redirect('/w/' + url_pas(name))
 
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [name, wiki_set(1), custom(), other2([' (' + load_lang('delete') + ')', 0])],
+            imp = [name, wiki_set(), custom(), other2([' (' + load_lang('delete') + ')', 0])],
             data = '''
                     <form method="post">
                         ''' + ip_warring() + '''
@@ -1850,7 +1861,7 @@ def move_data(name = None):
     data += '</ul>'
     
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [name, wiki_set(1), custom(), other2([' (' + load_lang('move') + ' ' + load_lang('history') + ')', 0])],
+        imp = [name, wiki_set(), custom(), other2([' (' + load_lang('move') + ' ' + load_lang('history') + ')', 0])],
         data = data,
         menu = [['history/' + url_pas(name), load_lang('history')]]
     ))        
@@ -1892,7 +1903,7 @@ def move(name = None):
         return redirect('/w/' + url_pas(flask.request.form.get('title', None)))
     else:            
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [name, wiki_set(1), custom(), other2([' (' + load_lang('move') + ')', 0])],
+            imp = [name, wiki_set(), custom(), other2([' (' + load_lang('move') + ')', 0])],
             data = '''
                     <form method="post">
                         ''' + ip_warring() + '''
@@ -1910,7 +1921,7 @@ def move(name = None):
 @app.route('/other')
 def other():
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('other') + ' ' + load_lang('tool'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('other') + ' ' + load_lang('tool'), wiki_set(), custom(), other2([0, 0])],
         data = '''
                 <h2>''' + load_lang('record') + '''</h2>
                 <ul>
@@ -1953,7 +1964,7 @@ def manager(num = 1):
     
     if num == 1:
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [load_lang('admin') + ' ' + load_lang('tool'), wiki_set(1), custom(), other2([0, 0])],
+            imp = [load_lang('admin') + ' ' + load_lang('tool'), wiki_set(), custom(), other2([0, 0])],
             data = '''
                     <h2>''' + load_lang('admin') + '''</h2>
                     <ul>
@@ -1987,7 +1998,7 @@ def manager(num = 1):
                 placeholder = title_list[(num - 2)][0]
 
             return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-                imp = ['Redirect', wiki_set(1), custom(), other2([0, 0])],
+                imp = ['Redirect', wiki_set(), custom(), other2([0, 0])],
                 data = '<form method="post"><input placeholder="' + placeholder + '" name="name" type="text"><hr><button type="submit">' + load_lang('move') + '</button></form>',
                 menu = [['manager', load_lang('admin')]]
             ))
@@ -2029,7 +2040,7 @@ def title_index():
         else:
             count_end += [0]
 
-        sql_list = ['틀:', load_lang('category') + ':', load_lang('user') + ':', load_lang('file') + ':']
+        sql_list = [load_lang('template') + ':', load_lang('category') + ':', load_lang('user') + ':', load_lang('file') + ':']
         for sql in sql_list:
             curs.execute("select count(title) from data where title like ?", [sql + '%'])
             count = curs.fetchall()
@@ -2041,17 +2052,17 @@ def title_index():
         count_end += [count_end[0] - count_end[1]  - count_end[2]  - count_end[3]  - count_end[4]]
         
         data += '</ul><hr><ul><li>All : ' + str(count_end[0]) + '</li></ul><hr><ul>'
-        data += '<li>Template : ' + str(count_end[1]) + '</li>'
-        data += '<li>Category : ' + str(count_end[2]) + '</li>'
-        data += '<li>User : ' + str(count_end[3]) + '</li>'
-        data += '<li>File : ' + str(count_end[4]) + '</li>'
+        data += '<li>' + load_lang('template') + ' : ' + str(count_end[1]) + '</li>'
+        data += '<li>' + load_lang('category') + ' : ' + str(count_end[2]) + '</li>'
+        data += '<li>' + load_lang('user') + ' : ' + str(count_end[3]) + '</li>'
+        data += '<li>' + load_lang('file') + ' : ' + str(count_end[4]) + '</li>'
         data += '<li>Other : ' + str(count_end[5]) + '</li>'
 
     data += '</ul>' + next_fix('/title_index?num=' + str(num) + '&page=', page, title_list, num)
     sub = ' (' + str(num) + ')'
     
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('all') + ' ' + load_lang('document'), wiki_set(1), custom(), other2([sub, 0])],
+        imp = [load_lang('all') + ' ' + load_lang('document'), wiki_set(), custom(), other2([sub, 0])],
         data = data,
         menu = [['other', load_lang('other')]]
     ))
@@ -2190,7 +2201,7 @@ def topic_admin(name = None, sub = None, num = None):
     ban = '<h2>' + load_lang('state') + '</h2><ul>' + ban
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('discussion') + ' ' + load_lang('tool'), wiki_set(1), custom(), other2([' (' + str(num) + ')', 0])],
+        imp = [load_lang('discussion') + ' ' + load_lang('tool'), wiki_set(), custom(), other2([' (' + str(num) + ')', 0])],
         data = ban,
         menu = [['topic/' + url_pas(name) + '/sub/' + url_pas(sub) + '#' + str(num), load_lang('discussion')]]
     ))
@@ -2291,7 +2302,7 @@ def topic(name = None, sub = None):
                                 
             all_data += '<table id="toron"><tbody><tr><td id="toron_color_red">'
             all_data += '<a href="#' + topic_data[1] + '">#' + topic_data[1] + '</a> ' + ip_pas(topic_data[3]) + who_plus + ' <span style="float: right;">' + topic_data[2] + '</span>'
-            all_data += '</td></tr><tr><td>' + namumark('', topic_data[0], 0) + '</td></tr></tbody></table><br>'    
+            all_data += '</td></tr><tr><td>' + namumark_re(data = topic_data[0]) + '</td></tr></tbody></table><br>'    
 
         for topic_data in topic:
             if number == 1:
@@ -2310,7 +2321,7 @@ def topic(name = None, sub = None):
             else:
                 blind_data = ''
 
-            user_write = namumark('', topic_data[0], 0)
+            user_write = namumark_re(data = topic_data[0])
             ip = ip_pas(topic_data[3])
             
             curs.execute('select acl from user where id = ?', [topic_data[3]])
@@ -2356,7 +2367,7 @@ def topic(name = None, sub = None):
             data += '<button type="submit">Send</button></form>'
 
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [name, wiki_set(1), custom(), other2([' (' + load_lang('discussion') + ')', 0])],
+            imp = [name, wiki_set(), custom(), other2([' (' + load_lang('discussion') + ')', 0])],
             data = '<h2 id="topic_top_title">' + sub + '</h2>' + all_data + data,
             menu = [['topic/' + url_pas(name), load_lang('list')]]
         ))
@@ -2419,7 +2430,7 @@ def close_topic_list(name = None, tool = None):
             plus = re.sub('^<br>', '', plus)
         
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [name, wiki_set(1), custom(), other2([' (' + sub + ')', 0])],
+            imp = [name, wiki_set(), custom(), other2([' (' + sub + ')', 0])],
             data =  '<form method="post">' + div + plus + '</form>',
             menu = menu
         ))
@@ -2481,7 +2492,7 @@ def login():
         return redirect('/user')  
     else:        
         return css_html_js_minify.html_minify(flask.render_template(skin_check(),    
-            imp = [load_lang('login'), wiki_set(1), custom(), other2([0, 0])],
+            imp = [load_lang('login'), wiki_set(), custom(), other2([0, 0])],
             data = '''
                     <form method="post">
                         <input placeholder="ID" name="id" type="text">
@@ -2555,7 +2566,7 @@ def change_password():
                 div2 += '<option value="' + skin_data + '">' + skin_data + '</option>'
 
         return css_html_js_minify.html_minify(flask.render_template(skin_check(),    
-            imp = [load_lang('my_info') + ' ' + load_lang('edit'), wiki_set(1), custom(), other2([0, 0])],
+            imp = [load_lang('my_info') + ' ' + load_lang('edit'), wiki_set(), custom(), other2([0, 0])],
             data = '''
                     <form method="post">
                         <span>ID : ''' + ip + '''</span>
@@ -2634,7 +2645,7 @@ def user_check(name = None):
         return re_error('/error/2')
             
     return css_html_js_minify.html_minify(flask.render_template(skin_check(),    
-        imp = [load_lang('check'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('check'), wiki_set(), custom(), other2([0, 0])],
         data = div,
         menu = [['manager', load_lang('admin')]]
     ))
@@ -2645,7 +2656,7 @@ def plus_check(name):
         return redirect('/check/' + url_pas(name) + '?plus=' + url_pas(flask.request.form.get('name2', None)))
     else:
         return css_html_js_minify.html_minify(flask.render_template(skin_check(),
-            imp = [load_lang('plus'), wiki_set(1), custom(), other2([0, 0])],
+            imp = [load_lang('plus'), wiki_set(), custom(), other2([0, 0])],
             data = '''
                     <form method="post">
                         <input placeholder="' + load_lang('compare') + '" name="name2" type="text">
@@ -2706,7 +2717,7 @@ def register():
             contract = data[0][0] + '<hr>'
 
         return css_html_js_minify.html_minify(flask.render_template(skin_check(),    
-            imp = [load_lang('register'), wiki_set(1), custom(), other2([0, 0])],
+            imp = [load_lang('register'), wiki_set(), custom(), other2([0, 0])],
             data = '''
                     <form method="post">
                         ''' + contract + '''
@@ -2829,7 +2840,7 @@ def user_ban(name = None):
             data += '<input placeholder="' + load_lang('why') + '" name="why" type="text"><hr>' + plus
 
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [name, wiki_set(1), custom(), other2([' (' + now + ')', 0])],
+            imp = [name, wiki_set(), custom(), other2([' (' + now + ')', 0])],
             data = '<form method="post">' + data + '<button type="submit">' + now + '</button></form>',
             menu = [['manager', load_lang('admin')]]
         ))            
@@ -2916,7 +2927,7 @@ def acl(name = None):
                 data += '<hr><input value="' + html.escape(acl_data[0][1]) + '" placeholder="' + load_lang('why') + '" name="why" type="text" ' + check_ok + '>'
             
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [name, wiki_set(1), custom(), other2([' (ACL)', 0])],
+            imp = [name, wiki_set(), custom(), other2([' (ACL)', 0])],
             data = '<form method="post">' + data + '<hr><button type="submit">ACL ' + load_lang('edit') + '</button></form>',
             menu = [['w/' + url_pas(name), load_lang('document')], ['manager', load_lang('admin')]]
         ))
@@ -2976,7 +2987,7 @@ def user_admin(name = None):
                     div += '<option value="' + data[0] + '">' + data[0] + '</option>'
         
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [name, wiki_set(1), custom(), other2([' (' + load_lang('authority') + ')', 0])],
+            imp = [name, wiki_set(), custom(), other2([' (' + load_lang('authority') + ')', 0])],
             data =  '<form method="post"><select name="select">' + div + '</select><hr><button type="submit">' + load_lang('edit') + '</button></form>',
             menu = [['manager', load_lang('admin')]]
         ))
@@ -3002,7 +3013,7 @@ def diff_data(name = None):
                 result = re.sub('\r', '', diff(diff_data))
             
             return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-                imp = [name, wiki_set(1), custom(), other2([' (' + load_lang('compare') + ')', 0])],
+                imp = [name, wiki_set(), custom(), other2([' (' + load_lang('compare') + ')', 0])],
                 data = '<pre>' + result + '</pre>',
                 menu = [['history/' + url_pas(name), load_lang('history')]]
             ))
@@ -3020,7 +3031,7 @@ def down(name = None):
     div += '</ul>'
     
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [name, wiki_set(1), custom(), other2([' (' + load_lang('under') + ')', 0])],
+        imp = [name, wiki_set(), custom(), other2([' (' + load_lang('under') + ')', 0])],
         data = div,
         menu = [['w/' + url_pas(name), load_lang('document')]]
     ))
@@ -3072,7 +3083,7 @@ def read_view(name = None):
             for data in back:    
                 if re.search('^' + load_lang('category') + ':', data[0]):
                     u_div += '<li><a href="/w/' + url_pas(data[0]) + '">' + data[0] + '</a></li>'
-                elif re.search('^:', data[0]):
+                elif re.search('^' + load_lang('template') + ':', data[0]):
                     curs.execute("select data from data where title = ?", [data[0]])
                     db_data = curs.fetchall()
                     if db_data:
@@ -3137,7 +3148,10 @@ def read_view(name = None):
         else_data = re.sub('^\r\n', '', else_data)
         else_data = re.sub('\r\n$', '', else_data)
             
-    end_data = namumark(name, else_data, 0)
+    end_data = namumark_re(
+        name = name,
+        data = else_data
+    )
     
     if num:
         menu = [['history/' + url_pas(name), load_lang('history')]]
@@ -3172,7 +3186,7 @@ def read_view(name = None):
     div = end_data + div
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [name, wiki_set(1), custom(), other2([sub + acl, r_date])],
+        imp = [name, wiki_set(), custom(), other2([sub + acl, r_date])],
         data = div,
         menu = menu
     )), response_data
@@ -3218,7 +3232,7 @@ def user_topic_list(name = None):
         sub = 0 
     
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('discussion') + ' ' + load_lang('record'), wiki_set(1), custom(), other2([sub, 0])],
+        imp = [load_lang('discussion') + ' ' + load_lang('record'), wiki_set(), custom(), other2([sub, 0])],
         data = div,
         menu = [['other', load_lang('other')], ['user', load_lang('user')], ['count/' + url_pas(name), load_lang('count')], ['record/' + url_pas(name), load_lang('record')]]
     ))
@@ -3407,7 +3421,7 @@ def recent_changes(name = None, tool = 'record'):
             sub = 0
                 
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [title, wiki_set(1), custom(), other2([sub, 0])],
+            imp = [title, wiki_set(), custom(), other2([sub, 0])],
             data = div,
             menu = menu
         ))
@@ -3480,7 +3494,7 @@ def upload():
         return redirect('/w/' + load_lang('file') + ':' + name)      
     else:
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [load_lang('upload'), wiki_set(1), custom(), other2([0, 0])],
+            imp = [load_lang('upload'), wiki_set(), custom(), other2([0, 0])],
             data =  '''
                     <form method="post" enctype="multipart/form-data" accept-charset="utf8">
                         <input type="file" name="f_data">
@@ -3552,7 +3566,7 @@ def user_info():
         plus2 = ''
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('user') + ' ' + load_lang('tool'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('user') + ' ' + load_lang('tool'), wiki_set(), custom(), other2([0, 0])],
         data =  '''
                 <h2>''' + load_lang('state') + '''</h2>
                 <ul>
@@ -3592,7 +3606,7 @@ def watch_list():
     div += '<a href="/manager/13">(' + load_lang('plus') + ')</a>'
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('watchlist') + ' ' + load_lang('list'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('watchlist') + ' ' + load_lang('list'), wiki_set(), custom(), other2([0, 0])],
         data = div,
         menu = [['manager', load_lang('admin')]]
     ))
@@ -3657,7 +3671,7 @@ def custom_head_view():
         start += '<span>&lt;style&gt;CSS&lt;/style&gt;<br>&lt;script&gt;JS&lt;/script&gt;</span><hr>'
 
         return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-            imp = [load_lang('user') + ' HEAD', wiki_set(1), custom(), other2([0, 0])],
+            imp = [load_lang('user') + ' HEAD', wiki_set(), custom(), other2([0, 0])],
             data =  start + '''
                     <form method="post">
                         <textarea rows="25" cols="100" name="content">''' + data + '''</textarea>
@@ -3691,7 +3705,7 @@ def count_edit(name = None):
         t_data = 0
 
     return css_html_js_minify.html_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('count'), wiki_set(1), custom(), other2([0, 0])],
+        imp = [load_lang('count'), wiki_set(), custom(), other2([0, 0])],
         data = '''
                 <ul>
                     <li><a href="/record/''' + url_pas(that) + '''">''' + load_lang('edit') + '''</a> : ''' + str(data) + '''</li>

+ 4 - 1
func.py

@@ -85,6 +85,9 @@ def load_lang(data):
         else:
             return else_lang[data]
 
+def namumark_re(name = '', data = '', set_num = 0):
+    return namumark(name, data, set_num, load_lang('please_all'))
+
 def edit_help_button():
     # https://stackoverflow.com/questions/11076975/insert-text-into-textarea-at-cursor-position-javascript
     '''
@@ -162,7 +165,7 @@ def next_fix(link, num, page, end = 50):
 def other2(origin):
     return origin + ['Deleted']
 
-def wiki_set(num):
+def wiki_set(num = 1):
     if num == 1:
         data_list = []
 

+ 4 - 2
language/en-US.json

@@ -4,9 +4,11 @@
     "delete" : "Delete",
     "bulk_delete" : "Bulk Delete",
     "edit_filter" : "Edit Filtering",
+    "template" : "Template",
     "move" : "Move",
     "hide" : "Hide",
     "list" : "List",
+    "out" : "out",
     "revert" : "Undo",
     "version" : " Ver",
     "normal_version" : "Version",
@@ -14,7 +16,7 @@
     "document" : "Documents",
     "all" : "Everything",
     "ban" : "Ban",
-    "release" : "Pardon",
+    "release" : "Release",
     "save" : "Save",
     "other" : "Others",
     "tool" : "Tools",
@@ -63,7 +65,7 @@
     "month" : "Month",
     "day" : "Day",
     "normal" : "Normal",
-    "subscriber" : "User",
+    "subscriber" : "Registor",
     "admin" : "Admin",
     "next" : "Next",
     "previous" : "Previous",

+ 5 - 3
language/ko-KR.json

@@ -4,12 +4,12 @@
     "delete": "삭제",
     "bulk_delete": "대량 삭제",
     "edit_filter": "편집 필터",
-    "move": " 이동",
+    "move": "이동",
     "hide": "숨김",
     "list": "목록",
     "revert": "되돌리기",
     "version": "판",
-    "normal_version" : "버전",
+    "normal_version": "버전",
     "document": "문서",
     "all": "모든",
     "ban": "차단",
@@ -101,5 +101,7 @@
     "decument_exist_error": "내용이 원래 문서와 동일 합니다.",
     "password_diffrent_error": "재 확인 비밀번호와 입력 비밀번호가 다릅니다.",
     "edit_filter_error": "편집 필터에 의해 검열 되었습니다.",
-    "file_name_error": "파일 이름은 알파벳, 한글, 띄어쓰기, 언더바, 빼기표만 허용 됩니다."
+    "file_name_error": "파일 이름은 알파벳, 한글, 띄어쓰기, 언더바, 빼기표만 허용 됩니다.",
+    "template": "틀",
+    "out": "외부"
 }

+ 14 - 0
license.md

@@ -27,3 +27,17 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+## External File License
+ * Quotes icon [Dave Gandy](http://www.flaticon.com/free-icon/quote-left_25672) CC 3.0 BY
+ * Syntax highlighting [highlightjs](https://highlightjs.org/)
+ * Numerical expression [MathJax](https://www.mathjax.org/)
+
+## Contributors
+ * [Reference](https://github.com/2DU/openNAMU/graphs/contributors)
+
+## Helpful people
+ * [Team Croatia](https://github.com/TeamCroatia)
+ * Basix
+ * Efrit
+ * Other chat rooms

+ 2 - 2
mark.py

@@ -29,8 +29,8 @@ def plusing(name, link, backtype):
     if not curs.fetchall():
         curs.execute("insert into back (title, link, type) values (?, ?, ?)", [link, name, backtype])
 
-def namumark(title, data, num):
-    data = start(conn, data, title)
+def namumark(title, data, num, lang):
+    data = start(conn, data, title, lang)
     if num == 1:
         i = 0
         while 1:

+ 13 - 16
readme.md

@@ -1,24 +1,21 @@
-## 개요
-오픈나무 정식 버전 입니다. 파이썬으로 돌아 갑니다. (3.5 이상)
+## Intro
+NamuMark based wiki engine returns to Python. (3.5 and above)
 
-## 클론 명령어
-### 일반
+## Clone command
+### Stable
  * git clone https://github.com/2DU/openNAMU.git
 
-### 베타
+### Master
  * git clone -b master https://github.com/2DU/openNAMU.git
 
-### 업데이트
- * git pull
-
-## 설치법
- * [참조](http://namu.ml/w/오픈나무%2F설치법)
+## Install
+ * [참조](http://namu.ml/w/openNAMU/Install)
  
-## set.json 설명
- * db = 데이터베이스 이름
+## set.json Explanation
+ * db = Database Name
 
-set.json를 삭제하면 다시 새로 만들 수 있습니다.
+You can create a new set.json by deleting it.
 
-## 기타
- * [테스트 서버](http://namu.ml/)
- * 첫 번째 가입자에게 소유자 권한이 부여됩니다.
+## Other
+ * [Test Server (Ko)](http://namu.ml/)
+ * The first registor is granted owner privileges.

+ 26 - 26
set_mark/start.py

@@ -177,7 +177,7 @@ def link_fix(main_link):
         
     return [main_link, other_link]
 
-def start(conn, data, title):
+def start(conn, data, title, lang):
     # DB 지정
     curs = conn.cursor()
 
@@ -256,7 +256,7 @@ def start(conn, data, title):
                     else:
                         break
 
-                include_parser = re.sub('\[\[분류:(((?!\]\]|#include).)+)\]\]', '', include_parser)
+                include_parser = re.sub('\[\[' + lang['template'] + ':(((?!\]\]|#include).)+)\]\]', '', include_parser)
                 include_parser = html.escape(include_parser)
 
                 data = re.sub('\[include\(((?:(?!\)\]).)+)\)\]', '<include>\n<a id="include_link" href="/w/' + tool.url_pas(include_link) + '">[' + include_link + ']</a>\n' + include_parser + '\n</include>', data, 1)
@@ -402,7 +402,7 @@ def start(conn, data, title):
                                                             else:
                                                                 folding_data = ['Test']
                                                             
-                                                            data = re.sub('{{{#!folding ?((?:(?!\n).)*)\n?', '<div>' + str(folding_data[0]) + ' <div style="display: inline-block;"><a href="javascript:void(0);" onclick="folding(' + str(fol_num) + ');">[작동]</a></div_end><div id="folding_' + str(fol_num) + '" style="display: none;"><div id="wiki_div" style="">', data, 1)
+                                                            data = re.sub('{{{#!folding ?((?:(?!\n).)*)\n?', '<div>' + str(folding_data[0]) + ' <div style="display: inline-block;"><a href="javascript:void(0);" onclick="folding(' + str(fol_num) + ');">[Do]</a></div_end><div id="folding_' + str(fol_num) + '" style="display: none;"><div id="wiki_div" style="">', data, 1)
                                                             
                                                             fol_num += 1
                                                         else:
@@ -553,18 +553,18 @@ def start(conn, data, title):
         data = re.sub('\n#(?:redirect|넘겨주기) (?P<in>(?:(?!\n).)+)\n', '<meta http-equiv="refresh" content="0; url=/w/' + tool.url_pas(main_link) + '?froms=' + tool.url_pas(title) + other_link + '">', data, 1)
 
     # [목차(없음)] 처리
-    if not re.search('\[목차\(없음\)\]\n', data):
-        if not re.search('\[목차\]', data):
-            data = re.sub('\n(?P<in>={1,6}) ?(?P<out>(?:(?!=).)+) ?={1,6}\n', '\n[목차]\n\g<in> \g<out> \g<in>\n', data, 1)
+    if not re.search('\[(?:목차|tableofcontents)\((?:없음|no)\)\]\n', data):
+        if not re.search('\[(?:목차|tableofcontents)\]', data):
+            data = re.sub('\n(?P<in>={1,6}) ?(?P<out>(?:(?!=).)+) ?={1,6}\n', '\n[(?:목차|tableofcontents)]\n\g<in> \g<out> \g<in>\n', data, 1)
     else:
-        data = re.sub('\[목차\(없음\)\]\n', '', data)
+        data = re.sub('\[(?:목차|tableofcontents)\((?:없음|no)\)\]\n', '', data)
         
     # 문단 문법
     toc_full = 0
     toc_top_stack = 6
     toc_stack = [0, 0, 0, 0, 0, 0]
     edit_number = 0
-    toc_data = '<div id="toc"><span style="font-size: 18px;">목차</span>\n\n'
+    toc_data = '<div id="toc"><span style="font-size: 18px;">TOC</span>\n\n'
     while 1:
         toc = re.search('\n(={1,6}) ?((?:(?!\n).)+) ?\n', data)
         if toc:
@@ -592,7 +592,7 @@ def start(conn, data, title):
 
             all_stack = re.sub('0.', '', all_stack)
             
-            data = re.sub('\n(={1,6}) ?((?:(?!\n).)+) ?\n', '\n<h' + toc_number + ' id="s-' + re.sub('\.$', '', all_stack) + '"><a href="#toc">' + all_stack + '</a> ' + re.sub('=*$', '', toc[1]) + ' <span style="font-size: 12px"><a href="/edit/' + tool.url_pas(title) + '?section=' + str(edit_number) + '">(편집)</a></span></h' + toc_number + '>\n', data, 1)
+            data = re.sub('\n(={1,6}) ?((?:(?!\n).)+) ?\n', '\n<h' + toc_number + ' id="s-' + re.sub('\.$', '', all_stack) + '"><a href="#toc">' + all_stack + '</a> ' + re.sub('=*$', '', toc[1]) + ' <span style="font-size: 12px"><a href="/edit/' + tool.url_pas(title) + '?section=' + str(edit_number) + '">(' + lang['edit'] + ')</a></span></h' + toc_number + '>\n', data, 1)
             
             toc_data += '<span style="margin-left: ' + str((toc_full - toc_top_stack) * 10) + 'px;"><a href="#s-' + re.sub('\.$', '', all_stack) + '">' + all_stack + '</a> ' + re.sub('\[\*((?:(?! |\]).)*)(?: ((?:(?!\]).)+))?\]', '', re.sub('=*$', '', toc[1])) + '</span>\n'
         else:
@@ -600,7 +600,7 @@ def start(conn, data, title):
 
     toc_data += '</div>'
     
-    data = re.sub('\[목차\]', toc_data, data)
+    data = re.sub('\[(?:목차|tableofcontents)\]', toc_data, data)
     
     while 1:
         hr = re.search('\n-{4,9}\n', data)
@@ -778,7 +778,7 @@ def start(conn, data, title):
             break
 
     # 링크 관련 문법 구현
-    category = '\n<hr><div id="cate">분류: '
+    category = '\n<hr><div id="cate">' + lang['category'] + ': '
     while 1:
         link = re.search('\[\[((?:(?!\[\[|\]\]).)+)\]\]', data)
         if link:
@@ -794,7 +794,7 @@ def start(conn, data, title):
                 main_link = link
                 see_link = link
 
-            if re.search('^(파일|외부):', main_link):
+            if re.search('^(' + lang['file'] + '|' + lang['out'] + '):', main_link):
                 file_style = ''
 
                 width = re.search('width=((?:(?!&).)+)', see_link)
@@ -823,13 +823,13 @@ def start(conn, data, title):
                 else:
                     file_align = ''
 
-                if re.search('^외부:', main_link):
-                    file_src = re.sub('^외부:', '', main_link)
+                if re.search('^' + lang['out'] + ':', main_link):
+                    file_src = re.sub('^' + lang['out'] + ':', '', main_link)
             
                     file_alt = main_link
                     exist = 'Yes'
                 else:
-                    file_data = re.search('^파일:((?:(?!\.).)+)\.(.+)$', main_link)
+                    file_data = re.search('^' + lang['file'] + ':((?:(?!\.).)+)\.(.+)$', main_link)
                     if file_data:
                         file_data = file_data.groups()
                         file_name = file_data[0]
@@ -841,7 +841,7 @@ def start(conn, data, title):
                         file_end = 'jpg'
 
                     file_src = '/image/' + tool.sha224(file_name) + '.' + file_end
-                    file_alt = '파일:' + file_name + '.' + file_end
+                    file_alt = '' + lang['file'] + ':' + file_name + '.' + file_end
 
                     curs.execute("select title from data where title = ?", [file_alt])
                     exist = curs.fetchall()
@@ -850,12 +850,12 @@ def start(conn, data, title):
                     data = re.sub('\[\[((?:(?!\[\[|\]\]).)+)\]\]', '<span style="' + file_align + '"><img style="' + file_style + '" alt="' + file_alt + '" src="' + file_src + '"></span>', data, 1)
                 else:
                     data = re.sub('\[\[((?:(?!\[\[|\]\]).)+)\]\]', '<a id="not_thing" href="/w/' + tool.url_pas(file_alt) + '">' + file_alt + '</a>', data, 1)
-            elif re.search('^분류:', main_link):
+            elif re.search('^' + lang['category'] + ':', main_link):
                 see_link = re.sub('#include', '', see_link)
                 main_link = re.sub('#include', '', main_link)
 
                 if re.search('#blur', main_link):
-                    see_link = '스포일러'
+                    see_link = 'Hidden'
                     link_id = 'id="inside"'
                     
                     main_link = re.sub('#blur', '', main_link)
@@ -864,7 +864,7 @@ def start(conn, data, title):
 
                 backlink += [[title, main_link, 'cat']]
 
-                category += '<a ' + link_id + ' href="' + tool.url_pas(main_link) + '">' + re.sub('^분류:', '', see_link) + '</a> / '
+                category += '<a ' + link_id + ' href="' + tool.url_pas(main_link) + '">' + re.sub('^' + lang['category'] + ':', '', see_link) + '</a> / '
                 data = re.sub('\[\[((?:(?!\[\[|\]\]).)+)\]\]', '', data, 1)
             elif re.search('^wiki:', main_link):
                 data = re.sub('\[\[((?:(?!\[\[|\]\]).)+)\]\]', '<a id="inside" href="/' + tool.url_pas(re.sub('^wiki:', '', main_link)) + '">' + see_link + '</a>', data, 1)
@@ -880,7 +880,7 @@ def start(conn, data, title):
                     else:
                         data = re.sub('\[\[((?:(?!\[\[|\]\]).)+)\]\]', '<a id="inside" href="' + inter[0][0] + inter_data[1] + '">' + inter_data[0] + ':' + inter_data[1] + '</a>', data, 1)
                 else:
-                    data = re.sub('\[\[((?:(?!\[\[|\]\]).)+)\]\]', '인터위키 정보 없음', data, 1)
+                    data = re.sub('\[\[((?:(?!\[\[|\]\]).)+)\]\]', 'Not exist', data, 1)
             elif re.search('^\/', main_link):
                 under_title = re.search('^(\/(?:.+))$', main_link)
                 under_title = under_title.groups()[0]
@@ -929,7 +929,7 @@ def start(conn, data, title):
     footnote_re = {}
     footdata_all = '\n<hr><ul id="footnote_data">'
     while 1:
-        footnote = re.search('(?:\[\*((?:(?! |\]).)*)(?: ((?:(?!\]).)+))?\]|(\[각주\]))', data)
+        footnote = re.search('(?:\[\*((?:(?! |\]).)*)(?: ((?:(?!\]).)+))?\]|(\[(?:각주|footnote)\]))', data)
         if footnote:
             footnote_data = footnote.groups()
             if footnote_data[2]:
@@ -943,7 +943,7 @@ def start(conn, data, title):
 
                     footdata_all += '<li><a href="#rfn-' + str(footdata[0]) + '" id="fn-' + str(footdata[0]) + '">(' + footdata[1] + ')</a> ' + footdata_in + '</li>'
                 
-                data = re.sub('(?:\[\*((?:(?! ).)*) ((?:(?!\]).)+)\]|(\[각주\]))', footdata_all + '</ul>', data, 1)
+                data = re.sub('(?:\[\*((?:(?! ).)*) ((?:(?!\]).)+)\]|(\[(?:각주|footnote)\]))', footdata_all + '</ul>', data, 1)
                 
                 footnote_all = []
                 footdata_all = '\n<hr><ul id="footnote_data">'
@@ -959,9 +959,9 @@ def start(conn, data, title):
 
                         footnote_all += [[float(footshort), footshort, 0]]
 
-                        data = re.sub('(?:\[\*((?:(?! |\]).)*)(?: ((?:(?!\]).)+))?\]|(\[각주\]))', '<sup><a href="#fn-' + footshort + '" id="rfn-' + footshort + '">(' + footshort + ')</a></sup>', data, 1)
+                        data = re.sub('(?:\[\*((?:(?! |\]).)*)(?: ((?:(?!\]).)+))?\]|(\[(?:각주|footnote)\]))', '<sup><a href="#fn-' + footshort + '" id="rfn-' + footshort + '">(' + footshort + ')</a></sup>', data, 1)
                     else:
-                        data = re.sub('(?:\[\*((?:(?! |\]).)*)(?: ((?:(?!\]).)+))?\]|(\[각주\]))', '<sup><a href="#">(' + footnote_name + ')</a></sup>', data, 1)
+                        data = re.sub('(?:\[\*((?:(?! |\]).)*)(?: ((?:(?!\]).)+))?\]|(\[(?:각주|footnote)\]))', '<sup><a href="#">(' + footnote_name + ')</a></sup>', data, 1)
                 else:
                     footnote_number += 1
 
@@ -977,7 +977,7 @@ def start(conn, data, title):
 
                     footnote_all += [[footnote_number, footnote_name, footnote]]
                     
-                    data = re.sub('(?:\[\*((?:(?! |\]).)*)(?: ((?:(?!\]).)+))?\]|(\[각주\]))', '<sup><a href="#fn-' + str(footnote_number) + '" id="rfn-' + str(footnote_number) + '">(' + footnote_name + ')</a></sup>', data, 1)
+                    data = re.sub('(?:\[\*((?:(?! |\]).)*)(?: ((?:(?!\]).)+))?\]|(\[(?:각주|footnote)\]))', '<sup><a href="#fn-' + str(footnote_number) + '" id="rfn-' + str(footnote_number) + '">(' + footnote_name + ')</a></sup>', data, 1)
         else:
             break
 
@@ -1003,7 +1003,7 @@ def start(conn, data, title):
     category += '</div>'
     category = re.sub(' / <\/div>$', '</div>', category)
 
-    if category == '\n<hr><div id="cate">분류: </div>':
+    if category == '\n<hr><div id="cate">' + lang['category'] + ': </div>':
         category = ''
 
     data += category