Преглед на файлове

Merge pull request #686 from 2du/master

표 버그 수정
잉여개발기 (SPDV) преди 6 години
родител
ревизия
a9ee2f4e71
променени са 13 файла, в които са добавени 522 реда и са изтрити 472 реда
  1. 1 1
      app.py
  2. 2 1
      language/en-US.json
  3. 288 310
      language/ko-KR.json
  4. 8 2
      route/give_acl.py
  5. 15 3
      route/inter_wiki_plus.py
  6. 26 12
      route/list_admin_use.py
  7. 131 92
      route/setting.py
  8. 5 2
      route/tool/func.py
  9. 23 26
      route/tool/mark.py
  10. 12 15
      route/tool/set_mark/namu.py
  11. 8 6
      route/view_read.py
  12. 1 1
      version.json
  13. 2 1
      views/main_css/css/main.css

+ 1 - 1
app.py

@@ -339,7 +339,7 @@ def give_history_hidden(name = None):
 def list_user():
     return list_user_2(conn)
 
-@app.route('/admin_log')
+@app.route('/admin_log', methods=['POST', 'GET'])
 def list_admin_use():
     return list_admin_use_2(conn)
 

+ 2 - 1
language/en-US.json

@@ -308,5 +308,6 @@
             "file_name_error" : "Only alphabet, hangul, space, underscore, and minus signs are allowed for file names.",
             "topic_long_error" : "The discussion name must not exceed 256 characters.",
             "email_error" : "No one has this email.",
-            "regex_error" : "There is an error in the regular expression."
+            "regex_error" : "There is an error in the regular expression.",
+            "decument_404_error" : "This document does not exist."
 }

+ 288 - 310
language/ko-KR.json

