Răsfoiți Sursa

영어판 완성 (아마)

ect (or 2du) 8 ani în urmă
părinte
comite
3ffa26bd19
11 a modificat fișierele cu 116 adăugiri și 87 ștergeri
  1. 4 27
      ISSUE_TEMPLATE.md
  2. 21 0
      Readme-Ko.md
  3. 1 1
      Version-Ko.md
  4. 26 12
      app.py
  5. 3 0
      func.py
  6. 1 0
      language/en-US.json
  7. 5 3
      language/ko-KR.json
  8. 14 0
      license.md
  9. 2 2
      mark.py
  10. 13 16
      readme.md
  11. 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/)
+ * 첫 번째 가입자에게 소유자 권한이 부여됩니다.

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

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

+ 26 - 12
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 설정 확인
@@ -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()
             
@@ -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()
         
@@ -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)
@@ -2029,7 +2040,7 @@ def title_index():
         else:
             count_end += [0]
 
-        sql_list = ['' + load_lang('template') + ':', 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,10 +2052,10 @@ 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)
@@ -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]])
@@ -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')]]

+ 3 - 0
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
     '''

+ 1 - 0
language/en-US.json

@@ -8,6 +8,7 @@
     "move" : "Move",
     "hide" : "Hide",
     "list" : "List",
+    "out" : "out",
     "revert" : "Undo",
     "version" : " Ver",
     "normal_version" : "Version",

+ 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