흠 예전에 MS Office 2011 for mac 한글 서체 호환성 문제란 글을 쓰면서 Apple Font Tool을 사용해서 name field를 업데이트 하는 방법을 소개했었는데…
지금 다시 읽어보면, 따라하기 어렵다는 코멘트가 굉장히 많다. 사실 난 unix command line에 익숙한데다가 개발자라 나름 열심히 설명했다고 생각했는데, Mac에서 터미널을 띄우는 것에 익숙하지 않은 사람들에게는 이게 쉽게 다가갈만한 무언가는 아니었던 것 같다. (사실 xml 수정하는 것도 쉬운 일은 아닌 듯.)
사실 생각해보면 Mac에서 LOL 한국 서버에 접속하기 같은 케이스만 봐도, plist 파일인지 뭔지 막 수정해서 돌리려니 여간 번거롭고 짜증나는 일이 아닐 수 없었다. 그런데 어떤 현자님께서 원클릭 솔루션을 만들어주신 덕에 이후로는 편하게 LOL을 할 수 있게 됐다.
어쨌든 맑은 고딕 외의 서체에도 비슷한 문제가 있을터이므로! 이를 우아하게 해결할 수 있도록 도우려면, 범용 frontend를 만들어 제공하는 게 답일 것 같다. (물론 fonttool은 깔려있어야 한다!)그래서 libxml2를 이용해서 테스트 코드를 살살 짰다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
#include <stdio.h> #include <libxml/parser.h> #include <libxml/tree.h> /* * build command * gcc `xml2-config --cflags --libs` -o test test.c */ typedef struct { char* name; char* value; } prop_t; const static prop_t pat_src[] = { { "platformID", "3" }, { "languageID", "1042" }, { NULL, NULL } }; const static prop_t pat_target[] = { { "platformID", "1" }, { "languageID", "23" }, { NULL, NULL } }; const static prop_t pat_new[] = { { "platformID", "1" }, { "platformName", "Macintosh" }, { "scriptID", "3" }, { "scriptName", "Korean" }, { "languageID", "23" }, { "languageName", "Korean" }, { NULL, NULL } }; static xmlNodePtr find_node(xmlNodePtr node, prop_t* pattern); int main(int argc, char** argv) { xmlDocPtr doc; xmlNodePtr cur, src, new; xmlChar* tmp; prop_t* ptr; FILE* out; doc = xmlParseFile("test.xml"); if(doc == NULL) { fprintf(stderr, "Document not parsed successfully.\n"); return -1; } cur = xmlDocGetRootElement(doc); if(cur == NULL) { fprintf(stderr, "empty document\n"); xmlFreeDoc(doc); return -1; } // root node should be nameTable if (strcmp(cur->name, "nameTable") != 0) return -1; // nameTable -> nameTableEntry cur = cur->xmlChildrenNode; for ( ; cur != NULL ; cur = cur->next) { if (strcmp(cur->name, "nameTableEntry") != 0) continue; // if target exist -> skip if (find_node(cur->xmlChildrenNode, pat_target) != NULL) continue; // find value for Korean version of Microsoft Windows src = find_node(cur->xmlChildrenNode, pat_src); if (src != NULL) { new = xmlCopyNode(src, 1); // update properties for (ptr = pat_new ; ptr->name != NULL ; ptr++) xmlSetProp(new, ptr->name, ptr->value); xmlAddChild(cur, new); } } // write updated xml document out = fopen("tmp.xml", "w"); xmlDocDump(out, doc); fclose(out); // free document xmlFreeDoc(doc); return 0; } static xmlNodePtr find_node(xmlNodePtr node, prop_t* pattern) { xmlChar* tmp; prop_t* ptr; int match; for ( ; node != NULL ; node = node->next) { match = 1; // check all patterns are matched for (ptr = pattern ; ptr->name != NULL ; ptr++) { tmp = xmlGetProp(node, ptr->name); if (tmp == NULL || strcmp(tmp, ptr->value) != 0) { match = 0; break; } } if (match) return node; } while (node != NULL); // no match found return NULL; } |
의도한건 nameTable 하위로 한글 윈도우를 위한 값이 존재하는 경우 이 값을 이용해서 맥 한국어 환경을 위한 값을 생성하도록 하는 코드였고, 흠 위 코드로 원하는 동작은 잘 하는 것 같다.
이제 추가로 작업해야할 부분은 아래 정도?
- UI 만들고…
- drag and drop 에서 drop된 파일 이름을 뽑아낼 수 있는 기능을 만들고…
- 뽑아낸 파일 이름을 이용해서 font tool을 돌려서 xml을 뽑아내는 코드를 만들고…
- 뽑아낸 xml을 이용해서 위 function을 수행하는 코드를 만들고…
- 위 코드에서 수정한 xml을 font tool로 다시 ttf에 적용하는 코드를 만들고…
- 혹시 모르니까 font tool 들이 제대로 설치 되어 있는지 체크하는 function도 만들고…
- 마무리로 에러 처리도 해주고…
하면 될 것 같은데…
흠 OS X UI 작업은 하도 오랫만이라 어떻게 하는지 감 잡는데 걸리는 시간이 좀 걸릴 것 같지만~ 살살 시간내서 작업을 해봐야겠다.
하튼 오늘의 일기도 끝!
Similar Posts:
- ICU의 charset detector…
- Sender Policy Framework
- CG: dithering
- 마우스 드래그, 마우스 오른쪽 버튼을 막아둔 것 풀어버리기
- 오묘한 procmail 세상…