@@ -1,312 +1,290 @@
 {
-    "_comment_1_" : "공통",
-        "server" : "서버",
-        "filter" : "필터",
-        "delete" : "삭제",
-        "notice" : "알림",
-        "add" : "추가",
-        "license" : "저작권",
-        "etc" : "기타",
-        "name" : "이름",
-        "regex" : "정규표현식",
-        "id" : "아이디",
-        "list" : "목록",
-        "main" : "메인",
-        "return" : "돌아가기",
-        "skin" : "스킨",
-        "save" : "저장",
-        "secret_key" : "비밀키",
-        "host" : "호스트",
-        "port" : "포트",
-        "restart" : "재시작",
-        "document_name" : "문서명",
-        "discussion_name" : "토론명",
-        "user_name" : "사용자 이름",
-        "go" : "이동",
-        "document" : "문서",
-        "discussion" : "토론",
-        "backlink" : "역링크",
-        "closed" : "닫힘",
-        "reload" : "다시 로드",
-        "send" : "전송",
-        "ongoing" : "진행중",
-        "normal" : "보통",
-        "range" : "범위",
-        "search" : "검색",
-        "raw" : "원본",
-        "history" : "역사",
-        "user_discussion" : "사용자 토론",
-        "record" : "기록",
-        "state" : "상태",
-        "revert" : "복원",
-        "why" : "사유",
-        "edit" : "편집",
-        "preview" : "미리보기",
-        "move" : "이동",
-        "upload" : "업로드",
-        "version" : "버전",
-        "stop" : "중지",
-        "close" : "닫기",
-        "open" : "열기",
-        "agreement" : "동의",
-        "template" : "틀",
-        "category" : "분류",
-        "file" : "파일",
-        "writer" : "작성자",
-        "editor" : "에디터",
-        "hide" : "숨김",
-        "check" : "검사",
-        "destruction" : "취소",
-        "tool" : "도구",
-        "recent" : "최근",
-        "password" : "비밀번호",
-        "login" : "로그인",
-        "logout" : "로그아웃",
-        "register" : "회원가입",
-        "language" : "언어",
-        "compare" : "비교",
-        "email" : "이메일",
-        "key" : "키",
-        "all" : "전체",
-        "sub" : "하위",
-        "create" : "생성",
-        "acl" : "ACL",
-        "upper" : "상위",
-        "other" : "기타",
-        "random" : "랜덤",
-        "error" : "오류",
-        "next" : "다음",
-        "previous" : "이전",
-        "authority" : "권한",
-        "connect" : "연결",
-        "explanation" : "설명",
-        "default" : "기본값",
-        "lastest" : "최신",
-        "type" : "유형",
-        "in_progress" : "진행중",
-        "start" : "시작",
-        "pass" : "넘기기",
-        "file_name" : "파일명",
-        "_comment_1.1_" : "시간",
-            "second" : "초",
-            "hour" : "시간",
-            "limitless" : "무기한",
-            "time" : "시간",
-            "period" : "기간",
-            "end" : "끝",
-        "_comment_1.2_" : "사용자",
-            "user" : "사용자",
-            "admin" : "관리자",
-            "owner" : "소유자",
-            "ip" : "IP",
-            "member" : "가입자",
-        "_comment_1.3_" : "차단",
-            "ban" : "차단",
-            "blocked" : "차단됨",
-            "release" : "차단 해제",
-    "_comment_2_" : "기능",
-        "wiki_restart" : "위키 엔진 재시작",
-        "update" : "업데이트",
-        "need_document" : "필요한 문서들",
-        "close_discussion" : "닫힌 토론",
-        "open_discussion" : "열린 토론",
-        "recent_discussion" : "최근 토론",
-        "recent_change" : "최근 편집",
-        "edit_filter" : "편집 필터",
-        "recent_ban" : "최근 차단",
-        "load" : "다른 문서 불러오기",
-        "edit_filter_rule" : "편집 필터 규칙",
-        "move_history" : "이동 기록",
-        "other_tool" : "기타 도구",
-        "admin_tool" : "관리 도구",
-        "check_user" : "사용자 검사",
-        "compare_target" : "비교 대상 이름",
-        "authorize" : "권한 부여",
-        "indexing" : "DB 인덱싱",
-        "hide_release" : "표시",
-        "notice_release" : "릴리즈 노트",
-        "ban_release" : "차단 해제",
-        "discussion_tool" : "토론 도구",
-        "discussion_raw" : "토론 원본",
-        "oauth_signin_facebook" : "Facebook 아이디로 로그인",
-        "oauth_signin_naver" : "네이버 아이디로 로그인",
-        "oauth_signin_discord" : "디스코드 아이디로 로그인",
-        "oauth_signin_kakao" : "카카오톡 아이디로 로그인",
-        "connection" : "연결",
-        "new_connection" : "연결...",
-        "user_setting" : "사용자 설정",
-        "now_password" : "현재 비밀번호",
-        "new_password" : "새 비밀번호",
-        "password_confirm" : "비밀번호 확인",
-        "oauth_connection" : "Oauth 연결",
-        "password_search" : "비밀번호 찾기",
-        "login_able" : "로그인 가능",
-        "band_ban" : "대역 차단",
-        "band_blocked" : "대역 차단됨",
-        "document_acl" : "문서 ACL",
-        "discussion_acl" : "토론 ACL",
-        "view_acl" : "읽기 ACL",
-        "under_category" : "하위 분류",
-        "count" : "기여 횟수",
-        "alarm" : "알림",
-        "user_document" : "사용자 문서",
-        "user_head" : "사용자 <head>",
-        "user_document_acl" : "사용자 문서 ACL",
-        "encryption_method" : "암호화 방식",
-        "check_key" : "인증키 검사",
-        "reset_user_ok" : "검사 성공",
-        "name_or_ip_or_regex" : "ID or IP or 정규식",
-        "ban_period" : "차단 기간",
-        "not_sure" : "확실하지 않음",
-        "use_push_alarm" : "푸쉬 알림 사용",
-        "edit_button_paragraph" : "문단",
-        "password_change" : "비밀번호 변경",
-        "email_change" : "이메일 변경",
-        "acl_change" : "문서 ACL 변경",
-        "_comment_2.1_" : "필터",
-            "_comment_2.1.1_" : "목록",
-                "interwiki_list" : "인터위키 목록",
-                "email_filter_list" : "이메일 필터 목록",
-                "id_filter_list" : "ID 필터 목록",
-                "edit_filter_list" : "편집 필터 목록",
-                "file_filter_list" : "파일명 필터 목록",
-            "_comment_2.1.2_" : "추가",
-                "interwiki_add" : "인터위키 추가",
-                "edit_filter_add" : "편집 필터 추가",
-                "id_filter_add" : "ID 필터 추가",
-                "email_filter_add" : "이메일 필터 추가",
-                "file_filter_add" : "파일명 필터 추가",
-        "_comment_2.2_" : "설정",
-            "setting" : "설정",
-            "restart_required" : "재시작 필요",
-            "oauth_setting" : "OAuth 설정",
-            "adsense_setting" : "애드센스 설정",
-            "adsense_enable" : "애드센스 사용",
-            "skin_setting" : "스킨 설정",
-            "_comment_2.2.1_" : "목록",
-                "main_setting" : "메인 설정",
-                "text_setting" : "문구 설정",
-                "main_head" : "전역 <head>",
-                "main_body" : "전역 <body>",
-            "_comment_2.2.2_" : "메인",
-                "wiki_name" : "위키 이름",
-                "wiki_logo" : "위키 로고",
-                "main_page" : "대문",
-                "bottom_text" : "하단 텍스트",
-                "max_file_size" : "파일 최대 파일 크기",
-                "backup_interval" : "백업 주기",
-                "wiki_skin" : "위키 스킨",
-                "default_acl" : "기본 수정 ACL",
-                "default_discussion_acl" : "기본 토론 ACL",
-                "no_register" : "가입불가",
-                "hide_ip" : "IP 숨기기",
-                "wiki_host" : "위키 호스트",
-                "wiki_port" : "위키 포트",
-                "wiki_secret_key" : "위키 비밀키",
-                "email_required" : "이메일 필요",
-                "google_imap_required" : "Google IMAP 설정 필요",
-                "update_branch" : "업데이트를 가져올 브랜치",
-            "_comment_2.2.3_" : "문구",
-                "register_text" : "회원가입 정책",
-                "non_login_alert" : "비로그인 알림",
-                "edit_bottom_text" : "편집창 하단 문구",
-                "check_key_text" : "인증키 검사 문구",
-                "email_title" : "이메일 제목",
-                "email_text" : "이메일 내용",
-                "email_insert_text" : "이메일 입력란 문구",
-                "password_search_text" : "비밀번호 찾기 문구",
-                "reset_user_text" : "암호 초기화 완료 문구",
-            "_comment_2.2.4_" : "Google",
-                "recaptcha" : "reCAPTCHA",
-                "google_imap" : "Google IMAP",
-                "google_email" : "Google 이메일",
-                "google_app_password" : "Google 앱 비밀번호",
-        "_comment_2.3_" : "목록",
-            "open_discussion_list" : "열린 토론 목록",
-            "discussion_list" : "토론 목록",
-            "admin_list" : "관리자 목록",
-            "member_list" : "사용자 목록",
-            "authority_use_list" : "권한 사용 목록",
-            "admin_group_list" : "관리자 그룹 목록",
-            "all_document_list" : "모든 문서 목록",
-            "watchlist" : "주시 목록",
-            "_comment_2.3.1_" : "ACL 문서 목록",
-                "acl_document_list" : "ACL 문서 목록",
-                "acl_required" : "ACL 필요",
-            "_comment_2.3.2_" : "ACL 목록",
-                "admin_group_add" : "관리자 그룹 권한 부여",
-                "ban_authority" : "차단 권한",
-                "discussion_authority" : "토론 관리 권한",
-                "user_check_authority" : "사용자 검사 권한",
-                "document_acl_authority" : "문서 ACL 관리 권한",
-                "history_hide_authority" : "역사 숨김 권한",
-                "authorization_authority" : "권한 부여 권한",
-                "owner_authority" : "소유자 권한",
-            "_comment_2.3.3_" : "기록",
-                "edit_record" : "편집 기록",
-                "discussion_record" : "토론 기록",
-        "_comment_2.4_" : "편집창",
-            "edit_button_link" : "링크",
-            "edit_button_footnote" : "각주",
-            "edit_button_macro" : "매크로",
-            "edit_button_color" : "색상",
-            "edit_button_bold" : "강조",
-            "edit_button_strike" : "취소선",
-            "edit_button_big" : "크게",
-        "_comment_2.5_" : "토론 도구",
-            "topic_tool" : "토론 도구",
-            "topic_state" : "토론 상태",
-            "topic_stop" : "토론 중지",
-            "topic_close" : "토론 닫기",
-            "topic_restart" : "토론 중지 해제",
-            "topic_open" : "토론 열기",
-            "topic_agreement" : "토론 합의",
-            "topic_destruction" : "토론 합의 취소",
-        "_comment_2.6_" : "기간",
-            "1_day" : "1일",
-            "5_day" : "5일",
-            "30_day" : "30일",
-            "180_day" : "180일",
-            "360_day" : "360일",
-        "_comment_2.7_" : "ACL",
-            "admin_acl" : "관리자만",
-            "member_acl" : "가입자만",
-            "50_edit_acl" : "기여 횟수 총합 50회 이상 가입자만",
-            "all_acl" : "모든 사용자",
-            "email_acl" : "이메일을 가진 유저만",
-    "_comment_3_" : "장문",
-        "ie_no_data_required" : "이 기능을 수행하는데 필요한 데이터가 제공되지 않았습니다.",
-        "oauth_settings_not_found" : "관리자가 이 기능을 수행하는데 필요한 데이터를 제공하지 않았습니다.",
-        "oauth_disabled" : "관리자가 이 기능을 비활성화시켰습니다.",
-        "http_warring" : "경고: HTTPS 연결을 사용하지 않는다면 개인정보가 유출될 수 있습니다. 이 사항에 의해 입는 피해는 사용자에게 책임이 있음을 알려드립니다.",
-        "user_head_warring" : "비로그인시 브라우저를 닫거나 로그인시 사용자의 <head>는 삭제됩니다.",
-        "no_login_warring" : "비로그인 상태입니다. 편집시 지금 접속한 IP 명의로 기록됩니다.",
-        "user_reset_sign" : "사용자의 계정 정보가 다음과 같이 변경 되었습니다.",
-        "update_warring" : "최신 버전보다 0.2 버전 이상 낮은 경우 수동 업데이트를 권장 드립니다. 윈도우의 경우 route 폴더의 내용이 사라집니다.",
-        "markup_enabled" : "문법 사용 가능",
-        "_comment_3.1_" : "오류",
-            "update_error" : "자동 업데이트가 지원되지 않습니다.",
-            "inter_error" : "내부 오류.",
-            "authority_error" : "권한이 없습니다.",
-            "no_login_error" : "비로그인 상태입니다.",
-            "no_exist_user_error" : "계정이 존재하지 않습니다.",
-            "no_admin_block_error" : "관리자는 검사, 차단을 수행할 수 없습니다.",
-            "skin_error" : "이 스킨은 설정을 지원하지 않습니다.",
-            "same_id_exist_error" : "이미 같은 이름의 계정이 있습니다.",
-            "long_id_error" : "ID는 20자보다 짧아야 합니다.",
-            "id_char_error" : "오직 한글과 알파벳, 공백만 사용 가능합니다.",
-            "file_exist_error" : "파일이 존재하지 않습니다.",
-            "password_error" : "비밀번호가 다릅니다.",
-            "recaptcha_error" : "'나는 로봇이 아닙니다'를 통해 reCAPTCHA를 수행하세요.",
-            "file_extension_error" : "오직 JPG, GIF, JPEG, PNG, WEBP 만 업로드할 수 있습니다.",
-            "edit_record_error" : "수정 요약은 500자를 넘길 수 없습니다.",
-            "same_file_error" : "똑같은 이름의 파일이 존재합니다.",
-            "file_capacity_error" : "최대 파일 크기 (MB) :",
-            "decument_exist_error" : "이동하려는 이름에 이미 문서가 존재합니다.",
-            "password_diffrent_error" : "입력한 비밀번호와 비밀번호 확인이 서로 다릅니다.",
-            "edit_filter_error" : "편집 필터에 의해 금지된 단어가 사용되었습니다.",
-            "file_name_error" : "파일 이름에는 알파벳, 한글, 공백, 밑줄 과 빼기 기호만 사용할 수 있습니다.",
-            "topic_long_error" : "토론 이름이 256자를 넘지 않아야 합니다.",
-            "email_error" : "이런 이메일을 가진 사용자가 없습니다.",
-            "regex_error" : "정규표현식에 오류가 있습니다."
+    "server" : "서버",
+    "filter" : "필터",
+    "delete" : "삭제",
+    "notice" : "알림",
+    "add" : "추가",
+    "license" : "저작권",
+    "etc" : "기타",
+    "name" : "이름",
+    "regex" : "정규표현식",
+    "id" : "아이디",
+    "list" : "목록",
+    "main" : "메인",
+    "return" : "돌아가기",
+    "skin" : "스킨",
+    "save" : "저장",
+    "secret_key" : "비밀키",
+    "host" : "호스트",
+    "port" : "포트",
+    "restart" : "재시작",
+    "document_name" : "문서명",
+    "discussion_name" : "토론명",
+    "user_name" : "사용자 이름",
+    "go" : "이동",
+    "document" : "문서",
+    "discussion" : "토론",
+    "backlink" : "역링크",
+    "closed" : "닫힘",
+    "reload" : "다시 로드",
+    "send" : "전송",
+    "ongoing" : "진행중",
+    "normal" : "보통",
+    "range" : "범위",
+    "search" : "검색",
+    "raw" : "원본",
+    "history" : "역사",
+    "user_discussion" : "사용자 토론",
+    "record" : "기록",
+    "state" : "상태",
+    "revert" : "복원",
+    "why" : "사유",
+    "edit" : "편집",
+    "preview" : "미리보기",
+    "move" : "이동",
+    "upload" : "업로드",
+    "version" : "버전",
+    "stop" : "중지",
+    "close" : "닫기",
+    "open" : "열기",
+    "agreement" : "동의",
+    "template" : "틀",
+    "category" : "분류",
+    "file" : "파일",
+    "writer" : "작성자",
+    "editor" : "에디터",
+    "hide" : "숨김",
+    "check" : "검사",
+    "destruction" : "취소",
+    "tool" : "도구",
+    "recent" : "최근",
+    "password" : "비밀번호",
+    "login" : "로그인",
+    "logout" : "로그아웃",
+    "register" : "회원가입",
+    "language" : "언어",
+    "compare" : "비교",
+    "email" : "이메일",
+    "key" : "키",
+    "all" : "전체",
+    "sub" : "하위",
+    "create" : "생성",
+    "acl" : "ACL",
+    "upper" : "상위",
+    "other" : "기타",
+    "random" : "랜덤",
+    "error" : "오류",
+    "next" : "다음",
+    "previous" : "이전",
+    "authority" : "권한",
+    "connect" : "연결",
+    "explanation" : "설명",
+    "default" : "기본값",
+    "lastest" : "최신",
+    "type" : "유형",
+    "in_progress" : "진행중",
+    "start" : "시작",
+    "pass" : "넘기기",
+    "file_name" : "파일명",
+    "second" : "초",
+    "hour" : "시간",
+    "limitless" : "무기한",
+    "time" : "시간",
+    "period" : "기간",
+    "end" : "끝",
+    "user" : "사용자",
+    "admin" : "관리자",
+    "owner" : "소유자",
+    "ip" : "IP",
+    "member" : "가입자",
+    "ban" : "차단",
+    "blocked" : "차단됨",
+    "release" : "차단 해제",
+    "wiki_restart" : "위키 엔진 재시작",
+    "update" : "업데이트",
+    "need_document" : "필요한 문서들",
+    "close_discussion" : "닫힌 토론",
+    "open_discussion" : "열린 토론",
+    "recent_discussion" : "최근 토론",
+    "recent_change" : "최근 편집",
+    "edit_filter" : "편집 필터",
+    "recent_ban" : "최근 차단",
+    "load" : "다른 문서 불러오기",
+    "edit_filter_rule" : "편집 필터 규칙",
+    "move_history" : "이동 기록",
+    "other_tool" : "기타 도구",
+    "admin_tool" : "관리 도구",
+    "check_user" : "사용자 검사",
+    "compare_target" : "비교 대상 이름",
+    "authorize" : "권한 부여",
+    "indexing" : "DB 인덱싱",
+    "hide_release" : "표시",
+    "notice_release" : "릴리즈 노트",
+    "ban_release" : "차단 해제",
+    "discussion_tool" : "토론 도구",
+    "discussion_raw" : "토론 원본",
+    "oauth_signin_facebook" : "Facebook 아이디로 로그인",
+    "oauth_signin_naver" : "네이버 아이디로 로그인",
+    "oauth_signin_discord" : "디스코드 아이디로 로그인",
+    "oauth_signin_kakao" : "카카오톡 아이디로 로그인",
+    "connection" : "연결",
+    "new_connection" : "연결...",
+    "user_setting" : "사용자 설정",
+    "now_password" : "현재 비밀번호",
+    "new_password" : "새 비밀번호",
+    "password_confirm" : "비밀번호 확인",
+    "oauth_connection" : "Oauth 연결",
+    "password_search" : "비밀번호 찾기",
+    "login_able" : "로그인 가능",
+    "band_ban" : "대역 차단",
+    "band_blocked" : "대역 차단됨",
+    "document_acl" : "문서 ACL",
+    "discussion_acl" : "토론 ACL",
+    "view_acl" : "읽기 ACL",
+    "under_category" : "하위 분류",
+    "count" : "기여 횟수",
+    "alarm" : "알림",
+    "user_document" : "사용자 문서",
+    "user_head" : "사용자 <head>",
+    "user_document_acl" : "사용자 문서 ACL",
+    "encryption_method" : "암호화 방식",
+    "check_key" : "인증키 검사",
+    "reset_user_ok" : "검사 성공",
+    "name_or_ip_or_regex" : "ID or IP or 정규식",
+    "ban_period" : "차단 기간",
+    "not_sure" : "확실하지 않음",
+    "use_push_alarm" : "푸쉬 알림 사용",
+    "edit_button_paragraph" : "문단",
+    "password_change" : "비밀번호 변경",
+    "email_change" : "이메일 변경",
+    "acl_change" : "문서 ACL 변경",
+    "interwiki_list" : "인터위키 목록",
+    "email_filter_list" : "이메일 필터 목록",
+    "id_filter_list" : "ID 필터 목록",
+    "edit_filter_list" : "편집 필터 목록",
+    "file_filter_list" : "파일명 필터 목록",
+    "interwiki_add" : "인터위키 추가",
+    "edit_filter_add" : "편집 필터 추가",
+    "id_filter_add" : "ID 필터 추가",
+    "email_filter_add" : "이메일 필터 추가",
+    "file_filter_add" : "파일명 필터 추가",
+    "setting" : "설정",
+    "restart_required" : "재시작 필요",
+    "oauth_setting" : "OAuth 설정",
+    "adsense_setting" : "애드센스 설정",
+    "adsense_enable" : "애드센스 사용",
+    "skin_setting" : "스킨 설정",
+    "main_setting" : "메인 설정",
+    "text_setting" : "문구 설정",
+    "main_head" : "전역 <head>",
+    "main_body" : "전역 <body>",
+    "wiki_name" : "위키 이름",
+    "wiki_logo" : "위키 로고",
+    "main_page" : "대문",
+    "bottom_text" : "하단 텍스트",
+    "max_file_size" : "파일 최대 파일 크기",
+    "backup_interval" : "백업 주기",
+    "wiki_skin" : "위키 스킨",
+    "default_acl" : "기본 수정 ACL",
+    "default_discussion_acl" : "기본 토론 ACL",
+    "no_register" : "가입불가",
+    "hide_ip" : "IP 숨기기",
+    "wiki_host" : "위키 호스트",
+    "wiki_port" : "위키 포트",
+    "wiki_secret_key" : "위키 비밀키",
+    "email_required" : "이메일 필요",
+    "google_imap_required" : "Google IMAP 설정 필요",
+    "update_branch" : "업데이트를 가져올 브랜치",
+    "register_text" : "회원가입 정책",
+    "non_login_alert" : "비로그인 알림",
+    "edit_bottom_text" : "편집창 하단 문구",
+    "check_key_text" : "인증키 검사 문구",
+    "email_title" : "이메일 제목",
+    "email_text" : "이메일 내용",
+    "email_insert_text" : "이메일 입력란 문구",
+    "password_search_text" : "비밀번호 찾기 문구",
+    "reset_user_text" : "암호 초기화 완료 문구",
+    "recaptcha" : "reCAPTCHA",
+    "google_imap" : "Google IMAP",
+    "google_email" : "Google 이메일",
+    "google_app_password" : "Google 앱 비밀번호",
+    "open_discussion_list" : "열린 토론 목록",
+    "discussion_list" : "토론 목록",
+    "admin_list" : "관리자 목록",
+    "member_list" : "사용자 목록",
+    "authority_use_list" : "권한 사용 목록",
+    "admin_group_list" : "관리자 그룹 목록",
+    "all_document_list" : "모든 문서 목록",
+    "watchlist" : "주시 목록",
+    "acl_document_list" : "ACL 문서 목록",
+    "acl_required" : "ACL 필요",
+    "admin_group_add" : "관리자 그룹 권한 부여",
+    "ban_authority" : "차단 권한",
+    "discussion_authority" : "토론 관리 권한",
+    "user_check_authority" : "사용자 검사 권한",
+    "document_acl_authority" : "문서 ACL 관리 권한",
+    "history_hide_authority" : "역사 숨김 권한",
+    "authorization_authority" : "권한 부여 권한",
+    "owner_authority" : "소유자 권한",
+    "edit_record" : "편집 기록",
+    "discussion_record" : "토론 기록",
+    "edit_button_link" : "링크",
+    "edit_button_footnote" : "각주",
+    "edit_button_macro" : "매크로",
+    "edit_button_color" : "색상",
+    "edit_button_bold" : "강조",
+    "edit_button_strike" : "취소선",
+    "edit_button_big" : "크게",
+    "topic_tool" : "토론 도구",
+    "topic_state" : "토론 상태",
+    "topic_stop" : "토론 중지",
+    "topic_close" : "토론 닫기",
+    "topic_restart" : "토론 중지 해제",
+    "topic_open" : "토론 열기",
+    "topic_agreement" : "토론 합의",
+    "topic_destruction" : "토론 합의 취소",
+    "1_day" : "1일",
+    "5_day" : "5일",
+    "30_day" : "30일",
+    "180_day" : "180일",
+    "360_day" : "360일",
+    "admin_acl" : "관리자만",
+    "member_acl" : "가입자만",
+    "50_edit_acl" : "기여 횟수 총합 50회 이상 가입자만",
+    "all_acl" : "모든 사용자",
+    "email_acl" : "이메일을 가진 유저만",
+    "ie_no_data_required" : "이 기능을 수행하는데 필요한 데이터가 제공되지 않았습니다.",
+    "oauth_settings_not_found" : "관리자가 이 기능을 수행하는데 필요한 데이터를 제공하지 않았습니다.",
+    "oauth_disabled" : "관리자가 이 기능을 비활성화시켰습니다.",
+    "http_warring" : "경고: HTTPS 연결을 사용하지 않는다면 개인정보가 유출될 수 있습니다. 이 사항에 의해 입는 피해는 사용자에게 책임이 있음을 알려드립니다.",
+    "user_head_warring" : "비로그인시 브라우저를 닫거나 로그인시 사용자의 <head>는 삭제됩니다.",
+    "no_login_warring" : "비로그인 상태입니다. 편집시 지금 접속한 IP 명의로 기록됩니다.",
+    "user_reset_sign" : "사용자의 계정 정보가 다음과 같이 변경 되었습니다.",
+    "update_warring" : "최신 버전보다 0.2 버전 이상 낮은 경우 수동 업데이트를 권장 드립니다. 윈도우의 경우 route 폴더의 내용이 사라집니다.",
+    "markup_enabled" : "문법 사용 가능",
+    "update_error" : "자동 업데이트가 지원되지 않습니다.",
+    "inter_error" : "내부 오류.",
+    "authority_error" : "권한이 없습니다.",
+    "no_login_error" : "비로그인 상태입니다.",
+    "no_exist_user_error" : "계정이 존재하지 않습니다.",
+    "no_admin_block_error" : "관리자는 검사, 차단을 수행할 수 없습니다.",
+    "skin_error" : "이 스킨은 설정을 지원하지 않습니다.",
+    "same_id_exist_error" : "이미 같은 이름의 계정이 있습니다.",
+    "long_id_error" : "ID는 20자보다 짧아야 합니다.",
+    "id_char_error" : "오직 한글과 알파벳, 공백만 사용 가능합니다.",
+    "file_exist_error" : "파일이 존재하지 않습니다.",
+    "password_error" : "비밀번호가 다릅니다.",
+    "recaptcha_error" : "'나는 로봇이 아닙니다'를 통해 reCAPTCHA를 수행하세요.",
+    "file_extension_error" : "오직 JPG, GIF, JPEG, PNG, WEBP 만 업로드할 수 있습니다.",
+    "edit_record_error" : "수정 요약은 500자를 넘길 수 없습니다.",
+    "same_file_error" : "똑같은 이름의 파일이 존재합니다.",
+    "file_capacity_error" : "최대 파일 크기 (MB) :",
+    "decument_exist_error" : "이동하려는 이름에 이미 문서가 존재합니다.",
+    "password_diffrent_error" : "입력한 비밀번호와 비밀번호 확인이 서로 다릅니다.",
+    "edit_filter_error" : "편집 필터에 의해 금지된 단어가 사용되었습니다.",
+    "file_name_error" : "파일 이름에는 알파벳, 한글, 공백, 밑줄 과 빼기 기호만 사용할 수 있습니다.",
+    "topic_long_error" : "토론 이름이 256자를 넘지 않아야 합니다.",
+    "email_error" : "이런 이메일을 가진 사용자가 없습니다.",
+    "regex_error" : "정규표현식에 오류가 있습니다.",
+    "decument_404_error" : "이 문서는 존재하지 않습니다."
 }

