File indexing completed on 2024-05-12 17:18:06
0001 # -*- coding: UTF-8 -* 0002 0003 """ 0004 Rules with dynamically generated regex. Some rules are adopted from ko-po-check. 0005 0006 @author: Shinjo Park <kde@peremen.name> 0007 @original-author: Changwoo Ryu <cwryu@debian.org> 0008 @license: GPLv3+ 0009 """ 0010 0011 import re 0012 0013 from pology import datadir, _, n_ 0014 from pology.diff import adapt_spans 0015 0016 PLURAL_JOSA_RE = r'(도|로|만|에|은|을|이|의)' 0017 # 많이 등장하는 명사만 쓴다 0018 PLURAL_NOUN_RE = r'(값|개발자|것|기능|기술|그림|글자|답변|디렉터리|메시지|' \ 0019 r'문서|문자|분|사람|사진|설정|언어|점|질문|파일|팀|패키지|' \ 0020 r'폴더|프로그램|플러그인|항목|활동)' 0021 PLURAL_EXCEPT = r'(핸들|번들)' + PLURAL_JOSA_RE 0022 0023 PLURAL_R = re.compile(r'(' + 0024 r'[가-힣]+\(들\)' + r'|' + 0025 PLURAL_NOUN_RE + r'들' + r'|' + 0026 r'[가-힣]+들' + PLURAL_JOSA_RE + r'\s' + r')', re.UNICODE) 0027 PLURAL_EXCLUDE = re.compile(PLURAL_EXCEPT, re.UNICODE) 0028 0029 def redundant_plural (msgstr, msg, cat): 0030 """ 0031 불필요한 복수형 표현을 검사한다. 0032 0033 임의의 복수형 표현을 찾아내기는 매우 힘들다. 다음 휴리스틱으로만 검사. 0034 (0) (들)이라고 쓰여진 경우 0035 (1) 일단 알려진 명사에 대한 복수형태를 찾고 0036 (2) 들+조사 형태로 끝나는 경우를 찾는다 0037 0038 @return: type V3C hook 0039 @rtype: C{(msgstr, msg, cat) -> spans} 0040 """ 0041 0042 return check(PLURAL_R, PLURAL_EXCLUDE, msgstr, msg, cat, u"Unnecessary plural '%(match)s'.") 0043 0044 SYLLABLE_WITH_T_RIEUL = '[%s]' % ''.join([chr(c) for c in 0045 range(0xAC00 + 8, 0xD7A4, 28)]) 0046 SYLLABLE_WITH_T_SSANGSIOS = '[%s]' % \ 0047 ''.join([chr(c) for c in 0048 range(0xAC00 + 0x14, 0xD7A4, 28)]) 0049 GEOSIPNIDA_R = re.compile('\S+' + SYLLABLE_WITH_T_RIEUL + u' 것입니다') 0050 # 과거형인 "-했을 것입니다"는 예외 0051 GEOSIPNIDA_EXCLUDE = re.compile('\S+' + SYLLABLE_WITH_T_SSANGSIOS + u'을 것입니다') 0052 0053 def hal_geosipnida (msgstr, msg, cat): 0054 """ 0055 ...할 것입니다 0056 0057 @return: type V3C hook 0058 @rtype: C{(msgstr, msg, cat) -> spans} 0059 """ 0060 0061 return check(GEOSIPNIDA_R, GEOSIPNIDA_EXCLUDE, msgstr, msg, cat, "Try to revise '%(match)s'.") 0062 0063 def check(r, exclude, msgstr, msg, cat, errmsg): 0064 0065 spans = [] 0066 matches = list(r.finditer(msgstr)) 0067 for m in matches: 0068 p1, p2 = m.span() 0069 if exclude and exclude.match(msgstr[p1:p2].strip()): 0070 continue 0071 spans.append((p1, p2, _(u"@info", errmsg, match=msgstr[p1:p2].strip()))) 0072 0073 return spans