#!/usr/bin/python3 # -*- Mode: python -*- # -*- coding: utf-8 -*- import sys import os import getopt filterenable = {} SHORT_OPTIONS = "" LONG_OPTIONS = ['help', 'version', 'filters=', 'list'] # processing the command line options try: options, args = getopt.getopt(sys.argv[1:], SHORT_OPTIONS, LONG_OPTIONS) except getopt.GetoptError as msg: print("%s: %s" % (sys.argv[0], msg)) sys.exit(1) option_help = 0 option_version = 0 option_list = 0 for (opt, val) in options: if opt == '--help': option_help = 1 elif opt == '--version': option_version = 1 elif opt == '--filters': for m in val.split(','): filterenable[m] = 1 elif opt == '--list': option_list = 1 if not args: fn = '-' from KPC import poparse, checks if (option_help): helpmsg = [ 'Usage: ko-po-check [옵션]... [파일]...<', ' --help 이 도움말을 표시하고 끝납니다', ' --version 버전 정보를 표시하고 끝납니다', ' --filters=.. 필터 직접 지정 (디버깅용)', ' --list 필터 목록을 표시합니다 (디버깅용)', '', ' 파일이 `-\'이거나 파일이 주어지지 않은 경우 표준 입력에서 읽습니다.' ] for l in helpmsg: print(l) sys.exit(1) if (option_version): from KPC.config import VERSION print(('ko-po-check %s' % VERSION)) sys.exit(0) import glob filenames = glob.glob(os.sep.join(checks.__path__ + ['*', '*.py'])) filters = {} for filename in filenames: if not filename.split(os.sep)[-1].startswith('_'): f = {} exec(compile(open(filename, 'rb').read(), filename, 'exec'), f) if filterenable: if f['name'] in filterenable: filters[f['name']] = f else: filters[f['name']] = f if option_list: for name in sorted(filters.keys()): try: print("%s: %s" % (name, filters[name]['description'])) except: print('BUG: "%s"에 description 필드가 없습니다' % name) sys.exit(0) retval = 0 for fn in args: if fn == '-': fp = sys.stdin else: fp = open(fn) try: catalog = poparse.parse_file(fp) except poparse.ParseError as err: print(('%s:%d: 파싱 오류' % (fn, err.lineno))) sys.exit(1) if fn != '-': fp.close() active_keys = filters.keys() filtercontext = {} if len(catalog.entries) > 0 and catalog.entries[0].msgid == '': entry = catalog.entries[0] for filtername in filters.keys(): try: checker = filters[filtername]['checker'] filtercontext[filtername] = checker._get_context(entry) except KeyError: print('BUG: "%s"에 checker 필드가 없습니다' % filtername) for entry in catalog.entries: if (not entry.is_translated()): continue for filtername in sorted(filters.keys()): try: checker = filters[filtername]['checker'] except KeyError: print('BUG: "%s"에 checker 필드가 없습니다' % filtername) errors = checker._check(entry, filtercontext[filtername]) for e in errors: print(('%s:%d: %s' % (fn, entry.msgstr_lineno, e.message))) sys.exit(retval)