+ 8 - 2
route/give_acl.py

@@ -39,9 +39,15 @@ def give_acl_2(conn, name):
             curs.execute("update acl set why = ? where title = ?", [flask.request.form.get('why', ''), name])
             curs.execute("update acl set view = ? where title = ?", [view, name])
         else:
-            curs.execute("insert into acl (title, dec, dis, why, view) values (?, ?, ?, ?, ?)", [name, dec, flask.request.form.get('dis', ''), flask.request.form.get('why', ''), view])
+            curs.execute("insert into acl (title, dec, dis, why, view) values (?, ?, ?, ?, ?)", [
+                name, 
+                dec, 
+                flask.request.form.get('dis', ''), 
+                flask.request.form.get('why', ''), 
+                view
+            ])
         
-        curs.execute("select title from acl where title = ? and dec = '' and dis = ''", [name])
+        curs.execute("select title from acl where title = ? and dec = '' and dis = '' and view = ''", [name])
         if curs.fetchall():
             curs.execute("delete from acl where title = ?", [name])
 

+ 15 - 3
route/inter_wiki_plus.py

@@ -12,7 +12,7 @@ def inter_wiki_plus_2(conn, tools, name):
             if admin_check(1, 'edit_filter edit') != 1:
                 return re_error('/error/3')
 
