본문 바로가기
아래아한글 자동화/pyhwpx 사용법

스크립트매크로를 파이썬 함수로 고쳐주는 함수 #clipboard_to_pyfunc()

by 일코 2023. 11. 30.

자동화 작업을 하다 보면,

한/글 API에 나와 있지 않은 기능을 스크립트매크로로 녹화해서
파이썬 함수로 변환하려고 하는데,
매크로 자체가 너무 길고 복잡할 때가 있어요.

예를 들어, 아래는 "찾아바꾸기"를 녹화한 스크립트매크로예요.

function OnScriptMacro_중국어1성()
{
	HAction.GetDefault("AllReplace", HParameterSet.HFindReplace.HSet);
	with (HParameterSet.HFindReplace)
	{
		MatchCase = 0;
		AllWordForms = 0;
		SeveralWords = 0;
		UseWildCards = 0;
		WholeWordOnly = 0;
		AutoSpell = 1;
		Direction = FindDir("Forward");
		IgnoreFindString = 0;
		IgnoreReplaceString = 0;
		FindString = "ㅁㄴㅇㄹ";
		ReplaceString = "ㅂㅈㄷㄱ";
		ReplaceMode = 1;
		IgnoreMessage = 1;
		HanjaFromHangul = 0;
		FindJaso = 0;
		FindRegExp = 0;
		FindStyle = "";
		ReplaceStyle = "";
		FindType = 1;
	}
	HAction.Execute("AllReplace", HParameterSet.HFindReplace.HSet);
	HAction.Run("Cancel");
}

 

이 코드를 최종 파이썬 함수로 고치면 아래와 같은데요.

def find_replace(src, trg):
    pset = HParameterSet.HFindReplace
    HAction.GetDefault("AllReplace", pset.HSet)
    pset.MatchCase = 0
    pset.AllWordForms = 0
    pset.SeveralWords = 0
    pset.UseWildCards = 0
    pset.WholeWordOnly = 0
    pset.AutoSpell = 1
    pset.Direction = FindDir("Forward")
    pset.IgnoreFindString = 0
    pset.IgnoreReplaceString = 0
    pset.FindString = src
    pset.ReplaceString = trg
    pset.ReplaceMode = 1
    pset.IgnoreMessage = 1
    pset.HanjaFromHangul = 0
    pset.FindJaso = 0
    pset.FindRegExp = 0
    pset.FindStyle = ""
    pset.ReplaceStyle = ""
    pset.FindType = 1
    HAction.Execute("AllReplace", pset.HSet)
얼마나 손이 많이 가는지 짐작이 가죠?ㅎ

 

그래서 이 루틴한 작업을 자동화하는 함수를!

만들어보고 있습니다. 사실 완벽하게 완성된 건 아닌데 그래도 모듈에 넣어두긴 했어요.

사용방법은 아래와 같습니다.

1. 스크립트 매크로를 녹화한다.
2. 매크로 녹화결과를 클립보드에 복사(Ctrl-c)한다.
3. hwpx.clipboard_to_pyfunc()을 실행한다. (클립보드 내용이 바뀜)
4. 코드셀에 붙여넣기(Ctrl-v)하고 함수명이나 파라미터 등 경미한 수정 후 끝!

 

한 번 실행해볼까요?

과정이 다소 길어 보이지만 위에서 설명한 순서대로입니다.

아직 예외가 발생하는 함수가 몇 개 있기는 합니다.
Run으로만 실행되는 단순한 프로세스나, 두 개 이상의 Execute가 있는 복잡한 스크립트매크로 등..

 

문자열 메서드로는 결국 한계가 있을 것 같아요ㅜ
벌써 이렇게 코드가 더럽습니다ㅜㅜㅜ

    def clipboard_to_pyfunc(self):
        """
        한/글 프로그램에서 스크립트매크로 녹화 코드를 클립보드에 복사하고
        clipboard_to_pyfunc()을 실행하면, 클립보드의 매크로가 파이썬 함수로 변경된다.
        """
        text = cb.paste()
        text = text.replace("\t", "    ").replace(";", "")
        text = text.split("{\r\n", maxsplit=1)[1][:-5]
        if "with" in text:
            pset_name = text.split("with (")[1].split(")")[0]
            inner_param = text.split("{\r\n")[1].split("\r\n}")[0].replace("        ", f"    {pset_name}")
            result = f"def script_macro():\r\n    pset = {pset_name}\r\n    " + text.replace("    ", "").split("with")[
                0].replace(pset_name, "pset").replace("\r\n", "\r\n    ") + inner_param.replace(pset_name,
                                                                                                "pset.").replace("    ",
                                                                                                                 "").replace(
                "}\r\n", "").replace("..", ".").replace("\r\n", "\r\n    ")
        else:
            pset_name = text.split(", ")[1].split(".HSet")[0]
            result = f"def script_macro():\r\n    pset = {pset_name}\r\n    " + text.replace("    ", "").replace(
                pset_name, "pset").replace("\r\n", "\r\n    ")
        print(result)
        cb.copy(result)

그래도 다행인 건, 정규식으로 다시 꼼꼼하게 자르고 분기만 잘 쪼개면
거의 모든 스크립트매크로 케이스를 파이썬 함수로 변환할 수 있을 것 같습니다.

다음주엔 학원 강의가 가득 있는데다
(거기다 단위시험 쳐야 하고, PBL프로젝트 진행도 두 반이나 맡게 돼서 다음 주 정말 바쁩니다ㅜㅜㅜ)
다음 주 금요일에는 서울 쪽 모 기관 연수원 출강도 하나 잡혀 있어서
pyhwpx 모듈 업데이트는 당분간 천천히 진행해야 할 것 같습니다.

그래도 2024년이 오기 전엔 쓸 만한 모듈로 만들어낼 계획입니다. 문서화도 틈틈이 하고요.
IDE의 도움을 많이 받았고 복붙작업도 많긴 했는데,
그래도 오늘자 코드라인이 6,370줄 정도 되네요..ㅜ

 

이것저것 가릴 처지가 아니어서
지인의 웹앱 제작 의뢰도 덥썩 물어버렸습니다..
숨고와 비슷한 중개사이트를 만들어줄 수 있냐고 하는데, 
마침 최근까지 재미있게 공부했던 reflex.dev와 sqlmodel로 이런 프로젝트를 진행해 보고 싶었거든요.
특히, 계약서 템플릿을 자동으로 작성완료해서 업체와 클라이언트에게 PDF를 송부하는 부분은
아래아한글 자동화로 처리해보려고 해요. (참, 그러려면 윈도우 서버를 써야 하는구나...ㅜ)

하여튼 요즘은 바쁘긴 바쁜데 "사서 고생" 중이라서 어디다 하소연을 못 하겠습니다ㅜ
그나마 제 공간인 블로그에 원없이 신세타령 해보았습니다..

하여튼 방문해 주신 모든 분들,
행복한 하루 보내시고
늘 건승하시기 바랍니다^^

댓글