File indexing completed on 2024-05-12 05:47:02

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