-            if flask.request.form.get('limitless', '') != '':
+            if flask.request.form.get('second', '0') == '0':
                 end = 'X'
             else:
                 end = flask.request.form.get('second', 'X')
@@ -86,11 +86,23 @@ def inter_wiki_plus_2(conn, tools, name):
                 time_check = ''
                 time_data = ''
 
+            t_data = [
+                ['86400', load_lang('1_day')],
+                ['432000‬', load_lang('5_day')],
+                ['2592000', load_lang('30_day')],
+                ['15552000', load_lang('180_day')],
+                ['31104000‬', load_lang('360_day')],
+                ['0', load_lang('limitless')]
+            ]
+            insert_data = ''
+            for i in t_data:
+                insert_data += '<a href="javascript:insert_v(\'second\', \'' + i[0] + '\')">(' + i[1] + ')</a> '
+
             title = load_lang('edit_filter_add')
             form_data = '''
-                <input placeholder="''' + load_lang('second') + '''" name="second" type="text" value="''' + html.escape(time_data) + '''">
+                <script>function insert_v(name, data) { document.getElementById(name).value = data; }</script>''' + insert_data + '''                
                 <hr class=\"main_hr\">
-                <input ''' + stat + ''' type="checkbox" ''' + time_check + ''' name="limitless"> ''' + load_lang('limitless') + '''
+                <input placeholder="''' + load_lang('second') + '''" id="second" name="second" type="text" value="''' + html.escape(time_data) + '''">
                 <hr class=\"main_hr\">
                 <input ''' + stat + ''' placeholder="''' + load_lang('regex') + '''" name="content" value="''' + html.escape(textarea) + '''" type="text">
             '''

