파이썬 한글매크로 - paisseon hangeulmaekeulo

서론

앞서 올린 글에서 파이썬에서 아래아한글을 실행하는 방법을 소개했다.

Show

    파이썬에서 아래아한글을 실행하는 것까지는 배웠는데, 실제로 사용하자니 구체적인 명령어(메소드)를 몰라 난감할 것이다.

    한글 API의 명령어들은 한글과컴퓨터에서 홈페이지에 공개한 자료에서 찾을 수가 있긴 한데, 초심자가 접근하기에는 조금 복잡하고, 공부할 시간에 그냥 수작업을 하는 게 낫겠다는 생각마저 들게 한다.

    그런데 필자가 소개한 한글매크로를 사용하는 방법을 본 사람이라면, 스크립트 매크로의 코드를 편집해본 기억이 있을 것이다.

    왠지 스크립트 매크로를 가져다가 파이썬에서 쓸 수도 있지 않을까 싶은데, 역시나 그렇게 할 수 있는 방법이 있다.

    본론

    구체적인 내용을 설명하기에 앞서, 이 게시글의 내용은 티스토리 블로그 "회사원코딩"을 통해 습득한 것임을 밝힌다.

    파이썬을 활용한 아래아한글 자동화에 관해서는 국내 블로그 가운데 가장 내용이 풍부한 블로그이다.

    (위 블로그는 현재 운영이 중단되었고, 대신 같은 분이 네이버 블로그인 "일상의코딩"을 운영하고 있다.)


    1. 한글매크로 코드 살펴보기

    한글매크로를 파이썬 코드로 변환하기 위해 우선 예제 스크립트 매크로를 만들어보자.

    매크로 정의 기능을 실행한 뒤에, 마음에 드는 동작을 아무 것이나 해보자. 필자는 "한글매크로 예제"라는 텍스트를 쓰고 폰트를 굴림체로 바꾸는 동작을 해보았다.


    코드 편집 화면으로 들어가서 보면, 파이썬 코드와는 조금 다른 모습의 한글매크로 코드가 보인다.

    function OnScriptMacro_script1()
    {
    	HAction.GetDefault("InsertText", HParameterSet.HInsertText.HSet);
    	HParameterSet.HInsertText.Text = "한글매크로 예제";
    	HAction.Execute("InsertText", HParameterSet.HInsertText.HSet);
    	HAction.Run("MoveSelLineBegin");
    	HAction.GetDefault("CharShape", HParameterSet.HCharShape.HSet);
    	with (HParameterSet.HCharShape)
    	{
    		FaceNameUser = "굴림";
    		FontTypeUser = FontType("TTF");
    		FaceNameSymbol = "굴림";
    		FontTypeSymbol = FontType("TTF");
    		FaceNameOther = "굴림";
    		FontTypeOther = FontType("TTF");
    		FaceNameJapanese = "굴림";
    		FontTypeJapanese = FontType("TTF");
    		FaceNameHanja = "굴림";
    		FontTypeHanja = FontType("TTF");
    		FaceNameLatin = "굴림";
    		FontTypeLatin = FontType("TTF");
    		FaceNameHangul = "굴림";
    		FontTypeHangul = FontType("TTF");
    	}
    	HAction.Execute("CharShape", HParameterSet.HCharShape.HSet);
    	HAction.Run("MoveLineEnd");
    }

    차이점을 자세히 보면, 일단 함수를 정의하는 첫 줄부터 표현 방식이 달라 보인다.

    function OnScriptMacro_script1()

    모든 줄마다 끝에 세미콜론(;) 표시가 보이는 점과, 파이썬에서는 볼 수 없는 with 구문, 그리고 중괄호의 사용도 눈에 띈다.

    (파이썬 스크립트에서도 여러 줄의 코드를 한줄로 표현하기 위해 세미콜론을 사용할 수는 있지만, 코드의 가독성을 떨어뜨리기 때문에 잘 쓰지 않는다.)

    {  # 중괄호 사용
    	HAction.GetDefault("InsertText", HParameterSet.HInsertText.HSet);  # 세미콜론 사용
    	...
        with (HParameterSet.HCharShape)  # with문
    	{
    		...

    그 외에 나머지 부분은 크게 낯설지 않은 모습이다.

    2. 파이썬 코드로 바꿔보기

    이제 한글매크로 코드를 파이썬 코드로 변환해보자.

    먼저, 파이썬에서 아래아한글을 실행하는 방법에서 설명한 대로 win32com패키지를 이용해서 한글 인스턴스를 만들어 놓고 시작한다.

    (위 게시글에서는 win32com의 예제에 따라 인스턴스의 이름을 'o'로 했으나, 여기에서는 'hwp'로 했다. 이름은 각자 취향대로 붙이면 된다.)

    import win32com.client
    hwp = win32com.client.Dispatch("HWPFrame.HwpObject")
    hwp.XHwpWindows.Item(0).Visible = True

    그 밑에다 한글매크로 코드를 붙여넣고, 한글매크로 코드 부분을 수정하면 된다.

    일단 첫줄을 파이썬의 함수 정의방법에 맞게 바꾼다. 함수의 이름은 example로 하겠다.

    반복해서 사용하지 않을 코드라면 함수로 정의할 필요가 딱히 없으니, 그 경우에는 첫줄을 그냥 삭제하면 되겠다.

    def example():

    그 다음으로는 모든 중괄호와 세미콜론을 없애준다.

    def example():
        HAction.GetDefault("InsertText", HParameterSet.HInsertText.HSet)
        HParameterSet.HInsertText.Text = "한글매크로 예제"
        HAction.Execute("InsertText", HParameterSet.HInsertText.HSet)
        HAction.Run("MoveSelLineBegin")
        ...

    그 다음이 중요한데, HAction 등 모든 명령어 앞에  본인이 지정한 한글 인스턴스명을 붙여준다.

    HParameterSet, FontType 등 괄호 안에 있거나 등호 표시 뒤에 있는 것들도 빠짐 없이 붙여줘야 한다.

    문자열(따옴표 붙은 것)과 숫자들 빼고는 전부 붙여주면 된다.

    이 때, with문 안에 있는 코드들의 경우에는 인스턴스명만 붙이는 것이 아니라, 아래와 같이 with 뒤의 괄호 안에 있는 명령어에 인스턴스명을 붙이고, 그 내용을 with문 안의 코드 앞에 붙여준다.

    def example():
        hwp.HAction.GetDefault("InsertText", hwp.HParameterSet.HInsertText.HSet)
        hwp.HParameterSet.HInsertText.Text = "한글매크로 예제"
        hwp.HAction.Execute("InsertText", hwp.HParameterSet.HInsertText.HSet)
        hwp.HAction.Run("MoveSelLineBegin")
        hwp.HAction.GetDefault("CharShape", hwp.HParameterSet.HCharShape.HSet)
        hwp.HParameterSet.HCharShape.FaceNameUser = "굴림"
        hwp.HParameterSet.HCharShape.FontTypeUser = hwp.FontType("TTF")
        hwp.HParameterSet.HCharShape.FaceNameSymbol = "굴림"
        hwp.HParameterSet.HCharShape.FontTypeSymbol = hwp.FontType("TTF")
        hwp.HParameterSet.HCharShape.FaceNameOther = "굴림"
        hwp.HParameterSet.HCharShape.FontTypeOther = hwp.FontType("TTF")
        hwp.HParameterSet.HCharShape.FaceNameJapanese = "굴림"
        hwp.HParameterSet.HCharShape.FontTypeJapanese = hwp.FontType("TTF")
        hwp.HParameterSet.HCharShape.FaceNameHanja = "굴림"
        hwp.HParameterSet.HCharShape.FontTypeHanja = hwp.FontType("TTF")
        hwp.HParameterSet.HCharShape.FaceNameLatin = "굴림"
        hwp.HParameterSet.HCharShape.FontTypeLatin = hwp.FontType("TTF")
        hwp.HParameterSet.HCharShape.FaceNameHangul = "굴림"
        hwp.HParameterSet.HCharShape.FontTypeHangul = hwp.FontType("TTF")
        hwp.HAction.Execute("CharShape", hwp.HParameterSet.HCharShape.HSet)
        hwp.HAction.Run("MoveLineEnd")

    여기까지 하고 나면  파이썬 코드로 변환이 다 되어 파이썬에서 실행이 가능하다.

    마무리

    (코드의 복잡성에 관하여)

    한글매크로 코드를 파이썬 코드로 변환해 놓고 보면 파이썬 언어에 어울리지 않게 코드가 과도하게 복잡해 보이는 것이 사실이다.

    with문 안에 있는 코드들은 삭제를 해도 코드가 정상적으로 실행되는 경우가 많다. 그만큼 필수적인 부분만 기록해주는 것은 아니라는 뜻이다.(위의 예제에서도 7~20번째 줄 중에 19~20번째만 남겨도 실행이 된다.)

    그러나 필자는 이 블로그의 제목과 같이 '나홀로코더'이기 때문에, 원하는 동작만 하면 그만이지 않나, 그렇게 생각하고 있다.

    만일 누군가와 공유하는 프로젝트라면 조금 더 보기 좋은 코드를 짤수 있도록 따로 한글 API를 공부할 필요가 있을 것이다.

    (변환 작업의 번거로움에 관하여)

    그리고 조금 복잡한 작업을 기록한 한글매크로 코드를 변환하다 보면, 손이 상당히 많이 간다.

    그래서 필자는 한글매크로 코드를 파이썬 코드로 변환해주는 코드를 나름대로 짜놓고 활용하고 있다.

    곧바로 실행이 가능할 만큼은 아니지만 상당히 간편한 수준까지 변환을 해주기 때문에 위의 단점을 많이 보완할 수 있는 방법이다.

    파이썬을 정말 처음 배우기 시작할 무렵 만든 것이라 보기에 조금 안 좋지만, 변환 코드를 공유한다.

    한글매크로 코드를 클립보드에 복사한 뒤에 아래 코드를 실행해보자.

    import clipboard
    import re
    
    hwp_script = clipboard.paste()
    instancename = 'hwp'
    
    # with문이 있는 경우 맨 끝의 )를 .로 변경
    hwp_script = re.compile('(with\s\(.*)\)').sub(r'\1.',hwp_script)
    
    # 탭, 괄호 등 제외, 인스턴스명 삽입
    text_before = ['		','	','{','}',';','with (',              'HAction',              'HParameterSet']
    text_after  = [       '#', '', '', '', '',     '#',instancename+'.HAction',instancename+'.HParameterSet']
    for i, j in zip(text_before, text_after):
        hwp_script = hwp_script.replace(i, j)
    
    clipboard.copy(hwp_script)

    예제 코드에 적용해 보면, 아래와 같이 변환된 코드가 클립보드에 복사된다.

    hwp.HAction.GetDefault("InsertText", hwp.HParameterSet.HInsertText.HSet)
    hwp.HParameterSet.HInsertText.Text = "한글매크로 예제"
    hwp.HAction.Execute("InsertText", hwp.HParameterSet.HInsertText.HSet)
    hwp.HAction.Run("MoveSelLineBegin")
    hwp.HAction.GetDefault("CharShape", hwp.HParameterSet.HCharShape.HSet)
    #hwp.HParameterSet.HCharShape.
    #FaceNameUser = "굴림"
    #FontTypeUser = FontType("TTF")
    ...
    hwp.HAction.Execute("CharShape", hwp.HParameterSet.HCharShape.HSet)
    hwp.HAction.Run("MoveLineEnd")


    with문 안에 있는 코드들은 주석 처리가 되는데,  아래와 같이 편집을 조금 더 해줘야 한다.

    hwp.HAction.GetDefault("InsertText", hwp.HParameterSet.HInsertText.HSet)
    hwp.HParameterSet.HInsertText.Text = "한글매크로 예제"
    hwp.HAction.Execute("InsertText", hwp.HParameterSet.HInsertText.HSet)
    hwp.HAction.Run("MoveSelLineBegin")
    hwp.HAction.GetDefault("CharShape", hwp.HParameterSet.HCharShape.HSet)
    hwp.HParameterSet.HCharShape.FaceNameUser = "굴림"
    hwp.HParameterSet.HCharShape.FontTypeUser = hwp.FontType("TTF")
    ...
    hwp.HAction.Execute("CharShape", hwp.HParameterSet.HCharShape.HSet)
    hwp.HAction.Run("MoveLineEnd")


    아무쪼록 필요한 데에 유용하게 사용하시길 바란다.