# -*- coding: cp949 -*- import codeshift class interface_base: ''' 기본 인터페이스 클래스 CLI 기반의 쉘을 제외한 모든 사용자 인터페이스는 본 클래스를 상속받아 구현됩니다. CLI로 키 입력, 명령 확인, 입력값 검사 등의 절차를 간결히 구현하는 것이 목적입니다. 하나의 입력 절차를 하나의 클래스로 정의합니다. ''' def before_loop(self): ''' 메뉴 핸들러 루프 진입 전에 단 한 번 불리는 함수 ''' pass def after_loop(self): ''' 메뉴 핸들러 루프 탈출 후 단 한 번 불리는 함수 ''' pass def menuhandler(self, menustr, commands, callbacks): ''' 메뉴 핸들러 함수 표준 입력으로부터 한 줄을 입력 받아, 입력받은 문자열을 공백 기준으로 분해해 리스트로 만든다. 첫번째 리스트 원소가 '명령'이고, 나머지는 '인자 목록'이 된다. 인자 목록은 None이 될 수 있다. Args menustr: 표준 출력으로 출력될 문자열. 메뉴에 대한 설명을 적을 수 있다. commands: 핸들러가 처리할 명령어 목록들. 반드시 리스트 형으로 입력. 명령어는 한번에 2개 이상을 입력할 수 없다. 매직 워드인 '*' 문자를 사용할 수 있으며, 이는 입력된 어떤 명령과도 매치될 수 있다. 그러므로 매직 워드는 보통 리스트의 가장 마지막 원소로 두는 것이 좋다. 리스트의 길이는 callback 인자의 리스트 수와 일치해야 한다. 길이는 0이 될 수 없다. callbacks: 핸들러 함수의 목록. 반드시 리스트 형으로 입력하여야 한다. 콜백 함수는 하나의 인자를 입력받는다. 이 인자는 특정 명령어에 매칭되어 실행된 경우 입력된 인자의 목록이 되며, 매직 워드와 매칭되어 실행된 경우라면 입력한 문자열이 된다. 콜백 함수는 반드시 True나 False 중 하나를 리턴해야 한다. Returns 콜백 함수의 리턴값(True/False). 보통 이 값을 이용해 상속받은 클래스에서 다음 단계로 넘어갈지, 아니면 다시 처음부터 입력 절차를 밟을지를 결정한다. Raises 일반 예외. 인자인 commands와 callbacks가 리스트가 아닌경우, 리스트라도 길이가 0인 경우나 서로의 길이가 일치하지 않을 경우 일어난다. ''' if type(commands) != list or type(callbacks) != list: raise Exception(u'consolemenu error. \'commands\' and \'callbacks\' should be list types.') if len(commands) != len(callbacks): raise Exception(u'consolemenu error. Length of two lists are not the same.') if len(commands) == 0: raise Exception(u'consolemenu error. Zero-length list') self.before_loop() # the loop while True: print menustr, str = codeshift.loc2uni(raw_input()) inp = str.split() if len(inp) == 0: for i in xrange(len(commands)): if commands[i] == u'*': return callbacks[i](str) else: cmd = inp[0] args = None if len(inp) > 1: args = inp[1:] for i in xrange(len(commands)): if commands[i] == u'*': return callbacks[i](str) elif cmd == commands[i]: return callbacks[i](args) print self.nocmd_msg % str self.after_loop() ''' 인터페이스가 최종적으로 상위 모듈에게 전하는 응답 ''' __response = 0 ''' 사용자가 입력한 명령이 명령어 리스트에 존재하지 않을 때 출력하는 메시지 ''' nocmd_msg = u'command \'%s\' is not in the command list.'