+ 26 - 12
route/list_admin_use.py

@@ -9,18 +9,32 @@ def list_admin_use_2(conn):
     else:
         sql_num = 0
 
-    list_data = '<ul>'
+    if flask.request.method == 'POST':
+        return redirect('/admin_log?search=' + flask.request.form.get('search', 'normal'))
+    else:
+        list_data = '<ul>'
+
+        if flask.request.args.get('search', 'normal') == 'normal':
+            curs.execute("select who, what, time from re_admin order by time desc limit ?, '50'", [str(sql_num)])
+        else:
+            curs.execute("select who, what, time from re_admin where what like ? order by time desc limit ?, '50'", [
+                flask.request.args.get('search', 'normal') + "%",
+                str(sql_num)
+            ])
 
-    curs.execute("select who, what, time from re_admin order by time desc limit ?, '50'", [str(sql_num)])
-    get_list = curs.fetchall()
-    for data in get_list:            
-        list_data += '<li>' + ip_pas(data[0]) + ' / ' + data[1] + ' / ' + data[2] + '</li>'
+        get_list = curs.fetchall()
+        for data in get_list:            
+            list_data += '<li>' + ip_pas(data[0]) + ' / ' + data[1] + ' / ' + data[2] + '</li>'
 
-    list_data += '</ul>'
-    list_data += next_fix('/admin_log?num=', num, get_list)
+        list_data += '</ul>'
+        list_data += next_fix('/admin_log?num=', num, get_list)
 
-    return easy_minify(flask.render_template(skin_check(), 
-        imp = [load_lang('authority_use_list'), wiki_set(), custom(), other2([0, 0])],
-        data = list_data,
-        menu = [['other', load_lang('return')]]
-    ))
+        return easy_minify(flask.render_template(skin_check(), 
+            imp = [load_lang('authority_use_list'), wiki_set(), custom(), other2([0, 0])],
+            data = '''
+                <form method="post">
+                    <input name="search" id="admin_log_search"> <button type="submit">''' + load_lang('search') + '''</button>
+                </form>
+            ''' + list_data,
+            menu = [['other', load_lang('return')]]
+        ))

+ 131 - 92
route/setting.py

@@ -30,8 +30,44 @@ def setting_2(conn, num):
             menu = [['manager', load_lang('return')]]
         ))
     elif num == 1:
