Notepad2 한글화는 Notepad2-mod를 기준으로 진행

그동안 다양한 출처를 참고로 직접 Notepad2를 수정해왔다.
그런데, 앞으로는 구글 코드를 통해 공개되는 Notepad2-mod를 기준으로 패치를 하기로 했다.

이유를 간략히 정리하면 아래와 같다.

- Notepad2의 최신버전인 4.2.25는 지난해 5월에 공개되었으니, 공개된지 8개월이 지났음에도
- Notepad2를 수정하는 프로젝트인 Notepad2-mod는 지금도 왕성히 새로운 기능들을 흡수하고 있음
- Notepad2는 Scintilla 2.24를 기반으로 하고, mod는 최신 버전인 3.02를 기반으로 함
- 지금까지 구현했던 Notepad2의 추가 기능 중 상당수는 이 Notepad2-mod에서 가져온 기능임

하지만, 세상은 그리 만만한 것이 아니라 이 소스를 그대로 갖고 와서 컴파일해도 컴파일되지 않는다.
그 이유는 코드 페이지 때문이다.

원작자인 Florian Balmer는 스위스인이고, mod 프로젝트를 주관하는 XhmikosR는 그리스인이다.
즉, 이 양반들은 원래 코드 페이지를 서유럽어(ISO-8859-1)로 놓고 개발하는 사람들이다.
그런데, 코드 중에 한글에는 없고 서유럽어에만 있는 글자들이 다수 있어 이 부분들이 컴파일이 되지 않는 것이다.



Notepad2-mod를 직접 컴파일하려면 아래와 같은 작업을 거쳐야 한다.


1. Windows Driver Kit 다운로드 및 설치

MS 홈페이지에서 Windows Driver Kir 7.1.0을 다운받아 설치한다.


2. Notepad2-mod 다운

똑같은 폴더 구조를 만든 뒤에 일일이 다운받아도 되지만, 관련 툴을 사용하는 게 (당연히) 낫다.


3. 패치

수정대상 파일은 총 4개다.
scintilla\lexers\LexCSS.cxx, src\Notepad2.c, src\Edit.c, src\version.h

이 중 version.h, Edit.c는 C언어 코드의 수정이고, 나머지 2개는 주석에 포함된 서유럽어만 수정하면 된다.


a. scintilla\lexers\LexCSS.cxx

수정 대상은 4행 한 줄이다. 다음의 내용을…

 ** Written by Jakub Vrána

이렇게 수정하면 된다.

 ** Written by Jakub Vrana

이 수정도 귀찮으면 그 행을 지워도 무방하다. ㅋㅋ



b. src\Notepad2.c

수정 대상은 다음 두 군데이다.
 
우선 3651-3653행의 다음 내용을…

  // define (behöver bara göra detta en gång egentligen)
  //SendMessage( hwndEdit , SCI_MARKERSETBACK , 0 , 74 | (203 << 8) | (0 << 16) ); //behöver bara göra detta en gång egentligen
  //SendMessage( hwndEdit , SCI_MARKERDEFINE , 0 , SC_MARK_ARROWS );    //behöver bara göra detta en gång egentligen

아래와 같이 수정하고…

  // define (behover bara gora detta en gang egentligen)
  //SendMessage( hwndEdit , SCI_MARKERSETBACK , 0 , 74 | (203 << 8) | (0 << 16) ); //behover bara gora detta en gang egentligen
  //SendMessage( hwndEdit , SCI_MARKERDEFINE , 0 , SC_MARK_ARROWS );    //behover bara gora detta en gang egentligen

다음으로 3667-3668행의 다음 내용을…

  //SendMessage( hwndEdit , SCI_MARKERSETBACK , 0 , 180 | (255 << 8) | (180 << 16) ); //behöver bara göra detta en gång egentligen
  //SendMessage( hwndEdit , SCI_MARKERDEFINE , 0 , SC_MARK_BACKGROUND );    //behöver bara göra detta en gång egentligen

아래와 같이 수정한다.

  //SendMessage( hwndEdit , SCI_MARKERSETBACK , 0 , 180 | (255 << 8) | (180 << 16) ); //behover bara gora detta en gang egentligen
  //SendMessage( hwndEdit , SCI_MARKERDEFINE , 0 , SC_MARK_BACKGROUND );    //behover bara gora detta en gang egentligen

