# Path: KPC/classes.py
# class Error:
#     '''An individual error from a check against an entry. One check
#     usually returns list of errors or empty list if there's no error.
#     '''
#     SUCCESS = 0
#     DEPRECATED = 1
#     WARNING = 2
#     ERROR = 3
# 
#     def __init__(self, message):
#         self.pos = 0
#         self.level = Error.ERROR
#         self.message = message
# 
# class BaseCheck:
#     '''Base class to check an entry from PO files. Subclasses should
#     implement check() function. check() returns list of errors if any.
#     '''
#     def _get_context(self, entry):
#         if not hasattr(self, 'get_context'):
#             return {}
#         fields = {}
#         # parse msgstr
#         for line in entry.msgstr.split('\n'):
#             try:
#                 k, v = line.split(': ', 1)
#                 fields[k] = v
#             except ValueError:
#                 pass
#         return self.get_context(entry, fields)
# 
#     def _check(self, entry, context):
#         return self.check(entry, context)


import re
from KPC.classes import Error, BaseCheck
        're':    re.compile('((?<!모)읍니다)'),
        'error': '\"%s\": \'읍니다\'가 아니라 \'습니다\'입니다'
    },
    {
        're':    re.compile('([^\s]+슴)([\s\.\,\?]|$)'),
        'func':  test_noun_suffix,
        'error': '\"%s\": \'슴\'이 아니라 \'음\'입니다'
    },
    {
        're':    re.compile('('+verbs_re+'수(가|도|는)?\s'+')'),
        'error': '\"%s\": 의존 명사는 띄어 써야 합니다'
    },
    {
        're':    re.compile('('+verbs_re+'\s*수(있|없)'+')'),
        'error': '\"%s\": 의존 명사는 띄어 써야 합니다'
    },
    {
        're':    re.compile('('+verbs_re+'때(가|도|는)?\s'+')'),
        'error': '\"%s\": \'~할 때\'라고 띄어 써야 합니다'
    },
    {
        're':    re.compile('(' + eul_verbs_re + ' 지' + '(?:$|\.| 여부))'),
        'error': '\"%s\": 의문을 나타내는 \'~ㄹ지\'는 어미이므로 붙여 써야 합니다'
    },
    {
        're':    re.compile('([0-9A-Za-z-+\`\'\"\u2019\u201D()%_]+ ' +
                            josa_re + ')(?:$|\s)'),
        'error': '\"%s\": 조사는 체언에 붙여 써야 합니다'
    },
    {

# Path: KPC/classes.py
# class Error:
#     '''An individual error from a check against an entry. One check
#     usually returns list of errors or empty list if there's no error.
#     '''
#     SUCCESS = 0
#     DEPRECATED = 1
#     WARNING = 2
#     ERROR = 3
# 
#     def __init__(self, message):
#         self.pos = 0
#         self.level = Error.ERROR
#         self.message = message
# 
# class BaseCheck:
#     '''Base class to check an entry from PO files. Subclasses should
#     implement check() function. check() returns list of errors if any.
#     '''
#     def _get_context(self, entry):
#         if not hasattr(self, 'get_context'):
#             return {}
#         fields = {}
#         # parse msgstr
#         for line in entry.msgstr.split('\n'):
#             try:
#                 k, v = line.split(': ', 1)
#                 fields[k] = v
#             except ValueError:
#                 pass
#         return self.get_context(entry, fields)
# 
#     def _check(self, entry, context):
#         return self.check(entry, context)


# Path: KPC/checks/language/spell.py
import re
from KPC.classes import Error, BaseCheck

        're':    re.compile('((?<!모)읍니다)'),
        'error': '\"%s\": \'읍니다\'가 아니라 \'습니다\'입니다'
    },
    {
        're':    re.compile('([^\s]+슴)([\s\.\,\?]|$)'),
        'func':  test_noun_suffix,
        'error': '\"%s\": \'슴\'이 아니라 \'음\'입니다'
    },
    {
        're':    re.compile('('+verbs_re+'수(가|도|는)?\s'+')'),
        'error': '\"%s\": 의존 명사는 띄어 써야 합니다'
    },
    {
        're':    re.compile('('+verbs_re+'\s*수(있|없)'+')'),
        'error': '\"%s\": 의존 명사는 띄어 써야 합니다'
    },
    {
        're':    re.compile('('+verbs_re+'때(가|도|는)?\s'+')'),
        'error': '\"%s\": \'~할 때\'라고 띄어 써야 합니다'
    },
    {
        're':    re.compile('(' + eul_verbs_re + ' 지' + '(?:$|\.| 여부))'),
        'error': '\"%s\": 의문을 나타내는 \'~ㄹ지\'는 어미이므로 붙여 써야 합니다'
    },
    {
        're':    re.compile('([0-9A-Za-z-+\`\'\"\u2019\u201D()%_]+ ' +
                            josa_re + ')(?:$|\s)'),
        'error': '\"%s\": 조사는 체언에 붙여 써야 합니다'
    },
    {

        're':    re.compile('((?:' + c_format + '|[0-9]+) ' + unit_re + ')' +