-        i_list = ['name', 'logo', 'frontpage', 'license', 'upload', 'skin', 'edit', 'reg', 'ip_view', 'back_up', 'port', 'key', 'update', 'email_have', 'discussion', 'encode', 'host']
-        n_list = ['Wiki', '', 'FrontPage', 'CC 0', '2', '', 'normal', '', '', '0', '3000', 'test', 'stable', '', 'normal', 'sha256', '0.0.0.0']
+        i_list = {
+            0 : 'name', 
+            1 : 'logo', 
+            2 : 'frontpage', 
+            3 : 'license', 
+            4 : 'upload', 
+            5 : 'skin', 
+            6 : 'edit', 
+            7 : 'reg', 
+            8 : 'ip_view', 
+            9 : 'back_up', 
+            10 : 'port', 
+            11 : 'key', 
+            12 : 'update', 
+            13 : 'email_have', 
+            14 : 'discussion', 
+            15 : 'encode', 
+            16 : 'host'
+        }
+        n_list = {
+            0 : 'Wiki', 
+            1 : '', 
+            2 : 'FrontPage', 
+            3 : 'CC 0', 
+            4 : '2', 
+            5 : '', 
+            6 : 'normal', 
+            7 : '', 
+            8 : '', 
+            9 : '0', 
+            10 : '3000', 
+            11 : 'test', 
+            12 : 'stable', 
+            13 : '', 
+            14 : 'normal', 
+            15 : 'sha3', 
+            16 : '0.0.0.0'
+        }
         
         if flask.request.method == 'POST':
             i = 0
@@ -194,7 +230,10 @@ def setting_2(conn, num):
         ]
         if flask.request.method == 'POST':
             for i in i_list:
-                curs.execute("update other set data = ? where name = ?", [flask.request.form.get(i, ''), i])
+                curs.execute("update other set data = ? where name = ?", [
+                    flask.request.form.get(i, ''), 
+                    i
+                ])
 
             conn.commit()
             
@@ -202,68 +241,63 @@ def setting_2(conn, num):
 
             return redirect('/setting/2')
         else:
-            n_list = ['', '', '', '', '', '', '', '', '']
             d_list = []
             
-            x = 0
-            
             for i in i_list:
                 curs.execute('select data from other where name = ?', [i])
                 sql_d = curs.fetchall()
                 if sql_d:
                     d_list += [sql_d[0][0]]
                 else:
-                    curs.execute('insert into other (name, data) values (?, ?)', [i, n_list[x]])
+                    curs.execute('insert into other (name, data) values (?, ?)', [i, ''])
                     
-                    d_list += [n_list[x]]
-
-                x += 1
+                    d_list += ['']
 
             conn.commit()
 
             return easy_minify(flask.render_template(skin_check(), 
                 imp = [load_lang('text_setting'), wiki_set(), custom(), other2([0, 0])],
-                data =  '''
-                        <form method="post">
-                            <span>''' + load_lang('register_text') + ''' (HTML)</span>
-                            <hr class=\"main_hr\">
-                            <input type="text" name="contract" value="''' + html.escape(d_list[0]) + '''">
-                            <hr class=\"main_hr\">
-                            <span>''' + load_lang('non_login_alert') + ''' (HTML)</span>
-                            <hr class=\"main_hr\">
-                            <input type="text" name="no_login_warring" value="''' + html.escape(d_list[1]) + '''">
-                            <hr class=\"main_hr\">
-                            <span>''' + load_lang('edit_bottom_text') + ''' (HTML)</span>
-                            <hr class=\"main_hr\">
-                            <input type="text" name="edit_bottom_text" value="''' + html.escape(d_list[2]) + '''">
-                            <hr class=\"main_hr\">
-                            <span>''' + load_lang('check_key_text') + ''' (HTML)</span>
-                            <hr class=\"main_hr\">
-                            <input type="text" name="check_key_text" value="''' + html.escape(d_list[3]) + '''">
-                            <hr class=\"main_hr\">
-                            <span>''' + load_lang('email_title') + '''</span>
-                            <hr class=\"main_hr\">
-                            <input type="text" name="email_title" value="''' + html.escape(d_list[4]) + '''">
-                            <hr class=\"main_hr\">
-                            <span>''' + load_lang('email_text') + '''</span>
-                            <hr class=\"main_hr\">
-                            <input type="text" name="email_text" value="''' + html.escape(d_list[5]) + '''">
-                            <hr class=\"main_hr\">
-                            <span>''' + load_lang('email_insert_text') + '''</span>
-                            <hr class=\"main_hr\">
-                            <input type="text" name="email_insert_text" value="''' + html.escape(d_list[6]) + '''">
-                            <hr class=\"main_hr\">
-                            <span>''' + load_lang('password_search_text') + '''</span>
-                            <hr class=\"main_hr\">
-                            <input type="text" name="password_search_text" value="''' + html.escape(d_list[7]) + '''">
-                            <hr class=\"main_hr\">
-                            <span>''' + load_lang('reset_user_text') + '''</span>
-                            <hr class=\"main_hr\">
-                            <input type="text" name="reset_user_text" value="''' + html.escape(d_list[8]) + '''">
-                            <hr class=\"main_hr\">
-                            <button id="save" type="submit">''' + load_lang('save') + '''</button>
-                        </form>
-                        ''',
+                data = '''
+                    <form method="post">
+                        <span>''' + load_lang('register_text') + ''' (HTML)</span>
+                        <hr class=\"main_hr\">
+                        <input name="''' + i_list[0] + '''" value="''' + html.escape(d_list[0]) + '''">
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('non_login_alert') + ''' (HTML)</span>
+                        <hr class=\"main_hr\">
+                        <input name="''' + i_list[1] + '''" value="''' + html.escape(d_list[1]) + '''">
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('edit_bottom_text') + ''' (HTML)</span>
+                        <hr class=\"main_hr\">
+                        <input name="''' + i_list[2] + '''" value="''' + html.escape(d_list[2]) + '''">
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('check_key_text') + ''' (HTML)</span>
+                        <hr class=\"main_hr\">
+                        <input name="''' + i_list[3] + '''" value="''' + html.escape(d_list[3]) + '''">
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('email_title') + '''</span>
+                        <hr class=\"main_hr\">
+                        <input name="''' + i_list[4] + '''" value="''' + html.escape(d_list[4]) + '''">
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('email_text') + '''</span>
+                        <hr class=\"main_hr\">
+                        <input name="''' + i_list[5] + '''" value="''' + html.escape(d_list[5]) + '''">
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('email_insert_text') + '''</span>
+                        <hr class=\"main_hr\">
+                        <input name="''' + i_list[6] + '''" value="''' + html.escape(d_list[6]) + '''">
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('password_search_text') + '''</span>
+                        <hr class=\"main_hr\">
+                        <input name="''' + i_list[7] + '''" value="''' + html.escape(d_list[7]) + '''">
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('reset_user_text') + '''</span>
+                        <hr class=\"main_hr\">
+                        <input name="''' + i_list[8] + '''" value="''' + html.escape(d_list[8]) + '''">
+                        <hr class=\"main_hr\">
+                        <button id="save" type="submit">''' + load_lang('save') + '''</button>
+                    </form>
+                ''',
                 menu = [['setting', load_lang('return')]]
             ))
     elif num == 3 or num == 4:
@@ -304,11 +338,12 @@ def setting_2(conn, num):
                 curs.execute("select data from other where name = 'head' and coverage = ?", [flask.request.args.get('skin', '')])
                 title = '_head'
                 start = '<a href="?">(' + load_lang('all') + ')</a> ' + \
-                        ' '.join(['<a href="?skin=' + i + '">(' + i + ')</a>' for i in load_skin('', 1)]) + \
-                        '''
-                            <hr class=\"main_hr\">
-                            <span>&lt;style&gt;CSS&lt;/style&gt;<br>&lt;script&gt;JS&lt;/script&gt;</span><hr class=\"main_hr\">
-                        '''
+                ' '.join(['<a href="?skin=' + i + '">(' + i + ')</a>' for i in load_skin('', 1)]) + \
+                '''
+                    <hr class=\"main_hr\">
+                    <span>&lt;style&gt;CSS&lt;/style&gt;<br>&lt;script&gt;JS&lt;/script&gt;</span>
+                    <hr class=\"main_hr\">
+                '''
                 
             head = curs.fetchall()
             if head:
