그럭저럭 달력 매크로를 만들었습니다. Perl 의 날짜처리 함수의 한계 때문에 1902년 정도에서 2037 년까지만 안전하게 출력할 수 있습니다. 그 이상의 범위에서는 에러가 나던가, 엉뚱한 달력이 출력됩니다. 사실 1902년의 달력도 정확한지 확인해본건 아니지만... /TestCalendar 에서 페이지소스와 출력결과를 볼 수 있습니다.
== # 로그아웃시 상단 메뉴의 '로그아웃'링크가 남는 문제 ==
로그아웃할때 화면상에 로그아웃했다는 메세지가 뜨면서 메뉴항목은 로그인으로 다시 바껴야 하는데 로그아웃으로 그대로 남아있습니다. 아래와 같이 하면 일단 로그아웃할때 메뉴이름도 "로그인"으로 바로 바뀝니다. 꽁수이긴 합니다만은...
#로긴/로그아웃꽁수
{{{#!vim perl
sub GetGotoBar {
....(중간생략)
# if (($UserID eq "113") || ($UserID eq "112")) {
if (($UserID eq "113") || ($UserID eq "112") || ($UserID eq "")) { # "",그니깐 NULL 추가
$bartext .= ' ' . &ScriptLink("action=login", T('Login'));
}
else {
$bartext .= ' | ' . &ScriptLink("action=logout", T('Logout'));
}
....(이하생략)
}
sub DoLogout { ## 이하 주석(#)처리된 구문은 원래코드이며, 통째로 갈아치운다.
<--- 함수내용을 통째로 바꾼다. --->
# my ($uid); ## 사실은 저도 몰라여-_-;; 판단 기준을 $UserID = NULL (or) not NULL 로 뒀음.
# $SetCookie{'id'} = "";
# $SetCookie{'randkey'} = $UserData{'randkey'};
# $SetCookie{'rev'} = 1;
# print &GetHeader('', T('Logout Results'), '');
# if (($UserID ne "113") && ($UserID ne "112")) {
# print Ts('Logout for user ID %s complete.', $UserID);
# print &ScriptLink("처음", T(' 첫화면으로.. '));
# print " \n";
# %UserCookie = %SetCookie;
# $UserID = "";
# #print &GetGotoBar('');
# print $q->endform;
# print &GetMinimumFooter();
my ($uid);
$uid = "";
$UserID = $uid;
&LoadUserData();
$SetCookie{'id'} = "";
print &GetHeader('', T('로그아웃'), '');
print Ts('로그아웃 하였습니다. ');
print &ScriptLink("처음", T('첫화면으로.. '));
%UserCookie = "";
print " \n";
print $q->endform;
print &GetMinimumFooter();
<--- 여기까지 함수내용을 통째로 바꾼다. --->
}
}}}
#아이디 길이제한 : 위와 같이 했을경우 아이디의 길이가 0, 즉 이름이 없는(NULL인) 아이디가 만들어질 경우 난감해집니다. 지양님 위키의 Userdata 디렉에 아마도 '.db' 화일이 있을것입니다. 본인이 장난쳤습니다. 죄송합니다..-_-;
{{{#!vim perl
어차피 3글자 이하는 잘 쓰지 않는다는 생각에 저는 영문 4글자 이상으로 아이디 제한을 둬서 쓰고 있습니다.
sub DoUpdatePrefs {
....
# if ($username eq "") { ## 위와 같은 이유로 이 부분은 일단 주석처리 해버린다. db화일이 지워지지도 않았던 것 같다.
# print T('UserName removed.'), ' ';
# undef $UserData{'username'};
# } elsif ((!$FreeLinks) && (!($username =~ /^$LinkPattern$/))) {
<--- 추가 --->
if (length($username) < 4) { # Too long
print T('사용자명은 영문 3글자 이상, 한글 2글자 이상이어야 함. 저장하지 않음.'), " \n";
$UserID = 0;
print "
".&ScriptLink("action=editprefs", T('다시신청'));
return;
<--- 추가 --->
} elsif ((!$FreeLinks) && (!($username =~ /^$LinkPattern$/))) {
print Ts('Invalid UserName %s: not saved.', $username), " \n";
....
}
근데 sub DoUpdatePrefs()를 보시면 아이디를 50자이하로 제한하게끔 한 IF 구문을 볼 수 있을 것입니다.
위의 것을 추가하지 않고
# } elsif (length($username) > 50) { # Too long <-- 이것을
} elsif (length($username) > 50 || length($username) <4) { # Too long <-- 이렇게 해도 됩니다.
}}}
{{{#!vim perl
sub dologin {
(중간생략)...
$success = 1;
}
else {
$SetCookie{'id'} = "";
$UserID = ""; ### 추가한다.
&LoadUserData(); ### 추가한다.
}
(이하생략)...
}
}}}
: 감사합니다. 연구실에 가서 살펴보도록 하겠습니다.
: 아이디 길이 제한은 좋은 생각입니다. NULL 아이디 문제 말고도, 아이디를 113 이나 112 라고 지을 경우도 문제를 일으켰었거든요. (악용할지 몰라서 밝힐 수는 없었지만 ^^;) 아이디의 최소 길이를 제한 하는 것은 [[UseModWiki소스수정]]에 반영했습니다.
: 그리고 로그아웃 직후에도 여전히 로그아웃 링크가 남아 있는 문제는, 말 그대로 '꽁수'를 써서 일단 고쳐 두었습니다. [[Bab2]] 님께서 작성하신 패치도 괜찮은 것 같긴 한데, 제가 소스를 제대로 이해하기 전까지는 사용자ID 를 다루는 부분은 웬만하면 건드리지 않으려고 합니다. K3 버전에서 사용되는 아이디는 오리지널 위키에서는 단지 필명일 뿐이고, 진짜 ID 는 숫자로만 구성되어 임의로 할당되는 것이었는데, Luke 님이 이 숫자아이디와 문자필명과의 관계를 어느 정도나 뜯어 고친 건지 알 수가 없어서 말이죠.
:: dologin부분을 추가했습니다.(역시나 꽁수입니다. :) ) $LoadUserData 함수가 $UserID에 해당하는 화일을 부르는 것을 이용했습니다.($UserID는 NULL로) 아마 이게 추가되면 로그인할때 존재하는 아이디 이면서 잘못된 비밀번호 입력시 로그인실패 메세지와 메뉴에 로그아웃, 관리자메뉴가 뜨는 문제도 해결될겁니다.
::: 그런 문제가 있는 줄도 모르고 있었네요. 로그인을 일부로 실패해봐야 발견하는 거라.. :-) 관리자 아이디가 무엇인지는 사실 쉽게 알 수 있는 건데 (잠겨 있는 페이지를 수시로 고치는 걸 보면...) 위키태그까지 붙인채로 말씀하시니 큰 헛점이 있는 줄 알고 순간 깜짝 놀랐습니다. ^^ (어차피 이 UseModWiki 에서는 철저한 보안 같은 것은 기대하지 말아야 할 듯 합니다) 로그인 실패 후 잘못 출력된 관리 메뉴를 클릭해봤자 권한이 없다고 나올테지만, 확실히 보기에 안 좋군요. [[UseModWiki소스수정]]에 반영했습니다. 생각 같아서는 ID 를 다루는 방식을 완전히 뜯어고쳐서 깔끔하게 만들고 싶은데, 위키 소스만 들여다보며 시간을 보낼 수도 없다보니 소소한 작업 말고는 엄두가 나지 않는군요.
== # 페이지 Link ==
현재 UseModWiki 내에 존재하지 않는 페이지에 대해서는 TestPageTest 페이지 이름 다음에 ? 가 나와서 그 ?를 누르면 새 페이지를 만드는 형식으로 되어 있습니다. 이걸 wikiX 에서 사용하는 방식처럼 첫 문자에 Link를 거는 방식으로 바꾸는게 어떨까요?
페이지를 보다가 마우스로 긁어서 다른데로 옮기는 경우에 지금의 방식은 ? 가 나와서 상당히 귀찮더군요.
: 음... 전 WikiX 의 방식이 링크가 눈에 띄지 않는다고 생각해서 덜 선호하는 편입니다만... config 에서 결정할 수 있게 하면 되겠네요. 방금 슬쩍 만져봤는데... 학교 가서 조금 더 손을 보면 될 것 같습니다.
== # 매크로 처리 시점의 문제 ==
[[Bab2]] 님이 발견한 문제를 살펴보다가 깨달은 것인데, 모든 매크로가 문제를 안고 있습니다.
{{{
(줄앞에 공백이 하나 이상)<매크로>
}}}
위와 같이 작성할 경우, 일단 매크로가 동작하여 출력물로 치환된 후에, 저 줄 앞에 공백 때문에 치환된 결과의 첫번째 라인만 다시 pre 태그가 붙어 버립니다. 캘린더의 경우 제가 html 출력물이 보기 좋으라고 주요 태그마다 \n 으로 줄바꿈을 시켜놨더니만, 결과적으로 다음과 같이 된 거죠.
{{{
(공백)
요것이 변환되어
(공백이그대로남아있음)
}}}
즉 첫번째 table 태그만 pre 로 둘러쌓이는 겁니다. 이 문제는 모든 매크로에 동일하게 적용됩니다.
문제의 원인은, 매크로를 부르는
{{{
$_ = &MacroSubst($_); # Luke added
}}}
이 라인은 CommonMarkup 함수 안에 있습니다. 그런데 제가 {{{ }}} 태그를 만들기 위해서, WikiToHTML 함수내에서 CommonMarkup 과 WikiLinesToHtml 함수의 순서를 바꾸었습니다. 그래서 매크로 치환 이후에 WikiLinesToHTML 이 불리면서 저 pre 치환을 이뤄버립니다.
매크로를 부르는 라인은 Luke 님이 넣은 것 같네요. 저 주석문을 보니... Luke 님의 K3 에서는 WikiLinesToHtml 이 먼저 불리고 그 다음에 CommonMarkup 이 불리게 되어 있기 때문에 그 때는 이런 문제는 없었을 겁니다. (하지만 직관적으로 봤을때 전체 마크업이 먼저고 라인 마크업이 나중에 오는 게 합당하다고 생각합니다. 또한 오리지날 UseModWiki 소스에서도 CommonMarkup 이 먼저 불리게 되어 있습니다)
그렇다면 문제의 해결을 위해서는... 저 MacroSubst 호출 루틴을 CommonMarkup 함수 내가 아니라, WikiLinesToHTML 에 넣던가, 아니면 한 단계 위로 빼내어 두 함수를 차례대로 부르는 WikiToHTML 에 넣는 것을 생각해볼 수 있겠는데, 이게 어떤 부작용을 만들지 상상조차 되지 않는터라... ^^; 테스트하는데 시간이 좀 걸리겠습니다. 다른 분들도 소스를 들여다보며 같이 고민 좀 해주시면 고맙겠죠. :-)
음.. 상위 단계인 WikiToHTML 로 뺐더니만, 이번에는 nowiki 태그 안에 매크로가 있을 경우 기존에는 그대로 출력되던 것이 이제는 죄다 매크로 변환이 되어 버리는군요. 딜레마에 빠지네.. 어찌하나..
:macrosubst()를 commonmarkup의 끝, 그니깐 '''if ($dolines) { }'''안에 넣으니 일단 표안에도 잘 들어가지고, 다른 매크로도 대충 잘 되네요. MacroFullSearch와 MacroTitleSearch 만 해결되면 크게 무리없이 쓸 수 있을거 같습니다. (둘중 하나를 없애버리는게 가장 좋은 해결책이지만서두..ㅡㅡ;)
:: 전혀 문제를 해결하지 못하던데요. :-) 여전히 공백 뒤 매크로에 pre 태그를 붙여 버리고 있네요. 캘린더 같은 경우는 제가 아예 \n 을 전혀 출력하지 않도록 했습니다. 그래서 아까는 pre table /pre /table 순으로 붙었던 것을 이제는 pre table /table /pre 순으로 붙기 때문에 별 문제가 없이 보이는 것 뿐입니다. 음... 고민해 봤는데, 그냥 놔두는 것이 좋겠습니다. 건드릴 수록 긁어 부스럼 만드는 느낌이군요. 기존에 손을 대었던 매크로들에 다시 손을 대어서, \n 출력을 다 없앴습니다. 사용자가 일부로 매크로 앞에 공백을 두었을 경우는 pre 가 붙게 되겠지만, pre 가 붙어도 매크로 출력 전체에 적용될테니, 상관없을듯 합니다.
:: 그리고 MacroFullSeach 와 MacroTitleSearch 의 경우 두 가지를 한 줄에 같이 적으면 먼저 적은 쪽에서 뒤부분을 통채로 인자로 인식해버리는 것은 큰 문제가 아닐 듯 한데요. 그 문제를 해결하려면 정규표현식을 (.*) 대신 ([^)]*) 또는 ([^>]*) 정도로 적어주면 되겠지만, 그러면 검색에서 괄호나 부등호는 검색할 수 없게됩니다.
:검색폼에서 괄호를 써도 에러나네요, 이건 문서화일 때문에 그런거 같은데.. 좀더 찾아봐야될듯... 그리고 서치매크로에서의 괄호는 막아버렸습니다..흐흐~ (흑..ㅜㅡ)
:: 근본적으로... UseModWiki 소스자체가, 검색 기능을 상당히 단순하게 구현해 놓고 있어서 그렇겠지요. 검색폼이나 fullsearch 등의 매크로의 인자로 들어간 문자열을 고스란히 Perl 의 "=~ /패턴/" 구문의 패턴 자리에 넣어버리니까요. 검색폼에 들어간 문자열이 Perl 의 정규표현식 문법에 맞지 않으면 에러가 나는거고, 이것은 뭐 어찌할 도리가 없는 듯 하네요. CGI 가 에러가 나는 것을 막으려면 WikiX 처럼 별도의 검색 명령어를 처리하는 루틴을 두어야 하겠습니다만, 그렇게까지 복잡한 검색을 할 일이 있을런지... 대신 말을 바꾸면 홈페이지 내 검색에 정규표현식을 사용할 수 있다는 것이니 잘 쓰면 큰 효과를 내겠지요.
:: 이미 알고 계시다면 실례가 되겠지만... "(a)" 를 검색하시려면 검색창에는 "\(a\)" 라고 쓰셔야 합니다. :-)
"아무리 봐도 대책없음. 매크로를 사용하는 사용자가 주의해야 함. 매크로를 만드는 경우 출력에 newline 이 들어가지 않도록 주의해야 함" 으로 결론짓고 [[/반영된사용자의견]]으로 이동.
----
[[위키위키분류]]
UseModWiki소스수정/반영된사용자의견archive01 페이지로 돌아가기 | 다른 수정본 보기
|