이곳 역시 앞과 마찬가지로, 그냥 지워도 된다.



c. src\Edit.c

앞의 둘과 달리, 여기는 코드에 영향을 미치는 부분이다.
즉, 서유럽어 코드 페이지에서 컴파일했을 때와 똑같은 결과를 보일 수 있도록 수정하는 부분이다.

우선 1769행의 아래의 내용을

  if (!IsCharAlphaNumericW(pszTextW[i]) && (!StrChr(L"'`´’",pszTextW[i]) ||  bPrevWasSpace ) )

아래와 같이 수정한다.

  if (!IsCharAlphaNumericW(pszTextW[i]) && (!StrChr(L"\x0027\x0060\x00B4",pszTextW[i]) ||  bPrevWasSpace ) )

다음으로 4107행의 아래의 내용을

#define ISDELIMITER(wc) StrChr(L",;.:-+%&¦|/*?!\"\'~´#=",wc)

아래와 같이 수정한다.

#define ISDELIMITER(wc) StrChr(L"\x002C\x003B\x002E\x003A\x002D\x002B\x0025\x0026\x00A6\x007C\x002F\x002A\x003F\x0021\x0022\x0027\x007E\x00B4\x0023\x003D",wc)

사실, 이 부분은 좀 이해가 되지 않다.
원작자 Balmer 씨는 유사한 상황에서 \x0000 포맷으로 유니코드를 적용하도록 이미 코드를 수정했기 때문이다.

그래서, 구글 코드를 통해 이슈를 제기했지만, 자신은 수정할 필요를 못 느껴 수정하지 않겠다는 답을 들었다. ㅠ.ㅠ

Sorry, I'm not interested to change anything regarding this matter… bla… bla…



d. src\version.h

31-32행의 아래 내용을 찾아…
#define VERSION_LEGALCOPYRIGHT_SHORT L"Copyright ©2004-2012"
#define VERSION_LEGALCOPYRIGHT_LONG  L"©Florian Balmer 2004-2012"

아래와 같이 수정한다.

#define VERSION_LEGALCOPYRIGHT_SHORT L"Copyright ⓒ2004-2012"
#define VERSION_LEGALCOPYRIGHT_LONG  L"\0251Florian Balmer 2004-2012"

바뀐 부분이 거의 없어보이지만, ©는 서유럽어 코드페이지에만 있고, ⓒ는 한글 코드페이지에만 있다.



4. 컴파일

이렇게 수정한 뒤에 build\build_wdk.bat 를 실행하면 32비트/64비트용 Notepad2.exe가 생성된다.
정말로 쉬워졌다.




Trackback 0 Comment 4
  1. Favicon of http://minimonk.net BlogIcon 구차니 2012.01.15 12:25 address edit & delete reply

    으아아.. 고생이 많으십니다 ㅠ.ㅠ
    그런데 지적해주는데 수정하기 싫어~ 라고 하는 해외개발자 보면 약올라요 ㅠ.ㅠ

    • Favicon of http://zockr.tistory.com BlogIcon BLUEnLIVE 2012.01.15 17:40 address edit & delete

      이해는 합니다만, 약은 좀 오르더군요… ㅠ.ㅠ

  2. 따라쟁이 2012.04.10 15:06 address edit & delete reply

    위 글의 Edit.c 수정 부분에서

    #define ISDELIMITER(wc) StrChr(L"\x002C\x003B\x002E\x003A\x002D\x002B\x0025\x0026\x00A6

    이후로 짤려보여요 /

    보일수 있게 조치좀 부탁 드릴깨요 / ( 잘 몰라서 짤린 부분을 어떻게 채워 넣어야 할지 모르겠어요 )

    • 따라쟁이 2012.04.12 11:01 address edit & delete

      아래처럼 수정 했습니다.

      #define ISDELIMITER(wc) StrChr(L"\x002C\x003B\x002E\x003A\x002D\x002B\x0025\x0026\x00A6\x007C\x002F\x002A\x003F\x0021\x0022\x0027\x007E\x00B4\x0023\x003D",wc)

      참조사이트
      http://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_0000~0FFF