@@ -362,19 +397,24 @@ def setting_2(conn, num):
 
             return easy_minify(flask.render_template(skin_check(), 
                 imp = ['robots.txt', wiki_set(), custom(), other2([0, 0])],
-                data =  '''
-                        <a href="/robots.txt">(view)</a>
-                        <hr class=\"main_hr\">
-                        <form method="post">
-                            <textarea rows="25" name="content">''' + html.escape(data) + '''</textarea>
-                            <hr class=\"main_hr\">
-                            <button id="save" type="submit">''' + load_lang('save') + '''</button>
-                        </form>
-                        ''',
+                data = '''
+                    <a href="/robots.txt">(view)</a>
+                    <hr class=\"main_hr\">
+                    <form method="post">
+                        <textarea rows="25" name="content">''' + html.escape(data) + '''</textarea>
+                        <hr class=\"main_hr\">
+                        <button id="save" type="submit">''' + load_lang('save') + '''</button>
+                    </form>
+                ''',
                 menu = [['setting', load_lang('return')]]
             ))
     elif num == 6:
-        i_list = ['recaptcha', 'sec_re', 'g_email', 'g_pass']
+        i_list = [
+            'recaptcha', 
+            'sec_re', 
+            'g_email', 
+            'g_pass'
+        ]
 
         if flask.request.method == 'POST':
             for data in i_list:
@@ -391,7 +431,6 @@ def setting_2(conn, num):
 
             return redirect('/setting/6')
         else:
-            n_list = ['', '', '', '']
             d_list = []
             
             x = 0
@@ -402,9 +441,9 @@ def setting_2(conn, num):
                 if sql_d:
                     d_list += [sql_d[0][0]]
                 else:
-                    curs.execute('insert into other (name, data) values (?, ?)', [i, n_list[x]])
+                    curs.execute('insert into other (name, data) values (?, ?)', [i, ''])
                     
-                    d_list += [n_list[x]]
+                    d_list += ['']
 
                 x += 1
 
@@ -412,29 +451,29 @@ def setting_2(conn, num):
 
             return easy_minify(flask.render_template(skin_check(), 
                 imp = ['Google', wiki_set(), custom(), other2([0, 0])],
-                data =  '''
-                        <form method="post">
-                            <h2><a href="https://www.google.com/recaptcha/admin">recaptcha</a></h2>
-                            <span>''' + load_lang('recaptcha') + ''' (HTML)</span>
-                            <hr class=\"main_hr\">
-                            <input placeholder="''' + load_lang('recaptcha') + ''' (HTML)" type="text" name="recaptcha" value="''' + html.escape(d_list[0]) + '''">
-                            <hr class=\"main_hr\">
-                            <span>''' + load_lang('recaptcha') + ' (' + load_lang('secret_key') + ''')</span>
-                            <hr class=\"main_hr\">
-                            <input placeholder="''' + load_lang('recaptcha') + ' (' + load_lang('secret_key') + ''')" type="text" name="sec_re" value="''' + html.escape(d_list[1]) + '''">
-                            <hr class=\"main_hr\">
-                            <h2><a href="https://support.google.com/mail/answer/7126229">''' + load_lang('google_imap') + '</a> {' + load_lang('restart_required') + '''}</h1>
-                            <span>''' + load_lang('google_email') + '''</span>
-                            <hr class=\"main_hr\">
-                            <input placeholder="''' + load_lang('google_email') + '''" type="text" name="g_email" value="''' + html.escape(d_list[2]) + '''">
-                            <hr class=\"main_hr\">
-                            <span><a href="https://security.google.com/settings/security/apppasswords">''' + load_lang('google_app_password') + '''</a></span>
-                            <hr class=\"main_hr\">
-                            <input placeholder="''' + load_lang('google_app_password') + '''" type="password" name="g_pass" value="''' + html.escape(d_list[3]) + '''">
-                            <hr class=\"main_hr\">
-                            <button id="save" type="submit">''' + load_lang('save') + '''</button>
-                        </form>
-                        ''',
+                data = '''
+                    <form method="post">
+                        <h2><a href="https://www.google.com/recaptcha/admin">recaptcha</a></h2>
+                        <span>''' + load_lang('recaptcha') + ''' (HTML)</span>
+                        <hr class=\"main_hr\">
+                        <input name="recaptcha" value="''' + html.escape(d_list[0]) + '''">
+                        <hr class=\"main_hr\">
+                        <span>''' + load_lang('recaptcha') + ' (' + load_lang('secret_key') + ''')</span>
+                        <hr class=\"main_hr\">
+                        <input name="sec_re" value="''' + html.escape(d_list[1]) + '''">
+                        <hr class=\"main_hr\">
+                        <h2><a href="https://support.google.com/mail/answer/7126229">''' + load_lang('google_imap') + '</a> {' + load_lang('restart_required') + '''}</h1>
+                        <span>''' + load_lang('google_email') + '''</span>
+                        <hr class=\"main_hr\">
+                        <input name="g_email" value="''' + html.escape(d_list[2]) + '''">
+                        <hr class=\"main_hr\">
+                        <span><a href="https://security.google.com/settings/security/apppasswords">''' + load_lang('google_app_password') + '''</a></span>
+                        <hr class=\"main_hr\">
+                        <input type="password" name="g_pass" value="''' + html.escape(d_list[3]) + '''">
+                        <hr class=\"main_hr\">
+                        <button id="save" type="submit">''' + load_lang('save') + '''</button>
+                    </form>
+                ''',
                 menu = [['setting', load_lang('return')]]
             ))
     else:

+ 5 - 2
route/tool/func.py

@@ -155,7 +155,10 @@ def render_set(title = '', data = '', num = 0, s_data = 0):
     elif s_data == 1:
         return data
     else:
-        return namumark(title, data, num)
+        if data != None:
+            return namumark(title, data, num)
+        else:
+            return 'HTTP Request 404'
 
 def captcha_get():
     data = ''
@@ -1163,6 +1166,6 @@ def re_error(data):
                 imp = [load_lang('error'), wiki_set(1), custom(), other2([0, 0])],
                 data = '<h2>' + load_lang('error') + '</h2><ul><li>' + data + '</li></ul>',
                 menu = 0
-            ))
+            )), 401
         else:
             return redirect('/')

+ 23 - 26
route/tool/mark.py

@@ -40,32 +40,29 @@ def plusing(data):
             curs.execute("insert into back (title, link, type) values (?, ?, ?)", [data_in[1], data_in[0], data_in[2]])
 
 def namumark(title = '', data = None, num = 0):
-    if data != None:
-        curs.execute('select data from other where name = "markup"')
-        rep_data = curs.fetchall()
-        if rep_data[0][0] == 'namumark':
-            data = namu(conn, data, title, num)
-        else:
-            data = ['', '', []]
+    curs.execute('select data from other where name = "markup"')
+    rep_data = curs.fetchall()
+    if rep_data[0][0] == 'namumark':
+        data = namu(conn, data, title, num)
+    else:
+        data = ['', '', []]
 
-        if num == 1:
-            data_num = len(data[2]) 
-            data_in_num = int(data_num / multiprocessing.cpu_count())
-            data_in = []
+    if num == 1:
+        data_num = len(data[2]) 
+        data_in_num = int(data_num / multiprocessing.cpu_count())
+        data_in = []
 
-            for i in range(multiprocessing.cpu_count()):
-                if i != multiprocessing.cpu_count() - 1:
-                    data_in += [data[2][data_in_num * i:data_in_num * (i + 1)]]
-                else:
-                    data_in += [data[2][data_in_num * i:]]
+        for i in range(multiprocessing.cpu_count()):
+            if i != multiprocessing.cpu_count() - 1:
+                data_in += [data[2][data_in_num * i:data_in_num * (i + 1)]]
+            else:
+                data_in += [data[2][data_in_num * i:]]
 
-            for data_in_for in data_in:
-                thread_start = threading.Thread(target = plusing, args = [data_in_for])
-                thread_start.start()
-                thread_start.join()
-            
-            conn.commit()
-            
-        return data[0] + data[1]
-    else:
-        return 'HTTP Request 404'
+        for data_in_for in data_in:
+            thread_start = threading.Thread(target = plusing, args = [data_in_for])
+            thread_start.start()
+            thread_start.join()
+        
+        conn.commit()
+        
+    return data[0] + data[1]

+ 12 - 15
route/tool/set_mark/namu.py

@@ -114,8 +114,6 @@ def table_parser(data, cel_data, start_data, num = 0):
     return [all_table, row_style, cel_style, row, cel, table_class, num]
     
 def table_start(data):
-    data = re.sub('\|\|\n(?P<in>(?:(?:(?:(?!\|\|).)+)\n?)+)\n\|\|', '|| \n\g<in> ||', data)
-
     while 1:
         table = re.search('\n((?:(?:(?:(?:\|\|)+(?:(?:(?!\|\|).(?:\n)*)*))+)\|\|(?:\n)?)+)', data)
         if table:
@@ -454,7 +452,7 @@ def namu(conn, data, title, main_num):
     data = re.sub('&amp;', '&', data)
 
     data = re.sub('\n( +)\|\|', '\n||', data)
-    data = re.sub('\|\|( +)\n', '|| \n', data)
+    data = re.sub('\|\|( +)\n', '||\n', data)
 
     data = re.sub('\n##(((?!\n).)+)', '', data)
            
@@ -510,13 +508,6 @@ def namu(conn, data, title, main_num):
         else:
             break
 
-    while 1:
-        hr = re.search('\n-{4,9}\n', data)
-        if hr:
-            data = re.sub('\n-{4,9}\n', '\n<hr>\n', data, 1)
-        else:
-            break
-
     data += '\n'
 
     data = data.replace('\\', '&#92;')
@@ -708,6 +699,13 @@ def namu(conn, data, title, main_num):
         else:
             break
 
+    while 1:
+        hr = re.search('\n-{4,9}\n', data)
+        if hr:
+            data = re.sub('\n-{4,9}\n', '\n<hr>\n', data, 1)
+        else:
+            break
+
     data = re.sub('(?P<in>\n +\* ?(?:(?:(?!\|\|).)+))\|\|', '\g<in>\n ||', data)
 
     while 1:
@@ -747,7 +745,7 @@ def namu(conn, data, title, main_num):
 
     data = table_start(data)
 
-    category = '\n<hr><div id="cate">Category : '
+    category = '\n<div id="cate_all"><hr><div id="cate">Category : '
     category_re = re.compile('^(?:category|분류):', re.I)
     while 1:
         link = re.search('\[\[((?:(?!\[\[|\]\]).)+)\]\]', data)
@@ -834,7 +832,7 @@ def namu(conn, data, title, main_num):
 
                 backlink += [[title, main_link, 'cat']]
 
-                category += '<a ' + link_id + ' href="' + tool.url_pas(main_link) + '">' + category_re.sub('', see_link) + '</a> / '
+                category += '<a ' + link_id + ' href="' + tool.url_pas(main_link) + '">' + category_re.sub('', 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)
@@ -982,10 +980,9 @@ def namu(conn, data, title, main_num):
 
     data = re.sub('\n$', footdata_all, data + '\n', 1)
 
-    category += '</div>'
-    category = re.sub(' / <\/div>$', '</div>', category)
+    category += '</div></div>'
 
-    if category == '\n<hr><div id="cate">Category : </div>':
+    if category == '\n<div id="cate_all"><hr><div id="cate">Category : </div></div>':
         category = ''
 
     data += category

+ 8 - 6
route/view_read.py

@@ -3,7 +3,6 @@ from .tool.func import *
 def view_read_2(conn, name):
     curs = conn.cursor()
 
-    data_none = 0
     sub = ''
     acl = ''
     div = ''
@@ -75,10 +74,7 @@ def view_read_2(conn, name):
     data = curs.fetchall()
     if data:
         else_data = data[0][1]
-        response_data = 200
     else:
-        data_none = 1
-        response_data = 404
         else_data = None
 
     m = re.search("^user:([^/]*)", name)
@@ -111,6 +107,12 @@ def view_read_2(conn, name):
 
     if end_data == 'HTTP Request 401.3':
         response_data = 401
+        end_data = '<h2>' + load_lang('error') + '</h2><ul><li>' + load_lang('authority_error') + '</li></ul>'
+    elif end_data == 'HTTP Request 404':
+        response_data = 404
+        end_data = '<h2>' + load_lang('error') + '</h2><ul><li>' + load_lang('decument_404_error') + '</li></ul>'
+    else:
+        response_data = 200
     
     if num:
         menu = [['history/' + url_pas(name), load_lang('history')]]
@@ -118,7 +120,7 @@ def view_read_2(conn, name):
         acl = ''
         r_date = 0
     else:
-        if data_none == 1:
+        if response_data == 404:
             menu = [['edit/' + url_pas(name), load_lang('create')]]
         else:
             menu = [['edit/' + url_pas(name), load_lang('edit')]]
@@ -165,7 +167,7 @@ def view_read_2(conn, name):
         div = body[0][0] + '<hr class=\"main_hr\">' + div
     
     div = adsense_code + '<div>' + div + '</div>'
-    
+
     return easy_minify(flask.render_template(skin_check(), 
         imp = [flask.request.args.get('show', name), wiki_set(), custom(), other2([sub + acl, r_date])],
         data = div,

+ 1 - 1
version.json

@@ -1,6 +1,6 @@
 {
     "master" : {
-        "r_ver" : "v3.1.1-stable-01",
+        "r_ver" : "v3.1.2-master-01",
         "c_ver" : "400001",
         "s_ver" : "2"
     }, "stable" : {

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

@@ -36,4 +36,5 @@ hr.main_hr { border: none; }
 #include_link { display: none; }
 .foot_plus { background: gainsboro; }
 #toc_title { font-size: 18px; }
-blockquote { background-image: url(/views/acme/img/quote.png); background-position: calc(100% - 10px) 10px; background-repeat: no-repeat; background-size: 25px; }
+blockquote { background-image: url(/views/acme/img/quote.png); background-position: calc(100% - 10px) 10px; background-repeat: no-repeat; background-size: 25px; }
+#admin_log_search { width: 100px; }